You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ff...@apache.org on 2008/05/27 10:50:32 UTC
svn commit: r660430 - in /servicemix/smx3/trunk/deployables:
bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/
bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/
serviceengines/servicemix-cxf-se/...
Author: ffang
Date: Tue May 27 01:50:31 2008
New Revision: 660430
URL: http://svn.apache.org/viewvc?rev=660430&view=rev
Log:
[SM-1372]support exception check for cxf bc provider outgoing chain
Modified:
servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProvider.java
servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderTest.java
servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/GreeterImplForProvider.java
servicemix/smx3/trunk/deployables/serviceengines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxfse/CxfSeProxyFactoryBean.java
Modified: servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProvider.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProvider.java?rev=660430&r1=660429&r2=660430&view=diff
==============================================================================
--- servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProvider.java (original)
+++ servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcProvider.java Tue May 27 01:50:31 2008
@@ -28,6 +28,7 @@
import javax.jbi.management.DeploymentException;
import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
import javax.jbi.messaging.NormalizedMessage;
import javax.wsdl.WSDLException;
import javax.wsdl.factory.WSDLFactory;
@@ -36,7 +37,10 @@
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
+
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -45,6 +49,9 @@
import org.apache.cxf.Bus;
import org.apache.cxf.binding.AbstractBindingFactory;
+import org.apache.cxf.binding.jbi.JBIConstants;
+import org.apache.cxf.binding.jbi.JBIFault;
+
import org.apache.cxf.binding.soap.interceptor.SoapActionOutInterceptor;
import org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor;
import org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor;
@@ -56,7 +63,6 @@
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.StaxOutInterceptor;
-
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.ExchangeImpl;
import org.apache.cxf.message.Message;
@@ -77,6 +83,7 @@
import org.apache.cxf.wsdl11.ServiceWSDLBuilder;
import org.apache.cxf.wsdl11.WSDLServiceBuilder;
import org.apache.cxf.wsdl11.WSDLServiceFactory;
+import org.apache.servicemix.JbiConstants;
import org.apache.servicemix.common.endpoints.ProviderEndpoint;
import org.apache.servicemix.cxfbc.interceptors.JbiOutInterceptor;
import org.apache.servicemix.cxfbc.interceptors.JbiOutWsdl1Interceptor;
@@ -84,9 +91,6 @@
import org.apache.servicemix.soap.util.DomUtil;
import org.springframework.core.io.Resource;
-
-
-
/**
*
* @author gnodet
@@ -95,8 +99,6 @@
public class CxfBcProvider extends ProviderEndpoint implements
CxfBcEndpointWithInterceptor {
-
-
List<Interceptor> in = new CopyOnWriteArrayList<Interceptor>();
List<Interceptor> out = new CopyOnWriteArrayList<Interceptor>();
@@ -104,65 +106,65 @@
List<Interceptor> outFault = new CopyOnWriteArrayList<Interceptor>();
List<Interceptor> inFault = new CopyOnWriteArrayList<Interceptor>();
-
+
private Resource wsdl;
-
+
private String busCfg;
-
+
private Bus bus;
-
+
private ConduitInitiator conduitInit;
-
+
private URI locationURI;
-
+
private EndpointInfo ei;
-
+
private Endpoint ep;
private Service cxfService;
-
+
private boolean mtomEnabled;
-
+
private boolean useJBIWrapper = true;
-
-
-
+
public void processExchange(MessageExchange exchange) {
-
+
}
public void process(MessageExchange exchange) throws Exception {
-
+
if (exchange.getStatus() != ExchangeStatus.ACTIVE) {
return;
}
NormalizedMessage nm = exchange.getMessage("in");
-
- Conduit conduit = conduitInit.getConduit(ei);
- CxfBcProviderMessageObserver obs = new CxfBcProviderMessageObserver(exchange, this);
+
+ Conduit conduit = conduitInit.getConduit(ei);
+ CxfBcProviderMessageObserver obs = new CxfBcProviderMessageObserver(
+ exchange, this);
conduit.setMessageObserver(obs);
Message message = ep.getBinding().createMessage();
message.put(MessageExchange.class, exchange);
Exchange cxfExchange = new ExchangeImpl();
-
+
message.setExchange(cxfExchange);
- cxfExchange.setOutMessage(message);
-
+ cxfExchange.setOutMessage(message);
+
QName opeName = exchange.getOperation();
BindingOperationInfo boi = null;
if (opeName == null) {
- // if interface only have one operation, may not specify the opeName in MessageExchange
+ // if interface only have one operation, may not specify the opeName
+ // in MessageExchange
if (ei.getBinding().getOperations().size() == 1) {
boi = ei.getBinding().getOperations().iterator().next();
} else {
- throw new Fault(
- new Exception("Operation not bound on this MessageExchange"));
-
+ throw new Fault(new Exception(
+ "Operation not bound on this MessageExchange"));
+
}
} else {
- boi = ei.getBinding().getOperation(exchange.getOperation());
+ boi = ei.getBinding().getOperation(exchange.getOperation());
}
- cxfExchange.setOneWay(boi.getOperationInfo().isOneWay());
+ cxfExchange.setOneWay(boi.getOperationInfo().isOneWay());
cxfExchange.put(BindingOperationInfo.class, boi);
cxfExchange.put(Endpoint.class, ep);
cxfExchange.put(Service.class, cxfService);
@@ -173,49 +175,98 @@
outList.add(new JbiOutInterceptor());
outList.add(new MtomCheckInterceptor(true));
outList.add(new AttachmentOutInterceptor());
-
+
}
-
+
outList.add(new JbiOutInterceptor());
outList.add(new JbiOutWsdl1Interceptor(isUseJBIWrapper()));
outList.add(new SoapPreProtocolOutInterceptor());
outList.add(new SoapOutInterceptor(getBus()));
outList.add(new SoapActionOutInterceptor());
- PhaseInterceptorChain outChain = outboundChainCache.get(pm.getOutPhases(), outList);
+ PhaseInterceptorChain outChain = outboundChainCache.get(pm
+ .getOutPhases(), outList);
outChain.add(getOutInterceptors());
outChain.add(getOutFaultInterceptors());
message.setInterceptorChain(outChain);
- InputStream is = JBIMessageHelper.convertMessageToInputStream(nm.getContent());
-
+ InputStream is = JBIMessageHelper.convertMessageToInputStream(nm
+ .getContent());
+
StreamSource source = new StreamSource(is);
message.setContent(Source.class, source);
-
+
message.setContent(InputStream.class, is);
-
+
conduit.prepare(message);
OutputStream os = message.getContent(OutputStream.class);
XMLStreamWriter writer = message.getContent(XMLStreamWriter.class);
-
+
String encoding = getEncoding(message);
-
+
try {
- writer = StaxOutInterceptor.getXMLOutputFactory(message).createXMLStreamWriter(os, encoding);
+ writer = StaxOutInterceptor.getXMLOutputFactory(message)
+ .createXMLStreamWriter(os, encoding);
} catch (XMLStreamException e) {
//
}
message.setContent(XMLStreamWriter.class, writer);
message.put(org.apache.cxf.message.Message.REQUESTOR_ROLE, true);
- outChain.doIntercept(message);
- XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
- if (xtw != null) {
- xtw.writeEndDocument();
- xtw.close();
+ try {
+ outChain.doIntercept(message);
+ //Check to see if there is a Fault from the outgoing chain
+ Exception ex = message.getContent(Exception.class);
+ if (ex != null) {
+ throw ex;
+ }
+ ex = message.getExchange().get(Exception.class);
+ if (ex != null) {
+ throw ex;
+ }
+
+ XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
+ if (xtw != null) {
+ xtw.writeEndDocument();
+ xtw.close();
+ }
+
+ os.flush();
+ is.close();
+ os.close();
+ } catch (Exception e) {
+ faultProcess(exchange, message, e);
}
- os.flush();
- is.close();
- os.close();
+ }
+
+ private void faultProcess(MessageExchange exchange, Message message, Exception e) throws MessagingException {
+ javax.jbi.messaging.Fault fault = exchange.createFault();
+ if (e.getCause() != null) {
+ handleJBIFault(message, e.getCause().getMessage());
+ } else {
+ handleJBIFault(message, e.getMessage());
+ }
+ fault.setContent(message.getContent(Source.class));
+ exchange.setFault(fault);
+ boolean txSync = exchange.getStatus() == ExchangeStatus.ACTIVE
+ && exchange.isTransacted()
+ && Boolean.TRUE.equals(exchange
+ .getProperty(JbiConstants.SEND_SYNC));
+ if (txSync) {
+ getContext().getDeliveryChannel().sendSync(exchange);
+ } else {
+ getContext().getDeliveryChannel().send(exchange);
+ }
+ }
+
+ private void handleJBIFault(Message message, String detail) {
+ Document doc = DomUtil.createDocument();
+ Element jbiFault = DomUtil.createElement(doc, new QName(
+ JBIConstants.NS_JBI_BINDING, JBIFault.JBI_FAULT_ROOT));
+ Node jbiFaultDetail = DomUtil.createElement(jbiFault, new QName("", JBIFault.JBI_FAULT_DETAIL));
+ jbiFaultDetail.setTextContent(detail);
+ jbiFault.appendChild(jbiFaultDetail);
+ message.setContent(Source.class, new DOMSource(doc));
+ message.put("jbiFault", true);
}
public List<Interceptor> getOutFaultInterceptors() {
@@ -257,7 +308,7 @@
public Resource getWsdl() {
return wsdl;
}
-
+
@Override
public void validate() throws DeploymentException {
try {
@@ -273,8 +324,7 @@
// use wsdl manager to parse wsdl or get cached definition
definition = getBus().getExtension(WSDLManager.class)
.getDefinition(wsdl.getURL());
-
-
+
} catch (WSDLException ex) {
//
}
@@ -283,60 +333,70 @@
cxfService = factory.create();
ei = cxfService.getServiceInfos().iterator().next()
.getEndpoints().iterator().next();
-
+
for (ServiceInfo serviceInfo : cxfService.getServiceInfos()) {
if (serviceInfo.getName().equals(service)
- && getEndpoint() != null
- && serviceInfo.getEndpoint(new QName(
- serviceInfo.getName().getNamespaceURI(), getEndpoint())) != null) {
- ei = serviceInfo.getEndpoint(new QName(
- serviceInfo.getName().getNamespaceURI(), getEndpoint()));
-
+ && getEndpoint() != null
+ && serviceInfo
+ .getEndpoint(new QName(serviceInfo
+ .getName().getNamespaceURI(),
+ getEndpoint())) != null) {
+ ei = serviceInfo.getEndpoint(new QName(serviceInfo
+ .getName().getNamespaceURI(), getEndpoint()));
+
}
}
- //transform import xsd to inline xsd
- ServiceWSDLBuilder swBuilder = new ServiceWSDLBuilder(getBus(), cxfService.getServiceInfos());
+ // transform import xsd to inline xsd
+ ServiceWSDLBuilder swBuilder = new ServiceWSDLBuilder(getBus(),
+ cxfService.getServiceInfos());
ServiceInfo serInfo = new ServiceInfo();
-
+
Map<String, Element> schemaList = new HashMap<String, Element>();
SchemaUtil schemaUtil = new SchemaUtil(bus, schemaList);
schemaUtil.getSchemas(definition, serInfo);
-
+
serInfo = ei.getService();
for (String key : schemaList.keySet()) {
Element ele = schemaList.get(key);
for (SchemaInfo sInfo : serInfo.getSchemas()) {
Node nl = sInfo.getElement().getElementsByTagNameNS(
- "http://www.w3.org/2001/XMLSchema", "import").item(0);
- if (sInfo.getNamespaceURI() == null //it's import schema
- && nl != null
- && ((Element)nl).getAttribute("namespace")
- .equals(ele.getAttribute("targetNamespace"))) {
-
+ "http://www.w3.org/2001/XMLSchema", "import")
+ .item(0);
+ if (sInfo.getNamespaceURI() == null // it's import
+ // schema
+ && nl != null
+ && ((Element) nl)
+ .getAttribute("namespace")
+ .equals(
+ ele
+ .getAttribute("targetNamespace"))) {
+
sInfo.setElement(ele);
}
}
}
serInfo.setProperty(WSDLServiceBuilder.WSDL_DEFINITION, null);
- description = WSDLFactory.newInstance().newWSDLWriter().getDocument(swBuilder.build());
-
+ description = WSDLFactory.newInstance().newWSDLWriter()
+ .getDocument(swBuilder.build());
if (endpoint == null) {
endpoint = ei.getName().getLocalPart();
}
ei.getBinding().setProperty(
- AbstractBindingFactory.DATABINDING_DISABLED, Boolean.TRUE);
-
-
+ AbstractBindingFactory.DATABINDING_DISABLED,
+ Boolean.TRUE);
+
ep = new EndpointImpl(getBus(), cxfService, ei);
-
- //init transport
+
+ // init transport
if (locationURI != null) {
ei.setAddress(locationURI.toString());
}
-
- ConduitInitiatorManager conduitMgr = getBus().getExtension(ConduitInitiatorManager.class);
- conduitInit = conduitMgr.getConduitInitiator(ei.getTransportId());
+
+ ConduitInitiatorManager conduitMgr = getBus().getExtension(
+ ConduitInitiatorManager.class);
+ conduitInit = conduitMgr.getConduitInitiator(ei
+ .getTransportId());
super.validate();
}
} catch (DeploymentException e) {
@@ -349,9 +409,9 @@
@Override
public void start() throws Exception {
super.start();
-
+
}
-
+
protected Bus getBus() {
if (getBusCfg() != null) {
if (bus == null) {
@@ -363,7 +423,7 @@
return ((CxfBcComponent) getServiceUnit().getComponent()).getBus();
}
}
-
+
public void setBusCfg(String busCfg) {
this.busCfg = busCfg;
}
@@ -379,26 +439,26 @@
public URI getLocationURI() {
return locationURI;
}
-
+
private String getEncoding(Message message) {
Exchange ex = message.getExchange();
- String encoding = (String)message.get(Message.ENCODING);
+ String encoding = (String) message.get(Message.ENCODING);
if (encoding == null && ex.getInMessage() != null) {
encoding = (String) ex.getInMessage().get(Message.ENCODING);
message.put(Message.ENCODING, encoding);
}
-
+
if (encoding == null) {
encoding = "UTF-8";
message.put(Message.ENCODING, encoding);
}
return encoding;
}
-
+
Endpoint getCxfEndpoint() {
return this.ep;
}
-
+
EndpointInfo getEndpointInfo() {
return this.ei;
}
Modified: servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderTest.java?rev=660430&r1=660429&r2=660430&view=diff
==============================================================================
--- servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderTest.java (original)
+++ servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderTest.java Tue May 27 01:50:31 2008
@@ -52,6 +52,8 @@
private InOut io;
private CxfSeComponent component;
+
+
protected void setUp() throws Exception {
super.setUp();
@@ -63,6 +65,32 @@
component.getServiceUnitManager().start("proxy");
}
+ protected void tearDown() throws Exception {
+ component.getServiceUnitManager().stop("proxy");
+ component.getServiceUnitManager().shutDown("proxy");
+ component.getServiceUnitManager().undeploy("proxy", getServiceUnitPath("provider"));
+ }
+
+ public void testExternalServerNotExist() throws Exception {
+ client = new DefaultServiceMixClient(jbi);
+ io = client.createInOutExchange();
+ io.setService(new QName("http://apache.org/hello_world_soap_http", "SOAPServiceProvider"));
+ io.setInterfaceName(new QName("http://apache.org/hello_world_soap_http", "Greeter"));
+ io.setOperation(new QName("http://apache.org/hello_world_soap_http", "greetMe"));
+ //send message to proxy
+ io.getInMessage().setContent(new StringSource(
+ "<message xmlns='http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper'>"
+ + "<part> "
+ + "<greetMe xmlns='http://apache.org/hello_world_soap_http/types'><requestType>"
+ + "ffang with no server"
+ + "</requestType></greetMe>"
+ + "</part> "
+ + "</message>"));
+ client.sendSync(io);
+ assertTrue(new SourceTransformer().contentToString(
+ io.getOutMessage()).indexOf("server is stop") >= 0);
+
+ }
public void testProvider() throws Exception {
LOG.info("test provider");
@@ -116,6 +144,7 @@
assertTrue(new SourceTransformer().contentToString(
io.getOutMessage()).indexOf("Hello exception test Negative number cant be added!") >= 0);
+
//test onway
factory = new JaxWsServerFactoryBean();
factory.setServiceClass(Greeter.class);
Modified: servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/GreeterImplForProvider.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/GreeterImplForProvider.java?rev=660430&r1=660429&r2=660430&view=diff
==============================================================================
--- servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/GreeterImplForProvider.java (original)
+++ servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/GreeterImplForProvider.java Tue May 27 01:50:31 2008
@@ -88,6 +88,9 @@
for (int i = 0; i < clients.length; i++) {
ret += i * 2 + " ";
}
+ } else if ("ffang with no server".equals(me)) {
+ //should catch exception since external server is stop
+ getCalculator().add(1, 2);
}
} catch (AddNumbersFault e) {
@@ -97,6 +100,8 @@
ret = ret + e.getFaultInfo().getId();
} catch (InterruptedException e) {
//
+ } catch (Exception e) {
+ ret = ret + "server is stop";
}
return "Hello " + me + " " + ret;
}
Modified: servicemix/smx3/trunk/deployables/serviceengines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxfse/CxfSeProxyFactoryBean.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/serviceengines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxfse/CxfSeProxyFactoryBean.java?rev=660430&r1=660429&r2=660430&view=diff
==============================================================================
--- servicemix/smx3/trunk/deployables/serviceengines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxfse/CxfSeProxyFactoryBean.java (original)
+++ servicemix/smx3/trunk/deployables/serviceengines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxfse/CxfSeProxyFactoryBean.java Tue May 27 01:50:31 2008
@@ -78,6 +78,9 @@
private Object createProxy() throws Exception {
JaxWsProxyFactoryBean cf = new JaxWsProxyFactoryBean();
cf.setServiceName(getService());
+ if (getEndpoint() != null) {
+ cf.setEndpointName(new QName(getService().getNamespaceURI(), getEndpoint()));
+ }
cf.setServiceClass(type);
cf.setAddress("jbi://" + new IdGenerator().generateSanitizedId());
if (isUseJBIWrapper()) {