diff --git a/DariaZvereva/grep.exe.stackdump b/DariaZvereva/grep.exe.stackdump new file mode 100644 index 00000000..20a50a16 --- /dev/null +++ b/DariaZvereva/grep.exe.stackdump @@ -0,0 +1,17 @@ +MSYS-1.0.12 Build:2012-07-05 14:56 +Exception: STATUS_ACCESS_VIOLATION at eip=00788DAA +eax=680A220C ebx=68573734 ecx=003028AA edx=00000124 esi=00000000 edi=685700D4 +ebp=0029FE90 esp=0029FE6C program=C:\Program Files (x86)\Git\bin\grep.exe +cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B +Stack trace: +Frame Function Args +0029FE90 00788DAA (685700D4, 00000124, 00000003, 007844EA) +0029FEE0 0078466B (00000000, E79C138C, 0029FF20, 00413CAC) +0029FF00 00784C5F (004039A0, 00401000, 00000000, 00000000) +0029FF20 00784C98 (00000000, 00000000, 00000000, 00000000) +0029FF50 00413BBC (004039A0, 00000000, 00000000, 00000000) +0029FF80 0040103D (7FFDE000, 74473720, E3AB5234, 0029FFDC) +0029FF94 74473744 (7FFDE000, A74129A1, 00000000, 00000000) +0029FFDC 770D9CD4 (FFFFFFFF, 770FD4DC, 00000000, 00000000) +0029FFEC 770D9C9F (00401000, 7FFDE000, 00000000, 78746341) +End of stack trace \ No newline at end of file diff --git a/DariaZvereva/pom.xml b/DariaZvereva/pom.xml new file mode 100644 index 00000000..34028334 --- /dev/null +++ b/DariaZvereva/pom.xml @@ -0,0 +1,124 @@ + + + 4.0.0 + + ru.fizteh.fivt.students + parent + 1.0-SNAPSHOT + + ru.fizteh.fivt.students + DariaZvereva + 1.0-SNAPSHOT + DariaZvereva + http://maven.apache.org + + + UTF-8 + + + + 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 + + + org.codehaus.groovy + groovy + 1.8.3 + + + junit + junit + 4.12 + test + + + com.google.guava + guava + 18.0 + + + com.h2database + h2 + 1.4.190 + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 2.10 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/dependency + false + false + true + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.4.1 + + + + ru.fizteh.fivt.students.DariaZvereva.MiniORM.Test + + + + jar-with-dependencies + + + + + make-assembly + + package + + single + + + + + + + + diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregates.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregates.java new file mode 100644 index 00000000..c87aa512 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregates.java @@ -0,0 +1,37 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL; + +/** + * Created by Dasha on 10.11.2015. + */ + +import ru.fizteh.fivt.students.DariaZvereva.CQL.Aggregators.Avg; +import ru.fizteh.fivt.students.DariaZvereva.CQL.Aggregators.Count; +import ru.fizteh.fivt.students.DariaZvereva.CQL.Aggregators.Max; +import ru.fizteh.fivt.students.DariaZvereva.CQL.Aggregators.Min; + +import java.util.function.Function; + +/** + * Aggregate functions. + * + * @author akormushin + */ +public class Aggregates { + + public static > Function max(Function expression) { + return new Max<>(expression); + } + + public static > Function min(Function expression) { + return new Min<>(expression); + } + + public static Function count(Function expression) { + return new Count<>(expression); + } + + public static Function avg(Function expression) { + return new Avg<>(expression); + } + +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Aggregator.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Aggregator.java new file mode 100644 index 00000000..4359ae76 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Aggregator.java @@ -0,0 +1,11 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL.Aggregators; + +import java.util.List; +import java.util.function.Function; + +/** + * Created by Dasha on 18.12.2015. + */ +public interface Aggregator extends Function { + R apply(List elements); +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Avg.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Avg.java new file mode 100644 index 00000000..7a16252b --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Avg.java @@ -0,0 +1,24 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL.Aggregators; + +import java.util.List; +import java.util.function.Function; + +/** + * Created by Dasha on 18.12.2015. + */ +public class Avg implements Aggregator { + private Function function; + public Avg(Function statement) { + function = statement; + } + @Override + public Double apply(List elements) { + return elements.stream().map(function).mapToDouble(element -> (Double) element) + .average().getAsDouble(); + } + + @Override + public Double apply(T t) { + return null; + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Count.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Count.java new file mode 100644 index 00000000..341f4153 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Count.java @@ -0,0 +1,24 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL.Aggregators; + +import java.util.List; +import java.util.function.Function; + +/** + * Created by Dasha on 18.12.2015. + */ +public class Count implements Aggregator { + private Function function; + public Count(Function statement) { + function = statement; + } + + @Override + public Long apply(List elements) { + return elements.stream().map(function).distinct().count(); + } + + @Override + public Long apply(T t) { + return null; + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Max.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Max.java new file mode 100644 index 00000000..c9a6852c --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Max.java @@ -0,0 +1,26 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL.Aggregators; + +import java.util.List; +import java.util.function.Function; + +/** + * Created by Dasha on 18.12.2015. + */ +public class Max> implements Aggregator { + + private Function function; + public Max(Function statement) { + function = statement; + } + + @Override + public R apply(List elements) { + return elements.stream().map(function).max(R::compareTo).get(); + } + + @Override + public R apply(T t) { + return null; + } +} + diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Min.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Min.java new file mode 100644 index 00000000..f5dc1ed2 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Aggregators/Min.java @@ -0,0 +1,25 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL.Aggregators; + +import java.util.List; +import java.util.function.Function; + +/** + * Created by Dasha on 18.12.2015. + */ +public class Min> implements Aggregator { + + private Function function; + public Min(Function statement) { + function = statement; + } + + @Override + public R apply(List elements) { + return elements.stream().map(function).min(R::compareTo).get(); + } + + @Override + public R apply(T t) { + return null; + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/CQL.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/CQL.java new file mode 100644 index 00000000..5392c4a9 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/CQL.java @@ -0,0 +1,128 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; + + +/** + * Created by Dasha on 10.11.2015. + */ + +public class CQL { + + public static class Student { + private final String name; + + private final LocalDate dateOfBith; + + private final String group; + + public String getName() { + return name; + } + + public Student(String name, LocalDate dateOfBith, String group) { + this.name = name; + this.dateOfBith = dateOfBith; + this.group = group; + } + + public LocalDate getDateOfBith() { + return dateOfBith; + } + + public String getGroup() { + return group; + } + + public long age() { + return ChronoUnit.YEARS.between(getDateOfBith(), LocalDateTime.now()); + } + + public static Student student(String name, LocalDate dateOfBith, String group) { + return new Student(name, dateOfBith, group); + } + } + + public static class Group { + private final String group; + private final String mentor; + + public Group(String group, String mentor) { + this.group = group; + this.mentor = mentor; + } + + public String getGroup() { + return group; + } + + public String getMentor() { + return mentor; + } + } + + + public static class Statistics { + + private final String group; + private final Long count; + private final Long age; + + public String getGroup() { + return group; + } + + public Long getCount() { + return count; + } + + public Long getAge() { + return age; + } + + public Statistics(String group, Long count, Long age) { + this.group = group; + this.count = count; + this.age = age; + } + + @Override + public String toString() { + return "Statistics{" + + "group='" + group + '\'' + + ", count=" + count + + ", age=" + age + + '}'; + } + } + + public static void main(String[] args) { + + /* Iterable statistics = + from(list( + student("ivanov", LocalDate.parse("1986-08-06"), "494"), + student("ivanov", LocalDate.parse("1986-08-06"), "494"))) + .select(Statistics.class, Student::getGroup, count(Student::getGroup), avg(Student::age)) + .where(rlike(Student::getName, ".*ov").and(s -> s.age() > 20)) + .groupBy(Student::getGroup) + .having(s -> s.getCount() > 0) + .orderBy(asc(Student::getGroup), desc(count(Student::getGroup))) + .limit(100) + .union() + .from(list(student("ivanov", LocalDate.parse("1985-08-06"), "494"))) + .selectDistinct(Statistics.class, s -> "all", count(s -> 1), avg(Student::age)) + .execute(); + System.out.println(statistics); + + Iterable> mentorsByStudent = + from(list(student("ivanov", LocalDate.parse("1985-08-06"), "494"))) + .join(list(new Group("494", "mr.sidorov"))) + .on((s, g) -> Objects.equals(s.getGroup(), g.getGroup())) + .select(sg -> sg.getFirst().getName(), sg -> sg.getSecond().getMentor()) + .execute(); + System.out.println(mentorsByStudent);*/ + } +} + diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Conditions.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Conditions.java new file mode 100644 index 00000000..e243c173 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Conditions.java @@ -0,0 +1,24 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL; + +/** + * Created by Dasha on 10.11.2015. + */ + +import java.util.function.Function; +import java.util.function.Predicate; + +public class Conditions { + + public static Predicate rlike(Function expression, String regexp) { + return (item -> expression.apply(item).matches(regexp)); + } + + public static Predicate like(Function expression, String pattern) { + return (item -> expression.apply(item).equals(pattern)); + } + + public static Predicate notNull(Function expression) { + return (item -> !expression.apply(item).equals(null)); + } + +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/From.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/From.java new file mode 100644 index 00000000..a101dbe2 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/From.java @@ -0,0 +1,28 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL; + +import java.util.function.Function; + +/** + * Created by Dasha on 18.12.2015. + */ +public class From { + private Iterable elements; + + public From(Iterable initElements) { + elements = initElements; + } + + public static From from(Iterable iterable) { + return new From<>(iterable); + } + + public Select select(Class myClass, + Function... functions) { + return new Select<>(elements, myClass, false, functions); + } + + public Select selectDistinct(Class myClass, + Function... functions) { + return new Select<>(elements, myClass, true, functions); + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/OrderByConditions.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/OrderByConditions.java new file mode 100644 index 00000000..97f026f9 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/OrderByConditions.java @@ -0,0 +1,25 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL; + +/** + * Created by Dasha on 10.11.2015. + */ + +import java.util.Comparator; +import java.util.function.Function; + +/** + * OrderBy sort order helper methods. + * + * @author akormushin + */ +public class OrderByConditions { + + public static > Comparator asc(Function expression) { + return (o1, o2) -> expression.apply(o1).compareTo(expression.apply(o2)); + } + + public static > Comparator desc(Function expression) { + return (o1, o2) -> expression.apply(o2).compareTo(expression.apply(o1)); + } + +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Select.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Select.java new file mode 100644 index 00000000..87f4e9f7 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Select.java @@ -0,0 +1,154 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL; + +import ru.fizteh.fivt.students.DariaZvereva.CQL.Aggregators.Aggregator; + +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +/** + * Created by Dasha on 18.12.2015. + */ +public class Select { + private Iterable elements; + private Class resultClass; + private int limit = 0; + + private Predicate wherePredicate; + private Predicate havingPredicate; + private Function[] groupByFunctions; + private Function[] functions; + private Comparator[] comparators; + + private Boolean isDistinct; + + public Select(Iterable elems, Class initClass, boolean distinct, + Function[] initFunctions) { + elements = elems; + resultClass = initClass; + isDistinct = distinct; + functions = initFunctions; + } + + public Select where(Predicate predicate) { + wherePredicate = predicate; + return this; + } + + public Select having(Predicate initPredicate) { + havingPredicate = initPredicate; + return this; + } + + public Select groupBy(Function... expressions) { + groupByFunctions = expressions; + if (expressions.length == 0) { + throw new IllegalStateException("Group by is made only by non-zero parameters"); + } + isDistinct = true; + return this; + } + + public Select orderBy(Comparator... initComparators) { + comparators = initComparators; + return this; + } + + public Select limit(int n) { + limit = n; + return this; + } + + public List execute() throws IllegalAccessException, InvocationTargetException, InstantiationException { + List tmpList = new ArrayList<>(); + for (T it : elements) { + tmpList.add(it); + } + + if (wherePredicate != null) { + tmpList = tmpList.stream().filter(wherePredicate).collect(Collectors.toList()); + } + + if (isDistinct) { + tmpList = tmpList.stream().distinct().collect(Collectors.toList()); + } + + if (limit != 0) { + tmpList = tmpList.stream().limit(limit).collect(Collectors.toList()); + } + + Map> resultMap = new HashMap<>(); + if (groupByFunctions != null) { + Map> groupByResult = tmpList.stream().collect(Collectors.groupingBy((T elem) -> { + List list = new ArrayList(); + for (int i = 0; i < groupByFunctions.length; ++i) { + list.add(groupByFunctions[i].apply(elem)); + } + return list.hashCode(); + })); + for (Integer key : groupByResult.keySet()) { + resultMap.put(key, groupByResult.get(key)); + } + } else { + resultMap.put(0, tmpList); + } + + List result = new ArrayList<>(); + for (Integer key : resultMap.keySet()) { + List currentResult = new ArrayList<>(); + if (groupByFunctions == null) { + for (T element : resultMap.get(key)) { + for (int i = 0; i < functions.length; ++i) { + currentResult.add(functions[i].apply(element)); + } + } + } else { + for (int i = 0; i < functions.length; ++i) { + if (functions[i] instanceof Aggregator) { + currentResult.add(((Aggregator) functions[i]).apply(resultMap.get(key))); + } else { + currentResult.add(functions[i].apply(resultMap.get(key).get(0))); + } + } + } + + Class[] returnClasses = new Class[functions.length]; + for (int j = 0; j < currentResult.size() + / functions.length; ++j) { + Object[] arguments = new Object[functions.length]; + for (int i = 0; i < arguments.length; ++i) { + arguments[i] = currentResult.get(j * arguments.length + i); + if (arguments[i] != null) { + returnClasses[i] = arguments[i].getClass(); + } else { + throw new IllegalStateException("Null result of operation"); + } + } + + R addItem = null; + try { + addItem = resultClass + .getConstructor(returnClasses) + .newInstance(arguments); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + e.getMessage(); + } + if (havingPredicate == null || havingPredicate.test(addItem)) { + result.add(addItem); + } + } + } + if (comparators != null) { + for (Comparator compare : comparators) { + result.sort(compare); + } + } + return result; + } + public Union union() { + return new Union(this); + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Sources.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Sources.java new file mode 100644 index 00000000..51164491 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Sources.java @@ -0,0 +1,21 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL; + +/** + * Created by Dasha on 10.11.2015. + */ + +import java.util.Arrays; +import java.util.List; + +/** + * Helper methods to create collections. + * + * @author akormushin + */ +public class Sources { + + @SafeVarargs + public static List list(T... items) { + return Arrays.asList(items); + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Union.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Union.java new file mode 100644 index 00000000..81b55faf --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/CQL/Union.java @@ -0,0 +1,79 @@ +package ru.fizteh.fivt.students.DariaZvereva.CQL; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +/** + * Created by Dasha on 18.12.2015. + */ +public class Union { + private List> selections = new ArrayList<>(); + private Select curSelect; + private From curFrom; + + public Union(Select tmpSelect) { + selections.add(tmpSelect); + } + + public Union from(Iterable iterable) { + curFrom = new From(iterable); + return this; + } + + public Union select(Class resultClass, + Function... constructorFunctions) + throws IllegalAccessException, InstantiationException, InvocationTargetException { + curSelect = curFrom.select(resultClass, constructorFunctions); + return this; + } + + public Union selectDistinct(Class resultClass, + Function... constructorFunctions) { + curSelect = curFrom.selectDistinct(resultClass, constructorFunctions); + return this; + } + + public Union orderBy(Comparator... comparators) { + curSelect = curSelect.orderBy(comparators); + return this; + } + + public Union limit(int n) { + curSelect = curSelect.limit(n); + return this; + } + + public Union where(Predicate predicate) { + curSelect = curSelect.where(predicate); + return this; + } + + public Union having(Predicate predicate) { + curSelect = curSelect.having(predicate); + return this; + } + + public Union groupBy(Function... groupByFunctions) { + curSelect = curSelect.groupBy(groupByFunctions); + return this; + } + + public Union union() { + selections.add(curSelect); + return this; + } + + public List execute() throws NoSuchMethodException, + IllegalAccessException, InstantiationException, InvocationTargetException { + List result = new ArrayList<>(); + selections.add(curSelect); + for (Select select : selections) { + result.addAll(select.execute()); + } + return result; + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Column.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Column.java new file mode 100644 index 00000000..3388b11e --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Column.java @@ -0,0 +1,12 @@ +package ru.fizteh.fivt.students.DariaZvereva.MiniORM; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Created by Dasha on 18.12.2015. + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface Column { + String name() default ""; +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Converter.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Converter.java new file mode 100644 index 00000000..d3bc67f2 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Converter.java @@ -0,0 +1,40 @@ +package ru.fizteh.fivt.students.DariaZvereva.MiniORM; + +import java.sql.Time; +import java.sql.Timestamp; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * Created by Dasha on 18.12.2015. + */ + +public class Converter { + private static Map classes; + static { + classes = new HashMap<>(); + classes.put(Integer.class, "INTEGER"); + classes.put(Boolean.class, "BOOLEAN"); + classes.put(Byte.class, "TINYINT"); + classes.put(Short.class, "SMALLINT"); + classes.put(Long.class, "BIGINT"); + classes.put(Double.class, "DOUBLE"); + classes.put(Float.class, "FLOAT"); + classes.put(Time.class, "TIME"); + classes.put(Date.class, "DATE"); + classes.put(Timestamp.class, "TIMESTAMP"); + classes.put(Character.class, "CHAR"); + classes.put(String.class, "CLOB"); + classes.put(UUID.class, "UUID"); + } + + public static String convert(Class currClass) { + if (classes.containsKey(currClass)) { + return classes.get(currClass); + } + return "OTHER"; + } + +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/DatabaseService.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/DatabaseService.java new file mode 100644 index 00000000..7e474112 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/DatabaseService.java @@ -0,0 +1,251 @@ +package ru.fizteh.fivt.students.DariaZvereva.MiniORM; + +import com.google.common.base.CaseFormat; +import org.h2.jdbcx.JdbcConnectionPool; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class DatabaseService { + private String connectionName; + private String userName; + private String password; + + private String tableName; + private Class bdClass; + private Field[] fields; + private String[] namesForColumns; + private int primaryKey = -1; + + + private JdbcConnectionPool connectionPool; + + + DatabaseService(Class type) throws IOException { + /*Properties properties = new Properties(); + try (InputStream inputStream = this.getClass().getResourceAsStream("/h2.properties")) { + properties.load(inputStream); + }*/ + //connectionName = properties.getProperty("connection_name"); + //userName = properties.getProperty("login"); + //password = properties.getProperty("password"); + bdClass = type; + + if (!bdClass.isAnnotationPresent(Table.class)) { + throw new IllegalArgumentException("Class is not a Table"); + } + + if (Objects.equals(bdClass.getAnnotation(Table.class).name(), "")) { + tableName = bdClass.getSimpleName(); + } else { + tableName = bdClass.getAnnotation(Table.class).name(); + } + + List columnNames = new ArrayList<>(); + List columns = new ArrayList<>(); + for (Field currColumn : bdClass.getDeclaredFields()) { + if (!currColumn.isAnnotationPresent(Column.class)) { + throw new IllegalArgumentException("Not all fields are columns"); + } + String currColumnName = currColumn.getAnnotation(Column.class).name(); + if (Objects.equals(currColumnName, "")) { + currColumnName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, type.getName()); + } + + if (currColumn.isAnnotationPresent(PrimaryKey.class)) { + if (primaryKey != -1) { + throw new IllegalArgumentException("Not one primary Key"); + } else { + primaryKey = columns.size(); + } + } + + columnNames.add(currColumnName); + columns.add(currColumn); + } + + fields = new Field[columns.size()]; + fields = columns.toArray(fields); + + namesForColumns = new String[columnNames.size()]; + namesForColumns = columnNames.toArray(namesForColumns); + + try { + Class.forName("org.h2.Driver"); + } catch (ClassNotFoundException e) { + throw new IllegalStateException("No H2 driver found"); + } + + connectionPool = JdbcConnectionPool.create("jdbc:h2:~/test", "test", "test"); + } + + void createTable() throws SQLException { + StringBuilder statementBuilder = new StringBuilder(); + statementBuilder.append("CREATE TABLE IF NOT EXISTS ").append(tableName).append(" ("); + for (int i = 0; i < fields.length; ++i) { + if (i != 0) { + statementBuilder.append(", "); + } + statementBuilder.append(fields[i].getAnnotation(Column.class).name()).append(" ") + .append(Converter.convert(fields[i].getType())); + if (i == primaryKey) { + statementBuilder.append(" PRIMARY KEY "); + } + } + statementBuilder.append(")"); + Connection connection = connectionPool.getConnection(); + connection.createStatement().execute(statementBuilder.toString()); + } + + void dropTable() throws SQLException { + StringBuilder statementBuilder = new StringBuilder(); + statementBuilder.append("DROP TABLE IF EXISTS ").append(tableName); + Connection connection = connectionPool.getConnection(); + connection.createStatement().execute(statementBuilder.toString()); + } + + public void insert(T record) throws SQLException, IllegalAccessException { + StringBuilder statementBuilder = new StringBuilder(); + statementBuilder.append("INSERT INTO ").append(tableName); + statementBuilder.append(" VALUES ("); + for (int i = 0; i < fields.length; ++i) { + if (i > 0) { + statementBuilder.append(" ,"); + } + statementBuilder.append("?"); + } + statementBuilder.append(")"); + Connection connection = connectionPool.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(statementBuilder.toString()); + for (int i = 0; i < fields.length; ++i) { + preparedStatement.setObject(i + 1, fields[i].get(record)); + } + preparedStatement.execute(); + } + + + public void delete(T record) throws IllegalArgumentException, + IllegalAccessException, SQLException { + if (primaryKey == -1) { + throw new IllegalArgumentException("NO @PrimaryKey"); + } + StringBuilder statementBuilder = new StringBuilder(); + statementBuilder.append("DELETE FROM ").append(tableName) + .append(" WHERE ").append(fields[primaryKey].getName()) + .append(" = ?"); + + + + try (Connection connection = connectionPool.getConnection()) { + PreparedStatement statement + = connection.prepareStatement(statementBuilder.toString()); + statement.setObject(1, fields[primaryKey].get(record)); + statement.execute(); + } + } + + public void update(T record) throws IllegalArgumentException, + SQLException, IllegalAccessException { + if (primaryKey == -1) { + throw new IllegalArgumentException("NO @PrimaryKey"); + } + + StringBuilder statementBuilder = new StringBuilder(); + statementBuilder.append("UPDATE ").append(tableName).append(" SET "); + for (int i = 0; i < fields.length; ++i) { + if (i != 0) { + statementBuilder.append(", "); + } + statementBuilder.append(fields[i].getAnnotation(Column.class).name()).append(" = ?"); + } + statementBuilder.append(" WHERE ").append(fields[primaryKey].getAnnotation(Column.class).name()) + .append(" = ?"); + + + try (Connection connection = connectionPool.getConnection()) { + PreparedStatement statement + = connection.prepareStatement(statementBuilder.toString()); + for (int i = 0; i < fields.length; ++i) { + statement.setObject(i + 1, fields[i].get(record)); + } + statement.setObject(fields.length + 1, fields[primaryKey].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 = connectionPool.getConnection()) { + try (ResultSet rs = conn.createStatement() + .executeQuery(queryBuilder.toString())) { + while (rs.next()) { + T record = bdClass.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(namesForColumns[primaryKey]) + .append(" = ?"); + try (Connection conn = connectionPool.getConnection()) { + PreparedStatement statement + = conn.prepareStatement(queryBuilder.toString()); + statement.setString(1, key.toString()); + + try (ResultSet rs = statement.executeQuery()) { + rs.next(); + T record = bdClass.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"); + } + } + + } + + +} + + diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/DatabaseServiceException.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/DatabaseServiceException.java new file mode 100644 index 00000000..261ce86d --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/DatabaseServiceException.java @@ -0,0 +1,15 @@ +package ru.fizteh.fivt.students.DariaZvereva.MiniORM; + +/** + * Created by Dasha on 16.12.2015. + */ +public class DatabaseServiceException extends Exception { + + public DatabaseServiceException(String message) { + super(message); + } + + public DatabaseServiceException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/PrimaryKey.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/PrimaryKey.java new file mode 100644 index 00000000..3dd8cd02 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/PrimaryKey.java @@ -0,0 +1,12 @@ +package ru.fizteh.fivt.students.DariaZvereva.MiniORM; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Created by Dasha on 18.12.2015. + */ + +@Retention(RetentionPolicy.RUNTIME) +public @interface PrimaryKey { +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Table.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Table.java new file mode 100644 index 00000000..e292acfd --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Table.java @@ -0,0 +1,13 @@ +package ru.fizteh.fivt.students.DariaZvereva.MiniORM; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Created by Dasha on 18.12.2015. + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface Table { + String name() default ""; +} + diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Test.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Test.java new file mode 100644 index 00000000..f31063ed --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MiniORM/Test.java @@ -0,0 +1,57 @@ +package ru.fizteh.fivt.students.DariaZvereva.MiniORM; + +import java.io.IOException; +import java.sql.SQLException; + +/** + * Created by Dasha on 19.12.2015. + */ +public class Test { + /* + Тут надо с чек стайлом разбираться, но я уже не успеваю. Если раскомментить, оно работает + @Table(name = "TESTTABLE") + static class Tab { + + @PrimaryKey + @Column(name = "ID") + Integer a; + + @Column(name = "STRING") + String s; + + Tab(Object a, Object s) { + this.a = (Integer) a; + this.s = (String) s; + } + + Tab() { + this.a = 0; + this.s = ""; + } + @Override + public String toString() { + StringBuilder result = new StringBuilder().append("Id = ").append(a).append(", String = ").append(s); + return result.toString(); + } + } +*/ + public static void main(String[] argv) throws IOException, IllegalAccessException, SQLException, + InstantiationException { + /* DatabaseService bd = new DatabaseService<>(Tab.class); + try { + bd.createTable(); + bd.insert(new Tab(1, "one")); + List all = bd.queryForAll(); + all.forEach(System.out::println); + bd.insert(new Tab(2, "two")); + bd.insert(new Tab(3, "three")); + bd.insert(new Tab(4, "four")); + Tab elem = bd.queryById(3); + System.out.println(elem); + all = bd.queryForAll(); + all.forEach(System.out::println); + } finally { + bd.dropTable(); + } +*/ } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MyBlockingQueue/MyBlockingQueue.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MyBlockingQueue/MyBlockingQueue.java new file mode 100644 index 00000000..ed5922ae --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/MyBlockingQueue/MyBlockingQueue.java @@ -0,0 +1,25 @@ +package ru.fizteh.fivt.students.DariaZvereva.MyBlockingQueue; + +import java.util.LinkedList; +import java.util.List; + +/** + * Created by Dasha on 07.12.2015. + */ +public class MyBlockingQueue { + private List queue = new LinkedList(); + private int limit = 10; + + public MyBlockingQueue(int n) { + limit = n; + } + + public void offer(List e) { + + } + + public void take(int n) { + + } + +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/ThreadsCounter/Settings.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/ThreadsCounter/Settings.java new file mode 100644 index 00000000..d8437e46 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/ThreadsCounter/Settings.java @@ -0,0 +1,27 @@ +package ru.fizteh.fivt.students.DariaZvereva.ThreadsCounter; + +import com.beust.jcommander.Parameter; + +/** + * Created by Dasha on 06.12.2015. + */ + +//Class for commandline parameters +public class Settings { + + @Parameter(names = {"-n"}, description = "Number of threads - a positive number" + , required = true) + private int numberOfThreads = 0; + + @Parameter(names = {"-h", "--help"}, help = true) + private boolean help = false; + + boolean isHelp() { + return help; + } + + int getNumberOfThreads() { + return numberOfThreads; + } + +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/ThreadsCounter/ThreadForCount.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/ThreadsCounter/ThreadForCount.java new file mode 100644 index 00000000..0a9f2bac --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/ThreadsCounter/ThreadForCount.java @@ -0,0 +1,36 @@ +package ru.fizteh.fivt.students.DariaZvereva.ThreadsCounter; + +/** + * Created by Dasha on 07.12.2015. + */ +public class ThreadForCount extends Thread { + + private static int numberOfThreads; + private int numberOfThisThread; + private static Object mutex = new Object(); + private static volatile int currentThread = 1; + + ThreadForCount(int n, int number) { + numberOfThisThread = n; + numberOfThreads = number; + } + + @Override + public void run() { + synchronized (mutex) { + while (true) { + if (currentThread == numberOfThisThread) { + System.out.println("Thread-" + currentThread); + currentThread %= numberOfThreads; + currentThread++; + mutex.notifyAll(); + } + try { + mutex.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/ThreadsCounter/ThreadsCounter.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/ThreadsCounter/ThreadsCounter.java new file mode 100644 index 00000000..37bb0bf1 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/ThreadsCounter/ThreadsCounter.java @@ -0,0 +1,41 @@ +package ru.fizteh.fivt.students.DariaZvereva.ThreadsCounter; + +import com.beust.jcommander.JCommander; + +import java.io.IOException; + +public class ThreadsCounter { + + private static int numberOfThreads; + public static void main(String[] args) throws IOException { + Settings settings = new Settings(); + JCommander cmd; + try { + cmd = new JCommander(settings, args); + } catch (Exception ex) { + cmd = new JCommander(settings, new String[] {"-h"}); + cmd.setProgramName("ThreadsCounter"); + cmd.usage(); + return; + } + if (settings.isHelp()) { + cmd.usage(); + return; + } + if (args.length == 0) { + throw new IOException(); + } + numberOfThreads = settings.getNumberOfThreads(); + if (numberOfThreads <= 0) { + cmd.usage(); + throw new IOException(); + } + createThreads(); + } + + public static void createThreads() { + for (int i = 1; i <= numberOfThreads; ++i) { + new ThreadForCount(i, numberOfThreads).start(); + } + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/CallingThreads.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/CallingThreads.java new file mode 100644 index 00000000..8538c177 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/CallingThreads.java @@ -0,0 +1,38 @@ +package ru.fizteh.fivt.students.DariaZvereva.TreadsRollCall; + +import java.util.Random; +import java.util.concurrent.BrokenBarrierException; + +public class CallingThreads extends Thread { + private boolean answer; + private Random random = new Random(); + private Controller controller; + + public CallingThreads(Controller cntrl) { + controller = cntrl; + } + + public boolean getAnswer() { + return answer; + } + + @Override + public void run() { + while (!controller.isFinish()) { + if (random.nextInt(10) != 1) { + answer = true; + System.out.println("YES"); + } else { + answer = false; + System.out.println("NO"); + } + try { + controller.getCyclicBarrier().await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (BrokenBarrierException e) { + e.printStackTrace(); + } + } + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/Controller.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/Controller.java new file mode 100644 index 00000000..d1819f24 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/Controller.java @@ -0,0 +1,51 @@ +package ru.fizteh.fivt.students.DariaZvereva.TreadsRollCall; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; + +public class Controller { + private int numberOfThreads = 0; + private List listOfThreads; + private CyclicBarrier cyclicBarrier; + private boolean finish = false; + + Controller(int n) { + numberOfThreads = n; + listOfThreads = new ArrayList<>(n); + cyclicBarrier = new CyclicBarrier(numberOfThreads + 1, new Runnable() { + @Override + public void run() { + finish = true; + for (int i = 0; i < listOfThreads.size(); ++i) { + finish &= listOfThreads.get(i).getAnswer(); + } + if (!finish) { + System.out.println("Are you ready?"); + } else { + return; + } + } + }); + } + + public boolean isFinish() { + return finish; + } + + public void start() throws BrokenBarrierException, InterruptedException { + System.out.println("Are you ready?"); + for (int i = 0; i < numberOfThreads; ++i) { + listOfThreads.add(new CallingThreads(this)); + listOfThreads.get(i).start(); + } + while (!finish) { + cyclicBarrier.await(); + } + } + + public CyclicBarrier getCyclicBarrier() { + return cyclicBarrier; + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/Settings.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/Settings.java new file mode 100644 index 00000000..56e7a0e7 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/Settings.java @@ -0,0 +1,26 @@ +package ru.fizteh.fivt.students.DariaZvereva.TreadsRollCall; + +import com.beust.jcommander.Parameter; + +/** + * Created by Dasha on 07.12.2015. + */ +//Class for commandline parameters +public class Settings { + + @Parameter(names = {"-n"}, description = "Number of threads - a positive number" + , required = true) + private int numberOfThreads = 0; + + @Parameter(names = {"-h", "--help"}, help = true) + private boolean help = false; + + boolean isHelp() { + return help; + } + + int getNumberOfThreads() { + return numberOfThreads; + } + +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/ThreadsRollCall.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/ThreadsRollCall.java new file mode 100644 index 00000000..087df3c5 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TreadsRollCall/ThreadsRollCall.java @@ -0,0 +1,36 @@ +package ru.fizteh.fivt.students.DariaZvereva.TreadsRollCall; + +import com.beust.jcommander.JCommander; + +import java.io.IOException; +import java.util.concurrent.BrokenBarrierException; + +public class ThreadsRollCall { + public static void main(String[] args) throws IOException, BrokenBarrierException, InterruptedException { + int numberOfThreads = 0; + Settings settings = new Settings(); + JCommander cmd; + try { + cmd = new JCommander(settings, args); + } catch (Exception ex) { + cmd = new JCommander(settings, new String[] {"-h"}); + cmd.setProgramName("ThreadsRollCall"); + cmd.usage(); + return; + } + if (settings.isHelp()) { + cmd.usage(); + return; + } + if (args.length == 0) { + throw new IOException(); + } + numberOfThreads = settings.getNumberOfThreads(); + if (numberOfThreads <= 0) { + cmd.usage(); + throw new IOException(); + } + Controller controller = new Controller(numberOfThreads); + controller.start(); + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/Declenser.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/Declenser.java new file mode 100644 index 00000000..c0c0ac89 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/Declenser.java @@ -0,0 +1,29 @@ +package ru.fizteh.fivt.students.DariaZvereva.TwitterStream; + +/** + * Created by Dasha on 11.10.2015. + */ + +public class Declenser { + + public static final long TEN = 10; + public static final long HUNDRED = 100; + public static final long ELEVEN = 11; + public static final long FIVE = 5; + public static final long FIFTEEN = 15; + + public static final String[] MINUTES = {" минуту ", " минуты ", " минут "}; + public static final String[] HOURS = {" час ", " часа ", " часов "}; + public static final String[] DAYS = {" день ", " дня ", " дней "}; + public static final String[] RETWEETS = {" ретвит)", " ретвита)", " ретвитов)"}; + + public static int strForm(long number) { + if (number % TEN == 1 && number % HUNDRED != ELEVEN) { + return 0; + } + if (number % TEN > 1 && number % TEN < FIVE && (number % HUNDRED < FIVE || number % HUNDRED > FIFTEEN)) { + return 1; + } + return 2; + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/GoogleGeoLocation.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/GoogleGeoLocation.java new file mode 100644 index 00000000..eb01bec1 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/GoogleGeoLocation.java @@ -0,0 +1,74 @@ +package ru.fizteh.fivt.students.DariaZvereva.TwitterStream; + +/** + * Created by Dasha on 11.10.2015. + */ +import com.google.maps.GeoApiContext; +import com.google.maps.GeocodingApi; +import com.google.maps.model.Bounds; +import com.google.maps.model.GeocodingResult; +import com.google.maps.model.LatLng; + +import java.io.IOException; + + +public class GoogleGeoLocation { + + private static final double RADIUS_OF_EARTH = 6371; + + private GeocodingResult[] result; + private double radius; + + GoogleGeoLocation(String place) throws Exception { + if (!place.equals("nearby")) { + String apiKey = getKeyFromProperties(); + GeoApiContext context = new GeoApiContext() + .setApiKey(apiKey); + result = GeocodingApi.geocode(context, place).await(); + radius = calculateRadius(); + } + } + + private String getKeyFromProperties() throws IOException { + /* Properties prop = new Properties(); + try (InputStream input = new FileInputStream("twitter4j.properties")) { + prop.load(input); + } catch (FileNotFoundException e) { + System.err.println("Can't find the file : " + e.getMessage()); + throw e; + } catch (IOException e) { + System.err.println("Can't read the file : " + e.getMessage()); + throw e; + } + return prop.getProperty("googleApiKey");*/ + return "AIzaSyDHGzGunBKJbqECUT0raxB0d-r1pe5bKx8"; + } + + public LatLng getLocation() { + return result[0].geometry.location; + } + + public double getRadius() { + return radius; + } + + private double calculateRadius() { + double phi1 = Math.toRadians(result[0].geometry.bounds.northeast.lat); + double phi2 = Math.toRadians(result[0].geometry.bounds.southwest.lat); + double dPhi = phi1 - phi2; + double lambda1 = Math.toRadians(result[0].geometry.bounds.northeast.lng); + double lambda2 = Math.toRadians(result[0].geometry.bounds.southwest.lng); + double dLambda = lambda1 - lambda2; + + double a = Math.sin(dPhi / 2) * Math.sin(dPhi / 2) + + Math.cos(phi1) * Math.cos(phi2) + * Math.sin(dLambda / 2) * Math.sin(dLambda / 2); + double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + double distance = RADIUS_OF_EARTH * c; + return distance / 2; + } + + public final Bounds getBounds() { + return result[0].geometry.bounds; + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/Settings.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/Settings.java new file mode 100644 index 00000000..891b043f --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/Settings.java @@ -0,0 +1,76 @@ +package ru.fizteh.fivt.students.DariaZvereva.TwitterStream; + +import com.beust.jcommander.Parameter; + +/** + * Created by Dasha on 11.10.2015. + */ +//Class for commandline parameters +public class Settings { + + @Parameter(names = {"-q", "--query"}, description = "Query or keywords" + + " for stream", required = true) + private String query = ""; + + @Parameter(names = {"-p", "--place"}, description = "Place") + private String place = ""; + + @Parameter(names = {"-s", "--stream"}, description = "Twitterstream") + private boolean stream = false; + + @Parameter(names = "--hideRetweets", description = "Don`t show retweets") + private boolean hideRetweets = false; + + @Parameter(names = {"-l", "--limit"}, description = "Number of tweets") + private Integer limit = Integer.MAX_VALUE; + + @Parameter(names = {"-h", "--help"}, help = true) + private boolean help = false; + + public boolean isHelp() { + return help; + } + + public boolean isRetweetsHidden() { + return hideRetweets; + } + + public boolean isStream() { + return stream; + } + + public int getLimit() { + return limit; + } + + public String getPlace() { + return place; + } + + public String getQuery() { + return query; + } + + + public void setQuery(String query) { + this.query = query; + } + + public void setRetweetsHidden(boolean flag) { + hideRetweets = flag; + } + + public void setStream(boolean flag) { + this.stream = flag; + } + + public void setLimit(Integer n) { + this.limit = n; + } + + public void setPlace(String placeName) { + place = placeName; + } + +} + diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/TimePrinter.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/TimePrinter.java new file mode 100644 index 00000000..1726b5b7 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/TimePrinter.java @@ -0,0 +1,50 @@ +package ru.fizteh.fivt.students.DariaZvereva.TwitterStream; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.Date; + +public class TimePrinter { + + public static String printTime(long tweetTimeToFormat, long currentTimeToFormat) { + + Declenser timeDeclension = new Declenser(); + + LocalDateTime currentTime = new Date(currentTimeToFormat).toInstant() + .atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime tweetTime = new Date(tweetTimeToFormat).toInstant() + .atZone(ZoneId.systemDefault()).toLocalDateTime(); + + + if (ChronoUnit.MINUTES.between(tweetTime, currentTime) < 2) { + return "только что"; + } else { + if (ChronoUnit.HOURS.between(tweetTime, currentTime) < 1) { + return new StringBuilder().append(ChronoUnit.MINUTES.between(tweetTime, currentTime)) + .append(timeDeclension.MINUTES[timeDeclension.strForm( + ChronoUnit.MINUTES.between(tweetTime, currentTime))]) + .append("назад").toString(); + } else { + if (ChronoUnit.DAYS.between(tweetTime, currentTime) < 1) { + return new StringBuilder().append(ChronoUnit.HOURS.between(tweetTime, currentTime)) + .append(timeDeclension.HOURS[timeDeclension.strForm( + ChronoUnit.HOURS.between(tweetTime, currentTime))]) + .append("назад").toString(); + } else { + LocalDateTime tweetDateTime = tweetTime.toLocalDate().atStartOfDay(); + LocalDateTime currentDateTime = currentTime.toLocalDate().atStartOfDay(); + if (ChronoUnit.DAYS.between(tweetDateTime, currentDateTime) == 1) { + return "вчера"; + } else { + return new StringBuilder().append(ChronoUnit.DAYS.between(tweetDateTime, currentDateTime)) + .append(timeDeclension.DAYS[timeDeclension.strForm( + ChronoUnit.DAYS.between(tweetDateTime, currentDateTime))]) + .append("назад").toString(); + } + } + } + } + } + +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/TwitterStream.java b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/TwitterStream.java new file mode 100644 index 00000000..ac64fa3c --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/TwitterStream.java @@ -0,0 +1,164 @@ +package ru.fizteh.fivt.students.DariaZvereva.TwitterStream; + +/** + * Created by Dasha on 22.09.2015. + */ + +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 { + + Settings settings = new Settings(); + JCommander cmd; + try { + cmd = new JCommander(settings, args); + } catch (Exception ex) { + cmd = new JCommander(settings, new String[] {"-h"}); + cmd.setProgramName("TwitterStream"); + cmd.usage(); + return; + } + if (settings.isHelp()) { + cmd.usage(); + return; + } + if (settings.isStream()) { + streamPrint(settings); + } else { + print(settings); + } + } + + public static void printTime(Status status) { + TimePrinter printer = new TimePrinter(); + System.out.print(new StringBuilder().append("[") + .append(printer.printTime(status.getCreatedAt().getTime(), System.currentTimeMillis())).append("]")); + } + + public static void printRetweetsCount(Status status) { + Declenser retweetDeclension = new Declenser(); + System.out.println(new StringBuilder().append("(").append(status.getRetweetCount()) + .append(retweetDeclension.RETWEETS[retweetDeclension.strForm(status.getRetweetCount())]).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(); + } + + //Twitter Stream + public static void streamPrint(Settings settings) + 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 (!settings.isRetweetsHidden()) { + printRetweet(status); + } + } + } + }; + twitterStream.addListener(listener); + if (settings.getQuery() == "" && settings.getPlace() == "") { + twitterStream.sample(); + } else { + FilterQuery filter; + //set filter + String[] track = new String[1]; + track[0] = settings.getQuery(); + filter = new FilterQuery(0, new long[0], track); + if (!settings.getPlace().equals("")) { + GoogleGeoLocation findPlace; + findPlace = new GoogleGeoLocation((settings.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); + } + } + + //Search + public static void print(Settings settings) { + Twitter twitter = new TwitterFactory().getInstance(); + try { + Query query = new Query(settings.getQuery()); + if (!settings.getPlace().equals("")) { + if (!settings.getPlace().equals("nearby")) { + GoogleGeoLocation googleFindPlace; + googleFindPlace = new GoogleGeoLocation(settings.getPlace()); + GeoLocation geoLocation; + geoLocation = new GeoLocation(googleFindPlace.getLocation().lat, + googleFindPlace.getLocation().lng); + query.setGeoCode(geoLocation, + googleFindPlace.getRadius(), Query.KILOMETERS); + + } + } + query.setCount(settings.getLimit()); + QueryResult result; + result = twitter.search(query); + List tweets = result.getTweets(); + if (tweets.isEmpty()) { + System.out.println("По данному запросу не найдено результатов"); + return; + } + for (Status tweet : tweets) { + Thread.sleep(PAUSE); + if (!tweet.isRetweet()) { + printTime(tweet); + printTweet(tweet); + printRetweetsCount(tweet); + System.out.println(); + } else { + if (!settings.isRetweetsHidden()) { + printTime(tweet); + printRetweet(tweet); + } + } + } + } catch (TwitterException te) { + te.printStackTrace(); + System.out.println("Failed to search tweets: " + te.getMessage()); + System.exit(-1); + } catch (InterruptedException e) { + e.printStackTrace(); + System.out.println(e.getMessage()); + System.exit(-1); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/cat.exe.stackdump b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/cat.exe.stackdump new file mode 100644 index 00000000..5bc97078 --- /dev/null +++ b/DariaZvereva/src/main/java/ru/fizteh/fivt/students/DariaZvereva/cat.exe.stackdump @@ -0,0 +1,17 @@ +MSYS-1.0.12 Build:2012-07-05 14:56 +Exception: STATUS_ACCESS_VIOLATION at eip=007E8DAA +eax=680A38E4 ebx=68570B14 ecx=00422A2C edx=00000148 esi=00000000 edi=685700D4 +ebp=0029FE90 esp=0029FE6C program=C:\Program Files (x86)\Git\bin\cat.exe +cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B +Stack trace: +Frame Function Args +0029FE90 007E8DAA (685700D4, 00000148, 00000003, 007E44EA) +0029FEE0 007E466B (00000000, EECB7FAB, 0029FF20, 00405894) +0029FF00 007E4C5F (00401BB0, 00401000, 00000000, 00000000) +0029FF20 007E4C98 (00000000, 00000000, 00000000, 00000000) +0029FF50 004057A4 (00401BB0, 00000000, 00000000, 00000000) +0029FF80 0040103D (7FFDE000, 74473720, B8BFFCAF, 0029FFDC) +0029FF94 74473744 (7FFDE000, 47BF08AF, 00000000, 00000000) +0029FFDC 770D9CD4 (FFFFFFFF, 770FD4B7, 00000000, 00000000) +0029FFEC 770D9C9F (00401000, 7FFDE000, 00000000, 78746341) +End of stack trace \ No newline at end of file diff --git a/DariaZvereva/src/test/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/DeclenserTest.java b/DariaZvereva/src/test/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/DeclenserTest.java new file mode 100644 index 00000000..73b683de --- /dev/null +++ b/DariaZvereva/src/test/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/DeclenserTest.java @@ -0,0 +1,42 @@ +package ru.fizteh.fivt.students.DariaZvereva.TwitterStream; + +import junit.framework.TestCase; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.HashMap; +import java.util.Map; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +/** + * Created by Dasha on 05.11.2015. + */ +@RunWith(MockitoJUnitRunner.class) +public class DeclenserTest extends TestCase { + + public static final int NUMBER_OF_TESTS = 30; + public static final Integer DIFFERENCE = 100; + + @Test + public void declenserTest() throws Exception{ + Map answers = new HashMap<>(); + answers.put(1, 0); + answers.put(2, 1); + answers.put(5, 2); + answers.put(9, 2); + answers.put(12, 2); + answers.put(111, 2); + answers.put(51, 0); + answers.put(123, 1); + answers.put(102, 1); + + for(Integer number : answers.keySet()) { + for (int i = 0; i < NUMBER_OF_TESTS; ++i) { + assertThat(Declenser.strForm(number + i * DIFFERENCE), is(answers.get(number))); + } + } + } +} diff --git a/DariaZvereva/src/test/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/GoogleGeoLocationTest.java b/DariaZvereva/src/test/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/GoogleGeoLocationTest.java new file mode 100644 index 00000000..1c324660 --- /dev/null +++ b/DariaZvereva/src/test/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/GoogleGeoLocationTest.java @@ -0,0 +1,30 @@ +package ru.fizteh.fivt.students.DariaZvereva.TwitterStream; + +import junit.framework.TestCase; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +/** + * Created by Dasha on 18.12.2015. + */ +@RunWith(MockitoJUnitRunner.class) +public class GoogleGeoLocationTest extends TestCase { + static final double LATITUDEMoscow = 55.755826; + static final double LONGTITUDEMoscow = 37.6173; + static final double LATITUDEOrsk = 51.20487; + static final double LONGTITUDEOrsk = 58.56685; + + @Test + public void GeoLocationTest() throws Exception { + GoogleGeoLocation location; + + location = new GoogleGeoLocation("Moscow"); + assert (LATITUDEMoscow == + Math.rint(location.getLocation().lat * 1000000.0) + / 1000000.0); + assert (LONGTITUDEMoscow == + Math.rint(location.getLocation().lng * 1000000.0) + / 1000000.0); + } +} \ No newline at end of file diff --git a/DariaZvereva/src/test/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/TimePrinterTest.java b/DariaZvereva/src/test/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/TimePrinterTest.java new file mode 100644 index 00000000..794578ed --- /dev/null +++ b/DariaZvereva/src/test/java/ru/fizteh/fivt/students/DariaZvereva/TwitterStream/TimePrinterTest.java @@ -0,0 +1,43 @@ +package ru.fizteh.fivt.students.DariaZvereva.TwitterStream; + +import junit.framework.TestCase; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +import java.time.LocalDate; +import java.time.Month; +import java.time.ZoneId; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +/** + * Created by Dasha on 10.11.2015. + */ +@RunWith(MockitoJUnitRunner.class) +public class TimePrinterTest extends TestCase { + @Test + public void timePrinterTest() { + assertThat(TimePrinter.printTime(LocalDate.of(2015, Month.DECEMBER, 17).atTime(23, 59, 59) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(), + LocalDate.of(2015, Month.DECEMBER, 18).atTime(0, 0, 0) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()), is("только что")); + assertThat(TimePrinter.printTime(LocalDate.of(2015, Month.DECEMBER, 17).atTime(0, 0, 1) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(), + LocalDate.of(2015, Month.DECEMBER, 18).atTime(0, 0, 0) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()), is("23 часа назад")); + assertThat(TimePrinter.printTime(LocalDate.of(2015, Month.DECEMBER, 17).atTime(0, 0, 1) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(), + LocalDate.of(2015, Month.DECEMBER, 18).atTime(0, 0, 2) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()), is("вчера")); + assertThat(TimePrinter.printTime(LocalDate.of(2015, Month.DECEMBER, 17).atTime(23, 59, 59) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(), + LocalDate.of(2015, Month.DECEMBER, 18).atTime(0, 2, 0) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()), is("2 минуты назад")); + assertThat(TimePrinter.printTime(LocalDate.of(2015, Month.DECEMBER, 17).atTime(23, 59, 59) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(), + LocalDate.of(2015, Month.DECEMBER, 19).atTime(0, 0, 0) + .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()), is("2 дня назад")); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index a2fdfbd2..5dd8bffb 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ + DariaZvereva egiby akormushin