package org.arquillian.cube.docker.impl.client.config; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class PortBinding { private String host; private int bound; private ExposedPort exposed; public PortBinding(String host, int bound, ExposedPort exposed) { super(); this.host = host; this.bound = bound; this.exposed = exposed; } public static PortBinding valueOf(String portBinding) { ExposedPort exposed; int bound; String host = null; String[] elements = portBinding.split("->"); if (elements.length == 1) { // exposed port is only set and same port will be used as port binding. int positionOfProtocolSeparator = elements[0].indexOf("/"); String bindingPortValue = elements[0]; if (positionOfProtocolSeparator > -1) { //means that the protocol part is also set. bindingPortValue = elements[0].substring(0, positionOfProtocolSeparator); } exposed = ExposedPort.valueOf(elements[0]); bound = exposed.getExposed(); if (bindingPortValue.indexOf(":") != -1) { host = bindingPortValue.substring(0, bindingPortValue.lastIndexOf(":")); } } else if (elements.length == 2) { exposed = ExposedPort.valueOf(elements[1]); if (elements[0].indexOf(":") != -1) { host = elements[0].substring(0, elements[0].lastIndexOf(":")); bound = Integer.parseInt(elements[0].substring(elements[0].lastIndexOf(":") + 1, elements[0].length())); } else { bound = Integer.parseInt(elements[0]); } } else { throw new IllegalArgumentException("Could not create PortBinding from " + portBinding); } return new PortBinding(host, bound, exposed); } public static Collection<PortBinding> valuesOf(Collection<String> bindings) { if (bindings == null) { return null; } List<PortBinding> result = new ArrayList<PortBinding>(); for (String binding : bindings) { result.add(valueOf(binding)); } return result; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getBound() { return bound; } public void setBound(int bound) { this.bound = bound; } public ExposedPort getExposedPort() { return exposed; } public void setExposedPort(ExposedPort exposed) { this.exposed = exposed; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + bound; result = prime * result + ((exposed == null) ? 0 : exposed.hashCode()); result = prime * result + ((host == null) ? 0 : host.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } PortBinding other = (PortBinding) obj; if (bound != other.bound) { return false; } if (exposed == null) { if (other.exposed != null) { return false; } } else if (!exposed.equals(other.exposed)) { return false; } if (host == null) { if (other.host != null) { return false; } } else if (!host.equals(other.host)) { return false; } return true; } @Override public String toString() { StringBuilder sb = new StringBuilder(); if (host != null) { sb.append(host).append(":"); } if (exposed.getExposed() != bound) { sb.append(bound).append("->"); } sb.append(exposed.getExposed()).append("/").append(exposed.getType()); return sb.toString(); } }