/*
* Copyright LGPL3
* YES Technology Association
* http://yestech.org
*
* http://www.opensource.org/licenses/lgpl-3.0.html
*/
package org.yestech.lib.camel;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import org.apache.camel.Component;
import org.apache.camel.Consumer;
import org.apache.camel.Processor;
import org.apache.camel.Producer;
import org.apache.camel.impl.DefaultEndpoint;
import org.terracotta.message.pipe.Pipe;
import org.terracotta.modules.annotations.Root;
/**
* An implementation of the asynchronous Pipe exchanges on a {@link org.terracotta.message.pipe.Pipe} within a CamelContext
*
* A component based on camel SEDA component.
*/
public class TerracottaEndpoint extends DefaultEndpoint {
@Root
private Pipe<Object> pipe;
private int concurrentConsumers = 1;
private Set<TerracottaProducer> producers = new CopyOnWriteArraySet<TerracottaProducer>();
private Set<TerracottaConsumer> consumers = new CopyOnWriteArraySet<TerracottaConsumer>();
public TerracottaEndpoint() {
}
public TerracottaEndpoint(String endpointUri, Component component, Pipe<Object> pipe) {
this(endpointUri, component, pipe, 1);
}
public TerracottaEndpoint(String endpointUri, Component component, Pipe<Object> pipe, int concurrentConsumers) {
super(endpointUri, component);
this.pipe = pipe;
this.concurrentConsumers = concurrentConsumers;
}
public TerracottaEndpoint(String endpointUri, Pipe<Object> pipe) {
this(endpointUri, pipe, 1);
}
public TerracottaEndpoint(String endpointUri, Pipe<Object> pipe, int concurrentConsumers) {
super(endpointUri);
this.pipe = pipe;
this.concurrentConsumers = concurrentConsumers;
}
public Producer createProducer() throws Exception {
return new TerracottaProducer(this, getPipe());
}
public Consumer createConsumer(Processor processor) throws Exception {
return new TerracottaConsumer(this, processor);
}
public Pipe<Object> getPipe() {
return pipe;
}
public void setPipe(Pipe<Object> queue) {
this.pipe = queue;
}
public void setConcurrentConsumers(int concurrentConsumers) {
this.concurrentConsumers = concurrentConsumers;
}
public int getConcurrentConsumers() {
return concurrentConsumers;
}
public boolean isSingleton() {
return true;
}
/**
* Returns the current active consumers on this endpoint
*/
public Set<TerracottaConsumer> getConsumers() {
return new HashSet<TerracottaConsumer>(consumers);
}
/**
* Returns the current active producers on this endpoint
*/
public Set<TerracottaProducer> getProducers() {
return new HashSet<TerracottaProducer>(producers);
}
void onStarted(TerracottaProducer producer) {
producers.add(producer);
}
void onStopped(TerracottaProducer producer) {
producers.remove(producer);
}
void onStarted(TerracottaConsumer consumer) {
consumers.add(consumer);
}
void onStopped(TerracottaConsumer consumer) {
consumers.remove(consumer);
}
}