/**
* 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.cxf.testutil.common;
import java.io.File;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.List;
import java.util.Map;
import javax.wsdl.Definition;
import javax.wsdl.Port;
import javax.wsdl.Service;
import javax.wsdl.extensions.soap.SOAPAddress;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.store.memory.MemoryPersistenceAdapter;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.common.util.ReflectionUtil;
import org.apache.cxf.wsdl.WSDLManager;
public class EmbeddedJMSBrokerLauncher extends AbstractBusTestServerBase {
public static final String PORT = allocatePort(EmbeddedJMSBrokerLauncher.class);
String brokerUrl1;
BrokerService broker;
String brokerName;
public EmbeddedJMSBrokerLauncher() {
this(null);
}
public EmbeddedJMSBrokerLauncher(String url) {
if (url == null) {
url = "tcp://localhost:" + PORT;
}
brokerUrl1 = url;
}
public void setBrokerName(String s) {
brokerName = s;
}
public String getBrokerURL() {
return brokerUrl1;
}
public String getEncodedBrokerURL() {
StringBuilder b = new StringBuilder(brokerUrl1.length());
for (int x = 0; x < brokerUrl1.length(); x++) {
char c = brokerUrl1.charAt(x);
switch (c) {
case '?':
b.append("%3F");
break;
default:
b.append(c);
}
}
return b.toString();
}
public void updateWsdl(Bus b, URL wsdlLocation) {
updateWsdl(b, wsdlLocation.toString());
}
public void updateWsdl(Bus b, String wsdlLocation) {
updateWsdlExtensors(b, wsdlLocation, brokerUrl1, getEncodedBrokerURL());
}
public static void updateWsdlExtensors(Bus bus,
String wsdlLocation) {
updateWsdlExtensors(bus, wsdlLocation, "tcp://localhost:" + PORT, null);
}
public static void updateWsdlExtensors(Bus bus,
String wsdlLocation,
String url,
String encodedUrl) {
try {
if (encodedUrl == null) {
encodedUrl = url;
}
if (bus == null) {
bus = BusFactory.getThreadDefaultBus();
}
Definition def = bus.getExtension(WSDLManager.class)
.getDefinition(wsdlLocation);
Map<?, ?> map = def.getAllServices();
for (Object o : map.values()) {
Service service = (Service)o;
Map<?, ?> ports = service.getPorts();
adjustExtensibilityElements(service.getExtensibilityElements(), url, encodedUrl);
for (Object p : ports.values()) {
Port port = (Port)p;
adjustExtensibilityElements(port.getExtensibilityElements(), url, encodedUrl);
adjustExtensibilityElements(port.getBinding().getExtensibilityElements(), url, encodedUrl);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void adjustExtensibilityElements(List<?> l,
String url,
String encodedUrl) {
for (Object e : l) {
if (e instanceof SOAPAddress) {
String add = ((SOAPAddress)e).getLocationURI();
int idx = add.indexOf("jndiURL=");
if (idx != -1) {
int idx2 = add.indexOf("&", idx);
add = add.substring(0, idx)
+ "jndiURL=" + encodedUrl
+ (idx2 == -1 ? "" : add.substring(idx2));
((SOAPAddress)e).setLocationURI(add);
}
} else if (e.getClass().getSimpleName().startsWith("JndiURLType")) {
try {
e.getClass().getMethod("setValue", String.class).invoke(e, url);
} catch (Exception ex) {
//ignore
}
} else {
try {
Field f = e.getClass().getDeclaredField("jmsNamingProperty");
ReflectionUtil.setAccessible(f);
List<?> props = (List<?>)f.get(e);
for (Object prop : props) {
f = prop.getClass().getDeclaredField("name");
ReflectionUtil.setAccessible(f);
if ("java.naming.provider.url".equals(f.get(prop))) {
f = prop.getClass().getDeclaredField("value");
ReflectionUtil.setAccessible(f);
String value = (String)f.get(prop);
if (value == null || !value.startsWith("classpath")) {
f.set(prop, url);
}
}
}
} catch (Exception ex) {
//ignore
}
}
}
}
public void stop() throws Exception {
tearDown();
}
public void tearDown() throws Exception {
if (broker != null) {
broker.stop();
}
}
//START SNIPPET: broker
public final void run() {
try {
broker = new BrokerService();
broker.setPersistent(false);
broker.setPersistenceAdapter(new MemoryPersistenceAdapter());
broker.setTmpDataDirectory(new File("./target"));
broker.setUseJmx(false);
if (brokerName != null) {
broker.setBrokerName(brokerName);
}
broker.addConnector(brokerUrl1);
broker.start();
} catch (Exception e) {
e.printStackTrace();
}
}
//END SNIPPET: broker
public static void main(String[] args) {
try {
String url = null;
if (args.length > 0) {
url = args[0];
}
EmbeddedJMSBrokerLauncher s = new EmbeddedJMSBrokerLauncher(url);
s.start();
} catch (Exception ex) {
ex.printStackTrace();
System.exit(-1);
} finally {
System.out.println("done!");
}
}
}