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
31 changes: 31 additions & 0 deletions homework-g596-gerasimov/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@
<modelVersion>4.0.0</modelVersion>

<artifactId>homework-g596-gerasimov</artifactId>

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

<dependencies>
<dependency>
<groupId>ru.mipt.java2016</groupId>
Expand All @@ -27,6 +32,32 @@
<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>
</dependencies>


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package ru.mipt.java2016.homework.g596.gerasimov.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.g596.gerasimov.task4.NewCalculator.NewCalculator;

/**
* curl http://localhost:9001/eval \
* -X POST \
* -H "Content-Type: text/plain" \
* -H "Authorization: Basic $(echo -n "username:password" | base64)" \
* --data-raw "44*3+2"
*/
@EnableAutoConfiguration
@Configuration
@ComponentScan(basePackageClasses = Application.class)
public class Application {

@Bean
public NewCalculator calculator() {
return new NewCalculator();
}

@Bean
public EmbeddedServletContainerCustomizer customizer(
@Value("${ru.mipt.java2016.homework.g596.gerasimov.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,223 @@
package ru.mipt.java2016.homework.g596.gerasimov.task4;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Vector;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

@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("DROP SCHEMA IF EXISTS billing");
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.variables "
+ "(username VARCHAR, name VARCHAR, value DOUBLE, expression VARCHAR,"
+ " CONSTRAINT PK_variable PRIMARY KEY (username, name))");
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.functions "
+ "(username VARCHAR, name VARCHAR, args VARCHAR, expression VARCHAR,"
+ " CONSTRAINT PK_function PRIMARY KEY (username, name))");
jdbcTemplate.execute("DELETE FROM billing.users WHERE username = 'username'");
jdbcTemplate.update("INSERT INTO billing.users VALUES ('username', 'password', 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<BillingUser>() {
@Override
public BillingUser mapRow(ResultSet rs, int rowNum) throws SQLException {
return new BillingUser(rs.getString("username"), rs.getString("password"),
rs.getBoolean("enabled"));
}
});
}

public boolean addUser(String username, String password) {
LOG.trace("Adding user " + username);
try {
jdbcTemplate.update("INSERT INTO billing.users VALUES ('" + username + "', '" + password
+ "', TRUE)");
} catch (DuplicateKeyException exception) {
LOG.debug(exception.getMessage());
return false;
}
LOG.trace("User " + username + " was successfully added");
return true;
}

public boolean addVariable(BillingVariable variable) {
try {
jdbcTemplate.update("Insert INTO billing.variables VALUES ('" + variable.getUsername()
+ "', '" + variable.getName() + "', " + variable.getValue() + ", '" + variable
.getExpression() + "')");
} catch (DuplicateKeyException exception) {
LOG.debug(exception.getMessage());
return false;
}
return true;
}

public BillingVariable getVariable(String username, String name) {
LOG.trace("Querying for variable " + username + ":" + name);
return jdbcTemplate.queryForObject(
"SELECT username, name, value, expression FROM billing.variables WHERE "
+ "username = '" + username + "' AND name = '" + name + "'",
new RowMapper<BillingVariable>() {
@Override
public BillingVariable mapRow(ResultSet rs, int rowNum) throws SQLException {
return new BillingVariable(rs.getString("username"), rs.getString("name"),
rs.getDouble("value"), rs.getNString("expression"));
}
});
}

public List<BillingVariable> getAllVariables(String username) {
LOG.trace("Querying for all variables for " + username);
return jdbcTemplate
.query("SELECT username, name, value, expression FROM billing.variables WHERE username = '"
+ username + "'",
new RowMapper<BillingVariable>() {
@Override
public BillingVariable mapRow(ResultSet rs, int rowNum) throws SQLException {
return new BillingVariable(rs.getString("username"), rs.getString("name"),
rs.getDouble("value"), rs.getNString("expression"));
}
});
}

public boolean deleteVariable(String username, String name) {
LOG.trace("Deleting variable " + username + ":" + name);
try {
jdbcTemplate.update("DELETE FROM billing.variables WHERE " + "username = '" + username
+ "' AND name = '" + name + "'");
} catch (Exception exception) {
LOG.debug(exception.getMessage());
return false;
}
LOG.trace("Variable " + username + ":" + name + " was successfully deleted");
return true;
}

public boolean deleteAllVariables(String username) {
LOG.trace("Deleting variables of " + username);
try {
jdbcTemplate.update("DELETE FROM billing.variables WHERE " + "username = '" + username
+ "'");
} catch (Exception exception) {
LOG.debug(exception.getMessage());
return false;
}
LOG.trace("Variables of " + username + " were successfully deleted");
return true;
}

public BillingFunction getFunction(String username, String name) {
LOG.trace("Querying for function " + username + ":" + name);
return jdbcTemplate.queryForObject(
"SELECT username, name, args, expression FROM billing.functions WHERE "
+ "username = '" + username + "' AND name = '" + name + "'",
new RowMapper<BillingFunction>() {
@Override
public BillingFunction mapRow(ResultSet rs, int rowNum) throws SQLException {
return new BillingFunction(rs.getString("username"), rs.getString("name"),
decodeArgs(rs.getString("args")), rs.getNString("expression"));
}
});
}


public boolean addFunction(BillingFunction function) {
try {
jdbcTemplate.update("Insert INTO billing.functions VALUES ('" + function.getUsername()
+ "', '" + function.getName() + "', '" + encodeArgs(function.getArgsName()) +
"', '" + function.getExpression() + "')");
} catch (DuplicateKeyException exception) {
LOG.debug(exception.getMessage());
return false;
}
return true;
}

public List<BillingFunction> getAllFunctions(String username) {
LOG.trace("Querying for all functions for " + username);
return jdbcTemplate
.query("SELECT username, name, args, expression FROM billing.functions WHERE "
+ "username = '" + username + "'",
new RowMapper<BillingFunction>() {
@Override
public BillingFunction mapRow(ResultSet rs, int rowNum) throws SQLException {
return new BillingFunction(rs.getString("username"), rs.getString("name"),
decodeArgs(rs.getString("args")), rs.getNString("expression"));
}
});
}

public boolean deleteFunction(String username, String name) {
LOG.trace("Deleting variable " + username + ":" + name);
try {
jdbcTemplate.update("DELETE FROM billing.functions WHERE " + "username = '" + username
+ "' AND name = '" + name + "'");
} catch (Exception exception) {
LOG.debug(exception.getMessage());
return false;
}
LOG.trace("Function " + username + ":" + name + " was successfully deleted");
return true;
}


private Vector<String> decodeArgs(String code) {
List<String> argsName = new Vector<>();
StringBuilder stringBuilder = new StringBuilder();

for (char currentChar : code.toCharArray()) {
if (currentChar == ',') {
argsName.add(stringBuilder.toString());
stringBuilder.setLength(0);
} else {
stringBuilder.append(currentChar);
}
}
argsName.add(stringBuilder.toString());

return new Vector(argsName);
}

private String encodeArgs(List<String> argsName) {
StringBuilder stringBuilder = new StringBuilder();

for (String arg : argsName) {
stringBuilder.append(arg + ",");
}
stringBuilder.deleteCharAt(stringBuilder.length() - 1);

return stringBuilder.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ru.mipt.java2016.homework.g596.gerasimov.task4;

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

@Configuration
public class BillingDatabaseConfiguration {
@Bean
public DataSource billingDataSource(
@Value("${ru.mipt.java2016.homework.g596.gerasimov.task4.jdbcUrl}") String jdbcUrl,
@Value("${ru.mipt.java2016.homework.g596.gerasimov.task4.username:}") String username,
@Value("${ru.mipt.java2016.homework.g596.gerasimov.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);
}
}
Loading