package uk.ac.imperial.lsds.seep.comm;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.imperial.lsds.seep.errors.InvalidEndPointException;
import uk.ac.imperial.lsds.seep.errors.SeepException;
import uk.ac.imperial.lsds.seep.infrastructure.SeepEndPoint;
import uk.ac.imperial.lsds.seep.infrastructure.SeepEndPointType;
import uk.ac.imperial.lsds.seep.util.Utils;
public class Connection {
final private static Logger LOG = LoggerFactory.getLogger(Connection.class);
private final SeepEndPoint ep;
private Socket socket;
public Connection(SeepEndPoint ep) {
boolean valid = ep.isValid();
if(!valid){
throw new InvalidEndPointException("No IP defined for the endPoint");
}
LOG.trace("Created connection Object with EndPoint: {}", ep.toString());
this.ep = ep;
}
public SeepEndPoint getAssociatedEndPoint() {
return ep;
}
public int getId() {
return ep.getId();
}
public Socket getSocket() {
return socket;
}
public Socket getOpenSocket() throws IOException {
if(socket == null || socket.isClosed()){
socket = new Socket(ep.getIp(), ep.getPort());
return socket;
}
else if(socket != null){
if(socket.isConnected()) {
return socket;
}
}
// TODO: reopen if closed
return null;
}
public InetSocketAddress getInetSocketAddress(SeepEndPointType type) {
if(type.ofType() != ep.getType()) {
// TODO: handle error this properly
throw new SeepException("Request wrong type of socket..... ##### FIX THIS");
}
return new InetSocketAddress(this.ep.getIp(), this.ep.getPort());
}
public void destroy() {
try {
this.socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("IP: "+ep.getIp().toString()+" port: "+ep.getPort());
sb.append(Utils.NL);
if(socket != null){
sb.append("ConnectionStatus: "+socket.toString());
}
else{
sb.append("ConnectionStatus: NULL");
}
return sb.toString();
}
}