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 { HashMap data = new HashMap<>(); try{ ResultSet rs = MariaDB.load_users(); if (rs != null) { while (rs.next()) { 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){ 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",conf.getString("monitors.monitor1.Title")); 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",conf.getString("monitors.monitor2.Title")); 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",conf.getString("monitors.monitor3.Title")); 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",conf.getString("monitors.monitor4.Title")); 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); System.out.println(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")); } } }