Package org.jboss.aop.microcontainer.integration

Source Code of org.jboss.aop.microcontainer.integration.AOPConstructorJoinpoint

/*     */ package org.jboss.aop.microcontainer.integration;
/*     */
/*     */ import java.lang.reflect.Constructor;
/*     */ import org.jboss.aop.Advisor;
/*     */ import org.jboss.aop.AspectManager;
/*     */ import org.jboss.aop.advice.Interceptor;
/*     */ import org.jboss.aop.joinpoint.ConstructorInvocation;
/*     */ import org.jboss.aop.microcontainer.beans.AspectManagerFactory;
/*     */ import org.jboss.aop.proxy.container.AOPProxyFactory;
/*     */ import org.jboss.aop.proxy.container.AOPProxyFactoryParameters;
/*     */ import org.jboss.aop.proxy.container.ContainerCache;
/*     */ import org.jboss.aop.proxy.container.GeneratedAOPProxyFactory;
/*     */ import org.jboss.joinpoint.plugins.BasicConstructorJoinPoint;
/*     */ import org.jboss.metadata.spi.MetaData;
/*     */ import org.jboss.metadata.spi.scope.CommonLevels;
/*     */ import org.jboss.metadata.spi.signature.MethodSignature;
/*     */ import org.jboss.metadata.spi.stack.MetaDataStack;
/*     */ import org.jboss.reflect.spi.ClassInfo;
/*     */ import org.jboss.reflect.spi.MethodInfo;
/*     */ import org.jboss.reflect.spi.TypeInfo;
/*     */
/*     */ public class AOPConstructorJoinpoint extends BasicConstructorJoinPoint
/*     */ {
/*  56 */   AOPProxyFactory proxyFactory = new GeneratedAOPProxyFactory();
/*     */
/*     */   public AOPConstructorJoinpoint(org.jboss.reflect.spi.ConstructorInfo constructorInfo)
/*     */   {
/*  65 */     super(constructorInfo);
/*     */   }
/*     */
/*     */   public Object dispatch() throws Throwable
/*     */   {
/*  70 */     Class clazz = this.constructorInfo.getDeclaringClass().getType();
/*  71 */     MetaData metaData = MetaDataStack.peek();
/*  72 */     AspectManager manager = AspectManagerFactory.getAspectManager(metaData);
/*     */
/*  74 */     MetaDataStack.mask();
/*     */     try
/*     */     {
/*  77 */       boolean hasInstanceMetaData = hasInstanceOrJoinpointMetaData(metaData);
/*  78 */       ContainerCache cache = ContainerCache.initialise(manager, clazz, metaData, hasInstanceMetaData);
/*  79 */       AOPProxyFactoryParameters params = new AOPProxyFactoryParameters();
/*  80 */       Object target = createTarget(cache, params);
/*  81 */       params.setProxiedClass(target.getClass());
/*  82 */       params.setMetaData(metaData);
/*  83 */       params.setTarget(target);
/*  84 */       params.setContainerCache(cache);
/*  85 */       params.setMetaDataHasInstanceLevelData(hasInstanceMetaData);
/*     */
/*  87 */       Object localObject1 = this.proxyFactory.createAdvisedProxy(params);
/*     */       return localObject1; } finally { MetaDataStack.unmask(); } throw localObject2;
/*     */   }
/*     */
/*     */   private boolean hasInstanceOrJoinpointMetaData(MetaData metaData)
/*     */   {
/*  97 */     if (metaData == null)
/*     */     {
/*  99 */       return false;
/*     */     }
/*     */
/* 102 */     MetaData instanceMetaData = metaData.getScopeMetaData(CommonLevels.INSTANCE);
/* 103 */     if ((instanceMetaData != null) && (!instanceMetaData.isEmpty()))
/*     */     {
/* 105 */       return true;
/*     */     }
/*     */
/* 108 */     return hasMethodMetaData(metaData);
/*     */   }
/*     */
/*     */   private boolean hasMethodMetaData(MetaData metaData)
/*     */   {
/* 114 */     ClassInfo info = this.constructorInfo.getDeclaringClass();
/* 115 */     while (info != null)
/*     */     {
/* 117 */       MethodInfo[] methods = info.getDeclaredMethods();
/* 118 */       if (methods != null)
/*     */       {
/* 120 */         for (MethodInfo mi : methods)
/*     */         {
/* 122 */           if (methodHasAnnotations(metaData, mi))
/*     */           {
/* 124 */             return true;
/*     */           }
/*     */         }
/*     */       }
/* 128 */       info = info.getSuperclass();
/*     */     }
/*     */
/* 131 */     return false;
/*     */   }
/*     */
/*     */   private boolean methodHasAnnotations(MetaData metaData, MethodInfo mi)
/*     */   {
/* 136 */     MethodSignature sig = new MethodSignature(mi);
/* 137 */     MetaData methodMD = metaData.getComponentMetaData(sig);
/* 138 */     if (methodMD != null)
/*     */     {
/* 140 */       return methodMD.getAnnotations() != MetaData.NO_ANNOTATIONS;
/*     */     }
/* 142 */     return false;
/*     */   }
/*     */
/*     */   private Object createTarget(ContainerCache cache, AOPProxyFactoryParameters params) throws Throwable
/*     */   {
/* 147 */     Advisor advisor = cache.getAdvisor();
/* 148 */     if (advisor != null)
/*     */     {
/* 150 */       org.jboss.aop.ConstructorInfo aopinfo = findAopConstructorInfo(advisor);
/*     */
/* 152 */       Interceptor[] interceptors = aopinfo != null ? aopinfo.getInterceptors() : null;
/*     */
/* 154 */       if (interceptors != null)
/*     */       {
/* 156 */         ConstructorInvocation inv = new ConstructorInvocation(aopinfo, aopinfo.getInterceptors());
/* 157 */         inv.setArguments(getArguments());
/* 158 */         return inv.invokeNext();
/*     */       }
/*     */
/* 161 */       if (getConstructorInfo().getParameterTypes().length > 0)
/*     */       {
/* 163 */         Constructor constructor = null;
/* 164 */         if (aopinfo == null)
/*     */         {
/* 167 */           Class clazz = advisor.getClazz();
/* 168 */           Constructor[] ctors = clazz.getConstructors();
/* 169 */           for (Constructor ctor : ctors)
/*     */           {
/* 171 */             if (!matchConstructor(ctor))
/*     */               continue;
/* 173 */             constructor = ctor;
/* 174 */             break;
/*     */           }
/*     */
/*     */         }
/*     */         else
/*     */         {
/* 180 */           constructor = aopinfo.getConstructor();
/*     */         }
/* 182 */         params.setCtor(constructor.getParameterTypes(), getArguments());
/*     */       }
/*     */     }
/*     */
/* 186 */     return super.dispatch();
/*     */   }
/*     */
/*     */   private org.jboss.aop.ConstructorInfo findAopConstructorInfo(Advisor advisor)
/*     */   {
/* 191 */     org.jboss.aop.ConstructorInfo[] infos = advisor.getConstructorInfos();
/* 192 */     for (int i = 0; i < infos.length; i++)
/*     */     {
/* 194 */       if (matchConstructor(infos[i].getConstructor()))
/*     */       {
/* 196 */         return infos[i];
/*     */       }
/*     */     }
/* 199 */     return null;
/*     */   }
/*     */
/*     */   private boolean matchConstructor(Constructor ctor)
/*     */   {
/* 204 */     TypeInfo[] params = this.constructorInfo.getParameterTypes();
/* 205 */     Class[] ctorParams = ctor.getParameterTypes();
/* 206 */     if (params.length == ctorParams.length)
/*     */     {
/* 208 */       boolean match = true;
/* 209 */       for (int p = 0; p < params.length; p++)
/*     */       {
/* 211 */         if (params[p].getName().equals(ctorParams[p].getName()))
/*     */           continue;
/* 213 */         match = false;
/* 214 */         break;
/*     */       }
/*     */
/* 218 */       if (match)
/*     */       {
/* 220 */         return true;
/*     */       }
/*     */     }
/* 223 */     return false;
/*     */   }
/*     */ }

/* Location:           /home/mnovotny/projects/EMBEDDED_JBOSS_BETA3_COMMUNITY/embedded/output/lib/embedded-jboss/lib/jboss-embedded-all.jar
* Qualified Name:     org.jboss.aop.microcontainer.integration.AOPConstructorJoinpoint
* JD-Core Version:    0.6.0
*/
TOP

Related Classes of org.jboss.aop.microcontainer.integration.AOPConstructorJoinpoint

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.