From b8e1f84ab1a9a5f26f67744d410e751939d16654 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Sun, 13 Dec 2015 15:47:32 +0300 Subject: [PATCH 01/19] Hello commit --- projects/pom.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/projects/pom.xml b/projects/pom.xml index 5d14966..99e7448 100644 --- a/projects/pom.xml +++ b/projects/pom.xml @@ -1,5 +1,5 @@ - + + 4.0.0 ru.mipt.diht.students @@ -30,7 +30,8 @@ dkhurtin ale3otik Pitovsky - + egdeliya + @@ -133,4 +134,4 @@ - + \ No newline at end of file From f5f888ef73a34406217fb9b053b5f730866c3481 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Sun, 13 Dec 2015 15:55:28 +0300 Subject: [PATCH 02/19] second commit --- projects/egdeliya/pom.xml | 26 +++++++++++++ .../students/egdeliya/TwitterStream/App.java | 7 ++++ .../java/ru/mipt/diht/students/AppTest.java | 38 +++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 projects/egdeliya/pom.xml create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/App.java create mode 100644 projects/egdeliya/src/test/java/ru/mipt/diht/students/AppTest.java diff --git a/projects/egdeliya/pom.xml b/projects/egdeliya/pom.xml new file mode 100644 index 0000000..6fba850 --- /dev/null +++ b/projects/egdeliya/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + ru.mipt.diht.students + parent + 1.0-SNAPSHOT + + ru.mipt.diht.students + egdeliya + 1.0-SNAPSHOT + egdeliya + http://maven.apache.org + + UTF-8 + + + + junit + junit + 3.8.1 + test + + + diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/App.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/App.java new file mode 100644 index 0000000..8f60c0e --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/App.java @@ -0,0 +1,7 @@ +package ru.mipt.diht.students.egdeliya.TwitterStream; + +public class App { + public static void main(String[] args) { + System.out.println("Hello World!"); + } +} diff --git a/projects/egdeliya/src/test/java/ru/mipt/diht/students/AppTest.java b/projects/egdeliya/src/test/java/ru/mipt/diht/students/AppTest.java new file mode 100644 index 0000000..4bb8dd4 --- /dev/null +++ b/projects/egdeliya/src/test/java/ru/mipt/diht/students/AppTest.java @@ -0,0 +1,38 @@ +package ru.mipt.diht.students; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} From fde7a357ffee64a92c5923d5518846da6e63e6a6 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Sun, 13 Dec 2015 15:57:08 +0300 Subject: [PATCH 03/19] third commit --- .../students/egdeliya/TwitterStream/MyStreamer.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java new file mode 100644 index 0000000..c929596 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java @@ -0,0 +1,10 @@ +package ru.mipt.diht.students.egdeliya.TwitterStream; + +/** + * Created by Эгделия on 13.12.2015. + */ +public class MyStreamer { + public static void main(String[] args) { + System.out.println("hello, World!"); + } +} From 226c87a55d6b7335e62b205dc2d98e169b2f07d3 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Tue, 15 Dec 2015 20:28:43 +0300 Subject: [PATCH 04/19] Reverser --- projects/egdeliya/pom.xml | 17 +++++++++++++---- .../students/egdeliya/Reverser/Reverser.java | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Reverser/Reverser.java diff --git a/projects/egdeliya/pom.xml b/projects/egdeliya/pom.xml index 6fba850..569ff49 100644 --- a/projects/egdeliya/pom.xml +++ b/projects/egdeliya/pom.xml @@ -17,10 +17,19 @@ - junit - junit - 3.8.1 - test + org.twitter4j + twitter4j-core + [4.0,) + + + org.twitter4j + twitter4j-stream + [4.0,) + + + com.beust + jcommander + 1.48 diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Reverser/Reverser.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Reverser/Reverser.java new file mode 100644 index 0000000..492961a --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Reverser/Reverser.java @@ -0,0 +1,16 @@ +package ru.mipt.diht.students.egdeliya.Reverser; + +/** + * Created by Эгделия on 15.12.2015. + */ +public class Reverser { + public static void main(String[] args) { + for (int i = args.length - 1; i >= 0; i--) { + String[] str = args[i].split("\\D+"); + for (int j = str.length - 1; j >= 0; j--) { + System.out.print(str[j] + " "); + } + } + System.out.println(); + } +} From d0b2aa7a416fe3fa2a817832e2cd80f532391d49 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Tue, 15 Dec 2015 22:14:26 +0300 Subject: [PATCH 05/19] Reverser --- .../students/egdeliya/Thread/Counter.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java new file mode 100644 index 0000000..601a141 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java @@ -0,0 +1,29 @@ +package ru.mipt.diht.students.egdeliya.Thread; + +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Created by Эгделия on 15.12.2015. + */ +public class Counter { + private static int numberOfThreads; + private static Lock lock = new ReentrantLock(true); + + public static void main(String[] args) { + numberOfThreads = Integer.parseInt(args[0]); + threadsCounter(); + } + + public static void threadsCounter() { + for (int i = 0; i < numberOfThreads; i++) { + Thread t = new Thread(); + lock.lock(); + try { + System.out.println(t.getName()); + } finally { + lock.unlock(); + } + } + } +} From a4880eb324cdb41110ef82d8713ca7059af1aac1 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Wed, 16 Dec 2015 00:17:06 +0300 Subject: [PATCH 06/19] Threads Counter --- .../students/egdeliya/Thread/Counter.java | 48 +++++++++++++++---- .../TwitterStream/JCommanderParser.java | 25 ++++++++++ .../egdeliya/TwitterStream/MyStreamer.java | 6 ++- 3 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java index 601a141..5c38faf 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java @@ -1,14 +1,18 @@ package ru.mipt.diht.students.egdeliya.Thread; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; +//import java.util.Objects; +//import java.util.concurrent.ThreadFactory; +//import java.util.concurrent.locks.Lock; +//import java.util.concurrent.locks.ReentrantLock; /** * Created by Эгделия on 15.12.2015. */ public class Counter { + private static Object object = new Object(); private static int numberOfThreads; - private static Lock lock = new ReentrantLock(true); + private static int currentThreadId; + private static Thread[] threads; public static void main(String[] args) { numberOfThreads = Integer.parseInt(args[0]); @@ -16,14 +20,40 @@ public static void main(String[] args) { } public static void threadsCounter() { + threads = new Thread[numberOfThreads]; + currentThreadId = 0; for (int i = 0; i < numberOfThreads; i++) { - Thread t = new Thread(); - lock.lock(); - try { - System.out.println(t.getName()); - } finally { - lock.unlock(); + threads[i] = new Thread(new PrintName(i, (i + 1) % numberOfThreads)); + threads[i].run(); + } + } + + public static class PrintName implements Runnable { + private int myThreadId, nextThreadId; + + public PrintName(int id1, int id2) { + myThreadId = id1; + nextThreadId = id2; + } + + @Override + public final synchronized void run() { + while (true) { + synchronized (object) { + while (myThreadId != currentThreadId) { + try { + object.wait(); + } catch (InterruptedException e) { + System.err.println("Thread " + myThreadId + " interrupted"); + } + } + System.out.println("Thread-" + myThreadId); + currentThreadId = nextThreadId; + object.notifyAll(); + break; + } } } } } + diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java new file mode 100644 index 0000000..e4c9093 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java @@ -0,0 +1,25 @@ +package ru.mipt.diht.students.egdeliya.TwitterStream; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; + +/** + * Created by Эгделия on 13.12.2015. + */ +public class JCommanderParser { + private final JCommander commander; + + @Parameter(names = { "-q", "--query" }, + description = "Ваши ключевые слова", + required = true) + private String query = ""; + + public final String getQuery() { + return query; + } + + public JCommanderParser(String[] args) { + commander = new JCommander(this, args); + } + +} diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java index c929596..65743e9 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java @@ -5,6 +5,10 @@ */ public class MyStreamer { public static void main(String[] args) { - System.out.println("hello, World!"); + JCommanderParser commandParser = new JCommanderParser(args); + + String query = commandParser.getQuery(); + + } } From b9943fb0226421578cbaa41c45b37bd65810f9f9 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Wed, 16 Dec 2015 00:23:05 +0300 Subject: [PATCH 07/19] Threads Counter --- .../java/ru/mipt/diht/students/egdeliya/Thread/Counter.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java index 5c38faf..c99e57b 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java @@ -1,10 +1,5 @@ package ru.mipt.diht.students.egdeliya.Thread; -//import java.util.Objects; -//import java.util.concurrent.ThreadFactory; -//import java.util.concurrent.locks.Lock; -//import java.util.concurrent.locks.ReentrantLock; - /** * Created by Эгделия on 15.12.2015. */ From 3e0260733cc12b397cd3b66f813f75c59e5999ac Mon Sep 17 00:00:00 2001 From: egdeliya Date: Thu, 17 Dec 2015 23:00:45 +0300 Subject: [PATCH 08/19] Threads Counter --- .../diht/students/egdeliya/Thread/Call.java | 51 +++++++++++++++++++ .../students/egdeliya/Thread/CallRunner.java | 11 ++++ .../students/egdeliya/Thread/Counter.java | 3 +- 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Call.java create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/CallRunner.java diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Call.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Call.java new file mode 100644 index 0000000..8357311 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Call.java @@ -0,0 +1,51 @@ +package ru.mipt.diht.students.egdeliya.Thread; + +import java.util.Random; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Created by Эгделия on 17.12.2015. + */ +@SuppressWarnings("checkstyle:magicnumber") +public class Call { + private Thread[] threads; + private int numberOfThreads; + private Random randomAnswer = new Random(); + private int threadAnswer; + private final int percentage = 10; + private boolean allThreadsReplyYes = false; + private Lock lock = new ReentrantLock(); + + public final void threadsCall(String arg) { + numberOfThreads = Integer.parseInt(arg); + threads = new Thread[numberOfThreads]; + for (int i = 0; i < numberOfThreads; ++i) + { + threads[i] = new Thread(new Reply()); + } + + while (!allThreadsReplyYes) { + System.out.println("Are you ready?"); + allThreadsReplyYes = true; + for (int i = 0; i < numberOfThreads; ++i) { + threads[i].run(); + } + } + } + + public class Reply implements Runnable { + + public final void run() { + lock.lock(); + threadAnswer = randomAnswer.nextInt(percentage); + if (threadAnswer == 1) { + System.out.println("No"); + allThreadsReplyYes = false; + } else { + System.out.println("Yes"); + } + lock.unlock(); + } + } +} diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/CallRunner.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/CallRunner.java new file mode 100644 index 0000000..e2e5afa --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/CallRunner.java @@ -0,0 +1,11 @@ +package ru.mipt.diht.students.egdeliya.Thread; + +/** + * Created by Эгделия on 17.12.2015. + */ +public class CallRunner { + public static void main(String[] args) { + Call call = new Call(); + call.threadsCall(args[0]); + } +} diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java index c99e57b..e67fb33 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Counter.java @@ -19,7 +19,7 @@ public static void threadsCounter() { currentThreadId = 0; for (int i = 0; i < numberOfThreads; i++) { threads[i] = new Thread(new PrintName(i, (i + 1) % numberOfThreads)); - threads[i].run(); + threads[i].start(); } } @@ -45,7 +45,6 @@ public final synchronized void run() { System.out.println("Thread-" + myThreadId); currentThreadId = nextThreadId; object.notifyAll(); - break; } } } From 08729929c2d77c2d61d13a5c9b340cb1c60439a1 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Fri, 18 Dec 2015 00:16:51 +0300 Subject: [PATCH 09/19] BlockingQueue --- .../egdeliya/Thread/BlockingQueue.java | 99 +++++++++++++++++++ .../egdeliya/Thread/BlockingQueueRunner.java | 11 +++ 2 files changed, 110 insertions(+) create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueueRunner.java diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java new file mode 100644 index 0000000..1e1f718 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java @@ -0,0 +1,99 @@ +package ru.mipt.diht.students.egdeliya.Thread; + +import java.util.*; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Created by Эгделия on 17.12.2015. + */ +public class BlockingQueue { + private int maxQueueSize; + private Queue queue; + private Lock offerLock = new ReentrantLock(); + private Lock queueLock = new ReentrantLock(); + private Lock takeLock = new ReentrantLock(); + + private Object takeWait = new Object(); + private Object offerWait = new Object(); + + public BlockingQueue(int size) { + maxQueueSize = size; + } + + //добавление элементов + public final void offer(List elements) { + offerLock.lock(); + try { + int offeredElementsNumber = 0; + while (offeredElementsNumber != elements.size()) { + synchronized (takeWait) { + //пока не можем добавить элементы + while (queue.size() == maxQueueSize) { + try { + //ждём, пока кто-нибудь вытащит элемент + takeWait.wait(); + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + } + } + //можем вставить элемент + try { + //вставляем атомарно, т.е блокируем очередь + queueLock.lock(); + while (offeredElementsNumber < elements.size() && queue.size() < maxQueueSize) { + queue.add(elements.get(offeredElementsNumber)); + ++offeredElementsNumber; + } + } finally { + queueLock.unlock(); + } + } + } + } finally { + //будим всех, кто хочет добавить элементы + synchronized (offerWait) { + offerWait.notifyAll(); + } + offerLock.unlock(); + } + } + + //возвращает numberOfElements первых элементов из очереди + public final List take(int numberOfElements) { + takeLock.lock(); + try { + List answer = new ArrayList<>(); + while (answer.size() != numberOfElements) { + synchronized (offerWait) { + //пока количество элементов в очереди меньше, чем numberOfElements + while (queue.size() < numberOfElements - answer.size()) { + try { + offerWait.wait(); + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + } + } + //можем удалить элемент + try { + queueLock.lock(); + while (answer.size() < numberOfElements + && + queue.size() >= numberOfElements - answer.size()) { + answer.add(queue.poll()); + } + } finally { + queueLock.unlock(); + } + } + } + return answer; + } finally { + synchronized (takeWait) { + takeWait.notifyAll(); + } + takeLock.unlock(); + } + } +} diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueueRunner.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueueRunner.java new file mode 100644 index 0000000..4f91d89 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueueRunner.java @@ -0,0 +1,11 @@ +package ru.mipt.diht.students.egdeliya.Thread; + +/** + * Created by Эгделия on 17.12.2015. + */ +public class BlockingQueueRunner { + public static void main(String[] args) { + BlockingQueue queue = new BlockingQueue(Integer.parseInt(args[0])); + //queue.; + } +} From 68a4843f047a6ad1cd5da6d4c6780719c5d49886 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Fri, 18 Dec 2015 00:17:57 +0300 Subject: [PATCH 10/19] BlockingQueue --- projects/egdeliya/pom.xml | 5 +++++ .../ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/projects/egdeliya/pom.xml b/projects/egdeliya/pom.xml index 569ff49..853809c 100644 --- a/projects/egdeliya/pom.xml +++ b/projects/egdeliya/pom.xml @@ -31,5 +31,10 @@ jcommander 1.48 + + com.h2database + h2 + 1.4.190 + diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java index 1e1f718..6f672eb 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java @@ -1,7 +1,6 @@ package ru.mipt.diht.students.egdeliya.Thread; import java.util.*; -import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; From 487babfd06baf8fc09c2aa58ef28169848d0ef9a Mon Sep 17 00:00:00 2001 From: egdeliya Date: Fri, 18 Dec 2015 00:56:57 +0300 Subject: [PATCH 11/19] BlockingQueue --- .../students/egdeliya/Thread/BlockingQueue.java | 2 ++ .../egdeliya/Thread/BlockingQueueRunner.java | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java index 6f672eb..37f5654 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java @@ -17,8 +17,10 @@ public class BlockingQueue { private Object takeWait = new Object(); private Object offerWait = new Object(); + //конструктор public BlockingQueue(int size) { maxQueueSize = size; + queue = new ArrayDeque(); } //добавление элементов diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueueRunner.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueueRunner.java index 4f91d89..51d0372 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueueRunner.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueueRunner.java @@ -1,11 +1,23 @@ package ru.mipt.diht.students.egdeliya.Thread; +import java.util.ArrayList; +import java.util.List; + /** * Created by Эгделия on 17.12.2015. */ +@SuppressWarnings("checkstyle:magicnumber") public class BlockingQueueRunner { public static void main(String[] args) { - BlockingQueue queue = new BlockingQueue(Integer.parseInt(args[0])); - //queue.; + int maxQueueSize = Integer.parseInt(args[0]); + BlockingQueue queue = new BlockingQueue(maxQueueSize); + List list = new ArrayList<>(4); + + list.add("Hello everyone! I just do it!"); + list.add("But I have to do some more..."); + list.add("Help me, please!"); + list.add("Oh, my God..."); + + queue.offer(list); } } From f9b3f1f38847d414160c7ffea29b1593949c4178 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Fri, 18 Dec 2015 23:27:32 +0300 Subject: [PATCH 12/19] BlockingQueue --- .../TwitterStream/JCommanderParser.java | 57 +++++++-- .../TwitterStream/TwitterStreamRunner.java | 11 ++ .../TwitterStream/TwitterStreamer.java | 115 ++++++++++++++++++ 3 files changed, 170 insertions(+), 13 deletions(-) create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamRunner.java create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java index e4c9093..d07260c 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java @@ -1,25 +1,56 @@ package ru.mipt.diht.students.egdeliya.TwitterStream; -import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; -/** - * Created by Эгделия on 13.12.2015. - */ +import java.util.ArrayList; +import java.util.List; + +@SuppressWarnings("checkstyle:designforextension") public class JCommanderParser { - private final JCommander commander; + //список параметров + @Parameter + private List parameters = new ArrayList<>(); - @Parameter(names = { "-q", "--query" }, - description = "Ваши ключевые слова", - required = true) - private String query = ""; + @Parameter(names = {"--query", "-q"}, description = "Ключевые слова") + private List query = new ArrayList<>(); - public final String getQuery() { - return query; + @Parameter(names = {"--place", "-p"}, arity = 1, description = "Твиты по заданному региону") + //место поиска по умолчанию + private String place = "nearby"; + + @Parameter(names = {"--stream", "-s"}, description = "Печать твитов") + private boolean stream = false; + + @Parameter(names = "--hideRetweets", description = "Не показывать ретвиты") + private boolean hideRetweets = false; + + @Parameter(names = {"--limit", "-l"}, description = "Ограничение числа выведенных твитов (не работает с потоком)") + private Integer limit = Integer.MAX_VALUE; + + @Parameter(names = {"--help", "-h"}, description = "Справка") + private boolean help = false; + + public String getLocation() { + return place; } - public JCommanderParser(String[] args) { - commander = new JCommander(this, args); + public boolean isStream() { + return stream; } + public boolean isHideRetweets() { + return hideRetweets; + } + + public Integer getLimit() { + return limit; + } + + public boolean isHelp() { + return help; + } + + public List getQuery() { + return query; + } } diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamRunner.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamRunner.java new file mode 100644 index 0000000..bb77fd8 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamRunner.java @@ -0,0 +1,11 @@ +package ru.mipt.diht.students.egdeliya.TwitterStream; + +/** + * Created by Эгделия on 18.12.2015. + */ +public class TwitterStreamRunner { + public static void main(String[] args) { + TwitterStreamer tweet = new TwitterStreamer(args); + tweet.twitterStreamRun(); + } +} diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java new file mode 100644 index 0000000..c2cb297 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java @@ -0,0 +1,115 @@ +package ru.mipt.diht.students.egdeliya.TwitterStream; + +//import ru.mipt.diht.students.egdeliya.TwitterStream.JCommanderParser; + + +import com.beust.jcommander.JCommander; +import twitter4j.*; + +import java.util.List; + +@SuppressWarnings("checkstyle:magicnumber") +public class TwitterStreamer { + private String usersQuery = ""; + //private boolean stream; + private boolean hideRetweets = false; + private boolean isLimit = false; + private String place; + private JCommanderParser jCommander = new JCommanderParser(); + private String[] arguments; + + public TwitterStreamer(String[] args) { + arguments = args; + + //парсим входую строку + new JCommander(jCommander, arguments); + } + + public final void help() { + //пользователь выводит справку + if (jCommander.isHelp()) { + JCommander jCommand = new JCommander(jCommander, arguments); + jCommand.usage(); + return; + } + } + + public final void query() throws TwitterException { + Twitter twitter = TwitterFactory.getSingleton(); + Query twitterQuery = new Query(usersQuery); + + //если установлен лимит + if (isLimit) { + twitterQuery.setCount(jCommander.getLimit()); + } + + try { + QueryResult result = twitter.search(twitterQuery); + for (Status status: result.getTweets()) { + + System.out.println("@" + status.getUser().getScreenName() + ":" + status.getText()); + + //если не нужно прятать ретвиты + if (!hideRetweets) { + List statusList = twitter.getRetweets(status.getId()); + for (Status node : statusList) { + System.out.println("@" + node.getUser().getScreenName() + " - " + node.getText()); + } + } + } + } catch (TwitterException t) { + System.err.println(t.getMessage()); + } + } + + public final void stream() { + if (jCommander.isStream()) { + //игнорируем limit + while (true) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + } + + } + + } + } + + public final void limit() { + if (jCommander.getLimit() < Integer.MAX_VALUE) { + isLimit = true; + } + } + + public final void hideRetweets() { + if (jCommander.isHideRetweets()) { + hideRetweets = true; + } + } + + public final void twitterStreamRun() { + //проверяем, что есть параметр help + help(); + + //должны склеить стоки и соединить пробелом + for (int i = 0; i < jCommander.getQuery().size(); i++) { + if (i < jCommander.getQuery().size() - 1) { + usersQuery += jCommander.getQuery().get(i) + " "; + } + usersQuery += jCommander.getQuery().get(i); + } + + //stream(); + limit(); + hideRetweets(); + + try { + query(); + } catch (TwitterException t) { + System.err.println(t.getMessage()); + } + } + +} From eea3066e5cf2dffc544510ac08dbc72889b9fd15 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Sat, 19 Dec 2015 04:25:57 +0300 Subject: [PATCH 13/19] TwitterStream --- .gitignore | 2 + .../TwitterStream/JCommanderParser.java | 6 +- .../TwitterStream/TwitterStreamer.java | 171 ++++++++++++------ 3 files changed, 124 insertions(+), 55 deletions(-) diff --git a/.gitignore b/.gitignore index 1e056e9..d6e5a5d 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ workbench.xmi *.swp .settings .checkstyle + +twitter4j.properties \ No newline at end of file diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java index d07260c..1ab0107 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java @@ -12,11 +12,11 @@ public class JCommanderParser { private List parameters = new ArrayList<>(); @Parameter(names = {"--query", "-q"}, description = "Ключевые слова") - private List query = new ArrayList<>(); + private String query = ""; @Parameter(names = {"--place", "-p"}, arity = 1, description = "Твиты по заданному региону") //место поиска по умолчанию - private String place = "nearby"; + private String place = ""; @Parameter(names = {"--stream", "-s"}, description = "Печать твитов") private boolean stream = false; @@ -50,7 +50,7 @@ public boolean isHelp() { return help; } - public List getQuery() { + public String getUsersQuery() { return query; } } diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java index c2cb297..c0ccc1d 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java @@ -1,23 +1,21 @@ package ru.mipt.diht.students.egdeliya.TwitterStream; -//import ru.mipt.diht.students.egdeliya.TwitterStream.JCommanderParser; - - import com.beust.jcommander.JCommander; import twitter4j.*; import java.util.List; +import java.util.Scanner; +import java.util.Vector; @SuppressWarnings("checkstyle:magicnumber") public class TwitterStreamer { - private String usersQuery = ""; - //private boolean stream; - private boolean hideRetweets = false; - private boolean isLimit = false; - private String place; + private Twitter twitter; + private String usersQuery; private JCommanderParser jCommander = new JCommanderParser(); private String[] arguments; + private static final int RADIUS = 50; + public TwitterStreamer(String[] args) { arguments = args; @@ -26,89 +24,158 @@ public TwitterStreamer(String[] args) { } public final void help() { - //пользователь выводит справку + //пользователь запрашивает справку if (jCommander.isHelp()) { JCommander jCommand = new JCommander(jCommander, arguments); jCommand.usage(); - return; } } - public final void query() throws TwitterException { - Twitter twitter = TwitterFactory.getSingleton(); + public final void query() throws TwitterException, InterruptedException { + twitter = TwitterFactory.getSingleton(); Query twitterQuery = new Query(usersQuery); - //если установлен лимит - if (isLimit) { - twitterQuery.setCount(jCommander.getLimit()); + //если установлено место + if (jCommander.getLocation() != "") { + twitterQuery = place(twitterQuery); } - try { - QueryResult result = twitter.search(twitterQuery); - for (Status status: result.getTweets()) { + //если указан параметр stream + if (jCommander.isStream()) { + streamRunner(twitterQuery); + } else { - System.out.println("@" + status.getUser().getScreenName() + ":" + status.getText()); + //если установлен лимит + if (jCommander.getLimit() < Integer.MAX_VALUE) { + twitterQuery.setCount(jCommander.getLimit()); + } + + try { + QueryResult result = twitter.search(twitterQuery); - //если не нужно прятать ретвиты - if (!hideRetweets) { - List statusList = twitter.getRetweets(status.getId()); - for (Status node : statusList) { - System.out.println("@" + node.getUser().getScreenName() + " - " + node.getText()); - } + //если по запросу не найдены твиты + if (result.getTweets().size() == 0) { + System.out.println("There is no tweets for " + usersQuery); } + + for (Status status : result.getTweets()) { + printTweet(status); + } + } catch (TwitterException t) { + System.err.println(t.getMessage()); } - } catch (TwitterException t) { - System.err.println(t.getMessage()); } } - public final void stream() { - if (jCommander.isStream()) { - //игнорируем limit - while (true) { + public final void streamRunner(Query twitterQuery) throws InterruptedException, TwitterException { + + TwitterStream streamer = new TwitterStreamFactory().getInstance(); + StatusAdapter listener = new StatusAdapter() { + @Override + public void onStatus(Status status) { + printTweet(status); try { - Thread.sleep(1); + Thread.sleep(1000); } catch (InterruptedException e) { - System.out.println(e.getMessage()); + System.err.println(e.getMessage()); } - } + @Override + public void onException(Exception ex) { + System.err.println(ex.getMessage()); + } + }; + streamer.addListener(listener); + + //фильтруем запросы + FilterQuery filterQuery = new FilterQuery(); + filterQuery.track(twitterQuery.getQuery()); + streamer.filter(filterQuery); + + Scanner scanner = new Scanner(System.in); + while (scanner.hasNextLine()) { + Thread.sleep(1000); } } - public final void limit() { - if (jCommander.getLimit() < Integer.MAX_VALUE) { - isLimit = true; + public final void printTweet(Status status) { + + //если параметр stream не установлен + if (!jCommander.isStream()) { + System.out.println(status.getCreatedAt()); } - } - public final void hideRetweets() { - if (jCommander.isHideRetweets()) { - hideRetweets = true; + //красит ник в синий цвет + System.out.println("@" + "\033[34m@" + status.getUser().getName() + + "\033[0m: " + " : " + status.getText()); + + //если не нужно прятать ретвиты + if (!jCommander.isHideRetweets() && !jCommander.isStream()) { + try { + List statusList = twitter.getRetweets(status.getId()); + for (Status node : statusList) { + System.out.println("@" + " \033[34m@" + node.getUser().getName() + "\033[0m: " + " : " + + node.getText()); + } + } catch (TwitterException t) { + System.err.println(t.getMessage()); + } } } - public final void twitterStreamRun() { - //проверяем, что есть параметр help - help(); + public final Query place(Query twitterQuery) throws TwitterException { - //должны склеить стоки и соединить пробелом - for (int i = 0; i < jCommander.getQuery().size(); i++) { - if (i < jCommander.getQuery().size() - 1) { - usersQuery += jCommander.getQuery().get(i) + " "; + Vector locations = new Vector<>(); + + //устанавливаем магический ip + GeoQuery geoQuery = new GeoQuery("0.0.0.0"); + geoQuery.setQuery(jCommander.getLocation()); + + //получаем информацию о местах + //в эпсилон окрестности нашего места + ResponseList responseList; + responseList = twitter.searchPlaces(geoQuery); + + for (Place geoPlace : responseList) { + + for (int i = 0; i < geoPlace.getBoundingBoxCoordinates().length; i++) { + for (int j = 0; + j < geoPlace.getBoundingBoxCoordinates()[i].length; j++) { + locations.add(geoPlace.getBoundingBoxCoordinates()[i][j]); + //System.out.println(geoPlace.getBoundingBoxCoordinates()[i][j]); + } } - usersQuery += jCommander.getQuery().get(i); } - //stream(); - limit(); - hideRetweets(); + //вычисляем центр + double x = 0; + double y = 0; + for (GeoLocation location : locations) { + x += location.getLatitude(); + y += location.getLongitude(); + } + x /= locations.size(); + y /= locations.size(); + + GeoLocation ourLocation = new GeoLocation(x, y); + twitterQuery.setGeoCode(ourLocation, RADIUS, Query.Unit.km); + + return twitterQuery; + } + + public final void twitterStreamRun() { + + //проверяем, что есть параметр help + help(); + usersQuery = jCommander.getUsersQuery(); try { query(); } catch (TwitterException t) { System.err.println(t.getMessage()); + } catch (InterruptedException e) { + System.err.println(e.getMessage()); } } From 1a01cf1d903a18a55a6d5d07cfd7e0693ae43a12 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Sat, 19 Dec 2015 04:29:19 +0300 Subject: [PATCH 14/19] Deleted App --- .../ru/mipt/diht/students/egdeliya/TwitterStream/App.java | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/App.java diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/App.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/App.java deleted file mode 100644 index 8f60c0e..0000000 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/App.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.mipt.diht.students.egdeliya.TwitterStream; - -public class App { - public static void main(String[] args) { - System.out.println("Hello World!"); - } -} From a98a972a343d1cd1c0e22ae1bc9a18108c490cf1 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Sat, 19 Dec 2015 04:31:06 +0300 Subject: [PATCH 15/19] Deleted MyStreamer --- .../egdeliya/TwitterStream/MyStreamer.java | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java deleted file mode 100644 index 65743e9..0000000 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/MyStreamer.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.mipt.diht.students.egdeliya.TwitterStream; - -/** - * Created by Эгделия on 13.12.2015. - */ -public class MyStreamer { - public static void main(String[] args) { - JCommanderParser commandParser = new JCommanderParser(args); - - String query = commandParser.getQuery(); - - - } -} From 8d731f52ef2f8f8d0cebe26b5d8f9df36015cfce Mon Sep 17 00:00:00 2001 From: egdeliya Date: Sat, 19 Dec 2015 04:53:31 +0300 Subject: [PATCH 16/19] Commit all files --- projects/egdeliya/pom.xml | 4 ++-- .../ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java | 4 +++- .../main/java/ru/mipt/diht/students/egdeliya/Thread/Call.java | 3 +-- .../students/egdeliya/TwitterStream/JCommanderParser.java | 3 ++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/projects/egdeliya/pom.xml b/projects/egdeliya/pom.xml index 853809c..ad202b7 100644 --- a/projects/egdeliya/pom.xml +++ b/projects/egdeliya/pom.xml @@ -19,12 +19,12 @@ org.twitter4j twitter4j-core - [4.0,) + 4.0.4 org.twitter4j twitter4j-stream - [4.0,) + 4.0.4 com.beust diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java index 37f5654..f3cbe2a 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/BlockingQueue.java @@ -68,7 +68,9 @@ public final List take(int numberOfElements) { List answer = new ArrayList<>(); while (answer.size() != numberOfElements) { synchronized (offerWait) { - //пока количество элементов в очереди меньше, чем numberOfElements + + //пока количество элементов в очереди меньше, + // чем numberOfElements while (queue.size() < numberOfElements - answer.size()) { try { offerWait.wait(); diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Call.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Call.java index 8357311..183d741 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Call.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/Thread/Call.java @@ -20,8 +20,7 @@ public class Call { public final void threadsCall(String arg) { numberOfThreads = Integer.parseInt(arg); threads = new Thread[numberOfThreads]; - for (int i = 0; i < numberOfThreads; ++i) - { + for (int i = 0; i < numberOfThreads; ++i) { threads[i] = new Thread(new Reply()); } diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java index 1ab0107..63f8419 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java @@ -24,7 +24,8 @@ public class JCommanderParser { @Parameter(names = "--hideRetweets", description = "Не показывать ретвиты") private boolean hideRetweets = false; - @Parameter(names = {"--limit", "-l"}, description = "Ограничение числа выведенных твитов (не работает с потоком)") + @Parameter(names = {"--limit", "-l"}, + description = "Ограничение числа выведенных твитов (не работает с потоком)") private Integer limit = Integer.MAX_VALUE; @Parameter(names = {"--help", "-h"}, description = "Справка") From e0cf324888524068ba517b9e01dcd9950fd36182 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Sat, 19 Dec 2015 07:56:49 +0300 Subject: [PATCH 17/19] MiniORM --- .../students/egdeliya/MiniORM/Column.java | 14 + .../egdeliya/MiniORM/DataBaseRunner.java | 10 + .../egdeliya/MiniORM/DatabaseService.java | 287 ++++++++++++++++++ .../students/egdeliya/MiniORM/PrimaryKey.java | 11 + .../diht/students/egdeliya/MiniORM/Table.java | 12 + .../egdeliya/MiniORM/TypeConverter.java | 23 ++ 6 files changed, 357 insertions(+) create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Column.java create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseRunner.java create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/PrimaryKey.java create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Table.java create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/TypeConverter.java diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Column.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Column.java new file mode 100644 index 0000000..144fdf0 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Column.java @@ -0,0 +1,14 @@ +package ru.mipt.diht.students.egdeliya.MiniORM; + +/** + * Created by Эгделия on 19.12.2015. + */ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Column { + //аннотации для столца, чтобы программа узнавала + //что это поле - столбец + String name() default ""; +} diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseRunner.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseRunner.java new file mode 100644 index 0000000..3e9b4d9 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseRunner.java @@ -0,0 +1,10 @@ +package ru.mipt.diht.students.egdeliya.MiniORM; + +/** + * Created by Эгделия on 19.12.2015. + */ +public class DataBaseRunner { + public static void main(String[] args) { + + } +} diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java new file mode 100644 index 0000000..8c80b39 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java @@ -0,0 +1,287 @@ +package ru.mipt.diht.students.egdeliya.MiniORM; + +//import java.io.Closeable; + +//import java.util.ArrayList; +import org.h2.jdbcx.JdbcConnectionPool; + +import java.lang.reflect.Field; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Эгделия on 19.12.2015. + */ +public class DatabaseService { + + private Class tableClass; + private String tableName; + private Field[] fields; + private Table tableAnnotation; + private List columnsNames; + + //столбец, который является primary key + private int primaryKeyPosition; + private String primaryKeycolumnsName = ""; + + //соединенеи с сервером + private JdbcConnectionPool connection; + + private void setTableAnnotations() { + + //нам нужны аннотации, чтобы распознать, + //где какие поля у класса + if (!tableClass.isAnnotation()) { + System.err.println("There is no @Table annotation"); + } + tableAnnotation = tableClass.getAnnotation(Table.class); + } + + private void setTableName() { + tableName = tableAnnotation.name(); + if (tableName == "") { + tableName = "DefaultTableName"; + } + } + + private void setFields() { + + //массив полей + fields = tableClass.getDeclaredFields(); + boolean thereIsPrimaryKye = false; + for (Field column: fields) { + if (!column.isAnnotationPresent(Column.class)) { + System.err.println("There is incorrect @Column annotation"); + } + + //узнаем имя поля через аннотацию + String currentColumnName = column.getAnnotation(Column.class).name(); + if (currentColumnName == "") { + currentColumnName = "DefaultColumnName"; + } + + //поле с аннотацией primary key + if (column.isAnnotationPresent(PrimaryKey.class)) { + if (!thereIsPrimaryKye) { + thereIsPrimaryKye = true; + primaryKeyPosition = columnsNames.size(); + primaryKeycolumnsName = currentColumnName; + } else { + System.err.println("There is too many primary keys"); + } + } + + columnsNames.add(currentColumnName); + } + } + + public final void createTable() { + + //конструируем запрос + String query = "CREATE TABLE IF NOT EXISTS " + tableName; + query += "("; + for (int i = 0; i < fields.length; i++) { + query += columnsNames.get(i) + " "; + query += new TypeConverter(fields[i].getType()); + if (fields[i].isAnnotationPresent(PrimaryKey.class)) { + query += "PRIMARY KEY"; + } + if (i != fields.length - 1) { + query += ","; + } + } + query += ")"; + + //отправляем запрос на сервер + try { + Connection connect = connection.getConnection(); + connect.createStatement().execute(query); + } catch (SQLException sql) { + System.err.println(sql.getMessage()); + } + + } + + public final void insert(T element) { + //конструируем запрос + String insertQuery = "INSERT INTO" + tableName + "VALUES"; + insertQuery += "("; + + for (int i = 0; i < fields.length; ++i) { + insertQuery += "?"; + if (i != fields.length - 1) { + insertQuery += ", "; + } + } + insertQuery += ")"; + + //подстановка нужных значений для вопросов + try { + Connection connect = connection.getConnection(); + PreparedStatement statement = connect.prepareStatement(insertQuery); + for (int i = 0; i < fields.length; i++) { + Field currentField = fields[i]; + + //todo + //значение этого поля при подстановке + Object elementObject = currentField.get(element); + + statement.setObject(i + 1, elementObject); + } + //посылаем запрос на сервер + statement.execute(); + } catch (SQLException sql) { + System.err.println(sql.getMessage()); + } catch (IllegalAccessException access) { + System.err.println(access.getMessage()); + } + } + + public final void dropTable() { + + //составляем запрос и отправляем + try { + Connection connect = connection.getConnection(); + connect.createStatement().execute("DROP TABLE IF NOT EXISTS" + tableName); + } catch (SQLException exc) { + System.err.println(exc.getMessage()); + } + + } + + public final void delete(T element) { + String deleteQuery = "DELETE FROM " + tableName + " WHERE " + + primaryKeycolumnsName + " = ?"; + + //подставляем под вопросики всё что нужно + try { + Connection connect = connection.getConnection(); + PreparedStatement statement = connect.prepareStatement(deleteQuery); + + //todo + statement.setObject(1, fields[primaryKeyPosition].get(element)); + + //отправляем запрос + statement.execute(); + + } catch (SQLException s) { + System.err.println(s.getMessage()); + } catch (IllegalAccessException i) { + System.err.println(i.getMessage()); + } + } + + public final void updated(T element) { + + //должны обновить каждое поле нашей строки + for (int i = 0; i < columnsNames.size(); i++) { + if (i == primaryKeyPosition) { + continue; + } + + String currentColumn = columnsNames.get(i); + //sql запрос + String updateQuery = "UPDATE " + tableName + "SET " + currentColumn + + " = ? WHERE " + primaryKeycolumnsName + " = ?"; + + try { + Connection connect = connection.getConnection(); + PreparedStatement statement = connect.prepareStatement(updateQuery); + + //подготовка запросов на отправление (замена вопросиков) + statement.setObject(1, fields[i].get(element)); + statement.setObject(2, fields[primaryKeyPosition].get(element)); + + // Отправление на исполнение. + statement.execute(); + } catch (SQLException s) { + System.err.println(s.getMessage()); + } catch (IllegalAccessException illegal) { + System.err.println(illegal.getMessage()); + } + + } + } + + //запрос SELECT * + //должен вернуть список всех полей + public final List queryForAll() { + String query = "SELECT * FROM " + tableName; + List tableStrings = new ArrayList<>(); + + try { + Connection connect = connection.getConnection(); + + ResultSet result = connect.createStatement().executeQuery(query); + + while (result.next()) { + T newTableString = tableClass.newInstance(); + + for (int i = 0; i < fields.length; i++) { + String currentColumn = columnsNames.get(i); + + //todo + Object currentObject = result.getObject(currentColumn); + fields[i].set(newTableString, currentObject); + } + tableStrings.add(newTableString); + } + + + } catch (SQLException sql) { + System.err.println(sql.getMessage()); + } catch (InstantiationException ins) { + System.err.println(ins.getMessage()); + } catch (IllegalAccessException illeg) { + System.err.println(illeg.getMessage()); + } + return tableStrings; + } + + //два шабона, потому что уникальные ключи могут быть разными типами + public final T queryById(K primaryKey) throws SQLException, IllegalAccessException, InstantiationException { + String query = "SELECT * FROM " + tableName + " WHERE" + primaryKeycolumnsName + + " = " + primaryKey; + + //должен выдать единственную строку + T tableString = tableClass.newInstance(); + + Connection connect = connection.getConnection(); + ResultSet result = connect.createStatement().executeQuery(query); + + if (result.next()) { + for (int i = 0; i < fields.length; i++) { + String currentString = columnsNames.get(i); + + //todo + Object currentObject = result.getObject(currentString); + fields[i].set(tableString, currentObject); + } + } + + return tableString; + } + + public DatabaseService(Class newClass) { + tableClass = newClass; + + setTableAnnotations(); + setTableName(); + setFields(); + + //подключение + try { + Class.forName("org.h2.Driver"); + } catch (ClassNotFoundException ex) { + System.out.println(ex.getMessage()); + } + + connection = JdbcConnectionPool.create("jdbc:h2:~/test", "test", "test"); + } + + +} diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/PrimaryKey.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/PrimaryKey.java new file mode 100644 index 0000000..207a07d --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/PrimaryKey.java @@ -0,0 +1,11 @@ +package ru.mipt.diht.students.egdeliya.MiniORM; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Created by Эгделия on 19.12.2015. + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface PrimaryKey { +} diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Table.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Table.java new file mode 100644 index 0000000..45c3c49 --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Table.java @@ -0,0 +1,12 @@ +package ru.mipt.diht.students.egdeliya.MiniORM; + +/** + * Created by Эгделия on 19.12.2015. + */ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Table { + String name() default ""; +} diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/TypeConverter.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/TypeConverter.java new file mode 100644 index 0000000..78191cb --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/TypeConverter.java @@ -0,0 +1,23 @@ +package ru.mipt.diht.students.egdeliya.MiniORM; + +/** + * Created by Эгделия on 19.12.2015. + */ + +//todo +public class TypeConverter { + + private String sqlType; + + TypeConverter(Class sqlClass) { + if (sqlClass == Integer.class) { + sqlType = "INTEGER"; + } else if (sqlClass == String.class) { + sqlType = "VARCHAR(255)"; + } + } + //@Override + public final String toSqlType() { + return sqlType; + } +} From 478e53381ea1b9dd42dfbf8c3c622fe024e9c30b Mon Sep 17 00:00:00 2001 From: egdeliya Date: Sat, 19 Dec 2015 15:26:53 +0300 Subject: [PATCH 18/19] MiniORM --- .../egdeliya/MiniORM/DataBaseRunner.java | 10 -- .../egdeliya/MiniORM/DatabaseService.java | 81 +++++++++---- .../diht/students/egdeliya/MiniORM/Star.java | 107 ++++++++++++++++++ .../egdeliya/MiniORM/TypeConverter.java | 1 - .../egdeliya/MiniORM/DataBaseServiceTest.java | 43 +++++++ 5 files changed, 206 insertions(+), 36 deletions(-) delete mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseRunner.java create mode 100644 projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Star.java create mode 100644 projects/egdeliya/src/test/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseServiceTest.java diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseRunner.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseRunner.java deleted file mode 100644 index 3e9b4d9..0000000 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseRunner.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.mipt.diht.students.egdeliya.MiniORM; - -/** - * Created by Эгделия on 19.12.2015. - */ -public class DataBaseRunner { - public static void main(String[] args) { - - } -} diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java index 8c80b39..1d1e860 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java @@ -5,6 +5,8 @@ //import java.util.ArrayList; import org.h2.jdbcx.JdbcConnectionPool; +import java.io.Closeable; +import java.io.IOException; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.PreparedStatement; @@ -16,17 +18,17 @@ /** * Created by Эгделия on 19.12.2015. */ -public class DatabaseService { +public class DatabaseService implements Closeable { private Class tableClass; private String tableName; private Field[] fields; private Table tableAnnotation; - private List columnsNames; + private List columnsNames = new ArrayList<>(); //столбец, который является primary key private int primaryKeyPosition; - private String primaryKeycolumnsName = ""; + private String primaryKeyColumnsName = ""; //соединенеи с сервером private JdbcConnectionPool connection; @@ -35,10 +37,11 @@ private void setTableAnnotations() { //нам нужны аннотации, чтобы распознать, //где какие поля у класса - if (!tableClass.isAnnotation()) { + tableAnnotation = tableClass.getAnnotation(Table.class); + if (tableAnnotation == null) { System.err.println("There is no @Table annotation"); } - tableAnnotation = tableClass.getAnnotation(Table.class); + } private void setTableName() { @@ -53,6 +56,7 @@ private void setFields() { //массив полей fields = tableClass.getDeclaredFields(); boolean thereIsPrimaryKye = false; + int fieldsCounter = 0; for (Field column: fields) { if (!column.isAnnotationPresent(Column.class)) { System.err.println("There is incorrect @Column annotation"); @@ -68,13 +72,14 @@ private void setFields() { if (column.isAnnotationPresent(PrimaryKey.class)) { if (!thereIsPrimaryKye) { thereIsPrimaryKye = true; - primaryKeyPosition = columnsNames.size(); - primaryKeycolumnsName = currentColumnName; + primaryKeyPosition = fieldsCounter; + primaryKeyColumnsName = currentColumnName; } else { System.err.println("There is too many primary keys"); } } + ++fieldsCounter; columnsNames.add(currentColumnName); } } @@ -86,12 +91,12 @@ public final void createTable() { query += "("; for (int i = 0; i < fields.length; i++) { query += columnsNames.get(i) + " "; - query += new TypeConverter(fields[i].getType()); + query += new TypeConverter(fields[i].getType()).toSqlType(); if (fields[i].isAnnotationPresent(PrimaryKey.class)) { - query += "PRIMARY KEY"; + query += " PRIMARY KEY"; } if (i != fields.length - 1) { - query += ","; + query += ", "; } } query += ")"; @@ -102,13 +107,14 @@ public final void createTable() { connect.createStatement().execute(query); } catch (SQLException sql) { System.err.println(sql.getMessage()); + System.out.println("SQLException in createTable"); } } public final void insert(T element) { //конструируем запрос - String insertQuery = "INSERT INTO" + tableName + "VALUES"; + String insertQuery = "INSERT INTO " + tableName + " VALUES"; insertQuery += "("; for (int i = 0; i < fields.length; ++i) { @@ -119,14 +125,19 @@ public final void insert(T element) { } insertQuery += ")"; + //System.out.println(insertQuery); + //подстановка нужных значений для вопросов + try { Connection connect = connection.getConnection(); PreparedStatement statement = connect.prepareStatement(insertQuery); + + //нужно так делать, потому что мы не знаем тип SQL + //Prepare приводит наш запрос к нужному виду for (int i = 0; i < fields.length; i++) { Field currentField = fields[i]; - //todo //значение этого поля при подстановке Object elementObject = currentField.get(element); @@ -136,8 +147,10 @@ public final void insert(T element) { statement.execute(); } catch (SQLException sql) { System.err.println(sql.getMessage()); + System.out.println("SQLException in insert"); } catch (IllegalAccessException access) { System.err.println(access.getMessage()); + System.out.println("IllegalAccessException in insert"); } } @@ -146,23 +159,25 @@ public final void dropTable() { //составляем запрос и отправляем try { Connection connect = connection.getConnection(); - connect.createStatement().execute("DROP TABLE IF NOT EXISTS" + tableName); + connect.createStatement().execute("DROP TABLE IF EXISTS " + tableName); } catch (SQLException exc) { System.err.println(exc.getMessage()); + System.out.println("SQLException in dropTable"); } } public final void delete(T element) { String deleteQuery = "DELETE FROM " + tableName + " WHERE " - + primaryKeycolumnsName + " = ?"; + + primaryKeyColumnsName + " = ?"; + System.out.println(deleteQuery); //подставляем под вопросики всё что нужно try { Connection connect = connection.getConnection(); PreparedStatement statement = connect.prepareStatement(deleteQuery); - //todo + //подставляем на место первого вопросика statement.setObject(1, fields[primaryKeyPosition].get(element)); //отправляем запрос @@ -170,8 +185,10 @@ public final void delete(T element) { } catch (SQLException s) { System.err.println(s.getMessage()); + System.out.println("SQLException in delete"); } catch (IllegalAccessException i) { System.err.println(i.getMessage()); + System.out.println("IllegalAccessException in delete"); } } @@ -186,7 +203,7 @@ public final void updated(T element) { String currentColumn = columnsNames.get(i); //sql запрос String updateQuery = "UPDATE " + tableName + "SET " + currentColumn - + " = ? WHERE " + primaryKeycolumnsName + " = ?"; + + " = ? WHERE " + primaryKeyColumnsName + " = ?"; try { Connection connect = connection.getConnection(); @@ -200,8 +217,10 @@ public final void updated(T element) { statement.execute(); } catch (SQLException s) { System.err.println(s.getMessage()); + System.out.println("SQLException in updated"); } catch (IllegalAccessException illegal) { System.err.println(illegal.getMessage()); + System.out.println("IllegalAccessException in update"); } } @@ -212,53 +231,58 @@ public final void updated(T element) { public final List queryForAll() { String query = "SELECT * FROM " + tableName; List tableStrings = new ArrayList<>(); - try { Connection connect = connection.getConnection(); ResultSet result = connect.createStatement().executeQuery(query); + while (result.next()) { T newTableString = tableClass.newInstance(); for (int i = 0; i < fields.length; i++) { String currentColumn = columnsNames.get(i); - //todo Object currentObject = result.getObject(currentColumn); fields[i].set(newTableString, currentObject); } tableStrings.add(newTableString); } - - + return tableStrings; } catch (SQLException sql) { System.err.println(sql.getMessage()); + System.out.println("SQLException in SELECT FROM *"); } catch (InstantiationException ins) { System.err.println(ins.getMessage()); + System.out.println("InstantiationException in SELECT FROM *"); } catch (IllegalAccessException illeg) { System.err.println(illeg.getMessage()); + System.out.println("IllegalAccessException in SELECT FROM *"); } return tableStrings; } - //два шабона, потому что уникальные ключи могут быть разными типами + //два шабона, + //потому что уникальные ключи могут быть разными типами public final T queryById(K primaryKey) throws SQLException, IllegalAccessException, InstantiationException { - String query = "SELECT * FROM " + tableName + " WHERE" + primaryKeycolumnsName + String query = "SELECT * FROM " + tableName + " WHERE " + primaryKeyColumnsName + " = " + primaryKey; //должен выдать единственную строку T tableString = tableClass.newInstance(); Connection connect = connection.getConnection(); + + //ответ базы данных возвращается в виде ResultSet ResultSet result = connect.createStatement().executeQuery(query); if (result.next()) { for (int i = 0; i < fields.length; i++) { - String currentString = columnsNames.get(i); + String currentColumn = columnsNames.get(i); - //todo - Object currentObject = result.getObject(currentString); + //по иени колонки возвращает значение поля + //в текущей строке + Object currentObject = result.getObject(currentColumn); fields[i].set(tableString, currentObject); } } @@ -283,5 +307,12 @@ public DatabaseService(Class newClass) { connection = JdbcConnectionPool.create("jdbc:h2:~/test", "test", "test"); } + @SuppressWarnings("checkstyle:designforextension") + @Override + public void close() throws IOException { + if (connection != null) { + connection.dispose(); + } + } } diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Star.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Star.java new file mode 100644 index 0000000..2c0f4de --- /dev/null +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Star.java @@ -0,0 +1,107 @@ +package ru.mipt.diht.students.egdeliya.MiniORM; + +import com.sun.nio.sctp.IllegalReceiveException; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Эгделия on 19.12.2015. + */ + +//таблица будет сожержать инфу о звёздах +//чтобы можно было делать переменные не private +@SuppressWarnings("checkstyle:visibilitymodifier") +@Table(name = "STARS") +public class Star { + @PrimaryKey + @Column(name = "ID") + Integer id; + + @Column(name = "Name") + String starName; + + @Column(name = "Radius") + Integer radius; + + Star(Integer ourId, String n, Integer r) { + starName = n; + radius = r; + id = ourId; + } + + Star() { + starName = ""; + radius = 0; + id = 0; + } + + public final String toString() { + String result = starName + " " + radius + " " + id; + return result; + } + + @SuppressWarnings("checkstyle:magicnumber") + public static void main(String[] args) { + DatabaseService dataBase = new DatabaseService<>(Star.class); + try { + + dataBase.createTable(); + + Star sun = new Star(0, "Sun", 60000); + + //insert + System.out.println("\ninsert test"); + dataBase.insert(sun); + dataBase.insert(new Star(1, "Alpha", 63000)); + dataBase.insert(new Star(2, "Betta", 28000)); + dataBase.insert(new Star(3, "Gamma", 15000)); + dataBase.insert(new Star(4, "Delta", 57900)); + dataBase.insert(new Star(5, "Omega", 1000)); + + //SELECT * + System.out.println("\nSelect all test"); + List table; + table = dataBase.queryForAll(); + + for (int i = 0; i < table.size(); i++) { + System.out.println(table.get(i).toString()); + } + + //queryById + System.out.println("\nqueryById test"); + try { + Star myStar; + myStar = dataBase.queryById(2); + System.out.println(myStar); + } catch (IllegalAccessException illegal) { + System.out.println("IllegalAccessException in queryById"); + System.err.println(illegal.getMessage()); + } catch (SQLException sql) { + System.err.println(sql.getMessage()); + System.out.println("SQLException in queryById"); + } catch (InstantiationException instal) { + System.err.println(instal.getMessage()); + System.out.println("InstantiationException in queryById"); + } + + System.out.println("\ndelete test"); + //delete + dataBase.delete(sun); + + //SELECT * + List tableAfterDelete; + tableAfterDelete = dataBase.queryForAll(); + + for (int i = 0; i < tableAfterDelete.size(); i++) { + System.out.println(tableAfterDelete.get(i)); + } + + } finally { + dataBase.dropTable(); + } + } +} + + diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/TypeConverter.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/TypeConverter.java index 78191cb..53bdf7f 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/TypeConverter.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/TypeConverter.java @@ -16,7 +16,6 @@ public class TypeConverter { sqlType = "VARCHAR(255)"; } } - //@Override public final String toSqlType() { return sqlType; } diff --git a/projects/egdeliya/src/test/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseServiceTest.java b/projects/egdeliya/src/test/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseServiceTest.java new file mode 100644 index 0000000..2b92235 --- /dev/null +++ b/projects/egdeliya/src/test/java/ru/mipt/diht/students/egdeliya/MiniORM/DataBaseServiceTest.java @@ -0,0 +1,43 @@ +package ru.mipt.diht.students.egdeliya.MiniORM; + +import junit.framework.TestCase; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Эгделия on 19.12.2015. + */ + +// +public class DataBaseServiceTest extends TestCase { + DatabaseService dataBase; + + @Before + public void initializer() { + dataBase = new DatabaseService<>(Star.class); + + dataBase.createTable(); + } + + @Test + public void testInsert() { +/* + dataBase.insert(new Star("Sun", 60000, "Red")); + dataBase.insert(new Star("Alpha", 63000, "Blue")); + dataBase.insert(new Star("Betta", 28000, "Yellow")); + dataBase.insert(new Star("Gamma", 15000, "Red")); + dataBase.insert(new Star("Delta", 57900, "Blue")); + dataBase.insert(new Star("Omega", 1000, "Orange")); + */ + } + + @After + public void cleaner() { + dataBase.dropTable(); + } + + + + +} From ce6a061bed1fd4deb6b69486c5d8c04d3cc9e254 Mon Sep 17 00:00:00 2001 From: egdeliya Date: Sat, 19 Dec 2015 15:38:29 +0300 Subject: [PATCH 19/19] probable bugs && checkstyle --- .../mipt/diht/students/egdeliya/MiniORM/DatabaseService.java | 4 ++-- .../java/ru/mipt/diht/students/egdeliya/MiniORM/Star.java | 3 --- .../students/egdeliya/TwitterStream/JCommanderParser.java | 5 +++-- .../students/egdeliya/TwitterStream/TwitterStreamer.java | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java index 1d1e860..5968431 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/DatabaseService.java @@ -46,7 +46,7 @@ private void setTableAnnotations() { private void setTableName() { tableName = tableAnnotation.name(); - if (tableName == "") { + if (tableName.equals("")) { tableName = "DefaultTableName"; } } @@ -64,7 +64,7 @@ private void setFields() { //узнаем имя поля через аннотацию String currentColumnName = column.getAnnotation(Column.class).name(); - if (currentColumnName == "") { + if (currentColumnName.equals("")) { currentColumnName = "DefaultColumnName"; } diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Star.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Star.java index 2c0f4de..25a4591 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Star.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/MiniORM/Star.java @@ -1,9 +1,6 @@ package ru.mipt.diht.students.egdeliya.MiniORM; -import com.sun.nio.sctp.IllegalReceiveException; - import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; /** diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java index 63f8419..9688a94 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/JCommanderParser.java @@ -24,8 +24,9 @@ public class JCommanderParser { @Parameter(names = "--hideRetweets", description = "Не показывать ретвиты") private boolean hideRetweets = false; - @Parameter(names = {"--limit", "-l"}, - description = "Ограничение числа выведенных твитов (не работает с потоком)") + @Parameter( + names = {"--limit", "-l"}, + description = "Ограничение числа выведенных твитов") private Integer limit = Integer.MAX_VALUE; @Parameter(names = {"--help", "-h"}, description = "Справка") diff --git a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java index c0ccc1d..abceaa4 100644 --- a/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java +++ b/projects/egdeliya/src/main/java/ru/mipt/diht/students/egdeliya/TwitterStream/TwitterStreamer.java @@ -36,7 +36,7 @@ public final void query() throws TwitterException, InterruptedException { Query twitterQuery = new Query(usersQuery); //если установлено место - if (jCommander.getLocation() != "") { + if (!jCommander.getLocation().equals("")) { twitterQuery = place(twitterQuery); }