1
2
3
4
5
6
7
8
9
10
11
12
13 package org.eclipse.jetty.osgi.boot.internal.serverfactory;
14
15 import java.util.HashMap;
16 import java.util.Map;
17 import java.util.Properties;
18
19 import org.eclipse.jetty.osgi.boot.OSGiServerConstants;
20 import org.eclipse.jetty.server.Server;
21 import org.osgi.framework.Bundle;
22 import org.osgi.framework.ServiceEvent;
23 import org.osgi.framework.ServiceListener;
24 import org.osgi.framework.ServiceReference;
25
26
27
28
29 public class JettyServerServiceTracker implements ServiceListener, IManagedJettyServerRegistry
30 {
31
32
33
34
35 private Map<String, ServerInstanceWrapper> _serversIndexedByName = new HashMap<String, ServerInstanceWrapper>();
36
37 private Map<ServiceReference, ServerInstanceWrapper> _indexByServiceReference = new HashMap<ServiceReference, ServerInstanceWrapper>();
38
39
40
41
42
43 public void stop()
44 {
45
46 for (ServerInstanceWrapper wrapper : _serversIndexedByName.values())
47 {
48 try
49 {
50 wrapper.stop();
51 }
52 catch (Throwable t)
53 {
54
55 }
56 }
57 }
58
59
60
61
62
63
64
65
66 public void serviceChanged(ServiceEvent ev)
67 {
68 ServiceReference sr = ev.getServiceReference();
69 switch (ev.getType())
70 {
71 case ServiceEvent.MODIFIED:
72 case ServiceEvent.UNREGISTERING:
73 {
74 ServerInstanceWrapper instance = unregisterInIndex(ev.getServiceReference());
75 if (instance != null)
76 {
77 try
78 {
79 instance.stop();
80 }
81 catch (Exception e)
82 {
83
84 e.printStackTrace();
85 }
86 }
87 }
88 if (ev.getType() == ServiceEvent.UNREGISTERING)
89 {
90 break;
91 }
92 else
93 {
94
95
96 }
97 case ServiceEvent.REGISTERED:
98 {
99 Bundle contributor = sr.getBundle();
100 Server server = (Server)contributor.getBundleContext().getService(sr);
101 ServerInstanceWrapper wrapper = registerInIndex(server, sr);
102 Properties props = new Properties();
103 for (String key : sr.getPropertyKeys())
104 {
105 Object value = sr.getProperty(key);
106 props.put(key, value);
107 }
108 wrapper.start(server, props);
109 break;
110 }
111 }
112 }
113
114 private ServerInstanceWrapper registerInIndex(Server server, ServiceReference sr)
115 {
116 String name = (String)sr.getProperty(OSGiServerConstants.MANAGED_JETTY_SERVER_NAME);
117 if (name == null)
118 {
119 throw new IllegalArgumentException("The property " +
120 OSGiServerConstants.MANAGED_JETTY_SERVER_NAME + " is mandatory");
121 }
122 ServerInstanceWrapper wrapper = new ServerInstanceWrapper(name);
123 _indexByServiceReference.put(sr,wrapper);
124 _serversIndexedByName.put(name,wrapper);
125 return wrapper;
126 }
127
128
129
130
131
132
133
134 private ServerInstanceWrapper unregisterInIndex(ServiceReference sr)
135 {
136 ServerInstanceWrapper handler = _indexByServiceReference.remove(sr);
137 if (handler == null)
138 {
139
140 return null;
141 }
142 String name = handler.getManagedServerName();
143 if (name != null)
144 {
145 _serversIndexedByName.remove(name);
146 }
147 return handler;
148 }
149
150
151
152
153
154 public ServerInstanceWrapper getServerInstanceWrapper(String managedServerName)
155 {
156 return _serversIndexedByName.get(managedServerName == null
157 ? OSGiServerConstants.MANAGED_JETTY_SERVER_DEFAULT_NAME : managedServerName);
158 }
159
160
161 }