1 /**********************************************************************
2 * Copyright (c) 2003 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Common Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/cpl-v10.html
9 * IBM - Initial API and implementation
10 **********************************************************************/
11 package net.sourceforge.phpdt.monitor.core.internal;
13 import java.io.ByteArrayInputStream;
14 import java.util.ArrayList;
15 import java.util.HashMap;
16 import java.util.Iterator;
17 import java.util.List;
20 import net.sourceforge.phpdt.monitor.core.IMonitor;
21 import net.sourceforge.phpdt.monitor.core.IMonitorListener;
22 import net.sourceforge.phpdt.monitor.core.IMonitorWorkingCopy;
23 import net.sourceforge.phpdt.monitor.core.IRequest;
24 import net.sourceforge.phpdt.monitor.core.IRequestListener;
26 import org.eclipse.core.runtime.Preferences;
30 public class MonitorManager {
31 private static final int ADD = 0;
32 private static final int CHANGE = 1;
33 private static final int REMOVE = 2;
36 protected List monitors;
37 protected Map threads = new HashMap();
39 protected List monitorListeners = new ArrayList();
42 protected List requests = new ArrayList();
44 protected List requestListeners = new ArrayList();
46 private Preferences.IPropertyChangeListener pcl;
47 protected boolean ignorePreferenceChanges = false;
49 protected static MonitorManager instance;
51 public static MonitorManager getInstance() {
53 instance = new MonitorManager();
57 private MonitorManager() {
60 pcl = new Preferences.IPropertyChangeListener() {
61 public void propertyChange(Preferences.PropertyChangeEvent event) {
62 if (ignorePreferenceChanges)
64 String property = event.getProperty();
65 if (property.equals("monitors")) {
71 MonitorPlugin.getInstance().getPluginPreferences().addPropertyChangeListener(pcl);
74 protected void dispose() {
75 MonitorPlugin.getInstance().getPluginPreferences().removePropertyChangeListener(pcl);
78 public IMonitorWorkingCopy createMonitor() {
79 return new MonitorWorkingCopy();
82 public List getMonitors() {
83 return new ArrayList(monitors);
86 protected void addMonitor(IMonitor monitor) {
87 if (!monitors.contains(monitor))
88 monitors.add(monitor);
89 fireMonitorEvent(monitor, ADD);
93 protected boolean isRunning(IMonitor monitor) {
94 return (threads.get(monitor) != null);
97 public void startMonitor(IMonitor monitor) throws Exception {
98 if (!monitors.contains(monitor))
101 if (AcceptThread.isPortInUse(monitor.getLocalPort()))
102 throw new Exception(MonitorPlugin.getString("%errorPortInUse"));
104 AcceptThread thread = new AcceptThread(monitor);
105 thread.startServer();
106 threads.put(monitor, thread);
109 public void stopMonitor(IMonitor monitor) {
110 if (!monitors.contains(monitor))
113 AcceptThread thread = (AcceptThread) threads.get(monitor);
114 if (thread != null) {
116 threads.remove(monitor);
120 protected void removeMonitor(IMonitor monitor) {
121 if (monitor.isRunning())
122 stopMonitor(monitor);
123 monitors.remove(monitor);
124 fireMonitorEvent(monitor, REMOVE);
128 protected void monitorChanged(IMonitor monitor) {
129 fireMonitorEvent(monitor, CHANGE);
134 * Add monitor listener.
138 public void addMonitorListener(IMonitorListener listener) {
139 monitorListeners.add(listener);
143 * Remove monitor listener.
147 public void removeMonitorListener(IMonitorListener listener) {
148 monitorListeners.remove(listener);
152 * Fire a monitor event.
156 protected void fireMonitorEvent(IMonitor monitor, int type) {
157 Object[] obj = monitorListeners.toArray();
159 int size = obj.length;
160 for (int i = 0; i < size; i++) {
161 IMonitorListener listener = (IMonitorListener) obj[i];
163 listener.monitorAdded(monitor);
164 else if (type == CHANGE)
165 listener.monitorChanged(monitor);
166 else if (type == REMOVE)
167 listener.monitorRemoved(monitor);
172 * Returns a list of the current requests.
174 * @return java.util.List
176 public List getRequests() {
181 * Add a new request response pair.
183 * @param pair org.eclipse.tcpip.monitor.RequestResponse
185 public void addRequest(IRequest rr) {
186 if (requests.contains(rr))
190 fireRequestEvent(rr, ADD);
193 public void requestChanged(IRequest rr) {
194 fireRequestEvent(rr, CHANGE);
197 public void removeRequest(IRequest rr) {
198 if (!requests.contains(rr))
202 fireRequestEvent(rr, REMOVE);
205 public void removeAllRequests() {
206 int size = requests.size();
207 IRequest[] rrs = new IRequest[size];
208 requests.toArray(rrs);
210 for (int i = 0; i < size; i++) {
211 removeRequest(rrs[i]);
216 * Add request listener.
220 public void addRequestListener(IRequestListener listener) {
221 requestListeners.add(listener);
225 * Remove request listener.
229 public void removeRequestListener(IRequestListener listener) {
230 requestListeners.remove(listener);
234 * Fire a request event.
238 protected void fireRequestEvent(IRequest rr, int type) {
239 int size = requestListeners.size();
240 IRequestListener[] xrl = MonitorPlugin.getInstance().getRequestListeners();
241 int size2 = xrl.length;
243 IRequestListener[] rl = new IRequestListener[size + size2];
244 System.arraycopy(xrl, 0, rl, 0, size2);
245 for (int i = 0; i < size; i++)
246 rl[size2 + i] = (IRequestListener) requestListeners.get(i);
248 for (int i = 0; i < size + size2; i++) {
249 IRequestListener listener = rl[i];
251 listener.requestAdded(rr);
252 else if (type == CHANGE)
253 listener.requestChanged(rr);
254 else if (type == REMOVE)
255 listener.requestRemoved(rr);
259 protected void loadMonitors() {
260 Trace.trace(Trace.FINEST, "Loading monitors");
262 monitors = new ArrayList();
263 Preferences prefs = MonitorPlugin.getInstance().getPluginPreferences();
264 String xmlString = prefs.getString("monitors");
265 if (xmlString != null && xmlString.length() > 0) {
267 ByteArrayInputStream in = new ByteArrayInputStream(xmlString.getBytes());
268 IMemento memento = XMLMemento.loadMemento(in);
270 IMemento[] children = memento.getChildren("monitor");
271 if (children != null) {
272 int size = children.length;
273 for (int i = 0; i < size; i++) {
274 Monitor monitor = new Monitor();
275 monitor.load(children[i]);
276 monitors.add(monitor);
279 } catch (Exception e) {
280 Trace.trace(Trace.WARNING, "Could not load monitors: " + e.getMessage());
285 protected void saveMonitors() {
287 ignorePreferenceChanges = true;
288 XMLMemento memento = XMLMemento.createWriteRoot("monitors");
290 Iterator iterator = monitors.iterator();
291 while (iterator.hasNext()) {
292 Monitor monitor = (Monitor) iterator.next();
293 IMemento child = memento.createChild("monitor");
297 String xmlString = memento.saveToString();
298 Preferences prefs = MonitorPlugin.getInstance().getPluginPreferences();
299 prefs.setValue("monitors", xmlString);
300 MonitorPlugin.getInstance().savePluginPreferences();
301 } catch (Exception e) {
302 Trace.trace(Trace.SEVERE, "Could not save browsers", e);
304 ignorePreferenceChanges = false;