/******************************************************************************* * Copyright (c) 2010 - 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.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.net.URL; import java.util.Map; import java.util.concurrent.ExecutionException; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.xml.namespace.QName; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPMessage; import javax.xml.ws.BindingProvider; import javax.xml.ws.Dispatch; import javax.xml.ws.Response; import javax.xml.ws.Service; import javax.xml.ws.Service.Mode; import javax.xml.ws.handler.MessageContext; import org.apache.axis.message.SOAPEnvelope; import org.eclipse.core.runtime.IProgressMonitor; import org.jboss.tools.ws.ui.messages.JBossWSUIMessages; /** * Test a JAX-WS web service using the JAX-WS API * @author bfitzpat * */ public class JAXWSTester2 { // the response message to pass back private String resultBody; private SOAPEnvelope resultSOAP; private SOAPBody resultSOAPBody; // the result HTTP headers to pass back private Map<String, String> resultHeaders; // utility constant private static final String EMPTY_STRING = ""; //$NON-NLS-1$ /** * Return the response message * @return */ public String getResultBody() { return this.resultBody; } public SOAPBody getResultSOAPBody() { return this.resultSOAPBody; } /** * Return a map of HTTP headers from the response * @return */ public Map<String, String> getResultHeaders() { return this.resultHeaders; } public SOAPEnvelope getResultSOAP(){ return this.resultSOAP; } public void doTest( IProgressMonitor monitor, String endpointurl, String actionurl, String ns, String serviceName, String messageName, String body ) throws Exception { doTest(monitor, endpointurl, actionurl, ns, serviceName, messageName, body, null, null); } /** * Invoke the JAX-WS service * @param endpointurl * @param actionurl * @param body * @throws Exception */ @SuppressWarnings("unchecked") public void doTest( IProgressMonitor monitor, String endpointurl, String actionurl, String ns, String serviceName, String messageName, String body, String uid, String pwd ) throws Exception { this.resultBody = EMPTY_STRING; // in case we're using SSL security... if (endpointurl.toLowerCase().startsWith("https://")) { //$NON-NLS-1$ TrustManager t = new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } @Override public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { } @Override public void checkClientTrusted(X509Certificate[] arg0, String arg1) { } }; TrustManager[] tm = new TrustManager[] {t}; SSLContext ctx = SSLContext.getInstance("SSL"); //$NON-NLS-1$ ctx.init(null, tm, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); } URL serviceURL = new URL (endpointurl); //"http://www.ecubicle.net/gsearch_rss.asmx" QName serviceQName = new QName (ns, serviceName); // "http://www.ecubicle.net/webservices", "gsearch_rss" Service s = Service.create(serviceURL, serviceQName); boolean isSOAP12 = TesterWSDLUtils.isRequestBodySOAP12(body); QName messageQName = new QName(ns, messageName); //"http://www.ecubicle.net/webservices", "gsearch_rssSoap" Dispatch<SOAPMessage> d = s.createDispatch(messageQName, SOAPMessage.class, Mode.MESSAGE); MessageFactory mf = MessageFactory.newInstance(); if (isSOAP12) { mf = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL); } else if (actionurl != null && !actionurl.trim().isEmpty()){ d.getRequestContext().put(BindingProvider.SOAPACTION_USE_PROPERTY, true); d.getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY, actionurl); //"http://www.ecubicle.net/webservices/GetSearchResults"); } if (uid != null && pwd != null) { d.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, uid); d.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, pwd); } SOAPMessage m = mf.createMessage( null, new ByteArrayInputStream(body.getBytes())); m.saveChanges(); // this is a different method of passing along security details // if (uid != null && pwd != null) { // String authStr = uid + ':' + pwd; // byte[] authEncByte = Base64.encodeBase64(authStr.getBytes()); // String authStringEnc = new String(authEncByte); // // MimeHeaders hd = m.getMimeHeaders(); // hd.addHeader("Authorization", "Basic " + authStringEnc); //$NON-NLS-1$//$NON-NLS-2$ // } Response<SOAPMessage> response = d.invokeAsync(m); while (!response.isDone()){ //go off and do some work if (monitor != null) { if (monitor.isCanceled()) { response.cancel(true); } } } try { if (!response.isCancelled()) { //get the actual result SOAPMessage o = (javax.xml.soap.SOAPMessage)response.get(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); o.writeTo(baos); this.resultBody = baos.toString(); this.resultSOAPBody = o.getSOAPBody(); if (response.getContext() != null) { Object responseHeaders = response.getContext().get(MessageContext.HTTP_RESPONSE_HEADERS); if ( responseHeaders != null && responseHeaders instanceof Map) { this.resultHeaders = (Map<String, String>) responseHeaders; } } } else { throw new InterruptedException(JBossWSUIMessages.JAXRSWSTestView_Message_Service_Invocation_Cancelled); } } catch (ExecutionException ex){ //get the actual cause Throwable cause = ex.getCause(); throw new Exception(cause); } catch (InterruptedException ie){ //note interruptions throw ie; } } }