/*
 *  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.interceptor.context;


import java.util.Collection;
import java.util.List;

import javax.naming.ldap.Control;

import org.apache.directory.server.core.CoreSession;
import org.apache.directory.server.core.LdapPrincipal;
import org.apache.directory.server.core.entry.ClonedServerEntry;
import org.apache.directory.server.core.entry.ServerEntry;
import org.apache.directory.server.core.interceptor.Interceptor;
import org.apache.directory.shared.ldap.entry.Modification;
import org.apache.directory.shared.ldap.name.LdapDN;


/**
 * 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>
 * @version $Rev$, $Date$
 */
public interface OperationContext
{
    /**
     * Checks to see if this operation is the first operation in a chain of 
     * operations performed on the DirectoryService.  The first operation in  
     * a sequence of operations, is not a byproduct of another operation 
     * unlike operations following in the sequence.  The other operations 
     * following the first, occur as a side effect to complete this first 
     * operation.
     * 
     * @return true if the operation is the first, false otherwise
     */
    boolean isFirstOperation();
    
    
    /**
     * Gets the first, direct operation issued against the DirectoryService.
     *
     * @return the first, direct operation issued 
     */
    OperationContext getFirstOperation();
    
    
    /**
     * Gets the previous, operation issued on the DirectoryService.
     *
     * @return the previous, operation issued
     */
    OperationContext getPreviousOperation();
    
    
    /**
     * Gets the next, indirect operation issued on the DirectoryService.
     *
     * @return the next, indirect operation issued 
     */
    OperationContext getNextOperation();
    
    
    /**
     * Gets the last, operation issued on the DirectoryService.
     *
     * @return the last, operation issued
     */
    OperationContext getLastOperation();


    /**
     * 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
     */
    LdapDN getDn();
    
    
    /**
     * Set the context DN
     *
     * @param dn The DN to set
     */
    void setDn( LdapDN 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 ServerEntry.  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
     */
    ClonedServerEntry 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( ClonedServerEntry 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();
    
    
    /**
     * Checks to see if an Interceptor is bypassed for this operation.
     *
     * @param interceptorName the interceptorName of the Interceptor to check for bypass
     * @return true if the Interceptor should be bypassed, false otherwise
     */
    boolean isBypassed( String interceptorName );


    /**
     * Checks to see if any Interceptors are bypassed by this Invocation.
     *
     * @return true if at least one bypass exists
     */
    boolean hasBypass();
    
    
    /**
     * Gets the set of bypassed Interceptors.
     *
     * @return the set of bypassed Interceptors
     */
    Collection<String> getByPassed();
    
    
    /**
     * Sets the set of bypassed Interceptors.
     * 
     * @param byPassed the set of bypassed Interceptors
     */
    void setByPassed( Collection<String> byPassed );
    
    
    /**
     * 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( LdapDN dn );

    
    ClonedServerEntry lookup( LdapDN dn, Collection<String> byPass ) throws Exception;
    
    
    ClonedServerEntry lookup( LookupOperationContext lookupContext ) throws Exception;
    
    
    void modify( LdapDN dn, List<Modification> mods, Collection<String> byPass ) throws Exception;
    
    
    void add( ServerEntry entry, Collection<String> byPass ) throws Exception;
    
    
    void delete( LdapDN dn, Collection<String> byPass ) throws Exception;


    /**
     * Checks to see if an entry exists.
     *
     * @param dn the distinguished name of the entry to check
     * @param byPass collection of {@link Interceptor}'s to bypass for this check
     * @return true if the entry exists, false if it does not
     * @throws Exception on failure to perform this operation
     */
    boolean hasEntry( LdapDN dn, Collection<String> byPass ) throws Exception;
    
    
    /**
     * 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();
}
