From cfde993d4d1a2529af42879e333389cbd579f83c Mon Sep 17 00:00:00 2001 From: Artem Kupriyanov Date: Tue, 20 Dec 2016 00:13:41 +0300 Subject: [PATCH 1/6] 4th task --- homework-g596-kupriyanov/pom.xml | 64 +++++++++++ .../g596/kupriyanov/task4/BillingDao.java | 107 ++++++++++++++++++ .../task4/BillingDatabaseConfiguration.java | 30 +++++ .../g596/kupriyanov/task4/BillingUser.java | 73 ++++++++++++ .../task4/CalculatorController.java | 52 +++++++++ .../kupriyanov/task4/FediqApplication.java | 46 ++++++++ .../task4/SecurityServiceConfiguration.java | 59 ++++++++++ 7 files changed, 431 insertions(+) create mode 100644 homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java create mode 100644 homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDatabaseConfiguration.java create mode 100644 homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingUser.java create mode 100644 homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java create mode 100644 homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/FediqApplication.java create mode 100644 homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/SecurityServiceConfiguration.java diff --git a/homework-g596-kupriyanov/pom.xml b/homework-g596-kupriyanov/pom.xml index 32733fc74..be0eea40d 100644 --- a/homework-g596-kupriyanov/pom.xml +++ b/homework-g596-kupriyanov/pom.xml @@ -24,6 +24,70 @@ 1.0.0 test + + org.apache.maven.plugins + maven-jar-plugin + 2.3.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java new file mode 100644 index 000000000..070b20e89 --- /dev/null +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java @@ -0,0 +1,107 @@ +package ru.mipt.java2016.homework.g596.kupriyanov.task4; + +/** + * Created by Artem Kupriyanov on 17/12/2016. + */ + +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; + +@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"); + + // ЗДЕСЬ ДОЛЖНА БЫТЬ ХОРОШАЯ РЕАЛИЗАЦИЯ БАЗЫ ДАННЫХ + + // Users table + jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.users " + + "(username VARCHAR PRIMARY KEY, password VARCHAR, enabled BOOLEAN)"); + jdbcTemplate.update("INSERT INTO billing.users VALUES ('username', 'password', TRUE)"); + + // Variable table + jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.variables " + + "(username VARCHAR, variable VARCHAR, value FLOAT) " + + "FOREIGN KEY (username) REFERENCES billing.users(username)"); + + // Functions table + jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.functions " + + "(username VARCHAR, function VARCHAR, arity INTEGER, body VARCHAR) " + + "FOREIGN KEY (username) REFERENCES billing.users(username)"); + } + + // ЗДЕСЬ ДОЛЖНА БЫТЬ ХОРОШАЯ РЕАЛИЗАЦИЯ БАЗЫ ДАННЫХ + + 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") + ); + } + } + ); + } + + public void putUser(String username, String password) { + jdbcTemplate.update("case (select count(*) from billing.users) = 0 " + + "where username = '" + username + "' and password = '" + password + "' " + + "BEGIN " + + "INSERT INTO billing.users VALUES ('" + username + "', '" + password + "', TRUE) " + + "END"); + } + + public Double loadVariable(String username, String variable) throws EmptyResultDataAccessException { + LOG.trace("Querying for user " + username + " and his variable " + variable); + return jdbcTemplate.queryForObject( + "select value from billing.variables " + + "where username = '" + username + "' and variable = '" + variable + "'", + new Double[]{}, + new RowMapper() { + @Override + public Double mapRow(ResultSet rs, int rowNum) throws SQLException { + return new Double( + rs.getString("value").toString() + ); + } + } + ); + } + + public void putVariable(String username, String variable, Double value) { + LOG.trace("Putting variable " + variable + " for user " + username); + jdbcTemplate.execute("INSERT INTO billing.variables VALUES ('" + + username + "', '" + variable + "', " + value.toString() + ")"); + } +} \ No newline at end of file diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDatabaseConfiguration.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDatabaseConfiguration.java new file mode 100644 index 000000000..f39ab15d1 --- /dev/null +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDatabaseConfiguration.java @@ -0,0 +1,30 @@ +package ru.mipt.java2016.homework.g596.kupriyanov.task4; + +/** + * Created by Artem Kupriyanov on 17/12/2016. + */ + +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}") 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); + } +} diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingUser.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingUser.java new file mode 100644 index 000000000..75e2e37fd --- /dev/null +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingUser.java @@ -0,0 +1,73 @@ +package ru.mipt.java2016.homework.g596.kupriyanov.task4; + +/** + * Created by Artem Kupriyanov on 17/12/2016. + */ + +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; + } +} diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java new file mode 100644 index 000000000..95b87b508 --- /dev/null +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java @@ -0,0 +1,52 @@ +package ru.mipt.java2016.homework.g596.kupriyanov.task4; + +/** + * Created by Artem Kupriyanov on 17/12/2016. + */ + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import ru.mipt.java2016.homework.base.task1.Calculator; +import ru.mipt.java2016.homework.base.task1.ParsingException; + +import java.util.List; + +@RestController +public class CalculatorController { + private static final Logger LOG = LoggerFactory.getLogger(CalculatorController.class); + @Autowired + private Calculator calculator; + @Autowired + private BillingDao billingDao; + + @RequestMapping(path = "/ping", method = RequestMethod.GET, produces = "text/plain") + public String echo() { + return "OK\n"; + } + + @RequestMapping(path = "/", method = RequestMethod.GET, produces = "text/html") + public String main(@RequestParam(required = false) String name) { + if (name == null) { + name = "world"; + } + return "" + + "FediqApp" + + "

Hello, " + name + "!

" + + ""; + } + + @RequestMapping(path = "/eval", method = RequestMethod.POST, consumes = "text/plain", produces = "text/plain") + public String eval(@RequestBody String expression) throws ParsingException { + LOG.debug("Evaluation request: [" + expression + "]"); + double result = calculator.calculate(expression); + LOG.trace("Result: " + result); + return Double.toString(result) + "\n"; + } + + @RequestMapping(path = "/reg", method = RequestMethod.POST, consumes = "text/plain", produces = "text/plain") + public void reg(@RequestParam(value = "args") List arguments) throws ParsingException { + billingDao.putUser(arguments.get(0), arguments.get(1)); + } +} \ No newline at end of file diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/FediqApplication.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/FediqApplication.java new file mode 100644 index 000000000..3b7ca7f32 --- /dev/null +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/FediqApplication.java @@ -0,0 +1,46 @@ +package ru.mipt.java2016.homework.g596.kupriyanov.task4; + +/** + * Created by Artem Kupriyanov on 17/12/2016. + */ + +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; +import ru.mipt.java2016.homework.g596.kupriyanov.task1.MyCalculator; + + +//запуск +// 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 = FediqApplication.class) +public class FediqApplication { + + @Bean + public Calculator calculator() { + return new MyCalculator(); + } + + @Bean + public EmbeddedServletContainerCustomizer customizer( + @Value("${ru.mipt.java2016.homework.g000.lavrentyev.task4.httpPort:9001}") int port) { + return container -> container.setPort(port); + } + + public static void main(String[] args) { + SpringApplication application = new SpringApplication(FediqApplication.class); + application.setBannerMode(Banner.Mode.OFF); + application.run(args); + } +} diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/SecurityServiceConfiguration.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/SecurityServiceConfiguration.java new file mode 100644 index 000000000..2e016fd5f --- /dev/null +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/SecurityServiceConfiguration.java @@ -0,0 +1,59 @@ +package ru.mipt.java2016.homework.g596.kupriyanov.task4; + +/** + * Created by Artem Kupriyanov on 17/12/2016. + */ + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.Collections; + +@Configuration +@EnableWebSecurity +public class SecurityServiceConfiguration extends WebSecurityConfigurerAdapter { + private static final Logger LOG = LoggerFactory.getLogger(SecurityServiceConfiguration.class); + + @Autowired + private BillingDao billingDao; + + @Override + protected void configure(HttpSecurity http) throws Exception { + LOG.info("Configuring security"); + http + .httpBasic().realmName("Calculator").and() + .formLogin().disable() + .logout().disable() + .csrf().disable() + .authorizeRequests() + .antMatchers("/eval/**").authenticated() + .anyRequest().permitAll(); + } + + @Autowired + public void registerGlobalAuthentication(AuthenticationManagerBuilder auth) throws Exception { + LOG.info("Registering global user details service"); + auth.userDetailsService(username -> { + try { + BillingUser user = billingDao.loadUser(username); + return new User( + user.getUsername(), + user.getPassword(), + Collections.singletonList(() -> "AUTH") + ); + } catch (EmptyResultDataAccessException e) { + LOG.warn("No such user: " + username); + throw new UsernameNotFoundException(username); + } + }); + } +} \ No newline at end of file From 9f3f21e248715d55c11e841331eef5ce81997283 Mon Sep 17 00:00:00 2001 From: Artem Kupriyanov Date: Tue, 20 Dec 2016 05:24:20 +0300 Subject: [PATCH 2/6] 4th task --- homework-g596-kupriyanov/pom.xml | 47 +++---- .../g596/kupriyanov/task4/BillingDao.java | 119 ++++++++++++++---- .../task4/CalculatorController.java | 77 +++++++++++- .../kupriyanov/task4/FediqApplication.java | 2 + .../g596/kupriyanov/task4/Parser.java | 68 ++++++++++ .../homework/g596/kupriyanov/task4/start.txt | 17 +++ 6 files changed, 270 insertions(+), 60 deletions(-) create mode 100644 homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java create mode 100644 homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/start.txt diff --git a/homework-g596-kupriyanov/pom.xml b/homework-g596-kupriyanov/pom.xml index be0eea40d..d862e5fed 100644 --- a/homework-g596-kupriyanov/pom.xml +++ b/homework-g596-kupriyanov/pom.xml @@ -11,6 +11,10 @@ homework-g596-kupriyanov + + 1.4.2.RELEASE + + ru.mipt.java2016 @@ -29,38 +33,17 @@ maven-jar-plugin 2.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + ru.mipt.java2016 + homework-base + 1.0.0 + + + + net.sourceforge.jeval + jeval + 0.9.4 + org.springframework.boot diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java index 070b20e89..21493b90d 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java @@ -16,6 +16,9 @@ import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; @Repository public class BillingDao { @@ -37,25 +40,39 @@ public void initSchema() { jdbcTemplate.execute("CREATE SCHEMA IF NOT EXISTS billing"); // ЗДЕСЬ ДОЛЖНА БЫТЬ ХОРОШАЯ РЕАЛИЗАЦИЯ БАЗЫ ДАННЫХ - // Users table jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.users " + "(username VARCHAR PRIMARY KEY, password VARCHAR, enabled BOOLEAN)"); - jdbcTemplate.update("INSERT INTO billing.users VALUES ('username', 'password', TRUE)"); + jdbcTemplate.update("INSERT INTO billing.users VALUES (\'username\', \'password\', TRUE)"); // Variable table jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.variables " + - "(username VARCHAR, variable VARCHAR, value FLOAT) " + - "FOREIGN KEY (username) REFERENCES billing.users(username)"); + "(username VARCHAR, variable VARCHAR, value FLOAT)"); // Functions table jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.functions " + - "(username VARCHAR, function VARCHAR, arity INTEGER, body VARCHAR) " + - "FOREIGN KEY (username) REFERENCES billing.users(username)"); + "(username VARCHAR, function VARCHAR, arity INTEGER, body VARCHAR)"); } // ЗДЕСЬ ДОЛЖНА БЫТЬ ХОРОШАЯ РЕАЛИЗАЦИЯ БАЗЫ ДАННЫХ + private Integer checkNull(String condition) { + LOG.trace("check " + condition); + String allSelect = "SELECT COUNT(*) FROM " + condition; + return jdbcTemplate.queryForObject( + allSelect, + new Integer[]{}, + new RowMapper() { + @Override + public Integer mapRow(ResultSet rs, int rowNum) throws SQLException { + return new Integer( + rs.getString("value").toString() + ); + } + } + ); + } + public BillingUser loadUser(String username) throws EmptyResultDataAccessException { LOG.trace("Querying for user " + username); return jdbcTemplate.queryForObject( @@ -75,33 +92,85 @@ public BillingUser mapRow(ResultSet rs, int rowNum) throws SQLException { } public void putUser(String username, String password) { - jdbcTemplate.update("case (select count(*) from billing.users) = 0 " + - "where username = '" + username + "' and password = '" + password + "' " + - "BEGIN " + - "INSERT INTO billing.users VALUES ('" + username + "', '" + password + "', TRUE) " + - "END"); + jdbcTemplate.update("INSERT INTO billing.users VALUES (\'" + username + "\', \'" + password + "\', TRUE)"); } - public Double loadVariable(String username, String variable) throws EmptyResultDataAccessException { - LOG.trace("Querying for user " + username + " and his variable " + variable); + public Double getVariable(String username, String variable) throws EmptyResultDataAccessException { + LOG.trace("Get variable " + username + " variable " + variable); + try { + return jdbcTemplate.queryForObject( + "select value from billing.variables " + + "where username = \'" + username + "\' and variable = \'" + variable + "\'", + new Double[]{}, + new RowMapper() { + @Override + public Double mapRow(ResultSet rs, int rowNum) throws SQLException { + return new Double( + rs.getString("value").toString() + ); + } + } + ); + } catch (Exception e) { + return null; + } + } + + public void putVariable(String username, String variable, Double value) { + LOG.trace("Put variable " + variable + " for user " + username); + jdbcTemplate.execute("INSERT INTO billing.variables VALUES (\'" + + username + "\', \'" + variable + "\', " + value.toString() + ")" + ); + } + + public void deleteVariable(String username, String variable) { + LOG.trace("Delete variable " + variable + "for user " + username); + jdbcTemplate.execute("DELETE FROM billing.variables WHERE username = \'" + + username + "\' AND variable = \'" + variable + "\'"); + } + + public List getAllVariables(String username) throws EmptyResultDataAccessException { + LOG.trace("List with all functions for user: " + username); +// try { + List> queryResult = jdbcTemplate.queryForList( + " SELECT variable FROM billing.variables WHERE username = \'" + username + "\'" + ); + List variables = new ArrayList(); + for (Object aQueryResult : queryResult) { + variables.add(aQueryResult.toString()); + } + return variables; +// } catch (Exception e) { +// return new ArrayList(); +// } + + } + + public void putFunction(String username, String function, Integer arity, String body) { + LOG.trace("Put function " + function + " for user " + username); + jdbcTemplate.execute("INSERT INTO billing.functions VALUES (\'" + + username + "\', \'" + function + "\', " + arity.toString() + ", \'" + + body + "\')"); + } + + public String getFunction(String username, String function) { + LOG.trace("Load function " + function + " for user " + username); return jdbcTemplate.queryForObject( - "select value from billing.variables " + - "where username = '" + username + "' and variable = '" + variable + "'", - new Double[]{}, - new RowMapper() { + "SELECT body FROM billing.functions WHERE username = \'" + + username + "\' AND function = \'" + function + "\'", + new String[]{}, + new RowMapper() { @Override - public Double mapRow(ResultSet rs, int rowNum) throws SQLException { - return new Double( - rs.getString("value").toString() - ); + public String mapRow(ResultSet rs, int rowNum) throws SQLException { + return rs.getString("body"); } } ); } - public void putVariable(String username, String variable, Double value) { - LOG.trace("Putting variable " + variable + " for user " + username); - jdbcTemplate.execute("INSERT INTO billing.variables VALUES ('" - + username + "', '" + variable + "', " + value.toString() + ")"); + public void deleteFunction(String username, String function) { + LOG.info("Delete function " + function + " for user " + username); + jdbcTemplate.execute("DELETE FROM billing.functions WHERE username = \'" + + username + "\' AND function = \'" + function + "\'"); } } \ No newline at end of file diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java index 95b87b508..e4178c69a 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java @@ -7,6 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; import ru.mipt.java2016.homework.base.task1.Calculator; import ru.mipt.java2016.homework.base.task1.ParsingException; @@ -38,15 +39,85 @@ public String main(@RequestParam(required = false) String name) { } @RequestMapping(path = "/eval", method = RequestMethod.POST, consumes = "text/plain", produces = "text/plain") - public String eval(@RequestBody String expression) throws ParsingException { + public String eval(Authentication auth, @RequestBody String expression) throws ParsingException { LOG.debug("Evaluation request: [" + expression + "]"); - double result = calculator.calculate(expression); + String username = auth.getName(); + //double result = calculator.calculate(expression); + String result = functionalCalculate(expression, username); LOG.trace("Result: " + result); - return Double.toString(result) + "\n"; + return result; + //return Double.toString(result) + "\n"; } @RequestMapping(path = "/reg", method = RequestMethod.POST, consumes = "text/plain", produces = "text/plain") public void reg(@RequestParam(value = "args") List arguments) throws ParsingException { billingDao.putUser(arguments.get(0), arguments.get(1)); } + + private String functionalCalculate(String expression, String username) throws ParsingException { + String goodExpression = expression; + try { + Parser parser = new Parser(expression, username); + for (String function : parser.functions) { + if (expression.indexOf(function) != -1) { + String subExpression = parser.expressionInFunction(expression, function); + String functionAndOperand = function + subExpression; + expression.replace(functionAndOperand, functionalCalculate(subExpression, username)); + } + } + goodExpression = parser.work(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + double result = calculator.calculate(goodExpression); + return Double.toString(result) + "\n"; + } + } + + @RequestMapping(path = "/variable/{variableName}", method = RequestMethod.PUT, + consumes = "text/plain", produces = "text/plain") + public void putVariable(Authentication auth, + @PathVariable String variableName, @RequestParam(value = "value") Double value) { + String username = auth.getName(); + billingDao.putVariable(username, variableName, value); + } + + @RequestMapping(path = "/variable/{variableName}", method = RequestMethod.GET, + consumes = "text/plain", produces = "text/plain") + public String getVariable(Authentication auth, @PathVariable String variableName) { + String username = auth.getName(); + Double value = billingDao.getVariable(username, variableName); + return value.toString() + "\n"; + } + + @RequestMapping(path = "/variable/{variableName}", method = RequestMethod.DELETE, + consumes = "text/plain", produces = "text/plain") + public void deleteVariable(Authentication authentication, @PathVariable String variableName) { + String username = authentication.getName(); + billingDao.deleteVariable(username, variableName); + } + + @RequestMapping(path = "/function/{functionName}", method = RequestMethod.PUT, + consumes = "text/plain", produces = "text/plain") + public void putFunction(Authentication authentication, @PathVariable String functionName, + @RequestParam(value = "arity") Integer arity, @RequestBody String body) { + String username = authentication.getName(); + LOG.trace(username); + billingDao.putFunction(username, functionName, arity, body); + } + + @RequestMapping(path = "/function/{functionName}", method = RequestMethod.DELETE, + consumes = "text/plain", produces = "text/plain") + public void deleteFunction(Authentication authentication, @PathVariable String functionName) { + String username = authentication.getName(); + billingDao.deleteFunction(username, functionName); + } + + @RequestMapping(path = "/function/{functionName}", method = RequestMethod.GET, + consumes = "text/plain", produces = "text/plain") + public String getFunction(Authentication authentication, @PathVariable String functionName) { + String username = authentication.getName(); + String res = billingDao.getFunction(username, functionName); + return res + "\n"; + } } \ No newline at end of file diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/FediqApplication.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/FediqApplication.java index 3b7ca7f32..241551283 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/FediqApplication.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/FediqApplication.java @@ -22,6 +22,8 @@ // -H "Content-Type: text/plain" \ // -H "Authorization: Basic $(echo -n "username:password" | base64)" \ // --data-raw "44*3+2" + + @EnableAutoConfiguration @Configuration @ComponentScan(basePackageClasses = FediqApplication.class) diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java new file mode 100644 index 000000000..6e2cd9622 --- /dev/null +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java @@ -0,0 +1,68 @@ +package ru.mipt.java2016.homework.g596.kupriyanov.task4; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * Created by Artem Kupriyanov on 19/12/2016. + */ + + +public class Parser extends BillingDao { + public String expression; + public String username; + public List variables; + public List functions; + + Parser (String exp, String usern) { + expression = exp; + username = usern; + variables = getAllVariables(username); + //functions = + } + + class LengthComparator implements Comparator { + @Override + public int compare(String s1, String s2) { + return -(s1.length() - s2.length()); // по убыванию + } + } + + private void substituteVariable() { + LengthComparator myComparator = new LengthComparator(); + Collections.sort(variables, myComparator); + for (String variable: variables) { + if (expression.contains(variable)) { + expression.replaceAll(variable, getVariable(username, variable).toString()); + } + } + } + + public String expressionInFunction(String expression, String function) { + int start = expression.indexOf(function) + function.length(); + int bracketBalance = 0; + if (expression.charAt(start) != '(') { + return null; + } + int end = start; + while (end != expression.length()){ + if (expression.charAt(end) == '(') { + bracketBalance++; + } + if (expression.charAt(end) == ')') { + bracketBalance--; + } + if (bracketBalance == 0) { + break; + } + end++; + } + return expression.substring(start, end); + } + + public String work() { + substituteVariable(); + return expression; + } +} diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/start.txt b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/start.txt new file mode 100644 index 000000000..c177a9e4e --- /dev/null +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/start.txt @@ -0,0 +1,17 @@ +запуск + 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" + +авторизация +curl http://localhost:9001/reg?args="artemkaa, 599" -X POST -H "Content-Type: text/plain" -H \ +"Authorization: Basic $(echo -n "username:password" | base64)" + +положить переменную +curl http://localhost:9001/variable/pi?value="3.1415926" -X PUT -H "Content-Type: text/plain" -H \ +"Authorization: Basic $(echo -n "username:password" | base64)" + +curl http://localhost:9001/variable/pi -X GET -H "Content-Type: text/plain" -H \ +"Authorization: Basic $(echo -n "username:password" | base64)" \ No newline at end of file From b3a1d04b73f5e3da6eeb5e67b5d2f2a1688c0078 Mon Sep 17 00:00:00 2001 From: Artem Kupriyanov Date: Tue, 20 Dec 2016 05:33:11 +0300 Subject: [PATCH 3/6] friend with travis --- .../g596/kupriyanov/task4/BillingDao.java | 16 +++++------ .../task4/CalculatorController.java | 2 +- .../g596/kupriyanov/task4/Parser.java | 28 +++++++++++-------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java index 21493b90d..8c07735b6 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java @@ -132,14 +132,14 @@ public void deleteVariable(String username, String variable) { public List getAllVariables(String username) throws EmptyResultDataAccessException { LOG.trace("List with all functions for user: " + username); // try { - List> queryResult = jdbcTemplate.queryForList( - " SELECT variable FROM billing.variables WHERE username = \'" + username + "\'" - ); - List variables = new ArrayList(); - for (Object aQueryResult : queryResult) { - variables.add(aQueryResult.toString()); - } - return variables; + List> queryResult = jdbcTemplate.queryForList( + " SELECT variable FROM billing.variables WHERE username = \'" + username + "\'" + ); + List variables = new ArrayList(); + for (Object aQueryResult : queryResult) { + variables.add(aQueryResult.toString()); + } + return variables; // } catch (Exception e) { // return new ArrayList(); // } diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java index e4178c69a..967f4fc5c 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java @@ -58,7 +58,7 @@ private String functionalCalculate(String expression, String username) throws Pa String goodExpression = expression; try { Parser parser = new Parser(expression, username); - for (String function : parser.functions) { + for (String function : parser.getFunction()) { if (expression.indexOf(function) != -1) { String subExpression = parser.expressionInFunction(expression, function); String functionAndOperand = function + subExpression; diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java index 6e2cd9622..6118ef649 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java @@ -10,12 +10,12 @@ public class Parser extends BillingDao { - public String expression; - public String username; - public List variables; - public List functions; + private String expression; + private String username; + private List variables; + private List functions; - Parser (String exp, String usern) { + Parser(String exp, String usern) { expression = exp; username = usern; variables = getAllVariables(username); @@ -39,18 +39,18 @@ private void substituteVariable() { } } - public String expressionInFunction(String expression, String function) { - int start = expression.indexOf(function) + function.length(); + public String expressionInFunction(String express, String function) { + int start = express.indexOf(function) + function.length(); int bracketBalance = 0; - if (expression.charAt(start) != '(') { + if (express.charAt(start) != '(') { return null; } int end = start; - while (end != expression.length()){ - if (expression.charAt(end) == '(') { + while (end != express.length()) { + if (express.charAt(end) == '(') { bracketBalance++; } - if (expression.charAt(end) == ')') { + if (express.charAt(end) == ')') { bracketBalance--; } if (bracketBalance == 0) { @@ -58,11 +58,15 @@ public String expressionInFunction(String expression, String function) { } end++; } - return expression.substring(start, end); + return express.substring(start, end); } public String work() { substituteVariable(); return expression; } + + public List getFunction() { + return functions; + } } From 6e178c0d5e38085a16fe024a8ee925cf77ab2301 Mon Sep 17 00:00:00 2001 From: Artem Kupriyanov Date: Tue, 20 Dec 2016 15:07:56 +0300 Subject: [PATCH 4/6] task4 and threadPool --- .../g596/kupriyanov/task4/BillingDao.java | 104 +++++++++++------- .../task4/CalculatorController.java | 42 +++---- .../g596/kupriyanov/task4/Parser.java | 21 ++-- .../homework/g596/kupriyanov/task4/start.txt | 11 ++ .../threadPool/fixedThreadPool.java | 71 ++++++++++++ 5 files changed, 178 insertions(+), 71 deletions(-) create mode 100644 homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java index 8c07735b6..53670484b 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java @@ -11,14 +11,13 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; +import ru.mipt.java2016.homework.base.task1.ParsingException; import javax.annotation.PostConstruct; import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.HashMap; @Repository public class BillingDao { @@ -47,27 +46,30 @@ public void initSchema() { // Variable table jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.variables " + - "(username VARCHAR, variable VARCHAR, value FLOAT)"); + "(username VARCHAR, variable VARCHAR, val DOUBLE)"); // Functions table jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS billing.functions " + "(username VARCHAR, function VARCHAR, arity INTEGER, body VARCHAR)"); } - // ЗДЕСЬ ДОЛЖНА БЫТЬ ХОРОШАЯ РЕАЛИЗАЦИЯ БАЗЫ ДАННЫХ - - private Integer checkNull(String condition) { + private Boolean checkNull(String condition) { LOG.trace("check " + condition); - String allSelect = "SELECT COUNT(*) FROM " + condition; + String allSelect = "SELECT * FROM " + condition; return jdbcTemplate.queryForObject( allSelect, - new Integer[]{}, - new RowMapper() { + new Object[]{}, + new RowMapper() { @Override - public Integer mapRow(ResultSet rs, int rowNum) throws SQLException { - return new Integer( - rs.getString("value").toString() - ); + public Boolean mapRow(ResultSet rs, int rowNum) throws SQLException { + Boolean flag = false; + while (true) { + if (!rs.next()) { + break; + } + flag = true; + } + return flag; } } ); @@ -92,35 +94,44 @@ public BillingUser mapRow(ResultSet rs, int rowNum) throws SQLException { } public void putUser(String username, String password) { - jdbcTemplate.update("INSERT INTO billing.users VALUES (\'" + username + "\', \'" + password + "\', TRUE)"); + try { + loadUser(username); + } catch (EmptyResultDataAccessException e) { + jdbcTemplate.execute("INSERT INTO billing.users VALUES (\'" + username + "\', \'" + password + "\', TRUE)"); + } } - public Double getVariable(String username, String variable) throws EmptyResultDataAccessException { + public Double getVariable(String username, String variable) { LOG.trace("Get variable " + username + " variable " + variable); try { return jdbcTemplate.queryForObject( - "select value from billing.variables " + + "select val from billing.variables " + "where username = \'" + username + "\' and variable = \'" + variable + "\'", new Double[]{}, new RowMapper() { @Override public Double mapRow(ResultSet rs, int rowNum) throws SQLException { return new Double( - rs.getString("value").toString() + rs.getString("val").toString() ); } } ); - } catch (Exception e) { - return null; + } catch (EmptyResultDataAccessException e) { + return 0.0; } } public void putVariable(String username, String variable, Double value) { LOG.trace("Put variable " + variable + " for user " + username); - jdbcTemplate.execute("INSERT INTO billing.variables VALUES (\'" - + username + "\', \'" + variable + "\', " + value.toString() + ")" - ); + try { + deleteVariable(username, variable); + } catch (Exception e) { + e.printStackTrace(); + } finally { + jdbcTemplate.execute("INSERT INTO billing.variables VALUES (\'" + + username + "\', \'" + variable + "\', " + value.toString() + ")"); + } } public void deleteVariable(String username, String variable) { @@ -129,28 +140,43 @@ public void deleteVariable(String username, String variable) { + username + "\' AND variable = \'" + variable + "\'"); } - public List getAllVariables(String username) throws EmptyResultDataAccessException { + public HashMap getAllVariables(String username) throws ParsingException { LOG.trace("List with all functions for user: " + username); -// try { - List> queryResult = jdbcTemplate.queryForList( - " SELECT variable FROM billing.variables WHERE username = \'" + username + "\'" - ); - List variables = new ArrayList(); - for (Object aQueryResult : queryResult) { - variables.add(aQueryResult.toString()); + try { + return jdbcTemplate.queryForObject( + "SELECT username, variable, val FROM billing.variables WHERE username = ?", + new Object[]{username}, + new RowMapper>() { + @Override + public HashMap mapRow(ResultSet rs, int rowNum) throws SQLException { + HashMap tmp = new HashMap(); + while (true) { + tmp.put(rs.getString("variable"), Double.toString(rs.getDouble("val"))); + if (!rs.next()) { + break; + } + } + return tmp; + } + } + ); + } catch (EmptyResultDataAccessException e) { + HashMap tmp = new HashMap(); + return tmp; } - return variables; -// } catch (Exception e) { -// return new ArrayList(); -// } - } public void putFunction(String username, String function, Integer arity, String body) { LOG.trace("Put function " + function + " for user " + username); - jdbcTemplate.execute("INSERT INTO billing.functions VALUES (\'" - + username + "\', \'" + function + "\', " + arity.toString() + ", \'" - + body + "\')"); + try { + deleteFunction(username, function); + } catch (Exception e) { + e.printStackTrace(); + } finally { + jdbcTemplate.execute("INSERT INTO billing.functions VALUES (\'" + + username + "\', \'" + function + "\', " + arity.toString() + ", \'" + + body + "\')"); + } } public String getFunction(String username, String function) { diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java index 967f4fc5c..96e9cfd65 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java @@ -12,8 +12,6 @@ import ru.mipt.java2016.homework.base.task1.Calculator; import ru.mipt.java2016.homework.base.task1.ParsingException; -import java.util.List; - @RestController public class CalculatorController { private static final Logger LOG = LoggerFactory.getLogger(CalculatorController.class); @@ -42,36 +40,32 @@ public String main(@RequestParam(required = false) String name) { public String eval(Authentication auth, @RequestBody String expression) throws ParsingException { LOG.debug("Evaluation request: [" + expression + "]"); String username = auth.getName(); - //double result = calculator.calculate(expression); - String result = functionalCalculate(expression, username); + double result = calculator.calculate(expression); + //String result = functionalCalculate(expression, username); LOG.trace("Result: " + result); - return result; - //return Double.toString(result) + "\n"; + //return result; + return Double.toString(result) + "\n"; } - @RequestMapping(path = "/reg", method = RequestMethod.POST, consumes = "text/plain", produces = "text/plain") - public void reg(@RequestParam(value = "args") List arguments) throws ParsingException { - billingDao.putUser(arguments.get(0), arguments.get(1)); + @RequestMapping(path = "/reg/{userName}", method = RequestMethod.PUT, + consumes = "text/plain", produces = "text/plain") + public void reg(@PathVariable String userName, @RequestBody String passwd) throws ParsingException { + LOG.debug("New user: [" + userName + ' ' + passwd + "]"); + billingDao.putUser(userName, passwd); } - private String functionalCalculate(String expression, String username) throws ParsingException { String goodExpression = expression; - try { - Parser parser = new Parser(expression, username); - for (String function : parser.getFunction()) { - if (expression.indexOf(function) != -1) { - String subExpression = parser.expressionInFunction(expression, function); - String functionAndOperand = function + subExpression; - expression.replace(functionAndOperand, functionalCalculate(subExpression, username)); - } + Parser parser = new Parser(expression, username); + for (String function : parser.getFunction()) { + if (expression.indexOf(function) != -1) { + String subExpression = parser.expressionInFunction(expression, function); + String functionAndOperand = function + subExpression; + expression.replace(functionAndOperand, functionalCalculate(subExpression, username)); } - goodExpression = parser.work(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - double result = calculator.calculate(goodExpression); - return Double.toString(result) + "\n"; } + goodExpression = parser.work(); + double result = calculator.calculate(goodExpression); + return Double.toString(result) + "\n"; } @RequestMapping(path = "/variable/{variableName}", method = RequestMethod.PUT, diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java index 6118ef649..073b1db39 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java @@ -1,8 +1,8 @@ package ru.mipt.java2016.homework.g596.kupriyanov.task4; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; +import ru.mipt.java2016.homework.base.task1.ParsingException; + +import java.util.*; /** * Created by Artem Kupriyanov on 19/12/2016. @@ -12,13 +12,17 @@ public class Parser extends BillingDao { private String expression; private String username; - private List variables; + private Map variables; private List functions; Parser(String exp, String usern) { expression = exp; username = usern; - variables = getAllVariables(username); + try { + variables = getAllVariables(username); + } catch (ParsingException e) { + variables = new HashMap<>(); + } //functions = } @@ -31,10 +35,11 @@ public int compare(String s1, String s2) { private void substituteVariable() { LengthComparator myComparator = new LengthComparator(); - Collections.sort(variables, myComparator); - for (String variable: variables) { + List sorted_variables = new ArrayList<>(variables.keySet()); + Collections.sort(sorted_variables, myComparator); + for (String variable: sorted_variables) { if (expression.contains(variable)) { - expression.replaceAll(variable, getVariable(username, variable).toString()); + expression.replaceAll(variable, variables.get(variable)); } } } diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/start.txt b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/start.txt index c177a9e4e..35fe69bb0 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/start.txt +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/start.txt @@ -14,4 +14,15 @@ curl http://localhost:9001/variable/pi?value="3.1415926" -X PUT -H "Content-Type "Authorization: Basic $(echo -n "username:password" | base64)" curl http://localhost:9001/variable/pi -X GET -H "Content-Type: text/plain" -H \ +"Authorization: Basic $(echo -n "username:password" | base64)" + + curl http://localhost:9001/reg/artemkaa \ + -X PUT \ + -H "Content-Type: text/plain" \ + --data-raw "599" + +curl http://localhost:9001/function/sum?arity="2" -X PUT -H "Content-Type: text/plain" -H \ +"Authorization: Basic $(echo -n "username:password" | base64)" --data "x+y" + +curl http://localhost:9001/function/sum -X GET -H "Content-Type: text/plain" -H \ "Authorization: Basic $(echo -n "username:password" | base64)" \ No newline at end of file diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java new file mode 100644 index 000000000..8557c725b --- /dev/null +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java @@ -0,0 +1,71 @@ +package ru.mipt.java2016.homework.g596.kupriyanov.threadPool; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Created by Artem Kupriyanov on 15/12/2016. + */ + +public class fixedThreadPool { + private final Queue tasks = new ArrayDeque(); + private final Lock lock = new ReentrantLock(); + private final List workers; + + public fixedThreadPool(int nThread) { + workers = new ArrayList<>(nThread); + for (int i = 0; i < nThread; ++i) { + workers.add(new MyThread(i)); + } + } + + private class MyThread extends Thread { + private Integer index; + + public Integer getIndex() { + return index; + } + + public MyThread(Integer ind) { + index = ind; + } + + @Override + public void run() { + while (true) { + Runnable task; + lock.lock(); + try { + while (tasks.isEmpty()) { + try { + lock.wait(); + } catch (InterruptedException e) { + System.out.println("thread was interrupted"); + } + } + task = tasks.poll(); + } finally { + lock.unlock(); + } + try { + task.run(); + } catch (Exception e) { + System.out.println("Can't run this task"); + } + } + } + } + + public void start() { + workers.forEach(Thread::start); + } + + public void execute(Runnable runnable) { + tasks.add(runnable); + lock.notify(); + } +} From 98d210b38c41ebeb376d9361d1ddce4e615ef1f7 Mon Sep 17 00:00:00 2001 From: Artem Kupriyanov Date: Tue, 20 Dec 2016 15:12:10 +0300 Subject: [PATCH 5/6] task4 and threadPool frind with travis --- .../homework/g596/kupriyanov/task4/BillingDao.java | 2 +- .../g596/kupriyanov/task4/CalculatorController.java | 1 + .../homework/g596/kupriyanov/task4/Parser.java | 6 +++--- .../g596/kupriyanov/threadPool/fixedThreadPool.java | 10 +++++----- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java index 53670484b..3633b0aac 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/BillingDao.java @@ -127,7 +127,7 @@ public void putVariable(String username, String variable, Double value) { try { deleteVariable(username, variable); } catch (Exception e) { - e.printStackTrace(); + e.printStackTrace(); } finally { jdbcTemplate.execute("INSERT INTO billing.variables VALUES (\'" + username + "\', \'" + variable + "\', " + value.toString() + ")"); diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java index 96e9cfd65..52754b0c9 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/CalculatorController.java @@ -53,6 +53,7 @@ public void reg(@PathVariable String userName, @RequestBody String passwd) throw LOG.debug("New user: [" + userName + ' ' + passwd + "]"); billingDao.putUser(userName, passwd); } + private String functionalCalculate(String expression, String username) throws ParsingException { String goodExpression = expression; Parser parser = new Parser(expression, username); diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java index 073b1db39..0992809c3 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/task4/Parser.java @@ -35,9 +35,9 @@ public int compare(String s1, String s2) { private void substituteVariable() { LengthComparator myComparator = new LengthComparator(); - List sorted_variables = new ArrayList<>(variables.keySet()); - Collections.sort(sorted_variables, myComparator); - for (String variable: sorted_variables) { + List sortedVariables = new ArrayList<>(variables.keySet()); + Collections.sort(sortedVariables, myComparator); + for (String variable: sortedVariables) { if (expression.contains(variable)) { expression.replaceAll(variable, variables.get(variable)); } diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java index 8557c725b..8324a4f0e 100644 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java +++ b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java @@ -11,12 +11,12 @@ * Created by Artem Kupriyanov on 15/12/2016. */ -public class fixedThreadPool { +public class FixedThreadPool { private final Queue tasks = new ArrayDeque(); private final Lock lock = new ReentrantLock(); private final List workers; - public fixedThreadPool(int nThread) { + public FixedThreadPool(int nThread) { workers = new ArrayList<>(nThread); for (int i = 0; i < nThread; ++i) { workers.add(new MyThread(i)); @@ -30,7 +30,7 @@ public Integer getIndex() { return index; } - public MyThread(Integer ind) { + MyThread(Integer ind) { index = ind; } @@ -65,7 +65,7 @@ public void start() { } public void execute(Runnable runnable) { - tasks.add(runnable); - lock.notify(); + tasks.add(runnable); + lock.notify(); } } From 9c1460bb73f1e450c0e49654c0acf45315820e6f Mon Sep 17 00:00:00 2001 From: Artem Kupriyanov Date: Tue, 20 Dec 2016 15:16:15 +0300 Subject: [PATCH 6/6] task4 frind with travis --- .../threadPool/fixedThreadPool.java | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java diff --git a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java b/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java deleted file mode 100644 index 8324a4f0e..000000000 --- a/homework-g596-kupriyanov/src/main/java/ru/mipt/java2016/homework/g596/kupriyanov/threadPool/fixedThreadPool.java +++ /dev/null @@ -1,71 +0,0 @@ -package ru.mipt.java2016.homework.g596.kupriyanov.threadPool; - -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.List; -import java.util.Queue; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -/** - * Created by Artem Kupriyanov on 15/12/2016. - */ - -public class FixedThreadPool { - private final Queue tasks = new ArrayDeque(); - private final Lock lock = new ReentrantLock(); - private final List workers; - - public FixedThreadPool(int nThread) { - workers = new ArrayList<>(nThread); - for (int i = 0; i < nThread; ++i) { - workers.add(new MyThread(i)); - } - } - - private class MyThread extends Thread { - private Integer index; - - public Integer getIndex() { - return index; - } - - MyThread(Integer ind) { - index = ind; - } - - @Override - public void run() { - while (true) { - Runnable task; - lock.lock(); - try { - while (tasks.isEmpty()) { - try { - lock.wait(); - } catch (InterruptedException e) { - System.out.println("thread was interrupted"); - } - } - task = tasks.poll(); - } finally { - lock.unlock(); - } - try { - task.run(); - } catch (Exception e) { - System.out.println("Can't run this task"); - } - } - } - } - - public void start() { - workers.forEach(Thread::start); - } - - public void execute(Runnable runnable) { - tasks.add(runnable); - lock.notify(); - } -}