]> source.dussan.org Git - aspectj.git/commitdiff
merge of changes from 1.5.0 branch into HEAD
authoracolyer <acolyer>
Mon, 19 Dec 2005 12:22:26 +0000 (12:22 +0000)
committeracolyer <acolyer>
Mon, 19 Dec 2005 12:22:26 +0000 (12:22 +0000)
14 files changed:
aspectj5rt/java5-src/org/aspectj/internal/lang/reflect/AjTypeImpl.java
aspectj5rt/java5-src/org/aspectj/lang/annotation/DeclareParents.java
docs/devGuideDB/ajc.xml
docs/devGuideDB/antsupport.xml
lib/aspectj/lib/aspectjrt.jar
lib/test/aspectjrt.jar
tests/bugs150/pr121197.aj [new file with mode: 0644]
tests/java5/ataspectj/annotationGen/ITDTest.aj
tests/java5/reflection/AtAspectJDeclareParents.aj
tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java
tests/src/org/aspectj/systemtest/ajc150/ajc150.xml
weaver/src/org/aspectj/weaver/AjAttribute.java
weaver/src/org/aspectj/weaver/bcel/AtAjAttributes.java
weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java

index 482ccebb9a91ff9bb62c66a4c85419a69e98be9b..99f1e66ab593f6de78ab88d63ab37eacbb2c51d3 100644 (file)
@@ -661,8 +661,10 @@ public class AjTypeImpl<T> implements AjType<T> {
                if (isAspect()) {
             for (Field f : clazz.getDeclaredFields()) {
                 if (!f.getType().isInterface()) continue;
-                if (!Modifier.isPublic(f.getModifiers()) || !Modifier.isStatic(f.getModifiers())) continue;
-                if (f.isAnnotationPresent(org.aspectj.lang.annotation.DeclareParents.class)) {                  
+                if (f.isAnnotationPresent(org.aspectj.lang.annotation.DeclareParents.class)) {
+                       Class<org.aspectj.lang.annotation.DeclareParents> decPAnnClass = org.aspectj.lang.annotation.DeclareParents.class;
+                       org.aspectj.lang.annotation.DeclareParents decPAnn = f.getAnnotation(decPAnnClass);
+                           if (decPAnn.defaultImpl() == decPAnnClass) continue; // doesn't contribute members...
                     for (Method itdM : f.getType().getDeclaredMethods()) {
                         if (!Modifier.isPublic(itdM.getModifiers()) && publicOnly) continue;
                         InterTypeMethodDeclaration itdm = new InterTypeMethodDeclarationImpl(
@@ -951,21 +953,7 @@ public class AjTypeImpl<T> implements AjType<T> {
        
        private void addAnnotationStyleDeclareParents(List<DeclareParents> toList) {
         for (Field f : clazz.getDeclaredFields()) {
-            if (f.isAnnotationPresent(org.aspectj.lang.annotation.DeclareImplements.class)) {
-                if (!f.getType().isInterface()) continue;
-                org.aspectj.lang.annotation.DeclareImplements ann = f.getAnnotation(org.aspectj.lang.annotation.DeclareImplements.class);
-                String parentType = f.getType().getName();
-                DeclareParentsImpl decp = new DeclareParentsImpl(
-                        ann.value(),
-                        parentType,
-                        false,
-                        this
-                );
-                toList.add(decp);
-            }
-            if (f.isAnnotationPresent(org.aspectj.lang.annotation.DeclareParents.class)
-                && Modifier.isStatic(f.getModifiers())
-                && Modifier.isPublic(f.getModifiers())) {
+            if (f.isAnnotationPresent(org.aspectj.lang.annotation.DeclareParents.class)) {
                 if (!f.getType().isInterface()) continue;
                 org.aspectj.lang.annotation.DeclareParents ann = f.getAnnotation(org.aspectj.lang.annotation.DeclareParents.class);
                 String parentType = f.getType().getName();
index e26e8c778d7f29a8a32fb9b5e3725c245067bcb5..fe7267849153e1dd38209822ea64f5763b908d6d 100644 (file)
@@ -28,4 +28,14 @@ public @interface DeclareParents {
      */
     String value();
     
+    /**
+     * Optional class defining default implementation
+     * of interface members (equivalent to defining
+     * a set of interface member ITDs for the
+     * public methods of the interface).
+     */
+    Class defaultImpl() default DeclareParents.class;
+    
+    // note - a default of "null" is not allowed,
+    // hence the strange default given above.
 }
index 135d8278f816f257d2df8460f34a399d85ff66f6..0aa7bae9380dd6fbe6456e7a2902755256127dd0 100644 (file)
     (Experimental) Create class files that can't be subsequently rewoven by AspectJ.
         </para></listitem>
       </varlistentry>
+      <!-- not documenting this feature yet -->
+      <!--
       <varlistentry>
         <term>-XhasMember</term>
         <listitem><para>
             (Experimental) Allow hasmethod() and hasfield type patterns in declare parents and declare @type.
         </para></listitem>
       </varlistentry>
+      -->
       <varlistentry>
         <term>-Xajruntimelevel:1.2, ajruntimelevel:1.5</term>
         <listitem><para>
index 00fef52492f13bd6bf7d783dac54087a9f4bec64..a21268ad0d072d1313c0e5dfe4382015709529f5 100644 (file)
                     own entries.  The other permitted ones (currently) are
                     serializableAspects, incrementalFile, lazyTjp,
                        reweavable, notReweavable, noInline,
-               noWeave,hasMember,
+               noWeave,
                 ajruntimelevel:1.2, and ajruntimelevel:1.5.
                 Of these, some were deprecated in AspectJ 5
                     (reweavable, noWeave, etc.).
index f8d847b2f58d4edb8c610a22dcd0a7bdc8baaf75..297c989ac84ee928985f3b1cd9eca171ebef2182 100644 (file)
Binary files a/lib/aspectj/lib/aspectjrt.jar and b/lib/aspectj/lib/aspectjrt.jar differ
index f8d847b2f58d4edb8c610a22dcd0a7bdc8baaf75..297c989ac84ee928985f3b1cd9eca171ebef2182 100644 (file)
Binary files a/lib/test/aspectjrt.jar and b/lib/test/aspectjrt.jar differ
diff --git a/tests/bugs150/pr121197.aj b/tests/bugs150/pr121197.aj
new file mode 100644 (file)
index 0000000..29fed9c
--- /dev/null
@@ -0,0 +1,57 @@
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+
+@Aspect( "perthis( readOperations() || writeOperations() )" )
+public abstract class pr121197 {
+       @Pointcut( "" )
+    protected abstract void readOperations();
+    
+    @Pointcut( "" )
+    protected abstract void writeOperations();
+    
+    private ReadWriteLock _lock = new ReentrantReadWriteLock();
+    
+    @Before( "readOperations()" )
+    public void beforeReading() {
+        _lock.readLock().lock();
+    }
+
+    @After( "readOperations()" )
+    public void afterReading() {
+        _lock.readLock().unlock();
+    }
+    
+    @Before( "writeOperations()" )
+    public void beforeWriting() {
+        _lock.writeLock().lock();
+    }
+
+    @After( "writeOperations()" )
+    public void afterWriting() {
+        _lock.writeLock().unlock();
+    }
+
+}
+
+@Aspect
+class ModelThreadSafety extends pr121197 {
+    @Pointcut( "execution( * C.read*(..) )" )
+    @Override
+    protected void readOperations() {}
+
+    @Pointcut( "execution( * C.write*(..) )" )
+    @Override
+    protected void writeOperations() { }
+}
+
+class C {
+       
+       public void readSomething() {}
+       public void writeSomething() {}
+       
+}
index dc8089f702b9b6db4d3c3452d2d4947931c02654..46e7feed5a27944ff2c32094801974ff613ebdee 100644 (file)
@@ -186,7 +186,7 @@ class A {}
 @Aspect
 class X {
        
-       @org.aspectj.lang.annotation.DeclareParents("org.xyz..*")
+       @org.aspectj.lang.annotation.DeclareParents(value="org.xyz..*",defaultImpl=Mixin.class)
        public static I myMixin = new Mixin();
 
 
index d60f6a3c65109c988882e75ba610e38f3d0930d2..fddf12a56bd03dead5171c1bc20b9a41a8bb000e 100644 (file)
@@ -2,8 +2,8 @@ import org.aspectj.lang.annotation.*;
 
 public aspect AtAspectJDeclareParents {
        
-       @DeclareParents("C")
-       public static I mixin = new Impl();
+       @DeclareParents(value="C",defaultImpl=Impl.class)
+       private I implementedInterface;
        
 }
 
index cf89ee0ca48f7a4d96a8ca574956418606f19060..4d575a58e3f3beb88c489f514e7962b9d4bdde16 100644 (file)
@@ -859,6 +859,10 @@ public class Ajc150Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
          runTest("modifier overrides");
   }
   
+  public void testAbstractPerThisInAtAspectJ() {
+         runTest("abstract perthis in @AspectJ");
+  }
+  
   // helper methods.....
   
   public SyntheticRepository createRepos(File cpentry) {
index ab876223d718bf085ff1eba6b58d0efe506c9a4e..f33b01ff6731035ef21ec9ffbdafcb4b4ffe2189 100644 (file)
@@ -2,6 +2,12 @@
 
 <!-- AspectJ v1.5.0 Tests -->
 <suite>
+
+    <ajc-test dir="bugs150" title="abstract perthis in @AspectJ">
+        <compile files="pr121197.aj" options="-1.5"/>
+    </ajc-test>
+
+
     <ajc-test dir="bugs150" title="access to private ITD from nested type">
         <compile files="pr118698.aj"/>
         <run class="pr118698"/>
index e3a4c2457ea3fa5e61573cf2bf965cb2e3e07ab4..56e8a94ad88e1d893cc3176ab206644bec2b8236 100644 (file)
@@ -24,6 +24,7 @@ import org.aspectj.bridge.MessageUtil;
 import org.aspectj.bridge.Version;
 import org.aspectj.util.FileUtil;
 import org.aspectj.weaver.patterns.Declare;
+import org.aspectj.weaver.patterns.IScope;
 import org.aspectj.weaver.patterns.PerClause;
 import org.aspectj.weaver.patterns.Pointcut;
 
@@ -559,6 +560,7 @@ public abstract class AjAttribute {
                        return AttributeName;
                }               
                private PerClause perClause;
+               private IScope resolutionScope;
 
                public Aspect(PerClause perClause) {
                        this.perClause = perClause;
@@ -568,10 +570,19 @@ public abstract class AjAttribute {
                //XXXperClause.concretize(inAspect);
                return perClause;
            }
+           
+           public PerClause reifyFromAtAspectJ(ResolvedType inAspect) {
+             perClause.resolve(resolutionScope);
+             return perClause;
+           }
                
                public void write(DataOutputStream s) throws IOException {
                        perClause.write(s);
                }
+
+               public void setResolutionScope(IScope binding) {
+                       this.resolutionScope = binding;
+               }
        }
        
        public static class PrivilegedAttribute extends AjAttribute {
index a488376a29a7f5ca36d0d6c619a8da96ec1d4e61..e07f44c422c29ade0afd2954fb5a5fb644472ab1 100644 (file)
@@ -338,6 +338,7 @@ public class AtAjAttributes {
             }
             struct.ajAttributes.addAll(fstruct.ajAttributes);
         }
+        
         return struct.ajAttributes;
     }
 
@@ -462,7 +463,8 @@ public class AtAjAttributes {
         // Note: field annotation are for ITD and DEOW - processed at class level directly
         return Collections.EMPTY_LIST;
     }
-
+    
+    
     /**
      * Read @Aspect
      *
@@ -507,7 +509,8 @@ public class AtAjAttributes {
                 perClause.setLocation(struct.context, struct.context.getOffset(), struct.context.getOffset()+1);//FIXME AVASM
                 // FIXME asc see related comment way about about the version...
                 struct.ajAttributes.add(new AjAttribute.WeaverVersionInfo());
-                struct.ajAttributes.add(new AjAttribute.Aspect(perClause));
+                AjAttribute.Aspect aspectAttribute = new AjAttribute.Aspect(perClause);
+                struct.ajAttributes.add(aspectAttribute);
                 FormalBinding[] bindings = new org.aspectj.weaver.patterns.FormalBinding[0];
                 final IScope binding;
                 binding = new BindingScope(
@@ -515,7 +518,14 @@ public class AtAjAttributes {
                             struct.context,
                             bindings
                         );
-                perClause.resolve(binding);
+                
+//                // we can't resolve here since the perclause typically refers to pointcuts
+//                // defined in the aspect that we haven't told the BcelObjectType about yet.
+//                
+//                perClause.resolve(binding);
+                
+                // so we prepare to do it later...
+                aspectAttribute.setResolutionScope(binding);
                 return true;
             }
         }
@@ -531,25 +541,25 @@ public class AtAjAttributes {
      */
     private static PerClause parsePerClausePointcut(String perClauseString, AjAttributeStruct struct) {
         final String pointcutString;
-        Pointcut poincut = null;
+        Pointcut pointcut = null;
         TypePattern typePattern = null;
         final PerClause perClause;
         if (perClauseString.startsWith(PerClause.KindAnnotationPrefix.PERCFLOW.getName())) {
             pointcutString = PerClause.KindAnnotationPrefix.PERCFLOW.extractPointcut(perClauseString);
-            poincut = parsePointcut(pointcutString, struct, false);
-            perClause = new PerCflow(poincut, false);
+            pointcut = parsePointcut(pointcutString, struct, false);
+            perClause = new PerCflow(pointcut, false);
         } else if (perClauseString.startsWith(PerClause.KindAnnotationPrefix.PERCFLOWBELOW.getName())) {
             pointcutString = PerClause.KindAnnotationPrefix.PERCFLOWBELOW.extractPointcut(perClauseString);
-            poincut = parsePointcut(pointcutString, struct, false);
-            perClause = new PerCflow(poincut, true);
+            pointcut = parsePointcut(pointcutString, struct, false);
+            perClause = new PerCflow(pointcut, true);
         } else if (perClauseString.startsWith(PerClause.KindAnnotationPrefix.PERTARGET.getName())) {
             pointcutString = PerClause.KindAnnotationPrefix.PERTARGET.extractPointcut(perClauseString);
-            poincut = parsePointcut(pointcutString, struct, false);
-            perClause = new PerObject(poincut, false);
+            pointcut = parsePointcut(pointcutString, struct, false);
+            perClause = new PerObject(pointcut, false);
         } else if (perClauseString.startsWith(PerClause.KindAnnotationPrefix.PERTHIS.getName())) {
             pointcutString = PerClause.KindAnnotationPrefix.PERTHIS.extractPointcut(perClauseString);
-            poincut = parsePointcut(pointcutString, struct, false);
-            perClause = new PerObject(poincut, true);
+            pointcut = parsePointcut(pointcutString, struct, false);
+            perClause = new PerObject(pointcut, true);
         } else if (perClauseString.startsWith(PerClause.KindAnnotationPrefix.PERTYPEWITHIN.getName())) {
             pointcutString = PerClause.KindAnnotationPrefix.PERTYPEWITHIN.extractPointcut(perClauseString);
             typePattern = parseTypePattern(pointcutString, struct);
@@ -564,7 +574,7 @@ public class AtAjAttributes {
 
         if (!PerClause.SINGLETON.equals(perClause.getKind())
                 && !PerClause.PERTYPEWITHIN.equals(perClause.getKind())
-                && poincut == null) {
+                && pointcut == null) {
             // we could not parse the pointcut
             return null;
         }
index 59dcea1104f4e154f7a0b74aa52dde664a8a5b75..8ee6ab6384bbb75c461fc365d6fb89d09c350167 100644 (file)
@@ -273,20 +273,31 @@ public class BcelObjectType extends AbstractReferenceTypeDelegate {
         List l = BcelAttributes.readAjAttributes(javaClass.getClassName(),javaClass.getAttributes(), getResolvedTypeX().getSourceContext(),getResolvedTypeX().getWorld().getMessageHandler(),AjAttribute.WeaverVersionInfo.UNKNOWN);
                processAttributes(l,pointcuts,false);
                l = AtAjAttributes.readAj5ClassAttributes(javaClass, getResolvedTypeX(), getResolvedTypeX().getSourceContext(), getResolvedTypeX().getWorld().getMessageHandler(),isCodeStyleAspect);
-               processAttributes(l,pointcuts,true);
+               AjAttribute.Aspect deferredAspectAttribute = processAttributes(l,pointcuts,true);
                
                this.pointcuts = (ResolvedPointcutDefinition[]) 
                        pointcuts.toArray(new ResolvedPointcutDefinition[pointcuts.size()]);
+
+               if (deferredAspectAttribute != null) {
+                       // we can finally process the aspect and its associated perclause...
+                       perClause = deferredAspectAttribute.reifyFromAtAspectJ(this.getResolvedTypeX());
+               }
+
        }
 
 
-    private void processAttributes(List attributeList, List pointcuts, boolean fromAnnotations) {
+    private AjAttribute.Aspect processAttributes(List attributeList, List pointcuts, boolean fromAnnotations) {
+       AjAttribute.Aspect deferredAspectAttribute = null;
                for (Iterator iter = attributeList.iterator(); iter.hasNext();) {
                        AjAttribute a = (AjAttribute) iter.next();
                        //System.err.println("unpacking: " + this + " and " + a);
                        if (a instanceof AjAttribute.Aspect) {
-                               perClause = ((AjAttribute.Aspect)a).reify(this.getResolvedTypeX());
-                               if (!fromAnnotations) isCodeStyleAspect = true;
+                               if (fromAnnotations) {
+                                       deferredAspectAttribute = (AjAttribute.Aspect) a;
+                               } else {
+                                       perClause = ((AjAttribute.Aspect)a).reify(this.getResolvedTypeX());
+                                       isCodeStyleAspect = true;
+                               }
                        } else if (a instanceof AjAttribute.PointcutDeclarationAttribute) {
                                pointcuts.add(((AjAttribute.PointcutDeclarationAttribute)a).reify());
                        } else if (a instanceof AjAttribute.WeaverState) {
@@ -307,6 +318,7 @@ public class BcelObjectType extends AbstractReferenceTypeDelegate {
                                throw new BCException("bad attribute " + a);
                        }
                }
+               return deferredAspectAttribute;
        }
 
        public PerClause getPerClause() {