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