/* * 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.util.Counter; import org.apache.axis2.util.JavaUtils; 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.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; 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. * */ public class WSDLWrapperSaveImpl implements WSDLWrapperImpl { private static final Log log = LogFactory.getLog(WSDLWrapperSaveImpl.class); private static final boolean isDebugEnabled = log.isDebugEnabled(); private static final String myClassName = "WSDLWrapperSaveImpl"; // javax.wsdl.Definition implements java.io.Serializable static final long serialVersionUID = -2788807375814097409L; // the wsdl4j wsdl definition object that is being wrapped private Definition wsdlDefinition = null; // the location of the base document used in the wsdl4j definition private URL wsdlURL = null; private String wsdlExplicitURI = null; private String wsdlDocumentBaseURI = null; // an object that maintains a synchronized counter private Counter accessCount = null; // serialization-related information --------------------------- // // 'safeToSerialize' indicates whether the wrapped WSDL definition object is // safe to serialize. This is set to false if the underlying // WSDL4J's WSDL definition had an error when we tried to // serialize it. // // 'hasBeenSaved' indicates whether the wrapped WSDL definition object // has been successfully saved // // 'hasBeenUpdatedSinceSaving' indicates whether the wrapped WSDL definition // object has been updated since the last saved/serialziation // // private boolean safeToSerialize = true; private boolean hasBeenSaved = false; private boolean hasBeenUpdatedSinceSaving = false; private File savedDefinitionFile = null; private String savedFilename = null; /** * Constructor * * @param def The WSDL Definition */ public WSDLWrapperSaveImpl(Definition def) { if (log.isDebugEnabled()) { log.debug("WSDLWrapperSaveImpl(Definition def) called"); log.trace(JavaUtils.callStackToString()); } prepare(def, null); } /** * Constructor * * @param def The WSDL Definition * @param wURL The URL for the wsdl */ public WSDLWrapperSaveImpl(Definition def, URL wURL) { if (log.isDebugEnabled()) { log.debug("WSDLWrapperSaveImpl(Definition def, URL wURL) called"); log.trace(JavaUtils.callStackToString()); } prepare(def, wURL); } /** * 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 (isDebugEnabled) { log.debug(myClassName + ".prepare()"); } wsdlDefinition = def; wsdlURL = wURL; accessCount = new Counter(); releaseResources(); } //------------------------------------------------------------------------- // public WSDLDefinitionWrapper methods //------------------------------------------------------------------------- /* * Returns the WSDL4J Definition object that is being wrapped */ public Definition getUnwrappedDefinition() { getWrappedDefinitionForUse(); Definition def; if ((wsdlDefinition != null) && (wsdlDefinition instanceof WSDLDefinitionWrapper)) { def = ((WSDLDefinitionWrapper) wsdlDefinition).getUnwrappedDefinition(); } else { def = wsdlDefinition; } return def; } /** * Sets the WSDL4J Definition object that is being wrapped * * @param d the WSDL4J Definition object */ public void setDefinitionToWrap(Definition d) { wsdlDefinition = d; } /** * Sets the location for the WSDL4J Definition object that is being wrapped */ public void setWSDLLocation(String uriLocation) { if (uriLocation != null) { try { wsdlURL = new URL(uriLocation); } catch (Exception e) { // todo } } } /** * Gets the location for the WSDL4J Definition object that is being wrapped */ public String getWSDLLocation() { if (wsdlURL != null) { return wsdlURL.toString(); } else { return null; } } /** * Closes the use of the wrapper implementation and allows * internal resources to be released. */ public void close() { // TODO release temporary files } //------------------------------------------------------------------------- // 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. if (isDebugEnabled) { log.debug(myClassName + ".setDocumentBaseURI(" + d + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.setDocumentBaseURI(d); } doneUsingWrappedDefinition(); } 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. if (isDebugEnabled) { log.debug(myClassName + ".getDocumentBaseURI()"); } getWrappedDefinitionForUse(); String results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getDocumentBaseURI(); } doneUsingWrappedDefinition(); return results; } public void setQName(QName n) { if (isDebugEnabled) { log.debug(myClassName + ".setQName(" + n + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.setQName(n); } doneUsingWrappedDefinition(); } public QName getQName() { if (isDebugEnabled) { log.debug(myClassName + ".getQName()"); } getWrappedDefinitionForUse(); QName results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getQName(); } doneUsingWrappedDefinition(); return results; } public void setTargetNamespace(String t) { if (isDebugEnabled) { log.debug(myClassName + ".setTargetNamespace(" + t + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.setTargetNamespace(t); } doneUsingWrappedDefinition(); } public String getTargetNamespace() { if (isDebugEnabled) { log.debug(myClassName + ".getTargetNamespace()"); } getWrappedDefinitionForUse(); String results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getTargetNamespace(); } doneUsingWrappedDefinition(); return results; } public void addNamespace(String prefix, String namespaceURI) { if (isDebugEnabled) { log.debug(myClassName + ".addNamespace(" + prefix + ", " + namespaceURI + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.addNamespace(prefix, namespaceURI); } doneUsingWrappedDefinition(); } public String removeNamespace(String prefix) { if (isDebugEnabled) { log.debug(myClassName + ".removeNamespace(" + prefix + ")"); } getWrappedDefinitionForUse(); String results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.removeNamespace(prefix); } doneUsingWrappedDefinition(); return results; } public String getNamespace(String prefix) { if (isDebugEnabled) { log.debug(myClassName + ".getNamespace(" + prefix + ")"); } getWrappedDefinitionForUse(); String results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getNamespace(prefix); } doneUsingWrappedDefinition(); return results; } public String getPrefix(String namespaceURI) { if (isDebugEnabled) { log.debug(myClassName + ".getPrefix(" + namespaceURI + ")"); } getWrappedDefinitionForUse(); String results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getPrefix(namespaceURI); } doneUsingWrappedDefinition(); return results; } public Map getNamespaces() { if (isDebugEnabled) { log.debug(myClassName + ".getNamespaces()"); } getWrappedDefinitionForUse(); Map results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getNamespaces(); } doneUsingWrappedDefinition(); return results; } public List getNativeAttributeNames() { if (isDebugEnabled) { log.debug(myClassName + ".getNativeAttributeNames()"); } getWrappedDefinitionForUse(); List results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getNativeAttributeNames(); } doneUsingWrappedDefinition(); return results; } public void setTypes(Types types) { if (isDebugEnabled) { log.debug(myClassName + ".setTypes()"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.setTypes(types); } doneUsingWrappedDefinition(); } public Types getTypes() { if (isDebugEnabled) { log.debug(myClassName + ".getTypes()"); } getWrappedDefinitionForUse(); Types results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getTypes(); } doneUsingWrappedDefinition(); return results; } public void addImport(Import importDef) { if (isDebugEnabled) { log.debug(myClassName + ".addImport(" + importDef + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.addImport(importDef); } doneUsingWrappedDefinition(); } public Import removeImport(Import importDef) { if (isDebugEnabled) { log.debug(myClassName + ".removeImport(" + importDef + ")"); } getWrappedDefinitionForUse(); Import results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.removeImport(importDef); } doneUsingWrappedDefinition(); return results; } public List getImports(String namespaceURI) { if (isDebugEnabled) { log.debug(myClassName + ".getImports(" + namespaceURI + ")"); } getWrappedDefinitionForUse(); List results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getImports(namespaceURI); } doneUsingWrappedDefinition(); return results; } public Map getImports() { if (isDebugEnabled) { log.debug(myClassName + ".getImports()"); } getWrappedDefinitionForUse(); Map results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getImports(); } doneUsingWrappedDefinition(); return results; } public void addMessage(Message message) { if (isDebugEnabled) { log.debug(myClassName + ".addMessage(" + message + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.addMessage(message); } doneUsingWrappedDefinition(); } public Message getMessage(QName name) { if (isDebugEnabled) { log.debug(myClassName + ".getMessage(" + name + ")"); } getWrappedDefinitionForUse(); Message results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getMessage(name); } doneUsingWrappedDefinition(); return results; } public Message removeMessage(QName name) { if (isDebugEnabled) { log.debug(myClassName + ".removeMessage(" + name + ")"); } getWrappedDefinitionForUse(); Message results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.removeMessage(name); } doneUsingWrappedDefinition(); return results; } public Map getMessages() { if (isDebugEnabled) { log.debug(myClassName + ".getMessages()"); } getWrappedDefinitionForUse(); Map results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getMessages(); } doneUsingWrappedDefinition(); return results; } public void addBinding(Binding binding) { if (isDebugEnabled) { log.debug(myClassName + ".addBinding(" + binding + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.addBinding(binding); } doneUsingWrappedDefinition(); } public Binding getBinding(QName name) { if (isDebugEnabled) { log.debug(myClassName + ".getBinding(" + name + ")"); } getWrappedDefinitionForUse(); Binding results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getBinding(name); } doneUsingWrappedDefinition(); return results; } public Binding removeBinding(QName name) { if (isDebugEnabled) { log.debug(myClassName + ".removeBinding(" + name + ")"); } getWrappedDefinitionForUse(); Binding results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.removeBinding(name); } doneUsingWrappedDefinition(); return results; } public Map getBindings() { if (isDebugEnabled) { log.debug(myClassName + ".getBindings()"); } getWrappedDefinitionForUse(); Map results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getBindings(); } doneUsingWrappedDefinition(); return results; } public Map getAllBindings() { if (isDebugEnabled) { log.debug(myClassName + ".getAllBindings()"); } getWrappedDefinitionForUse(); Map results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getAllBindings(); } doneUsingWrappedDefinition(); return results; } public void addPortType(PortType portType) { if (isDebugEnabled) { log.debug(myClassName + ".addPortType(" + portType + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.addPortType(portType); } doneUsingWrappedDefinition(); } public PortType getPortType(QName name) { if (isDebugEnabled) { log.debug(myClassName + ".getPortType(" + name + ")"); } getWrappedDefinitionForUse(); PortType results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getPortType(name); } doneUsingWrappedDefinition(); return results; } public PortType removePortType(QName name) { if (isDebugEnabled) { log.debug(myClassName + ".removePortType(" + name + ")"); } getWrappedDefinitionForUse(); PortType results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.removePortType(name); } doneUsingWrappedDefinition(); return results; } public Map getPortTypes() { if (isDebugEnabled) { log.debug(myClassName + ".getPortTypes()"); } getWrappedDefinitionForUse(); Map results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getPortTypes(); } doneUsingWrappedDefinition(); return results; } public Map getAllPortTypes() { if (isDebugEnabled) { log.debug(myClassName + ".getAllPortTypes()"); } getWrappedDefinitionForUse(); Map results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getAllPortTypes(); } doneUsingWrappedDefinition(); return results; } public void addService(Service service) { if (isDebugEnabled) { log.debug(myClassName + ".addService(" + service + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.addService(service); } doneUsingWrappedDefinition(); } public Service getService(QName name) { if (isDebugEnabled) { log.debug(myClassName + ".getService(" + name + ")"); } getWrappedDefinitionForUse(); Service results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getService(name); } doneUsingWrappedDefinition(); return results; } public Service removeService(QName name) { if (isDebugEnabled) { log.debug(myClassName + ".removeService(" + name + ")"); } getWrappedDefinitionForUse(); Service results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.removeService(name); } doneUsingWrappedDefinition(); return results; } public Map getServices() { if (isDebugEnabled) { log.debug(myClassName + ".getServices()"); } getWrappedDefinitionForUse(); Map results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getServices(); } doneUsingWrappedDefinition(); return results; } public Map getAllServices() { if (isDebugEnabled) { log.debug(myClassName + ".getAllServices()"); } getWrappedDefinitionForUse(); Map results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getAllServices(); } doneUsingWrappedDefinition(); return results; } public void setDocumentationElement(org.w3c.dom.Element docEl) { if (isDebugEnabled) { log.debug(myClassName + ".setDocumentationElement()"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.setDocumentationElement(docEl); } doneUsingWrappedDefinition(); } public org.w3c.dom.Element getDocumentationElement() { if (isDebugEnabled) { log.debug(myClassName + ".getDocumentationElement()"); } getWrappedDefinitionForUse(); org.w3c.dom.Element results = null; if (wsdlDefinition != null) { return wsdlDefinition.getDocumentationElement(); } doneUsingWrappedDefinition(); return results; } public void addExtensibilityElement(ExtensibilityElement extElement) { if (isDebugEnabled) { log.debug(myClassName + ".addExtensibilityElement(" + extElement + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.addExtensibilityElement(extElement); } doneUsingWrappedDefinition(); } public List getExtensibilityElements() { if (isDebugEnabled) { log.debug(myClassName + ".getExtensibilityElements()"); } getWrappedDefinitionForUse(); List results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getExtensibilityElements(); } doneUsingWrappedDefinition(); return results; } public Binding createBinding() { if (isDebugEnabled) { log.debug(myClassName + ".createBinding()"); } getWrappedDefinitionForUse(); Binding results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createBinding(); } doneUsingWrappedDefinition(); return results; } public BindingFault createBindingFault() { if (isDebugEnabled) { log.debug(myClassName + ".createBindingFault()"); } getWrappedDefinitionForUse(); BindingFault results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createBindingFault(); } doneUsingWrappedDefinition(); return results; } public BindingInput createBindingInput() { if (isDebugEnabled) { log.debug(myClassName + ".createBindingInput()"); } getWrappedDefinitionForUse(); BindingInput results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createBindingInput(); } doneUsingWrappedDefinition(); return results; } public BindingOperation createBindingOperation() { if (isDebugEnabled) { log.debug(myClassName + ".createBindingOperation()"); } getWrappedDefinitionForUse(); BindingOperation results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createBindingOperation(); } doneUsingWrappedDefinition(); return results; } public BindingOutput createBindingOutput() { if (isDebugEnabled) { log.debug(myClassName + ".createBindingOutput()"); } getWrappedDefinitionForUse(); BindingOutput results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createBindingOutput(); } doneUsingWrappedDefinition(); return results; } public Fault createFault() { if (isDebugEnabled) { log.debug(myClassName + ".createFault()"); } getWrappedDefinitionForUse(); Fault results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createFault(); } doneUsingWrappedDefinition(); return results; } public Import createImport() { if (isDebugEnabled) { log.debug(myClassName + ".createImport()"); } getWrappedDefinitionForUse(); Import results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createImport(); } doneUsingWrappedDefinition(); return results; } public Input createInput() { if (isDebugEnabled) { log.debug(myClassName + ".createInput()"); } getWrappedDefinitionForUse(); Input results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createInput(); } doneUsingWrappedDefinition(); return results; } public Message createMessage() { if (isDebugEnabled) { log.debug(myClassName + ".createMessage()"); } getWrappedDefinitionForUse(); Message results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createMessage(); } doneUsingWrappedDefinition(); return results; } public Operation createOperation() { if (isDebugEnabled) { log.debug(myClassName + ".createOperation()"); } getWrappedDefinitionForUse(); Operation results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createOperation(); } doneUsingWrappedDefinition(); return results; } public Output createOutput() { if (isDebugEnabled) { log.debug(myClassName + ".createOutput()"); } getWrappedDefinitionForUse(); Output results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createOutput(); } doneUsingWrappedDefinition(); return results; } public Part createPart() { if (isDebugEnabled) { log.debug(myClassName + ".createPart()"); } getWrappedDefinitionForUse(); Part results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createPart(); } doneUsingWrappedDefinition(); return results; } public Port createPort() { if (isDebugEnabled) { log.debug(myClassName + ".createPort()"); } getWrappedDefinitionForUse(); Port results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createPort(); } doneUsingWrappedDefinition(); return results; } public PortType createPortType() { if (isDebugEnabled) { log.debug(myClassName + ".createPortType()"); } getWrappedDefinitionForUse(); PortType results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createPortType(); } doneUsingWrappedDefinition(); return results; } public Service createService() { if (isDebugEnabled) { log.debug(myClassName + ".createService()"); } getWrappedDefinitionForUse(); Service results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createService(); } doneUsingWrappedDefinition(); return results; } public Types createTypes() { if (isDebugEnabled) { log.debug(myClassName + ".createTypes()"); } getWrappedDefinitionForUse(); Types results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.createTypes(); } doneUsingWrappedDefinition(); return results; } public void setExtensionRegistry(ExtensionRegistry extReg) { if (isDebugEnabled) { log.debug(myClassName + ".setExtensionRegistry(" + extReg + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.setExtensionRegistry(extReg); } doneUsingWrappedDefinition(); } public ExtensionRegistry getExtensionRegistry() { if (isDebugEnabled) { log.debug(myClassName + ".getExtensionRegistry()"); } getWrappedDefinitionForUse(); ExtensionRegistry results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getExtensionRegistry(); } doneUsingWrappedDefinition(); return results; } public String toString() { getWrappedDefinitionForUse(); String results = ""; if (wsdlDefinition != null) { results = wsdlDefinition.toString(); } doneUsingWrappedDefinition(); return results; } //------------------------------------------------------------------------- // other AbstractWSDLElement methods //------------------------------------------------------------------------- public ExtensibilityElement removeExtensibilityElement(ExtensibilityElement extElement) { if (isDebugEnabled) { log.debug(myClassName + ".removeExtensibilityElement(" + extElement + ")"); } getWrappedDefinitionForUse(); ExtensibilityElement results = null; if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } results = wsdlDefinition.removeExtensibilityElement(extElement); } doneUsingWrappedDefinition(); return results; } public java.lang.Object getExtensionAttribute(QName name) { if (isDebugEnabled) { log.debug(myClassName + ".getExtensionAttribute(" + name + ")"); } getWrappedDefinitionForUse(); java.lang.Object results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getExtensionAttribute(name); } doneUsingWrappedDefinition(); return results; } public Map getExtensionAttributes() { if (isDebugEnabled) { log.debug(myClassName + ".getExtensionAttributes()"); } getWrappedDefinitionForUse(); Map results = null; if (wsdlDefinition != null) { results = wsdlDefinition.getExtensionAttributes(); } doneUsingWrappedDefinition(); return results; } public void setExtensionAttribute(QName name, java.lang.Object value) { if (isDebugEnabled) { log.debug(myClassName + ".setExtensionAttribute(" + name + ", " + value + ")"); } getWrappedDefinitionForUse(); if (wsdlDefinition != null) { if (hasBeenSaved) { hasBeenUpdatedSinceSaving = true; } wsdlDefinition.setExtensionAttribute(name, value); } doneUsingWrappedDefinition(); } //------------------------------------------------------------------------- // private utility methods //------------------------------------------------------------------------- /** * This is an internal utility to ensure that the * WSDL definition being wrapped is available for * use. * <P> * For example, if the WSDL4J WSDL definition object * had been saved, this will reload it. */ private void getWrappedDefinitionForUse() { if (wsdlDefinition == null) { loadResources(); } if (wsdlDefinition != null) { accessCount.incrementAndGet(); } } /** * This is an internal utility to indicate that the * use of WSDL definition has completed. */ private void doneUsingWrappedDefinition() { long assessors = accessCount.decrementAndGet(); if (assessors == 0) { releaseResources(); } } /* * Reduces memory footprint of the in-memory caching of the WSDL definition * based on the configuration settings * */ public void releaseResources() { boolean saved = save(); if (saved) { // release the in-memory copy of the WSDL4J wsdlDefinition = null; } } /* * Loads the the WSDL definition back into memory */ public void loadResources() { if (wsdlDefinition == null) { wsdlDefinition = restore(); } } /** * Saves the current WSDL definition object that this wrapper contains. * This method has a number of checks to determine how to proceed with * the saving of the WSDL definition object, so the caller should not * need to make checks on whether to save or not. * <P> * The caller is responsible for handling the wrapped WSDL * definition object, for example, deciding when to release * it or reload it. * * @return True - if the save succeeded * False - if the save failed */ private boolean save() { // if the wsdl definiton failed to serialize from a previous attempt // to save it, then don't try to save it if (safeToSerialize == false) { // exit quickly return false; } // at this point, we think it is safe to proceed with saving the // wsdl definition // make sure there is a file to use for saving the wsdl definition if (savedDefinitionFile == null) { try { savedDefinitionFile = File.createTempFile("wsdlDef_", null); savedFilename = savedDefinitionFile.getName(); log.debug(myClassName + ".save(): temp file = [" + savedFilename + "]"); } catch (Exception ex) { log.debug(myClassName + ".save(): error creating temp file = [" + ex.getMessage() + "]"); savedDefinitionFile = null; savedFilename = null; // can't save the wsdl definition at this time // might be able to do so later hasBeenSaved = false; return false; } } if (savedDefinitionFile != null) { // the File object exists, check to see if the wsdl definition has // been previously saved if (hasBeenSaved && !hasBeenUpdatedSinceSaving) { // no need to save because we saved it already // and there were no updates to the wsdl definition object // since the previous save return true; } // --------------------------------------------------------- // save to the file // --------------------------------------------------------- FileOutputStream outStream = null; ObjectOutputStream outObjStream = null; try { // setup an output stream to a physical file outStream = new FileOutputStream(savedDefinitionFile); // attach a stream capable of writing objects to the // stream connected to the file outObjStream = new ObjectOutputStream(outStream); // try to save the wsdl object log.debug(myClassName + ".save(): saving the wsdl definition....."); outObjStream.writeObject(wsdlDefinition); // close out the streams outObjStream.flush(); outObjStream.close(); outStream.flush(); outStream.close(); hasBeenSaved = true; hasBeenUpdatedSinceSaving = false; log.debug(myClassName + ".save(): ....saved the wsdl definition....."); long filesize = savedDefinitionFile.length(); log.debug(myClassName + ".save(): file size after save [" + filesize + "] temp file = [" + savedFilename + "]"); log.debug(myClassName + ".save(): end - - - - - - - - - - - - - - - -"); return true; } catch (Exception ex2) { // disable future tries at saving this WSDL definition object safeToSerialize = false; // indicate that the file cannot be used to restore from hasBeenSaved = false; log.debug(myClassName + ".save(): error with saving the wsdl definition = [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]", ex2); if (savedDefinitionFile != null) { try { savedDefinitionFile.delete(); savedDefinitionFile = null; savedFilename = null; } catch (Exception e) { // just absorb it } } if (outObjStream != null) { try { outObjStream.close(); } catch (Exception e) { // just absorb it } } if (outStream != null) { try { outStream.close(); } catch (Exception e) { // just absorb it } } log.debug(myClassName + ".save(): error exit - - - - - - - - - - - - - - - -"); return false; } } return false; } /** * Restores the WSDL definition from a previously saved copy. * <P> * The caller is responsible for handling the wrapped WSDL * definition object, for example, deciding when to release * it or reload it. * * @return The restored WSDL definition object, or NULL */ private Definition restore() { if (!hasBeenSaved) { // the wsdl defintion has not been saved, or the previous saved version // should not be used for some reason return null; } if (savedDefinitionFile == null) { // no file to restore from return null; } // --------------------------------------------------------- // restore from the temporary file // --------------------------------------------------------- Definition restoredDefinition = null; FileInputStream inStream = null; ObjectInputStream inObjStream = null; try { // setup an input stream to the file inStream = new FileInputStream(savedDefinitionFile); // attach a stream capable of reading objects from the // stream connected to the file inObjStream = new ObjectInputStream(inStream); // try to restore the wrapped wsdl definition log.debug(myClassName + ".restore(): restoring the WSDL definition ....."); restoredDefinition = (Definition) inObjStream.readObject(); inObjStream.close(); inStream.close(); log.debug(myClassName + ".restore(): ....restored the WSDL definition ....."); } catch (Exception ex2) { log.debug(myClassName + ".restore(): error with restoring the WSDL definition = [" + ex2.getClass().getName() + " : " + ex2.getMessage() + "]", ex2); if (inObjStream != null) { try { inObjStream.close(); } catch (Exception e) { // just absorb it } } if (inStream != null) { try { inStream.close(); } catch (Exception e) { // just absorb it } } } log.debug(myClassName + ".restore(): end - - - - - - - - - - - - - - - -"); return restoredDefinition; } }