package com.workshare.msnos.core.protocols.ip; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import com.workshare.msnos.core.Agent; import com.workshare.msnos.core.MsnosException; import com.workshare.msnos.core.MsnosException.Code; import com.workshare.msnos.soup.json.Json; public class BaseEndpoint implements Endpoint { private final Type type; private final Network network; private final short port; public BaseEndpoint(Type type, Network host) { this(type, host, type.defaultPort()); } public BaseEndpoint(Type type, Network host, short port) { if (type == null || host == null) throw new IllegalArgumentException("No argument can be null here"); this.type = type; this.network = host; this.port = port; } @Override public Type getType() { return type; } @Override public Network getNetwork() { return network; } @Override public short getPort() { return port; } @Override public String toString() { return Json.toJsonString(this); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + network.hashCode(); result = prime * result + port; result = prime * result + type.hashCode(); return result; } @Override public boolean equals(Object obj) { try { BaseEndpoint other = (BaseEndpoint) obj; return network.equals(other.network) && type == other.type && port == other.port; } catch (Exception ignore) { return false; } } public static final Endpoints create(final BaseEndpoint... points) { return create(new HashSet<BaseEndpoint>(Arrays.asList(points))); } public static final Endpoints create(final Set<BaseEndpoint> endpoints) { return new Endpoints() { @Override public BaseEndpoint install(Endpoint endpoint) throws MsnosException { throw new MsnosException("Cannot install an endpoint, here we are immutable :)", Code.INVALID_STATE); } @Override public BaseEndpoint remove(Endpoint endpoint) throws MsnosException { throw new MsnosException("Cannot install an endpoint, here we are immutable :)", Code.INVALID_STATE); } @Override public Set<? extends Endpoint> all() { return endpoints; } @Override public Set<? extends Endpoint> of(Agent agent) { return endpoints; } @Override public Set<? extends Endpoint> publics() { return endpoints; } }; } }