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.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   * Deploy the jetty server instances when they are registered as an OSGi
30   * service.
31   */
32  public class JettyServerServiceTracker implements ServiceListener, IManagedJettyServerRegistry
33  {
34      private static Logger LOG = Log.getLogger(JettyServerServiceTracker.class.getName());
35  
36      /**
37       * Servers indexed by PIDs. PIDs are generated by the ConfigurationAdmin
38       * service.
39       */
40      private Map<String, ServerInstanceWrapper> _serversIndexedByName = new HashMap<String, ServerInstanceWrapper>();
41  
42      /** The context-handler to deactivate indexed by ServerInstanceWrapper */
43      private Map<ServiceReference, ServerInstanceWrapper> _indexByServiceReference = new HashMap<ServiceReference, ServerInstanceWrapper>();
44  
45      /**
46       * Stops each one of the registered servers.
47       */
48      public void stop()
49      {
50          // not sure that this is really useful but here we go.
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       * Receives notification that a service has had a lifecycle change.
66       * 
67       * @param ev The <code>ServiceEvent</code> object.
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                      // modified, meaning: we reload it. now that we stopped it;
97                      // we can register it.
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      * Returns the ContextHandler to stop.
136      * 
137      * @param reg
138      * @return the ContextHandler to stop.
139      */
140     private ServerInstanceWrapper unregisterInIndex(ServiceReference sr)
141     {
142         ServerInstanceWrapper handler = _indexByServiceReference.remove(sr);
143         if (handler == null)
144         {
145             // a warning?
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      * @param managedServerName The server name
158      * @return the corresponding jetty server wrapped with its deployment
159      *         properties.
160      */
161     public ServerInstanceWrapper getServerInstanceWrapper(String managedServerName)
162     {
163         return _serversIndexedByName.get(managedServerName == null ? OSGiServerConstants.MANAGED_JETTY_SERVER_DEFAULT_NAME : managedServerName);
164     }
165 
166 }