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      private HashMap postConstructCallbacksMap = new HashMap();
33      private HashMap preDestroyCallbacksMap = new HashMap();
34      
35      
36   
37      
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.getTargetClass()==null) || (callback.getTarget()==null))
47              return;
48  
49          if (Log.isDebugEnabled())
50              Log.debug("Adding callback for class="+callback.getTargetClass()+ " on "+callback.getTarget());
51          Map 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       
61          List callbacks = (List)map.get(callback.getTargetClass());
62          if (callbacks==null)
63          {
64              callbacks = new ArrayList();
65              map.put(callback.getTargetClass(), callbacks);
66          }
67         
68          //don't add another callback for exactly the same method
69          if (!callbacks.contains(callback))
70              callbacks.add(callback);
71      }
72  
73      public List getPreDestroyCallbacks (Object o)
74      {
75          if (o == null)
76              return null;
77          
78          Class clazz = o.getClass();
79          return (List)preDestroyCallbacksMap.get(clazz);
80      }
81      
82      public List getPostConstructCallbacks (Object o)
83      {
84          if (o == null)
85              return null;
86          
87          Class clazz = o.getClass();
88          return (List)postConstructCallbacksMap.get(clazz);
89      }
90      
91      /**
92       * Call the method, if one exists, that is annotated with PostConstruct
93       * or with <post-construct> in web.xml
94       * @param o the object on which to attempt the callback
95       * @throws Exception
96       */
97      public void callPostConstructCallback (Object o)
98      throws Exception
99      {
100         if (o == null)
101             return;
102         
103         Class clazz = o.getClass();
104         List callbacks = (List)postConstructCallbacksMap.get(clazz);
105         
106         if (callbacks == null)
107             return;
108         
109         for (int i=0;i<callbacks.size();i++)
110             ((LifeCycleCallback)callbacks.get(i)).callback(o);
111     }
112     
113     
114     /**
115      * Call the method, if one exists, that is annotated with PreDestroy
116      * or with &lt;pre-destroy&gt; in web.xml
117      * @param o the object on which to attempt the callback
118      */
119     public void callPreDestroyCallback (Object o)
120     throws Exception
121     {
122         if (o == null)
123             return;
124         
125         Class clazz = o.getClass();
126         List callbacks = (List)preDestroyCallbacksMap.get(clazz);
127         if (callbacks == null)
128             return;
129         
130         for (int i=0;i<callbacks.size();i++)
131             ((LifeCycleCallback)callbacks.get(i)).callback(o);
132     }
133 }