/* * 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; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import javax.xml.namespace.QName; import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.ConfiguredOperation; import org.apache.tuscany.sca.assembly.OperationSelector; import org.apache.tuscany.sca.assembly.OperationsConfigurator; import org.apache.tuscany.sca.assembly.WireFormat; import org.apache.tuscany.sca.policy.ExtensionType; import org.apache.tuscany.sca.policy.Intent; import org.apache.tuscany.sca.policy.PolicySet; import org.apache.tuscany.sca.policy.PolicySubject; /** * Models a binding to a JMS resource. * * @version $Rev$ $Date$ */ //public class JMSBinding implements BindingRRB, PolicySubject, OperationsConfigurator, DefinitionElement { public class JMSBinding implements Binding, PolicySubject, OperationsConfigurator { QName TYPE = new QName(SCA11_NS, "binding.jms"); @Override 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<Object> extensions = new ArrayList<Object>(); // properties required by PolicySetAttachPoint private List<PolicySet> policySets = new ArrayList<PolicySet>(); private List<PolicySet> applicablePolicySets = new ArrayList<PolicySet>(); // properties required by IntentAttachPoint private List<Intent> requiredIntents = new ArrayList<Intent>(); // properties required to describe configured operations private List<ConfiguredOperation> configuredOperations = new ArrayList<ConfiguredOperation>(); // properties required by DefinitionElement @575803A private String targetNamespace; // Properties required to describe the JMS binding model private String correlationScheme = JMSBindingConstants.CORRELATE_MSG_ID; private String initialContextFactoryName; private String jndiURL; private String destinationName = null; private String destinationType = JMSBindingConstants.DESTINATION_TYPE_QUEUE; private String destinationCreate = JMSBindingConstants.CREATE_IF_NOT_EXIST; private Map<String, BindingProperty> destinationProperties = new HashMap<String, BindingProperty>(); private String connectionFactoryName = null; private String connectionFactoryCreate = JMSBindingConstants.CREATE_IF_NOT_EXIST; private Map<String, BindingProperty> connectionFactoryProperties = new HashMap<String, BindingProperty>(); private String activationSpecName = null; private String activationSpecCreate = JMSBindingConstants.CREATE_IF_NOT_EXIST; private Map<String, BindingProperty> activationSpecProperties = new HashMap<String, BindingProperty>(); private String resourceAdapterName;; private Map<String, BindingProperty> resourceAdapterProperties = new HashMap<String, BindingProperty>(); private String responseActivationSpecName = null; private String responseActivationSpecCreate = JMSBindingConstants.CREATE_IF_NOT_EXIST; private Map<String, BindingProperty> responseActivationSpecProperties = new HashMap<String, BindingProperty>(); private String responseDestinationName = null; private String responseDestinationType = JMSBindingConstants.DESTINATION_TYPE_QUEUE; private String responseDestinationCreate = JMSBindingConstants.CREATE_IF_NOT_EXIST; private Map<String, BindingProperty> responseDestinationProperties = new HashMap<String, BindingProperty>(); private String responseConnectionFactoryName = null; private String responseConnectionFactoryCreate = JMSBindingConstants.CREATE_IF_NOT_EXIST; private Map<String, BindingProperty> responseConnectionFactoryProperties = new HashMap<String, BindingProperty>(); // 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; private boolean containsHeaders = false; private String replyTo; private String jmsCorrelationId; private Map<String, Object> properties = new HashMap<String, Object>(); private Map<String, Map<String, Object>> operationProperties = new HashMap<String, Map<String,Object>>(); private Map<String, String> nativeOperationNames = new HashMap<String, String>(); private Map<String, String> operationJMSTypes = new HashMap<String, String>(); private Map<String, String> operationJMSCorrelationIds = new HashMap<String, String>(); private Map<String, Boolean> operationJMSDeliveryModes = new HashMap<String, Boolean>(); private Map<String, Long> operationJMSTimeToLives = new HashMap<String, Long>(); private Map<String, Integer> operationJMSPriorities = new HashMap<String, Integer>(); private Map<String, Map<String, BindingProperty>> operationPropertiesProperties = new HashMap<String, Map<String,BindingProperty>>(); private String jmsSelector = null; private String uriJmsSelector = null; private QName requestConnectionName; private QName responseConnectionName; private QName operationPropertiesName; private JMSBinding requestConnectionBinding; private JMSBinding responseConnectionBinding; private JMSBinding operationPropertiesBinding; private WireFormat requestWireFormat; private WireFormat responseWireFormat; private OperationSelector operationSelector; private ExtensionType extensionType; private String jmsURI; private String uriType; private Boolean uriDeliveryMode; private Integer uriJMSPriority; private Long uriJMSTimeToLive; private String headerType; private Boolean headerDeliveryMode; private Integer headerPriority; private Long headerTimeToLive; private final Integer defaultPriority = Integer.valueOf(4); private final Boolean defaultDeliveryMode = true; private final Long defaultJMSTimeToLive =Long.valueOf(0); private boolean isDestinationSpecified = false; public JMSBinding() { super(); } // operations required by Binding public String getURI() { return this.uri; } public void setURI(String uri) { this.uri = uri; } public String getName() { return this.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<Object> getExtensions() { return extensions; } public WireFormat getRequestWireFormat() { return requestWireFormat; } public void setRequestWireFormat(WireFormat wireFormat) { this.requestWireFormat = wireFormat; } public WireFormat getResponseWireFormat() { return responseWireFormat; } public void setResponseWireFormat(WireFormat wireFormat) { this.responseWireFormat = wireFormat; } public OperationSelector getOperationSelector() { return operationSelector; } public void setOperationSelector(OperationSelector operationSelector) { this.operationSelector = operationSelector; } // 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() { if (requestConnectionBinding != null && requestConnectionBinding.getDestinationName() != null) { return requestConnectionBinding.getDestinationName(); } else { return destinationName; } } public void setDestinationName(String destinationName) { this.destinationName = destinationName; } public String getDestinationType() { if (requestConnectionBinding != null && requestConnectionBinding.getDestinationType() != null) { return requestConnectionBinding.getDestinationType(); } else { return destinationType; } } public void setDestinationType(String destinationType) { this.destinationType = destinationType; } public String getDestinationCreate() { if (requestConnectionBinding != null && requestConnectionBinding.getDestinationCreate() != null) { return requestConnectionBinding.getDestinationCreate(); } else { return this.destinationCreate; } } public void setDestinationCreate(String create) { this.destinationCreate = create; } public String getConnectionFactoryName() { if (requestConnectionBinding != null && requestConnectionBinding.getConnectionFactoryName() != null) { return requestConnectionBinding.getConnectionFactoryName(); } else { return connectionFactoryName; } } public void setConnectionFactoryName(String connectionFactoryName) { this.connectionFactoryName = connectionFactoryName; } public String getConnectionFactoryCreate() { if (requestConnectionBinding != null && requestConnectionBinding.getConnectionFactoryCreate() != null) { return requestConnectionBinding.getConnectionFactoryCreate(); } else { return this.connectionFactoryCreate; } } public void setConnectionFactoryCreate(String create) { this.connectionFactoryCreate = create; } public String getResourceAdapterName() { return resourceAdapterName; } public void setResourceAdapterName(String name) { resourceAdapterName = name; } public String getActivationSpecName() { if (requestConnectionBinding != null && requestConnectionBinding.getActivationSpecName() != null) { return requestConnectionBinding.getActivationSpecName(); } else { return activationSpecName; } } public void setActivationSpecName(String activationSpecName) { this.activationSpecName = activationSpecName; } public String getActivationSpecCreate() { if (requestConnectionBinding != null && requestConnectionBinding.getActivationSpecCreate() != null) { return requestConnectionBinding.getActivationSpecCreate(); } else { return this.activationSpecCreate; } } public void setActivationSpecCreate(String create) { this.activationSpecCreate = create; } public String getResponseDestinationName() { if (requestConnectionBinding != null && requestConnectionBinding.getResponseDestinationName() != null) { return requestConnectionBinding.getResponseDestinationName(); } else { return this.responseDestinationName; } } public void setResponseDestinationName(String name) { this.responseDestinationName = name; } public String getResponseDestinationType() { if (requestConnectionBinding != null && requestConnectionBinding.getResponseDestinationType() != null) { return requestConnectionBinding.getResponseDestinationType(); } else { return this.responseDestinationType; } } public void setResponseDestinationType(String type) { this.responseDestinationType = type; } public String getResponseDestinationCreate() { if (requestConnectionBinding != null && requestConnectionBinding.getResponseDestinationCreate() != null) { return requestConnectionBinding.getResponseDestinationCreate(); } else { return this.responseDestinationCreate; } } public void setResponseDestinationCreate(String create) { this.responseDestinationCreate = create; } public String getResponseConnectionFactoryName() { if (requestConnectionBinding != null && requestConnectionBinding.getResponseConnectionFactoryName() != null) { return requestConnectionBinding.getResponseConnectionFactoryName(); } else { return responseConnectionFactoryName; } } public void setResponseConnectionFactoryName(String connectionFactoryName) { this.responseConnectionFactoryName = connectionFactoryName; } public String getResponseConnectionFactoryCreate() { if (requestConnectionBinding != null && requestConnectionBinding.getResponseConnectionFactoryCreate() != null) { return requestConnectionBinding.getResponseConnectionFactoryCreate(); } else { return this.responseConnectionFactoryCreate; } } public void setResponseConnectionFactoryCreate(String create) { this.responseConnectionFactoryCreate = create; } public String getResponseActivationSpecName() { if (requestConnectionBinding != null && requestConnectionBinding.getResponseActivationSpecName() != null) { return requestConnectionBinding.getResponseActivationSpecName(); } else { return responseActivationSpecName; } } public void setResponseActivationSpecName(String activationSpecName) { this.responseActivationSpecName = activationSpecName; } public String getResponseActivationSpecCreate() { if (requestConnectionBinding != null && requestConnectionBinding.getResponseActivationSpecCreate() != null) { return requestConnectionBinding.getResponseActivationSpecCreate(); } else { return this.responseActivationSpecCreate; } } public void setResponseActivationSpecCreate(String create) { this.responseActivationSpecCreate = create; } public String getJmsResourceFactoryName() { return jmsResourceFactoryName; } public void setJmsResourceFactoryName(String jmsResourceFactoryName) { this.jmsResourceFactoryName = jmsResourceFactoryName; } public void setRequestMessageProcessorName(String name) { this.requestMessageProcessorName = name; } public String getRequestMessageProcessorName() { return requestMessageProcessorName; } public void setResponseMessageProcessorName(String name) { this.responseMessageProcessorName = name; } public String getResponseMessageProcessorName() { return 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; } public void setHeaders( boolean containsHeaders ) { this.containsHeaders = containsHeaders; } public boolean containsHeaders() { return this.containsHeaders; } public String getReplyTo() { return replyTo; } public void setReplyTo(String replyTo) { this.replyTo = replyTo; } // getEffective...() will return values based on the following priority // 1. The value specified in the URI attribute // 2. The value specified in the operationProperties/headers // 3. The value specified in the headers element // 4. The default value from the headers element public String getEffectiveJMSType(String opName) { if ( getJMSURIType() != null ) return getJMSURIType(); else if ( getOperationJMSType(opName) != null ) return getOperationJMSType(opName); else if ( getJMSHeaderType() != null ) return getJMSHeaderType(); else return null; } public Boolean getEffectiveJMSDeliveryMode(String opName) { if ( getURIJMSDeliveryMode() != null ) return getURIJMSDeliveryMode(); else if ( getOperationJMSDeliveryMode(opName) != null) return getOperationJMSDeliveryMode(opName); else if ( getHeaderJMSDeliveryMode() != null) return getHeaderJMSDeliveryMode(); else return getDefaultDeliveryMode(); } public Long getEffectiveJMSTimeToLive(String opName) { if ( getURIJMSTimeToLive() != null ) return getURIJMSTimeToLive(); else if ( getOperationJMSTimeToLive(opName) != null) return getOperationJMSTimeToLive(opName); else if ( getHeaderJMSTimeToLive() != null) return getHeaderJMSTimeToLive(); else return getDefaultJMSTimeToLive(); } public Integer getEffectiveJMSPriority(String operationName) { if ( getURIJMSPriority() != null ) return getURIJMSPriority(); else if ( getOperationJMSPriority(operationName)!= null) return getOperationJMSPriority(operationName); else if ( getJMSHeaderPriority() != null ) return getJMSHeaderPriority(); else return getDefaultJMSPriority(); } private Long getHeaderJMSTimeToLive() { return this.headerTimeToLive; } private Long getDefaultJMSTimeToLive() { return this.defaultJMSTimeToLive; } private Boolean getDefaultDeliveryMode() { return this.defaultDeliveryMode; } private Boolean getHeaderJMSDeliveryMode() { return headerDeliveryMode; } private Boolean getURIJMSDeliveryMode() { return this.uriDeliveryMode; } public String getJMSURIType() { return uriType; } public void setJMSURIType(String type) { this.uriType = type; } public String getJMSHeaderType() { return headerType; } public void setJMSHeaderType(String type) { this.headerType = type; } public String getJMSCorrelationId() { return jmsCorrelationId; } public void setJMSCorrelationId(String jmsCorrelationId) { setHeaders( true ); this.jmsCorrelationId = jmsCorrelationId; } public Set<String> getPropertyNames() { return properties.keySet(); } public Object getProperty(String name) { return properties.get(name); } public void setProperty(String name, Object value) { properties.put(name, value); } protected Map<String, Object> getProperties() { return properties; } /** * Adds an operationName to this binding. * @param opName */ public void addOperationName(String opName) { Map<String, Object> props = operationProperties.get(opName); if (props == null) { props = new HashMap<String, Object>(); operationProperties.put(opName, props); } } /** * Provides set of operation names in this binding. * @return a Set<String> of operation names */ public Set<String> getOperationNames() { if (operationPropertiesBinding != null) { return operationPropertiesBinding.getOperationNames(); } else { // Make a defensive copy since key changes affect map, map changes affect keys. Set<String> opNames = operationProperties.keySet(); Set<String> opNamesCopy = new TreeSet<String>( opNames ); return opNamesCopy; } } public Map<String, Object> getOperationProperties(String opName) { if (operationPropertiesBinding != null) { return operationPropertiesBinding.getOperationProperties(opName); } else { return operationProperties.get(opName); } } public void setOperationProperty(String opName, String propName, Object value) { Map<String, Object> props = operationProperties.get(opName); if (props == null) { props = new HashMap<String, Object>(); operationProperties.put(opName, props); } props.put(propName, value); } /** * Provides the value of a property for a given operation * @param opName is the name of the operation in this binding. * @param propName is the key name for the property * @return Object representing the property value for this property name. Returns * null for non existant operation name or property name. */ public Object getOperationProperty(String opName, String propName ) { if (operationPropertiesBinding != null) { return operationPropertiesBinding.getOperationProperty(opName, propName); } else { Map<String, Object> props = operationProperties.get(opName); if (props == null) { return null; } return props.get(propName); } } public boolean hasNativeOperationName(String opName) { if (operationPropertiesBinding != null) { return operationPropertiesBinding.hasNativeOperationName(opName); } else { return nativeOperationNames.containsKey(opName); } } public String getNativeOperationName(String opName) { if (operationPropertiesBinding != null && operationPropertiesBinding.getNativeOperationName(opName) != null) { return operationPropertiesBinding.getNativeOperationName(opName); } else { if (nativeOperationNames.containsKey(opName)) { return nativeOperationNames.get(opName); } else { return opName; } } } public void setNativeOperationName(String opName, String nativeOpName) { this.nativeOperationNames .put(opName, nativeOpName); } public Map<String, String> getNativeOperationNames() { return nativeOperationNames; } public String getOperationJMSType(String opName) { if (operationPropertiesBinding != null && operationPropertiesBinding.getOperationJMSType(opName) != null) { return operationPropertiesBinding.getOperationJMSType(opName); } else { if (operationJMSTypes.containsKey(opName)) { return operationJMSTypes.get(opName); } else { return null; } } } public void setOperationJMSType(String opName, String jmsType) { this.operationJMSTypes.put(opName, jmsType); } public String getOperationJMSCorrelationId(String opName) { if (operationPropertiesBinding != null) { if (operationPropertiesBinding.getOperationJMSCorrelationId(opName) != null) { return operationPropertiesBinding.getOperationJMSCorrelationId(opName); } else { return jmsCorrelationId; } } else { if (operationJMSCorrelationIds.containsKey(opName)) { return operationJMSCorrelationIds.get(opName); } else { return jmsCorrelationId; } } } public void setOperationJMSCorrelationId(String opName, String jmsCorrelationId) { operationJMSCorrelationIds.put(opName, jmsCorrelationId); } public Boolean getOperationJMSDeliveryMode(String opName) { if (operationPropertiesBinding != null) { if (operationPropertiesBinding.getOperationJMSDeliveryMode(opName) != null) { return operationPropertiesBinding.getOperationJMSDeliveryMode(opName); } else { return null; } } else { if (operationJMSDeliveryModes.containsKey(opName)) { return operationJMSDeliveryModes.get(opName); } else { return null; } } } public void setOperationJMSDeliveryMode(String opName, boolean b) { operationJMSDeliveryModes.put(opName, b); } public Long getOperationJMSTimeToLive(String opName) { if (operationPropertiesBinding != null) { if (operationPropertiesBinding.getOperationJMSTimeToLive(opName) != null) { return operationPropertiesBinding.getOperationJMSTimeToLive(opName); } else { return null; } } else { if (operationJMSTimeToLives.containsKey(opName)) { return operationJMSTimeToLives.get(opName); } else { return null; } } } public void setOperationJMSTimeToLive(String opName, Long ttl) { operationJMSTimeToLives.put(opName, ttl); } public Integer getOperationJMSPriority(String opName) { if (operationPropertiesBinding != null) { if (operationPropertiesBinding.getOperationJMSPriority(opName) != null) { return operationPropertiesBinding.getOperationJMSPriority(opName); } else { return null; } } else { if (operationJMSPriorities.containsKey(opName)) { return operationJMSPriorities.get(opName); } else { return null; } } } public void setOperationJMSPriority(String opName, int p) { operationJMSPriorities.put(opName, p); } public String getJMSSelector() { if ( this.uriJmsSelector != null ) return this.uriJmsSelector; else return jmsSelector; } public void setJMSSelector(String jmsSelector) { this.jmsSelector = jmsSelector; } public QName getRequestConnectionName() { return requestConnectionName; } public void setRequestConnectionName(QName requestConnectionName) { this.requestConnectionName = requestConnectionName; } public void setResponseConnectionName(QName responseConnectionName) { this.responseConnectionName = responseConnectionName; } public QName getResponseConnectionName() { return responseConnectionName; } public void setRequestConnectionBinding(JMSBinding binding) { this.requestConnectionBinding = binding; } public JMSBinding getRequestConnectionBinding() { return requestConnectionBinding; } public void setResponseConnectionBinding(JMSBinding binding) { this.responseConnectionBinding = binding; } public JMSBinding getResponseConnectionBinding() { return responseConnectionBinding; } public void setOperationPropertiesName(QName nameValue) { this.operationPropertiesName = nameValue; } public QName getOperationPropertiesName() { return operationPropertiesName; } public void setOperationPropertiesBinding(JMSBinding binding) { this.operationPropertiesBinding = binding; } public JMSBinding getOperationPropertiesBinding() { return operationPropertiesBinding; } // operations required by PolicySetAttachPoint public List<PolicySet> getPolicySets() { return policySets; } public List<PolicySet> getApplicablePolicySets() { return applicablePolicySets; } // operations required by IntentAttachPoint public List<Intent> getRequiredIntents() { return requiredIntents; } public QName getType() { return TYPE; } public Map<String, BindingProperty> getDestinationProperties() { return destinationProperties; } public Map<String, BindingProperty> getConnectionFactoryProperties() { return connectionFactoryProperties; } public Map<String, BindingProperty> getResourceAdapterProperties() { return resourceAdapterProperties; } public Map<String, BindingProperty> getActivationSpecProperties() { return activationSpecProperties; } public Map<String, BindingProperty> getResponseActivationSpecProperties() { return responseActivationSpecProperties; } public Map<String, BindingProperty> getResponseDestinationProperties() { return responseDestinationProperties; } public Map<String, BindingProperty> getResponseConnectionFactoryProperties() { return responseConnectionFactoryProperties; } public Map<String, BindingProperty> getOperationPropertiesProperties(String opName) { if (operationPropertiesProperties.get(opName)==null) { operationPropertiesProperties.put(opName, new HashMap<String, BindingProperty>()); } return operationPropertiesProperties.get(opName); } public List<ConfiguredOperation> getConfiguredOperations() { return configuredOperations; } public void setConfiguredOperations(List<ConfiguredOperation> configuredOperations) { this.configuredOperations = configuredOperations; } public String getTargetNamespace() { return targetNamespace; } public void setTargetNamespace(String ns) { targetNamespace = ns; } // hashCode() is here because binding elements in definitions documents are added // to the model resolver hashmap. The namespace and name are keys. @Override public int hashCode() { return (String.valueOf(getTargetNamespace()) + String.valueOf(getName())).hashCode(); } @Override public boolean equals( Object object ) { return ( object instanceof JMSBinding ) && equals( (JMSBinding) object ); } /** * Compares two JMS bindings for equality. * Because of the many fields, this comparison is rather large O(n). * @param binding test binding for equality comparison * @return boolean stating whether objects are equal */ public boolean equals( JMSBinding binding ) { // If the target namespace is set, this binding came from a definitions document. // The target namespace and name are used as keys for doing model resolver hashmap lookups. // Only the target namespace and name can be compared. if (this.targetNamespace != null) { if ( !optStringEquals( this.targetNamespace, binding.getTargetNamespace() )) return false; if ( !optStringEquals( this.name, binding.getName() )) return false; return true; } // Test all fields for equality. // First test simple fields to quickly weed out mismatches. if ( !optStringEquals( this.uri, binding.getURI() )) return false; if ( !optStringEquals( this.name, binding.getName() )) return false; if ( !optStringEquals( this.targetNamespace, binding.getTargetNamespace() )) return false; if ( !optStringEquals( this.destinationName, binding.getDestinationName() )) return false; if ( !optStringEquals( this.correlationScheme, binding.getCorrelationScheme() )) return false; if ( !optStringEquals( this.initialContextFactoryName, binding.getInitialContextFactoryName() )) return false; if ( !optStringEquals( this.jndiURL, binding.getJndiURL() )) return false; if ( !optStringEquals( this.requestConnectionName, binding.getRequestConnectionName() )) return false; if ( !optStringEquals( this.responseConnectionName, binding.getResponseConnectionName() )) return false; if ( !optStringEquals( this.jmsSelector, binding.getJMSSelector() )) return false; if ( !equals( properties, binding.getProperties()) ) return false; // Test operation properties Set<String> operationNamesA = this.getOperationNames(); Set<String> operationNamesB = binding.getOperationNames(); if ( operationNamesA != null && operationNamesB != null ) { if ( operationNamesA == null && operationNamesB != null ) return false; if ( operationNamesA != null && operationNamesB == null ) return false; if ( operationNamesA.size() != operationNamesB.size() ) return false; for(Iterator<String> it=operationNamesA.iterator(); it.hasNext(); ) { String opName = it.next(); if ( !operationNamesB.contains( opName )) { return false; } } } // Destination properties if ( !optStringEquals( this.getDestinationName(), binding.getDestinationName() )) return false; if ( !optStringEquals( this.getDestinationType(), binding.getDestinationType() )) return false; // Connection factory properties if ( !optStringEquals( this.getConnectionFactoryName(), binding.getConnectionFactoryName() )) return false; // Activation spec properties if ( !optStringEquals( this.getActivationSpecName(), binding.getActivationSpecName() )) return false; // Response properties if ( !optStringEquals( this.getResponseDestinationName(), binding.getResponseDestinationName() )) return false; if ( !optStringEquals( this.getResponseActivationSpecName(), binding.getResponseActivationSpecName() )) return false; if ( !optStringEquals( this.getResponseConnectionFactoryName(), binding.getResponseConnectionFactoryName() )) return false; // Resource adapter if ( !optStringEquals( this.getResourceAdapterName(), binding.getResourceAdapterName() )) return false; // Configured operations if ( this.configuredOperations.size() != binding.getConfiguredOperations().size() ) return false; // wire format if ( this.getRequestWireFormat().getClass() != binding.getRequestWireFormat().getClass()) return false; if ( this.getResponseWireFormat().getClass() != binding.getResponseWireFormat().getClass()) return false; // operation selector if ( this.getOperationSelector().getClass() != binding.getOperationSelector().getClass()) return false; // Other fields could also be checked for equality. See class fields for details. return true; } /** * Tests if Strings are equal. * Either one may be null. This will match true if both * are null or both are non-null and equal. * @param p1 property list 1 * @param p2 property list 2 * @return whether or not properties are equal */ public static boolean optStringEquals( Object s1, Object s2 ) { if ( s1 == null && s2 == null ) return true; if ( s1 != null && s2 == null ) return false; if ( s1 == null && s2 != null ) return false; return s1.equals( s2 ); } /** * Tests if two property lists are equal. * Either one may be null. This will match true if both * are null or both are non-null and equal. * @param p1 property list 1 * @param p2 property list 2 * @return whether or not properties are equal */ public static boolean equals( Map<String, Object> p1, Map<String, Object> p2 ) { if ( p1 == null && p2 == null) return true; if ( p1 == null || p2 == null) return false; if ( p1.size() != p2.size()) return false; // For both the keys and values of a map for (Iterator it=p1.entrySet().iterator(); it.hasNext(); ) { Map.Entry entry = (Map.Entry)it.next(); Object k1 = entry.getKey(); Object v1 = entry.getValue(); Object v2 = p2.get( k1 ); if ( v1 == null && v2 != null ) return false; if ( v1 != null && v2 == null ) return false; if ( !v1.equals( v2 )) return false; } return true; } public ExtensionType getExtensionType() { return extensionType; } public void setExtensionType(ExtensionType intentAttachPointType) { this.extensionType = intentAttachPointType; } public String getJMSURI() { return jmsURI; } public void setJMSURI(String jmsURI) { this.jmsURI = jmsURI; } public void setURIJMSDeliveryMode(boolean equals) { this.uriDeliveryMode = Boolean.valueOf(equals); } public Integer getURIJMSPriority() { return this.uriJMSPriority; } public void setURIJMSPriority(int parseInt) { this.uriJMSPriority = Integer.valueOf(parseInt); } public Long getURIJMSTimeToLive() { return this.uriJMSTimeToLive; } public void setURIJMSTimeToLive(long parseLong) { this.uriJMSTimeToLive = Long.valueOf(parseLong); } public Boolean isHeaderDeliveryModePersistent() { return this.headerDeliveryMode; } public void setJMSHeaderDeliveryMode(boolean b) { this.headerDeliveryMode = Boolean.valueOf(b); } public Long getJMSHeaderTimeToLive() { return this.headerTimeToLive; } public void setJMSHeaderTimeToLive(long parseLong) { this.headerTimeToLive = Long.valueOf(parseLong); } public Integer getJMSHeaderPriority() { return this.headerPriority; } public void setJMSHeaderPriority(int p) { this.headerPriority = Integer.valueOf(p); } public Integer getDefaultJMSPriority() { return this.defaultPriority; } public void setIsDestinationSpecified(boolean b) { this.isDestinationSpecified = b; } public boolean isDestinationSpecified() { return this.isDestinationSpecified ; } public void setURIJMSSelector(String selector) { this.uriJmsSelector = selector; } }