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

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

import javax.xml.namespace.QName;

/**
 * Reference.
 * <p/>
 * 
 * @author Davanum Srinivas (dims@yahoo.com).
 */
public class Reference {
    public static final QName TOKEN =
        new QName(WSConstants.WSSE_NS, "Reference");
    protected Element element = null;

    /**
     * Constructor.
     * <p/>
     * 
     * @param elem 
     * @throws WSSecurityException 
     */
    public Reference(Element elem) throws WSSecurityException {
        if (elem == null) {
            throw new WSSecurityException(
                WSSecurityException.INVALID_SECURITY,
                "noReference");
        }
        this.element = elem;
        QName el =
            new QName(
                this.element.getNamespaceURI(),
                this.element.getLocalName());
        if (!el.equals(TOKEN)) {
            throw new WSSecurityException(
                WSSecurityException.FAILURE,
                "badElement",
                new Object[] { TOKEN, el });
        }
    }

    /**
     * Constructor.
     * <p/>
     * 
     * @param doc 
     */
    public Reference(Document doc) {
        this.element =
            doc.createElementNS(WSConstants.WSSE_NS, "wsse:Reference");
        WSSecurityUtil.setNamespace(this.element, WSConstants.WSSE_NS, WSConstants.WSSE_PREFIX);
    }

    /**
     * get the dom element.
     * <p/>
     * 
     * @return TODO
     */
    public Element getElement() {
        return this.element;
    }

    /**
     * get the URI.
     * <p/>
     * 
     * @return TODO
     */
    public String getValueType() {
        return this.element.getAttributeNS(null, "ValueType");
    }

    /**
     * get the URI.
     * <p/>
     * 
     * @return TODO
     */
    public String getURI() {
        return this.element.getAttributeNS(null, "URI");
    }

    /**
     * set the Value type.
     * <p/>
     * 
     * @param valueType
     */
    public void setValueType(String valueType) {
        this.element.setAttributeNS(null, "ValueType", valueType);
    }

    /**
     * set the URI.
     * <p/>
     * 
     * @param uri 
     */
    public void setURI(String uri) {
        this.element.setAttributeNS(null, "URI", uri);
    }

    /**
     * return the string representation.
     * <p/>
     * 
     * @return TODO
     */
    public String toString() {
        return DOM2Writer.nodeToString((Node) this.element);
    }
}
