directory-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From akaras...@apache.org
Subject svn commit: r559292 - in /directory/sandbox/akarasulu/j2l/trunk/runtime/src: main/java/org/apache/directory/j2l/configuration/ main/java/org/apache/directory/j2l/descriptions/ main/resources/ test/java/org/apache/directory/j2l/annotations/ test/java/or...
Date Wed, 25 Jul 2007 02:45:24 GMT
Author: akarasulu
Date: Tue Jul 24 19:45:22 2007
New Revision: 559292

URL: http://svn.apache.org/viewvc?view=rev&rev=559292
Log:
added more code and finally got the extractor working properly but this stuff is pretty much
junk and needs better organization

Added:
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/resources/log4j.properties
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/TestBeanNoAnnotations.java
      - copied, changed from r558576, directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/TestBean.java
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/descriptions/
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/descriptions/AttributeTypeExtractorTest.java
  (with props)
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/resources/
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/resources/log4j.properties
Removed:
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/TestBean.java
Modified:
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/configuration/J2LConfiguration.java
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/configuration/PrimitiveMappingRegistry.java
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/descriptions/AttributeToPropertyMapping.java
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/descriptions/AttributeTypeExtractor.java
    directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/AnnotationTest.java

Modified: directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/configuration/J2LConfiguration.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/configuration/J2LConfiguration.java?view=diff&rev=559292&r1=559291&r2=559292
==============================================================================
--- directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/configuration/J2LConfiguration.java
(original)
+++ directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/configuration/J2LConfiguration.java
Tue Jul 24 19:45:22 2007
@@ -19,6 +19,9 @@
  */
 package org.apache.directory.j2l.configuration;
 
+import java.util.Set;
+import java.util.HashSet;
+
 /**
  * Document me!
  *
@@ -43,12 +46,17 @@
     /**
      * Configuration information about the schema to generate.
      */
-    private SchemaConfiguration schemaConfiguration;
+    private SchemaConfiguration schemaConfiguration = new SchemaConfiguration();
 
     /**
      * Used to lookup default syntax and matchingRule mappings for Java primitive types.
      */
-    private PrimitiveMappingRegistry primitiveMappingRegistry;
+    private PrimitiveMappingRegistry primitiveMappingRegistry = new PrimitiveMappingRegistry();
+
+    /**
+     * A set of bean property names to ignore.
+     */
+    private Set<String> ignoredProperties = new HashSet<String>();
 
     /**
      * If true will generate an OpenLDAP compatible schema file using the
@@ -93,6 +101,18 @@
      */
     private boolean generateModifierObjects = false;
 
+
+    public J2LConfiguration()
+    {
+        ignoredProperties.add( "class" );
+    }
+
+
+    public boolean isPropertyIgnored( String propertyName )
+    {
+        return ignoredProperties.contains( propertyName );
+    }
+    
     
     public String getTargetPackage()
     {
@@ -221,5 +241,15 @@
     public void setPrimitiveMappingRegistry( PrimitiveMappingRegistry primitiveMappingRegistry
)
     {
         this.primitiveMappingRegistry = primitiveMappingRegistry;
+    }
+
+    public Set<String> getIgnoredProperties()
+    {
+        return ignoredProperties;
+    }
+
+    public void setIgnoredProperties( Set<String> ignoredProperties )
+    {
+        this.ignoredProperties = ignoredProperties;
     }
 }

Modified: directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/configuration/PrimitiveMappingRegistry.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/configuration/PrimitiveMappingRegistry.java?view=diff&rev=559292&r1=559291&r2=559292
==============================================================================
--- directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/configuration/PrimitiveMappingRegistry.java
(original)
+++ directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/configuration/PrimitiveMappingRegistry.java
Tue Jul 24 19:45:22 2007
@@ -21,6 +21,8 @@
 
 
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Map;
 import java.util.HashMap;
@@ -106,6 +108,7 @@
 
 
     private Map<Class, PrimitiveMapping> class2syntax = new HashMap<Class, PrimitiveMapping>();
+    private Logger log = LoggerFactory.getLogger( PrimitiveMappingRegistry.class );
 
 
     public PrimitiveMappingRegistry( PrimitiveMapping[] overrides )
@@ -123,12 +126,17 @@
     {
         class2syntax.put( STRING_MAPPING.getJavaType(), STRING_MAPPING );
         class2syntax.put( INT_MAPPING.getJavaType(), INT_MAPPING );
+        class2syntax.put( int.class, INT_MAPPING );
         class2syntax.put( BYTE_MAPPING.getJavaType(), BYTE_MAPPING );
+        class2syntax.put( byte.class, BYTE_MAPPING );
         class2syntax.put( LONG_MAPPING.getJavaType(), LONG_MAPPING );
+        class2syntax.put( long.class, LONG_MAPPING );
         class2syntax.put( SHORT_MAPPING.getJavaType(), SHORT_MAPPING );
+        class2syntax.put( short.class, SHORT_MAPPING );
         class2syntax.put( BIG_INT_MAPPING.getJavaType(), BIG_INT_MAPPING );
         class2syntax.put( BIT_SET_MAPPING.getJavaType(), BIT_SET_MAPPING );
         class2syntax.put( BOOLEAN_MAPPING.getJavaType(), BOOLEAN_MAPPING );
+        class2syntax.put( boolean.class, BOOLEAN_MAPPING );
         class2syntax.put( CHAR_ARRAY_MAPPING.getJavaType(), CHAR_ARRAY_MAPPING );
         class2syntax.put( BYTE_ARRAY_MAPPING.getJavaType(), BYTE_ARRAY_MAPPING );
         class2syntax.put( DATE_MAPPING.getJavaType(), DATE_MAPPING );
@@ -151,6 +159,7 @@
 
     public PrimitiveMapping lookup( Class javaType )
     {
+        log.debug( "looking up mapping for {}", javaType.getName() );
         return class2syntax.get( javaType );
     }
 }

Modified: directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/descriptions/AttributeToPropertyMapping.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/descriptions/AttributeToPropertyMapping.java?view=diff&rev=559292&r1=559291&r2=559292
==============================================================================
--- directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/descriptions/AttributeToPropertyMapping.java
(original)
+++ directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/descriptions/AttributeToPropertyMapping.java
Tue Jul 24 19:45:22 2007
@@ -24,12 +24,11 @@
 import org.apache.directory.j2l.configuration.J2LConfiguration;
 import org.apache.commons.beanutils.DynaProperty;
 import org.apache.commons.beanutils.DynaClass;
-import org.apache.commons.collections.CollectionUtils;
 
 import java.lang.reflect.Method;
 import java.lang.annotation.Annotation;
-import java.util.List;
-import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
 
 /**
  * Useful data structure to track an attributeType to Java Bean Property along with
@@ -42,13 +41,15 @@
 {
     private final J2LConfiguration configuration;
     private AttributeTypeDescription attributeTypeDescription = new AttributeTypeDescription();
-    private boolean isRequired = false;
+    private boolean required = false;
+    private boolean ignored = false;
+    private boolean existsInAnotherSchema = false;
     private Method setter;
     private Method getter;
-    private DynaClass dynaClass;
+    private Class beanClass;
     private DynaProperty dynaProperty;
     private PrimitiveMapping primitiveMapping;
-    private List<Annotation> annotations;
+    private Map<Class,Annotation> annotations;
 
 
     public AttributeToPropertyMapping( J2LConfiguration configuration )
@@ -69,18 +70,25 @@
     }
 
 
-    public List<Annotation> getAllPropertyAnnotations()
+    public Map<Class,Annotation> getAllPropertyAnnotations()
     {
+        // @TODO we can detect and respond to duplicate annotations on getters and setters
         if ( annotations == null )
         {
-            annotations = new ArrayList<Annotation>();
+            annotations = new HashMap<Class,Annotation>();
             if ( getter != null && getter.getAnnotations() != null && getter.getAnnotations().length
> 0 )
             {
-                CollectionUtils.addAll( annotations, getter.getAnnotations() );
+                for ( Annotation annotation : getter.getAnnotations() )
+                {
+                    annotations.put( annotation.getClass(), annotation );
+                }
             }
             if ( setter != null && setter.getAnnotations() != null && setter.getAnnotations().length
> 0 )
             {
-                CollectionUtils.addAll( annotations, setter.getAnnotations() );
+                for ( Annotation annotation : setter.getAnnotations() )
+                {
+                    annotations.put( annotation.getClass(), annotation );
+                }
             }
         }
 
@@ -102,13 +110,13 @@
 
     public boolean isRequired()
     {
-        return isRequired;
+        return required;
     }
 
 
     public void setRequired( boolean required )
     {
-        isRequired = required;
+        this.required = required;
     }
 
 
@@ -152,16 +160,40 @@
 
     public PrimitiveMapping getPrimitiveMapping()
     {
+        if ( primitiveMapping == null )
+        {
+            this.primitiveMapping = configuration.getPrimitiveMappingRegistry().lookup( dynaProperty.getType()
);
+        }
         return primitiveMapping;
     }
 
-    public DynaClass getDynaClass()
+    public boolean isIgnored()
+    {
+        return ignored;
+    }
+
+    public void setIgnored( boolean ignored )
+    {
+        this.ignored = ignored;
+    }
+
+    public boolean isExistsInAnotherSchema()
+    {
+        return existsInAnotherSchema;
+    }
+
+    public void setExistsInAnotherSchema( boolean existsInAnotherSchema )
+    {
+        this.existsInAnotherSchema = existsInAnotherSchema;
+    }
+
+    public Class getBeanClass()
     {
-        return dynaClass;
+        return beanClass;
     }
 
-    public void setDynaClass( DynaClass dynaClass )
+    public void setBeanClass( Class beanClass )
     {
-        this.dynaClass = dynaClass;
+        this.beanClass = beanClass;
     }
 }

Modified: directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/descriptions/AttributeTypeExtractor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/descriptions/AttributeTypeExtractor.java?view=diff&rev=559292&r1=559291&r2=559292
==============================================================================
--- directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/descriptions/AttributeTypeExtractor.java
(original)
+++ directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/java/org/apache/directory/j2l/descriptions/AttributeTypeExtractor.java
Tue Jul 24 19:45:22 2007
@@ -21,12 +21,16 @@
 
 import org.apache.directory.shared.ldap.schema.UsageEnum;
 import org.apache.directory.j2l.configuration.J2LConfiguration;
-import org.apache.directory.j2l.configuration.OidGenerator;
+import org.apache.directory.j2l.annotations.attribute.*;
 import org.apache.commons.beanutils.DynaClass;
-import org.apache.commons.beanutils.BasicDynaClass;
 import org.apache.commons.beanutils.DynaProperty;
+import org.apache.commons.beanutils.WrapDynaClass;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.NotImplementedException;
+import org.apache.commons.collections.CollectionUtils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.*;
 import java.lang.reflect.Method;
@@ -42,46 +46,157 @@
  */
 public class AttributeTypeExtractor
 {
+    private final static Logger log = LoggerFactory.getLogger( AttributeTypeExtractor.class
);
     private final J2LConfiguration configuration;
-    private final OidGenerator generator;
 
 
-    public AttributeTypeExtractor( J2LConfiguration configuration, OidGenerator generator
)
+    public AttributeTypeExtractor( J2LConfiguration configuration )
     {
         this.configuration = configuration;
-        this.generator = generator;
     }
     
 
-    public Set<AttributeToPropertyMapping> extractAttributeToPropertyMappings( Class
beanClass )
+    public List<AttributeToPropertyMapping> extractAttributeToPropertyMappings( Class
beanClass )
     {
-        Set<AttributeToPropertyMapping> atds = new HashSet<AttributeToPropertyMapping>();
-        DynaClass dynaClass = new BasicDynaClass( beanClass.getName(), beanClass );
+        /*
+         * We want to add to the front of this list all the attributeTypes
+         * that can be processed without dependencies first: meaning without
+         * having a superType. Some schema processors may not be able to take
+         * into account seeing an attributeType which depends on another before
+         * seeing it's dependent attributeType first.
+         */
+        List<AttributeToPropertyMapping> withOutSuperTypes = new ArrayList<AttributeToPropertyMapping>();
+        List<AttributeToPropertyMapping> withSuperTypes = new ArrayList<AttributeToPropertyMapping>();
+
+        DynaClass dynaClass = WrapDynaClass.createDynaClass( beanClass );
         DynaProperty[] properties = dynaClass.getDynaProperties();
 
         for ( DynaProperty dynaProperty : properties )
         {
+            if ( configuration.isPropertyIgnored( dynaProperty.getName() ) )
+            {
+                continue;
+            }
+            
             // @TODO if the dynaProperty is mapped or indexed we need to take alternative
approaches
             // This is to manage the cardinality aspect - what about dealing with sets?
 
-            atds.add( extractAttributeToPropertyMapping( dynaClass, dynaProperty ) );
+            AttributeToPropertyMapping mapping = extractAttributeToPropertyMapping( beanClass,
dynaProperty );
+
+            if ( ! mapping.isIgnored() )
+            {
+                if ( mapping.getAttributeTypeDescription().getSuperType() == null )
+                {
+                    withOutSuperTypes.add( mapping );
+                }
+                else
+                {
+                    withSuperTypes.add( mapping );
+                }
+            }
+        }
+
+        // short out here if we cannot have dependency issues with no superTyped attributeTypes
+        if ( withSuperTypes.size() == 0 )
+        {
+            return withOutSuperTypes;
+        }
+
+        // @TODO this code below needs to be applied at a higher level to the
+        // entire pool of mappings for the schema rather than for each bean
+
+        /*
+         * Populate a map with the oid of the attributeTypes we have seen mapped
+         * to their AttributeToPropertyMappings.  We use this structure to see
+         * if one AttributeToPropertyMapping depends on another.
+         */
+        Map<String, AttributeToPropertyMapping> oid2Mapping
+                = new HashMap<String, AttributeToPropertyMapping>();
+        for ( AttributeToPropertyMapping mapping : withSuperTypes )
+        {
+            oid2Mapping.put( mapping.getAttributeTypeDescription().getNumericOid(), mapping
);
+        }
+        for ( AttributeToPropertyMapping mapping : withOutSuperTypes )
+        {
+            oid2Mapping.put( mapping.getAttributeTypeDescription().getNumericOid(), mapping
);
+        }
+
+        List<AttributeToPropertyMapping> combined = new ArrayList<AttributeToPropertyMapping>();
+        combined.addAll( withOutSuperTypes );
+        AttributeToPropertyMapping starter = withSuperTypes.get( 0 );
+        addWithDependenciesFirst( oid2Mapping, combined, withSuperTypes, starter );
+
+        return combined;
+    }
+
+
+    /**
+     * Adds the mappings that a mapping with a superType depends on to the combined
+     * list before adding the mapping with the superType.  This is done recursively
+     * until the mappings from the withSuperTypes list are consumed.
+     *
+     * @param oid2mappings a map of attributeType numericOids to their mappings
+     * @param combined the final combined list of mappings with least dependencies
+     * @param withSuperTypes the list of mappings with superTypes
+     * @param mapping the mapping to consider for dependencies
+     */
+    public void addWithDependenciesFirst( Map<String, AttributeToPropertyMapping> oid2mappings,
+                                          List<AttributeToPropertyMapping> combined,
+                                          List<AttributeToPropertyMapping> withSuperTypes,
+                                          AttributeToPropertyMapping mapping )
+    {
+        // basis case - exist when we have no more superTyped mappings
+        if ( withSuperTypes.isEmpty() )
+        {
+            combined.add( mapping );
+            return;
+        }
+
+        AttributeToPropertyMapping superTypeMapping =
+                oid2mappings.get( mapping.getAttributeTypeDescription().getSuperType() );
+
+        // if the superType is not defined in our map it must be external (in another schema)
+        if ( superTypeMapping == null )
+        {
+            combined.add( mapping );
+            return;
+        }
+
+        // if the superType mapping is already in the combined list then we're good
+        // and can just add this mapping now since the attributeType it depends on
+        // has it's mapping before this current dependent mapping
+        if ( combined.contains( superTypeMapping ) )
+        {
+            combined.add( mapping );
+            return;
+        }
+
+        // ----- Recursive Call ----------------------------------------------
+
+        // The superType mapping is not in combined so we must add it with its
+        // deps first then we can add our mapping which depends on this superType.
+        if ( withSuperTypes.contains( superTypeMapping ) )
+        {
+            withSuperTypes.remove( superTypeMapping );
+            addWithDependenciesFirst( oid2mappings, combined, withSuperTypes, superTypeMapping
);
         }
 
-        return atds;
+        combined.add( mapping );
     }
 
 
-    public AttributeToPropertyMapping extractAttributeToPropertyMapping( DynaClass dynaClass,
DynaProperty dynaProperty )
+    public AttributeToPropertyMapping extractAttributeToPropertyMapping( Class clazz, DynaProperty
dynaProperty )
     {
         AttributeToPropertyMapping mapping = new AttributeToPropertyMapping( configuration
);
-        mapping.setSetter( getPropertySetter( dynaClass, dynaProperty ) );
-        mapping.setGetter( getPropertyGetter( dynaClass, dynaProperty ) );
-        mapping.setDynaClass( dynaClass );
+        mapping.setSetter( getPropertySetter( clazz, dynaProperty ) );
+        mapping.setGetter( getPropertyGetter( clazz, dynaProperty ) );
+        mapping.setBeanClass( clazz );
+        mapping.setDynaProperty( dynaProperty );
 
         if ( mapping.getGetter() == null && mapping.getSetter() == null )
         {
-            throw new IllegalStateException( "dynaProperty " + dynaProperty.getName() + "
in class "
-                    + dynaClass.getClass() + " should at least have a getter or setter."
);   
+            throw new IllegalStateException( "Property " + dynaProperty.getName() + " in
class "
+                    + clazz + " should at least have a getter or setter." );
         }
 
         checkForDuplicateAnnotations( mapping );
@@ -98,10 +213,167 @@
 
     private void applyAnnotationsToAttributeTypeDescription( AttributeToPropertyMapping mapping
)
     {
-        List<Annotation> annotations = mapping.getAllPropertyAnnotations();
-        for ( Annotation annotation : annotations )
+        Map<Class, Annotation> annotations = mapping.getAllPropertyAnnotations();
+
+        // ----- IgnoreBeanProperty --------------------------------------------------
+
+        if ( annotations.containsKey( IgnoreBeanProperty.class ) )
         {
-            if ( annotation instanceof )
+            log.info( "Ignoring {} property.", mapping.getDynaProperty().getName() );
+            mapping.setIgnored( true );
+            return;
+        }
+
+        // ----- LdapAttributeAliases --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeAliases.class ) )
+        {
+            String[] aliases = ( ( LdapAttributeAliases ) annotations.get( LdapAttributeAliases.class
) ).value();
+            List<String> names = new ArrayList<String>(aliases.length);
+            CollectionUtils.addAll( names, aliases );
+            log.info( "Overriding aliases {} for {} property.", names, mapping.getDynaProperty().getName()
);
+            mapping.getAttributeTypeDescription().setNames( names );
+        }
+
+        // ----- LdapAttributeCollective --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeCollective.class ) )
+        {
+            log.info( "Setting {} property as collective attributeType.", mapping.getDynaProperty().getName()
);
+            mapping.getAttributeTypeDescription().setCollective( true );
+        }
+
+        // ----- LdapAttributeDescription --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeDescription.class ) )
+        {
+            String desc = ( ( LdapAttributeDescription ) annotations.get( LdapAttributeDescription.class
) ).value();
+            log.info( "Setting {} property's attributeType description.", mapping.getDynaProperty().getName()
);
+            mapping.getAttributeTypeDescription().setDescription( desc );
+        }
+
+        // ----- LdapAttributeEqualityMatch --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeEqualityMatch.class ) )
+        {
+            String mr = ( ( LdapAttributeEqualityMatch ) annotations.get( LdapAttributeEqualityMatch.class
) ).value();
+            log.info( "Using {} matchingRule for {} property.", mr, mapping.getDynaProperty().getName()
);
+            mapping.getAttributeTypeDescription().setEqualityMatchingRule( mr );
+        }
+
+        // ----- LdapAttributeExists --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeExists.class ) )
+        {
+            log.info( "Not generating attributeType description for {} property. " +
+                    "It's marked as existing in another schema.", mapping.getDynaProperty().getName()
);
+            mapping.setExistsInAnotherSchema( true );
+        }
+
+        // ----- LdapAttributeNotUserModifiable --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeNotUserModifiable.class ) )
+        {
+            log.info( "AttributeType of {} property will not be user modifiable.", mapping.getDynaProperty().getName()
);
+            mapping.getAttributeTypeDescription().setUserModifiable( false );
+        }
+
+        // ----- LdapAttributeObsolete --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeObsolete.class ) )
+        {
+            log.info( "Marking {} property's attributeType will be obsolete.", mapping.getDynaProperty().getName()
);
+            mapping.getAttributeTypeDescription().setObsolete( true );
+        }
+
+        // ----- LdapAttributeOid --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeOid.class ) )
+        {
+            String oid = ( ( LdapAttributeOid ) annotations.get( LdapAttributeOid.class )
).value();
+            log.info( "Overriding sequentially assigned OID for {} property: using {} instead.",

+                    mapping.getDynaProperty().getName(), oid );
+            mapping.getAttributeTypeDescription().setNumericOid( oid );
+        }
+
+        // ----- LdapAttributeOrderingMatch --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeOrderingMatch.class ) )
+        {
+            String mr = ( ( LdapAttributeOrderingMatch ) annotations.get( LdapAttributeOrderingMatch.class
) ).value();
+            log.info( "Using {} matchingRule for {} property's attributeType ordering.",
+                    mr, mapping.getDynaProperty().getName() );
+            mapping.getAttributeTypeDescription().setOrderingMatchingRule( mr );
+        }
+
+        // ----- LdapAttributeRequired --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeRequired.class ) )
+        {
+            log.info( "Marking {} property as required (in MUST list) within objectClass.",
+                    mapping.getDynaProperty().getName() );
+            mapping.setRequired( true );
+        }
+
+        // ----- LdapAttributeSchemaExtension[s] --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeSchemaExtensions.class ) )
+        {
+            LdapAttributeSchemaExtension[] extentionsArray = ( ( LdapAttributeSchemaExtensions
)
+                    annotations.get( LdapAttributeSchemaExtensions.class ) ).value();
+            Map<String, List<String>> extensions = new HashMap<String, List<String>>(
extentionsArray.length );
+            for ( LdapAttributeSchemaExtension extension : extentionsArray )
+            {
+                String[] valuesArray = extension.values();
+                List<String> values = new ArrayList<String>( valuesArray.length
);
+                CollectionUtils.addAll( values, valuesArray );
+                extensions.put( extension.name(), values );
+            }
+
+            log.info( "Adding schema extensions for attributeType description of {0} property:
{1}",
+                    mapping.getDynaProperty().getName(), extensions );
+            mapping.getAttributeTypeDescription().setExtensions( extensions );
+        }
+
+        // ----- LdapAttributeSubstringMatch --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeSubstringMatch.class ) )
+        {
+            String mr = ( ( LdapAttributeSubstringMatch )
+                    annotations.get( LdapAttributeSubstringMatch.class ) ).value();
+            log.info( "Using matchingRule {} for substring matching {} property's attributeType.",
+                    mr, mapping.getDynaProperty().getName() );
+            mapping.getAttributeTypeDescription().setSubstringsMatchingRule( mr );
+        }
+
+        // ----- LdapAttributeSuperType --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeSuperType.class ) )
+        {
+            String superType = ( ( LdapAttributeSuperType ) annotations.get( LdapAttributeSuperType.class
) ).value();
+            log.info( "Setting superType of attributeType for {} property to {}.",
+                    mapping.getDynaProperty().getName(), superType );
+            mapping.getAttributeTypeDescription().setSuperType( superType );
+        }
+
+        // ----- LdapAttributeSyntax --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeSyntax.class ) )
+        {
+            String syntax = ( ( LdapAttributeSyntax ) annotations.get( LdapAttributeSyntax.class
) ).value();
+            log.info( "Overriding syntax of {} property's attributeType: using {}.",
+                    mapping.getDynaProperty().getName(), syntax );
+            mapping.getAttributeTypeDescription().setSyntax( syntax );
+        }
+
+        // ----- LdapAttributeUsage --------------------------------------------------
+
+        if ( annotations.containsKey( LdapAttributeUsage.class ) )
+        {
+            UsageEnum usage = ( ( LdapAttributeUsage ) annotations.get( LdapAttributeUsage.class
) ).value();
+            log.info( "Overriding default USAGE for attributeType of {} property: using {}",
+                    mapping.getDynaProperty().getName(), usage.toString() );
+            mapping.getAttributeTypeDescription().setUsage( usage );
         }
     }
 
@@ -110,11 +382,14 @@
     {
         if ( mapping.getDynaProperty().isIndexed() && mapping.getDynaProperty().isMapped()
)
         {
+            log.error( "Cannot handle complex properties such as maps and lists right now
for property {}",
+                    mapping.getDynaProperty().getName() );
             throw new NotImplementedException( "Only simple properties are handled." );
         }
 
         mapping.getAttributeTypeDescription().setUsage( UsageEnum.USER_APPLICATIONS );
-        mapping.getAttributeTypeDescription().setNumericOid( generator.nextAttributeTypeOid()
);
+        mapping.getAttributeTypeDescription().setNumericOid(
+                configuration.getSchemaConfiguration().getOidGenerator().nextAttributeTypeOid()
);
         mapping.getAttributeTypeDescription().setCollective( false );
         mapping.getAttributeTypeDescription().setDescription( "undocumented" );
         mapping.getAttributeTypeDescription().setObsolete( false );
@@ -139,7 +414,7 @@
         mapping.getAttributeTypeDescription().setExtensions( extensions );
 
         // ----- setup the name ------------------------------
-        String name = null;
+        String name;
         if ( configuration.getEntityPrefix() != null )
         {
             // use the prefix + property name if prefix is specified
@@ -148,7 +423,7 @@
         else
         {
             // default to fully qualified class name of bean + [P]roperty
-            name = mapping.getDynaClass().getName() + "." +
+            name = mapping.getBeanClass().getName() + "." +
                     StringUtils.capitalize( mapping.getDynaProperty().getName() );
         }
         mapping.getAttributeTypeDescription().setNames( Collections.singletonList( name )
);
@@ -163,6 +438,9 @@
         {
             if ( mapping.getGetter().getAnnotations().length != 0 && mapping.getSetter().getAnnotations().length
!= 0 )
             {
+                log.error( "Found duplicate (potentially ambiguous) annotations on property
{} methods.\n" +
+                        "Please only use mutator or accessor but not both for the same annotation!",
+                        mapping.getDynaProperty().getName() );
                 throw new IllegalArgumentException( "Both setter and getter contain annotations
in class "
                         + mapping.getGetter().getClass().getName() + ": " + mapping.getGetter().getName()
                         + " and " + mapping.getSetter().getName() );
@@ -170,40 +448,65 @@
         }
     }
 
-    public static Method getPropertySetter( DynaClass dynaClass, DynaProperty property )
+    
+    public static Method getPropertySetter( Class clazz, DynaProperty property )
     {
-        Method setter = null;
+        Method setter;
 
         try
         {
-            setter = dynaClass.getClass().getMethod( "set" + StringUtils.capitalize( property.getName()
),
-                    new Class[] { property.getClass() } );
+            String methodName = "set" + StringUtils.capitalize( property.getName() );
+
+            for ( Method method : clazz.getMethods() )
+            {
+                log.debug( method.getName() );
+            }
+
+            setter = clazz.getMethod( methodName, new Class[] { property.getType() } );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            log.info( "No setter found on bean property: {}", property.getName() );
+            return null;
         }
-        catch ( NoSuchMethodException e ) {}
 
         return setter;
     }
 
 
-    public static Method getPropertyGetter( DynaClass dynaClass, DynaProperty property )
+    public static Method getPropertyGetter( Class clazz, DynaProperty property )
     {
         Method getter = null;
 
         try
         {
-            getter = dynaClass.getClass().getMethod( "get" + StringUtils.capitalize( property.getName()
),
-                    new Class[] { property.getClass() } );
+            String methodName = "get" + StringUtils.capitalize( property.getName() );
+            getter = clazz.getMethod( methodName );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            if ( property.getType() == Boolean.class )
+            {
+                log.info( "No getter expected for boolean bean property: {}", property.getName()
);
+            }
+            else
+            {
+                log.warn( "Expecting getter but none found for non-boolean bean property:
{}", property.getName() );
+            }
         }
-        catch ( NoSuchMethodException e ) {}
 
         if ( getter == null )
         {
             try
             {
-                getter = dynaClass.getClass().getMethod( "is" + StringUtils.capitalize( property.getName()
),
-                        new Class[] { property.getClass() } );
+                getter = clazz.getMethod( "is" + StringUtils.capitalize( property.getName()
) );
+            }
+            catch ( NoSuchMethodException e )
+            {
+                log.warn( "Expecting getter (with 'is' prefix) but non found for boolean
bean property: {}",
+                        property.getName() );
+                return null;
             }
-            catch ( NoSuchMethodException e ) {}
         }
         return getter;
     }

Added: directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/resources/log4j.properties
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/resources/log4j.properties?view=auto&rev=559292
==============================================================================
--- directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/resources/log4j.properties (added)
+++ directory/sandbox/akarasulu/j2l/trunk/runtime/src/main/resources/log4j.properties Tue
Jul 24 19:45:22 2007
@@ -0,0 +1,6 @@
+log4j.rootCategory=ERROR, stdout
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=[%d{HH:mm:ss}] %p [%c] - %m%n
+

Modified: directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/AnnotationTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/AnnotationTest.java?view=diff&rev=559292&r1=559291&r2=559292
==============================================================================
--- directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/AnnotationTest.java
(original)
+++ directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/AnnotationTest.java
Tue Jul 24 19:45:22 2007
@@ -22,7 +22,7 @@
 /**
  * Test cases for the various annotations used in J2L. Two classes are used
  * for testing these annotations.  They are included in this package as
- * TestBean and MutableTestBean.
+ * TestBeanNoAnnotations and MutableTestBean.
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$

Copied: directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/TestBeanNoAnnotations.java
(from r558576, directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/TestBean.java)
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/TestBeanNoAnnotations.java?view=diff&rev=559292&p1=directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/TestBean.java&r1=558576&p2=directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/TestBeanNoAnnotations.java&r2=559292
==============================================================================
--- directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/TestBean.java
(original)
+++ directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/annotations/TestBeanNoAnnotations.java
Tue Jul 24 19:45:22 2007
@@ -19,24 +19,27 @@
  */
 package org.apache.directory.j2l.annotations;
 
+
 /**
- * A bean with J2L annotations used for testing these annotations.
+ * A bean without any annotations to test the defaults.
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
  */
-public class TestBean
+public class TestBeanNoAnnotations
 {
     private String stringProperty;
     private short shortProperty;
     private long longProperty;
     private byte byteProperty;
     private boolean booleanProperty;
-    private char charProperty;
+    // not supported
+    // private char charProperty;
     private int intProperty;
-    private float floatProperty;
-    private double doubleProperty;
-    private FooEnum enumProperty;
+    // not supported
+    // private float floatProperty;
+    // private double doubleProperty;
+    // private FooEnum enumProperty;
 
     public String getStringProperty()
     {
@@ -63,16 +66,19 @@
         return booleanProperty;
     }
 
+    /* not supported yet
     public char getCharProperty()
     {
         return charProperty;
     }
+    */
 
     public int getIntProperty()
     {
         return intProperty;
     }
 
+    /* not supported yet
     public float getFloatProperty()
     {
         return floatProperty;
@@ -87,6 +93,7 @@
     {
         return enumProperty;
     }
+    */
 
     protected void setStringProperty( String stringProperty )
     {
@@ -98,16 +105,19 @@
         this.booleanProperty = booleanProperty;
     }
 
+    /* not supported yet
     protected void setCharProperty( char charProperty )
     {
         this.charProperty = charProperty;
     }
+    */
 
     protected void setIntProperty( int intProperty )
     {
         this.intProperty = intProperty;
     }
 
+    /* not supported yet
     protected void setFloatProperty( float floatProperty )
     {
         this.floatProperty = floatProperty;
@@ -122,6 +132,7 @@
     {
         this.enumProperty = enumProperty;
     }
+    */
 
     protected void setShortProperty( short shortProperty )
     {

Added: directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/descriptions/AttributeTypeExtractorTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/descriptions/AttributeTypeExtractorTest.java?view=auto&rev=559292
==============================================================================
--- directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/descriptions/AttributeTypeExtractorTest.java
(added)
+++ directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/descriptions/AttributeTypeExtractorTest.java
Tue Jul 24 19:45:22 2007
@@ -0,0 +1,68 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.j2l.descriptions;
+
+import junit.framework.TestCase;
+import org.apache.directory.j2l.configuration.J2LConfiguration;
+import org.apache.directory.j2l.annotations.TestBeanNoAnnotations;
+import org.apache.directory.shared.ldap.schema.SchemaUtils;
+
+import java.util.List;
+
+
+/**
+ * Test cases for the AttributeTypeExtractor.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class AttributeTypeExtractorTest extends TestCase
+{
+    J2LConfiguration configuration;
+    AttributeTypeExtractor extractor;
+
+
+    public void setUp()
+    {
+        configuration = new J2LConfiguration();
+        configuration.setEntityPrefix( "bogus" );
+        configuration.getSchemaConfiguration().setName( "bogus" );
+        configuration.setGenerateSchemaFile( true );
+        extractor = new AttributeTypeExtractor( configuration );
+    }
+
+
+    public void tearDown()
+    {
+        extractor = null;
+        configuration = null;
+    }
+
+
+    public void testExtraction() throws Exception
+    {
+        List<AttributeToPropertyMapping> mappings =
+                extractor.extractAttributeToPropertyMappings( TestBeanNoAnnotations.class
);
+        for ( AttributeToPropertyMapping mapping : mappings )
+        {
+            System.out.println( SchemaUtils.render( mapping.getAttributeTypeDescription()
) );
+        }
+    }
+}

Propchange: directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/java/org/apache/directory/j2l/descriptions/AttributeTypeExtractorTest.java
------------------------------------------------------------------------------
    svn:executable = *

Added: directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/resources/log4j.properties?view=auto&rev=559292
==============================================================================
--- directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/resources/log4j.properties (added)
+++ directory/sandbox/akarasulu/j2l/trunk/runtime/src/test/resources/log4j.properties Tue
Jul 24 19:45:22 2007
@@ -0,0 +1,6 @@
+log4j.rootCategory=DEBUG, stdout
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=[%d{HH:mm:ss}] %p [%c] - %m%n
+



Mime
View raw message