blob: d7b201c6b60a3e6f04f4497cef43ee899e58974d [file] [log] [blame]
/*
* 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.api.partition;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
import org.apache.directory.api.ldap.model.entry.Entry;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.api.ldap.model.schema.SchemaManager;
import org.apache.directory.server.core.api.CacheService;
import org.apache.directory.server.core.api.filtering.EntryFilteringCursor;
import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
import org.apache.directory.server.core.api.interceptor.context.DeleteOperationContext;
import org.apache.directory.server.core.api.interceptor.context.HasEntryOperationContext;
import org.apache.directory.server.core.api.interceptor.context.LookupOperationContext;
import org.apache.directory.server.core.api.interceptor.context.ModifyOperationContext;
import org.apache.directory.server.core.api.interceptor.context.MoveAndRenameOperationContext;
import org.apache.directory.server.core.api.interceptor.context.MoveOperationContext;
import org.apache.directory.server.core.api.interceptor.context.RenameOperationContext;
import org.apache.directory.server.core.api.interceptor.context.SearchOperationContext;
import org.apache.directory.server.core.api.interceptor.context.UnbindOperationContext;
/**
* Interface for entry stores containing a part of the DIB (Directory
* Information Base). Partitions are associated with a specific suffix, and
* all entries contained in the them have the same Dn suffix in common.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public interface Partition
{
/** root ID common to all partitions */
String ROOT_ID = new UUID( 0L, 0L ).toString();
/** Default id used for context entry if context entry doesn't exists */
String DEFAULT_ID = new UUID( 0L, 1L ).toString();
// -----------------------------------------------------------------------
// C O N F I G U R A T I O N M E T H O D S
// -----------------------------------------------------------------------
/**
* Gets the unique identifier for this partition.
*
* @return the unique identifier for this partition
*/
String getId();
/**
* Sets the unique identifier for this partition.
*
* @param id the unique identifier for this partition
*/
void setId( String id );
/**
* Gets the schema manager assigned to this Partition.
*
* @return the schema manager
*/
SchemaManager getSchemaManager();
/**
* Sets the schema manager assigned to this Partition.
*
* @param registries the manager to assign to this Partition.
*/
void setSchemaManager( SchemaManager schemaManager );
// -----------------------------------------------------------------------
// E N D C O N F I G U R A T I O N M E T H O D S
// -----------------------------------------------------------------------
/**
* Initializes this partition. {@link #isInitialized()} will return <tt>true</tt> if
* {@link #doInit()} returns without any errors. {@link #destroy()} is called automatically
* as a clean-up process if {@link #doInit()} throws an exception.
*
* @throws Exception if initialization fails in any way
*/
void initialize() throws LdapException;
/**
* Gets the normalized suffix as an Dn for this Partition after it has
* been initialized. Attempts to get this Dn before initialization
* throw an IllegalStateException.
*
* @return the suffix for this Partition.
* @throws IllegalStateException if the Partition has not been initialized
*/
Dn getSuffixDn();
/**
* Sets the suffix Dn, must be normalized.
*
* @param suffixDn the new suffix Dn
*/
void setSuffixDn( Dn suffixDn ) throws LdapInvalidDnException;
/**
* Instructs this Partition to synchronize with it's persistent store, and
* destroy all held resources, in preparation for a shutdown event.
*/
void destroy() throws Exception;
/**
* Checks to see if this partition is initialized or not.
* @return true if the partition is initialized, false otherwise
*/
boolean isInitialized();
/**
* Flushes any changes made to this partition now.
* @throws Exception if buffers cannot be flushed to disk
*/
void sync() throws Exception;
/**
* Deletes a leaf entry from this ContextPartition: non-leaf entries cannot be
* deleted until this operation has been applied to their children.
*
* @param deleteContext the context of the entry to
* delete from this ContextPartition.
* @return The delete Entry, if found
* @throws Exception if there are any problems
*/
Entry delete( DeleteOperationContext deleteContext ) throws LdapException;
/**
* Adds an entry to this ContextPartition.
*
* @param addContext the context used to add and entry to this ContextPartition
* @throws LdapException if there are any problems
*/
void add( AddOperationContext addContext ) throws LdapException;
/**
* Modifies an entry by adding, removing or replacing a set of attributes.
*
* @param modifyContext The context containing 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>.
*
* @throws Exception 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( ModifyOperationContext modifyContext ) throws LdapException;
/**
* 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 searchContext The context containing the information used by the operation
* @throws Exception if there are any problems
* @return a NamingEnumeration containing objects of type
*/
EntryFilteringCursor search( SearchOperationContext searchContext ) throws LdapException;
/**
* 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.
*
* Depending on the context parameters, we my look for a simple entry,
* or for a restricted set of attributes for this entry
*
* @param lookupContext The context containing the parameters
* @return an Attributes object representing the entry
* @throws Exception if there are any problems
*/
Entry lookup( LookupOperationContext lookupContext ) throws LdapException;
/**
* Fast operation to check and see if a particular entry exists.
*
* @param hasEntryContext The context used to pass informations
* @return true if the entry exists, false if it does not
* @throws Exception if there are any problems
*/
boolean hasEntry( HasEntryOperationContext hasEntryContext ) throws LdapException;
/**
* 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 irrelevant.
*
* @param renameContext the modify Dn context
* @throws Exception if there are any problems
*/
void rename( RenameOperationContext renameContext ) throws LdapException;
/**
* Transplants a child entry, to a position in the namespace under a new
* parent entry.
*
* @param moveContext The context containing the DNs to move
* @throws Exception if there are any problems
*/
void move( MoveOperationContext moveContext ) throws LdapException;
/**
* 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 moveAndRenameContext The context contain all the information about
* the modifyDN operation
* @throws Exception if there are any problems
*/
void moveAndRename( MoveAndRenameOperationContext moveAndRenameContext ) throws LdapException;
/**
* Represents an unbind operation issued by an authenticated client. Partitions
* need not support this operation. This operation is here to enable those
* interested in implementing virtual directories with ApacheDS.
*
* @param unbindContext the context used to unbind
* @throws Exception if something goes wrong
*/
void unbind( UnbindOperationContext unbindContext ) throws LdapException;
/**
* Dump the requested index to a given stream
* @param name The index to dump to stdout
* @throws IOException if we can't write the data
*/
void dumpIndex( OutputStream stream, String name ) throws IOException;
/**
* set the Cache service
*
* @param cacheService
*/
void setCacheService( CacheService cacheService );
/**
* @return the current highest committed CSN value
*/
String getContextCsn();
/**
* saves the context CSN value in the context entry of the partition
* @throws Exception
*/
void saveContextCsn() throws Exception;
}