/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.impl.wsdl.submit.transports.jms; import com.eviware.soapui.SoapUI; import com.eviware.soapui.model.iface.Interface; import com.eviware.soapui.model.iface.Request; import com.eviware.soapui.model.iface.SubmitContext; import com.eviware.soapui.model.propertyexpansion.PropertyExpander; import java.util.Arrays; public class JMSEndpoint { public static final String JMS_OLD_ENDPOINT_SEPARATOR = "/"; public static final String JMS_ENDPOINT_SEPARATOR = "::"; public static final String QUEUE_ENDPOINT_PREFIX = "queue_"; public static final String TOPIC_ENDPOINT_PREFIX = "topic_"; public static final String JMS_EMPTY_DESTIONATION = "-"; public static final String JMS_ENDPOINT_PREFIX = "jms://"; Request request; SubmitContext submitContext; String[] parameters; String sessionName; String send; String receive; public JMSEndpoint(Request request, SubmitContext submitContext) { this.request = request; this.submitContext = submitContext; parameters = extractEndpointParameters(request, submitContext); sessionName = getEndpointParameter(0); send = getEndpointParameter(1); receive = getEndpointParameter(2); } public JMSEndpoint(String sessionName, String send, String receive) { this.sessionName = sessionName; this.send = send; this.receive = receive; } public JMSEndpoint(String jmsEndpointString) { parameters = jmsEndpointString.replaceFirst(JMS_ENDPOINT_PREFIX, "").split(JMS_ENDPOINT_SEPARATOR); sessionName = getEndpointParameter(0); send = getEndpointParameter(1); receive = getEndpointParameter(2); } public static String[] extractEndpointParameters(Request request, SubmitContext context) { resolveOldEndpointPattern(request); String endpoint = PropertyExpander.expandProperties(context, request.getEndpoint()); String[] parameters = endpoint.replaceFirst(JMS_ENDPOINT_PREFIX, "").split(JMS_ENDPOINT_SEPARATOR); return parameters; } private static void resolveOldEndpointPattern(Request request) { String oldEndpoint = request.getEndpoint(); if (oldEndpoint.contains("/queue_") || oldEndpoint.contains("/topic_")) { String newEndpoint = request.getEndpoint() .replaceAll(JMS_OLD_ENDPOINT_SEPARATOR + "queue_", JMS_ENDPOINT_SEPARATOR + "queue_") .replaceAll(JMS_OLD_ENDPOINT_SEPARATOR + "topic_", JMS_ENDPOINT_SEPARATOR + "topic_") .replaceAll(JMS_OLD_ENDPOINT_SEPARATOR + "-", JMS_ENDPOINT_SEPARATOR + "-"); request.setEndpoint(newEndpoint); refreshEndpointList(request, oldEndpoint, newEndpoint); SoapUI.log("JMS endpoint resolver changed endpoint pattern from " + oldEndpoint + "to " + newEndpoint); } } private static void refreshEndpointList(Request request, String oldEndpoint, String newEndpoint) { Interface iface = request.getOperation().getInterface(); for (String endpoint : iface.getEndpoints()) { if (endpoint.equals(oldEndpoint)) { iface.changeEndpoint(endpoint, newEndpoint); } } } private boolean checkParameterIndex(int parameterIndex, String[] parameters) throws IllegalArgumentException { if (parameterIndex < 0 || parameterIndex > 2) { throw new IllegalArgumentException( "\n" + "Illegal JMS endpoint parameter index: \" + parameterIndex \n" + "For JMS please use this endpoint pattern: \n" + "for sending 'jms://sessionName::queue_myqueuename' \n" + "for receive 'jms://sessionName::-::queue_myqueuename' \n" + "for send-receive 'jms://sessionName::queue_myqueuename1::queue_myqueuename2'" ); } if (parameterIndex > parameters.length - 1) { SoapUI.log("JMS Endpoint String does not contain a parameter at index " + parameterIndex + ", parameters: " + Arrays.toString(parameters) ); return false; } return true; } private String getEndpointParameter(int i) { if (!checkParameterIndex(i, parameters)) { return ""; } String stripParameter = PropertyExpander.expandProperties(submitContext, parameters[i]) .replaceFirst(QUEUE_ENDPOINT_PREFIX, "").replaceFirst(TOPIC_ENDPOINT_PREFIX, ""); return stripParameter; } public String getSessionName() { return sessionName; } public String getSend() { return send; } public String getReceive() { return receive; } }