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