blob: 72d64c03729734827cf4f6e55a2e447b2c4b2cc8 [file] [log] [blame] [raw]
package protocolsupport.protocol.storage;
import java.net.SocketAddress;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import org.apache.commons.lang3.Validate;
import protocolsupport.protocol.ConnectionImpl;
public class ProtocolStorage {
private static final Map<SocketAddress, Data> primaryStorage = new ConcurrentHashMap<>(1000);
private static final Map<SocketAddress, ConnectionImpl> secondaryStorage = new ConcurrentHashMap<>(2000);
public static final void addConnection(SocketAddress address, ConnectionImpl connection) {
Validate.notNull(address, "Primary address cant be null");
primaryStorage.put(address, new Data(connection));
secondaryStorage.put(address, connection);
}
public static final void addAddress(SocketAddress primary, SocketAddress additional) {
Validate.notNull(primary, "Primary address cant be null");
Validate.notNull(primary, "Additional address cant be null");
Data dataentry = primaryStorage.get(primary);
if (dataentry != null) {
dataentry.addresses.add(additional);
secondaryStorage.put(additional, dataentry.connection);
}
}
public static ConnectionImpl getConnection(SocketAddress address) {
return address != null ? secondaryStorage.get(address) : null;
}
public static void removeConnection(SocketAddress address) {
Validate.notNull(address, "Primary address cant be null");
Data dataentry = primaryStorage.remove(address);
if (dataentry != null) {
for (SocketAddress aaddr : dataentry.addresses) {
secondaryStorage.remove(aaddr, dataentry.connection);
}
secondaryStorage.remove(address, dataentry.connection);
}
}
public static Collection<ConnectionImpl> getConnections() {
return primaryStorage.values().stream().map(data -> data.connection).collect(Collectors.toList());
}
protected static class Data {
protected final ConnectionImpl connection;
protected final Set<SocketAddress> addresses = Collections.newSetFromMap(new ConcurrentHashMap<>());
public Data(ConnectionImpl connection) {
this.connection = connection;
}
}
}