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]