in modules/binding-jms/src/main/java/org/apache/tuscany/sca/binding/jms/JMSBindingProcessor.java [207:404]
public JMSBinding read(XMLStreamReader reader, ProcessorContext context) throws ContributionReadException, XMLStreamException {
Monitor monitor = context.getMonitor();
JMSBinding jmsBinding = new JMSBinding();
// Reset validation message to keep track of validation issues.
// Read policies
policyProcessor.readPolicies(jmsBinding, reader);
// Read binding name
String name = reader.getAttributeValue(null, "name");
if (name != null) {
jmsBinding.setName(name);
}
// Read binding URI
String uri = reader.getAttributeValue(null, "uri");
if (uri != null && uri.length() > 0) {
parseURI(uri, jmsBinding, monitor);
}
// Read correlation scheme
QName correlationScheme = StAXHelper.getAttributeAsQName(reader, "correlationScheme");
if (correlationScheme != null) {
if (Base.SCA11_NS.equals(correlationScheme.getNamespaceURI()) && JMSBindingConstants.VALID_CORRELATION_SCHEMES.contains(correlationScheme.getLocalPart())) {
jmsBinding.setCorrelationScheme(correlationScheme.getLocalPart());
} else {
error(monitor, "InvalidCorrelationScheme", reader, correlationScheme);
}
}
// Read initial context factory
String initialContextFactory = getURIString(reader, "initialContextFactory");
if (initialContextFactory != null && initialContextFactory.length() > 0) {
jmsBinding.setInitialContextFactoryName(initialContextFactory);
}
// Read JNDI URL
String jndiURL = getURIString(reader, "jndiURL");
if (jndiURL != null && jndiURL.length() > 0) {
jmsBinding.setJndiURL(jndiURL);
}
// Read message processor class name
// TODO - maintain this for the time being but move over to
// configuring wire formats instead of message processors
String messageProcessorName = reader.getAttributeValue(null, "messageProcessor");
if (messageProcessorName != null && messageProcessorName.length() > 0) {
if ("XMLTextMessage".equalsIgnoreCase(messageProcessorName)) {
// may be overwritten be real wire format later
jmsBinding.setRequestWireFormat(new WireFormatJMSTextXML());
jmsBinding.setResponseWireFormat(jmsBinding.getRequestWireFormat());
jmsBinding.setResponseWireFormatIsDefault(true);
} else if ("TextMessage".equalsIgnoreCase(messageProcessorName)) {
// may be overwritten be real wire format later
jmsBinding.setRequestWireFormat(new WireFormatJMSText());
jmsBinding.setResponseWireFormat(jmsBinding.getRequestWireFormat());
jmsBinding.setResponseWireFormatIsDefault(true);
} else if ("ObjectMessage".equalsIgnoreCase(messageProcessorName)) {
// may be overwritten be real wire format later
jmsBinding.setRequestWireFormat(new WireFormatJMSObject());
jmsBinding.setResponseWireFormat(jmsBinding.getRequestWireFormat());
jmsBinding.setResponseWireFormatIsDefault(true);
} else {
jmsBinding.setRequestMessageProcessorName(messageProcessorName);
jmsBinding.setResponseMessageProcessorName(messageProcessorName);
// exploit the text wire format code to drive the user selected
// message processor
jmsBinding.setRequestWireFormat(new WireFormatJMSText());
jmsBinding.setResponseWireFormat(jmsBinding.getRequestWireFormat());
jmsBinding.setResponseWireFormatIsDefault(true);
}
}
String requestConnectionName = reader.getAttributeValue(null, "requestConnection");
if (requestConnectionName != null && requestConnectionName.length() > 0) {
jmsBinding.setRequestConnectionName(getQNameValue(reader, requestConnectionName));
}
String responseConnectionName = reader.getAttributeValue(null, "responseConnection");
if (responseConnectionName != null && responseConnectionName.length() > 0) {
jmsBinding.setResponseConnectionName(getQNameValue(reader, responseConnectionName));
}
String operationPropertiesName = reader.getAttributeValue(null, "operationProperties");
if (operationPropertiesName != null && operationPropertiesName.length() > 0) {
jmsBinding.setOperationPropertiesName(getQNameValue(reader, operationPropertiesName));
}
//add binding extensions
QName elementQName = reader.getName();
for (int i = 0; i < reader.getAttributeCount(); i++) {
QName attributeName = reader.getAttributeName(i);
if(attributeName.getNamespaceURI() != null && attributeName.getNamespaceURI().length() > 0) {
if(!elementQName.getNamespaceURI().equals(attributeName.getNamespaceURI()) ) {
Object attributeValue = extensionAttributeProcessor.read(attributeName, reader, processorContext);
Extension attributeExtension;
if (attributeValue instanceof Extension) {
attributeExtension = (Extension)attributeValue;
} else {
attributeExtension = assemblyFactory.createExtension();
attributeExtension.setQName(attributeName);
attributeExtension.setValue(attributeValue);
attributeExtension.setAttribute(true);
}
((Extensible)jmsBinding).getAttributeExtensions().add(attributeExtension);
}
}
}
// Read sub-elements of binding.jms
boolean endFound = false;
while (!endFound) {
int fg = reader.next();
switch (fg) {
case START_ELEMENT:
String elementName = reader.getName().getLocalPart();
if ("destination".equals(elementName)) {
parseDestination(reader, jmsBinding, monitor);
} else if ("connectionFactory".equals(elementName)) {
parseConnectionFactory(reader, jmsBinding, monitor);
} else if ("activationSpec".equals(elementName)) {
parseActivationSpec(reader, jmsBinding, monitor);
} else if ("response".equals(elementName)) {
parseResponse(reader, jmsBinding, context);
} else if ("resourceAdapter".equals(elementName)) {
parseResourceAdapter(reader, jmsBinding, monitor);
} else if ("headers".equals(elementName)) {
parseHeaders(reader, jmsBinding, monitor);
} else if ("operationProperties".equals(elementName)) {
parseOperationProperties(reader, jmsBinding, monitor);
} else if ("messageSelection".equals(elementName)) {
parseSubscriptionHeaders(reader, jmsBinding);
} else if (Constants.OPERATION_QNAME.equals(reader.getName())) {
ConfiguredOperation confOp = configuredOperationProcessor.read(reader, context);
if (confOp != null) {
((OperationsConfigurator)jmsBinding).getConfiguredOperations().add(confOp);
}
} else {
Object extension = extensionProcessor.read(reader, context);
if (extension != null) {
if (extension instanceof WireFormat) {
if (jmsBinding.getRequestWireFormat() == null) {
jmsBinding.setRequestWireFormat((WireFormat) extension);
} else {
error(monitor, "WireFormatAlreadyDefined", reader, extension.toString());
}
} else if (extension instanceof OperationSelector) {
if (jmsBinding.getOperationSelector() == null) {
jmsBinding.setOperationSelector((OperationSelector) extension);
} else {
error(monitor, "OpSelectorAlreadyDefined", reader, extension.toString());
}
} else {
String t = (extension instanceof Extension) ? ((Extension)extension).getQName().toString() : extension.toString();
error(monitor, "UnexpectedElement", reader, t);
}
}
}
//reader.next();
break;
case END_ELEMENT:
QName x = reader.getName();
if (Constants.OPERATION.equals(x.getLocalPart())) break;
// This assumption is not captured in schema, which isn't good, but will probably be fine for now.
// A better solution might be to require each processor to advance to its own END_ELEMENT.
if (x.getLocalPart().startsWith("wireFormat.") || x.getLocalPart().startsWith("operationSelector.")) {
break;
}
if (x.equals(JMSBindingConstants.BINDING_JMS_QNAME)) {
endFound = true;
} else {
String t = (x instanceof Extension) ? ((Extension)x).getQName().toString() : x.toString();
error(monitor, "UnexpectedElement: expected " + JMSBindingConstants.BINDING_JMS_QNAME + ", found " + t,
reader, t);
}
}
}
// if no operation selector is specified then assume the default
if (jmsBinding.getOperationSelector() == null){
jmsBinding.setOperationSelector(new OperationSelectorJMSDefault());
}
// if no request wire format specified then assume the default
if (jmsBinding.getRequestWireFormat() == null){
jmsBinding.setRequestWireFormat(new WireFormatJMSDefault());
}
// if no response wire format specific then assume the same as the request
if (jmsBinding.getResponseWireFormat() == null){
jmsBinding.setResponseWireFormat(jmsBinding.getRequestWireFormat());
jmsBinding.setResponseWireFormatIsDefault(true);
}
validate( jmsBinding, monitor );
return jmsBinding;
}