antelder 2002/06/18 05:16:05 Modified: java/src/org/apache/wsif/providers/jms JMSFormatter.java WSIFOperation_Jms.java Log: Bug fixes (134730,135199) - native JMS provider requires user JMS properties in response msg, and ports in WSDL defined in specific order Revision Changes Path 1.2 +266 -243 xml-axis-wsif/java/src/org/apache/wsif/providers/jms/JMSFormatter.java Index: JMSFormatter.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/providers/jms/JMSFormatter.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- JMSFormatter.java 6 Jun 2002 08:28:51 -0000 1.1 +++ JMSFormatter.java 18 Jun 2002 12:16:05 -0000 1.2 @@ -59,6 +59,7 @@ import java.io.InputStream; import java.io.OutputStream; +import java.io.Serializable; import java.util.Iterator; import java.util.List; @@ -83,16 +84,16 @@ import org.apache.wsif.wsdl.extensions.jms.JMSInput; import org.apache.wsif.wsdl.extensions.jms.JMSOutput; -public class JMSFormatter implements WSIFFormatter { +public class JMSFormatter implements WSIFFormatter, Serializable { - // Declaration of Header Fields - public static String OPERATION_NAME = "WSDL_Operation"; - public static String INPUT_NAME = "WSDL_Input"; - public static String OUTPUT_NAME = "WSDL_Output"; - public static String PORT_TYPE_NS = "WSDL_PortType_NS"; - public static String PORT_TYPE_LOCAL = "WSDL_PortType_Local"; private javax.wsdl.Definition fieldDefinition; + private String reqOpName; + private String reqInputName; + private String reqOutputName; + private String reqPortTypeNS; + private String reqPortTypeLocal; + /** * Constructor for JMSFormatter */ @@ -159,20 +160,12 @@ copyTo(req.getIncomingMessage(), fhMsg); fhMsg.write(out); - // Add the specific tags to the header - try { - out.setStringProperty(OPERATION_NAME, req.getOperationName()); - out.setStringProperty(INPUT_NAME, req.getInputName()); - out.setStringProperty(OUTPUT_NAME, req.getOutputName()); - out.setStringProperty( - PORT_TYPE_NS, - binding.getPortType().getQName().getNamespaceURI()); - out.setStringProperty( - PORT_TYPE_LOCAL, - binding.getPortType().getQName().getLocalPart()); - } catch (javax.jms.JMSException e) { - } - + setOperationName( req.getOperationName() ); + setInputName( req.getInputName() ); + setOutputName( req.getOutputName() ); + setPortTypeNS( binding.getQName().getNamespaceURI() ); + setPortTypeLocal( binding.getQName().getLocalPart() ); + Tr.exit(); } @@ -216,111 +209,108 @@ String input = null; String output = null; - try { - - operationName = msg.getStringProperty(OPERATION_NAME); - // Check to see if one of the properties are defined - // If so, get the information from them. - if (operationName != null && !operationName.equals("")) { - input = msg.getStringProperty(INPUT_NAME); - output = msg.getStringProperty(OUTPUT_NAME); - - String portType_ns = msg.getStringProperty(PORT_TYPE_NS); - String portType_local = msg.getStringProperty(PORT_TYPE_LOCAL); - - javax.wsdl.QName portTypeName = - new javax.wsdl.QName(portType_ns, portType_local); - - //Locate Binding - javax.wsdl.Binding binding = null; - - for (java.util.Iterator bindings = - fieldDefinition.getBindings().values().iterator(); - bindings.hasNext(); - ) { - javax.wsdl.Binding b = (javax.wsdl.Binding) bindings.next(); - if (b.getPortType().getQName().equals(portTypeName)) { - binding = b; - break; - } - } - - if (binding == null) - throw new WSIFException("Unable to locate Binding"); - - //Locate Service - java.util.Iterator services = fieldDefinition.getServices().values().iterator(); - - while (services.hasNext() && serviceName == null) { - javax.wsdl.Service s = (javax.wsdl.Service) services.next(); - - for (java.util.Iterator ports = s.getPorts().values().iterator(); - ports.hasNext(); - ) { - javax.wsdl.Port p = (javax.wsdl.Port) ports.next(); - if (p.getBinding().getQName().equals(binding.getQName())) { - // Binding found - serviceName = s.getQName(); - portName = p.getName(); - break; - } - } - } - - } - } catch (javax.jms.JMSException e) { - } - - // Check to see if anything was defined - if (operationName == null) { - // Nothing defined. Resort to getting the info from the service definition - java.util.Iterator services = fieldDefinition.getServices().values().iterator(); - - while (services.hasNext() && serviceName == null) { - - javax.wsdl.Service s = (javax.wsdl.Service) services.next(); - //Get the first Port that has a JMS Address - java.util.Iterator i = s.getPorts().values().iterator(); - - while (i.hasNext() && serviceName == null) { - javax.wsdl.Port p = (javax.wsdl.Port) i.next(); - java.util.Iterator e = p.getExtensibilityElements().iterator(); - - while (e.hasNext() && serviceName == null) { - javax.wsdl.extensions.ExtensibilityElement ee = - (javax.wsdl.extensions.ExtensibilityElement) e.next(); - - // Check to see if the extensibility element is a JMS binding - if (ee - .getElementType() - .equals(org.apache.wsif.wsdl.extensions.jms.JMSConstants.Q_ELEM_JMS_ADDRESS)) { - - // Assign the service definition - serviceName = s.getQName(); - portName = p.getName(); - - // Locate the operation - javax.wsdl.Binding binding = p.getBinding(); - if (binding != null) { - javax.wsdl.PortType portType = p.getBinding().getPortType(); - if (portType != null) { - java.util.List operations = portType.getOperations(); - if (operations != null && operations.size() > 0) { - javax.wsdl.Operation o = (javax.wsdl.Operation) operations.get(0); - operationName = o.getName(); - if (o.getInput() != null) - input = o.getInput().getName(); - if (o.getOutput() != null) - output = o.getOutput().getName(); - } - } - } + String portType_ns = null; + String portType_local = null; - } - } - } - } - } + operationName = getOperationName(); + // Check to see if one of the properties are defined + // If so, get the information from them. + if (operationName != null && !operationName.equals("")) { + input = getInputName(); + output = getOutputName(); + + portType_ns = getPortTypeNS(); + portType_local = getPortTypeLocal(); + + javax.wsdl.QName portTypeName = new javax.wsdl.QName(portType_ns, portType_local); + + //Locate Binding + javax.wsdl.Binding binding = null; + + for (java.util.Iterator bindings = fieldDefinition.getBindings().values().iterator(); bindings.hasNext();) { + javax.wsdl.Binding b = (javax.wsdl.Binding)bindings.next(); + if (b.getQName().equals(portTypeName)) { + binding = b; + break; + } + } + + if (binding == null) + throw new WSIFException("Unable to locate Binding"); + + //Locate Service + java.util.Iterator services = fieldDefinition.getServices().values().iterator(); + + while (services.hasNext() && serviceName ==null) { + javax.wsdl.Service s = (javax.wsdl.Service)services.next(); + + for (java.util.Iterator ports = s.getPorts().values().iterator(); ports.hasNext();) { + javax.wsdl.Port p = (javax.wsdl.Port)ports.next(); + if (p.getBinding().getQName().equals(binding.getQName())) { + // Binding found + serviceName = s.getQName(); + portName = p.getName(); + break; + } + } + } + + } + + // Check to see if anything was defined + if (operationName == null) { + // Nothing defined. Resort to getting the info from the service definition + java.util.Iterator services = fieldDefinition.getServices().values().iterator(); + + while (services.hasNext()) { + + javax.wsdl.Service s = (javax.wsdl.Service)services.next(); + //Get the first Port that has a JMS Address + java.util.Iterator i = s.getPorts().values().iterator(); + + while (i.hasNext()) { + javax.wsdl.Port p = (javax.wsdl.Port)i.next(); + + if (hasExtensibilityElementType(p.getExtensibilityElements(), + org.apache.wsif.wsdl.extensions.jms.JMSConstants.Q_ELEM_JMS_ADDRESS)) { + + // Need to check if binding has a JMS Binding + javax.wsdl.Binding binding = p.getBinding(); + if (binding != null && + hasExtensibilityElementType(binding.getExtensibilityElements(), + org.apache.wsif.wsdl.extensions.jms.JMSConstants.Q_ELEM_JMS_BINDING)) + { + + if (serviceName == null) { + // Assign the service definition + serviceName = s.getQName(); + portName = p.getName(); + + // Locate the operation + javax.wsdl.PortType portType = binding.getPortType(); + if (portType!= null) { + java.util.List operations = portType.getOperations(); + if (operations != null) { + if (operations.size() == 1) { + javax.wsdl.Operation o = (javax.wsdl.Operation)operations.get(0); + operationName = o.getName(); + if (o.getInput() != null) + input = o.getInput().getName(); + if (o.getOutput() != null) + output = o.getOutput().getName(); + } + else + throw new WSIFException("Port Type definition contains multiple operations."); + } + } + } + else + throw new WSIFException("More than one Port definition references a JMS Binding definition"); + } + } + } + } + } if (serviceName == null) throw new WSIFException("Unable to locate Service"); @@ -350,111 +340,105 @@ String input = null; String output = null; - try { - - operationName = msg.getStringProperty(OPERATION_NAME); - // Check to see if one of the properties are defined - // If so, get the information from them. - if (operationName != null && !operationName.equals("")) { - input = msg.getStringProperty(INPUT_NAME); - output = msg.getStringProperty(OUTPUT_NAME); - - String portType_ns = msg.getStringProperty(PORT_TYPE_NS); - String portType_local = msg.getStringProperty(PORT_TYPE_LOCAL); - - javax.wsdl.QName portTypeName = - new javax.wsdl.QName(portType_ns, portType_local); - - //Locate Binding - javax.wsdl.Binding binding = null; - - for (java.util.Iterator bindings = - fieldDefinition.getBindings().values().iterator(); - bindings.hasNext(); - ) { - javax.wsdl.Binding b = (javax.wsdl.Binding) bindings.next(); - if (b.getPortType().getQName().equals(portTypeName)) { - binding = b; - break; - } - } - - if (binding == null) - throw new WSIFException("Unable to locate Binding"); - - //Locate Service - java.util.Iterator services = fieldDefinition.getServices().values().iterator(); - - while (services.hasNext() && serviceName == null) { - javax.wsdl.Service s = (javax.wsdl.Service) services.next(); - - for (java.util.Iterator ports = s.getPorts().values().iterator(); - ports.hasNext(); - ) { - javax.wsdl.Port p = (javax.wsdl.Port) ports.next(); - if (p.getBinding().getQName().equals(binding.getQName())) { - // Binding found - serviceName = s.getQName(); - portName = p.getName(); - break; - } - } - } - - } - } catch (javax.jms.JMSException e) { - } - - // Check to see if anything was defined - if (operationName == null) { - // Nothing defined. Resort to getting the info from the service definition - java.util.Iterator services = fieldDefinition.getServices().values().iterator(); - - while (services.hasNext() && serviceName == null) { - - javax.wsdl.Service s = (javax.wsdl.Service) services.next(); - //Get the first Port that has a JMS Address - java.util.Iterator i = s.getPorts().values().iterator(); - - while (i.hasNext() && serviceName == null) { - javax.wsdl.Port p = (javax.wsdl.Port) i.next(); - java.util.Iterator e = p.getExtensibilityElements().iterator(); - - while (e.hasNext() && serviceName == null) { - javax.wsdl.extensions.ExtensibilityElement ee = - (javax.wsdl.extensions.ExtensibilityElement) e.next(); - - // Check to see if the extensibility element is a JMS binding - if (ee - .getElementType() - .equals(org.apache.wsif.wsdl.extensions.jms.JMSConstants.Q_ELEM_JMS_ADDRESS)) { - - // Assign the service definition - serviceName = s.getQName(); - portName = p.getName(); - - // Locate the operation - javax.wsdl.Binding binding = p.getBinding(); - if (binding != null) { - javax.wsdl.PortType portType = p.getBinding().getPortType(); - if (portType != null) { - java.util.List operations = portType.getOperations(); - if (operations != null && operations.size() > 0) { - javax.wsdl.Operation o = (javax.wsdl.Operation) operations.get(0); - operationName = o.getName(); - if (o.getInput() != null) - input = o.getInput().getName(); - if (o.getOutput() != null) - output = o.getOutput().getName(); - } - } - } - - } - } - } - } - } + operationName = getOperationName(); + // Check to see if one of the properties are defined + // If so, get the information from them. + if (operationName != null && !operationName.equals("")) { + input = getInputName(); + output = getOutputName(); + + String portType_ns = getPortTypeNS(); + String portType_local = getPortTypeLocal(); + + javax.wsdl.QName portTypeName = new javax.wsdl.QName(portType_ns, portType_local); + + //Locate Binding + javax.wsdl.Binding binding = null; + + for (java.util.Iterator bindings = fieldDefinition.getBindings().values().iterator(); bindings.hasNext();) { + javax.wsdl.Binding b = (javax.wsdl.Binding)bindings.next(); + if (b.getQName().equals(portTypeName)) { + binding = b; + break; + } + } + + if (binding == null) + throw new WSIFException("Unable to locate Binding"); + + //Locate Service + java.util.Iterator services = fieldDefinition.getServices().values().iterator(); + + while (services.hasNext() && serviceName ==null) { + javax.wsdl.Service s = (javax.wsdl.Service)services.next(); + + for (java.util.Iterator ports = s.getPorts().values().iterator(); ports.hasNext();) { + javax.wsdl.Port p = (javax.wsdl.Port)ports.next(); + if (p.getBinding().getQName().equals(binding.getQName())) { + // Binding found + serviceName = s.getQName(); + portName = p.getName(); + break; + } + } + } + + } + + // Check to see if anything was defined + if (operationName == null) { + // Nothing defined. Resort to getting the info from the service definition + java.util.Iterator services = fieldDefinition.getServices().values().iterator(); + + while (services.hasNext()) { + + javax.wsdl.Service s = (javax.wsdl.Service)services.next(); + //Get the first Port that has a JMS Address + java.util.Iterator i = s.getPorts().values().iterator(); + + while (i.hasNext()) { + javax.wsdl.Port p = (javax.wsdl.Port)i.next(); + + if (hasExtensibilityElementType(p.getExtensibilityElements(), + org.apache.wsif.wsdl.extensions.jms.JMSConstants.Q_ELEM_JMS_ADDRESS)) { + + // Need to check if binding has a JMS Binding + javax.wsdl.Binding binding = p.getBinding(); + if (binding != null && + hasExtensibilityElementType(binding.getExtensibilityElements(), + org.apache.wsif.wsdl.extensions.jms.JMSConstants.Q_ELEM_JMS_BINDING)) + { + + if (serviceName == null) { + // Assign the service definition + serviceName = s.getQName(); + portName = p.getName(); + + // Locate the operation + javax.wsdl.PortType portType = binding.getPortType(); + if (portType!= null) { + java.util.List operations = portType.getOperations(); + if (operations != null) { + if (operations.size() == 1) { + javax.wsdl.Operation o = (javax.wsdl.Operation)operations.get(0); + operationName = o.getName(); + if (o.getInput() != null) + input = o.getInput().getName(); + if (o.getOutput() != null) + output = o.getOutput().getName(); + } + else + throw new WSIFException("Port Type definition contains multiple operations."); + } + } + } + else + throw new WSIFException("More than one Port definition references a JMS Binding definition"); + } + } + } + } + } if (serviceName == null) throw new WSIFException("Unable to locate Service"); @@ -496,19 +480,6 @@ copyTo(resp.getOutgoingMessage(), fhMsg); fhMsg.write(out); - // Add the operation to the header - try { - out.setStringProperty(OPERATION_NAME, resp.getOperationName()); - out.setStringProperty(INPUT_NAME, resp.getInputName()); - out.setStringProperty(OUTPUT_NAME, resp.getOutputName()); - out.setStringProperty( - PORT_TYPE_NS, - binding.getPortType().getQName().getNamespaceURI()); - out.setStringProperty( - PORT_TYPE_LOCAL, - binding.getPortType().getQName().getLocalPart()); - } catch (Exception e) { - } Tr.exit(); } @@ -600,4 +571,56 @@ } return null; } + + private boolean hasExtensibilityElementType(java.util.List ee, javax.wsdl.QName type) { + + Object[] list = ee.toArray(); + + for (int i=0; i<list.length; i++) { + if (((javax.wsdl.extensions.ExtensibilityElement)list[i]).getElementType().equals(type)) + return true; + } + return false; + } + + private String getOperationName() { + return reqOpName; + } + + private void setOperationName(String s) { + reqOpName = s; + } + + private String getInputName() { + return reqInputName; + } + + private void setInputName(String s) { + reqInputName = s; + } + + private String getOutputName() { + return reqOutputName; + } + + private void setOutputName(String s) { + reqOutputName = s; + } + + private String getPortTypeNS() { + return reqPortTypeNS; + } + + private void setPortTypeNS(String s) { + reqPortTypeNS = s; + } + + private String getPortTypeLocal() { + return reqPortTypeLocal; + } + + private void setPortTypeLocal(String s) { + reqPortTypeLocal = s; + } + } 1.5 +26 -6 xml-axis-wsif/java/src/org/apache/wsif/providers/jms/WSIFOperation_Jms.java Index: WSIFOperation_Jms.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/providers/jms/WSIFOperation_Jms.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- WSIFOperation_Jms.java 14 Jun 2002 14:28:03 -0000 1.4 +++ WSIFOperation_Jms.java 18 Jun 2002 12:16:05 -0000 1.5 @@ -78,6 +78,7 @@ import org.apache.wsif.base.WSIFDefaultOperation; import org.apache.wsif.logging.MessageLogger; import org.apache.wsif.logging.Tr; +import org.apache.wsif.WSIFCorrelationService; import org.apache.wsif.util.WSIFCorrelationServiceLocator; import org.apache.wsif.util.WSIFProperties; import org.apache.wsif.util.jms.WSIFJMSCorrelationId; @@ -121,7 +122,9 @@ private WSIFResponseHandler handler; private boolean asyncOperation; + private JMSFormatter formatter; private final static boolean DEBUG = false; + private static final long ASYNC_TIMEOUT = WSIFProperties.getAsyncTimeout(); /** * ctor @@ -219,6 +222,22 @@ } /** + * executeRequestResponseAsync(WSIFMessage) + * This is the simple async form where the client is expected + * to handle the correlating of the response. + * @param input input message to send to the operation + * + * @return the correlation ID or the request. The correlation ID + * is used to associate the request with the WSIFOperation. + * + * @exception WSIFException if something goes wrong. + */ + public WSIFCorrelationId executeRequestResponseAsync( + WSIFMessage input) throws WSIFException { + return executeRequestResponseAsync( input, null ); + } + + /** * executeRequestResponseAsync(WSIFMessage, WSIFResponseHandler) * * @param input input message to send to the operation @@ -260,10 +279,12 @@ setDestinationContext( jmsDest ); // send the jms message - correlId = new WSIFJMSCorrelationId(sendJmsMessage(input, jmsDest)); - if (handler != null) { - //register it to the correlation service - WSIFCorrelationServiceLocator.getCorrelationService().put(correlId, this, 0); + WSIFCorrelationService cs = + WSIFCorrelationServiceLocator.getCorrelationService(); + synchronized( cs ) { + correlId = new WSIFJMSCorrelationId( sendJmsMessage(input, jmsDest) ); + //register it to the correlation service + cs.put( correlId, this, ASYNC_TIMEOUT ); } } catch (Exception ex) { // Log message @@ -423,7 +444,7 @@ } } - JMSFormatter formatter = (JMSFormatter) fieldJmsPort.getFormatter(); + formatter = (JMSFormatter)fieldJmsPort.getFormatter(); WSIFRequest request = new WSIFRequest(serviceModel.getQName()); request.setIncomingMessage(message); @@ -457,7 +478,6 @@ if (!(responseObject instanceof javax.jms.Message)) throw new WSIFException("Object is not of type javax.jms.Message"); - JMSFormatter formatter = (JMSFormatter) fieldJmsPort.getFormatter(); WSIFResponse resp = formatter.unformatResponse((javax.jms.Message) responseObject);