I apologize for the delay, but I must object to most of the code included in JettyContainerImpl that has to do with constructing and manipulating other gbeans for connectors. This needs to be in a separate class, outside of the jetty runtime. It is essentially a small builder module. I think the most appropriate place for it is in the web console, but I might be convinced otherwise. In any case it is not acceptable to me for builder code such as this to be in a runtime module. I have no problem with the being in a module not required for runtime use of the component being reconfigured, here jetty.

In addition, I think that the getConnectors() method assumes that there is only one JettyContainer running. I don't think this is necessarily valid.

Sorry for the delay,
david jencks

On Aug 6, 2005, at 2:05 PM, [EMAIL PROTECTED] wrote:

Author: ammulder
Date: Sat Aug  6 14:05:32 2005
New Revision: 230589

URL: http://svn.apache.org/viewcvs?rev=230589&view=rev
Log:
Start work on implementing management API in Jetty
 - standardize network/SSL properties
 - container can add/remove connectors

Added:
geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyWebConnector.java
Modified:
    geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml
    geronimo/trunk/modules/assembly/src/plan/jetty-config.xml
geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyContainer.java geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyContainerImpl.java geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/AJP13Connector.java geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/HTTPConnector.java geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/HTTPSConnector.java geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/JettyConnector.java geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/ connector/HTTPConnectorTest.java

Modified: geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/assembly/src/ plan/j2ee-server-plan.xml?rev=230589&r1=230588&r2=230589&view=diff ======================================================================= ======= --- geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml (original) +++ geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml Sat Aug 6 14:05:32 2005
@@ -228,7 +228,7 @@
<gbean gbeanName="openejb:type=NetworkService,name=EJB" class="org.openejb.server.StandardServiceStackGBean">
         <attribute name="name">EJB</attribute>
         <attribute name="port">${PlanOpenEJBPort}</attribute>
-        <attribute name="address">${PlanServerHostname}</attribute>
+        <attribute name="host">${PlanServerHostname}</attribute>
<attribute name="allowHosts">${PlanClientAddresses}</attribute> <attribute name="logOnSuccess">HOST,NAME,THREADID,USERID</attribute>
         <attribute name="logOnFailure">HOST,NAME</attribute>

Modified: geronimo/trunk/modules/assembly/src/plan/jetty-config.xml
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/assembly/src/ plan/jetty-config.xml?rev=230589&r1=230588&r2=230589&view=diff ======================================================================= ======= --- geronimo/trunk/modules/assembly/src/plan/jetty-config.xml (original) +++ geronimo/trunk/modules/assembly/src/plan/jetty-config.xml Sat Aug 6 14:05:32 2005
@@ -53,7 +53,7 @@
         <attribute name="password">secret</attribute>
         <attribute name="keyPassword">secret</attribute>
         <attribute name="needClientAuth">false</attribute>
-        <attribute name="protocol">TLS</attribute>
+        <attribute name="secureProtocol">TLS</attribute>
         <attribute name="maxThreads">50</attribute>
         <attribute name="minThreads">10</attribute>
<reference name="JettyContainer"><name>WebContainer</name></reference>

Modified: geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyContainer.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/ org/apache/geronimo/jetty/JettyContainer.java? rev=230589&r1=230588&r2=230589&view=diff ======================================================================= ======= --- geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyContainer.java (original) +++ geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyContainer.java Sat Aug 6 14:05:32 2005
@@ -21,11 +21,12 @@
 import org.mortbay.http.HttpListener;
 import org.mortbay.http.RequestLog;
 import org.mortbay.http.UserRealm;
+import org.apache.geronimo.j2ee.management.geronimo.WebContainer;

 /**
  * @version $Rev$ $Date$
  */
-public interface JettyContainer {
+public interface JettyContainer extends WebContainer {
     void addListener(HttpListener listener);

     void removeListener(HttpListener listener);

Modified: geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyContainerImpl.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/ org/apache/geronimo/jetty/JettyContainerImpl.java? rev=230589&r1=230588&r2=230589&view=diff ======================================================================= ======= --- geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyContainerImpl.java (original) +++ geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyContainerImpl.java Sat Aug 6 14:05:32 2005
@@ -19,25 +19,54 @@

 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.ArrayList;

+import javax.management.ObjectName;
+import javax.management.MalformedObjectNameException;
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
 import org.apache.geronimo.gbean.GBeanLifecycle;
+import org.apache.geronimo.gbean.GBeanQuery;
+import org.apache.geronimo.gbean.GBeanData;
 import org.apache.geronimo.webservices.SoapHandler;
 import org.apache.geronimo.webservices.WebServiceContainer;
+import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.GBeanNotFoundException;
+import org.apache.geronimo.kernel.NoSuchOperationException;
+import org.apache.geronimo.kernel.management.StateManageable;
+import org.apache.geronimo.kernel.management.State;
+import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
+import org.apache.geronimo.j2ee.management.impl.Util;
+import org.apache.geronimo.jetty.connector.HTTPConnector;
+import org.apache.geronimo.jetty.connector.HTTPSConnector;
+import org.apache.geronimo.jetty.connector.AJP13Connector;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.mortbay.http.*;
 import org.mortbay.jetty.Server;

 /**
  * @version $Rev$ $Date$
  */
-public class JettyContainerImpl implements JettyContainer, SoapHandler, GBeanLifecycle { +public class JettyContainerImpl implements JettyContainer, SoapHandler, StateManageable, GBeanLifecycle { + private final static Log log = LogFactory.getLog(JettyContainerImpl.class);
     private final Server server;
     private final Map webServices = new HashMap();
+    private Kernel kernel;
+    private ObjectName myName;

-
-    public JettyContainerImpl() {
+    public JettyContainerImpl(Kernel kernel, String objectName) {
         server = new JettyServer();
+        this.kernel = kernel;
+        try {
+            myName = ObjectName.getInstance(objectName);
+        } catch (MalformedObjectNameException e) {
+            log.error(e);
+        }
     }

     public void resetStatistics() {
@@ -148,6 +177,129 @@
         server.setRequestLog(log);
     }

+    /**
+ * Gets the protocols which this container can configure connectors for.
+     */
+    public String[] getSupportedProtocols() {
+ return new String[]{PROTOCOL_HTTP, PROTOCOL_HTTPS, PROTOCOL_AJP};
+    }
+
+    /**
+ * Gets the ObjectNames of any existing connectors for the specified
+     * protocol.
+     *
+     * @param protocol A protocol as returned by getSupportedProtocols
+     */
+    public String[] getConnectors(String protocol) {
+ GBeanQuery query = new GBeanQuery(null, JettyWebConnector.class.getName());
+        Set names = kernel.listGBeans(query);
+        List result = new ArrayList();
+        for (Iterator it = names.iterator(); it.hasNext();) {
+            ObjectName name = (ObjectName) it.next();
+            try {
+ if(kernel.getAttribute(name, "protocol").equals(protocol)) {
+                    result.add(name.getCanonicalName());
+                }
+            } catch (Exception e) {
+ log.error("Unable to check the protocol for a connector", e);
+            }
+        }
+        return (String[]) result.toArray(new String[result.size()]);
+    }
+
+    /**
+     * Gets the ObjectNames of any existing connectors.
+     */
+    public String[] getConnectors() {
+ GBeanQuery query = new GBeanQuery(null, JettyWebConnector.class.getName());
+        Set names = kernel.listGBeans(query);
+        String[] result = new String[names.size()];
+        int i=0;
+        for (Iterator it = names.iterator(); it.hasNext();) {
+            ObjectName name = (ObjectName) it.next();
+            result[i++] = name.getCanonicalName();
+        }
+        return result;
+    }
+
+    /**
+ * Creates a new connector, and returns the ObjectName for it. Note that + * the connector may well require further customization before being fully
+     * functional (e.g. SSL settings for an HTTPS connector).
+     */
+ public String addConnector(String uniqueName, String protocol, String host, int port) {
+        ObjectName name = getConnectorName(protocol, uniqueName);
+        GBeanData connector;
+        if(protocol.equals(PROTOCOL_HTTP)) {
+            connector = new GBeanData(name, HTTPConnector.GBEAN_INFO);
+        } else if(protocol.equals(PROTOCOL_HTTPS)) {
+ connector = new GBeanData(name, HTTPSConnector.GBEAN_INFO);
+        } else if(protocol.equals(PROTOCOL_AJP)) {
+ connector = new GBeanData(name, AJP13Connector.GBEAN_INFO);
+        } else {
+ throw new IllegalArgumentException("Invalid protocol '"+protocol+"'");
+        }
+        connector.setAttribute("host", host);
+        connector.setAttribute("port", new Integer(port));
+        connector.setReferencePattern("JettyContainer", myName);
+        ObjectName config = Util.getConfiguration(kernel, myName);
+        try {
+ kernel.invoke(config, "addGBean", new Object[]{connector, Boolean.FALSE}, new String[]{GBeanData.class.getName(), boolean.class.getName()});
+        } catch (Exception e) {
+            log.error("Unable to add GBean ", e);
+            return null;
+        }
+        return name.getCanonicalName();
+    }
+
+ private ObjectName getConnectorName(String protocol, String uniqueName) {
+        Hashtable table = new Hashtable();
+ table.put(NameFactory.J2EE_APPLICATION, myName.getKeyProperty(NameFactory.J2EE_APPLICATION)); + table.put(NameFactory.J2EE_SERVER, myName.getKeyProperty(NameFactory.J2EE_SERVER)); + table.put(NameFactory.J2EE_MODULE, myName.getKeyProperty(NameFactory.J2EE_MODULE)); + table.put(NameFactory.J2EE_TYPE, myName.getKeyProperty(NameFactory.J2EE_TYPE)); + table.put(NameFactory.J2EE_NAME, "JettyWebConnector-"+protocol+"-"+uniqueName);
+        try {
+            return ObjectName.getInstance(myName.getDomain(), table);
+        } catch (MalformedObjectNameException e) {
+ throw new IllegalStateException("Never should have failed: "+e.getMessage());
+        }
+    }
+
+    /**
+ * Removes a connector. This shuts it down if necessary, and removes it + * from the server environment. It must be a connector that this container
+     * is responsible for.
+     */
+    public void removeConnector(String objectName) {
+        ObjectName name = null;
+        try {
+            name = ObjectName.getInstance(objectName);
+        } catch (MalformedObjectNameException e) {
+ throw new IllegalArgumentException("Invalid object name '"+objectName+"': "+e.getMessage());
+        }
+        try {
+            GBeanInfo info = kernel.getGBeanInfo(name);
+            boolean found = false;
+            Set intfs = info.getInterfaces();
+            for (Iterator it = intfs.iterator(); it.hasNext();) {
+                String intf = (String) it.next();
+                if(intf.equals(JettyWebConnector.class.getName())) {
+                    found = true;
+                }
+            }
+            if(!found) {
+                throw new GBeanNotFoundException(name);
+            }
+            ObjectName config = Util.getConfiguration(kernel, name);
+ kernel.invoke(config, "removeGBean", new Object[]{name}, new String[]{ObjectName.class.getName()});
+        } catch (GBeanNotFoundException e) {
+ log.warn("No such GBean '"+objectName+"'"); //todo: what if we want to remove a failed GBean?
+        } catch (Exception e) {
+            log.error(e);
+        }
+    }
+
     /* ------------------------------------------------------------ */
     public RequestLog getRequestLog() {
         return server.getRequestLog();
@@ -172,10 +324,44 @@
         }
     }

+    public int getState() {
+        try {
+            return kernel.getGBeanState(myName);
+        } catch (GBeanNotFoundException e) {
+            return State.STOPPED_INDEX;
+        }
+    }
+
+    public State getStateInstance() {
+        return State.fromInt(getState());
+    }
+
+    public long getStartTime() {
+        try {
+            return kernel.getGBeanStartTime(myName);
+        } catch (GBeanNotFoundException e) {
+            return -1;
+        }
+    }
+
+    public void start() throws Exception, IllegalStateException {
+        // Kernel intercepts this
+    }
+
+ public void startRecursive() throws Exception, IllegalStateException {
+        // Kernel intercepts this
+    }
+
+    public void stop() throws Exception, IllegalStateException {
+        kernel.stopGBean(myName);
+    }
+
     public static final GBeanInfo GBEAN_INFO;

     static {
GBeanInfoBuilder infoBuilder = new GBeanInfoBuilder("Jetty Web Container", JettyContainerImpl.class);
+        infoBuilder.addAttribute("kernel", Kernel.class, false);
+        infoBuilder.addAttribute("objectName", String.class, false);
infoBuilder.addAttribute("collectStatistics", Boolean.TYPE, true); infoBuilder.addAttribute("collectStatisticsStarted", Long.TYPE, false);
         infoBuilder.addAttribute("connections", Integer.TYPE, false);
@@ -203,6 +389,9 @@
infoBuilder.addOperation("removeRealm", new Class[]{UserRealm.class});

         infoBuilder.addInterface(SoapHandler.class);
+        infoBuilder.addInterface(JettyContainer.class);
+        infoBuilder.addInterface(StateManageable.class);
+ infoBuilder.setConstructor(new String[]{"kernel","objectName"});

         GBEAN_INFO = infoBuilder.getBeanInfo();
     }

Added: geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyWebConnector.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/ org/apache/geronimo/jetty/JettyWebConnector.java?rev=230589&view=auto ======================================================================= ======= --- geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyWebConnector.java (added) +++ geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ JettyWebConnector.java Sat Aug 6 14:05:32 2005
@@ -0,0 +1,43 @@
+/**
+ *
+ * Copyright 2003-2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.jetty;
+
+import org.apache.geronimo.j2ee.management.geronimo.WebConnector;
+
+/**
+ * A Jetty-specific extension to the standard Geronimo web connector interface.
+ *
+ * @version $Rev: 46228 $ $Date: 2004-09-16 21:21:04 -0400 (Thu, 16 Sep 2004) $
+ */
+public interface JettyWebConnector extends WebConnector {
+    /**
+ * Gets the minimum number of threads used to service connections from
+     * this connector.
+     */
+    public int getMinThreads();
+    /**
+ * Sets the minimum number of threads used to service connections from
+     * this connector.
+     */
+    public void setMinThreads(int threads);
+
+    public int getThreads();
+
+    public int getIdlethreads();
+
+    public String getDefaultScheme();
+}

Modified: geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/AJP13Connector.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/ org/apache/geronimo/jetty/connector/AJP13Connector.java? rev=230589&r1=230588&r2=230589&view=diff ======================================================================= ======= --- geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/AJP13Connector.java (original) +++ geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/AJP13Connector.java Sat Aug 6 14:05:32 2005
@@ -20,21 +20,27 @@
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
 import org.apache.geronimo.jetty.JettyContainer;
+import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.j2ee.management.geronimo.WebContainer;
 import org.mortbay.http.ajp.AJP13Listener;

 /**
  * @version $Rev$ $Date$
  */
 public class AJP13Connector extends JettyConnector {
-    public AJP13Connector(JettyContainer container) {
-        super(container, new AJP13Listener());
+ public AJP13Connector(JettyContainer container, String objectName, Kernel kernel) {
+        super(container, new AJP13Listener(), objectName, kernel);
+    }
+
+    public String getProtocol() {
+        return WebContainer.PROTOCOL_AJP;
     }

     public static final GBeanInfo GBEAN_INFO;

     static {
GBeanInfoBuilder infoFactory = new GBeanInfoBuilder("Jetty Connector AJP13", AJP13Connector.class, JettyConnector.GBEAN_INFO);
-        infoFactory.setConstructor(new String[]{"JettyContainer"});
+ infoFactory.setConstructor(new String[]{"JettyContainer","objectName","kernel"});
         GBEAN_INFO = infoFactory.getBeanInfo();
     }


Modified: geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/HTTPConnector.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/ org/apache/geronimo/jetty/connector/HTTPConnector.java? rev=230589&r1=230588&r2=230589&view=diff ======================================================================= ======= --- geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/HTTPConnector.java (original) +++ geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/HTTPConnector.java Sat Aug 6 14:05:32 2005
@@ -20,21 +20,27 @@
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
 import org.apache.geronimo.jetty.JettyContainer;
+import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.j2ee.management.geronimo.WebContainer;
 import org.mortbay.http.SocketListener;

 /**
  * @version $Rev$ $Date$
  */
 public class HTTPConnector extends JettyConnector {
-    public HTTPConnector(JettyContainer container) {
-        super(container, new SocketListener());
+ public HTTPConnector(JettyContainer container, String objectName, Kernel kernel) {
+        super(container, new SocketListener(), objectName, kernel);
+    }
+
+    public String getProtocol() {
+        return WebContainer.PROTOCOL_HTTP;
     }

     public static final GBeanInfo GBEAN_INFO;

     static {
GBeanInfoBuilder infoFactory = new GBeanInfoBuilder("Jetty Connector HTTP", HTTPConnector.class, JettyConnector.GBEAN_INFO);
-        infoFactory.setConstructor(new String[]{"JettyContainer"});
+ infoFactory.setConstructor(new String[]{"JettyContainer","objectName","kernel"});
         GBEAN_INFO = infoFactory.getBeanInfo();
     }


Modified: geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/HTTPSConnector.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/ org/apache/geronimo/jetty/connector/HTTPSConnector.java? rev=230589&r1=230588&r2=230589&view=diff ======================================================================= ======= --- geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/HTTPSConnector.java (original) +++ geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/HTTPSConnector.java Sat Aug 6 14:05:32 2005
@@ -24,8 +24,10 @@
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
+import org.apache.geronimo.j2ee.management.geronimo.WebContainer;
 import org.apache.geronimo.jetty.JettyContainer;
 import org.apache.geronimo.system.serverinfo.ServerInfo;
+import org.apache.geronimo.kernel.Kernel;

 /**
* Implementation of a HTTPS connector based on Jetty's SslConnector (which uses pure JSSE).
@@ -38,12 +40,16 @@
     private String keystore;
     private String algorithm;

- public HTTPSConnector(JettyContainer container, ServerInfo serverInfo) {
-        super(container, new SslListener());
+ public HTTPSConnector(JettyContainer container, ServerInfo serverInfo, String objectName, Kernel kernel) {
+        super(container, new SslListener(), objectName, kernel);
         this.serverInfo = serverInfo;
         https = (SslListener) listener;
     }

+    public String getProtocol() {
+        return WebContainer.PROTOCOL_HTTPS;
+    }
+
     public String getKeystore() {
// this does not delegate to https as it needs to be resolved against ServerInfo
         return keystore;
@@ -82,11 +88,11 @@
         https.setKeyPassword(password);
     }

-    public String getProtocol() {
+    public String getSecureProtocol() {
         return https.getProtocol();
     }

-    public void setProtocol(String protocol) {
+    public void setSecureProtocol(String protocol) {
         https.setProtocol(protocol);
     }

@@ -121,9 +127,9 @@
         infoFactory.addAttribute("keystoreType", String.class, true);
infoFactory.addAttribute("needClientAuth", boolean.class, true);
         infoFactory.addAttribute("password", String.class, true);
-        infoFactory.addAttribute("protocol", String.class, true);
+ infoFactory.addAttribute("secureProtocol", String.class, true); infoFactory.addReference("ServerInfo", ServerInfo.class, NameFactory.GERONIMO_SERVICE); - infoFactory.setConstructor(new String[]{"JettyContainer", "ServerInfo"}); + infoFactory.setConstructor(new String[]{"JettyContainer", "ServerInfo", "objectName", "kernel"});
         GBEAN_INFO = infoFactory.getBeanInfo();
     }


Modified: geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/JettyConnector.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/ org/apache/geronimo/jetty/connector/JettyConnector.java? rev=230589&r1=230588&r2=230589&view=diff ======================================================================= ======= --- geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/JettyConnector.java (original) +++ geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/ connector/JettyConnector.java Sat Aug 6 14:05:32 2005
@@ -20,21 +20,29 @@
 import java.net.UnknownHostException;
 import java.net.InetSocketAddress;

+import javax.management.ObjectName;
+import javax.management.MalformedObjectNameException;
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
 import org.apache.geronimo.gbean.GBeanLifecycle;
 import org.apache.geronimo.jetty.JettyContainer;
+import org.apache.geronimo.jetty.JettyWebConnector;
 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
+import org.apache.geronimo.kernel.management.StateManageable;
+import org.apache.geronimo.kernel.management.State;
+import org.apache.geronimo.kernel.GBeanNotFoundException;
+import org.apache.geronimo.kernel.Kernel;
 import org.mortbay.http.HttpListener;
-import org.mortbay.http.SocketListener;
 import org.mortbay.util.ThreadedServer;

 /**
  * @version $Rev$ $Date$
  */
-public abstract class JettyConnector implements GBeanLifecycle {
+public abstract class JettyConnector implements GBeanLifecycle, JettyWebConnector {
     private final JettyContainer container;
     protected final HttpListener listener;
+    private final ObjectName objectName;
+    private final Kernel kernel;

     /**
      * Only used to allow declaration as a reference.
@@ -42,16 +50,34 @@
     public JettyConnector() {
         container = null;
         listener = null;
+        objectName = null;
+        kernel = null;
     }

-    public JettyConnector(JettyContainer container) {
+ public JettyConnector(JettyContainer container, String objectName, Kernel kernel) {
         this.container = container;
-        this.listener = null;
+        this.listener = null;
+        this.kernel = kernel;
+        try {
+            this.objectName = ObjectName.getInstance(objectName);
+        } catch (MalformedObjectNameException e) {
+            throw new IllegalArgumentException(e.getMessage());
+        }
     }

- public JettyConnector(JettyContainer container, HttpListener listener) { + public JettyConnector(JettyContainer container, HttpListener listener, String objectName, Kernel kernel) {
         this.container = container;
-        this.listener = listener;
+        this.listener = listener;
+        this.kernel = kernel;
+        try {
+            this.objectName = ObjectName.getInstance(objectName);
+        } catch (MalformedObjectNameException e) {
+            throw new IllegalArgumentException(e.getMessage());
+        }
+    }
+
+    public String getObjectName() {
+        return objectName.getCanonicalName();
     }

     public String getDefaultScheme() {
@@ -101,10 +127,52 @@
       return ((ThreadedServer)listener).getIdleThreads();
     }

-    public InetSocketAddress getAddress() {
+    public InetSocketAddress getListenAddress() {
         return new InetSocketAddress(getHost(), getPort());
     }

+    public int getBufferSizeBytes() {
+        return listener.getBufferSize();
+    }
+
+    public void setBufferSizeBytes(int bytes) {
+ throw new UnsupportedOperationException(); //todo: is this supported?
+    }
+
+    public int getAcceptQueueSize() {
+ throw new UnsupportedOperationException(); //todo: where does this come from?
+    }
+
+    public void setAcceptQueueSize(int size) {
+ throw new UnsupportedOperationException(); //todo: where does this come from?
+    }
+
+    public int getLingerMillis() {
+ throw new UnsupportedOperationException(); //todo: where does this come from?
+    }
+
+    public void setLingerMillis(int millis) {
+ throw new UnsupportedOperationException(); //todo: where does this come from?
+    }
+
+    public boolean isTcpNoDelay() {
+ throw new UnsupportedOperationException(); //todo: where does this come from?
+    }
+
+    public void setTcpNoDelay(boolean enable) {
+ throw new UnsupportedOperationException(); //todo: where does this come from?
+    }
+
+    public int getRedirectPort() {
+        return listener.getConfidentialPort();
+    }
+
+    public void setRedirectPort(int port) {
+ throw new UnsupportedOperationException(); //todo: is this supported?
+    }
+
+    public abstract String getProtocol();
+
     public void doStart() throws Exception {
         container.addListener(listener);
         ((ThreadedServer) listener).open();
@@ -134,20 +202,57 @@
             }
         }
     }
+
+    public int getState() {
+        try {
+            return kernel.getGBeanState(objectName);
+        } catch (GBeanNotFoundException e) {
+            return State.STOPPED_INDEX;
+        }
+    }
+
+    public State getStateInstance() {
+        return State.fromInt(getState());
+    }
+
+    public long getStartTime() {
+        try {
+            return kernel.getGBeanStartTime(objectName);
+        } catch (GBeanNotFoundException e) {
+            return -1;
+        }
+    }
+
+    public void start() throws Exception, IllegalStateException {
+        // Kernel intercepts this
+    }
+
+ public void startRecursive() throws Exception, IllegalStateException {
+        // Kernel intercepts this
+    }
+
+    public void stop() throws Exception, IllegalStateException {
+        kernel.stopGBean(objectName);
+    }
+
     public static final GBeanInfo GBEAN_INFO;

     static {
GBeanInfoBuilder infoFactory = new GBeanInfoBuilder("Jetty HTTP Connector", JettyConnector.class); infoFactory.addAttribute("defaultScheme", String.class, false);
+        infoFactory.addAttribute("objectName", String.class, false);
+        infoFactory.addAttribute("kernel", Kernel.class, false);
         infoFactory.addAttribute("host", String.class, true);
         infoFactory.addAttribute("port", int.class, true);
         infoFactory.addAttribute("minThreads", int.class, true);
         infoFactory.addAttribute("maxThreads", int.class, true);
         infoFactory.addAttribute("threads", int.class, false);
         infoFactory.addAttribute("idleThreads", int.class, false);
- infoFactory.addAttribute("address", InetSocketAddress.class, false); + infoFactory.addAttribute("listenAddress", InetSocketAddress.class, false); infoFactory.addReference("JettyContainer", JettyContainer.class, NameFactory.GERONIMO_SERVICE);
-        infoFactory.setConstructor(new String[] {"JettyContainer"});
+        infoFactory.addInterface(JettyWebConnector.class);
+        infoFactory.addInterface(StateManageable.class);
+ infoFactory.setConstructor(new String[] {"JettyContainer","objectName","kernel"});
         GBEAN_INFO = infoFactory.getBeanInfo();
     }
 }

Modified: geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/ connector/HTTPConnectorTest.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/test/ org/apache/geronimo/jetty/connector/HTTPConnectorTest.java? rev=230589&r1=230588&r2=230589&view=diff ======================================================================= ======= --- geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/ connector/HTTPConnectorTest.java (original) +++ geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/ connector/HTTPConnectorTest.java Sat Aug 6 14:05:32 2005
@@ -30,11 +30,11 @@
     public void testAddress() throws UnknownHostException {
         connector.setHost("localhost");
         connector.setPort(1234);
- assertEquals(new InetSocketAddress("localhost", 1234), connector.getAddress()); + assertEquals(new InetSocketAddress("localhost", 1234), connector.getListenAddress());
     }

     protected void setUp() throws Exception {
         super.setUp();
-        connector = new HTTPConnector(null);
+        connector = new HTTPConnector(null, "foo:bar=baz", null);
     }
 }



Reply via email to