Index: JettyConnector.java
===================================================================
--- JettyConnector.java (revision 5734)
+++ JettyConnector.java (working copy)
@@ -11,28 +11,148 @@
package org.mule.providers.http.jetty;
import org.mule.providers.http.HttpConnector;
+import org.mule.umo.UMOException;
+import org.mule.umo.endpoint.UMOEndpoint;
+import org.mule.umo.endpoint.UMOEndpointURI;
+import org.mule.umo.lifecycle.LifecycleException;
+import org.mule.config.ThreadingProfile;
+import org.mule.config.i18n.Message;
+import org.mule.config.i18n.Messages;
+import org.mule.util.StringUtils;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.http.SocketListener;
+import org.mortbay.http.HttpContext;
+import org.mortbay.util.InetAddrPort;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+
+
/**
* ServletConnector is a channel adapter between Mule and a servlet
* engine.
- *
+ *
* @author Ross Mason
* @version $Revision$
*/
-public class JettyConnector extends HttpConnector
-{
- public JettyConnector()
- {
+public class JettyConnector extends HttpConnector {
+ private Map httpServers;
+
+ public JettyConnector() {
super();
+ httpServers = new HashMap();
registerSupportedProtocol("http");
registerSupportedProtocol("https");
registerSupportedProtocol("rest");
}
- public String getProtocol()
- {
+
+ public String getProtocol() {
return "jetty";
}
+
+ public HttpContext getContext(UMOEndpoint endpoint) {
+ Server server;
+
+ synchronized (this) {
+ server = (Server) httpServers.get(getHostAndPort(endpoint.getEndpointURI()));
+ if (server == null) {
+ addServer(endpoint);
+ }
+ server = (Server) httpServers.get(getHostAndPort(endpoint.getEndpointURI()));
+ }
+
+ // ToDo replace with correct internationalized log messge
+ if (server == null) {
+ throw new RuntimeException("Failed to retrieve HttpContext for: " + endpoint);
+ }
+
+ return server.getContext("/");
+ }
+
+
+ protected void doStart() throws UMOException {
+ }
+
+
+ protected void doStop() throws UMOException {
+ try {
+ synchronized (this) {
+ Iterator i = httpServers.values().iterator();
+ while (i.hasNext()) {
+ Server httpServer = (Server) i.next();
+ httpServer.stop();
+ }
+ }
+ }
+ catch (InterruptedException e) {
+ throw new LifecycleException(new Message(Messages.FAILED_TO_STOP_X, "Jetty Http Receiver"), e,
+ this);
+ }
+ }
+
+ protected void doDispose() {
+ try {
+ synchronized (this) {
+ Iterator i = httpServers.values().iterator();
+ while (i.hasNext()) {
+ Server httpServer = (Server) i.next();
+ httpServer.stop();
+ }
+ }
+ }
+ catch (InterruptedException e) {
+ logger.error("Error disposing Jetty recevier on: "); //+ endpoint.getEndpointURI().toString(), e);
+ }
+ }
+
+ /**
+ * Add a new Jetty server to the server map for the given endpoint
+ * @param endpoint the endpoint
+ */
+ protected void addServer(UMOEndpoint endpoint) {
+
+ SocketListener socketListener = new SocketListener(new InetAddrPort(endpoint.getEndpointURI().getPort()));
+
+ // apply Threading settings
+ ThreadingProfile tp = getReceiverThreadingProfile();
+ socketListener.setMaxIdleTimeMs((int) tp.getThreadTTL());
+ int threadsActive = tp.getMaxThreadsActive();
+ int threadsMin = socketListener.getMinThreads();
+ if (threadsMin >= threadsActive) {
+ socketListener.setMinThreads(threadsActive - 1);
+ }
+ socketListener.setMaxThreads(threadsActive);
+ socketListener.setThreadsPriority(tp.getThreadPriority());
+
+ Server server = new Server();
+ server.addListener(socketListener);
+
+ ServletHandler handler = new ServletHandler();
+ handler.addServlet("JettyReceiverServlet", "/", JettyReceiverServlet.class.getName());
+ synchronized (this) {
+ httpServers.put(getHostAndPort(endpoint.getEndpointURI()), server);
+ }
+ }
+
+ /**
+ * Return the host and port combination (ie, localhost:80) from the uri.
+ *
+ * @param uri the given URI
+ * @return the host and port combination
+ */
+ private String getHostAndPort(UMOEndpointURI uri) {
+ String port = Integer.toString(uri.getPort());
+ if (StringUtils.isEmpty(port)) {
+ port = "8080";
+ }
+ return uri.getHost() + ":" + port;
+
+ }
+
+
}