/*
 * 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.axis2.wsdl.util;


import org.apache.axis2.Constants;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.wsdl.Binding;
import javax.wsdl.BindingFault;
import javax.wsdl.BindingInput;
import javax.wsdl.BindingOperation;
import javax.wsdl.BindingOutput;
import javax.wsdl.Definition;
import javax.wsdl.Fault;
import javax.wsdl.Import;
import javax.wsdl.Input;
import javax.wsdl.Message;
import javax.wsdl.Operation;
import javax.wsdl.Output;
import javax.wsdl.Part;
import javax.wsdl.Port;
import javax.wsdl.PortType;
import javax.wsdl.Service;
import javax.wsdl.Types;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.ExtensionRegistry;
import javax.xml.namespace.QName;
import java.net.URL;
import java.util.List;
import java.util.Map;


/**
 * There are cases where a WSDL definition is kept in memory
 * in case it needs to be accessed during runtime.  In situations where 
 * there are lots of WSDL definitions or big WSDLs, the memory footprint can be 
 * huge.
 *
 * This class provides support for processing a WSDL4J definition
 * with a lower memory footprint.  This is useful for certain
 * environments.
 *
 * This class makes the decision on which implementation to use
 * to reduce memory footprint.  This allows other implementations
 * to be used for specific environments without adding lots of extra
 * overhead to every environment.
 *
 */
public class WSDLDefinitionWrapper implements Definition {

    private static final Log log = LogFactory.getLog(WSDLDefinitionWrapper.class);
    private static final boolean isDebugEnabled = log.isDebugEnabled();
    private static final String myClassName = "WSDLDefinitionWrapper";

    // javax.wsdl.Definition implements java.io.Serializable
    static final long serialVersionUID = -2788807375814097409L;


    // the setting used to indicate whether the in-memory copy of the 
    // WSDL definition should be manipulated to reduce memory footprint
    private boolean reduceWSDLMemoryCache = false;

    // the optional setting used to specify which type of reduction to use
    private int reduceWSDLMemoryType = 0;

    // the wrapper implementation to use 
    private WSDLWrapperImpl wrapperImpl = null;


    //-------------------------------------------------------------------------
    // constructors
    //-------------------------------------------------------------------------

    /**
     * Constructor
     * 
     * @param def    The WSDL Definition
     * @deprecated because this constructor does not provide any guidance for 
     * memory usage
     */
    public WSDLDefinitionWrapper(Definition def) {
        if (log.isDebugEnabled() ) {
            log.debug("WSDLDefinitionWrapper(Definition) entry");
        }
        prepare(def, null);
    }
    
    /**
     * @param def
     * @param limitMemory true if you want to use a memory sensitive wrapper
     */
    public WSDLDefinitionWrapper(Definition def, boolean limitMemory, int memoryType) {
        if (log.isDebugEnabled() ) {
            log.debug("WSDLDefinitionWrapper(Definition, boolean) entry");
        }
        reduceWSDLMemoryCache  = limitMemory;
        reduceWSDLMemoryType = memoryType;
        prepare(def, null);
    }

    /**
     * @param def WDDL Definition
     * @param axisConfig Axis Configuration
     */
    public WSDLDefinitionWrapper(Definition def,AxisConfiguration axisConfig ) {
        if (log.isDebugEnabled() ) {
            log.debug("WSDLDefinitionWrapper(Definition,AxisConfiguration) entry ");
        }
        setupMemoryParms(axisConfig);
        prepare(def, null);
    }

    /**
     * Constructor
     * 
     * @param def    The WSDL Definition
     * @param wURL   The URL for the wsdl
     * @deprecated use a constructor with a AxisConfiguration or memory limit parameter
     */
    public WSDLDefinitionWrapper(Definition def, URL wURL) {
        if (log.isDebugEnabled() ) {
            log.debug("WSDLDefinitionWrapper(Definition,URL) entry");
        }
        prepare(def, wURL);
    }


    /**
     * Constructor
     * 
     * @param def    The WSDL Definition
     * @param wURL   The URL for the wsdl
     * @param limitInMemory  The setting indicating whether the in-memory WSDL copy
     *                       should be manipulated to reduce memory footprint
     */
    public WSDLDefinitionWrapper(Definition def, URL wURL, boolean limitInMemory) {
        reduceWSDLMemoryCache = limitInMemory;
        if (log.isDebugEnabled() ) {
            log.debug("WSDLDefinitionWrapper(Definition,URL,boolean) entry");
        }
        prepare(def, wURL);
    }
    
    /**
     * Constructor
     * 
     * @param def    The WSDL Definition
     * @param wURL   The URL for the wsdl
     * @param limitInMemory  The setting indicating whether the in-memory WSDL copy
     *                       should be manipulated to reduce memory footprint
     * @param memoryType
     */
    public WSDLDefinitionWrapper(Definition def, URL wURL, boolean limitInMemory, int memoryType) {
        reduceWSDLMemoryCache = limitInMemory;
        this.reduceWSDLMemoryType = memoryType;
        if (log.isDebugEnabled() ) {
            log.debug("WSDLDefinitionWrapper(Definition,URL,boolean) entry");
        }
        prepare(def, wURL);
    }


    /**
     * Constructor
     * 
     * @param def    The WSDL Definition
     * @param wURL   The URL for the wsdl
     * @param limitType  The setting indicating which reduction technique
     *                   to use 
     */
    public WSDLDefinitionWrapper(Definition def, URL wURL, int limitType) {
        reduceWSDLMemoryCache = true;
        reduceWSDLMemoryType = limitType;
        if (log.isDebugEnabled() ) {
            log.debug("WSDLDefinitionWrapper(Definition,URL,int) entry");
        }
        prepare(def, wURL);
    }


    /**
     * Constructor
     * 
     * @param def    The WSDL Definition
     * @param wURL   The URL for the wsdl
     * @param axisCfg  The AxisConfiguration object, to be used to get configuration settings  
     */
    public WSDLDefinitionWrapper(Definition def, URL wURL, AxisConfiguration axisCfg) {
        if (log.isDebugEnabled() ) {
            log.debug("WSDLDefinitionWrapper(Definition,URL,AxisConfiguration) entry");
        }

        // determine what the setting for the memory optimization is
        setupMemoryParms(axisCfg);
        prepare(def, wURL);
    }



    private void setupMemoryParms( AxisConfiguration axisCfg) {
        if (log.isDebugEnabled() ) {
            log.debug("setupMemoryParms(AxisConfiguration) entry");
        }

        // determine what the setting for the memory optimization is
        if (axisCfg != null) {
            Parameter param = axisCfg.getParameter(Constants.Configuration.REDUCE_WSDL_MEMORY_CACHE);
                
            reduceWSDLMemoryCache = 
                param != null && ((String) param.getValue()).equalsIgnoreCase("true");


            param = axisCfg.getParameter(Constants.Configuration.REDUCE_WSDL_MEMORY_TYPE);
                
            if (param != null) {
                String value = (String) param.getValue();

                if (value != null) {
                    Integer i = new Integer(value);
                    reduceWSDLMemoryType = i.intValue(); 
                }
            }
            if (log.isDebugEnabled() ) {
                log.debug("reduceWSDLMemoryCache:"+ reduceWSDLMemoryCache + ", reduceWSDLMemoryType:" + reduceWSDLMemoryType );
            }
        } else {
            if (log.isDebugEnabled() ) {
                log.debug("AxisConfiguration is null.  This is unexpected" );
            }
        }
        
    }


    /**
     * Initialize the wsdl definition wrapper
     * 
     * @param def    The WSDL4J definition
     * @param wURL   The URL where the WSDL is obtained
     */
    private void prepare(Definition def, URL wURL) {
        
        if (reduceWSDLMemoryCache) {

            // if the type is specified, then use it
            // otherwise, default to the serialization technique

            if (reduceWSDLMemoryType == 2) {
                // a wrapper implementation that uses release & reload on the 
                // underlying WSDL4J object
                // this would be desirable for those environments where 
                // many of the WSDL definitions are not serializable 
                wrapperImpl = new WSDLWrapperReloadImpl(def, wURL);
            }
            else {
                // a wrapper implementation that uses serialization to save the  
                // underlying WSDL4J object
                wrapperImpl = new WSDLWrapperSaveImpl(def, wURL);
            }
        }
        else {
            // a wrapper implementation that is just a passthrough to the 
            // underlying WSDL4J object
            wrapperImpl = new WSDLWrapperBasicImpl(def, wURL);
        }

        wrapperImpl.releaseResources();
    }


    //-------------------------------------------------------------------------
    // public WSDLDefinitionWrapper methods
    //-------------------------------------------------------------------------

    /*
     * Returns the WSDL4J Definition object that is being wrapped
     */
    public Definition getUnwrappedDefinition() {

        return wrapperImpl.getUnwrappedDefinition();
    }
    
    public int getMemoryLimitType() {
        return this.reduceWSDLMemoryType;
    }


    //-------------------------------------------------------------------------
    // javax.wsdl.Defintion interface methods
    //-------------------------------------------------------------------------

    public void setDocumentBaseURI(String d) {
        // Set the URI of the base document for the Definition.
        // This identifies the origin of the Definition.
        // Note that this is the URI of the base document, not the imports.

        wrapperImpl.setDocumentBaseURI(d);
    }

    public String getDocumentBaseURI() {
        // Get the URI of the base document for the Definition.
        // This identifies the origin of the Definition.
        // Note that this is the URI of the base document, not the imports.

        return wrapperImpl.getDocumentBaseURI();
    }

    public void setQName(QName n) {
        wrapperImpl.setQName(n);
    }

    public QName getQName() {
        return wrapperImpl.getQName();
    }

    public void setTargetNamespace(String t) {
        wrapperImpl.setTargetNamespace(t);
    }

    public String getTargetNamespace() {
        return wrapperImpl.getTargetNamespace();
    }

    public void addNamespace(String prefix, String namespaceURI) {
        wrapperImpl.addNamespace(prefix, namespaceURI);
    }

    public String removeNamespace(String prefix) {
        return wrapperImpl.removeNamespace(prefix);
    }

    public String getNamespace(String prefix) {
        return wrapperImpl.getNamespace(prefix);
    }

    public String getPrefix(String namespaceURI) {
        return wrapperImpl.getPrefix(namespaceURI);
    }

    public Map getNamespaces() {
        return wrapperImpl.getNamespaces();
    }

    public List getNativeAttributeNames() {
        return wrapperImpl.getNativeAttributeNames();
    }

    public void setTypes(Types types) {
        wrapperImpl.setTypes(types);
    }


    public Types getTypes() {
        return wrapperImpl.getTypes();
    }

    public void addImport(Import importDef) {
        wrapperImpl.addImport(importDef);
    }

    public Import removeImport(Import importDef) {
        return wrapperImpl.removeImport(importDef);
    }

    public List getImports(String namespaceURI) {
        return wrapperImpl.getImports(namespaceURI);
    }

    public Map getImports() {
        return wrapperImpl.getImports();
    }

    public void addMessage(Message message) {
        wrapperImpl.addMessage(message);
    }

    public Message getMessage(QName name) {
        return wrapperImpl.getMessage(name);
    }

    public Message removeMessage(QName name) {
        return wrapperImpl.removeMessage(name);
    }

    public Map getMessages() {
        return wrapperImpl.getMessages();
    }

    public void addBinding(Binding binding) {
        wrapperImpl.addBinding(binding);
    }

    public Binding getBinding(QName name) {
        return wrapperImpl.getBinding(name);
    }

    public Binding removeBinding(QName name) {
        return wrapperImpl.removeBinding(name);
    }

    public Map getBindings() {
        return wrapperImpl.getBindings();
    }

    public Map getAllBindings() {
        return wrapperImpl.getAllBindings();
    }

    public void addPortType(PortType portType) {
        wrapperImpl.addPortType(portType);
    }

    public PortType getPortType(QName name) {
        return wrapperImpl.getPortType(name);
    }

    public PortType removePortType(QName name) {
        return wrapperImpl.removePortType(name);
    }

    public Map getPortTypes() {
        return wrapperImpl.getPortTypes();
    }

    public Map getAllPortTypes() {
        return wrapperImpl.getAllPortTypes();
    }

    public void addService(Service service) {
        wrapperImpl.addService(service);
    }

    public Service getService(QName name) {
        return wrapperImpl.getService(name);
    }

    public Service removeService(QName name) {
        return wrapperImpl.removeService(name);
    }

    public Map getServices() {
        return wrapperImpl.getServices();
    }

    public Map getAllServices() {
        return wrapperImpl.getAllServices();
    }

    public void setDocumentationElement(org.w3c.dom.Element docEl) {
        wrapperImpl.setDocumentationElement(docEl);
    }

    public org.w3c.dom.Element getDocumentationElement() {
        return  wrapperImpl.getDocumentationElement();
    }

    public void addExtensibilityElement(ExtensibilityElement extElement) {
        wrapperImpl.addExtensibilityElement(extElement);
    }

    public List getExtensibilityElements() {
        return wrapperImpl.getExtensibilityElements();
    }

    public Binding createBinding() {
        return wrapperImpl.createBinding();
    }

    public BindingFault createBindingFault() {
        return wrapperImpl.createBindingFault();
    }

    public BindingInput createBindingInput() {
        return wrapperImpl.createBindingInput();
    }

    public BindingOperation createBindingOperation() {
        return wrapperImpl.createBindingOperation();
    }

    public BindingOutput createBindingOutput() {
        return wrapperImpl.createBindingOutput();
    }

    public Fault createFault() {
        return wrapperImpl.createFault();
    }

    public Import createImport() {
        return wrapperImpl.createImport();
    }

    public Input createInput() {
        return wrapperImpl.createInput();
    }

    public Message createMessage() {
        return wrapperImpl.createMessage();
    }

    public Operation createOperation() {
        return wrapperImpl.createOperation();
    }

    public Output createOutput() {
        return wrapperImpl.createOutput();
    }

    public Part createPart() {
        return wrapperImpl.createPart();
    }

    public Port createPort() {
        return wrapperImpl.createPort();
    }

    public PortType createPortType() {
        return wrapperImpl.createPortType();
    }

    public Service createService() {
        return wrapperImpl.createService();
    }

    public Types createTypes() {
        return wrapperImpl.createTypes();
    }

    public void setExtensionRegistry(ExtensionRegistry extReg) {
        wrapperImpl.setExtensionRegistry(extReg);
    }

    public ExtensionRegistry getExtensionRegistry() {
        return wrapperImpl.getExtensionRegistry();
    }

    public String toString() {
        return wrapperImpl.toString();
    }

    //-------------------------------------------------------------------------
    // other AbstractWSDLElement methods
    //-------------------------------------------------------------------------

    public ExtensibilityElement removeExtensibilityElement(ExtensibilityElement extElement) {
        return wrapperImpl.removeExtensibilityElement(extElement);
    }

    public java.lang.Object getExtensionAttribute(QName name) {
        return wrapperImpl.getExtensionAttribute(name);
    }

    public Map getExtensionAttributes() {
        return wrapperImpl.getExtensionAttributes();
    }

    public void setExtensionAttribute(QName name, java.lang.Object value) {
        wrapperImpl.setExtensionAttribute(name, value);
    }

}
