package cloudone.cumulonimbus.model; import cloudone.ServiceFullName; import cloudone.internal.dto.ApplicationCluster; import cloudone.internal.dto.PortInfo; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; /** * Represents cluster - several instancef of the same service. * * @author Martin Mares (martin.mares at oracle.com) */ public class Cluster { private ServiceFullName fullName; private List<RegisteredRuntime> runtimes = new ArrayList<>(1); private volatile transient int counter = -1; public Cluster(ServiceFullName fullName) { this.fullName = fullName; } private synchronized int getNextId() { if (counter < 0) { for (RegisteredRuntime runtime : runtimes) { if (runtime.getInstanceId() > counter) { counter = runtime.getInstanceId(); } } } return ++counter; } public synchronized RegisteredRuntime register(int adminPort, Map<String, Integer> applicationPorts) { RegisteredRuntime result = new RegisteredRuntime(fullName, UUID.randomUUID().toString(), getNextId(), adminPort, applicationPorts); result.touch(); runtimes.add(result); return result; } public synchronized boolean unRegister(RegisteredRuntime runtime) { if (runtime == null) { return false; } for (int i = 0; i < runtimes.size(); i++) { RegisteredRuntime rr = runtimes.get(i); if (runtime.getInstanceSecCode().equals(rr.getInstanceSecCode()) && runtime.getInstanceId() == rr.getInstanceId()) { runtimes.remove(i); return true; } } return false; } public synchronized RegisteredRuntime getRuntime(int instamceId) { for (RegisteredRuntime runtime : runtimes) { if (instamceId == runtime.getInstanceId()) { return runtime; } } return null; } public ServiceFullName getFullName() { return fullName; } public synchronized List<RegisteredRuntime> getRuntimes() { return Collections.unmodifiableList(runtimes); } public String toString() { return "Cluster{" + fullName + " - " + runtimes.size() + "}"; } public ApplicationCluster toApplicationCluster(String applicationName) { ApplicationCluster result = new ApplicationCluster(fullName, applicationName); for (RegisteredRuntime runtime : runtimes) { result.addPort(runtime.getApplicationPort(applicationName)); } return result; } public Map<Integer, PortInfo> toPortInfos() { Map<Integer, PortInfo> result = new HashMap<>(); for (RegisteredRuntime runtime : runtimes) { result.put(runtime.getInstanceId(), new PortInfo(runtime.getAdminPort(), runtime.getApplicationPorts())); } return result; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Cluster)) return false; Cluster cluster = (Cluster) o; return !(fullName != null ? !fullName.equals(cluster.fullName) : cluster.fullName != null); } @Override public int hashCode() { return fullName != null ? fullName.hashCode() : 0; } }