Out of interest, why was this removed from the build?

  ...ant

On 7/28/06, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:

Author: jmarino
Date: Fri Jul 28 13:48:12 2006
New Revision: 426664

URL: http://svn.apache.org/viewvc?rev=426664&view=rev
Log:
refactoring of Jetty system service to include thread dispatching, logging
and general cleanup; also remove from main build to make autonomous

Added:
    
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyLogger.java
(with props)

    
incubator/tuscany/java/sca/services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/JettyServiceImplTestCase.java
      - copied, changed from r425747,
incubator/tuscany/java/sca/services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/StartupTestCase.java
Removed:

    
incubator/tuscany/java/sca/services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/ConsoleMonitor.java

    
incubator/tuscany/java/sca/services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/StartupTestCase.java
Modified:
    incubator/tuscany/java/sca/pom.xml
    incubator/tuscany/java/sca/services/transports/http.jetty/pom.xml

    
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyService.java

    
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyServiceImpl.java

    
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/TransportMonitor.java

Modified: incubator/tuscany/java/sca/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/pom.xml?rev=426664&r1=426663&r2=426664&view=diff

==============================================================================
--- incubator/tuscany/java/sca/pom.xml (original)
+++ incubator/tuscany/java/sca/pom.xml Fri Jul 28 13:48:12 2006
@@ -33,7 +33,7 @@
         <module>containers</module>
         <module>databinding</module>
         <module>bindings</module>
-        <module>services</module>
+        <!--<module>services</module>-->
         <module>commands/launcher</module>
     </modules>


Modified:
incubator/tuscany/java/sca/services/transports/http.jetty/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/transports/http.jetty/pom.xml?rev=426664&r1=426663&r2=426664&view=diff

==============================================================================
--- incubator/tuscany/java/sca/services/transports/http.jetty/pom.xml
(original)
+++ incubator/tuscany/java/sca/services/transports/http.jetty/pom.xml Fri
Jul 28 13:48:12 2006
@@ -35,7 +35,7 @@
         <dependency>
             <groupId>jetty</groupId>
             <artifactId>jetty</artifactId>
-            <version>6.0.0beta16</version>
+            <version>6.0.0beta17</version>
             <scope>compile</scope>
         </dependency>
         <dependency>
@@ -57,8 +57,8 @@
             <artifactId>junit</artifactId>
         </dependency>
         <dependency>
-            <groupId>jmock</groupId>
-            <artifactId>jmock</artifactId>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
         </dependency>
     </dependencies>


Added:
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyLogger.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyLogger.java?rev=426664&view=auto

==============================================================================
---
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyLogger.java
(added)
+++
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyLogger.java
Fri Jul 28 13:48:12 2006
@@ -0,0 +1,101 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
applicable.
+ *
+ * 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.tuscany.service.jetty;
+
+import org.mortbay.log.Logger;
+
+/**
+ * Serves as a wrapper for a [EMAIL PROTECTED] TransportMonitor} to replace 
Jetty's
logging mechanism
+ *
+ * @version $Rev$ $Date$
+ */
+public class JettyLogger implements Logger {
+
+    private TransportMonitor monitor;
+    private boolean debugEnabled;
+
+    public void setMonitor(TransportMonitor monitor) {
+        this.monitor = monitor;
+    }
+
+    public boolean isDebugEnabled() {
+        return debugEnabled;
+    }
+
+    public void setDebugEnabled(boolean debugEnabled) {
+        this.debugEnabled = debugEnabled;
+    }
+
+    public void info(String msg, Object arg0, Object arg1) {
+        if (monitor != null) {
+            monitor.debug(msg, arg0, arg1);
+        } else if (debugEnabled) {
+            System.err.println(":INFO:  " + format(msg, arg0, arg1));
+        }
+    }
+
+    public void debug(String msg, Throwable th) {
+        if (debugEnabled) {
+            if (monitor != null) {
+                monitor.debug(msg, th);
+            } else {
+                System.err.println(":DEBUG:  " + msg);
+                th.printStackTrace();
+            }
+        }
+    }
+
+    public void debug(String msg, Object arg0, Object arg1) {
+        if (debugEnabled) {
+            if (monitor != null) {
+                monitor.debug(msg, arg0, arg1);
+            } else {
+                System.err.println(":DEBUG: " + format(msg, arg0, arg1));
+            }
+        }
+    }
+
+    public void warn(String msg, Object arg0, Object arg1) {
+        if (monitor != null) {
+            monitor.warn(msg, arg0, arg1);
+        } else if (debugEnabled) {
+            System.err.println(":WARN: " + format(msg, arg0, arg1));
+        }
+    }
+
+    public void warn(String msg, Throwable th) {
+        if (monitor != null) {
+            monitor.warn(msg, th);
+        } else if (debugEnabled) {
+            System.err.println(":WARN: " + msg);
+            th.printStackTrace();
+        }
+    }
+
+    public Logger getLogger(String name) {
+        return this;
+    }
+
+    private String format(String msg, Object arg0, Object arg1) {
+        int i0 = msg.indexOf("{}");
+        int i1 = i0 < 0 ? -1 : msg.indexOf("{}", i0 + 2);
+        if (arg1 != null && i1 >= 0) {
+            msg = msg.substring(0, i1) + arg1 + msg.substring(i1 + 2);
+        }
+        if (arg0 != null && i0 >= 0) {
+            msg = msg.substring(0, i0) + arg0 + msg.substring(i0 + 2);
+        }
+        return msg;
+    }
+}

Propchange:
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyLogger.java

------------------------------------------------------------------------------
    svn:eol-style = native

Propchange:
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyLogger.java

------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Modified:
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyService.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyService.java?rev=426664&r1=426663&r2=426664&view=diff

==============================================================================
---
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyService.java
(original)
+++
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyService.java
Fri Jul 28 13:48:12 2006
@@ -1,12 +1,9 @@
package org.apache.tuscany.service.jetty;

-import java.io.File;
-import java.io.IOException;
+import org.apache.tuscany.spi.host.ServletHost;

import org.mortbay.jetty.Server;

-import org.apache.tuscany.spi.host.ServletHost;
-
/**
  * Implementations provide a Jetty transport service to the runtime
  *
@@ -19,11 +16,5 @@
      */
     Server getServer();

-    /**
-     * Returns the port the Jetty server is configured to listen on
-     */
-    int getPort();
-
-    void registerComposite(File compositeLocation) throws IOException;

}

Modified:
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyServiceImpl.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyServiceImpl.java?rev=426664&r1=426663&r2=426664&view=diff

==============================================================================
---
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyServiceImpl.java
(original)
+++
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/JettyServiceImpl.java
Fri Jul 28 13:48:12 2006
@@ -3,21 +3,8 @@
import java.io.File;
import java.io.IOException;
import javax.resource.spi.work.Work;
-import javax.resource.spi.work.WorkException;
-import javax.resource.spi.work.WorkManager;
import javax.servlet.Servlet;

-import org.mortbay.jetty.Connector;
-import org.mortbay.jetty.Handler;
-import org.mortbay.jetty.Server;
-import org.mortbay.jetty.handler.ContextHandlerCollection;
-import org.mortbay.jetty.handler.DefaultHandler;
-import org.mortbay.jetty.handler.HandlerCollection;
-import org.mortbay.jetty.handler.RequestLogHandler;
-import org.mortbay.jetty.nio.SelectChannelConnector;
-import org.mortbay.jetty.webapp.WebAppContext;
-import org.mortbay.thread.BoundedThreadPool;
-import org.mortbay.thread.ThreadPool;
import org.osoa.sca.annotations.Destroy;
import org.osoa.sca.annotations.Init;
import org.osoa.sca.annotations.Property;
@@ -27,9 +14,23 @@
import org.apache.tuscany.spi.annotation.Autowire;
import org.apache.tuscany.spi.annotation.Monitor;
import org.apache.tuscany.spi.host.ServletHost;
+import org.apache.tuscany.spi.services.work.WorkScheduler;
+
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.handler.ContextHandler;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.jetty.servlet.ServletHolder;
+import org.mortbay.jetty.servlet.ServletMapping;
+import org.mortbay.log.Log;
+import org.mortbay.log.Logger;
+import org.mortbay.thread.BoundedThreadPool;
+import org.mortbay.thread.ThreadPool;

/**
- * Implements an HTTP transport service using Jetty
+ * Implements an HTTP transport service using Jetty.
  *
  * @version $$Rev$$ $$Date$$
  */
@@ -37,116 +38,198 @@
@Service(ServletHost.class)
public class JettyServiceImpl implements JettyService {

+    private static final String ROOT = "/";
+    private static final int ERROR = 0;
+    private static final int UNINITIALIZED = 0;
+    private static final int STARTING = 1;
+    private static final int STARTED = 2;
+    private static final int STOPPING = 3;
+    private static final int STOPPED = 4;
+
+    private final Object joinLock = new Object();
+    private int state = UNINITIALIZED;
+    private int httpPort = 8080;
+    private int httpsPort = 8484;
+    private String keystore;
+    private String certPassword;
+    private String keyPassword;
+    private boolean sendServerVersion;
+    private boolean https;
     private TransportMonitor monitor;
-    private WorkManager workManager;
+    private WorkScheduler scheduler;
+    private boolean debug;
     private Server server;
-    private int port = 8080;
+    private Connector connector;
+    private ServletHandler servletHandler;

-    public JettyServiceImpl() {
+    static {
+        // hack to replace the static Jetty logger
+        System.setProperty("org.mortbay.log.class",
JettyLogger.class.getName());
     }

-    public JettyServiceImpl(TransportMonitor monitor) {
+    public JettyServiceImpl(@Monitor TransportMonitor monitor,
+                            @Autowire WorkScheduler scheduler) {
         this.monitor = monitor;
+        this.scheduler = scheduler;
+        // Jetty uses a static logger, so jam in the monitor into a
static reference
+        Logger logger = Log.getLogger(null);
+        if (logger instanceof JettyLogger) {
+            JettyLogger jettyLogger = (JettyLogger) logger;
+            jettyLogger.setMonitor(monitor);
+            if (debug) {
+                jettyLogger.setDebugEnabled(true);
+            }
+        }
     }

-    @Monitor
-    public void setMonitor(TransportMonitor monitor) {
+    public JettyServiceImpl(TransportMonitor monitor) {
         this.monitor = monitor;
     }

-    @Autowire
-    public void setWorkManager(WorkManager workManager) {
-        this.workManager = workManager;
+    public JettyServiceImpl(TransportMonitor monitor,
+                            WorkScheduler scheduler,
+                            Connector connector) {
+        this(monitor, scheduler);
+        this.connector = connector;
     }

     @Property
-    public void setPort(int port) {
-        this.port = port;
+    public void setHttpPort(int httpPort) {
+        this.httpPort = httpPort;
     }

-    @Init
-    public void init() throws Exception {
+    @Property
+    public void setHttpsPort(int httpsPort) {
+        this.httpsPort = httpsPort;
+    }

-        server = new Server();
+    @Property
+    public void setSendServerVersion(boolean sendServerVersion) {
+        this.sendServerVersion = sendServerVersion;
+    }

-        if (workManager == null) {
-            BoundedThreadPool threadPool = new BoundedThreadPool();
-            threadPool.setMaxThreads(100);
-            server.setThreadPool(threadPool);
-        } else {
-            server.setThreadPool(new TuscanyThreadPool());
-        }
-        Connector connector = new SelectChannelConnector();
-        connector.setPort(port);
-        server.setConnectors(new Connector[]{connector});
-
-        HandlerCollection handlers = new HandlerCollection();
-        ContextHandlerCollection contexts = new
ContextHandlerCollection();
-        RequestLogHandler requestLogHandler = new RequestLogHandler();
-        handlers.setHandlers(new Handler[]{contexts, new
DefaultHandler(), requestLogHandler});
-        server.setHandler(handlers);
-
-/*
-         WebAppContext.addWebApplications(server, "./webapps",
"org/mortbay/jetty/webapp/webdefault.xml", true, false);
-
-        HashUserRealm userRealm = new HashUserRealm();
-        userRealm.setName("Test Realm");
-        userRealm.setConfig("./etc/realm.properties");
-        server.setUserRealms(new UserRealm[]{userRealm});
-
-        NCSARequestLog requestLog = new NCSARequestLog("./logs/jetty-
yyyy-mm-dd.log");
-        requestLog.setExtended(false);
-        requestLogHandler.setRequestLog(requestLog);
-        requestLogHandler.setRequestLog(monitor);
-*/
-        server.setStopAtShutdown(true);
-        server.setSendServerVersion(true);
-        server.start();
-        monitor.started(port);
+    @Property
+    public void setHttps(boolean https) {
+        this.https = https;
     }

-    @Destroy
-    public void destroy() {
-        monitor.shutdown(port);
+    @Property
+    public void setKeystore(String keystore) {
+        this.keystore = keystore;
     }

-    public void registerMapping(String string, Servlet servlet) {
+    @Property
+    public void setCertPassword(String certPassword) {
+        this.certPassword = certPassword;
+    }

+    @Property
+    public void setKeyPassword(String keyPassword) {
+        this.keyPassword = keyPassword;
     }

-    public void unregisterMapping(String string) {
+    @Property
+    public void setDebug(boolean val) {
+        debug = val;
+    }

+    @Init
+    public void init() throws Exception {
+        try {
+            state = STARTING;
+            server = new Server();
+            if (scheduler == null) {
+                BoundedThreadPool threadPool = new BoundedThreadPool();
+                threadPool.setMaxThreads(100);
+                server.setThreadPool(threadPool);
+            } else {
+                server.setThreadPool(new TuscanyThreadPool());
+            }
+            if (connector == null) {
+                if (https) {
+                    Connector httpConnector = new
SelectChannelConnector();
+                    httpConnector.setPort(httpPort);
+                    SslSocketConnector sslConnector = new
SslSocketConnector();
+                    sslConnector.setPort(httpsPort);
+                    sslConnector.setKeystore(keystore);
+                    sslConnector.setPassword(certPassword);
+                    sslConnector.setKeyPassword(keyPassword);
+                    server.setConnectors(new Connector[]{httpConnector,
sslConnector});
+                } else {
+                    SelectChannelConnector selectConnector = new
SelectChannelConnector();
+                    selectConnector.setPort(httpPort);
+                    server.setConnectors(new
Connector[]{selectConnector});
+                }
+            } else {
+                connector.setPort(httpPort);
+                server.setConnectors(new Connector[]{connector});
+            }
+            ContextHandler contextHandler = new ContextHandler();
+            contextHandler.setContextPath(ROOT);
+            server.setHandler(contextHandler);
+            servletHandler = new ServletHandler();
+            contextHandler.setHandler(servletHandler);
+            server.setStopAtShutdown(true);
+            server.setSendServerVersion(sendServerVersion);
+            monitor.started();
+            server.start();
+            state = STARTED;
+        } catch (Exception e) {
+            state = ERROR;
+            throw e;
+        }
+    }
+
+    @Destroy
+    public void destroy() throws Exception {
+        state = STOPPING;
+        synchronized (joinLock) {
+            joinLock.notifyAll();
+        }
+        server.stop();
+        state = STOPPED;
+        monitor.shutdown();
+    }
+
+    public void registerMapping(String path, Servlet servlet) {
+        ServletHolder holder = new ServletHolder(servlet);
+        servletHandler.addServlet(holder);
+        ServletMapping mapping = new ServletMapping();
+        mapping.setServletName(holder.getClassName());
+        mapping.setPathSpec(path);
+        servletHandler.addServletMapping(mapping);
+    }
+
+    public void unregisterMapping(String string) {
+        throw new UnsupportedOperationException();
     }

     public void registerComposite(File compositeLocation) throws
IOException {
-        WebAppContext.addWebApplications(server,
compositeLocation.getAbsolutePath(),
-                "org/mortbay/jetty/webapp/webdefault.xml",
-                false,
-                false);
+        throw new UnsupportedOperationException();
     }

     public Server getServer() {
         return server;
     }

-    public int getPort() {
-        return port;
+    public int getHttpPort() {
+        return httpPort;
     }

+    /**
+     * An integration wrapper to enable use of a [EMAIL PROTECTED] 
WorkScheduler}
with Jetty
+     */
     private class TuscanyThreadPool implements ThreadPool {

         public boolean dispatch(Runnable job) {
-            try {
-                workManager.doWork(new TuscanyWork(job));
-            } catch (WorkException e) {
-                //FIXME
-                monitor.requestHandleError(e);
-            }
+            scheduler.scheduleWork(new TuscanyWork(job));
             return true;
         }

         public void join() throws InterruptedException {
-            throw new UnsupportedOperationException();
+            synchronized (joinLock) {
+                joinLock.wait();
+            }
         }

         public int getThreads() {
@@ -158,7 +241,8 @@
         }

         public boolean isLowOnThreads() {
-            throw new UnsupportedOperationException();
+            // TODO FIXME
+            return false;
         }

         public void start() throws Exception {
@@ -170,26 +254,29 @@
         }

         public boolean isRunning() {
-            return false;
+            return state == STARTING || state == STARTED;
         }

         public boolean isStarted() {
-            return false;
+            return state == STARTED;
         }

         public boolean isStarting() {
-            return false;
+            return state == STARTING;
         }

         public boolean isStopping() {
-            return false;
+            return state == STOPPING;
         }

         public boolean isFailed() {
-            return false;
+            return state == ERROR;
         }
     }

+    /**
+     * A unit of work dispatched to the runtime work scheduler
+     */
     private class TuscanyWork implements Work {

         Runnable job;

Modified:
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/TransportMonitor.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/TransportMonitor.java?rev=426664&r1=426663&r2=426664&view=diff

==============================================================================
---
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/TransportMonitor.java
(original)
+++
incubator/tuscany/java/sca/services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/TransportMonitor.java
Fri Jul 28 13:48:12 2006
@@ -1,19 +1,37 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
applicable.
+ *
+ * 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.tuscany.service.jetty;

-import org.mortbay.jetty.RequestLog;
-
/**
+ * The monitoring interfaces used by the Jetty system service
+ *
  * @version $$Rev$$ $$Date$$
  */
-public interface TransportMonitor extends RequestLog {
+public interface TransportMonitor {

-    void started(int port);
+    /**
+     * Called after the service is initialized
+     */
+    void started();

-    void shutdown(int port);
+    /**
+     * Called after the service is stopped
+     */
+    void shutdown();

-    void startError(int port, Exception e);
+    void warn(String msg, Object...args);

-    void shutdownError(int port, Exception e);
+    void debug(String msg, Object...args);

-    void requestHandleError(Exception e);
}

Copied:
incubator/tuscany/java/sca/services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/JettyServiceImplTestCase.java
(from r425747,
incubator/tuscany/java/sca/services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/StartupTestCase.java)
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/JettyServiceImplTestCase.java?p2=incubator/tuscany/java/sca/services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/JettyServiceImplTestCase.java&p1=incubator/tuscany/java/sca/services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/StartupTestCase.java&r1=425747&r2=426664&rev=426664&view=diff

==============================================================================
---
incubator/tuscany/java/sca/services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/StartupTestCase.java
(original)
+++
incubator/tuscany/java/sca/services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/JettyServiceImplTestCase.java
Fri Jul 28 13:48:12 2006
@@ -1,17 +1,155 @@
package org.apache.tuscany.service.jetty;

+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.tuscany.spi.services.work.WorkScheduler;
+
import junit.framework.TestCase;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.getCurrentArguments;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import org.easymock.IAnswer;

/**
  * @version $Rev$ $Date$
  */
-public class StartupTestCase extends TestCase {
+public class JettyServiceImplTestCase extends TestCase {
+
+    private static final String REQUEST1_HEADER =
+        "GET / HTTP/1.0\n"
+            + "Host: localhost\n"
+            + "Content-Type: text/xml\n"
+            + "Connection: close\n"
+            + "Content-Length: ";
+    private static final String REQUEST1_CONTENT =
+        "";
+    private static final String REQUEST1 =
+        REQUEST1_HEADER + REQUEST1_CONTENT.getBytes().length + "\n\n" +
REQUEST1_CONTENT;
+
+    private static final int HTTP_PORT = 8585;
+
+    private TransportMonitor monitor;
+    private WorkScheduler scheduler;
+    private ExecutorService executor = Executors.newCachedThreadPool();
+
+    /**
+     * Verifies requests are properly routed according to the servlet
mapping
+     */
+    public void testRegisterServletMapping() throws Exception {
+        JettyServiceImpl service = new JettyServiceImpl(monitor);
+        service.setHttpPort(HTTP_PORT);
+        service.init();
+        TestServlet servlet = new TestServlet();
+        service.registerMapping("/", servlet);
+        Socket client = new Socket("127.0.0.1", HTTP_PORT);
+        OutputStream os = client.getOutputStream();
+        os.write(REQUEST1.getBytes());
+        os.flush();
+        read(client);
+        service.destroy();
+        assertTrue(servlet.invoked);
+    }
+
+    public void testUseWorkScheduler() throws Exception {
+        JettyServiceImpl service = new JettyServiceImpl(monitor,
scheduler);
+        service.setDebug(true);
+        service.setHttpPort(HTTP_PORT);
+        service.init();
+        TestServlet servlet = new TestServlet();
+        service.registerMapping("/", servlet);
+        Socket client = new Socket("127.0.0.1", HTTP_PORT);
+        OutputStream os = client.getOutputStream();
+        os.write(REQUEST1.getBytes());
+        os.flush();
+        read(client);
+        service.destroy();
+        assertTrue(servlet.invoked);
+    }
+
+    public void testRestart() throws Exception {
+        JettyServiceImpl service = new JettyServiceImpl(monitor);
+        service.setHttpPort(HTTP_PORT);
+        service.init();
+        service.destroy();
+        service.init();
+        service.destroy();
+    }
+
+    public void testNoMappings() throws Exception {
+        JettyServiceImpl service = new JettyServiceImpl(monitor);
+        service.setHttpPort(HTTP_PORT);
+        service.init();
+        Socket client = new Socket("127.0.0.1", HTTP_PORT);
+        OutputStream os = client.getOutputStream();
+        os.write(REQUEST1.getBytes());
+        os.flush();
+        read(client);
+        service.destroy();
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        //executor.submit();
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        monitor = createMock(TransportMonitor.class);
+        scheduler = createMock(WorkScheduler.class);
+        scheduler.scheduleWork(isA(Runnable.class));
+
+        expectLastCall().andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                Runnable runnable = (Runnable) getCurrentArguments()[0];
+                executor.execute(runnable);
+                return null;
+            }
+        });
+        replay(scheduler);
+    }
+
+    private static String read(Socket socket) throws IOException {
+        BufferedReader reader = null;
+        try {
+            reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
+            StringBuffer sb = new StringBuffer();
+            String str;
+            while ((str = reader.readLine()) != null) {
+                sb.append(str);
+            }
+            return sb.toString();
+        } finally {
+            if (reader != null) {
+                reader.close();
+            }
+        }
+    }
+
+    private class TestServlet extends HttpServlet {
+        boolean invoked;
+
+        protected void doGet(HttpServletRequest req, HttpServletResponse
resp) throws ServletException, IOException {
+            invoked = true;
+            OutputStream writer = resp.getOutputStream();
+            try {
+                writer.write("result".getBytes());
+            } finally {
+                writer.close();
+            }
+        }
+

-    public void testStartup() throws Exception {
-//        JettyServiceImpl service = new JettyServiceImpl(new
ConsoleMonitor());
-//        service.init();
-//        service.registerComposite(new
File(getClass().getResource("/webapps").toURI()));
-//        service.getServer().join();
-//        service.destroy();
     }
}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


Reply via email to