blob: 9eda37900e6b599a086e7b1906df7c980b7e82b9 [file] [log] [blame]
/*
* 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.java.security.AccessController;
import org.apache.axis2.util.JavaUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Element;
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.WSDLException;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.ExtensionRegistry;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLReader;
import javax.xml.namespace.QName;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLConnection;
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
* This class provides support for processing a WSDL4J definition
* with a lower memory footprint. This is useful for certain
* environments.
*
* The Type and Documentation objects consume the most space
* in many scenarios. This implementation reloads these objects
* when then they are requested.
*/
public class WSDLWrapperReloadImpl implements WSDLWrapperImpl {
private static final Log log = LogFactory.getLog(WSDLWrapperReloadImpl.class);
private static final boolean isDebugEnabled = log.isDebugEnabled();
private static final String myClassName = "WSDLWrapperReloadImpl";
// 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;
// The wsdlDefinition always has the Types and DocumentElement
// purged from it.
// If USE_SOFT_REFERENCES is true, then we keep a SOFT reference
// to these objects.
// If USE_SOFT_REFERENCES is false, then a loadDefinition is always
// performed to get the Type or DocumentationElement
private static boolean USE_SOFT_REFERENCES = true;
private transient SoftReference softTypes = null;
private transient SoftReference softDocElement = null;
/**
* Constructor
* The WSDL Defintion object is owned by the WSDLWrapperReloadImpl object.
*
* @param def The WSDL Definition
*/
public WSDLWrapperReloadImpl(Definition def) {
if (log.isDebugEnabled()) {
log.debug("WSDLWrapperReloadImpl(Definition def) called");
log.trace(JavaUtils.callStackToString());
}
prepare(def, null);
}
/**
* Constructor
* The WSDL Defintion object is owned by the WSDLWrapperReloadImpl object.
*
* @param def The WSDL Definition
* @param wURL The URL for the wsdl
*/
public WSDLWrapperReloadImpl(Definition def, URL wURL) {
if (log.isDebugEnabled()) {
log.debug("WSDLWrapperReloadImpl(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;
if (def != null) {
try {
wsdlDocumentBaseURI = def.getDocumentBaseURI();
// build up the wsdlURL if possible
if ((wsdlURL == null) && (wsdlDocumentBaseURI != null)) {
try {
URL locURL = new URL(wsdlDocumentBaseURI);
wsdlURL = locURL;
} catch (Exception uex) {
// keep going
}
}
// get the explicit location of the wsdl if possible
if (wsdlURL != null) {
wsdlExplicitURI = getExplicitURI(wsdlURL);
}
// Release the Types and DocumentationElement Resources
releaseResources();
} catch (Exception e) {
if (isDebugEnabled) {
log.debug(myClassName + ".prepare(): Caught exception ["
+ e.getClass().getName() + "] error [" + e.getMessage() + "]", e);
}
}
}
if (isDebugEnabled) {
log.debug(myClassName + ".prepare(): wsdlDocumentBaseURI [" + wsdlDocumentBaseURI
+ "] wsdlExplicitURI [" + wsdlExplicitURI + "] wsdlURL [" + wsdlURL + "]");
}
}
//-------------------------------------------------------------------------
// public WSDLWrapperImpl methods
//-------------------------------------------------------------------------
/*
* Releases Type and DocumentElement Resources
*/
public void releaseResources() {
if (wsdlDefinition != null) {
Types types = wsdlDefinition.getTypes();
if (types != null) {
wsdlDefinition.setTypes(null);
}
this.setCachedTypes(types);
Element element = wsdlDefinition.getDocumentationElement();
if (element != null) {
wsdlDefinition.setDocumentationElement(null);
}
this.setCachedDocElement(element);
}
}
/**
* Store the cached type. Since this is a SOFT reference,
* the gc may remove it.
* @param types
*/
private void setCachedTypes(Types types) {
if (USE_SOFT_REFERENCES) {
if (softTypes == null || softTypes.get() == null) {
if (types != null) {
softTypes = new SoftReference(types);
} else {
// The wsdl has no types
softTypes = new SoftReference(Boolean.FALSE);
}
}
}
}
/**
* Get the cached type. Since this is a SOFT reference,
* the gc may remove it.
* @return types
*/
private Types getCachedTypes() {
if (USE_SOFT_REFERENCES) {
if (softTypes == null || softTypes.get() == null) {
return null;
} else if (softTypes.get().equals(Boolean.FALSE)) {
// The wsdl has no types
return null;
} else {
return (Types) softTypes.get();
}
} else {
return null;
}
}
private boolean hasCachedTypes() {
if (USE_SOFT_REFERENCES) {
return (softTypes != null && softTypes.get() != null);
} else {
return false;
}
}
/**
* Store the cached document element. Since this is a SOFT reference,
* the gc may remove it.
* @param e Element
*/
private void setCachedDocElement(Element e) {
if (USE_SOFT_REFERENCES) {
if (softDocElement == null || softDocElement.get() == null) {
if (e != null) {
softDocElement = new SoftReference(e);
} else {
// The wsdl has no document element
softDocElement = new SoftReference(Boolean.FALSE);
}
}
}
}
/**
* Get the cached type. Since this is a SOFT reference,
* the gc may remove it.
* @return types
*/
private Element getCachedDocElement() {
if (USE_SOFT_REFERENCES) {
if (softDocElement == null || softDocElement.get() == null) {
return null;
} else if (softDocElement.get().equals(Boolean.FALSE)) {
// The wsdl has no document element
return null;
} else {
return (Element) softDocElement.get();
}
} else {
return null;
}
}
private boolean hasCachedDocElement() {
if (USE_SOFT_REFERENCES) {
return (softDocElement != null && softDocElement.get() != null);
} else {
return false;
}
}
/*
* Returns a full, reloaded,WSDL4J Definition object.
* This avoids the memory saving capabilities of this wrapper.
* The caller must not save the returned defintion.
* @return Defintion
*/
public Definition getUnwrappedDefinition() {
Definition def;
if (wsdlDefinition == null) {
// If no definiotn, load one
try {
def = loadDefinition();
} catch (Exception e) {
// unable to load the definition
if (isDebugEnabled) {
log.debug(myClassName
+ ".getUnwrappedDefinition(): error trying to load Definition ["
+ e.getClass().getName() + "] error [" + e.getMessage() + "] ", e);
}
def = null;
}
} else if (wsdlDefinition instanceof WSDLWrapperBasicImpl) {
// If wrapping another wrapper, then delegate
def = ((WSDLWrapperBasicImpl) wsdlDefinition).getUnwrappedDefinition();
} else {
// The question is whether a new WSDLDefinition should be loaded and
// returned or whether the existing definition (w/o the Type
// and DocumentElement) should be returned.
//
// The answer is to reload the WSDLDefinition and provide the new
// one without affecting the existing WSDLDefintion that is stored.
// The onus is on the caller to free this new WSDLDefinition and
// not hold onto it. If the calller wants memory saving
// capabilities, then the caller should be using this wrapper directly.
try {
def = loadDefinition();
if(def == null) {
def = wsdlDefinition;
}
}
catch (Exception e) {
// unable to load the definition
if (isDebugEnabled) {
log.debug(myClassName
+ ".getUnwrappedDefinition(): error trying to load Definition ["
+ e.getClass().getName() + "] error [" + e.getMessage() + "] ", e);
}
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() {
// nothing to do for this implementation
}
//-------------------------------------------------------------------------
// 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 and
// allows the Definition to be reloaded.
// Note that this is the URI of the base document, not the imports.
if (isDebugEnabled) {
log.debug(myClassName + ".setDocumentBaseURI(" + d + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.setDocumentBaseURI(d);
}
}
public String getDocumentBaseURI() {
// Get the URI of the base document for the Definition.
// This identifies the origin of the Definition and
// allows the Definition to be reloaded.
// Note that this is the URI of the base document, not the imports.
if (isDebugEnabled) {
log.debug(myClassName + ".getDocumentBaseURI()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getDocumentBaseURI();
}
return null;
}
public void setQName(QName n) {
if (isDebugEnabled) {
log.debug(myClassName + ".setQName(" + n + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.setQName(n);
}
}
public QName getQName() {
if (isDebugEnabled) {
log.debug(myClassName + ".getQName()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getQName();
}
return null;
}
public void setTargetNamespace(String t) {
if (isDebugEnabled) {
log.debug(myClassName + ".setTargetNamespace(" + t + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.setTargetNamespace(t);
}
}
public String getTargetNamespace() {
if (isDebugEnabled) {
log.debug(myClassName + ".getTargetNamespace()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getTargetNamespace();
}
return null;
}
public void addNamespace(String prefix, String namespaceURI) {
if (isDebugEnabled) {
log.debug(myClassName + ".addNamespace(" + prefix + ", " + namespaceURI + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.addNamespace(prefix, namespaceURI);
}
}
public String removeNamespace(String prefix) {
if (isDebugEnabled) {
log.debug(myClassName + ".removeNamespace(" + prefix + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.removeNamespace(prefix);
}
return null;
}
public String getNamespace(String prefix) {
if (isDebugEnabled) {
log.debug(myClassName + ".getNamespace(" + prefix + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getNamespace(prefix);
}
return null;
}
public String getPrefix(String namespaceURI) {
if (isDebugEnabled) {
log.debug(myClassName + ".getPrefix(" + namespaceURI + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getPrefix(namespaceURI);
}
return null;
}
public Map getNamespaces() {
if (isDebugEnabled) {
log.debug(myClassName + ".getNamespaces()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getNamespaces();
}
return null;
}
public List getNativeAttributeNames() {
if (isDebugEnabled) {
log.debug(myClassName + ".getNativeAttributeNames()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getNativeAttributeNames();
}
return null;
}
public void setTypes(Types types) {
if (wsdlDefinition != null) {
// note: the wsdl definition implementation can't re-create the types
// after the types got set to null so the wsdl definition would
// need to be reloaded
if (isDebugEnabled) {
log.debug(myClassName + ".setTypes() from wsdl Definition");
}
wsdlDefinition.setTypes(types);
// TODO: should we keep the types object if it gets set?
wsdlDefinition.setTypes(null);
} else {
/*
// reload the wsdl definition object
// TODO: what about any online changes that have been made to the definition?
if (isDebugEnabled) {
log.debug(myClassName+".setTypes() from reloaded wsdl Definition");
}
Definition def = null;
try {
def = loadDefinition();
}
catch (Exception e) {
if (isDebugEnabled) {
log.debug(myClassName+".setTypes(): error trying to load Definition ["+e.getClass().getName()+"] error ["+e.getMessage()+"] ", e);
}
}
if (def != null) {
def.setTypes(types);
}
else {
if (isDebugEnabled) {
log.debug(myClassName+".setTypes(): nothing to set");
}
}
*/
if (isDebugEnabled) {
log.debug(myClassName + ".setTypes(): nothing to set");
}
}
}
public Types getTypes() {
if (isDebugEnabled) {
log.trace(myClassName + ".getTypes() call stack =" + JavaUtils.callStackToString());
}
// See if we have a soft reference to the Type
if (hasCachedTypes()) {
Types t = getCachedTypes();
if (isDebugEnabled) {
log.debug(myClassName + ".getTypes() from soft reference [" + t
+ "]");
}
return t;
}
// reload the wsdl definition object
// TODO: what about any changes that have been made to the definition?
Definition def = null;
try {
def = loadDefinition();
} catch (Exception e) {
if (isDebugEnabled) {
log.debug(myClassName + ".getTypes(): error trying to load Definition ["
+ e.getClass().getName() + "] error [" + e.getMessage() + "] ", e);
}
}
if (def != null) {
Types t = def.getTypes();
setCachedTypes(t);
setCachedDocElement(def.getDocumentationElement());
if (isDebugEnabled) {
log.debug(myClassName + ".getTypes() from reloaded wsdl Definition returning [" + t
+ "]");
}
return t;
} else {
if (isDebugEnabled) {
log.debug(myClassName + ".getTypes() returning NULL");
}
return null;
}
}
public void addImport(Import importDef) {
if (isDebugEnabled) {
log.debug(myClassName + ".addImport(" + importDef + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.addImport(importDef);
}
}
public Import removeImport(Import importDef) {
if (isDebugEnabled) {
log.debug(myClassName + ".removeImport(" + importDef + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.removeImport(importDef);
}
return null;
}
public List getImports(String namespaceURI) {
if (isDebugEnabled) {
log.debug(myClassName + ".getImports(" + namespaceURI + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getImports(namespaceURI);
}
return null;
}
public Map getImports() {
if (isDebugEnabled) {
log.debug(myClassName + ".getImports()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getImports();
}
return null;
}
public void addMessage(Message message) {
if (isDebugEnabled) {
log.debug(myClassName + ".addMessage(" + message + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.addMessage(message);
}
}
public Message getMessage(QName name) {
if (isDebugEnabled) {
log.debug(myClassName + ".getMessage(" + name + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getMessage(name);
}
return null;
}
public Message removeMessage(QName name) {
if (isDebugEnabled) {
log.debug(myClassName + ".removeMessage(" + name + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.removeMessage(name);
}
return null;
}
public Map getMessages() {
if (isDebugEnabled) {
log.debug(myClassName + ".getMessages()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getMessages();
}
return null;
}
public void addBinding(Binding binding) {
if (isDebugEnabled) {
log.debug(myClassName + ".addBinding(" + binding + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.addBinding(binding);
}
}
public Binding getBinding(QName name) {
if (isDebugEnabled) {
log.debug(myClassName + ".getBinding(" + name + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getBinding(name);
}
return null;
}
public Binding removeBinding(QName name) {
if (isDebugEnabled) {
log.debug(myClassName + ".removeBinding(" + name + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.removeBinding(name);
}
return null;
}
public Map getBindings() {
if (isDebugEnabled) {
log.debug(myClassName + ".getBindings()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getBindings();
}
return null;
}
public Map getAllBindings() {
if (isDebugEnabled) {
log.debug(myClassName + ".getAllBindings()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getAllBindings();
}
return null;
}
public void addPortType(PortType portType) {
if (isDebugEnabled) {
log.debug(myClassName + ".addPortType(" + portType + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.addPortType(portType);
}
}
public PortType getPortType(QName name) {
if (isDebugEnabled) {
log.debug(myClassName + ".getPortType(" + name + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getPortType(name);
}
return null;
}
public PortType removePortType(QName name) {
if (isDebugEnabled) {
log.debug(myClassName + ".removePortType(" + name + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.removePortType(name);
}
return null;
}
public Map getPortTypes() {
if (isDebugEnabled) {
log.debug(myClassName + ".getPortTypes()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getPortTypes();
}
return null;
}
public Map getAllPortTypes() {
if (isDebugEnabled) {
log.debug(myClassName + ".getAllPortTypes()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getAllPortTypes();
}
return null;
}
public void addService(Service service) {
if (isDebugEnabled) {
log.debug(myClassName + ".addService(" + service + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.addService(service);
}
}
public Service getService(QName name) {
if (isDebugEnabled) {
log.debug(myClassName + ".getService(" + name + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getService(name);
}
return null;
}
public Service removeService(QName name) {
if (isDebugEnabled) {
log.debug(myClassName + ".removeService(" + name + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.removeService(name);
}
return null;
}
public Map getServices() {
if (isDebugEnabled) {
log.debug(myClassName + ".getServices()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getServices();
}
return null;
}
public Map getAllServices() {
if (isDebugEnabled) {
log.debug(myClassName + ".getAllServices()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getAllServices();
}
return null;
}
public void setDocumentationElement(org.w3c.dom.Element docEl) {
if (wsdlDefinition != null) {
if (isDebugEnabled) {
log.debug(myClassName + ".setDocumentationElement(docEl) from wsdl Definition");
}
// set the element in the definition
// don't make assumptions about what the implementation does
wsdlDefinition.setDocumentationElement(docEl);
// reset the element
wsdlDefinition.setDocumentationElement(null);
} else {
/*
// reload the wsdl definition object
// TODO: what about any online changes that have been made to the definition
if (isDebugEnabled) {
log.debug(myClassName+".setDocumentationElement(docEl) from reloaded wsdl Definition");
}
Definition def = null;
try {
def = loadDefinition();
}
catch (Exception e) {
if (isDebugEnabled) {
log.debug(myClassName+".setDocumentationElement(docEl): error trying to load Definition ["+e.getClass().getName()+"] error ["+e.getMessage()+"] ", e);
}
}
if (def != null) {
def.setDocumentationElement(docEl);
}
else {
if (isDebugEnabled) {
log.debug(myClassName+".setDocumentationElement(docEl): nothing to set");
}
}
*/
if (isDebugEnabled) {
log.debug(myClassName + ".setDocumentationElement(docEl): nothing to set");
}
}
}
public org.w3c.dom.Element getDocumentationElement() {
if (isDebugEnabled) {
log.trace(myClassName + ".getDocumentationElement() call stack =" +
JavaUtils.callStackToString());
}
// See if we have a soft reference to the DocumentElement
if (hasCachedDocElement()) {
Element e = getCachedDocElement();
if (log.isDebugEnabled()) {
log.debug(myClassName
+ ".getDocumentationElement() from soft reference ");
}
return e;
}
// reload the wsdl definition object
// TODO: what about any online changes that have been made to the definition?
if (isDebugEnabled) {
log.debug(myClassName + ".getDocumentationElement() from reloaded wsdl Definition");
}
Definition def = null;
try {
def = loadDefinition();
} catch (Exception e) {
if (isDebugEnabled) {
log.debug(myClassName
+ ".getDocumentationElement(): error trying to load Definition ["
+ e.getClass().getName() + "] error [" + e.getMessage() + "] ", e);
}
}
if (def != null) {
org.w3c.dom.Element docElement = def.getDocumentationElement();
setCachedDocElement(docElement);
setCachedTypes(def.getTypes());
if (isDebugEnabled) {
if (docElement != null) {
log.debug(myClassName
+ ".getDocumentationElement() from reloaded wsdl Definition returning NON-NULL org.w3c.dom.Element");
} else {
log.debug(myClassName
+ ".getDocumentationElement() from reloaded wsdl Definition returning NULL org.w3c.dom.Element");
}
}
return docElement;
} else {
if (isDebugEnabled) {
log.debug(myClassName + ".getDocumentationElement() returning NULL");
}
return null;
}
}
public void addExtensibilityElement(ExtensibilityElement extElement) {
if (isDebugEnabled) {
log.debug(myClassName + ".addExtensibilityElement(" + extElement + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.addExtensibilityElement(extElement);
}
}
public List getExtensibilityElements() {
if (isDebugEnabled) {
log.debug(myClassName + ".getExtensibilityElements()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getExtensibilityElements();
}
return null;
}
public Binding createBinding() {
if (isDebugEnabled) {
log.debug(myClassName + ".createBinding()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createBinding();
}
return null;
}
public BindingFault createBindingFault() {
if (isDebugEnabled) {
log.debug(myClassName + ".createBindingFault()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createBindingFault();
}
return null;
}
public BindingInput createBindingInput() {
if (isDebugEnabled) {
log.debug(myClassName + ".createBindingInput()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createBindingInput();
}
return null;
}
public BindingOperation createBindingOperation() {
if (isDebugEnabled) {
log.debug(myClassName + ".createBindingOperation()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createBindingOperation();
}
return null;
}
public BindingOutput createBindingOutput() {
if (isDebugEnabled) {
log.debug(myClassName + ".createBindingOutput()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createBindingOutput();
}
return null;
}
public Fault createFault() {
if (isDebugEnabled) {
log.debug(myClassName + ".createFault()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createFault();
}
return null;
}
public Import createImport() {
if (isDebugEnabled) {
log.debug(myClassName + ".createImport()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createImport();
}
return null;
}
public Input createInput() {
if (isDebugEnabled) {
log.debug(myClassName + ".createInput()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createInput();
}
return null;
}
public Message createMessage() {
if (isDebugEnabled) {
log.debug(myClassName + ".createMessage()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createMessage();
}
return null;
}
public Operation createOperation() {
if (isDebugEnabled) {
log.debug(myClassName + ".createOperation()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createOperation();
}
return null;
}
public Output createOutput() {
if (isDebugEnabled) {
log.debug(myClassName + ".createOutput()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createOutput();
}
return null;
}
public Part createPart() {
if (isDebugEnabled) {
log.debug(myClassName + ".createPart()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createPart();
}
return null;
}
public Port createPort() {
if (isDebugEnabled) {
log.debug(myClassName + ".createPort()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createPort();
}
return null;
}
public PortType createPortType() {
if (isDebugEnabled) {
log.debug(myClassName + ".createPortType()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createPortType();
}
return null;
}
public Service createService() {
if (isDebugEnabled) {
log.debug(myClassName + ".createService()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createService();
}
return null;
}
public Types createTypes() {
if (isDebugEnabled) {
log.debug(myClassName + ".createTypes()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.createTypes();
}
return null;
}
public void setExtensionRegistry(ExtensionRegistry extReg) {
if (isDebugEnabled) {
log.debug(myClassName + ".setExtensionRegistry(" + extReg + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.setExtensionRegistry(extReg);
}
}
public ExtensionRegistry getExtensionRegistry() {
if (isDebugEnabled) {
log.debug(myClassName + ".getExtensionRegistry()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getExtensionRegistry();
}
return null;
}
public String toString() {
if (wsdlDefinition != null) {
return this.getClass().getName() + "\n" + wsdlDefinition.toString();
}
return this.getClass().getName();
}
//-------------------------------------------------------------------------
// other AbstractWSDLElement methods
//-------------------------------------------------------------------------
public ExtensibilityElement removeExtensibilityElement(ExtensibilityElement extElement) {
if (isDebugEnabled) {
log.debug(myClassName + ".removeExtensibilityElement(" + extElement + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.removeExtensibilityElement(extElement);
}
return null;
}
public java.lang.Object getExtensionAttribute(QName name) {
if (isDebugEnabled) {
log.debug(myClassName + ".getExtensionAttribute(" + name + ")");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getExtensionAttribute(name);
}
return null;
}
public Map getExtensionAttributes() {
if (isDebugEnabled) {
log.debug(myClassName + ".getExtensionAttributes()");
}
if (wsdlDefinition != null) {
return wsdlDefinition.getExtensionAttributes();
}
return null;
}
public void setExtensionAttribute(QName name, java.lang.Object value) {
if (isDebugEnabled) {
log.debug(myClassName + ".setExtensionAttribute(" + name + ", " + value + ")");
}
if (wsdlDefinition != null) {
wsdlDefinition.setExtensionAttribute(name, value);
}
}
//-------------------------------------------------------------------------
// private methods
//-------------------------------------------------------------------------
private String getExplicitURI(URL wsdlURL) throws WSDLException {
if (isDebugEnabled) {
log.debug(myClassName + ".getExplicitURI(" + wsdlURL + ") ");
}
String explicitURI = null;
ClassLoader classLoader =
(ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
return Thread.currentThread().getContextClassLoader();
}
});
try {
URL url = wsdlURL;
String filePath = null;
boolean isFileProtocol =
(url != null && "file".equals(url.getProtocol())) ? true : false;
if (isFileProtocol) {
filePath = (url != null) ? url.getPath() : null;
URI uri = null;
if (url != null) {
uri = new URI(url.toString());
}
// Check if the uri has relative path
// ie path is not absolute and is not starting with a "/"
boolean isRelativePath =
(filePath != null && !new File(filePath).isAbsolute()) ? true : false;
if (isRelativePath) {
if (isDebugEnabled) {
log.debug(myClassName + ".getExplicitURI(" + wsdlURL
+ "): WSDL URL has a relative path");
}
// Lets read the complete WSDL URL for relative path from class loader
// Use relative path of url to fetch complete URL.
url = getAbsoluteURL(classLoader, filePath);
if (url == null) {
if (isDebugEnabled) {
log.debug(myClassName + ".getExplicitURI(" + wsdlURL + "): "
+ "WSDL URL for relative path not found in ClassLoader");
log.debug(myClassName
+ ".getExplicitURI("
+ wsdlURL
+ "): "
+ "Unable to read WSDL from relative path, check the relative path");
log.debug(myClassName + ".getExplicitURI(" + wsdlURL + "): "
+ "Relative path example: file:/WEB-INF/wsdl/<wsdlfilename>");
log.debug(myClassName
+ ".getExplicitURI("
+ wsdlURL
+ "): "
+ "Using relative path as default wsdl URL to load wsdl Definition.");
}
url = wsdlURL;
}
else {
if (isDebugEnabled) {
log.debug(myClassName + ".getExplicitURI(" + wsdlURL + "): "
+ "WSDL URL found for relative path: " + filePath + " scheme: "
+ uri.getScheme());
}
}
}
}
URLConnection urlCon = url.openConnection();
InputStream is = null;
try {
is = getInputStream(urlCon);
} catch (IOException e) {
if (isDebugEnabled) {
log.debug(myClassName + ".getExplicitURI(" + wsdlURL + "): "
+ "Could not open url connection. Trying to use "
+ "classloader to get another URL.");
}
if (filePath != null) {
url = getAbsoluteURL(classLoader, filePath);
if (url == null) {
if (log.isDebugEnabled()) {
log.debug("Could not locate URL for wsdl. Reporting error");
}
throw new WSDLException("WSDL4JWrapper : ", e.getMessage(), e);
} else {
urlCon = url.openConnection();
if (log.isDebugEnabled()) {
log.debug("Found URL for WSDL from jar");
}
}
} else {
if (isDebugEnabled) {
log.debug(myClassName + ".getExplicitURI(" + wsdlURL + "): "
+ "Could not get URL from classloader. Reporting "
+ "error due to no file path.");
}
throw new WSDLException("WSDLWrapperReloadImpl : ", e.getMessage(), e);
}
}
if (is != null) {
is.close();
}
explicitURI = urlCon.getURL().toString();
} catch (Exception ex) {
throw new WSDLException("WSDLWrapperReloadImpl : ", ex.getMessage(), ex);
}
return explicitURI;
}
private URL getAbsoluteURL(final ClassLoader classLoader, final String filePath) throws WSDLException {
URL url = (URL) AccessController.doPrivileged(
new PrivilegedAction() {
public Object run() {
return classLoader.getResource(filePath);
}
}
);
if (url == null) {
if (log.isDebugEnabled()) {
log.debug("Could not get URL from classloader. Looking in a jar.");
}
if (classLoader instanceof URLClassLoader) {
URLClassLoader urlLoader = (URLClassLoader) classLoader;
url = getURLFromJAR(urlLoader, wsdlURL);
}
}
return url;
}
/**
* Load and Return a Definition object.
* (The caller will determine if the Definition object should have
* its resources freed or not)
* @return Definition
* @throws WSDLException
*/
private Definition loadDefinition() throws WSDLException {
Definition def = null;
if (wsdlExplicitURI != null) {
try {
def = (Definition) AccessController.doPrivileged(new PrivilegedExceptionAction() {
public Object run() throws WSDLException {
WSDLReader reader = getWSDLReader();
return reader.readWSDL(wsdlExplicitURI);
}
});
} catch (PrivilegedActionException e) {
if (isDebugEnabled) {
log.debug(myClassName + ".loadDefinition(): "
+ "Exception thrown from AccessController: " + e);
log.trace("Call Stack = " + JavaUtils.callStackToString());
}
WSDLException we = new WSDLException("WSDLWrapperReloadImpl : ", e.getMessage(), e);
throw we;
}
}
// Loading the wsdl is expensive. Dump the callstack.. so that we
// support can look at the trace and determine if this class is being used incorrectly.
if (isDebugEnabled) {
log.debug(myClassName + ".loadDefinition(): returning Definition [" + def + "]");
log.trace("Call Stack = " + JavaUtils.callStackToString());
}
return def;
}
private URL getURLFromJAR(URLClassLoader urlLoader, URL relativeURL) throws WSDLException {
URL[] urlList = urlLoader.getURLs();
if (urlList == null) {
return null;
}
for (int i = 0; i < urlList.length; i++) {
URL url = urlList[i];
if (url == null) {
return null;
}
if ("file".equals(url.getProtocol())) {
File f = new File(url.getPath());
//If file is not of type directory then its a jar file
if (f.exists() && !f.isDirectory()) {
try {
JarFile jf = new JarFile(f);
Enumeration entries = jf.entries();
// read all entries in jar file and return the first
// wsdl file that matches the relative path
while (entries.hasMoreElements()) {
JarEntry je = (JarEntry) entries.nextElement();
String name = je.getName();
if (name.endsWith(".wsdl")) {
String relativePath = relativeURL.getPath();
if (relativePath.endsWith(name)) {
String path = f.getAbsolutePath();
// This check is necessary because Unix/Linux file paths begin
// with a '/'. When adding the prefix 'jar:file:/' we may end
// up with '//' after the 'file:' part. This causes the URL
// object to treat this like a remote resource
if (path != null && path.indexOf("/") == 0) {
path = path.substring(1, path.length());
}
URL absoluteUrl =
new URL("jar:file:/" + path + "!/" + je.getName());
return absoluteUrl;
}
}
}
} catch (Exception e) {
WSDLException we =
new WSDLException("WSDLWrapperReloadImpl : ", e.getMessage(), e);
throw we;
}
}
}
}
return null;
}
/**
* Returns a wsdl reader for the wsdl
*
* @return WSDLReader
* @exception WSDLException
*/
private WSDLReader getWSDLReader() throws WSDLException {
WSDLReader reader;
try {
reader = (WSDLReader) AccessController.doPrivileged(new PrivilegedExceptionAction() {
public Object run() throws WSDLException {
WSDLFactory factory = WSDLFactory.newInstance();
return factory.newWSDLReader();
}
});
} catch (PrivilegedActionException e) {
throw (WSDLException) e.getException();
}
// prevent system out from occurring
reader.setFeature(com.ibm.wsdl.Constants.FEATURE_VERBOSE, false);
return reader;
}
/**
* This method provides a Java2 Security compliant way to obtain the InputStream
* for a given URLConnection object. This is needed as a given URLConnection object
* may be an instance of a FileURLConnection object which would require access
* permissions if Java2 Security was enabled.
*/
private InputStream getInputStream(URLConnection urlCon) throws Exception {
final URLConnection finalURLCon = urlCon;
InputStream is = null;
try {
is = (InputStream) AccessController.doPrivileged(
new PrivilegedExceptionAction() {
public Object run() throws IOException {
return finalURLCon.getInputStream();
}
});
}
catch(PrivilegedActionException e) {
throw e.getException();
}
return is;
}
}