blob: bb625419168cc77cf7251235266b694c75535fc0 [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.broker.region.virtual;
import java.util.Collection;
import org.apache.activemq.broker.Broker;
import org.apache.activemq.broker.ConnectionContext;
import org.apache.activemq.broker.region.Destination;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.CommandTypes;
public abstract class CompositeDestination implements VirtualDestination {
private String name;
private Collection forwardTo;
private boolean forwardOnly = true;
private boolean concurrentSend = false;
@Override
public Destination intercept(Destination destination) {
return new CompositeDestinationFilter(destination, getForwardTo(), isForwardOnly(), isConcurrentSend());
}
@Override
public void create(Broker broker, ConnectionContext context, ActiveMQDestination destination) {
}
@Override
public void remove(Destination destination) {
}
public String getName() {
return name;
}
/**
* Sets the name of this composite destination
*/
public void setName(String name) {
this.name = name;
}
public Collection getForwardTo() {
return forwardTo;
}
/**
* Sets the list of destinations to forward to
*/
public void setForwardTo(Collection forwardDestinations) {
this.forwardTo = forwardDestinations;
}
public boolean isForwardOnly() {
return forwardOnly;
}
/**
* Sets if the virtual destination is forward only (and so there is no
* physical queue to match the virtual queue) or if there is also a physical
* queue with the same name).
*/
public void setForwardOnly(boolean forwardOnly) {
this.forwardOnly = forwardOnly;
}
@Deprecated
public boolean isCopyMessage() {
return true;
}
/**
* Sets whether a copy of the message will be sent to each destination.
* Defaults to true so that the forward destination is set as the
* destination of the message
*
* @deprecated this option will be removed in a later release, message are always copied.
*/
@Deprecated
public void setCopyMessage(boolean copyMessage) {
}
/**
* when true, sends are done in parallel with the broker executor
*/
public void setConcurrentSend(boolean concurrentSend) {
this.concurrentSend = concurrentSend;
}
public boolean isConcurrentSend() {
return this.concurrentSend;
}
@Override
public ActiveMQDestination getMappedDestinations() {
final ActiveMQDestination[] destinations = new ActiveMQDestination[forwardTo.size()];
int i = 0;
for (Object dest : forwardTo) {
if (dest instanceof FilteredDestination) {
FilteredDestination filteredDestination = (FilteredDestination) dest;
destinations[i++] = filteredDestination.getDestination();
} else if (dest instanceof ActiveMQDestination) {
destinations[i++] = (ActiveMQDestination) dest;
} else {
// highly unlikely, but just in case!
throw new IllegalArgumentException("Unknown mapped destination type " + dest);
}
}
// used just for matching destination paths
return new ActiveMQDestination(destinations) {
@Override
protected String getQualifiedPrefix() {
return "mapped://";
}
@Override
public byte getDestinationType() {
return QUEUE_TYPE | TOPIC_TYPE;
}
@Override
public byte getDataStructureType() {
return CommandTypes.ACTIVEMQ_QUEUE | CommandTypes.ACTIVEMQ_TOPIC;
}
};
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (concurrentSend ? 1231 : 1237);
result = prime * result + (forwardOnly ? 1231 : 1237);
result = prime * result + ((forwardTo == null) ? 0 : forwardTo.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
CompositeDestination other = (CompositeDestination) obj;
if (concurrentSend != other.concurrentSend) {
return false;
}
if (forwardOnly != other.forwardOnly) {
return false;
}
if (forwardTo == null) {
if (other.forwardTo != null) {
return false;
}
} else if (!forwardTo.equals(other.forwardTo)) {
return false;
}
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name)) {
return false;
}
return true;
}
}