blob: 00d1d32622edba0b6da1bd13847894c3acddb146 [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.interceptor.context;
import java.util.List;
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.message.Control;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.server.core.api.CoreSession;
import org.apache.directory.server.core.api.LdapPrincipal;
import org.apache.directory.server.core.api.entry.ClonedServerEntry;
/**
* This interface represent the context passed as an argument to each interceptor.
* It will contain data used by all the operations.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public interface OperationContext
{
/**
* @return The number of the current interceptor in the list
*/
int getCurrentInterceptor();
/**
* Sets the current interceptor number to a new value.
*
* @param currentInterceptor The new current interceptor value
*/
void setCurrentInterceptor( int currentInterceptor );
/**
* Gets the effective principal for this operation which may not be the
* same as the authenticated principal when the session for this context
* has an explicit authorization id, or this operation was applied with
* the proxy authorization control.
*
* @see CoreSession#getAuthenticatedPrincipal()
* @see CoreSession#getEffectivePrincipal()
* @return the effective principal for this operation
*/
LdapPrincipal getEffectivePrincipal();
/**
* @return The associated Dn
*/
Dn getDn();
/**
* Set the context Dn
*
* @param dn The Dn to set
*/
void setDn( Dn dn );
/**
* Gets the server entry associated with the target Dn of this
* OperationContext. The entry associated with the Dn may be altered
* during the course of processing an LDAP operation through the
* InterceptorChain. This place holder is put here to prevent the need
* for repetitive lookups of the target entry. Furthermore the returned
* entry may be altered by any Interceptor in the chain and this is why a
* ClonedServerEntry is returned instead of a Entry. A
* ClonedServerEntry has an immutable reference to the original state of
* the target entry. The original state can be accessed via a call to
* {@link ClonedServerEntry#getOriginalEntry()}. The return value may be
* null in which case any lookup performed to access it may set it to
* prevent the need for subsequent lookups.
*
* Also note that during the course of handling some operations such as
* those that rename, move or rename and move the entry, may alter the Dn
* of this entry. Interceptor implementors should not presume the Dn or
* the values contained in this entry are currently what is present in the
* DIT. The original entry contained in the ClonedServerEntry shoudl be
* used as the definitive source of information about the state of the
* entry in the DIT before returning from the Partition subsystem.
*
* @return target entry associated with the Dn of this OperationContext
*/
Entry getEntry();
/**
* Sets the server entry associated with the target Dn of this
* OperationContext.
*
* @param entry the entry whose Dn is associated with this OperationContext.
*/
void setEntry( Entry entry );
/**
* Adds a response control to this operation.
*
* @param responseControl the response control to add to this operation
*/
void addResponseControl( Control responseControl );
/**
* Checks to see if a response control is present on this operation.
*
* @param numericOid the numeric OID of the control also known as it's type OID
* @return true if the control is associated with this operation, false otherwise
*/
boolean hasResponseControl( String numericOid );
/**
* Gets a response control if present for this request.
*
* @param numericOid the numeric OID of the control also known as it's type OID
* @return the control if present
*/
Control getResponseControl( String numericOid );
/**
* Gets all the response controls producted during this operation.
*
* @return an array over all the response controls
*/
Control[] getResponseControls();
/**
* Checks if any response controls have been generated for this operation.
*
* @return true if any response controls have been generated, false otherwise
*/
boolean hasResponseControls();
/**
* Checks the number of response controls have been generated for this operation.
*
* @return the number of response controls that have been generated
*/
int getResponseControlCount();
/**
* Adds a request control to this operation.
*
* @param requestControl the request control to add to this operation
*/
void addRequestControl( Control requestControl );
/**
* Checks to see if a request control is present on this request.
*
* @param numericOid the numeric OID of the control also known as it's type OID
* @return true if the control is associated with this operation, false otherwise
*/
boolean hasRequestControl( String numericOid );
/**
* Checks if any request controls exists for this operation.
*
* @return true if any request controls exist, false otherwise
*/
boolean hasRequestControls();
/**
* Gets a request control if present for this request.
*
* @param numericOid the numeric OID of the control also known as it's type OID
* @return the control if present
*/
Control getRequestControl( String numericOid );
/**
* Adds many request controls to this operation.
*
* @param requestControls the request controls to add to this operation
*/
void addRequestControls( Control[] requestControls );
/**
* @return the operation's name
*/
String getName();
/**
* Gets the next interceptor in the list of interceptors. The
* position in the list will be incremented.
*
* @return The next interceptor from the list of interceptors
*/
String getNextInterceptor();
/**
* Sets the list of interceptors to go through for an operation
*
* @param interceptors The list of interceptors
*/
void setInterceptors( List<String> interceptors );
/**
* Gets the session associated with this operation.
*
* @return the session associated with this operation
*/
CoreSession getSession();
// -----------------------------------------------------------------------
// Utility Factory Methods to Create New OperationContexts
// -----------------------------------------------------------------------
LookupOperationContext newLookupContext( Dn dn, String... attributes );
Entry lookup( LookupOperationContext lookupContext ) throws LdapException;
/**
* Process the delete for inner operations. This is only valid for SubschemaSubentry
* operations, and will most certainly be removed later.
*
* @param dn
* @throws LdapException
*/
void delete( Dn dn ) throws LdapException;
/**
* Set the throwReferral flag to true
*/
void throwReferral();
/**
* @return <code>true</code> if the referrals are thrown
*/
boolean isReferralThrown();
/**
* Set the throwReferral flag to false
*/
void ignoreReferral();
/**
* @return <code>true</code> if the referrals are ignored
*/
boolean isReferralIgnored();
}