View Javadoc

1   // ========================================================================
2   // Copyright (c) 2009-2010 Intalio, Inc.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at 
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses. 
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   * Deploy the jetty server instances when they are registered as an OSGi service.
28   */
29  public class JettyServerServiceTracker implements ServiceListener, IManagedJettyServerRegistry
30  {
31  
32      /**
33       * Servers indexed by PIDs. PIDs are generated by the ConfigurationAdmin service.
34       */
35      private Map<String, ServerInstanceWrapper> _serversIndexedByName = new HashMap<String, ServerInstanceWrapper>();
36      /** The context-handler to deactivate indexed by ServerInstanceWrapper */
37      private Map<ServiceReference, ServerInstanceWrapper> _indexByServiceReference = new HashMap<ServiceReference, ServerInstanceWrapper>();
38      
39  
40      /**
41       * Stops each one of the registered servers.
42       */
43      public void stop()
44      {
45          //not sure that this is really useful but here we go.
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       * Receives notification that a service has had a lifecycle change.
62       * 
63       * @param ev
64       *            The <code>ServiceEvent</code> object.
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                          // TODO Auto-generated catch block
84                          e.printStackTrace();
85                      }
86                  }
87              }
88              if (ev.getType() == ServiceEvent.UNREGISTERING)
89              {
90                  break;
91              }
92              else
93              {
94                  // modified, meaning: we reload it. now that we stopped it;
95                  // we can register it.
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      * Returns the ContextHandler to stop.
130      * 
131      * @param reg
132      * @return the ContextHandler to stop.
133      */
134     private ServerInstanceWrapper unregisterInIndex(ServiceReference sr)
135     {
136     	ServerInstanceWrapper handler = _indexByServiceReference.remove(sr);
137         if (handler == null)
138         {
139             // a warning?
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      * @param managedServerName The server name
152      * @return the corresponding jetty server wrapped with its deployment properties.
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 }