/*
* Copyright: Almende B.V. (2014), Rotterdam, The Netherlands
* License: The Apache Software License, Version 2.0
*/
package com.almende.eve.transport.amqp;
import java.net.URI;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.almende.eve.capabilities.AbstractCapabilityBuilder;
import com.almende.eve.capabilities.Capability;
import com.almende.eve.capabilities.handler.Handler;
import com.almende.eve.transport.Receiver;
import com.almende.eve.transport.Transport;
import com.almende.eve.transport.TransportService;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* The Class AmqpTransportService.
*/
public class AmqpTransportBuilder extends
AbstractCapabilityBuilder<AmqpTransport> {
private final Map<URI, AmqpTransport> instances = new ConcurrentHashMap<URI, AmqpTransport>();
private static AmqpService singleton = null;
@Override
public AmqpTransport build() {
if (singleton == null) {
singleton = new AmqpService();
singleton.doesShortcut = AmqpTransportConfig.decorate(getParams())
.getDoShortcut();
}
return singleton.get(getParams(), getHandle());
}
class AmqpService implements TransportService {
private boolean doesShortcut = true;
/**
* Gets the actual AMQP transport
*
* @param <T>
* the generic type
* @param <V>
* the value type
* @param params
* the params
* @param handle
* the handle
* @return the xmpp transport
*/
public <T extends Capability, V> AmqpTransport get(
final ObjectNode params, final Handler<V> handle) {
final Handler<Receiver> newHandle = Transport.TYPEUTIL
.inject(handle);
final AmqpTransportConfig config = AmqpTransportConfig
.decorate(params);
final URI address = config.getAddress();
AmqpTransport result = instances.get(address);
if (result == null) {
result = new AmqpTransport(config, newHandle, this);
instances.put(address, result);
} else {
result.getHandle().update(newHandle);
}
return result;
}
/*
* (non-Javadoc)
* @see
* com.almende.eve.transport.TransportService#delete(com.almende.eve.
* transport
* .Transport)
*/
@Override
public void delete(final Transport instance) {
instances.remove(instance.getAddress());
}
/*
* (non-Javadoc)
* @see
* com.almende.eve.transport.TransportService#getLocal(java.net.URI)
*/
@Override
public Transport getLocal(final URI address) {
if (doesShortcut && instances.containsKey(address)) {
return instances.get(address);
}
return null;
}
}
}