/*
* 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.impl;
import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
import java.util.StringTokenizer;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import org.apache.tuscany.sca.assembly.builder.impl.ProblemImpl;
import org.apache.tuscany.sca.assembly.xml.Constants;
import org.apache.tuscany.sca.assembly.xml.PolicyAttachPointProcessor;
import org.apache.tuscany.sca.binding.jms.provider.ObjectMessageProcessor;
import org.apache.tuscany.sca.binding.jms.provider.TextMessageProcessor;
import org.apache.tuscany.sca.binding.jms.provider.XMLTextMessageProcessor;
import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
import org.apache.tuscany.sca.contribution.service.ContributionReadException;
import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
import org.apache.tuscany.sca.monitor.Monitor;
import org.apache.tuscany.sca.monitor.Problem;
import org.apache.tuscany.sca.monitor.Problem.Severity;
import org.apache.tuscany.sca.policy.PolicyFactory;
/**
* A processor to read the XML that describes the JMS binding...
*
*
*
*
* *
* ?
*
*
* *
* ?
*
*
* *
* ?
*
*
*
* *
* ?
*
*
* *
* ?
*
*
* *
* ?
* ?
*
* ?
* *
* ?
*
*
* *
* ?
*
*
* *
*
* *
* ?
* *
*
*
* @version $Rev$ $Date$
*/
public class JMSBindingProcessor implements StAXArtifactProcessor {
private PolicyFactory policyFactory;
private PolicyAttachPointProcessor policyProcessor;
private Monitor monitor;
public JMSBindingProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
this.policyFactory = modelFactories.getFactory(PolicyFactory.class);
this.policyProcessor = new PolicyAttachPointProcessor(policyFactory);
this.monitor = monitor;
}
/**
* Report a error.
*
* @param problems
* @param message
* @param model
*/
private void warning(String message, Object model, Object... messageParameters) {
if (monitor != null) {
Problem problem = new ProblemImpl(this.getClass().getName(), "binding-jms-validation-messages", Severity.WARNING, model, message, (Object[])messageParameters);
monitor.problem(problem);
}
}
/**
* Report a error.
*
* @param problems
* @param message
* @param model
*/
private void error(String message, Object model, Object... messageParameters) {
if (monitor != null) {
Problem problem = new ProblemImpl(this.getClass().getName(), "binding-jms-validation-messages", Severity.ERROR, model, message, (Object[])messageParameters);
monitor.problem(problem);
}
}
public QName getArtifactType() {
return JMSBindingConstants.BINDING_JMS_QNAME;
}
public Class getModelType() {
return JMSBinding.class;
}
public JMSBinding read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {
JMSBinding jmsBinding = new JMSBinding();
// 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);
}
// Read correlation scheme
String correlationScheme = reader.getAttributeValue(null, "correlationScheme");
if (correlationScheme != null && correlationScheme.length() > 0) {
if (JMSBindingConstants.VALID_CORRELATION_SCHEMES.contains(correlationScheme.toLowerCase())) {
jmsBinding.setCorrelationScheme(correlationScheme);
} else {
error("InvalidCorrelationScheme", reader, correlationScheme);
//throw new JMSBindingException("invalid correlationScheme: " + correlationScheme);
}
}
// Read initial context factory
String initialContextFactory = reader.getAttributeValue(null, "initialContextFactory");
if (initialContextFactory != null && initialContextFactory.length() > 0) {
jmsBinding.setInitialContextFactoryName(initialContextFactory);
}
// Read JNDI URL
String jndiURL = reader.getAttributeValue(null, "jndiURL");
if (jndiURL != null && jndiURL.length() > 0) {
jmsBinding.setJndiURL(jndiURL);
}
// Read message processor class name
String messageProcessorName = reader.getAttributeValue(null, "messageProcessor");
if (messageProcessorName != null && messageProcessorName.length() > 0) {
if ("XMLTextMessage".equalsIgnoreCase(messageProcessorName)) {
messageProcessorName = XMLTextMessageProcessor.class.getName();
} else if ("TextMessage".equalsIgnoreCase(messageProcessorName)) {
messageProcessorName = TextMessageProcessor.class.getName();
} else if ("ObjectMessage".equalsIgnoreCase(messageProcessorName)) {
messageProcessorName = ObjectMessageProcessor.class.getName();
}
jmsBinding.setRequestMessageProcessorName(messageProcessorName);
jmsBinding.setResponseMessageProcessorName(messageProcessorName);
}
// Read requestConnection
// TODO
// Read reponseConnection
// TODO
// Read operationProperties
// TODO
// Read sub-elements of binding.jms
boolean endFound = false;
while (!endFound) {
switch (reader.next()) {
case START_ELEMENT:
String elementName = reader.getName().getLocalPart();
if ("destination".equals(elementName)) {
parseDestination(reader, jmsBinding);
} else if ("connectionFactory".equals(elementName)) {
parseConnectionFactory(reader, jmsBinding);
} else if ("activationSpec".equals(elementName)) {
parseActivationSpec(reader, jmsBinding);
} else if ("response".equals(elementName)) {
parseResponse(reader, jmsBinding);
} else if ("resourceAdapter".equals(elementName)) {
parseResourceAdapter(reader, jmsBinding);
} else if ("headers".equals(elementName)) {
parseHeaders(reader, jmsBinding);
} else if ("operationProperties".equals(elementName)) {
parseOperationProperties(reader, jmsBinding);
}
reader.next();
break;
case END_ELEMENT:
QName x = reader.getName();
if (x.equals(JMSBindingConstants.BINDING_JMS_QNAME)) {
endFound = true;
} else {
error("UnexpectedElement", reader, x.toString());
//throw new RuntimeException("Incomplete binding.jms definition found unexpected element "
//+ x.toString());
}
}
}
jmsBinding.validate();
return jmsBinding;
}
protected void parseURI(String uri, JMSBinding jmsBinding) {
if (!uri.startsWith("jms:")) {
error("MustStartWithSchema", jmsBinding, uri);
//throw new JMSBindingException("uri must start with the scheme 'jms:' for uri: " + uri);
return;
}
int i = uri.indexOf('?');
if (i >= 0) {
StringTokenizer st = new StringTokenizer(uri.substring(i+1),"&");
while (st.hasMoreTokens()) {
String s = st.nextToken();
if (s.startsWith("connectionFactoryName=")) {
jmsBinding.setConnectionFactoryName(s.substring(22));
} else {
error("UnknownTokenInURI", jmsBinding, s, uri);
//throw new JMSBindingException("unknown token '" + s + "' in uri: " + uri);
return;
}
}
jmsBinding.setDestinationName(uri.substring(4, i));
} else {
jmsBinding.setDestinationName(uri.substring(4));
}
}
public void resolve(JMSBinding model, ModelResolver resolver) throws ContributionResolveException {
}
public void write(JMSBinding rmiBinding, XMLStreamWriter writer) throws ContributionWriteException,
XMLStreamException {
// Write a
writer.writeStartElement(Constants.SCA10_NS, JMSBindingConstants.BINDING_JMS);
// FIXME Implement
writer.writeEndElement();
}
private void parseDestination(XMLStreamReader reader, JMSBinding jmsBinding) throws XMLStreamException {
String name = reader.getAttributeValue(null, "name");
if (name != null && name.length() > 0) {
jmsBinding.setDestinationName(name);
}
String type = reader.getAttributeValue(null, "type");
if (type != null && type.length() > 0) {
warning("DoesntProcessDestinationType", jmsBinding);
if (JMSBindingConstants.DESTINATION_TYPE_QUEUE.equalsIgnoreCase(type)) {
jmsBinding.setDestinationType(JMSBindingConstants.DESTINATION_TYPE_QUEUE);
} else if (JMSBindingConstants.DESTINATION_TYPE_TOPIC.equalsIgnoreCase(type)) {
jmsBinding.setDestinationType(JMSBindingConstants.DESTINATION_TYPE_TOPIC);
} else {
warning("InvalidDestinationType", reader, type);
}
}
String create = reader.getAttributeValue(null, "create");
if (create != null && create.length() > 0) {
jmsBinding.setDestinationCreate(create);
}
}
private void parseConnectionFactory(XMLStreamReader reader, JMSBinding jmsBinding) {
String name = reader.getAttributeValue(null, "name");
if (name != null && name.length() > 0) {
jmsBinding.setConnectionFactoryName(name);
} else {
error("MissingConnectionFactoryName", reader);
//throw new RuntimeException("missing connectionFactory name");
}
}
private void parseActivationSpec(XMLStreamReader reader, JMSBinding jmsBinding) {
String name = reader.getAttributeValue(null, "name");
if (name != null && name.length() > 0) {
warning("DoesntProcessActivationSpec", jmsBinding);
jmsBinding.setActivationSpecName(name);
} else {
warning("MissingActivationSpecName", reader);
}
}
private void parseResponseDestination(XMLStreamReader reader, JMSBinding jmsBinding) throws XMLStreamException {
String name = reader.getAttributeValue(null, "name");
if (name != null && name.length() > 0) {
jmsBinding.setResponseDestinationName(name);
}
String type = reader.getAttributeValue(null, "type");
if (type != null && type.length() > 0) {
warning("DoesntProcessResponseDestinationType", jmsBinding);
if (JMSBindingConstants.DESTINATION_TYPE_QUEUE.equalsIgnoreCase(type)) {
jmsBinding.setResponseDestinationType(JMSBindingConstants.DESTINATION_TYPE_QUEUE);
} else if (JMSBindingConstants.DESTINATION_TYPE_TOPIC.equalsIgnoreCase(type)) {
jmsBinding.setResponseDestinationType(JMSBindingConstants.DESTINATION_TYPE_TOPIC);
} else {
warning("InvalidResponseDestinationType", reader, type);
}
}
String create = reader.getAttributeValue(null, "create");
if (create != null && create.length() > 0) {
jmsBinding.setResponseDestinationCreate(create);
}
}
private void parseResponseConnectionFactory(XMLStreamReader reader, JMSBinding jmsBinding) {
String name = reader.getAttributeValue(null, "name");
if (name != null && name.length() > 0) {
warning("DoesntProcessResponseConnectionFactory", jmsBinding);
jmsBinding.setResponseConnectionFactoryName(name);
} else {
warning("MissingResponseConnectionFactory", reader);
}
}
private void parseResponseActivationSpec(XMLStreamReader reader, JMSBinding jmsBinding) {
String name = reader.getAttributeValue(null, "name");
if (name != null && name.length() > 0) {
warning("DoesntProcessResponseActivationSpec", jmsBinding);
jmsBinding.setResponseActivationSpecName(name);
} else {
warning("MissingResponseActivationSpec", reader);
}
}
private void parseResponse(XMLStreamReader reader, JMSBinding jmsBinding) throws XMLStreamException {
// Read sub-elements of response
while (true) {
switch (reader.next()) {
case START_ELEMENT:
String elementName = reader.getName().getLocalPart();
if ("destination".equals(elementName)) {
parseResponseDestination(reader, jmsBinding);
} else if ("connectionFactory".equals(elementName)) {
parseResponseConnectionFactory(reader, jmsBinding);
} else if ("activationSpec".equals(elementName)) {
parseResponseActivationSpec(reader, jmsBinding);
}
reader.next();
break;
case END_ELEMENT:
QName x = reader.getName();
if (x.getLocalPart().equals("response")) {
return;
} else {
error("UnexpectedResponseElement", reader, x.toString());
//throw new RuntimeException("Incomplete binding.jms/response definition found unexpected element "
//+ x.toString());
}
}
}
}
private void parseResourceAdapter(XMLStreamReader reader, JMSBinding jmsBinding) throws XMLStreamException {
warning("DoesntProcessResourceAdapter", jmsBinding);
}
private void parseHeaders(XMLStreamReader reader, JMSBinding jmsBinding) throws XMLStreamException {
warning("DoesntProcessHeaders", jmsBinding);
}
private void parseOperationProperties(XMLStreamReader reader, JMSBinding jmsBinding) throws XMLStreamException {
warning("DoesntProcessOperationProperties", jmsBinding);
}
}