blob: 8906fd25ff099c9e157767459c9893633c39bd7e [file] [log] [blame]
/*
* Copyright 2004 The Apache Software Foundation
*
* Licensed 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.ldap.server.partition;
import java.util.Map;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.ModificationItem;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import org.apache.ldap.common.filter.ExprNode;
import org.apache.ldap.server.configuration.ContextPartitionConfiguration;
import org.apache.ldap.server.jndi.ContextFactoryConfiguration;
/**
* An interfaces that bridges between underlying JNDI entries and JNDI
* {@link Context} API. DIT (Directory Information Tree) consists one or
* above {@link ContextPartition}s whose parent is {@link ContextPartitionNexus},
* and all of them are mapped to different
* base suffix. Each partition contains entries whose name ends with that
* base suffix.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$
*/
public interface ContextPartition
{
/** The objectClass name for aliases: 'alias' */
String ALIAS_OBJECT = "alias";
/**
* The aliased Dn attribute name: aliasedObjectName for LDAP and
* aliasedEntryName or X.500.
*/
String ALIAS_ATTRIBUTE = "aliasedObjectName";
/**
* Initializes this partition.
*/
void init( ContextFactoryConfiguration factoryCfg, ContextPartitionConfiguration cfg ) throws NamingException;
/**
* Deinitialized this partition.
*/
void destroy();
/**
* Checks to see if this partition is initialized or not.
*/
boolean isInitialized();
/**
* Flushes any changes made to this partition now.
*/
void sync() throws NamingException;
/**
* Gets the distinguished/absolute name of the suffix for all entries
* stored within this ContextPartition.
*
* @param normalized boolean value used to control the normalization of the
* returned Name. If true the normalized Name is returned, otherwise the
* original user provided Name without normalization is returned.
* @return Name representing the distinguished/absolute name of this
* ContextPartitions root context.
*/
Name getSuffix( boolean normalized ) throws NamingException;
/**
* Deletes a leaf entry from this ContextPartition: non-leaf entries cannot be
* deleted until this operation has been applied to their children.
*
* @param name the normalized distinguished/absolute name of the entry to
* delete from this ContextPartition.
* @throws NamingException if there are any problems
*/
void delete( Name name ) throws NamingException;
/**
* Adds an entry to this ContextPartition.
*
* @param userProvidedName the user provided distinguished/absolute name of the entry
* @param normalizedName the normalized distinguished/absolute name of the entry
* @param entry the entry to add to this ContextPartition
* @throws NamingException if there are any problems
*/
void add( String userProvidedName, Name normalizedName, Attributes entry ) throws NamingException;
/**
* Modifies an entry by adding, removing or replacing a set of attributes.
*
* @param name the normalized distinguished/absolute name of the entry to
* modify
* @param modOp the modification operation to perform on the entry which
* is one of constants specified by the DirContext interface:
* <code>ADD_ATTRIBUTE, REMOVE_ATTRIBUTE, REPLACE_ATTRIBUTE</code>.
* @param attributes the attributes and their values used to affect the
* modification with.
* @throws NamingException if there are any problems
* @see javax.naming.directory.DirContext
* @see javax.naming.directory.DirContext#ADD_ATTRIBUTE
* @see javax.naming.directory.DirContext#REMOVE_ATTRIBUTE
* @see javax.naming.directory.DirContext#REPLACE_ATTRIBUTE
*/
void modify( Name name, int modOp, Attributes attributes ) throws NamingException;
/**
* Modifies an entry by using a combination of adds, removes or replace
* operations using a set of ModificationItems.
*
* @param name the normalized distinguished/absolute name of the entry to modify
* @param items the ModificationItems used to affect the modification with
* @throws NamingException if there are any problems
* @see ModificationItem
*/
void modify( Name name, ModificationItem [] items ) throws NamingException;
/**
* A specialized form of one level search used to return a minimal set of
* information regarding child entries under a base. Convenience method
* used to optimize operations rather than conducting a full search with
* retrieval.
*
* @param baseName the base distinguished/absolute name for the search/listing
* @return a NamingEnumeration containing objects of type {@link SearchResult}
* @throws NamingException if there are any problems
*/
NamingEnumeration list( Name baseName ) throws NamingException;
/**
* Conducts a search against this ContextPartition. Namespace specific
* parameters for search are contained within the environment using
* namespace specific keys into the hash. For example in the LDAP namespace
* a ContextPartition implementation may look for search Controls using a
* namespace specific or implementation specific key for the set of LDAP
* Controls.
*
* @param baseName the normalized distinguished/absolute name of the search base
* @param environment the environment under which operation occurs
* @param filter the root node of the filter expression tree
* @param searchControls the search controls
* @throws NamingException if there are any problems
* @return a NamingEnumeration containing objects of type
* <a href="http://java.sun.com/j2se/1.4.2/docs/api/
* javax/naming/directory/SearchResult.html">SearchResult</a>.
*/
NamingEnumeration search( Name baseName, Map environment, ExprNode filter,
SearchControls searchControls ) throws NamingException;
/**
* Looks up an entry by distinguished/absolute name. This is a simplified
* version of the search operation used to point read an entry used for
* convenience.
*
* @param name the normalized distinguished name of the object to lookup
* @return an Attributes object representing the entry
* @throws NamingException if there are any problems
*/
Attributes lookup( Name name ) throws NamingException;
/**
* Looks up an entry by distinguished/absolute name. This is a simplified
* version of the search operation used to point read an entry used for
* convenience with a set of attributes to return. If the attributes is
* null or empty, the returned entry will contain all attributes.
*
* @param name the normalized distinguished name of the object to lookup
* @param attrIds the set of attributes to return
* @return an Attributes object representing the entry
* @throws NamingException if there are any problems
*/
Attributes lookup( Name name, String [] attrIds ) throws NamingException;
/**
* Fast operation to check and see if a particular entry exists.
*
* @param name the normalized distinguished/absolute name of the object to
* check for existance
* @return true if the entry exists, false if it does not
* @throws NamingException if there are any problems
*/
boolean hasEntry( Name name ) throws NamingException;
/**
* Checks to see if name is a context suffix.
*
* @param name the normalized distinguished/absolute name of the context
* @return true if the name is a context suffix, false if it is not.
* @throws NamingException if there are any problems
*/
boolean isSuffix( Name name ) throws NamingException;
/**
* Modifies an entry by changing its relative name. Optionally attributes
* associated with the old relative name can be removed from the entry.
* This makes sense only in certain namespaces like LDAP and will be ignored
* if it is irrelavent.
*
* @param name the normalized distinguished/absolute name of the entry to
* modify the RN of.
* @param newRn the new RN of the entry specified by name
* @param deleteOldRn boolean flag which removes the old RN attribute
* from the entry if set to true, and has no affect if set to false
* @throws NamingException if there are any problems
*/
void modifyRn( Name name, String newRn, boolean deleteOldRn )
throws NamingException;
/**
* Transplants a child entry, to a position in the namespace under a new
* parent entry.
*
* @param newParentName the normalized distinguished/absolute name of the
* new parent to move the target entry to
* @param oldName the normalized distinguished/absolute name of the
* original child name representing the child entry to move
* @throws NamingException if there are any problems
*/
void move( Name oldName, Name newParentName ) throws NamingException;
/**
* Transplants a child entry, to a position in the namespace under a new
* parent entry and changes the RN of the child entry which can optionally
* have its old RN attributes removed. The removal of old RN attributes
* may not make sense in all namespaces. If the concept is undefined in a
* namespace this parameters is ignored. An example of a namespace where
* this parameter is significant is the LDAP namespace.
*
* @param oldName the normalized distinguished/absolute name of the
* original child name representing the child entry to move
* @param newParentName the normalized distinguished/absolute name of the
* new parent to move the targeted entry to
* @param newRn the new RN of the entry
* @param deleteOldRn boolean flag which removes the old RN attribute
* from the entry if set to true, and has no affect if set to false
* @throws NamingException if there are any problems
*/
void move( Name oldName, Name newParentName, String newRn,
boolean deleteOldRn ) throws NamingException;
}