blob: 4d8b18fbf7540a3300255d53f687c4f8df1c4f9a [file] [log] [blame]
/*
* 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.activemq.artemis.ra.inflow;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.Topic;
import javax.resource.ResourceException;
import javax.resource.spi.ActivationSpec;
import javax.resource.spi.InvalidPropertyException;
import javax.resource.spi.ResourceAdapter;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import org.apache.activemq.artemis.ra.ConnectionFactoryProperties;
import org.apache.activemq.artemis.ra.ActiveMQRALogger;
import org.apache.activemq.artemis.ra.ActiveMQRaUtils;
import org.apache.activemq.artemis.ra.ActiveMQResourceAdapter;
/**
* The activation spec
* These properties are set on the MDB ActivactionProperties
*/
public class ActiveMQActivationSpec extends ConnectionFactoryProperties implements ActivationSpec, Serializable {
private static final long serialVersionUID = -7997041053897964654L;
private static final int DEFAULT_MAX_SESSION = 15;
/**
* Whether trace is enabled
*/
private static boolean trace = ActiveMQRALogger.LOGGER.isTraceEnabled();
public String strConnectorClassName;
public String strConnectionParameters;
/**
* The resource adapter
*/
private ActiveMQResourceAdapter ra;
/**
* The connection factory lookup
*/
private String connectionFactoryLookup;
/**
* The destination
*/
private String destination;
/**
* The destination type
*/
private String destinationType;
/**
* The message selector
*/
private String messageSelector;
/**
* The acknowledgement mode
*/
private int acknowledgeMode;
/**
* The subscription durability
*/
private boolean subscriptionDurability;
/**
* The subscription name
*/
private String subscriptionName;
/**
* If this is true, a durable subscription could be shared by multiple MDB instances
*/
private boolean shareSubscriptions;
/**
* The user
*/
private String user;
/**
* The password
*/
private String password;
/**
* The maximum number of sessions
*/
private Integer maxSession;
/**
* Transaction timeout
*/
private Integer transactionTimeout;
private Boolean useJNDI = true;
private String jndiParams = null;
private Hashtable<String, String> parsedJndiParams;
/* use local tx instead of XA*/
private Boolean localTx;
// undefined by default, default is specified at the RA level in ActiveMQRAProperties
private Integer setupAttempts;
// undefined by default, default is specified at the RA level in ActiveMQRAProperties
private Long setupInterval;
private Boolean rebalanceConnections = false;
/**
* Constructor
*/
public ActiveMQActivationSpec() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("constructor()");
}
ra = null;
destination = null;
destinationType = null;
messageSelector = null;
acknowledgeMode = Session.AUTO_ACKNOWLEDGE;
subscriptionDurability = false;
subscriptionName = null;
user = null;
password = null;
maxSession = DEFAULT_MAX_SESSION;
transactionTimeout = 0;
}
/**
* Get the resource adapter
*
* @return The resource adapter
*/
@Override
public ResourceAdapter getResourceAdapter() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getResourceAdapter()");
}
return ra;
}
/**
* @return the useJNDI
*/
public boolean isUseJNDI() {
if (useJNDI == null) {
return ra.isUseJNDI();
}
return useJNDI;
}
/**
* @param value the useJNDI to set
*/
public void setUseJNDI(final boolean value) {
useJNDI = value;
}
/**
* @return return the jndi params to use
*/
public String getJndiParams() {
if (jndiParams == null) {
return ra.getJndiParams();
}
return jndiParams;
}
public void setJndiParams(String jndiParams) {
this.jndiParams = jndiParams;
parsedJndiParams = ActiveMQRaUtils.parseHashtableConfig(jndiParams);
}
public Hashtable<?, ?> getParsedJndiParams() {
if (parsedJndiParams == null) {
return ra.getParsedJndiParams();
}
return parsedJndiParams;
}
/**
* Set the resource adapter
*
* @param ra The resource adapter
* @throws ResourceException Thrown if incorrect resource adapter
*/
@Override
public void setResourceAdapter(final ResourceAdapter ra) throws ResourceException {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setResourceAdapter(" + ra + ")");
}
if (ra == null || !(ra instanceof ActiveMQResourceAdapter)) {
throw new ResourceException("Resource adapter is " + ra);
}
this.ra = (ActiveMQResourceAdapter) ra;
}
/**
* Get the connection factory lookup
*
* @return The value
*/
public String getConnectionFactoryLookup() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getConnectionFactoryLookup() ->" + connectionFactoryLookup);
}
return connectionFactoryLookup;
}
/**
* Set the connection factory lookup
*
* @param value The value
*/
public void setConnectionFactoryLookup(final String value) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setConnectionFactoryLookup(" + value + ")");
}
connectionFactoryLookup = value;
}
/**
* Get the destination
*
* @return The value
*/
public String getDestination() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getDestination()");
}
return destination;
}
/**
* Set the destination
*
* @param value The value
*/
public void setDestination(final String value) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setDestination(" + value + ")");
}
destination = value;
}
/**
* Get the destination lookup
*
* @return The value
*/
public String getDestinationLookup() {
return getDestination();
}
/**
* Set the destination
*
* @param value The value
*/
public void setDestinationLookup(final String value) {
setDestination(value);
setUseJNDI(true);
}
/**
* Get the destination type
*
* @return The value
*/
public String getDestinationType() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getDestinationType()");
}
return destinationType;
}
/**
* Set the destination type
*
* @param value The value
*/
public void setDestinationType(final String value) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setDestinationType(" + value + ")");
}
destinationType = value;
}
/**
* Get the message selector
*
* @return The value
*/
public String getMessageSelector() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getMessageSelector()");
}
return messageSelector;
}
/**
* Set the message selector
*
* @param value The value
*/
public void setMessageSelector(final String value) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setMessageSelector(" + value + ")");
}
messageSelector = value;
}
/**
* Get the acknowledge mode
*
* @return The value
*/
public String getAcknowledgeMode() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getAcknowledgeMode()");
}
if (Session.DUPS_OK_ACKNOWLEDGE == acknowledgeMode) {
return "Dups-ok-acknowledge";
}
else {
return "Auto-acknowledge";
}
}
/**
* Set the acknowledge mode
*
* @param value The value
*/
public void setAcknowledgeMode(final String value) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setAcknowledgeMode(" + value + ")");
}
if ("DUPS_OK_ACKNOWLEDGE".equalsIgnoreCase(value) || "Dups-ok-acknowledge".equalsIgnoreCase(value)) {
acknowledgeMode = Session.DUPS_OK_ACKNOWLEDGE;
}
else if ("AUTO_ACKNOWLEDGE".equalsIgnoreCase(value) || "Auto-acknowledge".equalsIgnoreCase(value)) {
acknowledgeMode = Session.AUTO_ACKNOWLEDGE;
}
else {
throw new IllegalArgumentException("Unsupported acknowledgement mode " + value);
}
}
/**
* @return the acknowledgement mode
*/
public int getAcknowledgeModeInt() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getAcknowledgeMode()");
}
return acknowledgeMode;
}
/**
* Get the subscription durability
*
* @return The value
*/
public String getSubscriptionDurability() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getSubscriptionDurability()");
}
if (subscriptionDurability) {
return "Durable";
}
else {
return "NonDurable";
}
}
/**
* Set the subscription durability
*
* @param value The value
*/
public void setSubscriptionDurability(final String value) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setSubscriptionDurability(" + value + ")");
}
subscriptionDurability = "Durable".equals(value);
}
/**
* Get the status of subscription durability
*
* @return The value
*/
public boolean isSubscriptionDurable() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("isSubscriptionDurable()");
}
return subscriptionDurability;
}
/**
* Get the subscription name
*
* @return The value
*/
public String getSubscriptionName() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getSubscriptionName()");
}
return subscriptionName;
}
/**
* Set the subscription name
*
* @param value The value
*/
public void setSubscriptionName(final String value) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setSubscriptionName(" + value + ")");
}
subscriptionName = value;
}
/**
* @return the shareDurableSubscriptions
*/
public boolean isShareSubscriptions() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("isShareSubscriptions() = " + shareSubscriptions);
}
return shareSubscriptions;
}
/**
* @param shareSubscriptions the shareDurableSubscriptions to set
*/
public void setShareSubscriptions(boolean shareSubscriptions) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setShareSubscriptions(" + shareSubscriptions + ")");
}
this.shareSubscriptions = shareSubscriptions;
}
/**
* Get the user
*
* @return The value
*/
public String getUser() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getUser()");
}
if (user == null) {
return ra.getUserName();
}
else {
return user;
}
}
/**
* Set the user
*
* @param value The value
*/
public void setUser(final String value) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setUser(" + value + ")");
}
user = value;
}
/**
* Get the password
*
* @return The value
*/
public String getPassword() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getPassword()");
}
if (password == null) {
return ra.getPassword();
}
else {
return password;
}
}
public String getOwnPassword() {
return password;
}
/**
* Set the password
*
* @param value The value
*/
public void setPassword(final String value) throws Exception {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setPassword(****)");
}
password = value;
}
/**
* Get the number of max session
*
* @return The value
*/
public Integer getMaxSession() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getMaxSession()");
}
if (maxSession == null) {
return DEFAULT_MAX_SESSION;
}
return maxSession;
}
/**
* Set the number of max session
*
* @param value The value
*/
public void setMaxSession(final Integer value) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setMaxSession(" + value + ")");
}
maxSession = value;
}
/**
* Get the transaction timeout
*
* @return The value
*/
public Integer getTransactionTimeout() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getTransactionTimeout()");
}
return transactionTimeout;
}
/**
* Set the transaction timeout
*
* @param value The value
*/
public void setTransactionTimeout(final Integer value) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setTransactionTimeout(" + value + ")");
}
transactionTimeout = value;
}
public Boolean isUseLocalTx() {
if (localTx == null) {
return ra.getUseLocalTx();
}
else {
return localTx;
}
}
public void setUseLocalTx(final Boolean localTx) {
this.localTx = localTx;
}
public boolean isRebalanceConnections() {
return rebalanceConnections;
}
public void setRebalanceConnections(boolean rebalanceConnections) {
this.rebalanceConnections = rebalanceConnections;
}
public int getSetupAttempts() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getSetupAttempts()");
}
if (setupAttempts == null) {
return ra.getSetupAttempts();
}
else {
return setupAttempts;
}
}
public void setSetupAttempts(int setupAttempts) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setSetupAttempts(" + setupAttempts + ")");
}
this.setupAttempts = setupAttempts;
}
public long getSetupInterval() {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("getSetupInterval()");
}
if (setupInterval == null) {
return ra.getSetupInterval();
}
else {
return setupInterval;
}
}
public void setSetupInterval(long setupInterval) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setSetupInterval(" + setupInterval + ")");
}
this.setupInterval = setupInterval;
}
// ARTEMIS-399 - support both "clientId" and "clientID" activation config properties
public void setClientId(String clientId) {
setClientID(clientId);
}
/**
* Validate
*
* @throws InvalidPropertyException Thrown if a validation exception occurs
*/
@Override
public void validate() throws InvalidPropertyException {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("validate()");
}
List<String> errorMessages = new ArrayList<>();
List<PropertyDescriptor> propsNotSet = new ArrayList<>();
try {
if (destination == null || destination.trim().equals("")) {
propsNotSet.add(new PropertyDescriptor("destination", ActiveMQActivationSpec.class));
errorMessages.add("Destination is mandatory.");
}
if (destinationType != null && !Topic.class.getName().equals(destinationType) && !Queue.class.getName().equals(destinationType)) {
propsNotSet.add(new PropertyDescriptor("destinationType", ActiveMQActivationSpec.class));
errorMessages.add("If set, the destinationType must be either 'javax.jms.Topic' or 'javax.jms.Queue'.");
}
if ((destinationType == null || destinationType.length() == 0 || Topic.class.getName().equals(destinationType)) && isSubscriptionDurable() && (subscriptionName == null || subscriptionName.length() == 0)) {
propsNotSet.add(new PropertyDescriptor("subscriptionName", ActiveMQActivationSpec.class));
errorMessages.add("If subscription is durable then subscription name must be specified.");
}
}
catch (IntrospectionException e) {
ActiveMQRALogger.LOGGER.unableToValidateProperties(e);
}
if (propsNotSet.size() > 0) {
StringBuffer b = new StringBuffer();
b.append("Invalid settings:");
for (String errorMessage : errorMessages) {
b.append(" ");
b.append(errorMessage);
}
InvalidPropertyException e = new InvalidPropertyException(b.toString());
final PropertyDescriptor[] descriptors = propsNotSet.toArray(new PropertyDescriptor[propsNotSet.size()]);
e.setInvalidPropertyDescriptors(descriptors);
throw e;
}
}
public String getConnectorClassName() {
return strConnectorClassName;
}
public void setConnectorClassName(final String connectorClassName) {
if (ActiveMQActivationSpec.trace) {
ActiveMQRALogger.LOGGER.trace("setConnectorClassName(" + connectorClassName + ")");
}
strConnectorClassName = connectorClassName;
setParsedConnectorClassNames(ActiveMQRaUtils.parseConnectorConnectorConfig(connectorClassName));
}
/**
* @return the connectionParameters
*/
public String getConnectionParameters() {
return strConnectionParameters;
}
public void setConnectionParameters(final String configuration) {
strConnectionParameters = configuration;
setParsedConnectionParameters(ActiveMQRaUtils.parseConfig(configuration));
}
/**
* Get a string representation
*
* @return The value
*/
@Override
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append(ActiveMQActivationSpec.class.getName()).append('(');
buffer.append("ra=").append(ra);
if (connectionFactoryLookup != null) {
buffer.append(" connectionFactoryLookup=").append(connectionFactoryLookup);
}
buffer.append(" destination=").append(destination);
buffer.append(" destinationType=").append(destinationType);
if (messageSelector != null) {
buffer.append(" selector=").append(messageSelector);
}
buffer.append(" ack=").append(getAcknowledgeMode());
buffer.append(" durable=").append(subscriptionDurability);
buffer.append(" clientID=").append(getClientID());
if (subscriptionName != null) {
buffer.append(" subscription=").append(subscriptionName);
}
buffer.append(" user=").append(user);
if (password != null) {
buffer.append(" password=").append("****");
}
buffer.append(" maxSession=").append(maxSession);
buffer.append(')');
return buffer.toString();
}
// here for backwards compatibility
public void setUseDLQ(final boolean b) {
}
public void setDLQJNDIName(final String name) {
}
public void setDLQHandler(final String handler) {
}
public void setDLQMaxResent(final int maxResent) {
}
public void setProviderAdapterJNDI(final String jndi) {
}
/**
* @param keepAlive the keepAlive to set
*/
public void setKeepAlive(boolean keepAlive) {
}
/**
* @param keepAliveMillis the keepAliveMillis to set
*/
public void setKeepAliveMillis(long keepAliveMillis) {
}
public void setReconnectInterval(long interval) {
}
public void setMinSession(final Integer value) {
}
public void setMaxMessages(final Integer value) {
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
ActiveMQActivationSpec that = (ActiveMQActivationSpec) o;
if (acknowledgeMode != that.acknowledgeMode) return false;
if (subscriptionDurability != that.subscriptionDurability) return false;
if (shareSubscriptions != that.shareSubscriptions) return false;
if (strConnectorClassName != null ? !strConnectorClassName.equals(that.strConnectorClassName) : that.strConnectorClassName != null)
return false;
if (strConnectionParameters != null ? !strConnectionParameters.equals(that.strConnectionParameters) : that.strConnectionParameters != null)
return false;
if (ra != null ? !ra.equals(that.ra) : that.ra != null) return false;
if (connectionFactoryLookup != null ? !connectionFactoryLookup.equals(that.connectionFactoryLookup) : that.connectionFactoryLookup != null)
return false;
if (destination != null ? !destination.equals(that.destination) : that.destination != null) return false;
if (destinationType != null ? !destinationType.equals(that.destinationType) : that.destinationType != null)
return false;
if (messageSelector != null ? !messageSelector.equals(that.messageSelector) : that.messageSelector != null)
return false;
if (subscriptionName != null ? !subscriptionName.equals(that.subscriptionName) : that.subscriptionName != null)
return false;
if (user != null ? !user.equals(that.user) : that.user != null) return false;
if (password != null ? !password.equals(that.password) : that.password != null) return false;
if (maxSession != null ? !maxSession.equals(that.maxSession) : that.maxSession != null) return false;
if (transactionTimeout != null ? !transactionTimeout.equals(that.transactionTimeout) : that.transactionTimeout != null)
return false;
if (useJNDI != null ? !useJNDI.equals(that.useJNDI) : that.useJNDI != null) return false;
if (jndiParams != null ? !jndiParams.equals(that.jndiParams) : that.jndiParams != null) return false;
if (parsedJndiParams != null ? !parsedJndiParams.equals(that.parsedJndiParams) : that.parsedJndiParams != null)
return false;
if (localTx != null ? !localTx.equals(that.localTx) : that.localTx != null) return false;
if (rebalanceConnections != null ? !rebalanceConnections.equals(that.rebalanceConnections) : that.rebalanceConnections != null) return false;
if (setupAttempts != null ? !setupAttempts.equals(that.setupAttempts) : that.setupAttempts != null) return false;
return !(setupInterval != null ? !setupInterval.equals(that.setupInterval) : that.setupInterval != null);
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (strConnectorClassName != null ? strConnectorClassName.hashCode() : 0);
result = 31 * result + (strConnectionParameters != null ? strConnectionParameters.hashCode() : 0);
result = 31 * result + (ra != null ? ra.hashCode() : 0);
result = 31 * result + (connectionFactoryLookup != null ? connectionFactoryLookup.hashCode() : 0);
result = 31 * result + (destination != null ? destination.hashCode() : 0);
result = 31 * result + (destinationType != null ? destinationType.hashCode() : 0);
result = 31 * result + (messageSelector != null ? messageSelector.hashCode() : 0);
result = 31 * result + acknowledgeMode;
result = 31 * result + (subscriptionDurability ? 1 : 0);
result = 31 * result + (subscriptionName != null ? subscriptionName.hashCode() : 0);
result = 31 * result + (shareSubscriptions ? 1 : 0);
result = 31 * result + (user != null ? user.hashCode() : 0);
result = 31 * result + (password != null ? password.hashCode() : 0);
result = 31 * result + (maxSession != null ? maxSession.hashCode() : 0);
result = 31 * result + (transactionTimeout != null ? transactionTimeout.hashCode() : 0);
result = 31 * result + (useJNDI != null ? useJNDI.hashCode() : 0);
result = 31 * result + (jndiParams != null ? jndiParams.hashCode() : 0);
result = 31 * result + (parsedJndiParams != null ? parsedJndiParams.hashCode() : 0);
result = 31 * result + (localTx != null ? localTx.hashCode() : 0);
result = 31 * result + (rebalanceConnections != null ? rebalanceConnections.hashCode() : 0);
result = 31 * result + (setupAttempts != null ? setupAttempts.hashCode() : 0);
result = 31 * result + (setupInterval != null ? setupInterval.hashCode() : 0);
return result;
}
}