package be.jaud; import org.slf4j.LoggerFactory; import org.slf4j.Logger; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import org.json.JSONArray; import org.json.JSONObject; import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; import java.sql.ResultSet; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.TimeUnit; public class Main { private static final String version = "0.8"; private static final HashMap> udata = new HashMap<>(); public static Settings conf; static OebbCheck check = new OebbCheck(); static long time; static SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); public static ResilientExecutor service = new ResilientExecutor(1); public static final Logger LOG = LoggerFactory.getLogger(Main.class); public static void main(String[] args) { conf = Settings.getInstance(); LOG.info("OebbInfo Version {} starting.",version); try { refresh(); } catch (IOException e) { LOG.error("Error at refresh: {}", e.toString()); } HttpServer server = null; try { server = HttpServer.create(new InetSocketAddress(conf.getInt("port")), 0); } catch (IOException e) { LOG.error("Error at HttpServer: {}", e.toString()); } Runnable task = () -> { try { refresh(); } catch (IOException e) { LOG.error("Error at Task: {}", e.toString()); } }; service.scheduleAtFixedRate(task, 10, conf.getInt("refreshTime"), TimeUnit.SECONDS); if (server != null) { server.createContext("/oebbapi", new OebbHandler()); server.setExecutor(null); // creates a default executor server.start(); } final Thread mainThread = Thread.currentThread(); Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { LOG.info("OebbInfo Version {} stopping", version); service.shutdownNow(); mainThread.join(); } catch (InterruptedException e) { LOG.error("EXCEPTION WHEN STOPPING", e); } })); } private static void refresh() throws IOException { try{ ResultSet rs = MariaDB.load_users(); if (rs != null) { while (rs.next()) { HashMap data = new HashMap<>(); String user = rs.getString("user"); ResultSet rsu = MariaDB.load_user(user); if (rsu != null) { while (rsu.next()) { List list = new ArrayList<>(Arrays.asList(rsu.getString("notRunningDays").split(","))); data.put(rsu.getString("display"), check.getStatus(rsu.getString("Station"), rsu.getString("DepartureTime"), rsu.getString("FinalStop"), rsu.getString("TrainType"), String.valueOf(rsu.getInt("maxjourneys")), list)); } } udata.put(user,data); rs.close(); } } }catch (SQLException e){ LOG.error("Update issue", e); } time = System.currentTimeMillis(); } static class OebbHandler implements HttpHandler { @Override public void handle(HttpExchange t){ String[] req = t.getRequestURI().toString().split("/"); String user = req[2]; String response = createOutput(user); t.getResponseHeaders().put("Content-Type", Collections.singletonList("application/json")); try { t.sendResponseHeaders(200, response.getBytes().length); OutputStream os = t.getResponseBody(); os.write(response.getBytes()); os.close(); } catch (IOException e) { LOG.error("Error at HttpRequest: {}", e.toString()); } } } private static String createOutput(String user) { List title = new ArrayList<>(); try { ResultSet rsu = MariaDB.load_user(user); if (rsu != null) { while (rsu.next()) { title.add(rsu.getString("title")); } } rsu.close(); } catch (SQLException e) { throw new RuntimeException(e); } JSONObject dat = new JSONObject(); Date updatetime = new Date(time); dat.put("interval", conf.getInt("refreshTime") * 1000); JSONArray display = new JSONArray(); JSONObject monitor1 = new JSONObject(); monitor1.put("label", "Zug"); JSONArray layout = new JSONArray(); JSONObject text1 = new JSONObject(); text1.put("type", "text"); text1.put("x", 120); text1.put("y", 120); text1.put("text", "Abfahrten"); text1.put("font", 2); text1.put("color", conf.getString("textcolormain")); text1.put("background", conf.getString("bgcolormain")); JSONObject text2 = new JSONObject(); text2.put("type", "text"); text2.put("x", 120); text2.put("y", 170); text2.put("text", dateFormat.format(updatetime)); text2.put("color", conf.getString("textcolorupdate")); text2.put("font", 2); text2.put("background", conf.getString("bgcolormain")); JSONObject text3 = new JSONObject(); text3.put("type", "text"); text3.put("x", 120); text3.put("y", 210); text3.put("text", "Ver. " + version); text3.put("color", conf.getString("textcolorupdate")); text3.put("font", 2); text3.put("background", conf.getString("bgcolormain")); layout.put(text3); layout.put(text2); layout.put(text1); monitor1.put("data", layout); monitor1.put("labelColor", conf.getString("textcolormain")); monitor1.put("color", conf.getString("textcolormain")); monitor1.put("background", conf.getString("bgcolormain")); display.put(monitor1); JSONObject monitor2 = new JSONObject(); monitor2.put("label", title.get(0)); monitor2.put("labelColor", conf.getString("labelcolor")); monitor2.put("fullDraw", true); int zug1 = udata.get(user).get("1"); makeLabel(monitor2, zug1); display.put(monitor2); JSONObject monitor3 = new JSONObject(); monitor3.put("label", title.get(1)); monitor3.put("labelColor", conf.getString("labelcolor")); monitor3.put("fullDraw", true); int zug2 = udata.get(user).get("2"); makeLabel(monitor3, zug2); display.put(monitor3); JSONObject monitor4 = new JSONObject(); monitor4.put("label", title.get(2)); monitor4.put("labelColor", conf.getString("labelcolor")); monitor4.put("fullDraw", true); int zug3 = udata.get(user).get("3"); makeLabel(monitor4, zug3); display.put(monitor4); JSONObject monitor5 = new JSONObject(); monitor5.put("label", title.get(3)); monitor5.put("labelColor", conf.getString("labelcolor")); monitor5.put("fullDraw", true); int zug4 = udata.get(user).get("4"); makeLabel(monitor5, zug4); display.put(monitor5); dat.put("displays", display); return dat.toString(); } private static void makeLabel(JSONObject Monitor, int zeit){ if(zeit != 0){ Monitor.put("color",conf.getString("textcolordelay")); Monitor.put("background",conf.getString("bgcolordelay")); if(zeit > 0 && zeit < 9999){ Monitor.put("data",zeit); } else if(zeit == 9999) { Monitor.put("data",conf.getString("textcancelled")); } else if(zeit == -1) { Monitor.put("data",conf.getString("texterror")); } else { Monitor.put("data",conf.getString("textnotrun")); Monitor.put("color",conf.getString("textcolornotrun")); Monitor.put("background",conf.getString("bgcolornotrun")); } } else { Monitor.put("color",conf.getString("textcolor")); Monitor.put("data",conf.getString("textok")); Monitor.put("background",conf.getString("bgcolor")); } } }