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.Server;
014 import org.mortbay.jetty.RequestLog;
015 import org.mortbay.jetty.servlet.ErrorPageErrorHandler;
016 import org.mortbay.jetty.handler.ContextHandler;
017 import org.mortbay.jetty.handler.HandlerList;
018 import org.mortbay.jetty.handler.RequestLogHandler;
019 import org.mortbay.jetty.handler.ErrorHandler;
020 import org.mortbay.jetty.nio.BlockingChannelConnector;
021 import org.picocontainer.PicoContainer;
022 import org.picocontainer.alternatives.EmptyPicoContainer;
023
024 public class PicoJettyServer extends EmptyPicoContainer implements PicoContainer {
025
026 private final Server server;
027 private final PicoContainer parentContainer;
028 private ErrorHandler errorHandler;
029
030 public PicoJettyServer(PicoContainer parentContainer) {
031 this.parentContainer = parentContainer;
032 server = new Server();
033 server.setHandler(new HandlerList());
034 }
035
036 public PicoJettyServer(String host, int port, PicoContainer parentContainer) {
037 this(parentContainer);
038 createBlockingChannelConnector(host, port);
039 }
040
041 public Connector createBlockingChannelConnector(String host, int port) {
042 BlockingChannelConnector connector = new BlockingChannelConnector();
043 connector.setHost(host);
044 connector.setPort(port);
045 server.addConnector(connector);
046 return connector;
047 }
048
049 public PicoContextHandler createContext(String contextPath, boolean withSessionHandler) {
050 ContextHandler context = new ContextHandler();
051 context.setContextPath(contextPath);
052 server.addHandler(context);
053 return new PicoContextHandler(context, server, parentContainer, withSessionHandler);
054 }
055
056
057 public PicoWebAppContext addWebApplication(String contextPath, String warFile) {
058 PicoWebAppContext wah = new PicoWebAppContext(parentContainer);
059 wah.setContextPath(contextPath);
060 wah.setExtractWAR(true);
061 wah.setWar(warFile);
062 wah.setParentLoaderPriority(true);
063 server.addHandler(wah);
064 return wah;
065 }
066
067
068 public void start() {
069 try {
070 server.start();
071 } catch (Exception e) {
072 e.printStackTrace();
073 throw new JettyServerLifecycleException("Jetty couldn't start", e);
074 }
075 }
076
077 public void stop() {
078 try {
079 server.stop();
080 } catch (Exception e) {
081 throw new JettyServerLifecycleException("Jetty couldn't stop", e);
082 }
083 }
084
085 public void addRequestLog(RequestLog requestLog) {
086 RequestLogHandler requestLogHandler = new RequestLogHandler();
087 requestLogHandler.setRequestLog(requestLog);
088 server.addHandler(requestLogHandler);
089
090 }
091
092 }