/*
 * Copyright  2003-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.ws.security.message;

import org.apache.ws.security.SOAPConstants;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.util.WSSecurityUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * This class implements WS Security header.
 * 
 * Setup a Security header with a specified actor and mustunderstand flag.
 * 
 * <p/>
 * 
 * The defaults for actor and mustunderstand are: empty <code>actor</code> and
 * <code>mustunderstand</code> is true.
 * 
 * @author Werner Dittmann (Werner.Dittmann@apache.org)
 */
public class WSSecHeader {
    protected String actor = null;

    protected boolean mustunderstand = true;

    protected boolean doDebug = false;

    private Element securityHeader = null;

    /**
     * Constructor.
     */
    public WSSecHeader() {
    }

    /**
     * Constructor.
     * 
     * @param actor
     *            The actor name of the <code>wsse:Security</code> header
     */
    public WSSecHeader(String actor) {
        this(actor, true);
    }

    /**
     * Constructor.
     * 
     * @param act
     *            The actor name of the <code>wsse:Security</code> header
     * @param mu
     *            Set <code>mustUnderstand</code> to true or false
     */
    public WSSecHeader(String act, boolean mu) {
        actor = act;
        mustunderstand = mu;
    }

    /**
     * set actor name.
     * 
     * @param act
     *            The actor name of the <code>wsse:Security</code> header
     */
    public void setActor(String act) {
        actor = act;
    }

    /**
     * Set the <code>mustUnderstand</code> flag for the
     * <code>wsse:Security</code> header.
     * 
     * @param mu
     *            Set <code>mustUnderstand</code> to true or false
     */
    public void setMustUnderstand(boolean mu) {
        mustunderstand = mu;
    }

    /**
     * Get the security header element of this instance.
     * 
     * @return The security header element.
     */
    public Element getSecurityHeader() {
        return securityHeader;
    }
    
    /**
     * Returns whether the security header is empty
     * 
     * @return true if empty or if there is no security header
     *         false if non empty security header
     */
    public boolean isEmpty(Document doc) {
        
        if (securityHeader == null) {            
            securityHeader = WSSecurityUtil.findWsseSecurityHeaderBlock(doc, doc
                    .getDocumentElement(), actor, false);
            if ( securityHeader == null ) {
                return true;
            }
        }
        
        if ( securityHeader.getChildNodes().getLength() == 0 ) {
            return true;
        } else {
            return false;
        }

        
    }

    /**
     * Creates a security header and inserts it as child into the SOAP Envelope.
     * 
     * <p/>
     * 
     * Check if a WS Security header block for an actor is already available in
     * the document. If a header block is found return it, otherwise a new
     * wsse:Security header block is created and the attributes set
     * 
     * @param doc
     *            A SOAP envelope as <code>Document</code>
     * @return A <code>wsse:Security</code> element
     */
    public Element insertSecurityHeader(Document doc) {

        /*
         * If there is already a security header in this instance just return it
         */
        if (securityHeader != null) {
            return securityHeader;
        }
        SOAPConstants soapConstants = WSSecurityUtil.getSOAPConstants(doc
                .getDocumentElement());

        securityHeader = WSSecurityUtil.findWsseSecurityHeaderBlock(doc, doc
                .getDocumentElement(), actor, true);

        String soapPrefix = WSSecurityUtil.getPrefixNS(soapConstants
                .getEnvelopeURI(), securityHeader);
        if (actor != null && actor.length() > 0) {
            securityHeader.setAttributeNS(soapConstants.getEnvelopeURI(),
                    soapPrefix
                            + ":"
                            + soapConstants.getRoleAttributeQName()
                                    .getLocalPart(), actor);
        }
        if (mustunderstand) {
            securityHeader.setAttributeNS(soapConstants.getEnvelopeURI(),
                    soapPrefix + ":" + WSConstants.ATTR_MUST_UNDERSTAND,
                    soapConstants.getMustUnderstand());
        }
        return securityHeader;
    }
    
    public void removeSecurityHeader(Document doc) {
        
        if (securityHeader == null) {            
            securityHeader = WSSecurityUtil.findWsseSecurityHeaderBlock(doc, doc
                    .getDocumentElement(), actor, false);
            if ( securityHeader == null ) {
                return;
            }
        }
        
        Node parent = securityHeader.getParentNode();
        parent.removeChild(securityHeader);
    }
    
}
