You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2007/07/14 01:15:29 UTC

svn commit: r556176 - in /directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition: ./ tree/

Author: akarasulu
Date: Fri Jul 13 16:15:28 2007
New Revision: 556176

URL: http://svn.apache.org/viewvc?view=rev&rev=556176
Log:
refactored the partition structure stuff so it is clear what and how it is being used: still need more explainations on the data structure and how names are used in it

Added:
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/AbstractNode.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/BranchNode.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/LeafNode.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/Node.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/package.html   (with props)
Removed:
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/AbstractPartitionStructure.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/PartitionContainer.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/PartitionHandler.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/PartitionStructure.java
Modified:
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/DefaultPartitionNexus.java

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/DefaultPartitionNexus.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/DefaultPartitionNexus.java?view=diff&rev=556176&r1=556175&r2=556176
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/DefaultPartitionNexus.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/DefaultPartitionNexus.java Fri Jul 13 16:15:28 2007
@@ -54,6 +54,8 @@
 import org.apache.directory.server.core.interceptor.context.SearchOperationContext;
 import org.apache.directory.server.core.partition.impl.btree.MutableBTreePartitionConfiguration;
 import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmPartition;
+import org.apache.directory.server.core.partition.tree.Node;
+import org.apache.directory.server.core.partition.tree.BranchNode;
 import org.apache.directory.server.ldap.constants.SupportedSASLMechanisms;
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.server.schema.registries.OidRegistry;
@@ -124,7 +126,7 @@
     private Map<String, Partition> partitions = new HashMap<String, Partition>();
     
     /** A structure to hold all the partitions */
-    private PartitionStructure partitionList = new PartitionContainer();
+    private Node partitionList = new BranchNode();
     
     /** the read only rootDSE attributes */
     private final Attributes rootDSE;
@@ -400,7 +402,7 @@
         {
             partitions.put( key, system );
         
-            partitionList.buildPartitionStructure( partitionList, system.getSuffix(), 0, system );
+            partitionList.buildNode( partitionList, system.getSuffix(), 0, system );
 
             Attribute namingContexts = rootDSE.get( NAMINGCTXS_ATTR );
             namingContexts.add( system.getUpSuffix().getUpName() );
@@ -578,7 +580,7 @@
         {
             partitions.put( partition.getSuffix().toString(), partition );
             
-            partitionList.buildPartitionStructure( partitionList, partition.getSuffix(), 0, partition );
+            partitionList.buildNode( partitionList, partition.getSuffix(), 0, partition );
 
             Attribute namingContexts = rootDSE.get( NAMINGCTXS_ATTR );
             namingContexts.add( partition.getUpSuffix().getUpName() );
@@ -607,11 +609,11 @@
         {
             partitions.remove( key );
         
-            partitionList = new PartitionContainer();
+            partitionList = new BranchNode();
             
             for ( Partition part:partitions.values() )
             {
-                partitionList.buildPartitionStructure( partitionList, part.getSuffix(), 0, partition );
+                partitionList.buildNode( partitionList, part.getSuffix(), 0, partition );
             }
     
             partition.sync();
@@ -1034,7 +1036,7 @@
     private Partition getBackend( LdapDN dn ) throws NamingException
     {
         Enumeration<String> rdns = dn.getAll();
-        PartitionStructure currentPartition = partitionList;
+        Node currentPartition = partitionList;
         
         // This is synchronized so that we can't read the
         // partitionList when it is modified.
@@ -1047,9 +1049,9 @@
                 
                 if ( currentPartition.contains( rdn ) )
                 {
-                    currentPartition = currentPartition.getPartition( rdn );
+                    currentPartition = currentPartition.getChildOrThis( rdn );
     
-                    if ( currentPartition.isPartition() )
+                    if ( currentPartition.isLeaf() )
                     {
                         return currentPartition.getPartition();
                     }

Added: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/AbstractNode.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/AbstractNode.java?view=auto&rev=556176
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/AbstractNode.java (added)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/AbstractNode.java Fri Jul 13 16:15:28 2007
@@ -0,0 +1,49 @@
+/*
+ *  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.server.core.partition.tree;
+
+import org.apache.directory.server.core.partition.Partition;
+import org.apache.directory.shared.ldap.name.LdapDN;
+
+/**
+ * This abstract class is just used to implement the utility method needed to build the
+ * global partition structue used by the getBackend method. 
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+
+public abstract class AbstractNode implements Node
+{
+    /**
+     * @see Node#buildNode(Node, LdapDN, int, Partition)
+     */
+    public Node buildNode( Node current, LdapDN dn, int index, Partition partition )
+    {
+        if ( index == dn.size() - 1 )
+        {
+            return current.addNode( dn.getRdn( index ).toString(), new LeafNode( partition ) );
+        }
+        else
+        {
+            return current.addNode( dn.getRdn( index ).toString(), 
+                buildNode( new BranchNode(), dn, index + 1, partition ) );
+        }
+    }
+}

Added: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/BranchNode.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/BranchNode.java?view=auto&rev=556176
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/BranchNode.java (added)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/BranchNode.java Fri Jul 13 16:15:28 2007
@@ -0,0 +1,142 @@
+/*
+ *  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.server.core.partition.tree;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.directory.server.core.partition.Partition;
+
+/**
+ * 
+ * The Partition Container holds entries which can be either Partitions or 
+ * Containers. 
+ * 
+ * We can see them as directories, where Partitions are the files.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class BranchNode extends AbstractNode
+{
+    /** Stores the list of all the descendant partitions and containers */
+    private Map<String, Node> children;
+    
+    
+    /**
+     * Creates a new instance of PartitionContainer.
+     */
+    public BranchNode()
+    {
+        children = new HashMap<String, Node>();
+    }
+
+    
+    /**
+     * @see Node#isLeaf()
+     */
+    public boolean isLeaf()
+    {
+        return false;
+    }
+    
+    
+    /**
+     * @see Node#addNode( String, Node )
+     */
+    public Node addNode( String name, Node child )
+    {
+        children.put( name, child );
+        return this;
+    }
+    
+    
+    /**
+     * @see Node#contains( String )     
+     */
+    public boolean contains( String name )
+    {
+        return children.containsKey( name );
+    }
+    
+    
+    /**
+     * @see Node#getPartition()
+     * 
+     * As this is a container, we just return null;
+     */
+    public Partition getPartition()
+    {
+        return null;
+    }
+
+    
+    /**
+     * @see Node#getChildOrThis( String )
+     */
+    public Node getChildOrThis( String name )
+    {
+        if ( children.containsKey( name ) )
+        {
+            return children.get( name );
+        }
+        else
+        {
+            return null;
+        }
+    }
+    
+    
+    /**
+     * @see Object#toString()
+     */
+    public String toString()
+    {
+        StringBuilder sb = new StringBuilder();
+        
+        sb.append( " { " );
+        
+        boolean isFirst = true;
+        
+        for ( Node child:children.values() )
+        {
+            if ( isFirst )
+            {
+                isFirst = false;
+            }
+            else
+            {
+                sb.append(  ", " );
+            }
+
+            if ( child instanceof BranchNode )
+            {
+                sb.append( "Branch:").append( child.toString() );
+            }
+            else
+            {
+                sb.append( "Leaf: " ).append( "'" ).append( child.toString() ).append( "'" );
+            }
+        }
+
+        sb.append( " } " );
+        
+        return sb.toString();
+    }
+}

Added: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/LeafNode.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/LeafNode.java?view=auto&rev=556176
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/LeafNode.java (added)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/LeafNode.java Fri Jul 13 16:15:28 2007
@@ -0,0 +1,130 @@
+/*
+ *  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.server.core.partition.tree;
+
+
+import javax.naming.NamingException;
+
+import org.apache.directory.server.core.partition.Partition;
+
+
+/**
+ * A leaf node which stores a Partition. These objects are stored in BranchNodes.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class LeafNode extends AbstractNode
+{
+    /** The stored partition */
+    private Partition partition;
+
+    
+    /**
+     * Creates a new instance of LeafNode.
+     *
+     * @param partition the partition to store
+     */
+    public LeafNode( Partition partition )
+    {
+        this.partition = partition;
+    }
+
+    
+    /**
+     * @see Node#isLeaf()
+     */
+    public boolean isLeaf()
+    {
+        return true;
+    }
+    
+    
+    /**
+     * @see Node#contains( String )
+     */
+    public boolean contains( String name )
+    {
+        try
+        {
+            return partition.getSuffix().getNormName().equals(  name  );
+        }
+        catch ( NamingException ne )
+        {
+            return false;
+        }
+    }
+    
+
+    /**
+     * @see Node#addNode( String, Node )
+     */
+    public Node addNode( String name, Node partition )
+    {
+        return this;
+    }
+    
+    
+    /**
+     * @see Node#getPartition()
+     */
+    public Partition getPartition()
+    {
+        return partition;
+    }
+    
+
+    /**
+     * @see Node#getChildOrThis( String )
+     */
+    public Node getChildOrThis( String name )
+    {
+        try
+        {
+            if ( partition.getSuffix().getNormName().equals( name ) )
+            {
+                return this;
+            }
+            else
+            {
+                return null;
+            }
+        }
+        catch ( NamingException ne )
+        {
+            return null;
+        }
+    }
+
+    
+    /**
+     * @see Object#toString()
+     */
+    public String toString()
+    {
+        try
+        {
+            return partition.getSuffix().getUpName();
+        }
+        catch ( NamingException ne )
+        {
+            return "Unkown partition";
+        }
+    }
+}

Added: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/Node.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/Node.java?view=auto&rev=556176
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/Node.java (added)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/Node.java Fri Jul 13 16:15:28 2007
@@ -0,0 +1,95 @@
+/*
+ *  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.server.core.partition.tree;
+
+
+import org.apache.directory.server.core.partition.Partition;
+import org.apache.directory.shared.ldap.name.LdapDN;
+
+
+/**
+ * An interface for nodes in a tree designed to quickly lookup partitions.
+ * Branch nodes in this tree contain other nodes.  Leaf nodes in the tree
+ * contain a referrence to a partition whose suffix is the path through the 
+ * nodes of the tree from the root.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public interface Node
+{
+    /**
+     * Tells if the implementation is a leaf node. If it's a branch node
+     * then false is returned.
+     *
+     * @return <code>true</code> if the class is a leaf node, false otherwise.
+     */
+    boolean isLeaf();
+    
+    /**
+     * Add a new Partition to the current container.
+     *
+     * @param name The partition name
+     * @param children The PartitionStructure object (it should be a PartitionHandler)
+     * @return The current PartitionStructure to which a Partition has been added.
+     */
+    Node addNode( String name, Node children );
+    
+    /**
+     * Tells if the current PartitionStructure contains the given partition.
+     * 
+     * If the PartitionStructure is an instance of PartitionHandler, returns true
+     * if the partition's name equals the given name.
+     *
+     * If the PartitionStructure is an instance of PartitionContainer, returns true
+     * if the container's children contains the given name.
+     *
+     * @param name The name we are looking for
+     * @return <code>true</code> if the PartitionStructure instance contains this name
+     */
+    boolean contains( String name );
+    
+    /**
+     * Returns the Partition associated with this name, if any, or null if the name is not 
+     * found
+     *
+     * @param name The name we are looking for 
+     * @return The associated PartitionHandler or PartitionContainer
+     */
+    Node getChildOrThis( String name );
+    
+    /**
+     * @return Get the partition if the object is an instance of PartitionHandler, null otherwise
+     */
+    Partition getPartition();
+    
+    /**
+     * Construct the global partition structure, assuming the DN passed as an argument is a partition
+     * name.
+     * 
+     * This is a recursive method.
+     *
+     * @param current The current structure
+     * @param dn The DN associated with the partition
+     * @param index The current RDN being processed 
+     * @param partition The associated partition
+     * @return The modified global structure.
+     */
+    Node buildNode( Node current, LdapDN dn, int index, Partition partition );
+}

Added: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/package.html
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/package.html?view=auto&rev=556176
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/package.html (added)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/package.html Fri Jul 13 16:15:28 2007
@@ -0,0 +1,9 @@
+<body>
+<p>
+Set of classes and interfaces for a special data tree structure used to quickly
+find partitions corresponding to an entry by DN.  The data structure contains
+branch nodes which store other nodes as well as leaf nodes which referrence 
+partitions whose suffix is the path from the root of the tree down to the node.
+Each node contains an RDN used for it's position.
+</p>
+</body>

Propchange: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/tree/package.html
------------------------------------------------------------------------------
    svn:executable = *