View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
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   * Deploy the jetty server instances when they are registered as an OSGi
36   * service.
37   */
38  public class JettyServerServiceTracker implements ServiceListener, IManagedJettyServerRegistry
39  {
40      private static Logger LOG = Log.getLogger(JettyServerServiceTracker.class.getName());
41  
42      /**
43       * Servers indexed by PIDs. PIDs are generated by the ConfigurationAdmin
44       * service.
45       */
46      private Map<String, ServerInstanceWrapper> _serversIndexedByName = new HashMap<String, ServerInstanceWrapper>();
47  
48      /** The context-handler to deactivate indexed by ServerInstanceWrapper */
49      private Map<ServiceReference, ServerInstanceWrapper> _indexByServiceReference = new HashMap<ServiceReference, ServerInstanceWrapper>();
50  
51      /**
52       * Stops each one of the registered servers.
53       */
54      public void stop()
55      {
56          // not sure that this is really useful but here we go.
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       * Receives notification that a service has had a lifecycle change.
72       * 
73       * @param ev The <code>ServiceEvent</code> object.
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                     // modified, meaning: we reload it. now that we stopped it;
103                     // we can register it.
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      * Returns the ContextHandler to stop.
142      * 
143      * @param reg
144      * @return the ContextHandler to stop.
145      */
146     private ServerInstanceWrapper unregisterInIndex(ServiceReference sr)
147     {
148         ServerInstanceWrapper handler = _indexByServiceReference.remove(sr);
149         if (handler == null)
150         {
151             // a warning?
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      * @param managedServerName The server name
164      * @return the corresponding jetty server wrapped with its deployment
165      *         properties.
166      */
167     public ServerInstanceWrapper getServerInstanceWrapper(String managedServerName)
168     {
169         return _serversIndexedByName.get(managedServerName == null ? OSGiServerConstants.MANAGED_JETTY_SERVER_DEFAULT_NAME : managedServerName);
170     }
171 
172 }