diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/edu/brown/cs/student/term/Main.java | 185 |
1 files changed, 111 insertions, 74 deletions
diff --git a/src/main/java/edu/brown/cs/student/term/Main.java b/src/main/java/edu/brown/cs/student/term/Main.java index 55b1634..7ee9874 100644 --- a/src/main/java/edu/brown/cs/student/term/Main.java +++ b/src/main/java/edu/brown/cs/student/term/Main.java @@ -1,35 +1,28 @@ package edu.brown.cs.student.term; +import com.google.common.collect.ImmutableMap; +import edu.brown.cs.student.term.hub.Holder; +import edu.brown.cs.student.term.profit.ProfitCalculation; +import edu.brown.cs.student.term.profit.StockHolding; +import edu.brown.cs.student.term.hub.SuspicionRanker; import edu.brown.cs.student.term.repl.Command; import edu.brown.cs.student.term.repl.REPL; import edu.brown.cs.student.term.repl.commands.LoadCommand; +import edu.brown.cs.student.term.repl.commands.RankCommand; import edu.brown.cs.student.term.repl.commands.SetupCommand; +import edu.brown.cs.student.term.trade.Trade; import joptsimple.OptionParser; import joptsimple.OptionSet; -import java.sql.Connection; +import java.io.OutputStream; +import java.io.PrintStream; +import java.time.Instant; import java.sql.Date; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.Statement; import java.util.HashMap; -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import joptsimple.OptionParser; -import joptsimple.OptionSet; import spark.*; import spark.template.freemarker.FreeMarkerEngine; - -import java.io.BufferedReader; -import java.io.InputStreamReader; - -import com.google.common.collect.ImmutableMap; - import freemarker.template.Configuration; //fix @@ -37,44 +30,21 @@ import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; -import java.sql.ResultSet; -import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.*; -import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; -import joptsimple.OptionParser; -import joptsimple.OptionSet; -import spark.ExceptionHandler; -import spark.ModelAndView; -import spark.QueryParamsMap; -import spark.Request; -import spark.Response; -import spark.Route; -import spark.Filter; -import spark.Spark; -import spark.TemplateViewRoute; -import spark.template.freemarker.FreeMarkerEngine; - -import freemarker.template.Configuration; +import com.google.gson.Gson; import org.json.JSONObject; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.Statement; /** * The Main class of our project. This is where execution begins. */ public final class Main { - // TODO: fix temproary solution public static JSONObject xmlLinks = null; - - + private static final Gson GSON = new Gson(); private static final int DEFAULT_PORT = 4567; /** @@ -97,12 +67,15 @@ public final class Main { OptionParser parser = new OptionParser(); parser.accepts("gui"); parser.accepts("port").withRequiredArg().ofType(Integer.class) - .defaultsTo(DEFAULT_PORT); + .defaultsTo(DEFAULT_PORT); parser.accepts("debug"); OptionSet options = parser.parse(args); if (options.has("gui")) { runSparkServer((int) options.valueOf("port")); + //will auto connect to correct db when running gui! + SetupCommand setConnection = new SetupCommand(); + setConnection.run(new String[] {"data/trades.sqlite3"}); } if (!options.has("debug")) { @@ -112,9 +85,11 @@ public final class Main { })); } + HashMap<String, Command> commandHashMap = new HashMap<>(); commandHashMap.put("setup", new SetupCommand()); commandHashMap.put("load", new LoadCommand()); + commandHashMap.put("rank", new RankCommand()); /** add commands to map here! */ REPL repl = new REPL(commandHashMap); repl.runREPL(); @@ -127,57 +102,121 @@ public final class Main { config.setDirectoryForTemplateLoading(templates); } catch (IOException ioe) { System.out.printf("ERROR: Unable use %s for template loading.%n", - templates); + templates); System.exit(1); } return new FreeMarkerEngine(config); } - public void runSparkServer(int port) { + public void runSparkServer(int port) { Spark.port(port); Spark.externalStaticFileLocation("src/main/resources/static"); Spark.exception(Exception.class, new ExceptionPrinter()); Spark.options("/*", - (request, response) -> { - - String accessControlRequestHeaders = request - .headers("Access-Control-Request-Headers"); - if (accessControlRequestHeaders != null) { - response.header("Access-Control-Allow-Headers", - accessControlRequestHeaders); - } - - String accessControlRequestMethod = request - .headers("Access-Control-Request-Method"); - if (accessControlRequestMethod != null) { - response.header("Access-Control-Allow-Methods", - accessControlRequestMethod); - } - - return "OK"; - }); - - + (request, response) -> { + + String accessControlRequestHeaders = request + .headers("Access-Control-Request-Headers"); + if (accessControlRequestHeaders != null) { + response.header("Access-Control-Allow-Headers", + accessControlRequestHeaders); + } + + String accessControlRequestMethod = request + .headers("Access-Control-Request-Method"); + if (accessControlRequestMethod != null) { + response.header("Access-Control-Allow-Methods", + accessControlRequestMethod); + } + + return "OK"; + }); Spark.before((request, response) -> response.header("Access-Control-Allow-Origin", "*")); - Spark.post("/data", new DataHandler()); + //TODO: Add system testing for all of our end points + Spark.post("/data", new SuspicionRankHandler()); + Spark.post("/profit", new ProfitQueryHandler()); + Spark.post("/trade-lookup", new TradeQueryHandler()); } + /** + * Gets the list of holders with id, name, and suspicion rank. + */ + private static class SuspicionRankHandler implements Route { + @Override + /** + * Expects that the request will contain two longs that are the start/end + * dates for the suspicion rank to run on as epoch time in milliseconds + */ + public Object handle(Request request, Response response) throws Exception { + //String str = request.body(); + //xmlLinks = new JSONObject(str); //this is all the filedAt times and xml files + try { + DatabaseQuerier db = SetupCommand.getDq(); + SuspicionRanker ranker = new SuspicionRanker(db); + + JSONObject data = new JSONObject(request.body()); + + long startMilli = data.getLong("start"); + long endMilli = data.getLong("end"); + Instant start = Instant.ofEpochMilli(startMilli); + Instant end = Instant.ofEpochMilli(endMilli); + List<Holder> suspiciousHolders = ranker.getSuspicionScoreList(start, end); + Map<String, Object> variables = ImmutableMap.of("holders", suspiciousHolders); + return GSON.toJson(variables); + } catch (Exception e) { + System.out.println("Error retrieving the suspicion ranks for GUI"); + return "Error"; + } + } + } - private static class DataHandler implements Route { + private static class ProfitQueryHandler implements Route { @Override public Object handle(Request request, Response response) throws Exception { - String str = request.body(); - xmlLinks = new JSONObject(str); //this is all the filedAt times and xml files + JSONObject req = new JSONObject(request.body()); + String person = req.getString("person"); + Date startPeriod = new Date(req.getLong("startTime")); + Date endPeriod = new Date(req.getLong("endTime")); + + ProfitCalculation profit = + new ProfitCalculation(DatabaseQuerier.getConn(), person, startPeriod, endPeriod); + List<StockHolding> holdings = profit.getHoldingsList(); + double gains = profit.calculateGains(); + double sp500PercentGain = profit.compareToSP500(); + + Map<String, Object> res = new HashMap<>(); + res.put("person", person); + res.put("moneyIn", profit.getMoneyInput()); + res.put("moneyOut", profit.getMoneyInput() + gains); + res.put("holdings", holdings); + res.put("percentGain", 100 * gains / profit.getMoneyInput()); + res.put("SP500", (1 + sp500PercentGain) * profit.getMoneyInput()); + res.put("percentSP500", 100 * sp500PercentGain); + return GSON.toJson(res); + } + + } + + private static class TradeQueryHandler implements Route { + @Override + public Object handle(Request request, Response response) throws Exception { + JSONObject req = new JSONObject(request.body()); + String person = req.getString("person"); + Date startPeriod = new Date(req.getLong("startTime")); + Date endPeriod = new Date(req.getLong("endTime")); + + DatabaseQuerier db = SetupCommand.getDq(); + List<Trade> trades = db.getAllTradesByHolder(person, startPeriod, endPeriod); + + return GSON.toJson(trades); - return "replace"; } } /** * Display an error page when an exception occurs in the server. - * */ private static class ExceptionPrinter implements ExceptionHandler { @Override @@ -192,6 +231,4 @@ public final class Main { res.body(stacktrace.toString()); } } - - }
\ No newline at end of file |