/*******************************************************************************
* Copyright (c) 2011 - 2014 Red Hat, Inc. and others.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.ws.ui.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.wsdl.Binding;
import javax.wsdl.BindingOperation;
import javax.wsdl.Definition;
import javax.wsdl.Operation;
import javax.wsdl.Port;
import javax.wsdl.PortType;
import javax.wsdl.Service;
import javax.wsdl.WSDLException;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.soap.SOAPAddress;
import javax.wsdl.extensions.soap.SOAPOperation;
import javax.wsdl.extensions.soap12.SOAP12Address;
import javax.wsdl.extensions.soap12.SOAP12Operation;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLReader;
import javax.xml.namespace.QName;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.jboss.tools.ws.core.utils.StatusUtils;
import org.jboss.tools.ws.ui.messages.JBossWSUIMessages;
import com.ibm.wsdl.Constants;
/**
* Cleaned up and separated WSDL from Schema utilities
* @author bfitzpat
*
*/
public class TesterWSDLUtils {
private final static String DEF_FACTORY_PROPERTY_NAME =
"javax.wsdl.factory.DefinitionFactory"; //$NON-NLS-1$
private final static String PRIVATE_DEF_FACTORY_CLASS =
"org.apache.wsif.wsdl.WSIFWSDLFactoryImpl"; //$NON-NLS-1$
public final static String SOAP_NS_URI = "http://schemas.xmlsoap.org/soap/envelope/"; //$NON-NLS-1$
public final static String SOAP12_ENVELOPE_NS_URI = "http://www.w3.org/2003/05/soap-envelope"; //$NON-NLS-1$
public final static String SOAP12_NS_URI = "http://schemas.xmlsoap.org/wsdl/soap12/"; //$NON-NLS-1$
public final static String SOAP12_PREFIX = "soap12"; //$NON-NLS-1$
public final static String SOAP_PREFIX = "soap"; //$NON-NLS-1$
public static Definition readWSDLURL(URL contextURL, String wsdlLoc) throws WSDLException {
Properties props = System.getProperties();
String oldPropValue = props.getProperty(DEF_FACTORY_PROPERTY_NAME);
props.setProperty(DEF_FACTORY_PROPERTY_NAME, PRIVATE_DEF_FACTORY_CLASS);
WSDLFactory factory = WSDLFactory.newInstance();
WSDLReader wsdlReader = factory.newWSDLReader();
wsdlReader.setFeature(Constants.FEATURE_VERBOSE, false);
wsdlReader.setFeature("javax.wsdl.importDocuments", true); //$NON-NLS-1$
String context = null;
if (contextURL != null)
context = contextURL.toString();
Definition def = wsdlReader.readWSDL(context, wsdlLoc);
if (oldPropValue != null) {
props.setProperty(DEF_FACTORY_PROPERTY_NAME, oldPropValue);
} else {
props.remove(DEF_FACTORY_PROPERTY_NAME);
}
return def;
}
public static IStatus isWSDLAccessible(URL contextURL) {
Properties props = System.getProperties();
String oldPropValue = props.getProperty(DEF_FACTORY_PROPERTY_NAME);
props.setProperty(DEF_FACTORY_PROPERTY_NAME, PRIVATE_DEF_FACTORY_CLASS);
WSDLFactory factory;
try {
factory = WSDLFactory.newInstance();
WSDLReader wsdlReader = factory.newWSDLReader();
wsdlReader.setFeature(Constants.FEATURE_VERBOSE, false);
wsdlReader.setFeature("javax.wsdl.importDocuments", true); //$NON-NLS-1$
String context = null;
if (contextURL != null)
context = contextURL.toString();
wsdlReader.readWSDL(context);
} catch (WSDLException e) {
if (contextURL.getProtocol().equalsIgnoreCase("https")) { //$NON-NLS-1$
return StatusUtils.warningStatus(JBossWSUIMessages.TesterWSDLUtils_WSDL_HTTPS_Secured_Inaccessible);
} else {
return StatusUtils.errorStatus(JBossWSUIMessages.TesterWSDLUtils_WSDL_Inaccessible, e);
}
}
if (oldPropValue != null) {
props.setProperty(DEF_FACTORY_PROPERTY_NAME, oldPropValue);
} else {
props.remove(DEF_FACTORY_PROPERTY_NAME);
}
return Status.OK_STATUS;
}
public static Definition readWSDLURL(URL contextURL) throws WSDLException, NullPointerException {
Properties props = System.getProperties();
String oldPropValue = props.getProperty(DEF_FACTORY_PROPERTY_NAME);
props.setProperty(DEF_FACTORY_PROPERTY_NAME, PRIVATE_DEF_FACTORY_CLASS);
WSDLFactory factory = WSDLFactory.newInstance();
WSDLReader wsdlReader = factory.newWSDLReader();
wsdlReader.setFeature(Constants.FEATURE_VERBOSE, false);
wsdlReader.setFeature("javax.wsdl.importDocuments", true); //$NON-NLS-1$
String context = null;
if (contextURL != null)
context = contextURL.toString();
Definition def = wsdlReader.readWSDL(context);
if (oldPropValue != null) {
props.setProperty(DEF_FACTORY_PROPERTY_NAME, oldPropValue);
} else {
props.remove(DEF_FACTORY_PROPERTY_NAME);
}
return def;
}
public static boolean isSOAP12 (Definition wsdlDefinition, String serviceName, String portName) {
Map<?, ?> services = wsdlDefinition.getServices();
Set<?> serviceKeys = services.keySet();
for( Iterator<?> it = serviceKeys.iterator(); it.hasNext(); ) {
QName serviceKey = (QName) it.next();
if (serviceName != null && serviceKey.getLocalPart().contentEquals(serviceName)) {
Service service = (Service) services.get( serviceKey );
Map<?, ?> ports = service.getPorts();
Set<?> portKeys = ports.keySet();
for( Iterator<?> it2 = portKeys.iterator(); it2.hasNext(); ) {
String portKey = (String) it2.next();
if (portName != null && portKey.contentEquals(portName)) {
Port port = (Port) ports.get( portKey );
List<?> extElements = port.getExtensibilityElements();
for (Iterator<?> it3 = extElements.iterator(); it3.hasNext(); ) {
ExtensibilityElement element = (ExtensibilityElement) it3.next();
String nsURI = element.getElementType().getNamespaceURI();
if (nsURI.contentEquals(SOAP12_NS_URI)) {
return true;
}
return false;
}
}
}
}
}
return false;
}
public static String[] getNSServiceNameAndMessageNameArray (Definition wsdlDefinition, String serviceName, String portName, String bindingName, String opName ) {
Map<?, ?> services = wsdlDefinition.getServices();
Set<?> serviceKeys = services.keySet();
for( Iterator<?> it = serviceKeys.iterator(); it.hasNext(); ) {
QName serviceKey = (QName) it.next();
if (serviceName != null && serviceKey.getLocalPart().contentEquals(serviceName)) {
Service service = (Service) services.get( serviceKey );
Map<?, ?> ports = service.getPorts();
Set<?> portKeys = ports.keySet();
for( Iterator<?> it2 = portKeys.iterator(); it2.hasNext(); ) {
String portKey = (String) it2.next();
if (portName != null && portKey.contentEquals(portName)) {
Port port = (Port) ports.get( portKey );
Binding wsdlBinding = port.getBinding();
PortType portType = wsdlBinding.getPortType();
// String ns = portType.getQName().getNamespaceURI();
String ns = service.getQName().getNamespaceURI();
List<?> operations = portType.getOperations();
for (Iterator<?> it3 = operations.iterator(); it3.hasNext();){
Operation operation = (Operation) it3.next();
if (opName != null && operation.getName().contentEquals(opName)) {
return new String[] {ns, serviceName, portName};
}
}
}
}
}
}
return null;
}
public static String getEndpointURL ( Definition wsdlDefinition, String serviceName, String portName, String bindingName, String opName ) {
Map<?, ?> services = wsdlDefinition.getServices();
Set<?> serviceKeys = services.keySet();
for( Iterator<?> it = serviceKeys.iterator(); it.hasNext(); ) {
QName serviceKey = (QName) it.next();
if (serviceName != null && serviceKey.getLocalPart().contentEquals(serviceName)) {
Service service = (Service) services.get( serviceKey );
Map<?, ?> ports = service.getPorts();
Set<?> portKeys = ports.keySet();
for( Iterator<?> it2 = portKeys.iterator(); it2.hasNext(); ) {
String portKey = (String) it2.next();
if (portName != null && portKey.contentEquals(portName)) {
Port port = (Port) ports.get( portKey );
List<?> elements = port.getExtensibilityElements();
for (Iterator<?> it3 = elements.iterator(); it3.hasNext();){
Object element = it3.next();
if (element instanceof SOAPAddress) {
SOAPAddress address = (SOAPAddress) element;
return address.getLocationURI();
} else if (element instanceof SOAP12Address) {
SOAP12Address address = (SOAP12Address) element;
return address.getLocationURI();
}
}
}
}
}
}
return null;
}
public static String getActionURL ( Definition wsdlDefinition, String serviceName, String portName, String bindingName, String opName ) {
Map<?, ?> services = wsdlDefinition.getServices();
Set<?> serviceKeys = services.keySet();
for( Iterator<?> it = serviceKeys.iterator(); it.hasNext(); ) {
QName serviceKey = (QName) it.next();
if (serviceName != null && serviceKey.getLocalPart().contentEquals(serviceName)) {
Service service = (Service) services.get( serviceKey );
Map<?, ?> ports = service.getPorts();
Set<?> portKeys = ports.keySet();
for( Iterator<?> it2 = portKeys.iterator(); it2.hasNext(); ) {
String portKey = (String) it2.next();
if (portName != null && portKey.contentEquals(portName)) {
Port port = (Port) ports.get( portKey );
Binding wsdlBinding = port.getBinding();
List<?> operations = wsdlBinding.getBindingOperations();
for (Iterator<?> it3 = operations.iterator(); it3.hasNext();){
BindingOperation operation = (BindingOperation) it3.next();
if (opName != null && operation.getName().contentEquals(opName)) {
List<?> attributesList = operation.getExtensibilityElements();
for (Iterator<?> it4 = attributesList.iterator(); it4.hasNext();){
Object test = it4.next();
if (test instanceof SOAPOperation) {
SOAPOperation soapOp = (SOAPOperation) test;
return soapOp.getSoapActionURI();
} else if (test instanceof SOAP12Operation) {
SOAP12Operation soapOp = (SOAP12Operation) test;
return soapOp.getSoapActionURI();
}
}
}
}
}
}
}
}
return null;
}
public static String getFileContents (URL inURL){
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(
inURL.openStream()));
String inputLine;
StringBuffer buffer = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
buffer.append(inputLine + '\n');
}
in.close();
return buffer.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static boolean isRequestBodySOAP12 ( String body ) {
boolean isSOAP12 = false;
if (body.indexOf(SOAP12_ENVELOPE_NS_URI) > -1){
isSOAP12 = true;
}
return isSOAP12;
}
}