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