From c006e9d412eb8d71c47d25af12c505beeac9168a Mon Sep 17 00:00:00 2001 From: Maxim Grishkin Date: Sat, 19 Dec 2015 00:34:22 +0300 Subject: [PATCH 1/7] 01-TwitterStream, no word endings --- .gitignore | 2 + pom.xml | 6 +- riskingh/pom.xml | 46 +++++++++++++ .../riskingh/TwitterStream/GeoUtils.java | 32 +++++++++ .../riskingh/TwitterStream/JSONReader.java | 36 ++++++++++ .../riskingh/TwitterStream/Settings.java | 54 +++++++++++++++ .../riskingh/TwitterStream/StatusPrinter.java | 66 +++++++++++++++++++ .../riskingh/TwitterStream/TimeUtils.java | 46 +++++++++++++ .../riskingh/TwitterStream/TwitterStream.java | 41 ++++++++++++ 9 files changed, 327 insertions(+), 2 deletions(-) create mode 100644 riskingh/pom.xml create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/JSONReader.java create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/Settings.java create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java diff --git a/.gitignore b/.gitignore index 216927c6..fec2ba57 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ workbench.xmi .settings .checkstyle twitter4j.properties +riskingh/twitter4j.properties +riskingh/src/main/resources/googleMaps.properties diff --git a/pom.xml b/pom.xml index a2fdfbd2..4d20ad6f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,5 @@ - + + 4.0.0 ru.fizteh.fivt.students @@ -20,6 +20,7 @@ + riskingh egiby akormushin @@ -46,6 +47,7 @@ ladyae nikitarykov duha666 + riskingh diff --git a/riskingh/pom.xml b/riskingh/pom.xml new file mode 100644 index 00000000..27cf292b --- /dev/null +++ b/riskingh/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + ru.fizteh.fivt.students + parent + 1.0-SNAPSHOT + + ru.fizteh.fivt.students + riskingh + 1.0-SNAPSHOT + riskingh + http://maven.apache.org + + UTF-8 + + + + junit + junit + 3.8.1 + test + + + org.twitter4j + twitter4j-core + [4.0,) + + + org.twitter4j + twitter4j-stream + 4.0.4 + + + com.beust + jcommander + 1.48 + + + org.json + json + 20151123 + + + diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java new file mode 100644 index 00000000..36824bec --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java @@ -0,0 +1,32 @@ +package ru.fizteh.fivt.students.riskingh.TwitterStream; + +/** + * Created by max on 18/12/15. + */ + +import twitter4j.*; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.Properties; + +public class GeoUtils { + public static GeoLocation getLocationByPlace(String placeString) throws IOException, + URISyntaxException, org.json.JSONException { + Properties properties = new Properties(); + try (InputStream inputStream = GeoLocation.class.getResourceAsStream("/googleMaps.properties")) { + properties.load(inputStream); + } + String googleMapsKey = properties.getProperty("google"); + String urlString = "https://maps.googleapis.com/maps/api/geocode/json?key=" + + googleMapsKey + "&address=" + URLEncoder.encode(placeString, "UTF-8"); + URL url = new URL(urlString); + org.json.JSONObject jsonObject = JSONReader.readJSONFromUrl(url.toString()); + jsonObject = jsonObject.getJSONArray("results").getJSONObject(0) + .getJSONObject("geometry").getJSONObject("location"); + return new GeoLocation(jsonObject.getDouble("lat"), jsonObject.getDouble("lng")); + } +} \ No newline at end of file diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/JSONReader.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/JSONReader.java new file mode 100644 index 00000000..c4601314 --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/JSONReader.java @@ -0,0 +1,36 @@ +package ru.fizteh.fivt.students.riskingh.TwitterStream; + +/** + * Created by max on 18/12/15. + */ + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; +import java.nio.charset.Charset; + +import org.json.JSONException; +import org.json.JSONObject; + +public class JSONReader { + + private static String readAll(Reader rd) throws IOException { + StringBuilder sb = new StringBuilder(); + int cp; + while ((cp = rd.read()) != -1) { + sb.append((char) cp); + } + return sb.toString(); + } + + public static JSONObject readJSONFromUrl(String url) throws IOException, JSONException { + try (InputStream is = new URL(url).openStream()) { + BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); + String jsonText = readAll(rd); + return new JSONObject(jsonText); + } + } +} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/Settings.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/Settings.java new file mode 100644 index 00000000..ba9aad0e --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/Settings.java @@ -0,0 +1,54 @@ +package ru.fizteh.fivt.students.riskingh.TwitterStream; + +/** + * Created by max on 18/12/15. + */ +import com.beust.jcommander.*; + +public class Settings { + + private static final int DEFAULT_TWEET_LIMIT = 10; + + @Parameter(names = {"-q", "--query"}, description = "Query or keywords for stream") + private String query = ""; + + @Parameter(names = {"-p", "--place"}, description = "Location") + private String place = "nearby"; + + @Parameter(names = {"-s", "--stream"}, description = "Stream") + private boolean stream = false; + + @Parameter(names = {"--hideRetweets"}, description = "Hide retweets") + private boolean hideRetweets = false; + + @Parameter(names = {"-l", "--limit"}, description = "Tweets limit") + private Integer limit = DEFAULT_TWEET_LIMIT; + + @Parameter(names = {"-h", "--help"}, description = "Show this help") + private boolean printHelp = false; + + public String getQuery() { + return query; + } + + public String getPlace() { + return place; + } + + public boolean stream() { + return stream; + } + + public boolean hideRetweets() { + return hideRetweets; + } + + public Integer getLimitNumber() { + return limit; + } + + public boolean printHelp() { + return printHelp; + } +} + diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java new file mode 100644 index 00000000..622f63d3 --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java @@ -0,0 +1,66 @@ +package ru.fizteh.fivt.students.riskingh.TwitterStream; + +/** + * Created by max on 18/12/15. + */ + +import twitter4j.*; +import twitter4j.TwitterStream; + +import java.util.List; + +public class StatusPrinter { + public static final int SEARCH_DISTANCE_IN_KM = 5; + public static final int MILLISECONDS_IN_SECOND = 1000; + + private static void printTweet(Status tweet) { + System.out.print("[" + TimeUtils.formatTime(tweet.getCreatedAt()) + "]"); + System.out.print("@" + tweet.getUser().getScreenName() + ": "); + if (tweet.isRetweet()) { + System.out.print("ретвитнул "); + System.out.print(tweet.getRetweetedStatus().getUser().getScreenName() + ":"); + System.out.print(tweet.getRetweetedStatus().getText()); + } else { + System.out.print(tweet.getText()); + int retweetsCount = tweet.getRetweetCount(); + if (retweetsCount > 0) { + System.out.print("(" + retweetsCount + " ретвитов)"); + } + } + System.out.println(); + } + + public static void print(Settings settings, GeoLocation location) throws TwitterException { + Twitter twitter = new TwitterFactory().getInstance(); + Query query = new Query(settings.getQuery()).geoCode(location, SEARCH_DISTANCE_IN_KM, "km"); + query.setCount(settings.getLimitNumber()); + QueryResult queryResult = twitter.search(query); + List statuses = queryResult.getTweets(); + statuses.stream(). + filter(status -> !settings.hideRetweets() || !status.isRetweet()). + forEach(ru.fizteh.fivt.students.riskingh.TwitterStream.StatusPrinter::printTweet); + } + + public static void stream(Settings settings, GeoLocation location) throws TwitterException { + TwitterStream twitterStream = new TwitterStreamFactory().getInstance(); + twitterStream.addListener(new StatusAdapter() { + @Override + public void onStatus(Status status) { + if (settings.hideRetweets() && status.isRetweet()) { + return; + } + printTweet(status); + try { + Thread.sleep(MILLISECONDS_IN_SECOND); + } catch (Exception e) { + System.err.print("ERROR!"); + } + } + }); + FilterQuery filterQuery = new FilterQuery(); + double[][] locations = {{location.getLongitude() - SEARCH_DISTANCE_IN_KM, location.getLatitude() - SEARCH_DISTANCE_IN_KM}, + {location.getLongitude() + SEARCH_DISTANCE_IN_KM, location.getLatitude() + SEARCH_DISTANCE_IN_KM}}; + filterQuery.track(settings.getQuery()).locations(locations); + twitterStream.filter(filterQuery); + } +} \ No newline at end of file diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java new file mode 100644 index 00000000..ee7b4efe --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java @@ -0,0 +1,46 @@ +package ru.fizteh.fivt.students.riskingh.TwitterStream; + +/** + * Created by max on 18/12/15. + */ + +import java.util.Calendar; +import java.util.Date; +import java.util.concurrent.TimeUnit; + +public class TimeUtils { + public static String formatTime(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + Calendar today = Calendar.getInstance(); + + Calendar yesterday = Calendar.getInstance(); + yesterday.add(Calendar.DAY_OF_YEAR, -1); + + Date current = new Date(); + long difference = current.getTime() - date.getTime(); + + long differenceInMinutes = TimeUnit.MILLISECONDS.toMinutes(difference); + long differenceInHours = TimeUnit.MILLISECONDS.toHours(difference); + long differenceInDays = TimeUnit.MILLISECONDS.toDays(difference); + + if (differenceInMinutes < 2) { + return "только что"; + } + else if (differenceInHours < 1) { + return Long.toString(differenceInMinutes) + " минут назад"; + } + else if (calendar.get(Calendar.YEAR) == today.get(Calendar.YEAR) && + calendar.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR)) { + return Long.toString(differenceInHours) + " часов назад"; + } + else if (calendar.get(Calendar.YEAR) == yesterday.get(Calendar.YEAR) && + calendar.get(Calendar.DAY_OF_YEAR) == yesterday.get(Calendar.DAY_OF_YEAR)) { + return "вчера"; + } + else { + return Long.toString(differenceInDays) + " дней назад"; + } + } +} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java new file mode 100644 index 00000000..e4e8b757 --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java @@ -0,0 +1,41 @@ +package ru.fizteh.fivt.students.riskingh.TwitterStream; + +/** + * Created by max on 18/12/15. + */ + +import com.beust.jcommander.JCommander; +import twitter4j.GeoLocation; +import twitter4j.TwitterException; + +public class TwitterStream { + public static void main(String[] args) throws TwitterException { + Settings settings = new Settings(); + try { + JCommander jcommander = new JCommander(settings, args); + if (settings.printHelp()) { + jcommander.usage(); + return; + } + } + catch (Exception e) { + JCommander jcommander = new JCommander(settings); + jcommander.usage(); + return; + } + + System.out.print("Твиты по запросу " + settings.getQuery() + " для " + settings.getPlace() + ":"); + System.out.println(); + try { + GeoLocation location = GeoUtils.getLocationByPlace(settings.getPlace()); + if (settings.stream()) { + StatusPrinter.stream(settings, location); + } else { + StatusPrinter.print(settings, location); + } + } catch (Exception e) { + System.err.print("ERROR: " + e.toString()); + e.printStackTrace(); + } + } +} \ No newline at end of file From 44e4c53291defa53323d6fcb9ec27408ac3e64f3 Mon Sep 17 00:00:00 2001 From: Maxim Grishkin Date: Sat, 19 Dec 2015 00:40:00 +0300 Subject: [PATCH 2/7] pom.xml fix --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4d20ad6f..d48c78d8 100644 --- a/pom.xml +++ b/pom.xml @@ -19,8 +19,7 @@ UTF-8 - - riskingh + egiby akormushin From b952f95c0e280a0cea6bc5c6ee6c537f93bc5dd8 Mon Sep 17 00:00:00 2001 From: Maxim Grishkin Date: Sat, 19 Dec 2015 00:46:13 +0300 Subject: [PATCH 3/7] style fix --- .../riskingh/TwitterStream/GeoUtils.java | 2 +- .../riskingh/TwitterStream/StatusPrinter.java | 8 +++++--- .../riskingh/TwitterStream/TimeUtils.java | 16 ++++++---------- .../riskingh/TwitterStream/TwitterStream.java | 5 ++--- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java index 36824bec..5a0cf979 100644 --- a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java @@ -29,4 +29,4 @@ public static GeoLocation getLocationByPlace(String placeString) throws IOExcept .getJSONObject("geometry").getJSONObject("location"); return new GeoLocation(jsonObject.getDouble("lat"), jsonObject.getDouble("lng")); } -} \ No newline at end of file +} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java index 622f63d3..d0f8489b 100644 --- a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java @@ -58,9 +58,11 @@ public void onStatus(Status status) { } }); FilterQuery filterQuery = new FilterQuery(); - double[][] locations = {{location.getLongitude() - SEARCH_DISTANCE_IN_KM, location.getLatitude() - SEARCH_DISTANCE_IN_KM}, - {location.getLongitude() + SEARCH_DISTANCE_IN_KM, location.getLatitude() + SEARCH_DISTANCE_IN_KM}}; + double[][] locations = { + {location.getLongitude() - SEARCH_DISTANCE_IN_KM, location.getLatitude() - SEARCH_DISTANCE_IN_KM}, + {location.getLongitude() + SEARCH_DISTANCE_IN_KM, location.getLatitude() + SEARCH_DISTANCE_IN_KM} + }; filterQuery.track(settings.getQuery()).locations(locations); twitterStream.filter(filterQuery); } -} \ No newline at end of file +} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java index ee7b4efe..22b85918 100644 --- a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java @@ -27,19 +27,15 @@ public static String formatTime(Date date) { if (differenceInMinutes < 2) { return "только что"; - } - else if (differenceInHours < 1) { + } else if (differenceInHours < 1) { return Long.toString(differenceInMinutes) + " минут назад"; - } - else if (calendar.get(Calendar.YEAR) == today.get(Calendar.YEAR) && - calendar.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR)) { + } else if (calendar.get(Calendar.YEAR) == today.get(Calendar.YEAR) + && calendar.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR)) { return Long.toString(differenceInHours) + " часов назад"; - } - else if (calendar.get(Calendar.YEAR) == yesterday.get(Calendar.YEAR) && - calendar.get(Calendar.DAY_OF_YEAR) == yesterday.get(Calendar.DAY_OF_YEAR)) { + } else if (calendar.get(Calendar.YEAR) == yesterday.get(Calendar.YEAR) + && calendar.get(Calendar.DAY_OF_YEAR) == yesterday.get(Calendar.DAY_OF_YEAR)) { return "вчера"; - } - else { + } else { return Long.toString(differenceInDays) + " дней назад"; } } diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java index e4e8b757..735b702a 100644 --- a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java @@ -17,8 +17,7 @@ public static void main(String[] args) throws TwitterException { jcommander.usage(); return; } - } - catch (Exception e) { + } catch (Exception e) { JCommander jcommander = new JCommander(settings); jcommander.usage(); return; @@ -38,4 +37,4 @@ public static void main(String[] args) throws TwitterException { e.printStackTrace(); } } -} \ No newline at end of file +} From 1dda9a15d4b101332c164d12b8f6b6ed9b9eecb6 Mon Sep 17 00:00:00 2001 From: Maxim Grishkin Date: Sat, 19 Dec 2015 04:29:00 +0300 Subject: [PATCH 4/7] test --- riskingh/src/test/java/ru/fizteh/fivt/students/riskingh/f | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 riskingh/src/test/java/ru/fizteh/fivt/students/riskingh/f diff --git a/riskingh/src/test/java/ru/fizteh/fivt/students/riskingh/f b/riskingh/src/test/java/ru/fizteh/fivt/students/riskingh/f new file mode 100644 index 00000000..e69de29b From 275172f7bd3087db8db34a5a3879610dc0608900 Mon Sep 17 00:00:00 2001 From: Maxim Grishkin Date: Sat, 19 Dec 2015 04:40:11 +0300 Subject: [PATCH 5/7] MiniORM don --- riskingh/pom.xml | 10 + .../students/riskingh/MiniORM/Column.java | 9 + .../riskingh/MiniORM/DatabaseService.java | 266 ++++++++++++++++++ .../riskingh/MiniORM/H2StringsResolver.java | 39 +++ .../riskingh/MiniORM/NameResolver.java | 16 ++ .../students/riskingh/MiniORM/PrimaryKey.java | 8 + .../fivt/students/riskingh/MiniORM/Table.java | 9 + .../riskingh/TwitterStream/GeoUtils.java | 32 --- .../riskingh/TwitterStream/JSONReader.java | 36 --- .../riskingh/TwitterStream/Settings.java | 54 ---- .../riskingh/TwitterStream/StatusPrinter.java | 68 ----- .../riskingh/TwitterStream/TimeUtils.java | 42 --- .../riskingh/TwitterStream/TwitterStream.java | 40 --- .../riskingh/MiniORM/DatabaseServiceTest.java | 166 +++++++++++ .../java/ru/fizteh/fivt/students/riskingh/f | 0 15 files changed, 523 insertions(+), 272 deletions(-) create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/Column.java create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/DatabaseService.java create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/H2StringsResolver.java create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/NameResolver.java create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/PrimaryKey.java create mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/Table.java delete mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java delete mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/JSONReader.java delete mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/Settings.java delete mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java delete mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java delete mode 100644 riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java create mode 100644 riskingh/src/test/java/ru/fizteh/fivt/students/riskingh/MiniORM/DatabaseServiceTest.java delete mode 100644 riskingh/src/test/java/ru/fizteh/fivt/students/riskingh/f diff --git a/riskingh/pom.xml b/riskingh/pom.xml index 27cf292b..b3916530 100644 --- a/riskingh/pom.xml +++ b/riskingh/pom.xml @@ -42,5 +42,15 @@ json 20151123 + + com.google.guava + guava + 14.0 + + + com.h2database + h2 + 1.4.190 + diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/Column.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/Column.java new file mode 100644 index 00000000..7afac64a --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/Column.java @@ -0,0 +1,9 @@ +package ru.fizteh.fivt.students.riskingh.MiniORM; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Column { + String name() default ""; +} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/DatabaseService.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/DatabaseService.java new file mode 100644 index 00000000..47f85775 --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/DatabaseService.java @@ -0,0 +1,266 @@ +package ru.fizteh.fivt.students.riskingh.MiniORM; + +import org.h2.jdbcx.JdbcConnectionPool; + +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.sql.*; +import java.util.*; + +import static ru.fizteh.fivt.students.riskingh.MiniORM.NameResolver.convertCamelToUnderscore; +import static ru.fizteh.fivt.students.riskingh.MiniORM.NameResolver.isGood; + +public class DatabaseService implements Closeable { + private final String connectionName; + private final String username; + private final String password; + + private Class clazz; + private JdbcConnectionPool pool; + private String tableName; + private Field[] fields; + private int pkIndex = -1; + + String getColumnName(Field f) { + String name = f.getAnnotation(Column.class).name(); + if (name.equals("")) { + return convertCamelToUnderscore(f.getName()); + } + return name; + } + + void init() throws IllegalArgumentException, IOException { + if (!clazz.isAnnotationPresent(Table.class)) { + throw new IllegalArgumentException("no @Table annotation"); + } + + tableName = clazz.getAnnotation(Table.class).name(); + if (tableName.equals("")) { + tableName = convertCamelToUnderscore(clazz.getSimpleName()); + } + + if (!isGood(tableName)) { + throw new IllegalArgumentException("Bad table name"); + } + + Set names = new HashSet<>(); + List fieldsList = new ArrayList<>(); + for (Field f: clazz.getDeclaredFields()) { + if (f.isAnnotationPresent(Column.class)) { + String name = getColumnName(f); + names.add(name); + if (!isGood(name)) { + throw new IllegalArgumentException("Bad column name"); + } + + f.setAccessible(true); + fieldsList.add(f); + if (f.isAnnotationPresent(PrimaryKey.class)) { + if (pkIndex == -1) { + pkIndex = fieldsList.size() - 1; + } else { + throw new + IllegalArgumentException("Several @PrimaryKey"); + } + } + } else if (f.isAnnotationPresent(PrimaryKey.class)) { + throw new + IllegalArgumentException("@PrimaryKey without @Column"); + } + } + + if (names.size() != fieldsList.size()) { + throw new IllegalArgumentException("Duplicate columns"); + } + + fields = new Field[fieldsList.size()]; + fields = fieldsList.toArray(fields); + + try { + Class.forName("org.h2.Driver"); + } catch (ClassNotFoundException e) { + throw new IllegalStateException("No H2 driver found"); + } + + pool = JdbcConnectionPool.create(connectionName, username, password); + } + + DatabaseService(Class newClazz, String properties) throws IOException { + Properties credits = new Properties(); + try (InputStream inputStream = this.getClass().getResourceAsStream(properties)) { + credits.load(inputStream); + } + connectionName = credits.getProperty("connection_name"); + username = credits.getProperty("username"); + password = credits.getProperty("password"); + + clazz = newClazz; + init(); + } + + DatabaseService(Class newClazz) throws IOException { + this(newClazz, "/h2test.properties"); + } + + void createTable() throws SQLException { + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("CREATE TABLE IF NOT EXISTS ").append(tableName).append("("); + for (int i = 0; i < fields.length; ++i) { + if (i != 0) { + queryBuilder.append(", "); + } + queryBuilder.append(getColumnName(fields[i])).append(" ") + .append(H2StringsResolver.resolve(fields[i].getType())); + if (i == pkIndex) { + queryBuilder.append(" PRIMARY KEY"); + } + } + queryBuilder.append(")"); + try (Connection conn = pool.getConnection()) { + conn.createStatement().execute(queryBuilder.toString()); + } + + } + + void dropTable() throws SQLException { + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("DROP TABLE IF EXISTS ").append(tableName); + try (Connection conn = pool.getConnection()) { + conn.createStatement().execute(queryBuilder.toString()); + } + } + + public void insert(T record) throws SQLException, IllegalAccessException { + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("INSERT INTO ").append(tableName).append(" ("); + for (int i = 0; i < fields.length; ++i) { + if (i != 0) { + queryBuilder.append(", "); + } + queryBuilder.append(getColumnName(fields[i])).append(" "); + } + queryBuilder.append(") VALUES ("); + for (int i = 0; i < fields.length; ++i) { + if (i != 0) { + queryBuilder.append(", "); + } + queryBuilder.append("?"); + } + queryBuilder.append(")"); + + try (Connection conn = pool.getConnection()) { + PreparedStatement statement = conn.prepareStatement(queryBuilder.toString()); + for (int i = 0; i < fields.length; ++i) { + statement.setObject(i + 1, fields[i].get(record)); + } + statement.execute(); + } + } + + public void delete(T record) throws IllegalArgumentException, IllegalAccessException, SQLException { + if (pkIndex == -1) { + throw new IllegalArgumentException("NO @PrimaryKey"); + } + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("DELETE FROM ").append(tableName).append(" WHERE ") + .append(fields[pkIndex].getName()).append(" = ?"); + try (Connection conn = pool.getConnection()) { + PreparedStatement statement = conn.prepareStatement(queryBuilder.toString()); + statement.setObject(1, fields[pkIndex].get(record)); + statement.execute(); + } + } + + public void update(T record) throws IllegalArgumentException, SQLException, IllegalAccessException { + if (pkIndex == -1) { + throw new IllegalArgumentException("NO @PrimaryKey"); + } + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("UPDATE ").append(tableName).append(" SET "); + for (int i = 0; i < fields.length; ++i) { + if (i != 0) { + queryBuilder.append(", "); + } + queryBuilder.append(getColumnName(fields[i])).append(" = ?"); + } + queryBuilder.append(" WHERE ").append(getColumnName(fields[pkIndex])) + .append(" = ?"); + + try (Connection conn = pool.getConnection()) { + PreparedStatement statement = conn.prepareStatement(queryBuilder.toString()); + for (int i = 0; i < fields.length; ++i) { + statement.setObject(i + 1, fields[i].get(record)); + } + statement.setObject(fields.length + 1, fields[pkIndex].get(record)); + statement.execute(); + } + } + + public List queryForAll() throws SQLException { + List result = new ArrayList<>(); + + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("SELECT * FROM ").append(tableName); + + try (Connection conn = pool.getConnection()) { + try (ResultSet rs = conn.createStatement().executeQuery(queryBuilder.toString())) { + while (rs.next()) { + T record = clazz.newInstance(); + for (int i = 0; i < fields.length; ++i) { + if (fields[i].getClass().isAssignableFrom(Number.class)) { + Long val = rs.getLong(i + 1); + fields[i].set(record, val); + } else if (fields[i].getType() != String.class) { + fields[i].set(record, rs.getObject(i + 1)); + } else { + Clob data = rs.getClob(i + 1); + fields[i].set(record, data.getSubString(1, (int) data.length())); + } + } + result.add(record); + } + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalArgumentException("wrong class"); + } + } + return result; + } + + public T queryById(K key) throws IllegalArgumentException, SQLException { + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("SELECT * FROM ").append(tableName).append(" WHERE ") + .append(fields[pkIndex].getName()).append(" = ?"); + try (Connection conn = pool.getConnection()) { + PreparedStatement statement = conn.prepareStatement(queryBuilder.toString()); + statement.setString(1, key.toString()); + try (ResultSet rs = statement.executeQuery()) { + rs.next(); + T record = clazz.newInstance(); + for (int i = 0; i < fields.length; ++i) { + if (fields[i].getClass().isAssignableFrom(Number.class)) { + Long val = rs.getLong(i + 1); + fields[i].set(record, val); + } else if (fields[i].getType() != String.class) { + fields[i].set(record, rs.getObject(i + 1)); + } else { + Clob data = rs.getClob(i + 1); + fields[i].set(record, data.getSubString(1, (int) data.length())); + } + } + return record; + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalArgumentException("wrong class"); + } + } + + } + + @Override + public void close() throws IOException { + if (pool != null) { + pool.dispose(); + } + } +} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/H2StringsResolver.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/H2StringsResolver.java new file mode 100644 index 00000000..e5bd9893 --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/H2StringsResolver.java @@ -0,0 +1,39 @@ +package ru.fizteh.fivt.students.riskingh.MiniORM; + +import java.sql.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +class H2StringsResolver { + private static Map h2Map; + static { + h2Map = new HashMap<>(); + h2Map.put(Integer.class, "INTEGER"); + h2Map.put(Boolean.class, "BOOLEAN"); + h2Map.put(Byte.class, "TINYINT"); + h2Map.put(Short.class, "SMALLINT"); + h2Map.put(Long.class, "BIGINT"); + h2Map.put(Double.class, "DOUBLE"); + h2Map.put(Float.class, "FLOAT"); + h2Map.put(Time.class, "TIME"); + h2Map.put(Date.class, "DATE"); + h2Map.put(Timestamp.class, "TIMESTAMP"); + h2Map.put(Character.class, "CHAR"); + h2Map.put(String.class, "CLOB"); + h2Map.put(UUID.class, "UUID"); + } + + public static String resolve(Class clazz) { + if (clazz.isArray()) { + return "ARRAY"; + } + if (h2Map.containsKey(clazz)) { + return h2Map.get(clazz); + } + return "OTHER"; + } +} + diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/NameResolver.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/NameResolver.java new file mode 100644 index 00000000..514b0889 --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/NameResolver.java @@ -0,0 +1,16 @@ +package ru.fizteh.fivt.students.riskingh.MiniORM; + +import com.google.common.base.CaseFormat; + +class NameResolver { + static final String REGEX = "[A-Za-z0-9_-]*"; + public static Boolean isGood(String name) { + return name.matches(REGEX); + } + static String convertCamelToUnderscore(String name) { + if (Character.isLowerCase(name.charAt(0))) { + return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name); + } + return CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name); + } +} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/PrimaryKey.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/PrimaryKey.java new file mode 100644 index 00000000..b773f252 --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/PrimaryKey.java @@ -0,0 +1,8 @@ +package ru.fizteh.fivt.students.riskingh.MiniORM; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface PrimaryKey { +} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/Table.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/Table.java new file mode 100644 index 00000000..2e5a1bcd --- /dev/null +++ b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/MiniORM/Table.java @@ -0,0 +1,9 @@ +package ru.fizteh.fivt.students.riskingh.MiniORM; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Table { + String name() default ""; +} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java deleted file mode 100644 index 5a0cf979..00000000 --- a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/GeoUtils.java +++ /dev/null @@ -1,32 +0,0 @@ -package ru.fizteh.fivt.students.riskingh.TwitterStream; - -/** - * Created by max on 18/12/15. - */ - -import twitter4j.*; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLEncoder; -import java.util.Properties; - -public class GeoUtils { - public static GeoLocation getLocationByPlace(String placeString) throws IOException, - URISyntaxException, org.json.JSONException { - Properties properties = new Properties(); - try (InputStream inputStream = GeoLocation.class.getResourceAsStream("/googleMaps.properties")) { - properties.load(inputStream); - } - String googleMapsKey = properties.getProperty("google"); - String urlString = "https://maps.googleapis.com/maps/api/geocode/json?key=" - + googleMapsKey + "&address=" + URLEncoder.encode(placeString, "UTF-8"); - URL url = new URL(urlString); - org.json.JSONObject jsonObject = JSONReader.readJSONFromUrl(url.toString()); - jsonObject = jsonObject.getJSONArray("results").getJSONObject(0) - .getJSONObject("geometry").getJSONObject("location"); - return new GeoLocation(jsonObject.getDouble("lat"), jsonObject.getDouble("lng")); - } -} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/JSONReader.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/JSONReader.java deleted file mode 100644 index c4601314..00000000 --- a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/JSONReader.java +++ /dev/null @@ -1,36 +0,0 @@ -package ru.fizteh.fivt.students.riskingh.TwitterStream; - -/** - * Created by max on 18/12/15. - */ - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.net.URL; -import java.nio.charset.Charset; - -import org.json.JSONException; -import org.json.JSONObject; - -public class JSONReader { - - private static String readAll(Reader rd) throws IOException { - StringBuilder sb = new StringBuilder(); - int cp; - while ((cp = rd.read()) != -1) { - sb.append((char) cp); - } - return sb.toString(); - } - - public static JSONObject readJSONFromUrl(String url) throws IOException, JSONException { - try (InputStream is = new URL(url).openStream()) { - BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); - String jsonText = readAll(rd); - return new JSONObject(jsonText); - } - } -} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/Settings.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/Settings.java deleted file mode 100644 index ba9aad0e..00000000 --- a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/Settings.java +++ /dev/null @@ -1,54 +0,0 @@ -package ru.fizteh.fivt.students.riskingh.TwitterStream; - -/** - * Created by max on 18/12/15. - */ -import com.beust.jcommander.*; - -public class Settings { - - private static final int DEFAULT_TWEET_LIMIT = 10; - - @Parameter(names = {"-q", "--query"}, description = "Query or keywords for stream") - private String query = ""; - - @Parameter(names = {"-p", "--place"}, description = "Location") - private String place = "nearby"; - - @Parameter(names = {"-s", "--stream"}, description = "Stream") - private boolean stream = false; - - @Parameter(names = {"--hideRetweets"}, description = "Hide retweets") - private boolean hideRetweets = false; - - @Parameter(names = {"-l", "--limit"}, description = "Tweets limit") - private Integer limit = DEFAULT_TWEET_LIMIT; - - @Parameter(names = {"-h", "--help"}, description = "Show this help") - private boolean printHelp = false; - - public String getQuery() { - return query; - } - - public String getPlace() { - return place; - } - - public boolean stream() { - return stream; - } - - public boolean hideRetweets() { - return hideRetweets; - } - - public Integer getLimitNumber() { - return limit; - } - - public boolean printHelp() { - return printHelp; - } -} - diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java deleted file mode 100644 index d0f8489b..00000000 --- a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/StatusPrinter.java +++ /dev/null @@ -1,68 +0,0 @@ -package ru.fizteh.fivt.students.riskingh.TwitterStream; - -/** - * Created by max on 18/12/15. - */ - -import twitter4j.*; -import twitter4j.TwitterStream; - -import java.util.List; - -public class StatusPrinter { - public static final int SEARCH_DISTANCE_IN_KM = 5; - public static final int MILLISECONDS_IN_SECOND = 1000; - - private static void printTweet(Status tweet) { - System.out.print("[" + TimeUtils.formatTime(tweet.getCreatedAt()) + "]"); - System.out.print("@" + tweet.getUser().getScreenName() + ": "); - if (tweet.isRetweet()) { - System.out.print("ретвитнул "); - System.out.print(tweet.getRetweetedStatus().getUser().getScreenName() + ":"); - System.out.print(tweet.getRetweetedStatus().getText()); - } else { - System.out.print(tweet.getText()); - int retweetsCount = tweet.getRetweetCount(); - if (retweetsCount > 0) { - System.out.print("(" + retweetsCount + " ретвитов)"); - } - } - System.out.println(); - } - - public static void print(Settings settings, GeoLocation location) throws TwitterException { - Twitter twitter = new TwitterFactory().getInstance(); - Query query = new Query(settings.getQuery()).geoCode(location, SEARCH_DISTANCE_IN_KM, "km"); - query.setCount(settings.getLimitNumber()); - QueryResult queryResult = twitter.search(query); - List statuses = queryResult.getTweets(); - statuses.stream(). - filter(status -> !settings.hideRetweets() || !status.isRetweet()). - forEach(ru.fizteh.fivt.students.riskingh.TwitterStream.StatusPrinter::printTweet); - } - - public static void stream(Settings settings, GeoLocation location) throws TwitterException { - TwitterStream twitterStream = new TwitterStreamFactory().getInstance(); - twitterStream.addListener(new StatusAdapter() { - @Override - public void onStatus(Status status) { - if (settings.hideRetweets() && status.isRetweet()) { - return; - } - printTweet(status); - try { - Thread.sleep(MILLISECONDS_IN_SECOND); - } catch (Exception e) { - System.err.print("ERROR!"); - } - } - }); - FilterQuery filterQuery = new FilterQuery(); - double[][] locations = { - {location.getLongitude() - SEARCH_DISTANCE_IN_KM, location.getLatitude() - SEARCH_DISTANCE_IN_KM}, - {location.getLongitude() + SEARCH_DISTANCE_IN_KM, location.getLatitude() + SEARCH_DISTANCE_IN_KM} - }; - filterQuery.track(settings.getQuery()).locations(locations); - twitterStream.filter(filterQuery); - } -} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java deleted file mode 100644 index 22b85918..00000000 --- a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TimeUtils.java +++ /dev/null @@ -1,42 +0,0 @@ -package ru.fizteh.fivt.students.riskingh.TwitterStream; - -/** - * Created by max on 18/12/15. - */ - -import java.util.Calendar; -import java.util.Date; -import java.util.concurrent.TimeUnit; - -public class TimeUtils { - public static String formatTime(Date date) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - - Calendar today = Calendar.getInstance(); - - Calendar yesterday = Calendar.getInstance(); - yesterday.add(Calendar.DAY_OF_YEAR, -1); - - Date current = new Date(); - long difference = current.getTime() - date.getTime(); - - long differenceInMinutes = TimeUnit.MILLISECONDS.toMinutes(difference); - long differenceInHours = TimeUnit.MILLISECONDS.toHours(difference); - long differenceInDays = TimeUnit.MILLISECONDS.toDays(difference); - - if (differenceInMinutes < 2) { - return "только что"; - } else if (differenceInHours < 1) { - return Long.toString(differenceInMinutes) + " минут назад"; - } else if (calendar.get(Calendar.YEAR) == today.get(Calendar.YEAR) - && calendar.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR)) { - return Long.toString(differenceInHours) + " часов назад"; - } else if (calendar.get(Calendar.YEAR) == yesterday.get(Calendar.YEAR) - && calendar.get(Calendar.DAY_OF_YEAR) == yesterday.get(Calendar.DAY_OF_YEAR)) { - return "вчера"; - } else { - return Long.toString(differenceInDays) + " дней назад"; - } - } -} diff --git a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java b/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java deleted file mode 100644 index 735b702a..00000000 --- a/riskingh/src/main/java/ru/fizteh/fivt/students/riskingh/TwitterStream/TwitterStream.java +++ /dev/null @@ -1,40 +0,0 @@ -package ru.fizteh.fivt.students.riskingh.TwitterStream; - -/** - * Created by max on 18/12/15. - */ - -import com.beust.jcommander.JCommander; -import twitter4j.GeoLocation; -import twitter4j.TwitterException; - -public class TwitterStream { - public static void main(String[] args) throws TwitterException { - Settings settings = new Settings(); - try { - JCommander jcommander = new JCommander(settings, args); - if (settings.printHelp()) { - jcommander.usage(); - return; - } - } catch (Exception e) { - JCommander jcommander = new JCommander(settings); - jcommander.usage(); - return; - } - - System.out.print("Твиты по запросу " + settings.getQuery() + " для " + settings.getPlace() + ":"); - System.out.println(); - try { - GeoLocation location = GeoUtils.getLocationByPlace(settings.getPlace()); - if (settings.stream()) { - StatusPrinter.stream(settings, location); - } else { - StatusPrinter.print(settings, location); - } - } catch (Exception e) { - System.err.print("ERROR: " + e.toString()); - e.printStackTrace(); - } - } -} diff --git a/riskingh/src/test/java/ru/fizteh/fivt/students/riskingh/MiniORM/DatabaseServiceTest.java b/riskingh/src/test/java/ru/fizteh/fivt/students/riskingh/MiniORM/DatabaseServiceTest.java new file mode 100644 index 00000000..9168b66b --- /dev/null +++ b/riskingh/src/test/java/ru/fizteh/fivt/students/riskingh/MiniORM/DatabaseServiceTest.java @@ -0,0 +1,166 @@ +package ru.fizteh.fivt.students.riskingh.MiniORM; + +import org.h2.jdbcx.JdbcConnectionPool; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.sql.Connection; +import java.sql.ResultSet; +import java.util.Properties; + +import static ru.fizteh.fivt.students.riskingh.MiniORM.NameResolver.convertCamelToUnderscore; + +public class DatabaseServiceTest { + @Test(expected = IllegalArgumentException.class) + public void testIllegalClass_1() throws Exception { + class X { + @Column + int y; + } + new DatabaseService(X.class); + } + + @Test(expected = IllegalArgumentException.class) + public void testIllegalClass_2() throws Exception { + @Table + class X { + @Column + int y; + + @Column(name = "y") + String x; + } + new DatabaseService(X.class); + } + + @Test(expected = IllegalArgumentException.class) + public void testIllegalClass_3_0() throws Exception { + @Table + class X { + @Column + int y; + } + DatabaseService x = new DatabaseService<>(X.class); + x.delete(new X()); + } + + @Test(expected = IllegalArgumentException.class) + public void testIllegalClass_3_1() throws Exception { + @Table + class X { + @Column + int y; + } + DatabaseService x = new DatabaseService<>(X.class); + x.update(new X()); + } + + @Test(expected = IllegalArgumentException.class) + public void testIllegalClass_4() throws Exception { + @Table + class X { + @PrimaryKey + @Column + int y; + + @PrimaryKey + String x; + } + new DatabaseService(X.class); + } + + @Test + public void convertTest() throws Exception { + Assert.assertEquals(convertCamelToUnderscore("mayTheForceBeWithYou"), "may_the_force_be_with_you"); + Assert.assertEquals(convertCamelToUnderscore("WhatIsLove"), "what_is_love"); + } + + private static final String CONNECTION_NAME; + private static final String USERNAME; + private static final String PASSWORD; + + static { + Properties credits = new Properties(); + try (InputStream inputStream = DatabaseServiceTest.class.getResourceAsStream("/h2test.properties")) { + credits.load(inputStream); + } catch (IOException e) { + e.printStackTrace(); + } + CONNECTION_NAME = credits.getProperty("connection_name"); + USERNAME = credits.getProperty("username"); + PASSWORD = credits.getProperty("password"); + } + + @Table + static class MyClass { + @PrimaryKey + @Column + Integer x; + + @Column + String y; + + MyClass() { + } + + MyClass(Integer x, String y) { + this.x = x; + this.y = y; + } + + @Override + public boolean equals(Object o) { + if (o instanceof MyClass) { + MyClass omc = (MyClass) o; + return x.equals(omc.x) && y.equals(omc.y); + } + return false; + } + } + + @Test + public void bigTest() throws Exception { + DatabaseService x = new DatabaseService<>(MyClass.class, "/h2test.properties"); + JdbcConnectionPool pool = JdbcConnectionPool.create(CONNECTION_NAME, USERNAME, PASSWORD); + Connection tmp; + tmp = pool.getConnection(); + tmp.createStatement().execute("DROP TABLE IF EXISTS my_class"); + tmp.close(); + + x.createTable(); + tmp = pool.getConnection(); + tmp.createStatement().execute("INSERT INTO my_class (x, y) VALUES (1, 'one')"); + tmp.close(); + Assert.assertEquals(x.queryById(1).y, "one"); + x.insert(new MyClass(2, "X")); + x.insert(new MyClass(3, "X")); + tmp = pool.getConnection(); + ResultSet rs = tmp.createStatement().executeQuery("SELECT * FROM my_class WHERE y = 'X'"); + int count = 0; + int sum = 0; + while(rs.next()) { + Assert.assertTrue(rs.getInt(1) == 2 || rs.getInt(1) == 3); + ++count; + sum += rs.getInt(1); + } + + rs.close(); + tmp.close(); + + Assert.assertEquals(count, 2); + Assert.assertEquals(sum, 5); + + Assert.assertEquals(x.queryForAll().size(), 3); + Assert.assertTrue(x.queryForAll().contains(new MyClass(1, "one"))); + x.update(new MyClass(1, "two")); + Assert.assertTrue(!x.queryForAll().contains(new MyClass(1, "one"))); + Assert.assertTrue(x.queryForAll().contains(new MyClass(1, "two"))); + x.delete(new MyClass(1, "")); + Assert.assertTrue(!x.queryForAll().contains(new MyClass(1, "two"))); + + x.dropTable(); + x.close(); + } +} diff --git a/riskingh/src/test/java/ru/fizteh/fivt/students/riskingh/f b/riskingh/src/test/java/ru/fizteh/fivt/students/riskingh/f deleted file mode 100644 index e69de29b..00000000 From 629a8f37fec9959373c5012a05acdd1a94c05ca3 Mon Sep 17 00:00:00 2001 From: Maxim Grishkin Date: Sat, 19 Dec 2015 04:46:41 +0300 Subject: [PATCH 6/7] junit version fix --- riskingh/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/riskingh/pom.xml b/riskingh/pom.xml index b3916530..95663eb1 100644 --- a/riskingh/pom.xml +++ b/riskingh/pom.xml @@ -19,7 +19,7 @@ junit junit - 3.8.1 + 4.12 test From 85b502f82502c87a946051b571c8b859c1c12671 Mon Sep 17 00:00:00 2001 From: Maxim Grishkin Date: Sat, 19 Dec 2015 04:52:41 +0300 Subject: [PATCH 7/7] props --- riskingh/src/main/resources/h2test.properties | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 riskingh/src/main/resources/h2test.properties diff --git a/riskingh/src/main/resources/h2test.properties b/riskingh/src/main/resources/h2test.properties new file mode 100644 index 00000000..e8349295 --- /dev/null +++ b/riskingh/src/main/resources/h2test.properties @@ -0,0 +1,4 @@ +connection_name=jdbc:h2:~/test +username=test +password=test +