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
30 changes: 30 additions & 0 deletions homework-g594-shevkunov/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@
<artifactId>homework-g594-shevkunov</artifactId>
<version>1.0.0</version>

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

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

</project>
Original file line number Diff line number Diff line change
Expand Up @@ -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<Double> valStack = new Stack<>();
private Stack<Operation> operStack = new Stack<>();
private StringBuilder buffer = new StringBuilder();
Expand Down
Original file line number Diff line number Diff line change
@@ -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<BillingUser>() {
@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<String>() {
@Override
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs.getString("value");
}
}
);
}

public List<String> getAllVariableNames(String username) {
LOG.trace("Getting all variables for user " + username);
String querry = "SELECT variable FROM billing.vars WHERE username = '" + username + "'";

List<String> vars = new ArrayList<String>();

List<Map<String, Object>> rows = jdbcTemplate.queryForList(querry);

for (Map row : rows) {
vars.add((String) row.get("variable"));
}
return vars;
}

public Map<String, String> getAllVariables(String username) {
LOG.trace("Getting all variables for user " + username);
String querry = "SELECT * FROM billing.vars WHERE username = '" + username + "'";

Map<String, String> vars = new HashMap<>();

List<Map<String, Object>> rows = jdbcTemplate.queryForList(querry);
for (Map row : rows) {
vars.put((String) row.get("variable"), (String) row.get("value"));
}
return vars;
}

public void delVariable(String username, String variable) {
LOG.trace("Deletting variable " + variable + " for user " + username); // TODO check valid
String querry = "DELETE FROM billing.vars WHERE username = '" + username
+ "' AND variable = '" + variable + "'";
jdbcTemplate.execute(querry);
}



/** Function functions */
public void setFunction(String username, FunctionWrapper function) {
LOG.trace("Setting function " + function.getName() + " for user " + username);
delFunction(username, function.getName());
String querry = "INSERT INTO billing.funcs VALUES ('" + function.getName() +
"','" + username + "','" + function.argsToString() + "','" + function.getValue() + "')";
jdbcTemplate.execute(querry);
}

public FunctionWrapper getFunction(String username, String function) {
LOG.trace("Getting function " + function + " for user " + username);
String querry = "SELECT * FROM billing.funcs WHERE username = '" +
username + "' AND function = '" + function + "'";
return jdbcTemplate.queryForObject(
querry,
new RowMapper<FunctionWrapper>() {
@Override
public FunctionWrapper mapRow(ResultSet rs, int rowNum) throws SQLException {
return new FunctionWrapper(rs.getString("function"),
rs.getString("args"), rs.getString("value"));
}
}
);
}

public List<String> getAllFunctionNames(String username) {
LOG.trace("Getting all functions for user " + username);
String querry = "SELECT function FROM billing.funcs WHERE username = '" + username + "'";

List<String> vars = new ArrayList<String>();

List<Map<String, Object>> rows = jdbcTemplate.queryForList(querry);

for (Map row : rows) {
vars.add((String) row.get("function"));
}
return vars;
}

public Map<String, FunctionWrapper> getAllFunctions(String username) {
LOG.trace("Getting all functions for user " + username);
String querry = "SELECT * FROM billing.funcs WHERE username = '" + username + "'";

Map<String, FunctionWrapper> vars = new HashMap<>();

List<Map<String, Object>> rows = jdbcTemplate.queryForList(querry);
for (Map row : rows) {
FunctionWrapper func = new FunctionWrapper((String) row.get("function"),
(String) row.get("args"), (String) row.get("value"));
vars.put(func.getName(), func);
}
return vars;
}

public void delFunction(String username, String function) {
LOG.trace("Deletting function " + function + " for user " + username); // TODO check valid
String querry = "DELETE FROM billing.funcs WHERE username = '" + username
+ "' AND function = '" + function + "'";
jdbcTemplate.execute(querry);
}


/** Function functions */
public boolean registerUser(String username, String password) {
LOG.trace("Registering user " + username); // TODO check valid
String querry = "SELECT COUNT(*) FROM billing.users WHERE username = '" + username + "'";
int total = jdbcTemplate.queryForObject(querry, Integer.class);
if (total != 0) {
return false;
}
querry = "INSERT INTO billing.users VALUES ('" + username + "', '" + password + "', TRUE) ";
jdbcTemplate.execute(querry);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package ru.mipt.java2016.homework.g594.shevkunov.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;

@Configuration
public class BillingDatabaseConfiguration {
@Bean
public DataSource billingDataSource(
@Value("${ru.mipt.java2016.homework.g000.lavrentyev.task4.jdbcUrl:jdbc:h2:/tmp/task4/base}") String jdbcUrl,
@Value("${ru.mipt.java2016.homework.g000.lavrentyev.task4.username:}") String username,
@Value("${ru.mipt.java2016.homework.g000.lavrentyev.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,69 @@
package ru.mipt.java2016.homework.g594.shevkunov.task4;

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

public BillingUser(String username, String password, boolean enabled) {
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;
this.enabled = enabled;
}

public String getUsername() {
return username;
}

public String getPassword() {
return password;
}

public boolean isEnabled() {
return enabled;
}

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

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

BillingUser that = (BillingUser) o;

if (enabled != that.enabled) {
return false;
}
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();
result = 31 * result + (enabled ? 1 : 0);
return result;
}
}
Loading