1 16 package org.directwebremoting.annotations; 17 18 import java.beans.Introspector ; 19 import java.lang.reflect.Field ; 20 import java.lang.reflect.Method ; 21 import java.util.ArrayList ; 22 import java.util.Arrays ; 23 import java.util.HashMap ; 24 import java.util.HashSet ; 25 import java.util.Map ; 26 import java.util.Set ; 27 28 import org.directwebremoting.AjaxFilter; 29 import org.directwebremoting.Container; 30 import org.directwebremoting.convert.BeanConverter; 31 import org.directwebremoting.create.NewCreator; 32 import org.directwebremoting.extend.AccessControl; 33 import org.directwebremoting.extend.AjaxFilterManager; 34 import org.directwebremoting.extend.Configurator; 35 import org.directwebremoting.extend.Converter; 36 import org.directwebremoting.extend.ConverterManager; 37 import org.directwebremoting.extend.Creator; 38 import org.directwebremoting.extend.CreatorManager; 39 import org.directwebremoting.util.LocalUtil; 40 import org.directwebremoting.util.Logger; 41 42 47 public class AnnotationsConfigurator implements Configurator 48 { 49 52 public void configure(Container container) 53 { 54 Object data = container.getBean("classes"); 55 if (data == null) 56 { 57 return; 58 } 59 60 if (data instanceof String ) 61 { 62 String classesStr = (String ) data; 63 String [] classNames = classesStr.split(","); 64 for (int i = 0; i < classNames.length; i++) 65 { 66 String className = classNames[i].trim(); 67 try 68 { 69 Class <?> clazz = LocalUtil.classForName(className); 70 processClass(clazz, container); 71 } 72 catch (Exception ex) 73 { 74 log.error("Failed to process class: " + className, ex); 75 } 76 } 77 } 78 else 79 { 80 try 81 { 82 processClass(data.getClass(), container); 83 } 84 catch (Exception ex) 85 { 86 log.error("Failed to process class: " + data.getClass().getName(), ex); 87 } 88 } 89 } 90 91 98 private void processClass(Class <?> clazz, Container container) throws InstantiationException , IllegalAccessException 99 { 100 RemoteProxy createAnn = clazz.getAnnotation(RemoteProxy.class); 101 if (createAnn != null) 102 { 103 processCreate(clazz, createAnn, container); 104 } 105 106 DataTransferObject convertAnn = clazz.getAnnotation(DataTransferObject.class); 107 if (convertAnn != null) 108 { 109 processConvert(clazz, convertAnn, container); 110 } 111 112 GlobalFilter globalFilterAnn = clazz.getAnnotation(GlobalFilter.class); 113 if (globalFilterAnn != null) 114 { 115 processGlobalFilter(clazz, globalFilterAnn, container); 116 } 117 } 118 119 125 private void processCreate(Class <?> clazz, RemoteProxy createAnn, Container container) 126 { 127 Class <? extends Creator> creator = createAnn.creator(); 128 String creatorClass = creator.getName(); 129 Map <String , String > creatorParams = getParamsMap(createAnn.creatorParams()); 130 ScriptScope scope = createAnn.scope(); 131 132 CreatorManager creatorManager = (CreatorManager) container.getBean(CreatorManager.class.getName()); 133 String creatorName = LocalUtil.replace(creatorClass, ".", "_"); 134 creatorManager.addCreatorType(creatorName, creatorClass); 135 136 Map <String , String > params = new HashMap <String , String >(); 137 if (NewCreator.class.isAssignableFrom(creator)) 138 { 139 params.put("class", clazz.getName()); 140 } 141 params.putAll(creatorParams); 142 params.put("scope", scope.getValue()); 143 144 String name = createAnn.name(); 145 if (name == null || name.length() == 0) 146 { 147 name = LocalUtil.getShortClassName(clazz); 148 } 149 150 try 151 { 152 log.info("Adding class " + clazz.getName() + " as " + name); 153 creatorManager.addCreator(name, creatorName, params); 154 } 155 catch (Exception ex) 156 { 157 log.error("Failed to add class as Creator: " + clazz.getName(), ex); 158 } 159 160 AccessControl accessControl = (AccessControl) container.getBean(AccessControl.class.getName()); 161 Method [] methods = clazz.getMethods(); 162 for (int i = 0; i < methods.length; i++) 163 { 164 if (methods[i].getAnnotation(RemoteMethod.class) != null) 165 { 166 accessControl.addIncludeRule(name, methods[i].getName()); 167 168 Auth authAnn = methods[i].getAnnotation(Auth.class); 169 if (authAnn != null) 170 { 171 accessControl.addRoleRestriction(name, methods[i].getName(), authAnn.role()); 172 } 173 } 174 } 175 176 Filters filtersAnn = clazz.getAnnotation(Filters.class); 177 if (filtersAnn != null) 178 { 179 Filter[] fs = filtersAnn.value(); 180 for (int i = 0; i < fs.length; i++) 181 { 182 processFilter(fs[i], name, container); 183 } 184 } 185 else 187 { 188 Filter filterAnn = clazz.getAnnotation(Filter.class); 189 if (filterAnn != null) 190 { 191 processFilter(filterAnn, name, container); 192 } 193 } 194 } 195 196 202 private void processFilter(Filter filterAnn, String name, Container container) 203 { 204 Map <String , String > filterParams = getParamsMap(filterAnn.params()); 205 AjaxFilter filter = (AjaxFilter) LocalUtil.classNewInstance(name, filterAnn.type().getName(), AjaxFilter.class); 206 if (filter != null) 207 { 208 LocalUtil.setParams(filter, filterParams, null); 209 AjaxFilterManager filterManager = (AjaxFilterManager) container.getBean(AjaxFilterManager.class.getName()); 210 filterManager.addAjaxFilter(filter, name); 211 } 212 } 213 214 222 private void processConvert(Class <?> clazz, DataTransferObject convertAnn, Container container) throws InstantiationException , IllegalAccessException 223 { 224 Class <? extends Converter> converter = convertAnn.converter(); 225 String converterClass = converter.getName(); 226 Map <String , String > params = getParamsMap(convertAnn.params()); 227 228 ConverterManager converterManager = (ConverterManager) container.getBean(ConverterManager.class.getName()); 229 String converterName = LocalUtil.replace(converterClass, ".", "_"); 230 converterManager.addConverterType(converterName, converterClass); 231 232 if (BeanConverter.class.isAssignableFrom(converter)) 233 { 234 StringBuilder properties = new StringBuilder (); 235 Set <Field > fields = new HashSet <Field >(); 236 fields.addAll(Arrays.asList(clazz.getDeclaredFields())); 237 fields.addAll(Arrays.asList(clazz.getFields())); 238 for (Field field : fields) 239 { 240 if (field.getAnnotation(RemoteProperty.class) != null) 241 { 242 properties.append(',').append(field.getName()); 243 } 244 } 245 246 Method [] methods = clazz.getMethods(); 247 for (int i = 0; i < methods.length; i++) 248 { 249 if (methods[i].getAnnotation(RemoteProperty.class) != null) 250 { 251 String name = methods[i].getName(); 252 if (name.startsWith(METHOD_PREFIX_GET) || name.startsWith(METHOD_PREFIX_IS)) 253 { 254 if (name.startsWith(METHOD_PREFIX_GET)) 255 { 256 name = name.substring(3); 257 } 258 else 259 { 260 name = name.substring(2); 261 } 262 name = Introspector.decapitalize(name); 263 properties.append(',').append(name); 264 } 265 } 266 } 267 if (properties.length() > 0) 268 { 269 properties.deleteCharAt(0); 270 params.put("include", properties.toString()); 271 } 272 } 273 274 converterManager.addConverter(clazz.getName(), converterName, params); 275 } 276 277 285 private void processGlobalFilter(Class <?> clazz, GlobalFilter globalFilterAnn, Container container) throws InstantiationException , IllegalAccessException 286 { 287 if (!AjaxFilter.class.isAssignableFrom(clazz)) 288 { 289 throw new IllegalArgumentException (clazz.getName() + " is not an AjaxFilter implementation"); 290 } 291 292 Map <String , String > filterParams = getParamsMap(globalFilterAnn.params()); 293 AjaxFilter filter = (AjaxFilter) clazz.newInstance(); 294 if (filter != null) 295 { 296 LocalUtil.setParams(filter, filterParams, null); 297 AjaxFilterManager filterManager = (AjaxFilterManager) container.getBean(AjaxFilterManager.class.getName()); 298 filterManager.addAjaxFilter(filter); 299 } 300 } 301 302 308 private Map <String , String > getParamsMap(Param[] params) 309 { 310 Map <String , String > result = new HashMap <String , String >(); 311 if (params != null) 312 { 313 for (int i = 0; i < params.length; i++) 314 { 315 Param p = params[i]; 316 result.put(p.name(), p.value()); 317 } 318 } 319 return result; 320 } 321 322 325 private static final String METHOD_PREFIX_IS = "is"; 326 327 330 private static final String METHOD_PREFIX_GET = "get"; 331 332 335 private static final Logger log = Logger.getLogger(AnnotationsConfigurator.class); 336 } 337 | Popular Tags |