📄 eventengine.java
字号:
} public synchronized void updateFromDB() { devDB.startDBUpdate(); Class[] ddbClass = new Class[1]; Object[] o = new Object[] { devDB }; try { ddbClass[0] = Class.forName("no.ntnu.nav.eventengine.DeviceDB"); } catch (ClassNotFoundException e) { System.err.println("ClassNotFoundException when getting DeviceDB reference: " + e.getMessage()); e.printStackTrace(System.err); } List deviceClassList = new ArrayList(); for (Iterator i = deviceClassMap.values().iterator(); i.hasNext();) { Class c = (Class)i.next(); deviceClassList.add(new DeviceClassEntry(findDepth(c), c)); } Collections.sort(deviceClassList); for (Iterator i = deviceClassList.iterator(); i.hasNext();) { Class c = ((DeviceClassEntry)i.next()).deviceClass; try { Method m = c.getMethod("updateFromDB", ddbClass); m.invoke(null, o); } catch (NoSuchMethodException e) { Log.w("PLUGIN_MONITOR_TASK", "CONSTRUCTOR", "NoSuchMethodException when invoking updateFromDB in class " + c.getName() + ": " + e.getMessage()); e.printStackTrace(System.err); } catch (IllegalAccessException e) { Log.w("PLUGIN_MONITOR_TASK", "CONSTRUCTOR", "IllegalAccessException when invoking updateFromDB in class " + c.getName() + ": " + e.getMessage()); e.printStackTrace(System.err); } catch (InvocationTargetException e) { Log.w("PLUGIN_MONITOR_TASK", "CONSTRUCTOR", "InvocationTargetException when invoking updateFromDB in class " + c.getName() + ": " + e.getMessage()); e.printStackTrace(System.err); } } devDB.endDBUpdate(); classDepthCache.clear(); // Now call 'init' for all devices for (Iterator i = deviceMap.values().iterator(); i.hasNext();) ((Device)i.next()).init(devDB); //Device d = (Device)devDB.getDevice(279); //errl("Found:\n"+d); } class DeviceClassEntry implements Comparable { int depth; Class deviceClass; public DeviceClassEntry(int depth, Class c) { this.depth = depth; this.deviceClass = c; } public int compareTo(Object o) { DeviceClassEntry dc = (DeviceClassEntry)o; return new Integer(depth).compareTo(new Integer(dc.depth)) * -1; // Sort in reverse order, biggest first } } HashMap classDepthCache = new HashMap(); private int findDepth(Class c) { Integer depth; if ( (depth=(Integer)classDepthCache.get(c.getName())) != null) return depth.intValue(); Class parent = c.getSuperclass(); if (parent == null) return 0; classDepthCache.put(c.getName(), depth = new Integer(findDepth(parent)+1)); Log.d("PLUGIN_MONITOR_TASK", "CONSTRUCTOR", "Class " + c.getName() + " has depth " + depth.intValue()); return depth.intValue(); } private boolean update(File pluginDir, Map fileMap, Map pluginMap, File[] dependFiles) { // The cloneMap is used to remove plugins whose .jar file is deleted Map cloneMap = (Map) ((HashMap)pluginMap).clone(); boolean hasChanged = false; File[] fileList = pluginDir.listFiles(); if (dependFiles != null) { for (int i=0; i < dependFiles.length; i++) { try { cl.appendURL(dependFiles[i].toURL()); } catch (MalformedURLException e) {} // Should never happen } } for (int i=0; i < fileList.length; i++) { if (!fileList[i].getName().toLowerCase().endsWith(".jar")) continue; cloneMap.remove(fileList[i].getName()); try { Long lastMod; // If new or modified JAR if ( (lastMod=(Long)fileMap.get(fileList[i].getName())) == null || !lastMod.equals(new Long(fileList[i].lastModified())) ) { fileMap.put(fileList[i].getName(), new Long(fileList[i].lastModified())); cl.appendURL(fileList[i].toURL()); JarFile jf = new JarFile(fileList[i]); Manifest mf = jf.getManifest(); Attributes attr = mf.getMainAttributes(); String cn = attr.getValue("Plugin-Class"); Log.d("PLUGIN_MONITOR_TASK", "UPDATE", "New or modified jar, trying to load " + fileList[i].getName()); if (cn == null) { Log.d("PLUGIN_MONITOR_TASK", "UPDATE", "JAR is missing Plugin-Class manifest, skipping..."); continue; } Class c, deviceClass, handlerInterface; try { deviceClass = Class.forName("no.ntnu.nav.eventengine.Device"); handlerInterface = Class.forName("no.ntnu.nav.eventengine.EventHandler"); c = cl.loadClass(cn); } catch (ClassNotFoundException e) { Log.w("PLUGIN_MONITOR_TASK", "UPDATE", "Class " + cn + " not found in jar " + fileList[i].getName() + ", msg: " + e.getMessage()); continue; } catch (NoClassDefFoundError e) { Log.w("PLUGIN_MONITOR_TASK", "UPDATE", "NoClassDefFoundError when loading class " + cn + " from jar " + fileList[i].getName() + ", msg: " + e.getMessage()); continue; } if (deviceClass.isAssignableFrom(c) || handlerInterface.isAssignableFrom(c)) { // Found new Device, add to list pluginMap.put(fileList[i].getName(), c); hasChanged = true; Log.d("PLUGIN_MONITOR_TASK", "UPDATE", "OK! JAR Loaded and added to pluginMap"); } else { Log.w("PLUGIN_MONITOR_TASK", "UPDATE", "Failed! Class " + cn + " is not an event engine plugin"); } } } catch (IOException e) { Log.e("PLUGIN_MONITOR_TASK", "UPDATE", "IOException when loading jar " + fileList[i].getName() + ", msg: " + e.getMessage()); } } Iterator i = cloneMap.keySet().iterator(); while (i.hasNext()) { String fn = (String)i.next(); Log.d("PLUGIN_MONITOR_TASK", "UPDATE", "Removing jar " + fn + " from pluginMap"); pluginMap.remove(fn); fileMap.remove(fn); hasChanged = true; } return hasChanged; } class DynamicURLClassLoader extends URLClassLoader { Set urlSet = new HashSet(); DynamicURLClassLoader() { super(new URL[0]); } public void appendURL(URL u) { if (urlSet.add(u)) { addURL(u); } } }}class EventqMonitorTask extends TimerTask implements EventHandler{ MessagePropagator mp; Map handlerClassMap; DeviceDBImpl devDB; ConfigFileMonitorTask cfmt; Map handlerCache = new HashMap(); int lastEventqid = 0; public EventqMonitorTask(MessagePropagator mp, Map handlerClassMap, DeviceDBImpl devDB, ConfigFileMonitorTask cfmt) { this.mp = mp; this.handlerClassMap = handlerClassMap; this.devDB = devDB; this.cfmt = cfmt; } public void updateCache() { //Map cloneMap = (Map) ((HashMap)handlerClassMap).clone(); handlerCache.clear(); handlerCache.put(handleEventTypes()[0], new ArrayList( Arrays.asList(new Object[] { this }) )); handlerCache.put("_all", new ArrayList()); for (Iterator i=handlerClassMap.values().iterator(); i.hasNext();) { Class c = (Class)i.next(); EventHandler eh; try { eh = (EventHandler)c.newInstance(); } catch (InstantiationException e) { Log.w("EVENTQ_MONITOR_TASK", "UPDATE_CACHE", "Main EventHandler plugin class must have a public default (no args) constructor:" + e.getMessage()); continue; } catch (IllegalAccessException e) { Log.w("EVENTQ_MONITOR_TASK", "UPDATE_CACHE", "Main EventHandler plugin class must have a public default (no args) constructor:" + e.getMessage()); continue; } String[] s = eh.handleEventTypes(); for (int j=0; j < s.length; j++) { List l; if ( (l=(List)handlerCache.get(s[j])) == null) handlerCache.put( s[j], l=new ArrayList()); l.add(eh); } } } public String[] handleEventTypes() { return new String[] { "notification" }; } public void handle(DeviceDB ddb, Event e, ConfigParser cp) { // Event for me! String cmd = e.getVar("command"); if ("updateFromDB".equals(cmd)) { mp.updateFromDB(); e.dispose(); } else if ("dumpDeviceList".equals(cmd)) { List devL = new ArrayList(); for (Iterator it=devDB.getDeviceMap().keySet().iterator(); it.hasNext();) { devL.add(it.next()); } Collections.sort(devL); Log.d("EVENTQ_MONITOR_TASK", "DUMP_DEVICE_LIST", "Devices known: " + devL); e.dispose(); } else { Log.d("EVENTQ_MONITOR_TASK", "RUN", "Unknown notification command: " + cmd); e.defer("Unknown notification command: " + cmd); } } public void run() { try { ResultSet rs = Database.query("SELECT eventqid,source,deviceid,netboxid,subid,time,eventtypeid,state,value,severity,var,val FROM eventq LEFT JOIN eventqvar USING (eventqid) WHERE eventqid > "+lastEventqid + " AND target='eventEngine' AND severity >= 0 ORDER BY eventqid"); List eventList = new ArrayList(); while (rs.next()) { eventList.add(DeviceDBImpl.eventFactory(rs)); } if (rs.last()) if (rs.getInt("eventqid") > lastEventqid) lastEventqid = rs.getInt("eventqid"); if (!eventList.isEmpty()) { Log.d("EVENTQ_MONITOR_TASK", "RUN", "Fetched " + eventList.size() + " events from eventq"); } else { return; } int eventCnt=0; for (Iterator it = eventList.iterator(); it.hasNext();) { Event e = (Event)it.next(); eventCnt++; Log.d("EVENTQ_MONITOR_TASK", "RUN", "Got event: " + e); String eventtypeid = e.getEventtypeid(); List eventHandlerList = new ArrayList( (List)handlerCache.get("_all")); // Handlers handling all events { List handlers = (List) handlerCache.get( (handlerCache.containsKey(eventtypeid) ? eventtypeid : "info") ) ; if (handlers != null) eventHandlerList.addAll(handlers); } if (eventHandlerList.isEmpty()) { Log.w("EVENTQ_MONITOR_TASK", "RUN", "No handler found for eventtype: " + eventtypeid); continue; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -