package cgl.iotcloud.core.sensorsite;
import cgl.iotcloud.core.Configuration;
import cgl.iotcloud.core.SensorContext;
import cgl.iotcloud.core.api.thrift.*;
import cgl.iotcloud.core.master.thrift.TMasterService;
import cgl.iotcloud.core.transport.*;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import java.util.List;
import java.util.Map;
public class MasterClient {
private TMasterService.Client client;
private TTransport transport;
private SiteContext siteContext;
public MasterClient(SiteContext context) throws TTransportException {
String host = context.getMasterHost();
int port = context.getMasterPort();
this.siteContext = context;
TSocket socket = new TSocket(host, port);
transport = new TFramedTransport(socket);
TProtocol protocol = new TBinaryProtocol(transport);
this.client = new TMasterService.Client(protocol);
transport.open();
}
public boolean registerSite(String siteId, String siteHost, int sitePort) throws TException {
TResponse response = client.registerSite(new TSite(siteId, sitePort, siteHost));
return response.getState() == TResponseState.SUCCESS;
}
public boolean unRegisterSite() throws TException {
String siteHost = Configuration.getSensorSiteHost(siteContext.getConf());
int siteServerPort = Configuration.getSensorSitePort(siteContext.getConf());
TResponse response = client.unRegisterSite(new TSite(siteContext.getSiteId(), siteServerPort, siteHost));
return response.getState() == TResponseState.SUCCESS;
}
public void registerSensor(String siteId, SensorInstance sensor) throws TException {
SensorContext context = sensor.getSensorContext();
TSensor tSensor = createTSensor(context);
tSensor.setState(TSensorState.DEPLOY);
client.updateSensor(siteId, tSensor);
}
private TSensor createTSensor(SensorContext context) {
String tSensorId = context.getName();
TSensor tSensor = new TSensor();
tSensor.setName(tSensorId);
tSensor.setSensorId(context.getSensorID());
for (Map.Entry<String, List<Channel>> e: context.getChannels().entrySet()) {
List<Channel> channels = e.getValue();
String transport = e.getKey();
for (Channel c : channels) {
TChannel tChannel;
if (c.getDirection() == Direction.IN) {
// todo
tChannel = new TChannel(transport, TDirection.IN);
} else {
tChannel = new TChannel(transport, TDirection.OUT);
}
for (Object key : c.getProperties().keySet()) {
tChannel.putToProperties(key.toString(), c.getProperties().get(key).toString());
}
tChannel.setName(c.getName());
// figure out the broker for this channel
Transport t = siteContext.getTransport(e.getKey());
if (t instanceof AbstractTransport) {
ChannelGroup group = ((AbstractTransport) t).getChannelGroup(new ChannelName(context.getName(), c.getName()), c);
BrokerHost host = group.getHostForChannel(c);
if (host != null) {
tChannel.setBrokerUrl(host.getUrl());
}
}
tChannel.setSensorId(c.getSensorID());
tChannel.setGrouped(c.isGrouped());
tChannel.setSensor(context.getName());
tChannel.setSite(siteContext.getSiteId());
tSensor.addToChannels(tChannel);
}
}
return tSensor;
}
public void unRegisterSensor(String siteId, SensorInstance sensor) throws TException {
SensorContext context = sensor.getSensorContext();
TSensor tSensor = createTSensor(context);
tSensor.setState(TSensorState.UN_DEPLOY);
client.updateSensor(siteId, tSensor);
}
public void updateSensor(String siteId, SensorInstance sensor, SensorState state) throws TException {
SensorContext context = sensor.getSensorContext();
TSensor tSensor = createTSensor(context);
if (state == SensorState.ACTIVATE) {
tSensor.setState(TSensorState.ACTIVE);
} else if (state == SensorState.DEACTIVATE) {
tSensor.setState(TSensorState.DE_ACTIVATE);
} else if (state == SensorState.UN_DEPLOY) {
tSensor.setState(TSensorState.UN_DEPLOY);
} else if (state == SensorState.DEPLOY) {
tSensor.setState(TSensorState.DEPLOY);
} else if (state == SensorState.UPDATE) {
tSensor.setState(TSensorState.UPDATE);
}
client.updateSensor(siteId, tSensor);
}
public void close() {
transport.close();
}
}