/* * 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 java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.List; import javax.jms.DeliveryMode; import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.binding.jms.provider.JMSMessageProcessor; /** * Models a binding to a JMS resource. * * @version $Rev$ $Date$ */ public class JMSBinding implements Binding { /** * Clone the binding */ public Object clone() throws CloneNotSupportedException { return super.clone(); } // properties required to implement the Tuscany // binding extension SPI private String uri = null; private String name = null; private boolean unresolved = false; private List extensions = new ArrayList(); // Properties required to describe the JMS // binding model // private String correlationScheme = JMSBindingConstants.CORRELATE_MSG_ID; private String initialContextFactoryName; private String jndiURL; // private String requestConnection = null; // private String responseConnection = null; // private String operationProperties = null; // // Not yet implemented in binding // * Not yet implemented in binding // ? private String destinationName = JMSBindingConstants.DEFAULT_DESTINATION_NAME; private String destinationType = JMSBindingConstants.DESTINATION_TYPE_QUEUE; private String destinationCreate = JMSBindingConstants.CREATE_IF_NOT_EXIST; // // Not yet implemented in binding // * Not yet implemented in binding // ? private String connectionFactoryName = JMSBindingConstants.DEFAULT_CONNECTION_FACTORY_NAME; private String connectionFactoryCreate = JMSBindingConstants.CREATE_IF_NOT_EXIST; // // Not yet implemented in binding // * Not yet implemented in binding // ? private String activationSpecName = null; private String activationSpecCreate = null; // // // Not yet implemented in binding // * Not yet implemented in binding // ? private String responseDestinationName = JMSBindingConstants.DEFAULT_RESPONSE_DESTINATION_NAME; private String responseDestinationType = JMSBindingConstants.DESTINATION_TYPE_QUEUE; private String responseDestinationCreate = JMSBindingConstants.CREATE_IF_NOT_EXIST; // // Not yet implemented in binding // * Not yet implemented in binding // ? private String responseConnectionFactoryName = JMSBindingConstants.DEFAULT_CONNECTION_FACTORY_NAME; private String responseConnectionFactoryCreate = JMSBindingConstants.CREATE_IF_NOT_EXIST; // // Not yet implemented in binding // * Not yet implemented in binding // ? private String responseActivationSpecName = null; private String responseActivationSpecCreate = null; // ? // // ? Not yet implemented in binding // * Not yet implemented in binding // ? // private String resourceAdapterName = null; // // Not yet implemented in binding // * Not yet implemented in binding // ? // private String jmsType = null; // private String jmsCorrelationId = null; private int jmsDeliveryMode = DeliveryMode.NON_PERSISTENT; // Maps to javax.jms.DeliveryMode private int jmsTimeToLive = JMSBindingConstants.DEFAULT_TIME_TO_LIVE; private int jmsPriority = JMSBindingConstants.DEFAULT_PRIORITY; // // Not yet implemented in binding // * Not yet implemented in binding // Not yet implemented in binding // * Not yet implemented in binding // ? // * // // Other properties not directly related to the // XML definition of the JMS binding // Provides the name of the factory that interfaces to the // JMS API for us. private String jmsResourceFactoryName = JMSBindingConstants.DEFAULT_RF_CLASSNAME; // Message processors used to deal with the request // and response messages public String requestMessageProcessorName = JMSBindingConstants.DEFAULT_MP_CLASSNAME; public String responseMessageProcessorName = JMSBindingConstants.DEFAULT_MP_CLASSNAME; // The JMS message property used to hold the name of the // operation being called private String operationSelectorPropertyName = JMSBindingConstants.DEFAULT_OPERATION_PROP_NAME; // If the operation selector is derived automatically from the service // interface it's stored here private String operationSelectorName = null; // TODO ..... private String replyTo; // Methods required by the Tuscany SPI /** * No arg constructor used by the JSMBindingFactoryImpl to create JMS binding model objects */ public JMSBinding() { super(); } /** * Returns the binding URI. * * @return the binding URI */ public String getURI() { return this.uri; } /** * Sets the binding URI. * * @param uri the binding URI */ public void setURI(String uri) { this.uri = uri; } /** * Returns the binding name. * * @return the binding name */ public String getName() { return this.name; } /** * Sets the binding name. * * @param name the binding name */ public void setName(String name) { this.name = name; } public boolean isUnresolved() { return this.unresolved; } public void setUnresolved(boolean unresolved) { this.unresolved = unresolved; } public List getExtensions() { return extensions; } // Methods for getting/setting JMS binding model information // as derived from the XML of the binding.jms element public void setCorrelationScheme(String correlationScheme) { this.correlationScheme = correlationScheme; } public String getCorrelationScheme() { return correlationScheme; } public String getInitialContextFactoryName() { return initialContextFactoryName; } public void setInitialContextFactoryName(String initialContextFactoryName) { this.initialContextFactoryName = initialContextFactoryName; } public String getJndiURL() { return this.jndiURL; } public void setJndiURL(String jndiURL) { this.jndiURL = jndiURL; } public String getDestinationName() { return destinationName; } public void setDestinationName(String destinationName) { this.destinationName = destinationName; } public String getDestinationType() { return destinationType; } public void setDestinationType(String destinationType) { this.destinationType = destinationType; } public String getDestinationCreate() { return this.destinationCreate; } public void setDestinationCreate(String create) { this.destinationCreate = create; } public String getConnectionFactoryName() { return connectionFactoryName; } public void setConnectionFactoryName(String connectionFactoryName) { this.connectionFactoryName = connectionFactoryName; } public String getConnectionFactoryCreate() { return this.connectionFactoryCreate; } public void setConnectionFactoryCreate(String create) { this.connectionFactoryCreate = create; } public String getActivationSpecName() { return activationSpecName; } public void setActivationSpecName(String activationSpecName) { this.activationSpecName = activationSpecName; } public String getActivationSpecCreate() { return this.activationSpecCreate; } public void setActivationSpecCreate(String create) { this.activationSpecCreate = create; } public String getResponseDestinationName() { return this.responseDestinationName; } public void setResponseDestinationName(String name) { this.responseDestinationName = name; } public String getResponseDestinationType() { return this.responseDestinationType; } public void setResponseDestinationType(String type) { this.responseDestinationType = type; } public String getResponseDestinationCreate() { return this.responseDestinationCreate; } public void setResponseDestinationCreate(String create) { this.responseDestinationCreate = create; } public String getResponseConnectionFactoryName() { return responseConnectionFactoryName; } public void setResponseConnectionFactoryName(String connectionFactoryName) { this.responseConnectionFactoryName = connectionFactoryName; } public String getResponseConnectionFactoryCreate() { return this.responseConnectionFactoryCreate; } public void setResponseConnectionFactoryCreate(String create) { this.responseConnectionFactoryCreate = create; } public String getResponseActivationSpecName() { return responseActivationSpecName; } public void setResponseActivationSpecName(String activationSpecName) { this.responseActivationSpecName = activationSpecName; } public String getResponseActivationSpecCreate() { return this.responseActivationSpecCreate; } public void setResponseActivationSpecCreate(String create) { this.responseActivationSpecCreate = create; } public int getDeliveryMode() { return jmsDeliveryMode; } public void setDeliveryMode(int deliveryMode) { this.jmsDeliveryMode = deliveryMode; } public int getTimeToLive() { return jmsTimeToLive; } public void setTimeToLive(int timeToLive) { this.jmsTimeToLive = timeToLive; } public int getPriority() { return jmsPriority; } public void setPriority(int priority) { this.jmsPriority = priority; } // operations to manage the other information required by the // JMS binding public String getJmsResourceFactoryName() { return jmsResourceFactoryName; } public void setJmsResourceFactoryName(String jmsResourceFactoryName) { this.jmsResourceFactoryName = jmsResourceFactoryName; } // public JMSResourceFactory getJmsResourceFactory() { // return (JMSResourceFactory)instantiate(null, jmsResourceFactoryName); // } public void setRequestMessageProcessorName(String name) { this.requestMessageProcessorName = name; } public String getRequestMessageProcessorName() { return requestMessageProcessorName; } public JMSMessageProcessor getRequestMessageProcessor() { return (JMSMessageProcessor)instantiate(null, requestMessageProcessorName); } public void setResponseMessageProcessorName(String name) { this.responseMessageProcessorName = name; } public String getResponseMessageProcessorName() { return responseMessageProcessorName; } public JMSMessageProcessor getResponseMessageProcessor() { return (JMSMessageProcessor)instantiate(null, responseMessageProcessorName); } public String getOperationSelectorPropertyName() { return operationSelectorPropertyName; } public void setOperationSelectorPropertyName(String operationSelectorPropertyName) { this.operationSelectorPropertyName = operationSelectorPropertyName; } public String getOperationSelectorName() { return operationSelectorName; } public void setOperationSelectorName(String operationSelectorName) { this.operationSelectorName = operationSelectorName; } /** * Used to create instances of the JMSResourceFactory and RequestMessageProcessor and ResponseMessageProcessor from * string based class name provided in the configuration * * @param cl ClassLoader * @param className the string based class name to load and instantiate * @return the new object */ private Object instantiate(ClassLoader cl, String className) { Object instance; if (cl == null) { cl = this.getClass().getClassLoader(); } try { Class clazz; try { clazz = cl.loadClass(className); } catch (ClassNotFoundException e) { clazz = this.getClass().getClassLoader().loadClass(className); } Constructor constructor = clazz.getDeclaredConstructor(new Class[] {JMSBinding.class}); instance = constructor.newInstance(this); } catch (Throwable e) { throw new JMSBindingException("Exception instantiating OperationAndDataBinding class", e); } return instance; } /** * The validation rules for the JMS model are relatively complicated to they all live together here */ public void validate() throws JMSBindingException { /* * first fix up anything now the model has been read */ /* * Now some cross field validation */ // connection factory doesn't contradict destination type // connection factory and activation Specification are mutually exclusive // TODO check Specification for all validations } // TODO... public String getReplyTo() { return replyTo; } public void setReplyTo(String replyTo) { this.replyTo = replyTo; } }