1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.server.handler;
20
21 import java.io.IOException;
22 import java.util.List;
23
24 import javax.servlet.ServletException;
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
27
28 import org.eclipse.jetty.server.Handler;
29 import org.eclipse.jetty.server.Request;
30 import org.eclipse.jetty.server.Server;
31 import org.eclipse.jetty.util.ArrayUtil;
32 import org.eclipse.jetty.util.MultiException;
33 import org.eclipse.jetty.util.annotation.ManagedAttribute;
34 import org.eclipse.jetty.util.annotation.ManagedObject;
35
36
37
38
39
40
41
42
43
44
45
46 @ManagedObject("Handler of multiple handlers")
47 public class HandlerCollection extends AbstractHandlerContainer
48 {
49 private final boolean _mutableWhenRunning;
50 private volatile Handler[] _handlers;
51
52
53 public HandlerCollection()
54 {
55 _mutableWhenRunning=false;
56 }
57
58
59 public HandlerCollection(boolean mutableWhenRunning)
60 {
61 _mutableWhenRunning=mutableWhenRunning;
62 }
63
64
65
66
67
68 @Override
69 @ManagedAttribute(value="Wrapped handlers", readonly=true)
70 public Handler[] getHandlers()
71 {
72 return _handlers;
73 }
74
75
76
77
78
79 public void setHandlers(Handler[] handlers)
80 {
81 if (!_mutableWhenRunning && isStarted())
82 throw new IllegalStateException(STARTED);
83
84 if (handlers!=null)
85 for (Handler handler:handlers)
86 if (handler.getServer()!=getServer())
87 handler.setServer(getServer());
88
89 updateBeans(_handlers, handlers);
90 _handlers = handlers;
91 }
92
93
94
95
96
97 @Override
98 public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
99 throws IOException, ServletException
100 {
101 if (_handlers!=null && isStarted())
102 {
103 MultiException mex=null;
104
105 for (int i=0;i<_handlers.length;i++)
106 {
107 try
108 {
109 _handlers[i].handle(target,baseRequest, request, response);
110 }
111 catch(IOException e)
112 {
113 throw e;
114 }
115 catch(RuntimeException e)
116 {
117 throw e;
118 }
119 catch(Exception e)
120 {
121 if (mex==null)
122 mex=new MultiException();
123 mex.add(e);
124 }
125 }
126 if (mex!=null)
127 {
128 if (mex.size()==1)
129 throw new ServletException(mex.getThrowable(0));
130 else
131 throw new ServletException(mex);
132 }
133
134 }
135 }
136
137
138 @Override
139 public void setServer(Server server)
140 {
141 super.setServer(server);
142 Handler[] handlers=getHandlers();
143 if (handlers!=null)
144 for (Handler h : handlers)
145 h.setServer(server);
146 }
147
148
149
150
151
152
153 public void addHandler(Handler handler)
154 {
155 setHandlers(ArrayUtil.addToArray(getHandlers(), handler, Handler.class));
156 }
157
158
159 public void removeHandler(Handler handler)
160 {
161 Handler[] handlers = getHandlers();
162
163 if (handlers!=null && handlers.length>0 )
164 setHandlers(ArrayUtil.removeFromArray(handlers, handler));
165 }
166
167
168 @Override
169 protected void expandChildren(List<Handler> list, Class<?> byClass)
170 {
171 if (getHandlers()!=null)
172 for (Handler h:getHandlers())
173 expandHandler(h, list, byClass);
174 }
175
176
177 @Override
178 public void destroy()
179 {
180 if (!isStopped())
181 throw new IllegalStateException("!STOPPED");
182 Handler[] children=getChildHandlers();
183 setHandlers(null);
184 for (Handler child: children)
185 child.destroy();
186 super.destroy();
187 }
188 }