View Javadoc

1   // ========================================================================
2   // Copyright (c) 2006-2009 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at 
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses. 
12  // ========================================================================
13  
14  package org.eclipse.jetty.plus.annotation;
15  
16  import java.util.ArrayList;
17  import java.util.HashMap;
18  import java.util.List;
19  import java.util.Map;
20  
21  import org.eclipse.jetty.util.log.Log;
22  
23  
24  /**
25   * LifeCycleCallbackCollection
26   *
27   *
28   */
29  public class LifeCycleCallbackCollection
30  {
31      public static final String LIFECYCLE_CALLBACK_COLLECTION = "org.eclipse.jetty.lifecyleCallbackCollection";
32  
33      private HashMap<String, List<LifeCycleCallback>> postConstructCallbacksMap = new HashMap<String, List<LifeCycleCallback>>();
34      private HashMap<String, List<LifeCycleCallback>> preDestroyCallbacksMap = new HashMap<String, List<LifeCycleCallback>>();
35      
36      /**
37       * Add a Callback to the list of callbacks.
38       * 
39       * @param callback
40       */
41      public void add (LifeCycleCallback callback)
42      {
43          if ((callback==null) || (callback.getTargetClassName()==null))
44              return;
45  
46          if (Log.isDebugEnabled())
47              Log.debug("Adding callback for class="+callback.getTargetClass()+ " on "+callback.getTarget());
48          Map<String, List<LifeCycleCallback>> map = null;
49          if (callback instanceof PreDestroyCallback)
50              map = preDestroyCallbacksMap;
51          if (callback instanceof PostConstructCallback)
52              map = postConstructCallbacksMap;
53  
54          if (map == null)
55              throw new IllegalArgumentException ("Unsupported lifecycle callback type: "+callback);
56       
57          List<LifeCycleCallback> callbacks = map.get(callback.getTargetClassName());
58          if (callbacks==null)
59          {
60              callbacks = new ArrayList<LifeCycleCallback>();
61              map.put(callback.getTargetClassName(), callbacks);
62          }
63         
64          //don't add another callback for exactly the same method
65          if (!callbacks.contains(callback))
66              callbacks.add(callback);
67      }
68  
69      public List<LifeCycleCallback> getPreDestroyCallbacks (Object o)
70      {
71          if (o == null)
72              return null;
73          
74          Class clazz = o.getClass();
75          return preDestroyCallbacksMap.get(clazz.getName());
76      }
77      
78      public List<LifeCycleCallback> getPostConstructCallbacks (Object o)
79      {
80          if (o == null)
81              return null;
82          
83          Class clazz = o.getClass();
84          return postConstructCallbacksMap.get(clazz.getName());
85      }
86      
87      /**
88       * Call the method, if one exists, that is annotated with PostConstruct
89       * or with &lt;post-construct&gt; in web.xml
90       * @param o the object on which to attempt the callback
91       * @throws Exception
92       */
93      public void callPostConstructCallback (Object o)
94      throws Exception
95      {
96          if (o == null)
97              return;
98          
99          Class clazz = o.getClass();
100         List<LifeCycleCallback> callbacks = postConstructCallbacksMap.get(clazz.getName());
101 
102         if (callbacks == null)
103             return;
104 
105         for (int i=0;i<callbacks.size();i++)
106         {
107             ((LifeCycleCallback)callbacks.get(i)).callback(o);
108         }
109     }
110 
111     
112     /**
113      * Call the method, if one exists, that is annotated with PreDestroy
114      * or with &lt;pre-destroy&gt; in web.xml
115      * @param o the object on which to attempt the callback
116      */
117     public void callPreDestroyCallback (Object o)
118     throws Exception
119     {
120         if (o == null)
121             return;
122         
123         Class clazz = o.getClass();
124         List<LifeCycleCallback> callbacks = preDestroyCallbacksMap.get(clazz.getName());
125         if (callbacks == null)
126             return;
127         
128         for (int i=0;i<callbacks.size();i++)
129             ((LifeCycleCallback)callbacks.get(i)).callback(o);
130     }
131 }