aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulia McCauley <skurvyj@gmail.com>2021-04-17 22:48:01 -0400
committerJulia McCauley <skurvyj@gmail.com>2021-04-17 22:48:01 -0400
commitf17c3308e8c35e7a34c9b1ad82f5906da910432a (patch)
treea8aa3845a55ae6284cd2d517f180132255fbb069
parent1785b88bd4adab00aa641d7721a1314b4711ddf3 (diff)
added back our old main that got lost, woops
-rw-r--r--src/main/java/edu/brown/cs/student/term/Main.java185
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