Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
b1d20ab
Task 3 finished
yarosl4v Nov 22, 2016
d665de2
Task 3 completed
yarosl4v Nov 22, 2016
bb3d94c
Task 3 completed
yarosl4v Nov 22, 2016
2e251a7
Implementation based on cache
yarosl4v Nov 22, 2016
462bf09
Little fix
yarosl4v Nov 22, 2016
8dc4a5a
Guava cache added
yarosl4v Nov 23, 2016
132f443
Some fixes
yarosl4v Nov 26, 2016
2629413
Logic fixes
yarosl4v Nov 26, 2016
a976d6d
modifying queries maintenance
yarosl4v Nov 28, 2016
282558d
unused imports reduced
yarosl4v Nov 28, 2016
d4506b8
one more change..
yarosl4v Nov 28, 2016
9945a32
time boost
yarosl4v Nov 28, 2016
88e35f2
proposed changes made
yarosl4v Nov 28, 2016
d069165
little fix
yarosl4v Nov 28, 2016
cd1f67a
last update
yarosl4v Nov 28, 2016
68f1cae
Task 3 finished
yarosl4v Nov 22, 2016
cc4699a
Task 3 completed
yarosl4v Nov 22, 2016
0c2aa38
Task 3 completed
yarosl4v Nov 22, 2016
c437248
Implementation based on cache
yarosl4v Nov 22, 2016
473aaef
Little fix
yarosl4v Nov 22, 2016
69e58a3
Guava cache added
yarosl4v Nov 23, 2016
e91dd4e
Some fixes
yarosl4v Nov 26, 2016
4516fe5
Logic fixes
yarosl4v Nov 26, 2016
a6663e2
modifying queries maintenance
yarosl4v Nov 28, 2016
5ebb5fd
unused imports reduced
yarosl4v Nov 28, 2016
7a33651
one more change..
yarosl4v Nov 28, 2016
6320c23
time boost
yarosl4v Nov 28, 2016
9d56185
proposed changes made
yarosl4v Nov 28, 2016
e6879e0
little fix
yarosl4v Nov 28, 2016
ef122aa
last update
yarosl4v Nov 28, 2016
4052bf7
applied proposed recommendations
yarosl4v Nov 28, 2016
a67ce89
bug fix
yarosl4v Nov 28, 2016
52b3176
changed constants
yarosl4v Nov 30, 2016
7392232
Merge branch 'master' of https://github.com/fediq/mipt-java-2016
yarosl4v Dec 4, 2016
369e713
changes to make pr mergeable
yarosl4v Dec 7, 2016
2a3669e
Merge branch 'master' of https://github.com/fediq/mipt-java-2016
yarosl4v Dec 11, 2016
1a953ad
first advances
yarosl4v Dec 16, 2016
729dcf1
Database handling
yarosl4v Dec 18, 2016
075ba37
fix
yarosl4v Dec 18, 2016
16817b1
Update README.md
yarosl4v Dec 18, 2016
a56520d
Update README.md
yarosl4v Dec 18, 2016
663b34d
added all standard functions
yarosl4v Dec 18, 2016
330a846
Merge branch 'master' of https://github.com/mountain-viewer/mipt-java…
yarosl4v Dec 18, 2016
1e8f059
style fixes
yarosl4v Dec 18, 2016
0ce6e72
once again check fixes
yarosl4v Dec 18, 2016
97adc68
readme.md updated
yarosl4v Dec 18, 2016
1ca0882
readme.md updated
yarosl4v Dec 18, 2016
9babca2
resolute changes
yarosl4v Dec 19, 2016
7e190e2
simplified sample
yarosl4v Dec 20, 2016
e6a31f3
changed example
yarosl4v Dec 20, 2016
fe74464
remove wrong release date
yarosl4v Dec 20, 2016
661d46a
after @ignorer recommendations
yarosl4v Dec 20, 2016
a94b977
log changes
yarosl4v Dec 21, 2016
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
38 changes: 38 additions & 0 deletions homework-g597-spirin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@

<artifactId>homework-g597-spirin</artifactId>

<properties>
<spring.boot.version>1.4.2.RELEASE</spring.boot.version>
</properties>

<dependencies>
<dependency>
<groupId>ru.mipt.java2016</groupId>
Expand All @@ -30,6 +34,40 @@
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>

<dependency>
<groupId>ru.mipt.java2016</groupId>
<artifactId>homework-tests</artifactId>
<version>1.0.0</version>
<scope>test</scope>
</dependency>

</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package ru.mipt.java2016.homework.g597.spirin.task4;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import ru.mipt.java2016.homework.base.task1.Calculator;

/**
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну хоть бы коммент удалил при копипасте :)

* Created by whoami on 12/13/16.
*/

@EnableAutoConfiguration
@Configuration
@ComponentScan(basePackageClasses = Application.class)
public class Application {

@Bean
public Calculator calculator() {
return new Evaluator();
}

@Bean
public EmbeddedServletContainerCustomizer customizer(
@Value("${ru.mipt.java2016.homework.g597.spirin.task4.httpPort:9001}") int port) {
return container -> container.setPort(port);
}

public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.setBannerMode(Banner.Mode.OFF);
application.run(args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
package ru.mipt.java2016.homework.g597.spirin.task4;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
* Created by whoami on 12/13/16.
*/

@Repository
public class BillingDao {
private static final Logger LOG = LoggerFactory.getLogger(BillingDao.class);

@Autowired
private DataSource dataSource;

private JdbcTemplate jdbcTemplate;

@PostConstruct
public void postConstruct() {
jdbcTemplate = new JdbcTemplate(dataSource, false);
initSchema();
}

public void initSchema() {
LOG.info("Initializing schema");
jdbcTemplate.execute("CREATE SCHEMA IF NOT EXISTS billing");

// User table
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.users " +
"(username VARCHAR PRIMARY KEY, password VARCHAR)");

// Update initial (username, password)
jdbcTemplate.execute("DELETE FROM billing.users WHERE username = 'username'");
jdbcTemplate.execute("INSERT INTO billing.users VALUES ('username', 'password')");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно было бы использовать MERGE


// Variable table
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.variables " +
"(username VARCHAR, variable VARCHAR, value FLOAT)");

// Function table
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.functions " +
"(username VARCHAR, function VARCHAR, arity INTEGER, body VARCHAR)");
}

// Load user from user table
public BillingUser loadUser(String username) throws EmptyResultDataAccessException {
LOG.info("Querying for user " + username);
return jdbcTemplate.queryForObject(
"SELECT username, password FROM billing.users WHERE username = ?",
new Object[]{username},
new RowMapper<BillingUser>() {
@Override
public BillingUser mapRow(ResultSet rs, int rowNum) throws SQLException {
return new BillingUser(
rs.getString("username"),
rs.getString("password")
);
}
}
);
}

// Put user into user table
public void putUser(String username, String password) {
LOG.info("Putting user (username, password) into table");
jdbcTemplate.execute("INSERT INTO billing.users VALUES ('"
+ username + "', '" + password + "')");
}

// Get value of variable of particular user
public Double getVariable(String username, String variable) throws EmptyResultDataAccessException {
LOG.info("Querying for variable " + variable + " of user " + username);
return jdbcTemplate.queryForObject(
"SELECT value FROM billing.variables WHERE username = '" + username +
"' AND variable = '" + variable + "'",
new Double[]{},
new RowMapper<Double>() {
@Override
public Double mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Double(
rs.getString("value").toString()
);
}
}
);
}

// Put variable of particular user
public void putVariable(String username, String variable, Double value) {
LOG.info("Putting variable " + variable + " of user " + username);
deleteVariable(username, variable);
jdbcTemplate.execute("INSERT INTO billing.variables VALUES ('"
+ username + "', '" + variable + "', " + value.toString() + ")");
}

// Delete variable of particular user
public void deleteVariable(String username, String variable) {
LOG.info("Deleting variable " + variable + " of user " + username);
jdbcTemplate.execute("DELETE FROM billing.variables WHERE username = '"
+ username + "' AND variable = '" + variable + "'");
}

// Get all variables from the service of particular user
public String[] getAllVariables(String username) {
LOG.info("Querying for all variables of user " + username);

List queryResult = jdbcTemplate.queryForList(
"SELECT variable FROM billing.variables WHERE username = '" +
username + "'");

String[] variables = new String[queryResult.size()];

for (int i = 0; i < queryResult.size(); ++i) {
variables[i] = queryResult.get(i).toString();
}

return variables;
}

// Get function of particular user
public String getFunction(String username, String function) {
LOG.info("Querying for function " + function + " of user " + username);
return jdbcTemplate.queryForObject(
"SELECT body FROM billing.functions WHERE username = '" + username +
"' AND function = '" + function + "'",
new String[]{},
new RowMapper<String>() {
@Override
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs.getString("body");
}
}
);
}

// Put function of particular user
public void putFunction(String username, String function, Integer arity, String body) {
LOG.info("Putting function " + function + " of user " + username);
deleteFunction(username, function);
jdbcTemplate.execute("INSERT INTO billing.functions VALUES ('"
+ username + "', '" + function + "', " + arity.toString() + ", '"
+ body + "')");
}

// Delete function of particular user
public void deleteFunction(String username, String function) {
LOG.info("Deleting function " + function + " of user " + username);
jdbcTemplate.execute("DELETE FROM billing.functions WHERE username = '" +
username + "' AND function = '" + function + "'");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package ru.mipt.java2016.homework.g597.spirin.task4;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
* Created by whoami on 12/13/16.
*/

@Configuration
public class BillingDatabaseConfiguration {
@Bean
public DataSource billingDataSource(
@Value("jdbc:h2:mem:testdb") String jdbcUrl,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно создать в main/resources файл application.properties, в который положить вот это значение. То же касается и следующих двух строк, только там выставлены пустые значения по умолчанию.

@Value("${ru.mipt.java2016.homework.g597.spirin.task4.username:}") String username,
@Value("${ru.mipt.java2016.homework.g597.spirin.task4.password:}") String password
) {
HikariConfig config = new HikariConfig();
config.setDriverClassName(org.h2.Driver.class.getName());
config.setJdbcUrl(jdbcUrl);
config.setUsername(username);
config.setPassword(password);
return new HikariDataSource(config);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package ru.mipt.java2016.homework.g597.spirin.task4;

/**
* Created by whoami on 12/13/16.
*/

public class BillingUser {
private final String username;
private final String password;

public BillingUser(String username, String password) {
if (username == null) {
throw new IllegalArgumentException("Null username is not allowed");
}
if (password == null) {
throw new IllegalArgumentException("Null password is not allowed");
}
this.username = username;
this.password = password;
}

public String getUsername() {
return username;
}

public String getPassword() {
return password;
}

@Override
public String toString() {
return "BillingUser{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}

BillingUser that = (BillingUser) o;

if (!username.equals(that.username)) {
return false;
}
return password.equals(that.password);

}

@Override
public int hashCode() {
int result = username.hashCode();
result = 31 * result + password.hashCode();
return result;
}
}

Loading