126 int oldInterval = interval; 127 super.setInterval(newInterval); 128 129 if (task != null) { 130 task.cancel(); 131 NotifierTask oldTask = task; 132 task = new NotifierTask(); 133 LocalEventTimer timer = LocalEventTimer.getInstance(); 134 CountedTimerTaskUtils.reschedule(timer, oldTask, task, 135 oldInterval, newInterval); 136 } 137 } 138 } 139 140 /** 141 * Fire MonitoredVmStructureChanged events. 142 * 143 * @param inserted List of Monitor objects inserted. 144 * @param removed List of Monitor objects removed. 145 */ 146 void fireMonitorStatusChangedEvents(List inserted, List removed) { 147 MonitorStatusChangeEvent ev = null; 148 ArrayList registered = null; 149 150 synchronized (listeners) { 151 registered = (ArrayList)listeners.clone(); 152 } 153 154 for (Iterator i = registered.iterator(); i.hasNext(); /* empty */) { 155 VmListener l = (VmListener)i.next(); 156 // lazily create the event object; 157 if (ev == null) { 158 ev = new MonitorStatusChangeEvent(this, inserted, removed); 159 } 160 l.monitorStatusChanged(ev); 161 } 162 } 163 164 /** 165 * Fire MonitoredUpdated events. 166 */ 167 void fireMonitorsUpdatedEvents() { 168 VmEvent ev = null; 169 ArrayList<VmListener> registered = null; 170 171 synchronized (listeners) { 172 registered = cast(listeners.clone()); 173 } 174 175 for (VmListener l : registered) { 176 // lazily create the event object; 177 if (ev == null) { 178 ev = new VmEvent(this); 179 } 180 l.monitorsUpdated(ev); 181 } 182 } 183 184 /** 185 * Class to notify listeners of Monitor related events for 186 * the target JVM. 187 */ 188 private class NotifierTask extends CountedTimerTask { 189 public void run() { 190 super.run(); 191 try { 192 MonitorStatus status = getMonitorStatus(); 193 List inserted = status.getInserted(); 194 List removed = status.getRemoved(); 195 196 if (!inserted.isEmpty() || !removed.isEmpty()) { 197 fireMonitorStatusChangedEvents(inserted, removed); 198 } 199 fireMonitorsUpdatedEvents(); 200 } catch (MonitorException e) { 201 // XXX: use logging api 202 System.err.println("Exception updating monitors for " 203 + getVmIdentifier()); 204 e.printStackTrace(); 205 } 206 } 207 } 208 // Suppress unchecked cast warning msg. 209 @SuppressWarnings("unchecked") 210 static <T> T cast(Object x) { 211 return (T) x; 212 } 213 } | 126 int oldInterval = interval; 127 super.setInterval(newInterval); 128 129 if (task != null) { 130 task.cancel(); 131 NotifierTask oldTask = task; 132 task = new NotifierTask(); 133 LocalEventTimer timer = LocalEventTimer.getInstance(); 134 CountedTimerTaskUtils.reschedule(timer, oldTask, task, 135 oldInterval, newInterval); 136 } 137 } 138 } 139 140 /** 141 * Fire MonitoredVmStructureChanged events. 142 * 143 * @param inserted List of Monitor objects inserted. 144 * @param removed List of Monitor objects removed. 145 */ 146 @SuppressWarnings("unchecked") // Cast of result of clone 147 void fireMonitorStatusChangedEvents(List<Monitor> inserted, List<Monitor> removed) { 148 MonitorStatusChangeEvent ev = null; 149 ArrayList<VmListener> registered = null; 150 151 synchronized (listeners) { 152 registered = (ArrayList)listeners.clone(); 153 } 154 155 for (Iterator<VmListener> i = registered.iterator(); i.hasNext(); /* empty */) { 156 VmListener l = i.next(); 157 // lazily create the event object; 158 if (ev == null) { 159 ev = new MonitorStatusChangeEvent(this, inserted, removed); 160 } 161 l.monitorStatusChanged(ev); 162 } 163 } 164 165 /** 166 * Fire MonitoredUpdated events. 167 */ 168 void fireMonitorsUpdatedEvents() { 169 VmEvent ev = null; 170 ArrayList<VmListener> registered = null; 171 172 synchronized (listeners) { 173 registered = cast(listeners.clone()); 174 } 175 176 for (VmListener l : registered) { 177 // lazily create the event object; 178 if (ev == null) { 179 ev = new VmEvent(this); 180 } 181 l.monitorsUpdated(ev); 182 } 183 } 184 185 /** 186 * Class to notify listeners of Monitor related events for 187 * the target JVM. 188 */ 189 private class NotifierTask extends CountedTimerTask { 190 public void run() { 191 super.run(); 192 try { 193 MonitorStatus status = getMonitorStatus(); 194 List<Monitor> inserted = status.getInserted(); 195 List<Monitor> removed = status.getRemoved(); 196 197 if (!inserted.isEmpty() || !removed.isEmpty()) { 198 fireMonitorStatusChangedEvents(inserted, removed); 199 } 200 fireMonitorsUpdatedEvents(); 201 } catch (MonitorException e) { 202 // XXX: use logging api 203 System.err.println("Exception updating monitors for " 204 + getVmIdentifier()); 205 e.printStackTrace(); 206 } 207 } 208 } 209 // Suppress unchecked cast warning msg. 210 @SuppressWarnings("unchecked") 211 static <T> T cast(Object x) { 212 return (T) x; 213 } 214 } |