001 /*****************************************************************************
002 * Copyright (C) NanoContainer Organization. All rights reserved. *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file. *
007 * *
008 *****************************************************************************/
009
010 package org.nanocontainer.webcontainer;
011
012 import org.mortbay.jetty.Connector;
013 import org.mortbay.jetty.RequestLog;
014 import org.mortbay.jetty.Server;
015 import org.mortbay.jetty.handler.HandlerList;
016 import org.mortbay.jetty.handler.RequestLogHandler;
017 import org.mortbay.jetty.nio.BlockingChannelConnector;
018 import org.mortbay.jetty.servlet.Context;
019 import org.picocontainer.PicoContainer;
020 import org.picocontainer.Startable;
021 import org.picocontainer.alternatives.EmptyPicoContainer;
022
023 public class PicoJettyServer extends EmptyPicoContainer implements PicoContainer, Startable {
024
025 private final Server server;
026 private final PicoContainer parentContainer;
027
028 public PicoJettyServer(PicoContainer parentContainer) {
029 this.parentContainer = parentContainer;
030 server = new Server();
031 server.setHandler(new HandlerList());
032 }
033
034 public PicoJettyServer(String host, int port, PicoContainer parentContainer) {
035 this(parentContainer);
036 createBlockingChannelConnector(host, port);
037 }
038
039 public Connector createBlockingChannelConnector(String host, int port) {
040 BlockingChannelConnector connector = new BlockingChannelConnector();
041 connector.setHost(host);
042 connector.setPort(port);
043 server.addConnector(connector);
044 return connector;
045 }
046
047 public PicoContext createContext(String contextPath, boolean withSessionHandler) {
048 Context context = new Context(server, contextPath, Context.SESSIONS);
049 return new PicoContext(context, parentContainer, withSessionHandler);
050 }
051
052 public PicoWebAppContext addWebApplication(String contextPath, String warFile) {
053 PicoWebAppContext context = new PicoWebAppContext(parentContainer);
054 context.setContextPath(contextPath);
055 context.setExtractWAR(true);
056 context.setWar(warFile);
057 context.setParentLoaderPriority(true);
058 server.addHandler(context);
059 return context;
060 }
061
062 public void start() {
063 try {
064 server.start();
065 } catch (Exception e) {
066 throw new JettyServerLifecycleException("Jetty couldn't start", e);
067 }
068 }
069
070 public void stop() {
071 try {
072 server.stop();
073 } catch (Exception e) {
074 throw new JettyServerLifecycleException("Jetty couldn't stop", e);
075 }
076 }
077
078 public void addRequestLog(RequestLog requestLog) {
079 RequestLogHandler handler = new RequestLogHandler();
080 handler.setRequestLog(requestLog);
081 server.addHandler(handler);
082 }
083
084 }