You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tuscany.apache.org by ant elder <an...@gmail.com> on 2006/07/29 11:32:11 UTC

Re: svn commit: r426664 - in /incubator/tuscany/java/sca: ./ services/transports/http.jetty/ services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/ services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/

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

   ...ant

On 7/28/06, jmarino@apache.org <jm...@apache.org> 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 {@link 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 {@link 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: tuscany-commits-unsubscribe@ws.apache.org
> For additional commands, e-mail: tuscany-commits-help@ws.apache.org
>
>

Re: svn commit: r426664 - in /incubator/tuscany/java/sca: ./ services/transports/http.jetty/ services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/ services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/

Posted by Jeremy Boynes <jb...@apache.org>.
On Jul 29, 2006, at 9:21 AM, Jim Marino wrote:
> There has been some previous discussion on the list (posted by Ken  
> and Jeremy) about making the distribution more modular. I figured  
> this would be a small step to testing out some of those ideas. It  
> may be a good time now to continue those discussions on how to  
> achieve modularization?

Given I'm part of the way writing up some formal proposals, I think  
so :-)
--
Jeremy

---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-dev-help@ws.apache.org


Re: svn commit: r426664 - in /incubator/tuscany/java/sca: ./ services/transports/http.jetty/ services/transports/http.jetty/src/main/java/org/apache/tuscany/service/jetty/ services/transports/http.jetty/src/test/java/org/apache/tuscany/service/jetty/

Posted by Jim Marino <jm...@myromatours.com>.
There's a practical short-term and longer term reason.  The immediate  
issue I have is that the unit tests take 10 seconds on my machine to  
complete because Jetty appears  to take a while dealing with thread  
cleanup. I think this is too long for four unit tests to run as part  
of a checkin. More importantly, as part of modularization, I want to  
eventually break this system service out as a separately developed  
and distributable plugin. The Jetty service is not a "required" core  
service so it would be beneficial to have it separated.

There has been some previous discussion on the list (posted by Ken  
and Jeremy) about making the distribution more modular. I figured  
this would be a small step to testing out some of those ideas. It may  
be a good time now to continue those discussions on how to achieve  
modularization?

Jim


On Jul 29, 2006, at 2:32 AM, ant elder wrote:

> Out of interest, why was this removed from the build?
>
>   ...ant
>
> On 7/28/06, jmarino@apache.org <jm...@apache.org> 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 {@link 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 {@link  
>> 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: tuscany-commits-unsubscribe@ws.apache.org
>> For additional commands, e-mail: tuscany-commits-help@ws.apache.org
>>
>>


---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-dev-help@ws.apache.org