o added a setter in DNFactory for schema manager
o update init method of DirectoryService to set the schema manager of DNFactory
o fixed the failing test


git-svn-id: https://svn.apache.org/repos/asf/directory/apacheds/branches/apacheds-dnfactory-experiment@981867 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/core/src/main/java/org/apache/directory/server/core/DNFactory.java b/core/src/main/java/org/apache/directory/server/core/DNFactory.java
index eb71564..dea3efe 100644
--- a/core/src/main/java/org/apache/directory/server/core/DNFactory.java
+++ b/core/src/main/java/org/apache/directory/server/core/DNFactory.java
@@ -45,6 +45,8 @@
 
     private static final Logger LOG = LoggerFactory.getLogger( DNFactory.class );
 
+    private static SchemaManager schemaManager;
+    
     // stat counters
     private static int hitCount = 0;
     private static int missCount = 0;
@@ -74,37 +76,40 @@
             return DN.EMPTY_DN;
         }
 
-        DN cachedDN = DN_CACHE.get( dn );
-
-        if ( cachedDN == null )
+        synchronized ( dn )
         {
-            LOG.debug( "DN {} not found in the cache, creating", dn );
-
-            cachedDN = new DN( dn, schemaManager );
-
-            DN_CACHE.put( dn, cachedDN );
-            missCount++;
-        }
-        else
-        {
-            if ( !cachedDN.isNormalized() && ( schemaManager != null ) )
+            DN cachedDN = DN_CACHE.get( dn );
+            
+            if ( cachedDN == null )
             {
-                cachedDN.normalize( schemaManager.getNormalizerMapping() );
+                LOG.debug( "DN {} not found in the cache, creating", dn );
+                
+                cachedDN = new DN( dn, schemaManager );
+                
+                DN_CACHE.put( dn, cachedDN );
+                missCount++;
             }
-
-            hitCount++;
-        }
-
-        LOG.debug( "DN {} found in the cache", dn );
+            else
+            {
+                if ( !cachedDN.isNormalized() && ( schemaManager != null ) )
+                {
+                    cachedDN.normalize( schemaManager.getNormalizerMapping() );
+                }
+                
+                hitCount++;
+            }
+            
+            LOG.debug( "DN {} found in the cache", dn );
 //        System.out.println( "DN cache hit - " + hitCount + ", miss - " + missCount + " and is normalized = "
 //            + cachedDN.isNormalized() );
-        return cachedDN;
+            return cachedDN;
+        }
     }
 
 
     public static DN create( String... upRdns ) throws LdapInvalidDnException
     {
-        return create( null, upRdns );
+        return create( schemaManager, upRdns );
     }
 
 
@@ -124,7 +129,7 @@
 
     public static DN create( DN dn ) throws LdapInvalidDnException
     {
-        return create( dn.getName(), null );
+        return create( dn.getName(), schemaManager );
     }
 
 
@@ -136,7 +141,13 @@
 
     public static DN create( String dn ) throws LdapInvalidDnException
     {
-        return create( dn, null );
+        return create( dn, schemaManager );
     }
 
+
+    public static void setSchemaManager( SchemaManager schemaManager )
+    {
+        DNFactory.schemaManager = schemaManager;
+    }
+    
 }
diff --git a/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java b/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
index 55c579a..c4f01e3 100644
--- a/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
+++ b/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
@@ -1413,6 +1413,8 @@
             LOG.debug( "---> Initializing the DefaultDirectoryService " );
         }
 
+        DNFactory.setSchemaManager( schemaManager );
+        
         // triggers partition to load schema fully from schema partition
         schemaService.initialize();
         schemaService.getSchemaPartition().initialize();
diff --git a/core/src/test/java/org/apache/directory/server/core/subtree/SubtreeEvaluatorTest.java b/core/src/test/java/org/apache/directory/server/core/subtree/SubtreeEvaluatorTest.java
index 23eabc3..6268681 100644
--- a/core/src/test/java/org/apache/directory/server/core/subtree/SubtreeEvaluatorTest.java
+++ b/core/src/test/java/org/apache/directory/server/core/subtree/SubtreeEvaluatorTest.java
@@ -91,7 +91,9 @@
         {
             fail( "Schema load failed : " + LdapExceptionUtils.printErrors( schemaManager.getErrors() ) );
         }
-
+        
+        DNFactory.setSchemaManager( schemaManager );
+        
         ncn = new ConcreteNameComponentNormalizer( schemaManager );
 
         visitor = new FilterNormalizingVisitor( ncn, schemaManager );