package cgl.iotcloud.core.utils;
import cgl.iotcloud.core.api.thrift.TSite;
import cgl.iotcloud.core.master.MasterContext;
import cgl.iotcloud.core.master.SiteClient;
import org.apache.thrift.transport.TTransportException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
/**
* Acts as a factory for getting the clients that are required to talk to the sensor sites
*/
public class SiteClientCache {
private static Logger LOG = LoggerFactory.getLogger(SiteClientCache.class);
private Map<String, SiteClient> siteClients = new HashMap<String, SiteClient>();
private MasterContext context;
public SiteClientCache(MasterContext context) {
this.context = context;
}
public SiteClient getSiteClient(String siteId) throws Exception {
if (siteClients.containsKey(siteId)) {
return siteClients.get(siteId);
} else {
TSite descriptor = context.getSensorSite(siteId);
if (descriptor != null) {
try {
SiteClient client = new SiteClient(descriptor.getHost(), descriptor.getPort());
siteClients.put(siteId, client);
return client;
} catch (TTransportException e) {
LOG.warn("Failed to obtain a client for site {}", siteId);
throw new Exception("Failed to obtain client for site " + siteId);
}
}
}
return null;
}
public void markClientFailed(String siteId) {
SiteClient client = siteClients.get(siteId);
if (client != null) {
client.close();
}
siteClients.remove(siteId);
}
}