View Javadoc

1   // ========================================================================
2   // Copyright (c) 2009 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  // Contributors:
13  //    Hugues Malphettes - initial API and implementation
14  // ========================================================================
15  package org.eclipse.jetty.osgi.boot.internal.serverfactory;
16  
17  import java.util.Dictionary;
18  import java.util.HashMap;
19  import java.util.Map;
20  
21  import org.eclipse.jetty.server.Server;
22  import org.osgi.service.cm.ConfigurationException;
23  import org.osgi.service.cm.ManagedServiceFactory;
24  
25  /**
26   * This is a work in progress. <br/>
27   * In particular there is a lot of work required during the update of the
28   * configuration of a server. It might not be practical to in fact support that
29   * and re-deploy the webapps in the same state than before the server was
30   * stopped.
31   * <p>
32   * jetty servers are managed as OSGi services registered here. try to find out
33   * if a configuration will fail (ports already opened etc).
34   * </p>
35   * <p>
36   * Try to enable the creation and configuration of jetty servers in all the
37   * usual standard ways. The configuration of the server is defined by the
38   * properties passed to the service:
39   * <ol>
40   * <li>First look for jettyfactory. If the value is a jetty server, use that
41   * server</li>
42   * <li>Then look for jettyhome key. The value should be a java.io.File or a
43   * String that is a path to the folder It is required that a etc/jetty.xml file
44   * will be loated from that folder.</li>
45   * <li>Then look for a jettyxml key. The value should be a java.io.File or an
46   * InputStream that contains a jetty configuration file.</li>
47   * <li>TODO: More ways to configure a jetty server? (other IOCs like spring,
48   * equinox properties...)</li>
49   * <li>Throw an exception if none of the relevant parameters are found</li>
50   * </ol>
51   * </p>
52   * 
53   * @author hmalphettes
54   */
55  public class JettyServersManagedFactory implements ManagedServiceFactory
56  {
57  
58      /**
59       * key to configure the server according to a jetty home folder. the value
60       * is the corresponding java.io.File
61       */
62      public static final String JETTY_HOME = "jettyhome";
63      /** key to configure the server according to a jetty.xml file */
64      public static final String JETTY_CONFIG_XML = "jettyxml";
65  
66      /**
67       * invoke jetty-factory class. the value of this property is the instance of
68       * that class to call back.
69       */
70      public static final String JETTY_FACTORY = "jettyfactory";
71  
72      /**
73       * default property in jetty.xml that is used as the value of the http port.
74       */
75      public static final String JETTY_HTTP_PORT = "jetty.http.port";
76      /**
77       * default property in jetty.xml that is used as the value of the https
78       * port.
79       */
80      public static final String JETTY_HTTPS_PORT = "jetty.http.port";
81  
82      private Map<String, Server> _servers = new HashMap<String, Server>();
83  
84      /**
85       * Return a descriptive name of this factory.
86       * 
87       * @return the name for the factory, which might be localized
88       */
89      public String getName()
90      {
91          return getClass().getName();
92      }
93  
94      public void updated(String pid, Dictionary properties) throws ConfigurationException
95      {
96          Server server = _servers.get(pid);
97          deleted(pid);
98          // do we need to collect the currently deployed http services and
99          // webapps
100         // to be able to re-deploy them later?
101         // probably not. simply restart and see the various service trackers
102         // do everything that is needed.
103 
104     }
105 
106     public synchronized void deleted(String pid)
107     {
108         Server server = (Server)_servers.remove(pid);
109         if (server != null)
110         {
111             try
112             {
113                 server.stop();
114             }
115             catch (Exception e)
116             {
117                 e.printStackTrace();
118             }
119         }
120     }
121 
122 }