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    }