diff --git a/src/main/java/altk/comm/engine/Broadcast.java b/src/main/java/altk/comm/engine/Broadcast.java index ed97912..85a614c 100644 --- a/src/main/java/altk/comm/engine/Broadcast.java +++ b/src/main/java/altk/comm/engine/Broadcast.java @@ -889,8 +889,8 @@ public abstract class Broadcast statusBf.append(""); - statusBf.append("" + daily_pause + "\n"); + statusBf.append(">\n"); + statusBf.append("" + daily_pause + ""); statusBf.append("" + daily_resume + "\n"); statusBf.append(additionalStatusXML()); statusBf.append(""); @@ -1440,11 +1440,12 @@ public abstract class Broadcast } } + @SuppressWarnings("unchecked") public JSONObject getConfigJSON() { - Map dataMap = new HashMap(); + JSONObject dataMap = new JSONObject(); dataMap.put(CommEngine.DAILY_PAUSE_KEY, daily_pause); dataMap.put(CommEngine.DAILY_RESUME_KEY, daily_resume); - return new JSONObject(dataMap); + return dataMap; } } diff --git a/src/main/java/altk/comm/engine/CommEngine.java b/src/main/java/altk/comm/engine/CommEngine.java index 43cc163..6cb061f 100644 --- a/src/main/java/altk/comm/engine/CommEngine.java +++ b/src/main/java/altk/comm/engine/CommEngine.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.time.LocalTime; import java.time.format.DateTimeFormatter; +import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; @@ -14,6 +15,8 @@ import java.util.Map; import java.util.Properties; import java.util.Vector; import java.util.concurrent.ScheduledExecutorService; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -23,7 +26,6 @@ import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; -import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -102,8 +104,6 @@ public abstract class CommEngine extends HttpServlet { while (!threadShouldStop) { - long startTime = System.currentTimeMillis();; - String timeOfDay = LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm")); // Check for pause for (Broadcast broadcast : broadcasts.values()) @@ -123,9 +123,8 @@ public abstract class CommEngine extends HttpServlet else if (timeOfDay.equals(daily_resume)) broadcast.resume("clock", null); } - // Wakes up every 1/2 minute to provide minute resolution long currentTime = System.currentTimeMillis(); - long sleepTime = startTime + 30*1000 - currentTime; + long sleepTime = 60000 + 30000 - currentTime % 60000; if (sleepTime > 0) { try @@ -251,11 +250,7 @@ public abstract class CommEngine extends HttpServlet notInService = true; return; } - - // Set up periodic purge of stale broadcasts, based on deadBroadcastViewingMinutes - String periodStr = config.getProperty("dead_broadcast_viewing_period", Long.toString(DEAD_BROADCAST_VIEWING_PERIOD_DEFAULT)); - deadBroadcastViewingMinutes = Long.parseLong(periodStr); - + String timeOfDay, timeOfDayStr, key; key = DAILY_RESUME_KEY; timeOfDayStr = config.getProperty(key , ""); @@ -283,7 +278,18 @@ public abstract class CommEngine extends HttpServlet dailyClock = new DailyClock(); dailyClock.start(); - initChild(); + try + { + // Set up periodic purge of stale broadcasts, based on deadBroadcastViewingMinutes + String periodStr = config.getProperty("dead_broadcast_viewing_period", Long.toString(DEAD_BROADCAST_VIEWING_PERIOD_DEFAULT)); + deadBroadcastViewingMinutes = Long.parseLong(periodStr); + + initChild(); + } + catch (Exception e) + { + throw new ServletException(e.getMessage(), e); + } } public int getPauseThreshold() @@ -463,29 +469,40 @@ public abstract class CommEngine extends HttpServlet out.print(configuration); } - private JSONObject getConfigJSON() + @SuppressWarnings("unchecked") + private JSONObject getConfigJSON() { - Map dataMap = new HashMap(); + JSONObject config = new JSONObject(); // engine configuration - Map EngineMap = new HashMap(); - dataMap.put("engine", EngineMap); - EngineMap.put(DAILY_PAUSE_KEY, daily_pause); - EngineMap.put(DAILY_RESUME_KEY, daily_resume); + JSONObject EngineConfig = new JSONObject(); + config.put("engine", EngineConfig); + EngineConfig.put(DAILY_PAUSE_KEY, daily_pause); + EngineConfig.put(DAILY_RESUME_KEY, daily_resume); // broadcast configuration - Map broadcastsMap = new HashMap(); + JSONObject broadcastsConfig = new JSONObject(); synchronized (broadcasts) { for (String broadcastId : broadcasts.keySet()) { Broadcast broadcast = broadcasts.get(broadcastId); if (broadcast.getState().isFinal) continue; - JSONObject configJSON = broadcast.getConfigJSON(); - broadcastsMap.put(broadcastId, configJSON); + broadcastsConfig.put(broadcastId, broadcast.getConfigJSON()); } } - if (broadcastsMap.size() > 0) dataMap.put("broadcasts", broadcastsMap); - return new JSONObject(dataMap); + if (broadcastsConfig.size() > 0) config.put("broadcasts", broadcastsConfig); + + childAddConfig(config); + + return config; + } + + /** + * Derived class may add to configMap + * @param configMap + */ + protected void childAddConfig(JSONObject config) + { } private void cancelBroadcast(HttpServletRequest request, PrintWriter out) @@ -538,7 +555,13 @@ public abstract class CommEngine extends HttpServlet protected static String checkTimeOfDay(String timeOfDay) { timeOfDay = timeOfDay.trim(); if (timeOfDay.length() == 0) return timeOfDay; - if (timeOfDay.length() != 5) return null; + // pattern hh:mm + Pattern pattern = Pattern.compile("^(\\d\\d):[0-5]\\d$"); + Matcher matcher = pattern.matcher(timeOfDay); + if (!matcher.find()) return null; + // Check hour in range + String hh = matcher.group(1); + if (Integer.parseInt(hh) > 23) return null; return timeOfDay; } @@ -548,7 +571,8 @@ public abstract class CommEngine extends HttpServlet * @param out */ protected void configure(HttpServletRequest request, PrintWriter out) { - JSONObject currConfig = getConfigJSON(); + // save original configuration for roll back in case of error + JSONObject origConfigJSON = getConfigJSON(); String jsonString = request.getParameter("data"); try { @@ -558,9 +582,9 @@ public abstract class CommEngine extends HttpServlet } catch (Exception e) { myLogger.error(e); out.write("Error - " + e.getMessage()); - // restore to original confiuration + // restore current confiuration try { - configure(currConfig); + configure(origConfigJSON); } catch (Exception e1) { out.write("\nInternal error in restoring original configuration: " + e1.getMessage()); } @@ -601,9 +625,19 @@ public abstract class CommEngine extends HttpServlet broadcast.configure(broadcastConfig); } } + // derived class + configureChild(configuration); } /** + * Derived class updates itself from given configuration. + * @param configuration + */ + protected void configureChild(JSONObject configuration) + { + } + + /** * * status of each broadcast * tttnnn @@ -656,6 +690,7 @@ public abstract class CommEngine extends HttpServlet out.write(broadcast.mkStatusReport() + "\n"); } out.write("\n"); + out.write("" + daily_pause + "" + daily_resume + "\n"); out.write(""); } }