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