package org.mobicents.tools.sip.balancer; import java.io.Serializable; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import org.mobicents.tools.heartbeat.api.Node; public class KeySip { private String ip; private boolean isIpv6 = false; private ArrayList <Integer> ports = new ArrayList<Integer>(); private String [] transports = {"udp","tcp","tls","ws","wss", "http", "ssl"}; public KeySip (Node node,Boolean isIpv6) { ipToCommonForm(node.getIp()); this.isIpv6 = isIpv6; for(String transport:transports) { Serializable currentPort = node.getProperties().get(transport + "Port"); if(currentPort!=null) if(currentPort instanceof String) ports.add(Integer.parseInt((String) currentPort)); else ports.add((Integer)currentPort); } } public KeySip (String ip, Integer port,Boolean isIpv6) { ipToCommonForm(ip); this.isIpv6 = isIpv6; this.ports.add(port); } public String getIp() { return ip; } public ArrayList<Integer> getPorts() { return ports; } @Override public int hashCode() { if(!isIpv6) { if(ip==null) return 0; return ip.hashCode(); } else { int hashCode = 0; try { hashCode = Inet6Address.getByName(ip).hashCode(); } catch (UnknownHostException e) { e.printStackTrace(); } return hashCode; } } @Override public boolean equals(Object obj) { if (obj instanceof KeySip) { if(!isIpv6) { if(ip==null) return false; if (ip.equals(((KeySip) obj).getIp())) { if(((KeySip) obj).getPorts().equals(ports)) return true; for (Integer port : ports) { if (((KeySip) obj).getPorts().get(0).equals(port)) { return true; } } for (Integer objPort : ((KeySip) obj).getPorts()) { if (ports.get(0).equals(objPort)) return true; } } else { return false; } } else { try { InetAddress currAddress=Inet6Address.getByName(ip); InetAddress otherAddress=Inet6Address.getByName(((KeySip) obj).getIp()); if(currAddress==null) return false; else { if (currAddress.equals(otherAddress)) { if(((KeySip) obj).getPorts().equals(ports)) return true; for (Integer port : ports) { if (((KeySip) obj).getPorts().get(0).equals(port)) return true; } for (Integer objPort : ((KeySip) obj).getPorts()) { if (ports.get(0).equals(objPort)) return true; } } else { return false; } } } catch (UnknownHostException e) { e.printStackTrace(); } } return false; } else { return false; } } private void ipToCommonForm(String notCommonIp) { try { InetAddress address=null; if(!isIpv6) address=Inet4Address.getByName(notCommonIp); else address=Inet6Address.getByName(notCommonIp); if(address==null) this.ip=null; else this.ip = address.getHostAddress(); } catch (UnknownHostException e) { this.ip = null; } } public String toString() { return ip +":" + ports; } }