Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions projects/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
.DS_Store
*.class
*.jar
*.war
*.ear
*.class
hs_err_pid*
.idea
*.iml
*.ipr
out
build
bin
target
.classpath
.project
workbench.xmi
*.swp
.settings
.checkstyle
.properties
1 change: 1 addition & 0 deletions projects/geolocation.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
key=AIzaSyCltC9cSKnrnqOApw5TQ155nwEBW-ZUt1E
Empty file.
21 changes: 21 additions & 0 deletions projects/glutolik/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
.DS_Store
*.class
*.jar
*.war
*.ear
*.class
hs_err_pid*
.idea
*.iml
*.ipr
out
build
bin
target
.classpath
.project
workbench.xmi
*.swp
.settings
.checkstyle
*.properties
100 changes: 100 additions & 0 deletions projects/glutolik/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>ru.mipt.diht.students</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>ru.mipt.diht.students</groupId>
<artifactId>glutolik</artifactId>
<version>1.0-SNAPSHOT</version>
<name>glutolik</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-core</artifactId>
<version>[4.0,)</version>
</dependency>

<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-stream</artifactId>
<version>[4.0,)</version>
</dependency>

<dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
<version>1.48</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.google.maps</groupId>
<artifactId>google-maps-services</artifactId>
<version>0.1.1</version>
</dependency>

<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>

<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>com.tngtech.java</groupId>
<artifactId>junit-dataprovider</artifactId>
<version>1.10.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
package ru.mipt.diht.students.glutolik.MiniORM;

import javafx.util.Pair;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
* Created by glutolik on 18.12.15.
*/
public class DatabaseService<T> {
static final String UNNAMED = "";

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table {
String name() default UNNAMED;
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column {
String name() default UNNAMED;

String type();
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface PrimaryKey {
}

private static final String DATABASE_PATH = "jdbc:h2:./simple_database";
private StatementConstructor<T> statementBuilder = null;
private String tableName = null;
private List<TColumn> columnList = null;
private TColumn primaryKey = null;
private Class itemsClass;

public DatabaseService(Class newItemsClass) throws IllegalArgumentException {
itemsClass = newItemsClass;
tableName = DatabaseServiceUtils.getTableName(itemsClass);
Pair<List<TColumn>, TColumn> pair = DatabaseServiceUtils.analyseColumns(itemsClass);
columnList = pair.getKey();
primaryKey = pair.getValue();
statementBuilder = new StatementConstructor(tableName, columnList,
primaryKey, itemsClass);
}

public final StatementConstructor<T> getStatementBuilder() {
return statementBuilder;
}

@FunctionalInterface
public interface CheckedFunction<T, R> {
R apply(T t) throws SQLException, IllegalStateException;
}

// Осуществляет указанное действие с базой данных.
private <R> R databaseRequest(CheckedFunction<Statement, R> action) {
try (Connection connection = DriverManager.getConnection(DATABASE_PATH)) {
Statement statement = connection.createStatement();
return action.apply(statement);
} catch (SQLException e) {
throw new IllegalStateException("An SQL error occurred: " + e.getMessage());
}
}

public final void createTable() {
databaseRequest((Statement statement) -> {
statement.execute(statementBuilder.buildCreate());
if (primaryKey != null) {
statement.execute("ALTER TABLE " + tableName + " ADD PRIMARY KEY (" + primaryKey.getName() + ")");
System.err.println("PK успешно добавлен.");
}
return true;
});
}

public final void dropTable() {
databaseRequest((Statement statement) -> {
statement.execute("DROP TABLE IF EXISTS " + tableName);
return true;
});
}

public final void insert(T newItem) {
int added = databaseRequest(
(Statement statement) -> statement.executeUpdate(statementBuilder.buildInsert(newItem))
);

if (added != 0) {
System.err.println("Элемент успешно добавлен.");
}
}

public final List<T> queryForAll() {
List<T> allItems = databaseRequest((Statement statement) -> {
ResultSet resultSet = statement.executeQuery("SELECT * FROM " + tableName);
// Обрабатываем полученные результаты.
List<T> selectAllList = new ArrayList<>();
while (resultSet.next()) {
T item = DatabaseServiceUtils.createItemFromSqlResult(resultSet, columnList, itemsClass);
selectAllList.add(item);
}
return selectAllList;
});
System.err.println("Get all items: " + allItems);
return allItems;
}

public final <K> T queryById(K key) {
T itemById = databaseRequest((Statement statement) -> {
ResultSet resultSet = statement.executeQuery("SELECT * FROM " + tableName
+ " WHERE " + primaryKey.getName() + "=" + DatabaseServiceUtils.getSqlValue(key));
// Обрабатываем полученный результат.
T item = null;
if (resultSet.next()) {
item = DatabaseServiceUtils.createItemFromSqlResult(resultSet, columnList, itemsClass);
}
if (resultSet.next()) {
throw new IllegalStateException("Primary key search result is not single");
}
return item;
});
System.err.println("Get item by ID: " + itemById);
return itemById;
}

public final void update(T item) {
databaseRequest((Statement statement) -> {
statement.execute(statementBuilder.buildUpdate(item));
return true;
});
}

public final <K> void delete(K key) {
databaseRequest((Statement statement) -> {
statement.execute("DELETE FROM " + tableName + " WHERE "
+ primaryKey.getName() + "=" + DatabaseServiceUtils.getSqlValue(key));
return true;
});
}
}

Loading