package org.jboss.webservice.metadata;
import org.jboss.deployment.DeploymentException;
import org.jboss.metadata.MetaData;
import org.jboss.webservice.WSDLDefinitionFactory;
import org.jboss.webservice.metadata.jaxrpcmapping.JavaWsdlMapping;
import org.jboss.webservice.metadata.jaxrpcmapping.JavaWsdlMappingFactory;
import org.jboss.xml.QNameBuilder;
import org.w3c.dom.Element;
import javax.wsdl.Definition;
import javax.wsdl.WSDLException;
import javax.xml.namespace.QName;
import javax.xml.rpc.JAXRPCException;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Properties;
public class ServiceRefMetaData implements Serializable
{
static final long serialVersionUID = -4066138133416677843L;
private String serviceRefName;
private String serviceInterface;
private String wsdlFile;
private String jaxrpcMappingFile;
private QName serviceQName;
private LinkedHashMap portComponentRefs = new LinkedHashMap();
private ArrayList handlers = new ArrayList();
private URL wsdlOverride;
private Properties callProperties;
private transient URLClassLoader resourceCL;
private transient Definition wsdlDefinition;
private transient JavaWsdlMapping javaWsdlMapping;
public ServiceRefMetaData()
{
}
public ServiceRefMetaData(URLClassLoader resourceCl)
{
setResourceCl(resourceCl);
}
public void setResourceCl(URLClassLoader resourceCl)
{
if (resourceCl == null)
throw new IllegalArgumentException("ResourceClassLoader cannot be null");
this.resourceCL = resourceCl;
}
public URLClassLoader getResourceCL()
{
return resourceCL;
}
public String getJaxrpcMappingFile()
{
return jaxrpcMappingFile;
}
public URL getJavaWsdlMappingLocation()
{
URL location = resourceCL.findResource(jaxrpcMappingFile);
return location;
}
public JavaWsdlMapping getJavaWsdlMapping()
{
if (javaWsdlMapping == null && jaxrpcMappingFile != null)
{
try
{
URL location = getJavaWsdlMappingLocation();
JavaWsdlMappingFactory mappingFactory = JavaWsdlMappingFactory.newInstance();
javaWsdlMapping = mappingFactory.parse(location);
}
catch (Exception e)
{
throw new JAXRPCException("Cannot unmarshal jaxrpc-mapping-file: " + jaxrpcMappingFile, e);
}
}
return javaWsdlMapping;
}
public PortComponentRefMetaData[] getPortComponentRefs()
{
PortComponentRefMetaData[] array = new PortComponentRefMetaData[portComponentRefs.size()];
portComponentRefs.values().toArray(array);
return array;
}
public HandlerMetaData[] getHandlers()
{
HandlerMetaData[] array = new HandlerMetaData[handlers.size()];
handlers.toArray(array);
return array;
}
public String getServiceInterface()
{
return serviceInterface;
}
public Class getServiceInterfaceClass() throws ClassNotFoundException
{
if (resourceCL == null)
throw new IllegalStateException("Resource class loader not set");
return resourceCL.loadClass(serviceInterface);
}
public QName getServiceQName()
{
return serviceQName;
}
public String getServiceRefName()
{
return serviceRefName;
}
public String getWsdlFile()
{
return wsdlFile;
}
public URL getWsdlOverride()
{
return wsdlOverride;
}
public Properties getCallProperties()
{
return callProperties;
}
public Definition getWsdlDefinition()
{
if (wsdlDefinition == null && (wsdlOverride != null || wsdlFile != null))
{
try
{
URL wsdlURL = (wsdlOverride != null ? wsdlOverride : resourceCL.findResource(wsdlFile));
WSDLDefinitionFactory factory = WSDLDefinitionFactory.newInstance();
wsdlDefinition = factory.parse(wsdlURL);
}
catch (WSDLException e)
{
throw new IllegalStateException("Cannot unmarshall wsdl, cause: " + e.toString());
}
}
return wsdlDefinition;
}
public void importStandardXml(Element element)
throws DeploymentException
{
serviceRefName = MetaData.getUniqueChildContent(element, "service-ref-name");
serviceInterface = MetaData.getUniqueChildContent(element, "service-interface");
wsdlFile = MetaData.getOptionalChildContent(element, "wsdl-file");
jaxrpcMappingFile = MetaData.getOptionalChildContent(element, "jaxrpc-mapping-file");
Element qnameElement = MetaData.getOptionalChild(element, "service-qname");
if (qnameElement != null)
serviceQName = QNameBuilder.buildQName(qnameElement, MetaData.getElementContent(qnameElement));
Iterator iterator = MetaData.getChildrenByTagName(element, "port-component-ref");
while (iterator.hasNext())
{
Element pcrefElement = (Element)iterator.next();
PortComponentRefMetaData pcrefMetaData = new PortComponentRefMetaData(this);
pcrefMetaData.importStandardXml(pcrefElement);
portComponentRefs.put(pcrefMetaData.getServiceEndpointInterface(), pcrefMetaData);
}
iterator = MetaData.getChildrenByTagName(element, "handler");
while (iterator.hasNext())
{
Element handlerElement = (Element)iterator.next();
HandlerMetaData handlerMetaData = new HandlerMetaData();
handlerMetaData.importStandardXml(handlerElement);
handlers.add(handlerMetaData);
}
}
public void importJBossXml(Element element) throws DeploymentException
{
String wsdlOverrideOption = MetaData.getOptionalChildContent(element, "wsdl-override");
try
{
if (wsdlOverrideOption != null)
wsdlOverride = new URL(wsdlOverrideOption);
}
catch (MalformedURLException e)
{
throw new DeploymentException("Invalid WSDL override: " + wsdlOverrideOption);
}
Iterator iterator = MetaData.getChildrenByTagName(element, "port-component-ref");
while (iterator.hasNext())
{
Element pcrefElement = (Element)iterator.next();
String name = MetaData.getOptionalChildContent(pcrefElement, "service-endpoint-interface");
if (name != null)
{
PortComponentRefMetaData pcrefMetaData = (PortComponentRefMetaData)portComponentRefs.get(name);
if (pcrefMetaData == null)
{
pcrefMetaData = new PortComponentRefMetaData(this);
pcrefMetaData.importStandardXml(pcrefElement);
portComponentRefs.put(pcrefMetaData.getServiceEndpointInterface(), pcrefMetaData);
}
pcrefMetaData.importJBossXml(pcrefElement);
}
}
iterator = MetaData.getChildrenByTagName(element, "call-property");
while (iterator.hasNext())
{
Element propElement = (Element)iterator.next();
String name = MetaData.getUniqueChildContent(propElement, "prop-name");
String value = MetaData.getUniqueChildContent(propElement, "prop-value");
if (callProperties == null)
callProperties = new Properties();
callProperties.setProperty(name, value);
}
}
}