Mercurial Hosting > luan
comparison src/org/eclipse/jetty/util/component/AggregateLifeCycle.java @ 912:1d0c304e12b5
simplify AggregateLifeCycle
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sat, 08 Oct 2016 22:05:14 -0600 |
parents | 9b65e8064f90 |
children |
comparison
equal
deleted
inserted
replaced
911:cab5830e1ab0 | 912:1d0c304e12b5 |
---|---|
49 private final List<Bean> _beans=new CopyOnWriteArrayList<Bean>(); | 49 private final List<Bean> _beans=new CopyOnWriteArrayList<Bean>(); |
50 private boolean _started=false; | 50 private boolean _started=false; |
51 | 51 |
52 private class Bean | 52 private class Bean |
53 { | 53 { |
54 Bean(Object b) | 54 Bean(LifeCycle b,boolean managed) |
55 { | 55 { |
56 _bean=b; | 56 _bean = b; |
57 } | 57 _managed = managed; |
58 final Object _bean; | 58 } |
59 volatile boolean _managed=true; | 59 final LifeCycle _bean; |
60 final boolean _managed; | |
60 | 61 |
61 public String toString() | 62 public String toString() |
62 { | 63 { |
63 return "{"+_bean+","+_managed+"}"; | 64 return "{"+_bean+","+_managed+"}"; |
64 } | 65 } |
72 @Override | 73 @Override |
73 protected void doStart() throws Exception | 74 protected void doStart() throws Exception |
74 { | 75 { |
75 for (Bean b:_beans) | 76 for (Bean b:_beans) |
76 { | 77 { |
77 if (b._managed && b._bean instanceof LifeCycle) | 78 if (b._managed) |
78 { | 79 { |
79 LifeCycle l=(LifeCycle)b._bean; | 80 LifeCycle l = b._bean; |
80 if (!l.isRunning()) | 81 if (!l.isRunning()) |
81 l.start(); | 82 l.start(); |
82 } | 83 } |
83 } | 84 } |
84 // indicate that we are started, so that addBean will start other beans added. | 85 // indicate that we are started, so that addBean will start other beans added. |
85 _started=true; | 86 _started = true; |
86 super.doStart(); | 87 super.doStart(); |
87 } | 88 } |
88 | 89 |
89 /* ------------------------------------------------------------ */ | 90 /* ------------------------------------------------------------ */ |
90 /** | 91 /** |
92 * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart() | 93 * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart() |
93 */ | 94 */ |
94 @Override | 95 @Override |
95 protected void doStop() throws Exception | 96 protected void doStop() throws Exception |
96 { | 97 { |
97 _started=false; | 98 _started = false; |
98 super.doStop(); | 99 super.doStop(); |
99 List<Bean> reverse = new ArrayList<Bean>(_beans); | 100 List<Bean> reverse = new ArrayList<Bean>(_beans); |
100 Collections.reverse(reverse); | 101 Collections.reverse(reverse); |
101 for (Bean b:reverse) | 102 for (Bean b:reverse) |
102 { | 103 { |
103 if (b._managed && b._bean instanceof LifeCycle) | 104 if (b._managed) |
104 { | 105 { |
105 LifeCycle l=(LifeCycle)b._bean; | 106 LifeCycle l = b._bean; |
106 if (l.isRunning()) | 107 if (l.isRunning()) |
107 l.stop(); | 108 l.stop(); |
108 } | 109 } |
109 } | 110 } |
110 } | 111 } |
121 Collections.reverse(reverse); | 122 Collections.reverse(reverse); |
122 for (Bean b:reverse) | 123 for (Bean b:reverse) |
123 { | 124 { |
124 if (b._bean instanceof Destroyable && b._managed) | 125 if (b._bean instanceof Destroyable && b._managed) |
125 { | 126 { |
126 Destroyable d=(Destroyable)b._bean; | 127 Destroyable d = (Destroyable)b._bean; |
127 d.destroy(); | 128 d.destroy(); |
128 } | 129 } |
129 } | 130 } |
130 _beans.clear(); | 131 _beans.clear(); |
131 } | 132 } |
134 /* ------------------------------------------------------------ */ | 135 /* ------------------------------------------------------------ */ |
135 /** Is the bean contained in the aggregate. | 136 /** Is the bean contained in the aggregate. |
136 * @param bean | 137 * @param bean |
137 * @return True if the aggregate contains the bean | 138 * @return True if the aggregate contains the bean |
138 */ | 139 */ |
139 private boolean contains(Object bean) | 140 private boolean contains(LifeCycle bean) |
140 { | 141 { |
141 for (Bean b:_beans) | 142 for (Bean b:_beans) |
142 if (b._bean==bean) | 143 if (b._bean==bean) |
143 return true; | 144 return true; |
144 return false; | 145 return false; |
152 * method should be used if this is not correct, or the {@link #manage(Object)} and {@link #unmanage(Object)} | 153 * method should be used if this is not correct, or the {@link #manage(Object)} and {@link #unmanage(Object)} |
153 * methods may be used after an add to change the status. | 154 * methods may be used after an add to change the status. |
154 * @param o the bean object to add | 155 * @param o the bean object to add |
155 * @return true if the bean was added or false if it has already been added. | 156 * @return true if the bean was added or false if it has already been added. |
156 */ | 157 */ |
157 public boolean addBean(Object o) | 158 public boolean addBean(LifeCycle o) |
158 { | 159 { |
159 // beans are joined unless they are started lifecycles | 160 // beans are joined unless they are started lifecycles |
160 return addBean(o,!((o instanceof LifeCycle)&&((LifeCycle)o).isStarted())); | 161 return addBean(o,!o.isStarted()); |
161 } | 162 } |
162 | 163 |
163 /* ------------------------------------------------------------ */ | 164 /* ------------------------------------------------------------ */ |
164 /** Add an associated lifecycle. | 165 /** Add an associated lifecycle. |
165 * @param o The lifecycle to add | 166 * @param o The lifecycle to add |
166 * @param managed True if the LifeCycle is to be joined, otherwise it will be disjoint. | 167 * @param managed True if the LifeCycle is to be joined, otherwise it will be disjoint. |
167 * @return true if bean was added, false if already present. | 168 * @return true if bean was added, false if already present. |
168 */ | 169 */ |
169 public boolean addBean(Object o, boolean managed) | 170 public boolean addBean(LifeCycle o, boolean managed) |
170 { | 171 { |
171 if (contains(o)) | 172 if (contains(o)) |
172 return false; | 173 return false; |
173 | 174 |
174 Bean b = new Bean(o); | 175 Bean b = new Bean(o,managed); |
175 b._managed=managed; | |
176 _beans.add(b); | 176 _beans.add(b); |
177 | 177 |
178 if (o instanceof LifeCycle) | 178 // Start the bean if we are started |
179 { | 179 if (managed && _started) |
180 LifeCycle l=(LifeCycle)o; | 180 { |
181 | 181 try |
182 // Start the bean if we are started | 182 { |
183 if (managed && _started) | 183 o.start(); |
184 { | 184 } |
185 try | 185 catch(Exception e) |
186 { | 186 { |
187 l.start(); | 187 throw new RuntimeException(e); |
188 } | |
189 catch(Exception e) | |
190 { | |
191 throw new RuntimeException (e); | |
192 } | |
193 } | 188 } |
194 } | 189 } |
195 return true; | 190 return true; |
196 } | 191 } |
197 | 192 |
199 /** Get dependent beans | 194 /** Get dependent beans |
200 * @return List of beans. | 195 * @return List of beans. |
201 */ | 196 */ |
202 public Collection<Object> getBeans() | 197 public Collection<Object> getBeans() |
203 { | 198 { |
204 List<Object> beans = new ArrayList<Object>(); | 199 // return new ArrayList<Object>(_beans); |
205 beans.addAll(_beans); | 200 ArrayList<Object> beans = new ArrayList<Object>(); |
201 for (Bean b:_beans) { | |
202 beans.add(b._bean); | |
203 } | |
206 return beans; | 204 return beans; |
207 } | 205 } |
208 | 206 |
209 | 207 |
210 /* ------------------------------------------------------------ */ | 208 /* ------------------------------------------------------------ */ |
211 /** Get dependent beans of a specific class. | |
212 * If more than one bean of the type exist, the first is returned. | |
213 * @see #addBean(Object) | |
214 * @param clazz | |
215 * @return bean or null | |
216 */ | |
217 public <T> T getBean(Class<T> clazz) | |
218 { | |
219 for (Bean b:_beans) | |
220 { | |
221 if (clazz.isInstance(b._bean)) | |
222 return (T)b._bean; | |
223 } | |
224 | |
225 return null; | |
226 } | |
227 | |
228 /* ------------------------------------------------------------ */ | |
229 /** | 209 /** |
230 * Remove an associated bean. | 210 * Remove an associated bean. |
231 */ | 211 */ |
232 public boolean removeBean (Object o) | 212 public boolean removeBean (LifeCycle o) |
233 { | 213 { |
234 Iterator<Bean> i = _beans.iterator(); | 214 Iterator<Bean> i = _beans.iterator(); |
235 while(i.hasNext()) | 215 while(i.hasNext()) |
236 { | 216 { |
237 Bean b=i.next(); | 217 Bean b=i.next(); |
242 } | 222 } |
243 } | 223 } |
244 return false; | 224 return false; |
245 } | 225 } |
246 | 226 |
247 /* ------------------------------------------------------------ */ | |
248 public void dumpStdErr() | |
249 { | |
250 try | |
251 { | |
252 dump(System.err,""); | |
253 } | |
254 catch (IOException e) | |
255 { | |
256 LOG.warn("",e); | |
257 } | |
258 } | |
259 | |
260 /* ------------------------------------------------------------ */ | |
261 public String dump() | 227 public String dump() |
262 { | 228 { |
263 return dump(this); | 229 return dump(this); |
264 } | 230 } |
265 | 231 |
266 /* ------------------------------------------------------------ */ | |
267 public static String dump(Dumpable dumpable) | 232 public static String dump(Dumpable dumpable) |
268 { | 233 { |
269 StringBuilder b = new StringBuilder(); | 234 StringBuilder b = new StringBuilder(); |
270 try | 235 try |
271 { | 236 { |
276 LOG.warn("",e); | 241 LOG.warn("",e); |
277 } | 242 } |
278 return b.toString(); | 243 return b.toString(); |
279 } | 244 } |
280 | 245 |
281 /* ------------------------------------------------------------ */ | 246 private void dump(Appendable out) throws IOException |
282 public void dump(Appendable out) throws IOException | |
283 { | 247 { |
284 dump(out,""); | 248 dump(out,""); |
285 } | 249 } |
286 | 250 |
287 /* ------------------------------------------------------------ */ | 251 private void dumpThis(Appendable out) throws IOException |
288 protected void dumpThis(Appendable out) throws IOException | |
289 { | 252 { |
290 out.append(String.valueOf(this)).append(" - ").append(getState()).append("\n"); | 253 out.append(String.valueOf(this)).append(" - ").append(getState()).append("\n"); |
291 } | 254 } |
292 | 255 |
293 /* ------------------------------------------------------------ */ | |
294 public static void dumpObject(Appendable out,Object o) throws IOException | 256 public static void dumpObject(Appendable out,Object o) throws IOException |
295 { | 257 { |
296 try | 258 try |
297 { | 259 { |
298 if (o instanceof LifeCycle) | 260 if (o instanceof LifeCycle) |
304 { | 266 { |
305 out.append(" => ").append(th.toString()).append('\n'); | 267 out.append(" => ").append(th.toString()).append('\n'); |
306 } | 268 } |
307 } | 269 } |
308 | 270 |
309 /* ------------------------------------------------------------ */ | |
310 public void dump(Appendable out,String indent) throws IOException | 271 public void dump(Appendable out,String indent) throws IOException |
311 { | 272 { |
312 dumpThis(out); | 273 dumpThis(out); |
313 int size=_beans.size(); | 274 int size=_beans.size(); |
314 if (size==0) | 275 if (size==0) |
332 | 293 |
333 if (i!=size) | 294 if (i!=size) |
334 out.append(indent).append(" |\n"); | 295 out.append(indent).append(" |\n"); |
335 } | 296 } |
336 | 297 |
337 /* ------------------------------------------------------------ */ | |
338 public static void dump(Appendable out,String indent,Collection<?>... collections) throws IOException | 298 public static void dump(Appendable out,String indent,Collection<?>... collections) throws IOException |
339 { | 299 { |
340 if (collections.length==0) | 300 if (collections.length==0) |
341 return; | 301 return; |
342 int size=0; | 302 int size=0; |