package ddth.dasp.handlersocket.hsc;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public abstract class AbstractHscFactory implements IHscFactory {
private Map<String, IHsc> handlersocketConnections = new HashMap<String, IHsc>();
/**
* {@inheritDoc}
*/
@Override
public void init() {
}
/**
* {@inheritDoc}
*/
@Override
public void destroy() {
synchronized (handlersocketConnections) {
IHsc[] conns = handlersocketConnections.values().toArray(
new IHsc[0]);
for (IHsc conn : conns) {
releaseConnection(conn);
}
}
}
/**
* {@inheritDoc}
*/
@Override
public IHsc getConnection(String server, int port) {
return getConnection(server, port, true);
}
protected String calcHash(String server, int port, boolean readWrite) {
HashCodeBuilder hcb = new HashCodeBuilder(19, 81);
long hashCode = hcb.append(server).append(port).append(readWrite)
.hashCode();
return String.valueOf(hashCode);
}
/**
* {@inheritDoc}
*/
@Override
public IHsc getConnection(String server, int port, boolean readWrite) {
String hash = calcHash(server, port, readWrite);
synchronized (handlersocketConnections) {
IHsc conn = handlersocketConnections.get(hash);
if (conn == null) {
conn = buildConnection(hash, server, port, readWrite);
}
handlersocketConnections.put(hash, conn);
return conn;
}
}
/**
* Establishes a HandlerSocket connection.
*
* @param connName
* @param server
* @param port
* @param readWrite
* @return
*/
protected abstract IHsc buildConnection(String connName, String server,
int port, boolean readWrite);
/**
* {@inheritDoc}
*/
@Override
public boolean releaseConnection(IHsc conn) {
String connName = conn.getName();
synchronized (handlersocketConnections) {
conn = handlersocketConnections.remove(connName);
if (conn != null) {
conn.destroy();
return true;
}
}
return false;
}
}