View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 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.plus.annotation;
20  
21  import java.util.ArrayList;
22  import java.util.HashMap;
23  import java.util.List;
24  import java.util.Map;
25  
26  import org.eclipse.jetty.util.log.Log;
27  import org.eclipse.jetty.util.log.Logger;
28  
29  
30  /**
31   * LifeCycleCallbackCollection
32   *
33   *
34   */
35  public class LifeCycleCallbackCollection
36  {
37      private static final Logger LOG = Log.getLogger(LifeCycleCallbackCollection.class);
38  
39      public static final String LIFECYCLE_CALLBACK_COLLECTION = "org.eclipse.jetty.lifecyleCallbackCollection";
40  
41      private HashMap<String, List<LifeCycleCallback>> postConstructCallbacksMap = new HashMap<String, List<LifeCycleCallback>>();
42      private HashMap<String, List<LifeCycleCallback>> preDestroyCallbacksMap = new HashMap<String, List<LifeCycleCallback>>();
43      
44      /**
45       * Add a Callback to the list of callbacks.
46       * 
47       * @param callback
48       */
49      public void add (LifeCycleCallback callback)
50      {
51          if ((callback==null) || (callback.getTargetClassName()==null))
52              return;
53  
54          if (LOG.isDebugEnabled())
55              LOG.debug("Adding callback for class="+callback.getTargetClass()+ " on "+callback.getTarget());
56          Map<String, List<LifeCycleCallback>> map = null;
57          if (callback instanceof PreDestroyCallback)
58              map = preDestroyCallbacksMap;
59          if (callback instanceof PostConstructCallback)
60              map = postConstructCallbacksMap;
61  
62          if (map == null)
63              throw new IllegalArgumentException ("Unsupported lifecycle callback type: "+callback);
64       
65          List<LifeCycleCallback> callbacks = map.get(callback.getTargetClassName());
66          if (callbacks==null)
67          {
68              callbacks = new ArrayList<LifeCycleCallback>();
69              map.put(callback.getTargetClassName(), callbacks);
70          }
71         
72          //don't add another callback for exactly the same method
73          if (!callbacks.contains(callback))
74              callbacks.add(callback);
75      }
76  
77      public List<LifeCycleCallback> getPreDestroyCallbacks (Object o)
78      {
79          if (o == null)
80              return null;
81          
82          Class<? extends Object> clazz = o.getClass();
83          return preDestroyCallbacksMap.get(clazz.getName());
84      }
85      
86      public List<LifeCycleCallback> getPostConstructCallbacks (Object o)
87      {
88          if (o == null)
89              return null;
90          
91          Class<? extends Object> clazz = o.getClass();
92          return postConstructCallbacksMap.get(clazz.getName());
93      }
94      
95      /**
96       * Call the method, if one exists, that is annotated with PostConstruct
97       * or with &lt;post-construct&gt; in web.xml
98       * @param o the object on which to attempt the callback
99       * @throws Exception
100      */
101     public void callPostConstructCallback (Object o)
102     throws Exception
103     {
104         if (o == null)
105             return;
106         
107         Class<? extends Object> clazz = o.getClass();
108         List<LifeCycleCallback> callbacks = postConstructCallbacksMap.get(clazz.getName());
109 
110         if (callbacks == null)
111             return;
112 
113         for (int i=0;i<callbacks.size();i++)
114         {
115             ((LifeCycleCallback)callbacks.get(i)).callback(o);
116         }
117     }
118 
119     
120     /**
121      * Call the method, if one exists, that is annotated with PreDestroy
122      * or with &lt;pre-destroy&gt; in web.xml
123      * @param o the object on which to attempt the callback
124      */
125     public void callPreDestroyCallback (Object o)
126     throws Exception
127     {
128         if (o == null)
129             return;
130         
131         Class<? extends Object> clazz = o.getClass();
132         List<LifeCycleCallback> callbacks = preDestroyCallbacksMap.get(clazz.getName());
133         if (callbacks == null)
134             return;
135         
136         for (int i=0;i<callbacks.size();i++)
137             ((LifeCycleCallback)callbacks.get(i)).callback(o);
138     }
139 }