diff --git a/homework-g594-shevkunov/pom.xml b/homework-g594-shevkunov/pom.xml
index cf6cbf5d1..c62bb52f4 100644
--- a/homework-g594-shevkunov/pom.xml
+++ b/homework-g594-shevkunov/pom.xml
@@ -12,6 +12,10 @@
homework-g594-shevkunov
1.0.0
+
+ 1.4.2.RELEASE
+
+
ru.mipt.java2016
@@ -29,6 +33,32 @@
guava
20.0
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${spring.boot.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+ ${spring.boot.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+ ${spring.boot.version}
+
+
+ com.zaxxer
+ HikariCP
+ 2.5.1
+
+
+ com.h2database
+ h2
+ 1.4.193
+
+
\ No newline at end of file
diff --git a/homework-g594-shevkunov/src/main/java/ru/mipt/java2016/homework/g594/shevkunov/task1/PolishCalculator.java b/homework-g594-shevkunov/src/main/java/ru/mipt/java2016/homework/g594/shevkunov/task1/PolishCalculator.java
index 6778fdebc..65272ee6b 100644
--- a/homework-g594-shevkunov/src/main/java/ru/mipt/java2016/homework/g594/shevkunov/task1/PolishCalculator.java
+++ b/homework-g594-shevkunov/src/main/java/ru/mipt/java2016/homework/g594/shevkunov/task1/PolishCalculator.java
@@ -11,7 +11,7 @@
* Evaluates a value from expressing
* Created by shevkunov on 04.10.16.
*/
-class PolishCalculator implements Calculator {
+public class PolishCalculator implements Calculator {
private Stack valStack = new Stack<>();
private Stack operStack = new Stack<>();
private StringBuilder buffer = new StringBuilder();
diff --git a/homework-g594-shevkunov/src/main/java/ru/mipt/java2016/homework/g594/shevkunov/task4/BillingDao.java b/homework-g594-shevkunov/src/main/java/ru/mipt/java2016/homework/g594/shevkunov/task4/BillingDao.java
new file mode 100644
index 000000000..f01caf81f
--- /dev/null
+++ b/homework-g594-shevkunov/src/main/java/ru/mipt/java2016/homework/g594/shevkunov/task4/BillingDao.java
@@ -0,0 +1,205 @@
+package ru.mipt.java2016.homework.g594.shevkunov.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.*;
+
+@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.trace("Initializing schema");
+ jdbcTemplate.execute("CREATE SCHEMA IF NOT EXISTS billing");
+
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.users " +
+ "(username VARCHAR PRIMARY KEY, password VARCHAR, enabled BOOLEAN)");
+
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.vars " +
+ "(variable VARCHAR PRIMARY KEY, username VARCHAR," + //TODO FOREIGN KEY
+ " value VARCHAR)");
+
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.funcs " +
+ "(function VARCHAR, username VARCHAR," + //TODO FOREIGN KEY
+ "args VARCHAR, value VARCHAR)");
+
+ jdbcTemplate.execute("DELETE FROM billing.users WHERE username = 'username'");
+ jdbcTemplate.execute("DELETE FROM billing.users WHERE username = 'sudoname'");
+ jdbcTemplate.update("INSERT INTO billing.users VALUES ('username', 'password', TRUE) ");
+ jdbcTemplate.update("INSERT INTO billing.users VALUES ('sudoname', 'aptitude', TRUE) ");
+ }
+
+
+ public BillingUser loadUser(String username) throws EmptyResultDataAccessException {
+ LOG.trace("Querying for user " + username);
+ return jdbcTemplate.queryForObject(
+ "SELECT username, password, enabled FROM billing.users WHERE username = ?",
+ new Object[]{username},
+ new RowMapper() {
+ @Override
+ public BillingUser mapRow(ResultSet rs, int rowNum) throws SQLException {
+ return new BillingUser(
+ rs.getString("username"),
+ rs.getString("password"),
+ rs.getBoolean("enabled")
+ );
+ }
+ }
+ );
+ }
+
+ /** Variable functions */
+ public void setVariable(String username, String variable, String value) {
+ LOG.trace("Setting variable " + variable + " for user " + username);
+ delVariable(username, variable);
+ String querry = "INSERT INTO billing.vars VALUES ('" + variable + "','" + username + "','" + value + "')";
+ jdbcTemplate.execute(querry);
+ }
+
+ public String getVariable(String username, String variable) {
+ LOG.trace("Getting variable " + variable + " for user " + username);
+ String querry = "SELECT value FROM billing.vars WHERE username = '" +
+ username + "' AND variable = '" + variable + "'";
+ return jdbcTemplate.queryForObject(
+ querry,
+ new RowMapper() {
+ @Override
+ public String mapRow(ResultSet rs, int rowNum) throws SQLException {
+ return rs.getString("value");
+ }
+ }
+ );
+ }
+
+ public List getAllVariableNames(String username) {
+ LOG.trace("Getting all variables for user " + username);
+ String querry = "SELECT variable FROM billing.vars WHERE username = '" + username + "'";
+
+ List vars = new ArrayList();
+
+ List