/*
 * Copyright 2004,2005 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.ws.commons.soap;

import org.apache.ws.commons.om.OMElement;

/**
 * <P>An object representing the contents in the SOAP header part of the SOAP
 * envelope. The immediate children of a <CODE> SOAPHeader</CODE> object can be
 * represented only as <CODE> SOAPHeaderBlock</CODE> objects.</P> <P>B
 * <CODE>SOAPHeaderBlock</CODE> object can have other <CODE>OMElement</CODE>
 * objects as its children.</P>
 */
public interface SOAPHeaderBlock extends OMElement {
    /**
     * Sets the actor associated with this <CODE> SOAPHeaderBlock</CODE> object
     * to the specified actor.
     *
     * @param roleURI a <CODE>String</CODE> giving the URI of the actor to set
     * @throws java.lang.IllegalArgumentException
     *          if there is a problem in setting the actor.
     * @see #getRole() getRole()
     */
    public abstract void setRole(String roleURI);

    /**
     * Returns the uri of the actor associated with this <CODE>
     * SOAPHeaderBlock</CODE> object.
     *
     * @return a <CODE>String</CODE> giving the URI of the actor
     * @see #setRole(java.lang.String) setRole(java.lang.String)
     */
    public abstract String getRole();

    /**
     * Sets the mustUnderstand attribute for this <CODE> SOAPHeaderBlock</CODE>
     * object to be on or off. <P>If the mustUnderstand attribute is on, the
     * actor who receives the <CODE>SOAPHeaderBlock</CODE> must process it
     * correctly. This ensures, for example, that if the <CODE>
     * SOAPHeaderBlock</CODE> object modifies the message, that the message is
     * being modified correctly.</P>
     *
     * @param mustUnderstand <CODE>true</CODE> to set the mustUnderstand
     *                       attribute on; <CODE>false</CODE> to turn if off
     * @throws java.lang.IllegalArgumentException
     *          if there is a problem in setting the actor.
     * @see #getMustUnderstand() getMustUnderstand()
     */
    public abstract void setMustUnderstand(boolean mustUnderstand);

    public abstract void setMustUnderstand(String mustUnderstand) throws SOAPProcessingException;

    /**
     * Returns whether the mustUnderstand attribute for this
     * <CODE>SOAPHeaderBlock</CODE> object is turned on.
     *
     * @return <CODE>true</CODE> if the mustUnderstand attribute of this
     *         <CODE>SOAPHeaderBlock</CODE> object is turned on;
     *         <CODE>false</CODE> otherwise
     */
    public abstract boolean getMustUnderstand() throws SOAPProcessingException;


    public abstract boolean isProcessed();

    /**
     * We need to know whether all the mustUnderstand headers have been
     * processed by the node. This will done by a specific validation handler at
     * the end of the execution chain. For this all the handlers who process a
     * particular header block must explicitly say that he processesd the header
     * by calling setProcessed()
     */
    public abstract void setProcessed();

}
