From f08f3f20b625d3ed34c0f33ab57b55b3509fa0a8 Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Thu, 17 Dec 2015 01:11:40 +0300 Subject: [PATCH 01/16] 5th task --- evlinkov/pom.xml | 26 +++++++ .../evlinkov/threads/BlockingQueue.java | 35 +++++++++ .../evlinkov/threads/ThreadMuster.java | 77 +++++++++++++++++++ .../evlinkov/threads/ThreadRhymes.java | 56 ++++++++++++++ .../threads/BlockingQueueModuleTest.java | 50 ++++++++++++ 5 files changed, 244 insertions(+) create mode 100644 evlinkov/pom.xml create mode 100644 evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueue.java create mode 100644 evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadMuster.java create mode 100644 evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadRhymes.java create mode 100644 evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueueModuleTest.java diff --git a/evlinkov/pom.xml b/evlinkov/pom.xml new file mode 100644 index 00000000..f570eefd --- /dev/null +++ b/evlinkov/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + ru.fizteh.fivt.students + parent + 1.0-SNAPSHOT + + ru.fizteh.fivt.students + spumote + 1.0-SNAPSHOT + evlinkov + http://maven.apache.org + + UTF-8 + + + + junit + junit + 3.8.1 + test + + + diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueue.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueue.java new file mode 100644 index 00000000..1726e38a --- /dev/null +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueue.java @@ -0,0 +1,35 @@ +package ru.fizteh.fivt.students.evlinkov.threads; + +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +class BlockingQueue { + private int maxQueueSize; + private Queue elements; + BlockingQueue(int maxSize) { + maxQueueSize = maxSize; + elements = new LinkedList<>(); + } + public synchronized void offer(List e) throws InterruptedException { + while (elements.size() + e.size() > maxQueueSize) { + wait(); + } + for (int i = 0; i < e.size(); ++i) { + elements.add(e.get(i)); + } + notifyAll(); + } + public synchronized List take(int n) throws InterruptedException { + while (elements.size() < n) { + wait(); + } + List answer; + answer = new LinkedList<>(); + for (int i = 0; i < n; ++i) { + answer.add(elements.remove()); + } + notifyAll(); + return answer; + } +} diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadMuster.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadMuster.java new file mode 100644 index 00000000..4eec3ece --- /dev/null +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadMuster.java @@ -0,0 +1,77 @@ +package ru.fizteh.fivt.students.evlinkov.threads; + +import java.util.Random; + +public class ThreadMuster { + public static class Runner { + private Random randNumber = new Random(); + private boolean ready = false; + private int printString = 1; + private int currentNumber = 0; + class AnswerQuestion extends Thread { + private volatile int numberOfThread; + AnswerQuestion(int number) { + numberOfThread = number + 1; + } + @Override + public void run() { + while (true) { + while (printString != numberOfThread) { + if (ready) { + return; + } + try { + Thread.sleep(100); + } catch (InterruptedException e) { } + } + int doit = randNumber.nextInt(10) + 1; + if (doit == 10) { + System.out.print("No\n"); + } else { + System.out.print("Yes\n"); + currentNumber++; + } + printString++; + } + } + } + void run(int n) { + System.out.print("Are you ready?\n"); + AnswerQuestion[] threads = new AnswerQuestion[n]; + for (int i = 0; i < n; ++i) { + threads[i] = new AnswerQuestion(i); + threads[i].start(); + } + while (true) { + if (printString == n + 1) { + if (currentNumber == n) { + ready = true; + break; + } else { + System.out.print("Are you ready?\n"); + currentNumber = 0; + printString = 1; + } + } else { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { } + } + } + for (int i = 0; i < n; ++i) { + try { + threads[i].join(); + } catch (InterruptedException e) { } + } + } + } + public static void main(String[] args) { + int n; + if (args.length > 0) { + n = Integer.parseInt(args[0]); + } else { + n = 0; + } + new Runner().run(n); + } +} diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadRhymes.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadRhymes.java new file mode 100644 index 00000000..a2494088 --- /dev/null +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadRhymes.java @@ -0,0 +1,56 @@ +package ru.fizteh.fivt.students.evlinkov.threads; + +public class ThreadRhymes { + + public static class Runner { + private int currentNumber = 1; + + class PutsThread extends Thread { + private volatile int numberOfThread; + + PutsThread(int number) { + numberOfThread = number + 1; + } + + @Override + public void run() { + while (true) { + while (currentNumber != numberOfThread) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { } + } + System.out.print("Thread-" + numberOfThread + "\n"); + currentNumber++; + } + } + } + + void run(int n) { + PutsThread[] threads = new PutsThread[n]; + for (int i = 0; i < n; ++i) { + threads[i] = new PutsThread(i); + threads[i].start(); + } + while (true) { + if (currentNumber == n + 1) { + currentNumber = 1; + } else { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { } + } + } + } + } + + public static void main(String[] args) { + int n; + if (args.length > 0) { + n = Integer.parseInt(args[0]); + } else { + n = 0; + } + new Runner().run(n); + } +} diff --git a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueueModuleTest.java b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueueModuleTest.java new file mode 100644 index 00000000..25178038 --- /dev/null +++ b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueueModuleTest.java @@ -0,0 +1,50 @@ +package ru.fizteh.fivt.students.evlinkov.threads; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +public class BlockingQueueModuleTest { + private static BlockingQueue queue = new BlockingQueue(10); + static class TestOffer implements Runnable { + private List elements = new LinkedList(); + TestOffer(int numberOfElements) { + for (int i = 0; i < numberOfElements; ++i) { + elements.add(i); + } + } + @Override + public void run() { + try { + queue.offer(elements); + System.out.print("Offer\n"); + } catch (InterruptedException e) { } + } + } + static class TestTake implements Runnable { + private List elements; + int numberOfElements; + TestTake (int number) { + numberOfElements = number; + } + @Override + public void run() { + try { + elements = queue.take(numberOfElements); + System.out.print("Take :"); + for (int i = 0; i < elements.size(); ++i) { + System.out.print(" " + elements.get(i)); + } + System.out.print("\n"); + } catch (InterruptedException e) { } + } + } + public static void main (String [] args) { + new Thread(new TestOffer(5)).start(); + new Thread(new TestOffer(3)).start(); + new Thread(new TestOffer(3)).start(); + new Thread(new TestTake(3)).start(); + new Thread(new TestTake(9)).start(); + new Thread(new TestOffer(2)).start(); + } +} From c211cf42291078d5f0a650e1c25dd7124cb0c4d6 Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Thu, 17 Dec 2015 01:14:45 +0300 Subject: [PATCH 02/16] task 5 --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index a2fdfbd2..50a58382 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,7 @@ preidman Jettriangle nmakeenkov + evlinkov oshch ladyae From d36909f0bd946a05b6a03f28ebcd2221fa052b04 Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Thu, 17 Dec 2015 01:21:51 +0300 Subject: [PATCH 03/16] 5th task --- evlinkov/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evlinkov/pom.xml b/evlinkov/pom.xml index f570eefd..f60273f2 100644 --- a/evlinkov/pom.xml +++ b/evlinkov/pom.xml @@ -8,7 +8,7 @@ 1.0-SNAPSHOT ru.fizteh.fivt.students - spumote + evlinkov 1.0-SNAPSHOT evlinkov http://maven.apache.org From 4d555cd1187a2ac6e5f7602017d342d8c69a00a3 Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Thu, 17 Dec 2015 01:30:36 +0300 Subject: [PATCH 04/16] 5th task --- .../evlinkov/threads/BlockingQueueModuleTest.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueueModuleTest.java b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueueModuleTest.java index 25178038..1af56428 100644 --- a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueueModuleTest.java +++ b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/threads/BlockingQueueModuleTest.java @@ -1,11 +1,10 @@ package ru.fizteh.fivt.students.evlinkov.threads; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class BlockingQueueModuleTest { - private static BlockingQueue queue = new BlockingQueue(10); + private static BlockingQueue queue = new BlockingQueue(10); static class TestOffer implements Runnable { private List elements = new LinkedList(); TestOffer(int numberOfElements) { @@ -23,8 +22,8 @@ public void run() { } static class TestTake implements Runnable { private List elements; - int numberOfElements; - TestTake (int number) { + private int numberOfElements; + TestTake(int number) { numberOfElements = number; } @Override @@ -39,7 +38,7 @@ public void run() { } catch (InterruptedException e) { } } } - public static void main (String [] args) { + public static void main(String[] args) { new Thread(new TestOffer(5)).start(); new Thread(new TestOffer(3)).start(); new Thread(new TestOffer(3)).start(); From bae041d0b005a38b79f36f3c541d867a8eb00527 Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Thu, 17 Dec 2015 01:39:10 +0300 Subject: [PATCH 05/16] 5th task --- .../fizteh/fivt/students/evlinkov/threads/ThreadRhymes.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadRhymes.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadRhymes.java index a2494088..7635de8b 100644 --- a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadRhymes.java +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/threads/ThreadRhymes.java @@ -1,17 +1,13 @@ package ru.fizteh.fivt.students.evlinkov.threads; public class ThreadRhymes { - public static class Runner { private int currentNumber = 1; - class PutsThread extends Thread { private volatile int numberOfThread; - PutsThread(int number) { numberOfThread = number + 1; } - @Override public void run() { while (true) { @@ -25,7 +21,6 @@ public void run() { } } } - void run(int n) { PutsThread[] threads = new PutsThread[n]; for (int i = 0; i < n; ++i) { @@ -43,7 +38,6 @@ void run(int n) { } } } - public static void main(String[] args) { int n; if (args.length > 0) { From b187909c63b42c05fb3b186ce6269a205172116a Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Fri, 18 Dec 2015 18:45:03 +0300 Subject: [PATCH 06/16] 1st_task --- evlinkov/pom.xml | 77 +++++++--- .../evlinkov/twitterstream/Location.java | 64 ++++++++ .../evlinkov/twitterstream/Parameters.java | 45 ++++++ .../students/evlinkov/twitterstream/Time.java | 37 +++++ .../evlinkov/twitterstream/TwitterStream.java | 139 ++++++++++++++++++ 5 files changed, 342 insertions(+), 20 deletions(-) create mode 100644 evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java create mode 100644 evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Parameters.java create mode 100644 evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Time.java create mode 100644 evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java diff --git a/evlinkov/pom.xml b/evlinkov/pom.xml index f60273f2..ce240d0d 100644 --- a/evlinkov/pom.xml +++ b/evlinkov/pom.xml @@ -1,26 +1,63 @@ - 4.0.0 - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + 4.0.0 + + ru.fizteh.fivt.students + parent + 1.0-SNAPSHOT + ru.fizteh.fivt.students - parent + evlinkov 1.0-SNAPSHOT - - ru.fizteh.fivt.students - evlinkov - 1.0-SNAPSHOT - evlinkov - http://maven.apache.org - - UTF-8 - - + http://maven.apache.org + + UTF-8 + + + + junit + junit + 3.8.1 + test + + + org.twitter4j + twitter4j-core + 4.0.4 + + + org.twitter4j + twitter4j-stream + 4.0.4 + + + com.beust + jcommander + 1.48 + + + com.google.maps + google-maps-services + 0.1.7 + + + + com.google.code.geocoder-java + geocoder-java + 0.16 + + + antlr + antlr + 2.7.7 + + + - junit - junit - 3.8.1 - test + org.json + json + 20151123 - - + + \ No newline at end of file diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java new file mode 100644 index 00000000..5d31e61d --- /dev/null +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java @@ -0,0 +1,64 @@ +package ru.fizteh.fivt.students.evlinkov.twitterstream; +/** + * Created by evlinkov on 17.12.15. + */ +import com.google.maps.model.GeocodingResult; +import com.google.maps.GeoApiContext; +import com.google.maps.GeocodingApi; +import com.google.maps.model.Bounds; +import com.google.maps.model.LatLng; + +import java.io.FileNotFoundException; +import java.io.FileInputStream; +import static java.lang.Math.*; +import java.util.Properties; +import java.io.IOException; +import java.io.InputStream; + +public class Location { + private static final double RADIUS_OF_THE_EARTH = 6371; + private GeocodingResult result; + private double radius; + GoogleLocation(String place) throws Exception { + if (!place.equals("nearby")) { + String apiKey = getKeyFromProperties(); + GeoApiContext context = new GeoApiContext().setApiKey(apiKey); + result = GeocodingApi.geocode(context, place).await()[0]; + radius = calculateRadius(); + } + } + private String getKeyFromProperties() throws IOException { + Properties property = new Properties(); + try (InputStream input = new FileInputStream("twitter4j.properties")) { + property.load(input); + } catch (FileNotFoundException e) { + System.err.println("Not found the file : " + e.getMessage()); + throw e; + } catch (IOException e) { + System.err.println("Not read the file : " + e.getMessage()); + throw e; + } + return property.getProperty("googleApiKey"); + } + public LatLng getLocation() { + return result.geometry.location; + } + public double getRadius() { + return radius; + } + private double calculateRadius() { + LatLng pointerFirst = geocodingResults.geometry.bounds.northeast; + LatLng pointerSecond = geocodingResults.geometry.bounds.southwest; + double rad = 180.0 / PI; + double x = cos(pointerFirst.lat / rad) * cos(pointerFirst.lng / rad) * cos(pointerSecond.lat / rad) + * cos(pointerSecond.lng / rad); + double y = cos(pointerFirst.lat / rad) * sin(pointerFirst.lng / rad) * cos(pointerSecond.lat / rad) + * sin(pointerSecond.lng / rad); + double z = sin(pointerFirst.lat / rad) * sin(pointerSecond.lat / rad); + + return RADIUS_OF_THE_EARTH * acos(x + y + z); + } + public final Bounds getBounds() { + return result.geometry.bounds; + } +} diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Parameters.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Parameters.java new file mode 100644 index 00000000..a225bbe4 --- /dev/null +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Parameters.java @@ -0,0 +1,45 @@ +package ru.fizteh.fivt.students.evlinkov.twitterstream; +/** + * Created by evlinkov on 17.12.15. + */ +import com.beust.jcommander.Parameter; + +public class Parameters { + static final int USUAL_TWEETS_LIMIT = 555; + @Parameter(names = {"--query", "-q"}, + description = "Search query") + private String query = ""; + @Parameter(names = {"--place", "-p"}, + description = "Search place") + private String place = ""; + @Parameter(names = {"--stream", "-s"}, + description = "Stream mode") + private boolean stream = false; + @Parameter(names = {"--hideRetweets"}, + description = "Hide retweets") + private boolean hideRetweets = false; + @Parameter(names = {"--limit", "-l"}, + description = "Limit tweets") + private int limitTweets = USUAL_TWEETS_LIMIT; + @Parameter(names = {"--help", "-h"}, + description = "Help mode") + private boolean helpMode = false; + public String getQuery() { + return query; + } + public String getPlace() { + return place; + } + public boolean checkStream() { + return stream; + } + public boolean checkHideRetweets() { + return hideRetweets; + } + public int getLimitTweets() { + return limitTweets; + } + public boolean checkHelpMode() { + return helpMode; + } +} diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Time.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Time.java new file mode 100644 index 00000000..ea5865fc --- /dev/null +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Time.java @@ -0,0 +1,37 @@ +package ru.fizteh.fivt.students.evlinkov.twitterstream; +/** + * Created by evlinkov on 17.12.15. + */ +import java.time.temporal.ChronoUnit; +import java.time.ZoneId; +import java.util.Date; +import java.time.*; + +public class Time { + public static String printTime(long tweetTime, long currentTime) { + LocalDateTime currentTimer = new Date(currentTime).toInstant() + .atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime tweetTimer = new Date(tweetTime).toInstant() + .atZone(ZoneId.systemDefault()).toLocalDateTime(); + if (tweetTimer.isAfter(currentTimer.minusMinutes(2))) { + return "Только что"; + } else { + if (tweetTimer.isAfter(currentTimer.minusHours(1))) { + return new StringBuilder().append(ChronoUnit.MINUTES.between(tweetTimer, currentTimer)) + .append(" минут назад").toString(); + } else { + if (currentTimer.toLocalDate().isEqual(tweetTimer.toLocalDate())) { + return new StringBuilder().append(ChronoUnit.HOURS.between(tweetTimer, currentTimer)) + .append(" часов назад").toString(); + } else { + if (tweetTimer.toLocalDate().isEqual(currentTimer.minusDays(1).toLocalDate())) { + return "вчера"; + } else { + return new StringBuilder().append(ChronoUnit.DAYS.between(tweetTimer, currentTimer)) + .append(" дней назад").toString(); + } + } + } + } + } +} diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java new file mode 100644 index 00000000..aa37ab2a --- /dev/null +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java @@ -0,0 +1,139 @@ +package ru.fizteh.fivt.students.evlinkov.twitterstream; +/** + * Created by evlinkov on 17.12.15. + */ +import com.beust.jcommander.JCommander; +import twitter4j.*; + +import java.util.List; + +public class TwitterStream { + public static final long PAUSE = 1000; + public static void main(String[] args) throws Exception { + Parameters parameters = new Parameters(); + JCommander jCommander; + try { + jCommander = new JCommander(parameters, args); + } catch (Exception ex) { + jCommander = new JCommander(parameters, new String[] {"-h"}); //ok, if args is wrong, let's show HelpMode + jCommander.usage(); + return; + } + if (parameters.checkHelpMode()) { + jCommander.usage(); + return; + } + if (parameters.checkStream()) { + streamPrint(parameters); + } else { + print(parameters); + } + } + public static void printTime(Status status) { + Time printer = new Time(); + System.out.print(new StringBuilder().append("[") + .append(printer.printTime(status.getCreatedAt().getTime(), System.currentTimeMillis())).append("]")); + } + public static void printRetweetsCount(Status status) { + System.out.println(new StringBuilder().append("(").append(status.getRetweetCount()) + .append(" ретвитов)").toString()); + } + public static void printTweet(Status status) { + System.out.print(new StringBuilder().append("@").append(status.getUser().getName()).append(": ") + .append(status.getText())); + } + public static void printRetweet(Status status) { + System.out.println(new StringBuilder().append("@").append(status.getUser().getName()) + .append(" ретвитнул: @").append(status.getRetweetedStatus().getUser().getName()).append(": ") + .append(status.getRetweetedStatus().getText()).toString()); + System.out.println(); + } + public static void print(Parameters parameters) { + Twitter twitter = new TwitterFactory().getInstance(); + try { + Query query = new Query(parameters.getQuery()); + if (!parameters.getPlace().equals("")) { + if (!parameters.getPlace().equals("nearby")) { + GoogleLocation googleFindPlace; + googleFindPlace = new GoogleLocation(parameters.getPlace()); + GeoLocation geoLocation; + geoLocation = new GeoLocation(googleFindPlace.getLocation().lat, googleFindPlace.getLocation().lng); + query.setGeoCode(geoLocation, googleFindPlace.getRadius(), Query.KILOMETERS); + } + } + query.setCount(parameters.getLimit()); + QueryResult answer; + answer = twitter.search(query); + List tweets = answer.getTweets(); + if (tweets.isEmpty()) { + System.out.println("Nothing find"); + return; + } + for (Status tweet : tweets) { + Thread.sleep(PAUSE); + if (!tweet.isRetweet()) { + printTime(tweet); + printTweet(tweet); + printRetweetsCount(tweet); + System.out.println(); + } else { + if (!parameters.checkHideRetweets()) { + printTime(tweet); + printRetweet(tweet); + } + } + } + } catch (TwitterException te) { + te.printStackTrace(); + System.err.println("Failed to search tweets: " + te.getMessage()); + System.exit(1); + } catch (InterruptedException e) { + e.printStackTrace(); + System.err.println(e.getMessage()); + System.exit(1); + } catch (Exception e) { + e.printStackTrace(); + } + } + public static void streamPrint(Parameters parameters) throws Exception { + twitter4j.TwitterStream twitterStream; + twitterStream = new TwitterStreamFactory().getInstance(); + StatusAdapter listener = new StatusAdapter() { + @Override + public void onStatus(Status status) { + try { + Thread.sleep(PAUSE); + } catch (InterruptedException e) { + System.out.print(e.getMessage()); + } + if (!status.isRetweet()) { + printTweet(status); + System.out.println(); + } else { + if (!parameters.checkHideRetweets()) { + printRetweet(status); + } + } + } + }; + twitterStream.addListener(listener); + if (parameters.getQuery() == "" && parameters.getPlace() == "") { + twitterStream.sample(); + } else { + FilterQuery filter; + String[] track = new String[1]; + track[0] = parameters.getQuery(); + filter = new FilterQuery(0, new long[0], track); + if (!parameters.getPlace().equals("")) { + GoogleGeoLocation findPlace; + findPlace = new GoogleGeoLocation((parameters.getPlace())); + double[][] bounds = {{findPlace.getBounds().southwest.lng, + findPlace.getBounds().southwest.lat}, + {findPlace.getBounds().northeast.lng, + findPlace.getBounds().northeast.lat}}; + filter.locations(bounds); + } + twitterStream.filter(filter); + } + } +} From 79a34d4b11d77c15c6491d8cbbde535d6397c46d Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Fri, 18 Dec 2015 18:55:18 +0300 Subject: [PATCH 07/16] 1st_task --- evlinkov/pom.xml | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/evlinkov/pom.xml b/evlinkov/pom.xml index ce240d0d..a8979a54 100644 --- a/evlinkov/pom.xml +++ b/evlinkov/pom.xml @@ -15,33 +15,24 @@ UTF-8 - - junit - junit - 3.8.1 - test - - - org.twitter4j - twitter4j-core - 4.0.4 - org.twitter4j twitter4j-stream 4.0.4 + com.beust jcommander 1.48 + com.google.maps google-maps-services 0.1.7 - + com.google.code.geocoder-java geocoder-java @@ -53,11 +44,10 @@ 2.7.7 - + org.json json 20151123 - - \ No newline at end of file + \ No newline at end of file From b03cdc0637b7e3d8655c63a5b0c6911eb8bb255d Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Fri, 18 Dec 2015 19:04:59 +0300 Subject: [PATCH 08/16] 1st_task --- evlinkov/pom.xml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/evlinkov/pom.xml b/evlinkov/pom.xml index a8979a54..9d61b0ea 100644 --- a/evlinkov/pom.xml +++ b/evlinkov/pom.xml @@ -43,11 +43,10 @@ antlr 2.7.7 + + org.json + json + 20151123 + - - - org.json - json - 20151123 - \ No newline at end of file From 9323db1c7e50f5540d90ab551f4c0a483014319f Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Fri, 18 Dec 2015 19:12:02 +0300 Subject: [PATCH 09/16] 1st_task --- .../fivt/students/evlinkov/twitterstream/Location.java | 2 +- .../students/evlinkov/twitterstream/TwitterStream.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java index 5d31e61d..f9f735b6 100644 --- a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java @@ -19,7 +19,7 @@ public class Location { private static final double RADIUS_OF_THE_EARTH = 6371; private GeocodingResult result; private double radius; - GoogleLocation(String place) throws Exception { + Location(String place) throws Exception { if (!place.equals("nearby")) { String apiKey = getKeyFromProperties(); GeoApiContext context = new GeoApiContext().setApiKey(apiKey); diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java index aa37ab2a..54b3832d 100644 --- a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java @@ -54,8 +54,8 @@ public static void print(Parameters parameters) { Query query = new Query(parameters.getQuery()); if (!parameters.getPlace().equals("")) { if (!parameters.getPlace().equals("nearby")) { - GoogleLocation googleFindPlace; - googleFindPlace = new GoogleLocation(parameters.getPlace()); + Location googleFindPlace; + googleFindPlace = new Location(parameters.getPlace()); GeoLocation geoLocation; geoLocation = new GeoLocation(googleFindPlace.getLocation().lat, googleFindPlace.getLocation().lng); query.setGeoCode(geoLocation, googleFindPlace.getRadius(), Query.KILOMETERS); @@ -125,8 +125,8 @@ public void onStatus(Status status) { track[0] = parameters.getQuery(); filter = new FilterQuery(0, new long[0], track); if (!parameters.getPlace().equals("")) { - GoogleGeoLocation findPlace; - findPlace = new GoogleGeoLocation((parameters.getPlace())); + Location findPlace; + findPlace = new Location((parameters.getPlace())); double[][] bounds = {{findPlace.getBounds().southwest.lng, findPlace.getBounds().southwest.lat}, {findPlace.getBounds().northeast.lng, From f325efe9c2010dbdf3dbe313c964ec45c2254ace Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Fri, 18 Dec 2015 19:18:04 +0300 Subject: [PATCH 10/16] 1st_task --- .../fizteh/fivt/students/evlinkov/twitterstream/Location.java | 4 ++-- .../fivt/students/evlinkov/twitterstream/TwitterStream.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java index f9f735b6..a4e02ffd 100644 --- a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/Location.java @@ -47,8 +47,8 @@ public double getRadius() { return radius; } private double calculateRadius() { - LatLng pointerFirst = geocodingResults.geometry.bounds.northeast; - LatLng pointerSecond = geocodingResults.geometry.bounds.southwest; + LatLng pointerFirst = result.geometry.bounds.northeast; + LatLng pointerSecond = result.geometry.bounds.southwest; double rad = 180.0 / PI; double x = cos(pointerFirst.lat / rad) * cos(pointerFirst.lng / rad) * cos(pointerSecond.lat / rad) * cos(pointerSecond.lng / rad); diff --git a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java index 54b3832d..5ce6883d 100644 --- a/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java +++ b/evlinkov/src/main/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TwitterStream.java @@ -61,7 +61,7 @@ public static void print(Parameters parameters) { query.setGeoCode(geoLocation, googleFindPlace.getRadius(), Query.KILOMETERS); } } - query.setCount(parameters.getLimit()); + query.setCount(parameters.getLimitTweets()); QueryResult answer; answer = twitter.search(query); List tweets = answer.getTweets(); From 3fd60ddb0c8583a9aaed05f8c661c028399840fc Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Sat, 19 Dec 2015 03:43:39 +0300 Subject: [PATCH 11/16] module --- evlinkov/pom.xml | 7 +++ .../java/ru/fizteh/fivt/students/AppTest.java | 38 ++++++++++++++ .../evlinkov/twitterstream/TestLocation.java | 19 +++++++ .../twitterstream/TestParameters.java | 52 +++++++++++++++++++ .../evlinkov/twitterstream/TestTime.java | 39 ++++++++++++++ 5 files changed, 155 insertions(+) create mode 100644 evlinkov/src/test/java/ru/fizteh/fivt/students/AppTest.java create mode 100644 evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java create mode 100644 evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestParameters.java create mode 100644 evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestTime.java diff --git a/evlinkov/pom.xml b/evlinkov/pom.xml index 9d61b0ea..82dffe2f 100644 --- a/evlinkov/pom.xml +++ b/evlinkov/pom.xml @@ -48,5 +48,12 @@ json 20151123 + + junit + junit + 3.8.1 + 4.12 + test + \ No newline at end of file diff --git a/evlinkov/src/test/java/ru/fizteh/fivt/students/AppTest.java b/evlinkov/src/test/java/ru/fizteh/fivt/students/AppTest.java new file mode 100644 index 00000000..a5e295f7 --- /dev/null +++ b/evlinkov/src/test/java/ru/fizteh/fivt/students/AppTest.java @@ -0,0 +1,38 @@ +package ru.fizteh.fivt.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 ); + } +} \ No newline at end of file diff --git a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java new file mode 100644 index 00000000..0b680ffd --- /dev/null +++ b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java @@ -0,0 +1,19 @@ +package ru.fizteh.fivt.students.evlinkov.twitterstream; +/** + * Created by evlinkov on 17.12.15. + */ +import com.google.maps.model.LatLng; + +import org.junit.Assert; +import org.junit.Test; + +public class TestLocation { + @Test + public void test() { + String place = "Volgograd"; + LatLng realLocation, programLocation; + LatLng realLocation = new LatLng(48.7193900, 44.5018400); + programLocation = new Location(place).getLocation(); + Assert.assertEquals(realLocation, programLocation); + } +} diff --git a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestParameters.java b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestParameters.java new file mode 100644 index 00000000..9b6b53e4 --- /dev/null +++ b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestParameters.java @@ -0,0 +1,52 @@ +package ru.fizteh.fivt.students.evlinkov.twitterstream; +/** + * Created by evlinkov on 17.12.15. + */ +import com.beust.JCommander.Parameter; +import org.junit.Assert; +import org.junit.Test; + +public class TestParameters { + @Test + public void testHelp() { + Parameters commandLine = new Parameters(); + new JCommander(commandLine, new String[]{"-h"}); + Assert.assertEquals(true, commandLine.checkHelpMode()); + } + @Test + public void testStream() { + Parameters commandLine = new Parameters(); + new JCommander(commandLine, new String[]{"--stream"}); + Assert.assertEquals(true, commandLine.checkStream()); + Assert.assertEquals(false, commandLine.checkHideRetweets()); + } + @Test + public void testPlace() { + Parameters commandLine = new Parameters(); + new JCommander(commandLine, new String[]{"--place", "Volgograd"}); + Assert.assertEquals("Volgograd", commandLine.getPlace()); + Assert.assertEquals(555, commandLine.getLimitTweets()); + } + @Test + public void testQuery() { + Parameters commandLine = new Parameters(); + new JCommander(commandLine, new String[]{"--query", "Luntiki", "--help"}); + Assert.assertEquals("Luntiki", commandLine.getQuery()); + Assert.assertEquals(true, commandLine.checkHelpMode()); + Assert.assertEquals("", commandLine.getPlace()); + } + @Test + public void testHideRetweets() { + Parameters commandLine = new Parameters(); + new JCommander(commandLine, new String[]{"--hideRetweets"}); + Assert.assertEquals("", commandLine.getQuery()); + Assert.assertEquals(true, commandLine.checkHideRetweets()); + } + @Test + public void testLimitTweets() { + Parameters commandLine = new Parameters(); + new JCommander(commandLine, new String[]{"--limit", "230"}); + Assert.assertEquals(false, commandLine.checkHelpMode()); + Assert.assertEquals(230, commandLine.getLimitTweets()); + } +} diff --git a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestTime.java b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestTime.java new file mode 100644 index 00000000..972e8c16 --- /dev/null +++ b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestTime.java @@ -0,0 +1,39 @@ +package ru.fizteh.fivt.students.evlinkov.twitterstream; +/** + * Created by evlinkov on 17.12.15. + */ +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.Month; + +import org.junit.Assert; +import org.junit.Test; + +public class TestTime { + @Test + public void test() { + long start = LocalDate.of(2015, Month.JANUARY, 1) + .atTime(0, 0, 0) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + long finish = LocalDate.of(2015, Month.JANUARY, 1) + .atTime(0, 0, 1) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + Assert.assertEquals("Только что", Time.printTime(start, finish)); + finish = LocalDate.of(2015, Month.JANUARY, 1) + .atTime(0, 15, 0) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + Assert.assertEquals("15 минут назад", Time.printTime(start, finish)); + finish = LocalDate.of(2015, Month.JANUARY, 1) + .atTime(5, 0, 0) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + Assert.assertEquals("5 часов назад", Time.printTime(start, finish)); + finish = LocalDate.of(2015, Month.JANUARY, 2) + .atTime(0, 1, 0) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + Assert.assertEquals("вчера", Time.printTime(start, finish)); + finish = LocalDate.of(2015, Month.JANUARY, 4) + .atTime(3, 20, 0) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + Assert.assertEquals("3 дней назад", Time.printTime(start, finish)); + } +} From 119933220c1d56f217b2f71d0449533bc5875a94 Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Sat, 19 Dec 2015 03:57:11 +0300 Subject: [PATCH 12/16] module --- evlinkov/pom.xml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/evlinkov/pom.xml b/evlinkov/pom.xml index 82dffe2f..7de2e873 100644 --- a/evlinkov/pom.xml +++ b/evlinkov/pom.xml @@ -49,11 +49,10 @@ 20151123 - junit - junit - 3.8.1 - 4.12 - test - + junit + junit + 4.12 + test + \ No newline at end of file From 1554fd605acc9e318312b14fc38794adb83f2627 Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Sat, 19 Dec 2015 04:10:30 +0300 Subject: [PATCH 13/16] module --- .../fivt/students/evlinkov/twitterstream/TestLocation.java | 3 +-- .../fivt/students/evlinkov/twitterstream/TestParameters.java | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java index 0b680ffd..f1dd25b2 100644 --- a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java +++ b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java @@ -11,9 +11,8 @@ public class TestLocation { @Test public void test() { String place = "Volgograd"; - LatLng realLocation, programLocation; LatLng realLocation = new LatLng(48.7193900, 44.5018400); - programLocation = new Location(place).getLocation(); + LatLng programLocation = new Location(place).getLocation(); Assert.assertEquals(realLocation, programLocation); } } diff --git a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestParameters.java b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestParameters.java index 9b6b53e4..e39da03e 100644 --- a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestParameters.java +++ b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestParameters.java @@ -2,7 +2,8 @@ /** * Created by evlinkov on 17.12.15. */ -import com.beust.JCommander.Parameter; +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; import org.junit.Assert; import org.junit.Test; From 3b3d0bb9f1d54e07707060532d9b5c19a2deadfd Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Sat, 19 Dec 2015 04:16:54 +0300 Subject: [PATCH 14/16] module --- .../fivt/students/evlinkov/twitterstream/TestLocation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java index f1dd25b2..806b9a3f 100644 --- a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java +++ b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java @@ -12,7 +12,7 @@ public class TestLocation { public void test() { String place = "Volgograd"; LatLng realLocation = new LatLng(48.7193900, 44.5018400); - LatLng programLocation = new Location(place).getLocation(); + LatLng programLocation = Location(place).getLocation(); Assert.assertEquals(realLocation, programLocation); } } From a943a4192a0d22614ba03c1ae198eeee0c1fbedc Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Sat, 19 Dec 2015 04:29:47 +0300 Subject: [PATCH 15/16] module --- .../fivt/students/evlinkov/twitterstream/TestLocation.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java index 806b9a3f..61389678 100644 --- a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java +++ b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java @@ -12,7 +12,9 @@ public class TestLocation { public void test() { String place = "Volgograd"; LatLng realLocation = new LatLng(48.7193900, 44.5018400); - LatLng programLocation = Location(place).getLocation(); + Location findPlace; + findPlace = new Location(place); + LatLng programLocation = findPlace.getLocation(); Assert.assertEquals(realLocation, programLocation); } } From eb64543203b00658fc6123c9f0cc112ce0749a83 Mon Sep 17 00:00:00 2001 From: Linkov Zhenya Date: Sat, 19 Dec 2015 04:34:54 +0300 Subject: [PATCH 16/16] try --- .../evlinkov/twitterstream/TestLocation.java | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java diff --git a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java b/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java deleted file mode 100644 index 61389678..00000000 --- a/evlinkov/src/test/java/ru/fizteh/fivt/students/evlinkov/twitterstream/TestLocation.java +++ /dev/null @@ -1,20 +0,0 @@ -package ru.fizteh.fivt.students.evlinkov.twitterstream; -/** - * Created by evlinkov on 17.12.15. - */ -import com.google.maps.model.LatLng; - -import org.junit.Assert; -import org.junit.Test; - -public class TestLocation { - @Test - public void test() { - String place = "Volgograd"; - LatLng realLocation = new LatLng(48.7193900, 44.5018400); - Location findPlace; - findPlace = new Location(place); - LatLng programLocation = findPlace.getLocation(); - Assert.assertEquals(realLocation, programLocation); - } -}