• Fixed a potential bug in RuntimeAttributeRepository - the seal() method and the checkSealed() method weren't synchronized properly.


  • Added support for attribute packages (Issue ATTRIBUTES-4):

    When the ant:attribute-compiler is used in ant, there is no way for maven to pass a value for the attributepackages property.

    It would be nice if it were possible to add a property in the project.properties of the current project that specifies the attributepackages. E.g.


    which is then used in the maven plugin:

    <ant:attribute-compiler inMaven="true" sourcepathref="maven.compile.src.set"

    And that is exactly what was implemented.


  • BUG: Checks for Target specifications would go unnoticed for attributes attached to fields, methods and constructors. The following code would not result in an InvalidAttributeTargetError. The bug is fixed in current CVS.

     * @@Target(Target.METHOD) 
    public class AttributeWithTargetMethod {}
    public class FieldAttributes1 {
         * @@AttributeWithTargetMethod() 
        private Object o;


  • Ported the code to qDox. XJavadoc had an annoying bug where it would silently rewrite the value of a JavaDoc tag, making the resulting expression unparseable by the attribute compiler.


  • CircularDependencyError now expects a list of Class instances instead of a list of any object type. The old behavior is still supported and will remain so.

  • CircularDependencyError now shows the full circle of dependencies.

  • Added a ParameterIndexOutOfBoundsException to be thrown when the client tries to retrieve attributes from a parameter of a constructor or method and the parameter index is out of bounds.

  • Added a SealedAttributeException to be thrown when an attempt to modify a sealed attribute is made. The exception is a subclass of the IllegalStateException that used to be thrown.


  • Added

    to applicable Throwables, making them compliant with the standard Java2 1.4 nested throwable spec.

  • CVS version number is now 2.2.


  • Made the Maven plugin only run the attribute compiler if a project property named org.apache.commons.attributes.enabled was set to 'true'. Likewise, the attribute indexer will only run if a project property named org.apache.commons.attributes.index.enabled is set to 'true'. This to keep these two tasks to be run on every single project being built.

  • Created a Maven demo.


  • BUG: Fixed bug in the compiler that made it impossible to add attributes to a method that took a parameter whose type was an inner class. The bug would manifest itself thus:

    public class Outer {
        public static class Inner {}
         * @@SomeAttribute()
        public void method (Inner inner) {}
    Method method = 
            new Class[]{ Outer.Inner.class });
    Collection methodAttributes = 
        Attributes.getAttributes (method);
    // Prints 0, not 1
    System.out.println (methodAttributes.size ()); 

    The bug is fixed in current CVS.

  • Bumped version number to 2.1. The rationale for this is as follows: Many people had told me that a 2.0 release was required in order for them to get on with their own releases that could only depend on released versions of libraries. Since I could not move Attributes through the promotion and release process fast enough, and since the existing code appeared to work for people, I recommended that the jars simply be renamed from -2.0alpha to -2.0. After all, it was my intent to release the current CVS unchanged as 2.0. Then the bug above popped up and something had to be done. If I release the fixed version as 2.0, we have two "versions" of 2.0 - the one with the bug and the one without - clearly an undesirable state. Therefore the version number went from 2.0alpha to 2.1alpha.


  • Added a Taglet for Javadoc 1.4 and later.

  • Added a the attribute-validator task.


  • Fixed bug where attributes would be inherited from private methods. Since the methods themselves aren't inherited, the attributes shouldn't be either.


  • Changed the way AttributeIndexes are implemented. Previously, any attributes that were both Indexed and Inheritable would not work as expected - the index would not find the class that had inherited the indexed attribute, only the class declaring it.