/*
* Copyright: Almende B.V. (2014), Rotterdam, The Netherlands
* License: The Apache Software License, Version 2.0
*/
package com.almende.eve.transport.pubnub;
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 PubNubTransportBuilder.
*/
public class PubNubTransportBuilder extends
AbstractCapabilityBuilder<PubNubTransport> {
private final Map<URI, PubNubTransport> instances = new ConcurrentHashMap<URI, PubNubTransport>();
private static PubNubService singleton = null;
@Override
public PubNubTransport build() {
if (singleton == null) {
singleton = new PubNubService();
singleton.doesShortcut = PubNubTransportConfig.decorate(getParams())
.getDoShortcut();
}
return singleton.get(getParams(), getHandle());
}
class PubNubService implements TransportService {
private boolean doesShortcut = true;
/**
* Gets the actual PubNub transport
*
* @param <T>
* the generic type
* @param <V>
* the value type
* @param params
* the params
* @param handle
* the handle
* @return the pubnub transport
*/
public <T extends Capability, V> PubNubTransport get(
final ObjectNode params, final Handler<V> handle) {
final Handler<Receiver> newHandle = Transport.TYPEUTIL
.inject(handle);
final PubNubTransportConfig config = PubNubTransportConfig
.decorate(params);
final URI address = config.getAddress();
PubNubTransport result = instances.get(address);
if (result == null) {
result = new PubNubTransport(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;
}
}
}