View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2015 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.annotations;
20  
21  import java.lang.reflect.Array;
22  
23  import org.eclipse.jetty.util.Loader;
24  import org.eclipse.jetty.util.TypeUtil;
25  import org.objectweb.asm.Type;
26  
27  /**
28   * Annotation Processing Utilities
29   */
30  public class Util
31  { 
32      private static Class[] __envEntryClassTypes = 
33          new Class[] {String.class, Character.class, Integer.class, Boolean.class, Double.class, Byte.class, Short.class, Long.class, Float.class};
34      
35  
36      private static String[] __envEntryTypes = 
37          new String[] { Type.getDescriptor(String.class), Type.getDescriptor(Character.class), Type.getDescriptor(Integer.class), Type.getDescriptor(Boolean.class),
38                         Type.getDescriptor(Double.class), Type.getDescriptor(Byte.class), Type.getDescriptor(Short.class), Type.getDescriptor(Long.class), Type.getDescriptor(Float.class)};
39      
40      /**
41       * Check if the presented method belongs to a class that is one
42       * of the classes with which a servlet container should be concerned.
43       * @param c the class
44       * @return true if class is a type of one of the following: 
45       *          ({@link javax.servlet.Servlet}, 
46       *           {@link javax.servlet.Filter}, 
47       *           {@link javax.servlet.ServletContextListener},
48       *           {@link javax.servlet.ServletContextAttributeListener},
49       *           {@link javax.servlet.ServletRequestListener},
50       *           {@link javax.servlet.ServletRequestAttributeListener},
51       *           {@link javax.servlet.http.HttpSessionListener},
52       *           {@link javax.servlet.http.HttpSessionAttributeListener})
53       */
54      public static boolean isServletType (Class c)
55      {    
56          boolean isServlet = false;
57          if (javax.servlet.Servlet.class.isAssignableFrom(c) ||
58                  javax.servlet.Filter.class.isAssignableFrom(c) || 
59                  javax.servlet.ServletContextListener.class.isAssignableFrom(c) ||
60                  javax.servlet.ServletContextAttributeListener.class.isAssignableFrom(c) ||
61                  javax.servlet.ServletRequestListener.class.isAssignableFrom(c) ||
62                  javax.servlet.ServletRequestAttributeListener.class.isAssignableFrom(c) ||
63                  javax.servlet.http.HttpSessionListener.class.isAssignableFrom(c) ||
64                  javax.servlet.http.HttpSessionAttributeListener.class.isAssignableFrom(c) ||
65                  javax.servlet.AsyncListener.class.isAssignableFrom(c))
66  
67                  isServlet=true;
68          
69          return isServlet;  
70      }
71      
72      
73      public static boolean supportsResourceInjection (Class c)
74      {
75          if (javax.servlet.Servlet.class.isAssignableFrom(c) ||
76                  javax.servlet.Filter.class.isAssignableFrom(c) || 
77                  javax.servlet.ServletContextListener.class.isAssignableFrom(c) ||
78                  javax.servlet.ServletContextAttributeListener.class.isAssignableFrom(c) ||
79                  javax.servlet.ServletRequestListener.class.isAssignableFrom(c) ||
80                  javax.servlet.ServletRequestAttributeListener.class.isAssignableFrom(c) ||
81                  javax.servlet.http.HttpSessionListener.class.isAssignableFrom(c) ||
82                  javax.servlet.http.HttpSessionAttributeListener.class.isAssignableFrom(c) ||
83                  javax.servlet.http.HttpSessionIdListener.class.isAssignableFrom(c) ||
84                  javax.servlet.AsyncListener.class.isAssignableFrom(c) ||
85                  javax.servlet.http.HttpUpgradeHandler.class.isAssignableFrom(c))
86              return true;
87          
88          return false;
89      }
90      
91      
92      public static boolean supportsPostConstructPreDestroy (Class c)
93      {
94          if (javax.servlet.Servlet.class.isAssignableFrom(c) ||
95                  javax.servlet.Filter.class.isAssignableFrom(c) || 
96                  javax.servlet.ServletContextListener.class.isAssignableFrom(c) ||
97                  javax.servlet.ServletContextAttributeListener.class.isAssignableFrom(c) ||
98                  javax.servlet.ServletRequestListener.class.isAssignableFrom(c) ||
99                  javax.servlet.ServletRequestAttributeListener.class.isAssignableFrom(c) ||
100                 javax.servlet.http.HttpSessionListener.class.isAssignableFrom(c) ||
101                 javax.servlet.http.HttpSessionAttributeListener.class.isAssignableFrom(c) ||
102                 javax.servlet.http.HttpSessionIdListener.class.isAssignableFrom(c) ||
103                 javax.servlet.AsyncListener.class.isAssignableFrom(c) ||
104                 javax.servlet.http.HttpUpgradeHandler.class.isAssignableFrom(c))
105             return true;
106         
107         return false;
108     }
109 
110     public static boolean isEnvEntryType (Class type)
111     {
112         boolean result = false;
113         for (int i=0;i<__envEntryClassTypes.length && !result;i++)
114         {
115             result = (type.equals(__envEntryClassTypes[i]));
116         }
117         return result;
118     }
119     
120     public static boolean isEnvEntryType (String desc)
121     {
122         boolean result = false;
123         for (int i=0;i<__envEntryTypes.length && !result;i++)
124         {
125             result = (desc.equals(__envEntryTypes[i]));
126         }
127         return result;
128     }
129     
130     public static String normalizePattern(String p)
131     {
132         if (p!=null && p.length()>0 && !p.startsWith("/") && !p.startsWith("*"))
133             return "/"+p;
134         return p;
135     }
136     
137 
138     
139     public static Class[] convertTypes (String params)
140     throws Exception
141     {
142         return convertTypes(Type.getArgumentTypes(params));
143     }
144     
145     
146     public static Class[] convertTypes (Type[] types)
147     throws Exception
148     {
149         if (types==null)
150             return new Class[0];
151         
152         Class[] classArray = new Class[types.length];
153         
154         for (int i=0; i<types.length; i++)
155         {
156             classArray[i] = convertType(types[i]);
157         }
158         return classArray;
159     }
160 
161     public static Class convertType (Type t)
162     throws Exception
163     {
164         if (t == null)
165             return (Class)null;
166         
167         switch (t.getSort())
168         {
169             case Type.BOOLEAN:
170             {
171                 return Boolean.TYPE;
172             }
173             case Type.ARRAY:
174             {
175                 Class clazz = convertType(t.getElementType());
176                 return Array.newInstance(clazz, 0).getClass();
177             }
178             case Type.BYTE:
179             {
180                 return Byte.TYPE;
181             }
182             case Type.CHAR:
183             {
184                 return Character.TYPE;
185             }
186             case Type.DOUBLE:
187             {
188                 return Double.TYPE;
189             }
190             case Type.FLOAT:
191             {
192                 return Float.TYPE;
193             }
194             case Type.INT:
195             {
196                 return Integer.TYPE;
197             }
198             case Type.LONG:
199             {
200                 return Long.TYPE;
201             }
202             case Type.OBJECT:
203             {
204                 return (Loader.loadClass(null, t.getClassName()));
205             }
206             case Type.SHORT:
207             {
208                 return Short.TYPE;
209             }
210             case Type.VOID:
211             {
212                 return null;
213             }
214             default:
215                 return null;
216         }
217         
218     }
219   
220     public static String asCanonicalName (Type t)
221     {
222         if (t == null)
223             return null;
224         
225         switch (t.getSort())
226         {
227             case Type.BOOLEAN:
228             {
229                 return TypeUtil.toName(Boolean.TYPE);
230             }
231             case Type.ARRAY:
232             {
233                 return  t.getElementType().getClassName();
234             }
235             case Type.BYTE:
236             {
237                 return TypeUtil.toName(Byte.TYPE);
238             }
239             case Type.CHAR:
240             {
241                 return TypeUtil.toName(Character.TYPE);
242             }
243             case Type.DOUBLE:
244             {
245                 return TypeUtil.toName(Double.TYPE);
246             }
247             case Type.FLOAT:
248             {
249                  return TypeUtil.toName(Float.TYPE);
250             }
251             case Type.INT:
252             {
253                 return TypeUtil.toName(Integer.TYPE);
254             }
255             case Type.LONG:
256             {
257                 return TypeUtil.toName(Long.TYPE);
258             }
259             case Type.OBJECT:
260             {
261                 return t.getClassName();
262             }
263             case Type.SHORT:
264             {
265                 return TypeUtil.toName(Short.TYPE);
266             }
267             case Type.VOID:
268             {
269                 return null;
270             }
271             default:
272                 return null;
273         }
274     }
275 }