1 22 package org.jboss.aop; 23 24 import org.jboss.aop.advice.AdviceStack; 25 import org.jboss.aop.advice.AspectDefinition; 26 import org.jboss.aop.advice.Interceptor; 27 import org.jboss.aop.advice.InterceptorFactory; 28 import org.jboss.aop.advice.GeneratedAdvisorInterceptor; 29 import org.jboss.aop.joinpoint.Joinpoint; 30 import org.jboss.aop.metadata.SimpleMetaData; 31 32 import java.util.ArrayList ; 33 import java.util.Arrays ; 34 import java.util.Iterator ; 35 36 43 public class GeneratedInstanceAdvisorMixin implements InstanceAdvisor, java.io.Serializable 44 { 45 static final long serialVersionUID = -3057976129116723527L; 46 47 protected ArrayList insertedInterceptors = null; 48 protected ArrayList appendedInterceptors = null; 49 protected Object instance; 50 public boolean hasInstanceAspects = false; 51 private InterceptorChainObserver interceptorChainObserver; 52 InstanceAdvisorDelegate delegate; 53 54 public GeneratedInstanceAdvisorMixin() 55 { 56 } 57 58 public GeneratedInstanceAdvisorMixin(Object instance, GeneratedClassAdvisor genadvisor) 59 { 60 this.instance = instance; 61 delegate = new InstanceAdvisorDelegate(genadvisor, this); 62 delegate.initialize(); 63 this.interceptorChainObserver = ((ClassAdvisor) genadvisor).getInterceptorChainObserver(); 64 } 65 66 public boolean hasInterceptors() 67 { 68 return appendedInterceptors != null || insertedInterceptors != null; 69 } 70 71 public Object getPerInstanceAspect(String def) 72 { 73 return delegate.getPerInstanceAspect(def); 74 } 75 76 public Object getPerInstanceAspect(AspectDefinition def) 77 { 78 return delegate.getPerInstanceAspect(def); 79 } 80 81 public Object getPerInstanceJoinpointAspect(Joinpoint joinpoint, AspectDefinition def) 82 { 83 return delegate.getPerInstanceJoinpointAspect(joinpoint, def); 84 } 85 86 public SimpleMetaData getMetaData() 87 { 88 return delegate.getMetaData(); 89 } 90 91 public Interceptor[] getInterceptors() 92 { 93 ArrayList newlist = new ArrayList (); 94 if (insertedInterceptors != null) 95 { 96 for (Iterator it = insertedInterceptors.iterator() ; it.hasNext() ; ) 97 { 98 newlist.add(((GeneratedAdvisorInterceptor)it.next()).create(null, null)); 99 } 100 } 101 if (appendedInterceptors != null) 102 { 103 for (Iterator it = appendedInterceptors.iterator() ; it.hasNext() ; ) 104 { 105 newlist.add(((GeneratedAdvisorInterceptor)it.next()).create(null, null)); 106 } 107 } 108 return (Interceptor[]) newlist.toArray(new Interceptor[newlist.size()]); 109 } 110 111 114 public Interceptor[] getInterceptors(Interceptor[] advisorChain) 115 { 116 if (insertedInterceptors == null && appendedInterceptors == null) return advisorChain; 117 ArrayList newlist = new ArrayList (); 118 if (insertedInterceptors != null) 119 { 120 for (Iterator it = insertedInterceptors.iterator() ; it.hasNext() ; ) 121 { 122 newlist.add(((GeneratedAdvisorInterceptor)it.next()).create(null, null)); 123 } 124 } 125 if (advisorChain != null) 126 { 127 newlist.addAll(Arrays.asList(advisorChain)); 128 } 129 if (appendedInterceptors != null) 130 { 131 for (Iterator it = appendedInterceptors.iterator() ; it.hasNext() ; ) 132 { 133 newlist.add(((GeneratedAdvisorInterceptor)it.next()).create(null, null)); 134 } 135 } 136 return (Interceptor[]) newlist.toArray(new Interceptor[newlist.size()]); 137 } 138 139 public GeneratedAdvisorInterceptor[] getWrappers() 140 { 141 ArrayList newlist = new ArrayList (); 142 if (insertedInterceptors != null) newlist.addAll(insertedInterceptors); 143 if (appendedInterceptors != null) newlist.addAll(appendedInterceptors); 144 return (GeneratedAdvisorInterceptor[]) newlist.toArray(new GeneratedAdvisorInterceptor[newlist.size()]); 145 } 146 147 152 public Interceptor[] getWrappers(Interceptor[] advisorChain) 153 { 154 if (insertedInterceptors == null && appendedInterceptors == null) return advisorChain; 155 ArrayList newlist = new ArrayList (); 156 if (insertedInterceptors != null) newlist.addAll(insertedInterceptors); 157 if (advisorChain != null) 158 { 159 newlist.addAll(Arrays.asList(advisorChain)); 160 } 161 if (appendedInterceptors != null) newlist.addAll(appendedInterceptors); 162 return (GeneratedAdvisorInterceptor[]) newlist.toArray(new GeneratedAdvisorInterceptor[newlist.size()]); 163 } 164 165 public void insertInterceptor(int index, Interceptor interceptor) 166 { 167 ArrayList newList = new ArrayList (); 168 if (insertedInterceptors != null) 169 { 170 newList.addAll(insertedInterceptors); 171 } 172 newList.add(index, createWrapper(interceptor)); 173 insertedInterceptors = newList; 174 hasInstanceAspects = true; 175 if (interceptorChainObserver != null) 176 { 177 interceptorChainObserver.instanceInterceptorAdded(this); 178 } 179 } 180 181 public void insertInterceptor(Interceptor interceptor) 182 { 183 ArrayList newList = new ArrayList (); 184 if (insertedInterceptors != null) 185 { 186 newList.addAll(insertedInterceptors); 187 } 188 newList.add(createWrapper(interceptor)); 189 insertedInterceptors = newList; 190 hasInstanceAspects = true; 191 if (interceptorChainObserver != null) 192 { 193 interceptorChainObserver.instanceInterceptorAdded(this); 194 } 195 } 196 197 public void appendInterceptor(Interceptor interceptor) 198 { 199 ArrayList newList = new ArrayList (); 200 if (appendedInterceptors != null) 201 { 202 newList.addAll(appendedInterceptors); 203 } 204 newList.add(createWrapper(interceptor)); 205 appendedInterceptors = newList; 206 hasInstanceAspects = true; 207 if (interceptorChainObserver != null) 208 { 209 interceptorChainObserver.instanceInterceptorAdded(this); 210 } 211 } 212 213 public void appendInterceptor(int index, Interceptor interceptor) 214 { 215 ArrayList newList = new ArrayList (); 216 if (appendedInterceptors != null) 217 { 218 newList.addAll(appendedInterceptors); 219 } 220 newList.add(index, createWrapper(interceptor)); 221 appendedInterceptors = newList; 222 hasInstanceAspects = true; 223 if (interceptorChainObserver != null) 224 { 225 interceptorChainObserver.instanceInterceptorAdded(this); 226 } 227 } 228 229 232 public void removeInterceptor(String name) 233 { 234 int interceptorsRemoved = internalRemoveInterceptor(name); 235 if (interceptorChainObserver != null) 236 { 237 interceptorChainObserver.instanceInterceptorsRemoved(this, interceptorsRemoved); 238 } 239 } 240 241 245 private int internalRemoveInterceptor(String name) 246 { 247 int interceptorsRemoved = 0; 248 if (insertedInterceptors != null) 249 { 250 for (int i = 0; i < insertedInterceptors.size(); i++) 251 { 252 GeneratedAdvisorInterceptor interceptor = (GeneratedAdvisorInterceptor) insertedInterceptors.get(i); 253 if (interceptor.getName().equals(name)) 254 { 255 ArrayList newList = new ArrayList (); 256 newList.addAll(insertedInterceptors); 257 newList.remove(i); 258 insertedInterceptors = newList; 259 interceptorsRemoved ++; 260 } 261 } 262 } 263 if (appendedInterceptors != null) 264 { 265 for (int i = 0; i < appendedInterceptors.size(); i++) 266 { 267 GeneratedAdvisorInterceptor interceptor = (GeneratedAdvisorInterceptor) appendedInterceptors.get(i); 268 if (interceptor.getName().equals(name)) 269 { 270 ArrayList newList = new ArrayList (); 271 newList.addAll(appendedInterceptors); 272 newList.remove(i); 273 appendedInterceptors = newList; 274 interceptorsRemoved ++; 275 } 276 } 277 } 278 hasInstanceAspects = ((insertedInterceptors != null && insertedInterceptors.size() > 0) 279 || (appendedInterceptors != null && appendedInterceptors.size() > 0)); 280 return interceptorsRemoved; 281 } 282 283 public final boolean hasAspects() 284 { 285 return hasInstanceAspects; 286 } 287 288 public void insertInterceptorStack(String stackName) 289 { 290 AdviceStack stack = AspectManager.instance().getAdviceStack(stackName); 291 if (stack == null) throw new RuntimeException ("Stack " + stackName + " not found."); 292 293 ClassAdvisor classAdvisor = null; 294 if (instance instanceof Advised) 295 { 296 Advised advised = (Advised) instance; 297 classAdvisor = ((ClassAdvisor) advised._getAdvisor()); 298 } 299 int interceptorsAdded = 0; 300 Iterator it = stack.getInterceptorFactories().iterator(); 301 while (it.hasNext()) 302 { 303 InterceptorFactory factory = (InterceptorFactory) it.next(); 304 if (!factory.isDeployed()) continue; 305 Interceptor interceptor = factory.create(classAdvisor, null); 306 insertInterceptor(interceptor); 307 interceptorsAdded ++; 308 } 309 if (interceptorChainObserver != null) 310 { 311 this.interceptorChainObserver.instanceInterceptorsAdded(this, interceptorsAdded); 312 } 313 } 314 315 public void appendInterceptorStack(String stackName) 316 { 317 AdviceStack stack = AspectManager.instance().getAdviceStack(stackName); 318 if (stack == null) throw new RuntimeException ("Stack " + stackName + " not found."); 319 320 ClassAdvisor classAdvisor = null; 321 if (instance instanceof Advised) 322 { 323 Advised advised = (Advised) instance; 324 classAdvisor = ((ClassAdvisor) advised._getAdvisor()); 325 } 326 int interceptorsAdded = 0; 327 Iterator it = stack.getInterceptorFactories().iterator(); 328 while (it.hasNext()) 329 { 330 InterceptorFactory factory = (InterceptorFactory) it.next(); 331 if (!factory.isDeployed()) continue; 332 Interceptor interceptor = factory.create(classAdvisor, null); 333 appendInterceptor(interceptor); 334 interceptorsAdded ++; 335 } 336 if (interceptorChainObserver != null) 337 { 338 this.interceptorChainObserver.instanceInterceptorsAdded(this, interceptorsAdded); 339 } 340 } 341 342 public void removeInterceptorStack(String stackName) 343 { 344 AdviceStack stack = AspectManager.instance().getAdviceStack(stackName); 345 if (stack == null) throw new RuntimeException ("Stack " + stackName + " not found."); 346 347 ClassAdvisor classAdvisor = null; 348 if (instance instanceof Advised) 349 { 350 Advised advised = (Advised) instance; 351 classAdvisor = ((ClassAdvisor) advised._getAdvisor()); 352 } 353 int interceptorsRemoved = 0; 354 Iterator it = stack.getInterceptorFactories().iterator(); 355 while (it.hasNext()) 356 { 357 InterceptorFactory factory = (InterceptorFactory) it.next(); 358 if (!factory.isDeployed()) continue; 359 Interceptor interceptor = factory.create(classAdvisor, null); 360 interceptorsRemoved += internalRemoveInterceptor(interceptor.getName()); 361 } 362 if (interceptorChainObserver != null) 363 { 364 this.interceptorChainObserver.instanceInterceptorsRemoved(this, interceptorsRemoved); 365 } 366 } 367 368 public Domain getDomain() 369 { 370 throw new RuntimeException ("Should be handled by generated advisors"); 371 } 372 373 376 protected void finalize() 377 { 378 ClassLoader classLoader = delegate.getAdvisor().getClazz().getClassLoader(); 379 if (this.interceptorChainObserver == null || !delegate.getAdvisor().getManager().getRegisteredCLs().containsKey(classLoader)) 380 { 381 return; 382 } 383 this.interceptorChainObserver.allInstanceInterceptorsRemoved(this); 384 } 385 386 private GeneratedAdvisorInterceptor createWrapper(Interceptor interceptor) 387 { 388 return new GeneratedAdvisorInterceptor(new InstanceInterceptorFactory(interceptor), null, null); 389 } 390 391 public class InstanceInterceptorFactory implements InterceptorFactory 392 { 393 private Interceptor interceptor; 394 395 private InstanceInterceptorFactory(Interceptor interceptor) 396 { 397 this.interceptor = interceptor; 398 } 399 400 public Interceptor create(Advisor advisor, Joinpoint joinpoint) 401 { 402 return interceptor; 403 } 404 405 public String getClassName() 406 { 407 return interceptor.getClass().getName(); 408 } 409 410 public String getAdvice() 411 { 412 return "invoke"; 413 } 414 415 public AspectDefinition getAspect() 416 { 417 return null; 418 } 419 420 public String getName() 421 { 422 return interceptor.getName(); 423 } 424 425 public boolean isDeployed() 426 { 427 return true; 428 } 429 430 431 } 432 } | Popular Tags |