1 //
2 //  ========================================================================
3 //  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4 //  ------------------------------------------------------------------------
5 //  All rights reserved. This program and the accompanying materials
6 //  are made available under the terms of the Eclipse Public License v1.0
7 //  and Apache License v2.0 which accompanies this distribution.
8 //
9 //      The Eclipse Public License is available at
10 //      http://www.eclipse.org/legal/epl-v10.html
11 //
12 //      The Apache License v2.0 is available at
13 //      http://www.opensource.org/licenses/apache2.0.php
14 //
15 //  You may elect to redistribute this code under either of these licenses.
16 //  ========================================================================
17 //
18 
19 package org.eclipse.jetty.server.handler;
20 
21 import java.io.IOException;
22 
23 import javax.servlet.ServletException;
24 import javax.servlet.http.HttpServletRequest;
25 import javax.servlet.http.HttpServletResponse;
26 
27 import org.eclipse.jetty.server.Handler;
28 import org.eclipse.jetty.server.Request;
29 import org.eclipse.jetty.server.Server;
30 
31 /* ------------------------------------------------------------ */
32 /**
33  * A <code>HandlerContainer</code> that allows a hot swap of a wrapped handler.
34  *
35  */
36 public class HotSwapHandler extends AbstractHandlerContainer
37 {
38     private volatile Handler _handler;
39 
40     /* ------------------------------------------------------------ */
41     /**
42      *
43      */
HotSwapHandler()44     public HotSwapHandler()
45     {
46     }
47 
48     /* ------------------------------------------------------------ */
49     /**
50      * @return Returns the handlers.
51      */
getHandler()52     public Handler getHandler()
53     {
54         return _handler;
55     }
56 
57     /* ------------------------------------------------------------ */
58     /**
59      * @return Returns the handlers.
60      */
getHandlers()61     public Handler[] getHandlers()
62     {
63         return new Handler[]
64         { _handler };
65     }
66 
67     /* ------------------------------------------------------------ */
68     /**
69      * @param handler
70      *            Set the {@link Handler} which should be wrapped.
71      */
setHandler(Handler handler)72     public void setHandler(Handler handler)
73     {
74         if (handler == null)
75             throw new IllegalArgumentException("Parameter handler is null.");
76         try
77         {
78             Handler old_handler = _handler;
79             _handler = handler;
80             Server server = getServer();
81             handler.setServer(server);
82             addBean(handler);
83 
84             if (server != null)
85                 server.getContainer().update(this,old_handler,handler,"handler");
86 
87             // if there is an old handler and it was started, stop it
88             if (old_handler != null)
89             {
90                 removeBean(old_handler);
91             }
92 
93         }
94         catch (Exception e)
95         {
96             throw new RuntimeException(e);
97         }
98     }
99 
100     /* ------------------------------------------------------------ */
101     /*
102      * @see org.eclipse.thread.AbstractLifeCycle#doStart()
103      */
104     @Override
doStart()105     protected void doStart() throws Exception
106     {
107         super.doStart();
108     }
109 
110     /* ------------------------------------------------------------ */
111     /*
112      * @see org.eclipse.thread.AbstractLifeCycle#doStop()
113      */
114     @Override
doStop()115     protected void doStop() throws Exception
116     {
117         super.doStop();
118     }
119 
120     /* ------------------------------------------------------------ */
121     /*
122      * @see org.eclipse.jetty.server.server.EventHandler#handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
123      */
handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)124     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
125     {
126         if (_handler != null && isStarted())
127         {
128             _handler.handle(target,baseRequest,request,response);
129         }
130     }
131 
132     /* ------------------------------------------------------------ */
133     @Override
setServer(Server server)134     public void setServer(Server server)
135     {
136         Server old_server = getServer();
137         if (server == old_server)
138             return;
139 
140         if (isRunning())
141             throw new IllegalStateException(RUNNING);
142 
143         super.setServer(server);
144 
145         Handler h = getHandler();
146         if (h != null)
147             h.setServer(server);
148 
149         if (server != null && server != old_server)
150             server.getContainer().update(this,null,_handler,"handler");
151     }
152 
153     /* ------------------------------------------------------------ */
154     @SuppressWarnings(
155     { "rawtypes", "unchecked" })
156     @Override
expandChildren(Object list, Class byClass)157     protected Object expandChildren(Object list, Class byClass)
158     {
159         return expandHandler(_handler,list,byClass);
160     }
161 
162     /* ------------------------------------------------------------ */
163     @Override
destroy()164     public void destroy()
165     {
166         if (!isStopped())
167             throw new IllegalStateException("!STOPPED");
168         Handler child = getHandler();
169         if (child != null)
170         {
171             setHandler(null);
172             child.destroy();
173         }
174         super.destroy();
175     }
176 }
177