diff options
author | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2009-10-06 14:24:43 +0000 |
---|---|---|
committer | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2009-10-06 14:24:43 +0000 |
commit | 5d83de3646c6f1b07d2221f5586088deeca27d0a (patch) | |
tree | 605dce7357563e281288788013b24b9205ea3277 /branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault | |
parent | d6c22ffc58fc7728500511fc761db5bbb488faf8 (diff) |
Branch for 1.5.2
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@822292 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault')
5 files changed, 811 insertions, 0 deletions
diff --git a/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultProviderFactory.java b/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultProviderFactory.java new file mode 100644 index 0000000000..cde7dfd6aa --- /dev/null +++ b/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultProviderFactory.java @@ -0,0 +1,69 @@ +/* + * 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.tuscany.sca.binding.jms.wireformat.jmsdefault.runtime; + +import org.apache.tuscany.sca.assembly.Binding; +import org.apache.tuscany.sca.binding.jms.impl.JMSBinding; +import org.apache.tuscany.sca.binding.jms.provider.JMSResourceFactory; +import org.apache.tuscany.sca.binding.jms.provider.JMSResourceFactoryExtensionPoint; +import org.apache.tuscany.sca.binding.jms.wireformat.jmsdefault.WireFormatJMSDefault; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.provider.WireFormatProvider; +import org.apache.tuscany.sca.provider.WireFormatProviderFactory; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentReference; +import org.apache.tuscany.sca.runtime.RuntimeComponentService; + +/** + * @version $Rev$ $Date$ + */ +public class WireFormatJMSDefaultProviderFactory implements WireFormatProviderFactory<WireFormatJMSDefault> { + private ExtensionPointRegistry registry; + private JMSResourceFactoryExtensionPoint jmsRFEP; + + public WireFormatJMSDefaultProviderFactory(ExtensionPointRegistry registry) { + super(); + this.registry = registry; + jmsRFEP = (JMSResourceFactoryExtensionPoint) registry.getExtensionPoint(JMSResourceFactoryExtensionPoint.class); + } + + /** + */ + public WireFormatProvider createReferenceWireFormatProvider(RuntimeComponent component, RuntimeComponentReference reference, + Binding binding) { + return new WireFormatJMSDefaultReferenceProvider(registry, component, reference, binding); + } + + /** + */ + public WireFormatProvider createServiceWireFormatProvider(RuntimeComponent component, RuntimeComponentService service, Binding binding) { + JMSResourceFactory jmsRF = jmsRFEP.createJMSResourceFactory((JMSBinding) binding); + return new WireFormatJMSDefaultServiceProvider(registry, component, service, binding, jmsRF); + } + + /** + * @see org.apache.tuscany.sca.provider.ProviderFactory#getModelType() + */ + public Class getModelType() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultReferenceInterceptor.java b/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultReferenceInterceptor.java new file mode 100644 index 0000000000..f132940b22 --- /dev/null +++ b/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultReferenceInterceptor.java @@ -0,0 +1,176 @@ +/* + * 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.tuscany.sca.binding.jms.wireformat.jmsdefault.runtime; + +import java.util.HashMap; +import java.util.List; +import javax.jms.BytesMessage; +import javax.jms.JMSException; +import javax.jms.Session; +import javax.xml.namespace.QName; + +import org.apache.axiom.om.OMElement; +import org.apache.tuscany.sca.binding.jms.context.JMSBindingContext; +import org.apache.tuscany.sca.binding.jms.impl.JMSBinding; +import org.apache.tuscany.sca.binding.jms.impl.JMSBindingConstants; +import org.apache.tuscany.sca.binding.jms.impl.JMSBindingException; +import org.apache.tuscany.sca.binding.jms.provider.JMSMessageProcessor; +import org.apache.tuscany.sca.binding.jms.provider.JMSMessageProcessorUtil; +import org.apache.tuscany.sca.binding.jms.provider.JMSResourceFactory; +import org.apache.tuscany.sca.binding.jms.provider.DefaultMessageProcessor; +import org.apache.tuscany.sca.binding.jms.wireformat.jmsdefault.WireFormatJMSDefault; +import org.apache.tuscany.sca.interfacedef.DataType; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.util.FaultException; +import org.apache.tuscany.sca.invocation.Interceptor; +import org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.invocation.Message; +import org.apache.tuscany.sca.runtime.RuntimeWire; + +/** + * + * @version $Rev$ $Date$ + */ +public class WireFormatJMSDefaultReferenceInterceptor implements Interceptor { + + private Invoker next; + private RuntimeWire runtimeWire; + private JMSResourceFactory jmsResourceFactory; + private JMSBinding jmsBinding; + private DefaultMessageProcessor requestMessageProcessor; + private DefaultMessageProcessor responseMessageProcessor; + private HashMap<String, Boolean> inputWrapperMap; + private HashMap<String, OMElement> outputWrapperMap; + + public WireFormatJMSDefaultReferenceInterceptor(JMSBinding jmsBinding, JMSResourceFactory jmsResourceFactory, RuntimeWire runtimeWire, HashMap<String, Boolean> inputWrapperMap, + HashMap<String, OMElement> outputWrapperMap) { + super(); + this.jmsBinding = jmsBinding; + this.runtimeWire = runtimeWire; + this.jmsResourceFactory = jmsResourceFactory; + // Note the default processor doesn't follow the normal processor pattern + // as it has to handle both text and bytes messages + this.requestMessageProcessor = new DefaultMessageProcessor(jmsBinding); + this.responseMessageProcessor = new DefaultMessageProcessor(jmsBinding); + this.inputWrapperMap = inputWrapperMap; + this.outputWrapperMap = outputWrapperMap; + } + + public Message invoke(Message msg) { + + if (jmsBinding.getRequestWireFormat() instanceof WireFormatJMSDefault) { + msg = invokeRequest(msg); + } + + msg = getNext().invoke(msg); + + if (jmsBinding.getResponseWireFormat() instanceof WireFormatJMSDefault) { + msg = invokeResponse(msg); + } + + return msg; + } + + public Message invokeRequest(Message msg) { + try { + // get the jms context + JMSBindingContext context = msg.getBindingContext(); + Session session = context.getJmsSession(); + + javax.jms.Message requestMsg; + + if (((WireFormatJMSDefault) jmsBinding.getRequestWireFormat()).isUseBytesMessage()) { + requestMsg = requestMessageProcessor.insertPayloadIntoJMSBytesMessage(session, msg.getBody(), this.inputWrapperMap.get(msg.getOperation().getName())); + } else { + requestMsg = requestMessageProcessor.insertPayloadIntoJMSTextMessage(session, msg.getBody(), this.inputWrapperMap.get(msg.getOperation().getName())); + } + + msg.setBody(requestMsg); + + requestMsg.setJMSReplyTo(context.getReplyToDestination()); + + return msg; + } catch (JMSException e) { + throw new JMSBindingException(e); + } + } + + public Message invokeResponse(Message msg) { + if (msg.getBody() != null) { + javax.jms.Message jmsMsg = (javax.jms.Message) msg.getBody(); + + Operation op = msg.getOperation(); + DataType outputDataType = op.getOutputType(); + + Class<?> outputType = null; + if (outputDataType != null) { + outputType = outputDataType.getPhysical(); + } + + if (outputType != null && javax.jms.Message.class.isAssignableFrom(outputType)) { + msg.setBody(jmsMsg); + } else { + + OMElement wrapper = null; + // if we have a fault no need to wrap the response + try { + if (!jmsMsg.getBooleanProperty(JMSBindingConstants.FAULT_PROPERTY)) { + // If there is only one arg we must add a wrapper if the operation is wrapper style + wrapper = this.outputWrapperMap.get(msg.getOperation().getName()); + } + } catch (JMSException e) { + throw new JMSBindingException(e); + } + + Object response; + if (jmsMsg instanceof BytesMessage) { + response = responseMessageProcessor.extractPayloadFromJMSBytesMessage(jmsMsg, wrapper); + } else { + response = responseMessageProcessor.extractPayloadFromJMSTextMessage(jmsMsg, wrapper); + } + + if (response != null) { + msg.setBody(response); + try { + if (jmsMsg.getBooleanProperty(JMSBindingConstants.FAULT_PROPERTY)) { + FaultException e = new FaultException("remote exception", response); + OMElement om = (OMElement) response; + e.setFaultName(new QName(om.getNamespace().getNamespaceURI(), om.getLocalName())); + msg.setFaultBody(e); + } + } catch (JMSException e) { + throw new JMSBindingException(e); + } + } else { + msg.setBody(null); + } + } + } + + return msg; + } + + public Invoker getNext() { + return next; + } + + public void setNext(Invoker next) { + this.next = next; + } +} diff --git a/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultReferenceProvider.java b/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultReferenceProvider.java new file mode 100644 index 0000000000..f15d7317f8 --- /dev/null +++ b/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultReferenceProvider.java @@ -0,0 +1,199 @@ +/* + * 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.tuscany.sca.binding.jms.wireformat.jmsdefault.runtime; + +import java.util.HashMap; +import java.util.List; + +import org.apache.axiom.om.OMAbstractFactory; +import org.apache.axiom.om.OMElement; +import org.apache.axiom.om.OMFactory; +import org.apache.axiom.om.OMNamespace; +import org.apache.tuscany.sca.assembly.Binding; +import org.apache.tuscany.sca.binding.jms.impl.JMSBinding; +import org.apache.tuscany.sca.binding.jms.impl.JMSBindingConstants; +import org.apache.tuscany.sca.binding.jms.wireformat.jmsdefault.WireFormatJMSDefault; +import org.apache.tuscany.sca.binding.ws.WebServiceBinding; +import org.apache.tuscany.sca.binding.ws.WebServiceBindingFactory; +import org.apache.tuscany.sca.binding.ws.wsdlgen.BindingWSDLGenerator; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.interfacedef.DataType; +import org.apache.tuscany.sca.interfacedef.InterfaceContract; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.util.ElementInfo; +import org.apache.tuscany.sca.invocation.Interceptor; +import org.apache.tuscany.sca.invocation.Phase; +import org.apache.tuscany.sca.provider.WireFormatProvider; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentReference; + +/** + * @version $Rev$ $Date$ + */ +public class WireFormatJMSDefaultReferenceProvider implements WireFormatProvider { + private ExtensionPointRegistry registry; + private RuntimeComponent component; + private RuntimeComponentReference reference; + private JMSBinding binding; + private InterfaceContract interfaceContract; + private HashMap<String, Boolean> inputWrapperMap; + private HashMap<String, OMElement> outputWrapperMap; + + public WireFormatJMSDefaultReferenceProvider(ExtensionPointRegistry registry, RuntimeComponent component, RuntimeComponentReference reference, Binding binding) { + super(); + this.registry = registry; + this.component = component; + this.reference = reference; + this.binding = (JMSBinding) binding; + + this.inputWrapperMap = new HashMap<String, Boolean>(); + this.outputWrapperMap = new HashMap<String, OMElement>(); + + // configure the reference based on this wire format + + // currently maintaining the message processor structure which + // contains the details of jms message processing so set the message + // type here if not set explicitly in SCDL + if (this.binding.getRequestWireFormat() instanceof WireFormatJMSDefault){ + this.binding.setRequestMessageProcessorName(JMSBindingConstants.DEFAULT_MP_CLASSNAME); + } + if (this.binding.getResponseWireFormat() instanceof WireFormatJMSDefault){ + this.binding.setResponseMessageProcessorName(JMSBindingConstants.DEFAULT_MP_CLASSNAME); + } + + // TODO - can be null if it's a $self$ reference. Need to decide if + // that's valid + if (reference.getReference() == null){ + interfaceContract = reference.getInterfaceContract(); + return; + } + + List<Operation> opList = reference.getReference().getInterfaceContract().getInterface().getOperations(); + + // Go through each operation and add wrapper info + OMFactory factory = OMAbstractFactory.getOMFactory(); + + // set the binding interface contract to represent the WSDL for the + // xml messages that will be sent + // I think we have to check for asIs because the Java2WSDL will blow up when using javax.jms.Message + if (reference.getInterfaceContract() != null && !isAsIs()) { + WebServiceBindingFactory wsFactory = registry.getExtensionPoint(WebServiceBindingFactory.class); + WebServiceBinding wsBinding = wsFactory.createWebServiceBinding(); + BindingWSDLGenerator.generateWSDL(component, reference, wsBinding, registry, null); + interfaceContract = wsBinding.getBindingInterfaceContract(); + interfaceContract.getInterface().resetDataBinding(OMElement.class.getName()); + + List<Operation> wsdlOpList = interfaceContract.getInterface().getOperations(); + + for (Operation op : opList) { + + String name = op.getName(); + Operation matchingWsdlOp = null; + + // find the matching wsdlop + for (Operation wsdlOp : wsdlOpList) { + if (name.equals(wsdlOp.getName())) { + matchingWsdlOp = wsdlOp; + + break; + } + } + + // only add operations that need to be wrapped/unwrapped + // we need to look at the wsdl interface to determine if the op is wrapped or not + + // TODO - not sure we really support viewing the input/output as separately wrapped + // like the separate code paths imply. Not sure how many @OneWay tests we have, this might + // not be an issue. + + if (matchingWsdlOp.isInputWrapperStyle()) { + if (op.getInputType().getLogical().size() == 1) { + this.inputWrapperMap.put(name, true); + } else { + this.inputWrapperMap.put(name, false); + } + } else { + this.inputWrapperMap.put(name, false); + } + + if (matchingWsdlOp.isOutputWrapperStyle()) { + // we only need to know what the wrapper is on the deserialization + // might need to change this when there input/output wrapper style is different + ElementInfo ei = op.getOutputWrapper().getWrapperElement(); + String namespace = ei.getQName().getNamespaceURI(); + String opName = ei.getQName().getLocalPart(); + OMNamespace ns = factory.createOMNamespace(namespace, "ns2"); + OMElement wrapper = factory.createOMElement(opName, ns); + + this.outputWrapperMap.put(name, wrapper); + } + } + } else { + interfaceContract = reference.getReference().getInterfaceContract(); + } + + } + + protected boolean isAsIs() { + InterfaceContract ic = reference.getInterfaceContract(); + if (ic.getInterface().getOperations().size() != 1) { + return false; + } + + List<DataType> inputDataTypes = ic.getInterface().getOperations().get(0).getInputType().getLogical(); + + if (inputDataTypes.size() != 1) { + return false; + } + + Class<?> inputType = inputDataTypes.get(0).getPhysical(); + + if (javax.jms.Message.class.isAssignableFrom(inputType)) { + return true; + } + return false; + } + + public InterfaceContract configureWireFormatInterfaceContract(InterfaceContract interfaceContract){ + + if (this.interfaceContract != null && + !isAsIs()) { + if (this.binding.getRequestWireFormat() instanceof WireFormatJMSDefault){ + // set the request data transformation + interfaceContract.getInterface().resetInterfaceInputTypes(this.interfaceContract.getInterface()); + } + if (this.binding.getResponseWireFormat() instanceof WireFormatJMSDefault){ + // set the response data transformation + interfaceContract.getInterface().resetInterfaceOutputTypes(this.interfaceContract.getInterface()); + } + } + + return interfaceContract; + } + + public Interceptor createInterceptor() { + return new WireFormatJMSDefaultReferenceInterceptor((JMSBinding) binding, null, reference.getRuntimeWire(binding), inputWrapperMap, outputWrapperMap); + } + + public String getPhase() { + return Phase.REFERENCE_BINDING_WIREFORMAT; + } + +} diff --git a/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultServiceInterceptor.java b/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultServiceInterceptor.java new file mode 100644 index 0000000000..0753b8e7ef --- /dev/null +++ b/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultServiceInterceptor.java @@ -0,0 +1,176 @@ +/* + * 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.tuscany.sca.binding.jms.wireformat.jmsdefault.runtime; + +import java.util.HashMap; +import java.util.List; + +import javax.jms.BytesMessage; +import javax.jms.Session; + +import org.apache.axiom.om.OMElement; +import org.apache.tuscany.sca.binding.jms.context.JMSBindingContext; +import org.apache.tuscany.sca.binding.jms.impl.JMSBinding; +import org.apache.tuscany.sca.binding.jms.provider.DefaultMessageProcessor; +import org.apache.tuscany.sca.binding.jms.provider.JMSMessageProcessor; +import org.apache.tuscany.sca.binding.jms.provider.JMSMessageProcessorUtil; +import org.apache.tuscany.sca.binding.jms.provider.JMSResourceFactory; +import org.apache.tuscany.sca.binding.jms.wireformat.jmsdefault.WireFormatJMSDefault; +import org.apache.tuscany.sca.interfacedef.DataType; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.invocation.Interceptor; +import org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.invocation.Message; +import org.apache.tuscany.sca.runtime.RuntimeWire; + +/** + * Policy handler to handle PolicySet related to Logging with the QName {http://tuscany.apache.org/xmlns/sca/1.0/impl/java}LoggingPolicy + * + * @version $Rev$ $Date$ + */ +public class WireFormatJMSDefaultServiceInterceptor implements Interceptor { + private Invoker next; + private RuntimeWire runtimeWire; + private JMSResourceFactory jmsResourceFactory; + private JMSBinding jmsBinding; + private DefaultMessageProcessor requestMessageProcessor; + private DefaultMessageProcessor responseMessageProcessor; + private HashMap<String,OMElement> inputWrapperMap; + private HashMap<String, Boolean> outputWrapperMap; + + public WireFormatJMSDefaultServiceInterceptor(JMSBinding jmsBinding, JMSResourceFactory jmsResourceFactory, RuntimeWire runtimeWire, HashMap<String, OMElement> inputWrapperMap, + HashMap<String, Boolean> outputWrapperMap) { + super(); + this.jmsBinding = jmsBinding; + this.runtimeWire = runtimeWire; + this.jmsResourceFactory = jmsResourceFactory; + // Note the default processor doesn't follow the normal processor pattern + // as it has to handle both text and bytes messages + this.requestMessageProcessor = new DefaultMessageProcessor(jmsBinding); + this.responseMessageProcessor = new DefaultMessageProcessor(jmsBinding); + this.inputWrapperMap = inputWrapperMap; + this.outputWrapperMap = outputWrapperMap; + + } + + public Message invoke(Message msg) { + + if (jmsBinding.getRequestWireFormat() instanceof WireFormatJMSDefault) { + msg = invokeRequest(msg); + } + + msg = getNext().invoke(msg); + + // if it's oneway return back + Operation operation = msg.getOperation(); + if (operation != null && operation.isNonBlocking()) { + return msg; + } + + if (jmsBinding.getResponseWireFormat() instanceof WireFormatJMSDefault) { + msg = invokeResponse(msg); + } + + return msg; + } + + public Message invokeRequest(Message msg) { + // get the jms context + JMSBindingContext context = msg.getBindingContext(); + javax.jms.Message jmsMsg = context.getJmsMsg(); + + Operation op = msg.getOperation(); + List<DataType> inputDataTypes = op.getInputType().getLogical(); + + Class<?> inputType = null; + if (inputDataTypes.size() == 1) { + inputType = inputDataTypes.get(0).getPhysical(); + } + if (inputType != null && javax.jms.Message.class.isAssignableFrom(inputType)) { + msg.setBody(new Object[] { jmsMsg }); + + if (jmsMsg instanceof BytesMessage) { + context.setUseBytesForWFJMSDefaultResponse(true); + } else { + context.setUseBytesForWFJMSDefaultResponse(false); + } + } else { + + // If there is only one arg we must add a wrapper if the operation is wrapper style + OMElement wrapper = this.inputWrapperMap.get(msg.getOperation().getName()); + + Object requestPayload; + if (jmsMsg instanceof BytesMessage) { + requestPayload = responseMessageProcessor.extractPayloadFromJMSBytesMessage(jmsMsg, wrapper); + context.setUseBytesForWFJMSDefaultResponse(true); + } else { + requestPayload = responseMessageProcessor.extractPayloadFromJMSTextMessage(jmsMsg, wrapper ); + context.setUseBytesForWFJMSDefaultResponse(false); + } + + msg.setBody(new Object[] { requestPayload }); + } + + return msg; + + } + + public Message invokeResponse(Message msg) { + + // get the jms context + JMSBindingContext context = msg.getBindingContext(); + Session session = context.getJmsResponseSession(); + + javax.jms.Message responseJMSMsg; + + boolean respondBytesMessage = context.isUseBytesForWFJMSDefaultResponse(); + + if (msg.isFault()) { + if (respondBytesMessage == true) { + responseJMSMsg = requestMessageProcessor.createFaultJMSBytesMessage(session, (Throwable) msg.getBody()); + } else { + responseJMSMsg = responseMessageProcessor.createFaultJMSTextMessage(session, (Throwable) msg.getBody()); + } + } else { + boolean unwrap = false; + + if (this.outputWrapperMap.get(msg.getOperation().getName()) != null){ + unwrap = this.outputWrapperMap.get(msg.getOperation().getName()); + } + + if (respondBytesMessage == true) { + responseJMSMsg = requestMessageProcessor.insertPayloadIntoJMSBytesMessage(session, msg.getBody(), unwrap); + } else { + responseJMSMsg = requestMessageProcessor.insertPayloadIntoJMSTextMessage(session, msg.getBody(), unwrap); + } + } + + msg.setBody(responseJMSMsg); + + return msg; + } + + public Invoker getNext() { + return next; + } + + public void setNext(Invoker next) { + this.next = next; + } +} diff --git a/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultServiceProvider.java b/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultServiceProvider.java new file mode 100644 index 0000000000..4f63867350 --- /dev/null +++ b/branches/sca-java-1.5.2/modules/binding-jms-runtime/src/main/java/org/apache/tuscany/sca/binding/jms/wireformat/jmsdefault/runtime/WireFormatJMSDefaultServiceProvider.java @@ -0,0 +1,191 @@ +/* + * 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.tuscany.sca.binding.jms.wireformat.jmsdefault.runtime; + +import java.util.HashMap; +import java.util.List; + +import org.apache.axiom.om.OMAbstractFactory; +import org.apache.axiom.om.OMElement; +import org.apache.axiom.om.OMFactory; +import org.apache.axiom.om.OMNamespace; +import org.apache.tuscany.sca.assembly.Binding; +import org.apache.tuscany.sca.binding.jms.impl.JMSBinding; +import org.apache.tuscany.sca.binding.jms.impl.JMSBindingConstants; +import org.apache.tuscany.sca.binding.jms.provider.JMSResourceFactory; +import org.apache.tuscany.sca.binding.jms.wireformat.jmsdefault.WireFormatJMSDefault; +import org.apache.tuscany.sca.binding.ws.WebServiceBinding; +import org.apache.tuscany.sca.binding.ws.WebServiceBindingFactory; +import org.apache.tuscany.sca.binding.ws.wsdlgen.BindingWSDLGenerator; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.interfacedef.DataType; +import org.apache.tuscany.sca.interfacedef.InterfaceContract; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.util.ElementInfo; +import org.apache.tuscany.sca.invocation.Interceptor; +import org.apache.tuscany.sca.invocation.Phase; +import org.apache.tuscany.sca.provider.WireFormatProvider; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentService; + +/** + * @version $Rev$ $Date$ + */ +public class WireFormatJMSDefaultServiceProvider implements WireFormatProvider { + private ExtensionPointRegistry registry; + private RuntimeComponent component; + private RuntimeComponentService service; + private JMSBinding binding; + private JMSResourceFactory jmsResourceFactory; + private InterfaceContract interfaceContract; + private HashMap<String, OMElement> inputWrapperMap; + private HashMap<String, Boolean> outputWrapperMap; + + public WireFormatJMSDefaultServiceProvider(ExtensionPointRegistry registry, RuntimeComponent component, RuntimeComponentService service, Binding binding, JMSResourceFactory jmsResourceFactory) { + super(); + this.component = component; + this.service = service; + this.binding = (JMSBinding) binding; + this.jmsResourceFactory = jmsResourceFactory; + + this.inputWrapperMap = new HashMap<String, OMElement>(); + this.outputWrapperMap = new HashMap<String, Boolean>(); + + // configure the service based on this wire format + + // currently maintaining the message processor structure which + // contains the details of jms message processing so set the message + // type here if not set explicitly in SCDL + if (this.binding.getRequestWireFormat() instanceof WireFormatJMSDefault){ + this.binding.setRequestMessageProcessorName(JMSBindingConstants.DEFAULT_MP_CLASSNAME); + } + if (this.binding.getResponseWireFormat() instanceof WireFormatJMSDefault){ + this.binding.setResponseMessageProcessorName(JMSBindingConstants.DEFAULT_MP_CLASSNAME); + } + + List<Operation> opList = service.getService().getInterfaceContract().getInterface().getOperations(); + + // Go through each operation and add wrapper info + OMFactory factory = OMAbstractFactory.getOMFactory(); + + // set the binding interface contract to represent the WSDL for the + // xml messages that will be sent + + // I think we have to check for asIs because the Java2WSDL will blow up when using javax.jms.Message + if (service.getInterfaceContract() != null && !isAsIs()) { + WebServiceBindingFactory wsFactory = registry.getExtensionPoint(WebServiceBindingFactory.class); + WebServiceBinding wsBinding = wsFactory.createWebServiceBinding(); + BindingWSDLGenerator.generateWSDL(component, service, wsBinding, registry, null); + interfaceContract = wsBinding.getBindingInterfaceContract(); + interfaceContract.getInterface().resetDataBinding(OMElement.class.getName()); + + List<Operation> wsdlOpList = interfaceContract.getInterface().getOperations(); + + for (Operation op : opList) { + String name = op.getName(); + + Operation matchingWsdlOp = null; + + // find the matching wsdlop + for (Operation wsdlOp : wsdlOpList) { + if (name.equals(wsdlOp.getName())) { + matchingWsdlOp = wsdlOp; + break; + } + } + + // only add operations that need to be wrapped/unwrapped + + // TODO - not sure we really support viewing the input/output as separately wrapped + // like the separate code paths imply. Not sure how many @OneWay tests we have, this might + // not be an issue. + if (matchingWsdlOp.isInputWrapperStyle()) { + if (op.getInputType().getLogical().size() == 1) { + // we only need to know what the wrapper is on the deserialization + // might need to change this when the input/output wrapper style is different + ElementInfo ei = op.getInputWrapper().getWrapperElement(); + String namespace = ei.getQName().getNamespaceURI(); + String opName = ei.getQName().getLocalPart(); + OMNamespace ns = factory.createOMNamespace(namespace, "ns1"); + OMElement wrapper = factory.createOMElement(opName, ns); + this.inputWrapperMap.put(name, wrapper); + } + } + + if (matchingWsdlOp.isOutputWrapperStyle()) { + this.outputWrapperMap.put(name, true); + } else { + this.outputWrapperMap.put(name, false); + } + + } + + } else { + interfaceContract = service.getService().getInterfaceContract(); + } + } + + protected boolean isAsIs() { + InterfaceContract ic = service.getInterfaceContract(); + if (ic.getInterface().getOperations().size() != 1) { + return false; + } + + List<DataType> inputDataTypes = ic.getInterface().getOperations().get(0).getInputType().getLogical(); + + if (inputDataTypes.size() != 1) { + return false; + } + + Class<?> inputType = inputDataTypes.get(0).getPhysical(); + + if (javax.jms.Message.class.isAssignableFrom(inputType)) { + return true; + } + return false; + } + + public InterfaceContract configureWireFormatInterfaceContract(InterfaceContract interfaceContract){ + + if (this.interfaceContract != null && + !isAsIs()) { + if (this.binding.getRequestWireFormat() instanceof WireFormatJMSDefault){ + // set the request data transformation + interfaceContract.getInterface().resetInterfaceInputTypes(this.interfaceContract.getInterface()); + } + if (this.binding.getResponseWireFormat() instanceof WireFormatJMSDefault){ + // set the response data transformation + interfaceContract.getInterface().resetInterfaceOutputTypes(this.interfaceContract.getInterface()); + } + } + + return interfaceContract; + } + + + public Interceptor createInterceptor() { + return new WireFormatJMSDefaultServiceInterceptor(binding, jmsResourceFactory, service.getRuntimeWire(binding), this.inputWrapperMap, this.outputWrapperMap); + } + + public String getPhase() { + return Phase.SERVICE_BINDING_WIREFORMAT; + } + +} |