/* * Copyright: Almende B.V. (2014), Rotterdam, The Netherlands * License: The Apache Software License, Version 2.0 */ package com.almende.eve.transport; import java.io.IOException; import java.net.URI; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; import com.almende.eve.capabilities.AbstractCapabilityBuilder; import com.almende.eve.capabilities.handler.Handler; import com.almende.util.URIUtil; import com.almende.util.callback.AsyncCallback; import com.fasterxml.jackson.databind.node.ObjectNode; /** * The Class LocalTransportBuilder. */ public class LocalTransportBuilder extends AbstractCapabilityBuilder<Transport> { private static final Logger LOG = Logger.getLogger(LocalTransportBuilder.class .getName()); private static final Map<URI, LocalService> INSTANCES = new HashMap<URI, LocalService>( 10); @Override public Transport build() { final Handler<Receiver> newHandle = Transport.TYPEUTIL .inject(getHandle()); final LocalTransportConfig config = LocalTransportConfig .decorate(getParams()); final String id = config.getId(); if (id == null) { LOG.warning("Parameter 'id' is required!"); return null; } final String addr = "local:" + config.getId(); final URI address = URIUtil.create(addr); LocalService result = null; synchronized (INSTANCES) { result = getLocal(address); if (result == null) { result = new LocalService(address, newHandle, getParams()); INSTANCES.put(address, result); } else { result.getHandle().update(newHandle); } } return result; } /** * Gets the local. * * @param address * the address * @return the local */ public LocalService getLocal(final URI address) { return INSTANCES.get(address); } /** * The Class LocalService. */ class LocalService extends AbstractTransport implements TransportService { /** * Instantiates a new local transport. * * @param address * the address * @param handle * the handle * @param params * the params */ public LocalService(final URI address, final Handler<Receiver> handle, final ObjectNode params) { super(address, handle, null, params); setService(this); } private LocalService() { super(null, null, null, null); } /* * (non-Javadoc) * @see * com.almende.eve.transport.TransportService#getLocal(java.net.URI) */ @Override public LocalService getLocal(final URI address) { return INSTANCES.get(address); } /* * (non-Javadoc) * @see com.almende.eve.transport.Transport#send(java.net.URI, * java.lang.String, java.lang.String) */ @Override public <T> void send(final URI receiverUri, final String message, final String tag, final AsyncCallback<T> callback) throws IOException { if (!sendLocal(receiverUri, message)) { throw new IOException("No local agent found at:" + receiverUri.toASCIIString()); } } /* * (non-Javadoc) * @see com.almende.eve.transport.Transport#send(java.net.URI, byte[], * java.lang.String) */ @Override public <T> void send(final URI receiverUri, final byte[] message, final String tag, final AsyncCallback<T> callback) throws IOException { if (!sendLocal(receiverUri, message)) { throw new IOException("No local agent found at:" + receiverUri.toASCIIString()); } } /* * (non-Javadoc) * @see com.almende.eve.transport.Transport#send(java.net.URI, byte[], * java.lang.String) */ @Override public <T> void send(final URI receiverUri, final Object message, final String tag, final AsyncCallback<T> callback) throws IOException { if (!sendLocal(receiverUri, message)) { throw new IOException("No local agent found at:" + receiverUri.toASCIIString()); } } /* * (non-Javadoc) * @see com.almende.eve.transport.Transport#connect() */ /** * Connect. * * @throws IOException * Signals that an I/O exception has occurred. */ @Override public void connect() throws IOException {} /* * (non-Javadoc) * @see com.almende.eve.transport.Transport#disconnect() */ /** * Disconnect. */ @Override public void disconnect() {} /* * (non-Javadoc) * @see com.almende.eve.transport.Transport#getProtocols() */ /** * Gets the protocols. * * @return the protocols */ @Override public List<String> getProtocols() { return Arrays.asList("local"); } /* * (non-Javadoc) * @see * com.almende.eve.transport.TransportService#delete(com.almende.eve. * transport * .Transport) */ @Override public void delete(final Transport instance) { synchronized (INSTANCES) { INSTANCES.remove(instance.getAddress()); } } } }