/*
 * 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.camel.component.xmlsecurity.processor;

import java.util.Map;

import javax.xml.crypto.URIDereferencer;
import javax.xml.crypto.XMLCryptoContext;
import javax.xml.crypto.dsig.XMLSignContext;
import javax.xml.crypto.dsig.XMLValidateContext;

import org.apache.camel.CamelContext;
import org.apache.camel.CamelContextAware;
import org.apache.camel.component.xmlsecurity.api.XmlSignatureConstants;
import org.apache.camel.spi.UriParam;
import org.apache.camel.spi.UriParams;

@UriParams
public abstract class XmlSignatureConfiguration implements Cloneable, CamelContextAware {

    private CamelContext context;
    @UriParam(label = "common")
    private String baseUri;
    @UriParam(label = "common")
    private Map<String, ?> cryptoContextProperties;
    @UriParam(label = "common", defaultValue = "true")
    private Boolean disallowDoctypeDecl = Boolean.TRUE;
    @UriParam(label = "common", defaultValue = "false")
    private Boolean omitXmlDeclaration = Boolean.FALSE;
    @UriParam(label = "common", defaultValue = "true")
    private Boolean clearHeaders = Boolean.TRUE;
    @UriParam(label = "common")
    private String schemaResourceUri;
    @UriParam(label = "common")
    private String outputXmlEncoding;
    @UriParam(label = "advanced")
    private URIDereferencer uriDereferencer;

    public XmlSignatureConfiguration() {
    }

    @Override
    public CamelContext getCamelContext() {
        return context;
    }

    @Override
    public void setCamelContext(CamelContext camelContext) {
        this.context = camelContext;
    }

    public URIDereferencer getUriDereferencer() {
        return uriDereferencer;
    }

    /**
     * If you want to restrict the remote access via reference URIs, you can set
     * an own dereferencer. Optional parameter. If not set the provider default
     * dereferencer is used which can resolve URI fragments, HTTP, file and
     * XPpointer URIs.
     * <p>
     * Attention: The implementation is provider dependent!
     * 
     * @see XMLCryptoContext#setURIDereferencer(URIDereferencer)
     */
    public void setUriDereferencer(URIDereferencer uriDereferencer) {
        this.uriDereferencer = uriDereferencer;
    }

    public String getBaseUri() {
        return baseUri;
    }

    /**
     * You can set a base URI which is used in the URI dereferencing. Relative
     * URIs are then concatenated with the base URI.
     *
     * @see XMLCryptoContext#setBaseURI(String)
     */
    public void setBaseUri(String baseUri) {
        this.baseUri = baseUri;
    }

    public Map<String, ? extends Object> getCryptoContextProperties() {
        return cryptoContextProperties;
    }

    /**
     * Sets the crypto context properties. See
     * {@link XMLCryptoContext#setProperty(String, Object)}. Possible properties
     * are defined in {@link XMLSignContext} an {@link XMLValidateContext} (see
     * Supported Properties).
     * <p>
     * The following properties are set by default to the value
     * {@link Boolean#TRUE} for the XML validation. If you want to switch these
     * features off you must set the property value to {@link Boolean#FALSE}.
     * <ul>
     * <li><code>"org.jcp.xml.dsig.validateManifests"</code></li>
     * <li><code>"javax.xml.crypto.dsig.cacheReference"</code></li>
     * </ul>
     */
    public void setCryptoContextProperties(Map<String, ? extends Object> cryptoContextProperties) {
        this.cryptoContextProperties = cryptoContextProperties;
    }

    public Boolean getDisallowDoctypeDecl() {
        return disallowDoctypeDecl;
    }

    /**
     * Disallows that the incoming XML document contains DTD DOCTYPE
     * declaration. The default value is {@link Boolean#TRUE}.
     * 
     * @param disallowDoctypeDecl if set to {@link Boolean#FALSE} then DOCTYPE declaration is allowed, otherwise not
     */
    public void setDisallowDoctypeDecl(Boolean disallowDoctypeDecl) {
        this.disallowDoctypeDecl = disallowDoctypeDecl;
    }

    public Boolean getOmitXmlDeclaration() {
        return omitXmlDeclaration;
    }

    /**
     * Indicator whether the XML declaration in the outgoing message body should
     * be omitted. Default value is <code>false</code>. Can be overwritten by
     * the header {@link XmlSignatureConstants#HEADER_OMIT_XML_DECLARATION}.
     */
    public void setOmitXmlDeclaration(Boolean omitXmlDeclaration) {
        this.omitXmlDeclaration = omitXmlDeclaration;
    }

    /**
     * Determines if the XML signature specific headers be cleared after signing
     * and verification. Defaults to true.
     * 
     * @return true if the Signature headers should be unset, false otherwise
     */
    public Boolean getClearHeaders() {
        return clearHeaders;
    }

    /**
     * Determines if the XML signature specific headers be cleared after signing
     * and verification. Defaults to true.
     */
    public void setClearHeaders(Boolean clearHeaders) {
        this.clearHeaders = clearHeaders;
    }

    public String getSchemaResourceUri() {
        return schemaResourceUri;
    }

    /**
     * Classpath to the XML Schema. Must be specified in the detached XML
     * Signature case for determining the ID attributes, might be set in the
     * enveloped and enveloping case. If set, then the XML document is validated
     * with the specified XML schema. The schema resource URI can be overwritten
     * by the header {@link XmlSignatureConstants#HEADER_SCHEMA_RESOURCE_URI}.
     */
    public void setSchemaResourceUri(String schemaResourceUri) {
        this.schemaResourceUri = schemaResourceUri;
    }
    
    public String getOutputXmlEncoding() {
        return outputXmlEncoding;
    }

    /**
     * The character encoding of the resulting signed XML document. If
     * <code>null</code> then the encoding of the original XML document is used.
     */
    public void setOutputXmlEncoding(String outputXmlEncoding) {
        this.outputXmlEncoding = outputXmlEncoding;
    }

}
