diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-05-28 20:35:45 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-05-28 20:35:45 +0200 |
commit | 8203f3361a8c711fd83e077a50f2b2ad6edaa3e9 (patch) | |
tree | 46677683f670a3f27a6620e006bd142812307959 /jrt | |
parent | 566e6fece1717a03af4f03eeadb50abff3d13031 (diff) |
Keep the spec final.
Create the address when needed in the async connect thread.
Implement hash/equal/compareTo for Spec to avoid toString.
Use Spec as key and avoid creating it every time.
Diffstat (limited to 'jrt')
-rw-r--r-- | jrt/src/com/yahoo/jrt/Spec.java | 39 | ||||
-rw-r--r-- | jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java | 7 | ||||
-rw-r--r-- | jrt/tests/com/yahoo/jrt/SlobrokTest.java | 8 |
3 files changed, 40 insertions, 14 deletions
diff --git a/jrt/src/com/yahoo/jrt/Spec.java b/jrt/src/com/yahoo/jrt/Spec.java index 7e4f6d987fa..f4b70bd4f9e 100644 --- a/jrt/src/com/yahoo/jrt/Spec.java +++ b/jrt/src/com/yahoo/jrt/Spec.java @@ -3,15 +3,15 @@ package com.yahoo.jrt; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.util.Objects; /** * A Spec is a network address used for either listening or * connecting. */ -public class Spec { +public class Spec implements Comparable<Spec> { - private final SocketAddress address; private final String host; private final int port; private final boolean malformed; @@ -57,13 +57,11 @@ public class Spec { port = portNum; malformed = ! correct; host = correct ? hostStr : null; - address = correct ? createAddress(host, port) : null; asString = correct ? createString(host, port) : "MALFORMED"; } else { malformed = true; port = 0; host = null; - address = null; asString = "MALFORMED"; } } @@ -79,7 +77,6 @@ public class Spec { this.port = port; malformed = false; asString = createString(host, port); - address = createAddress(host, port); } /** @@ -130,7 +127,7 @@ public class Spec { * @return socket address */ SocketAddress address() { - return address; + return !malformed ? createAddress(host, port) : null; } /** @@ -143,4 +140,34 @@ public class Spec { return asString; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Spec spec = (Spec) o; + return port == spec.port && + malformed == spec.malformed && + Objects.equals(host, spec.host); + } + + @Override + public int hashCode() { + return Objects.hash(host, port, malformed); + } + + @Override + public int compareTo(Spec o) { + int cmp = 0; + if ((host != null) && (o.host != null)) { + cmp = host.compareTo(o.host); + } else if (host != null) { + return -1; + } else if (o.host != null) { + return 1; + } + return (cmp == 0) + ? Integer.compare(port, o.port) + : cmp; + + } } diff --git a/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java b/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java index 9ed8eafbd30..31d7543304a 100644 --- a/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java +++ b/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java @@ -315,12 +315,12 @@ public class Mirror implements IMirror { public static final class Entry implements Comparable<Entry> { private final String name; - private final String spec; + private final Spec spec; private final char [] nameArray; public Entry(String name, String spec) { this.name = name; - this.spec = spec; + this.spec = new Spec(spec); this.nameArray = name.toCharArray(); } @@ -343,7 +343,8 @@ public class Mirror implements IMirror { char [] getNameArray() { return nameArray; } public String getName() { return name; } - public String getSpec() { return spec; } + public Spec getSpec() { return spec; } + public String getSpecString() { return spec.toString(); } } diff --git a/jrt/tests/com/yahoo/jrt/SlobrokTest.java b/jrt/tests/com/yahoo/jrt/SlobrokTest.java index 20266b0826a..552780dd0fd 100644 --- a/jrt/tests/com/yahoo/jrt/SlobrokTest.java +++ b/jrt/tests/com/yahoo/jrt/SlobrokTest.java @@ -88,14 +88,14 @@ public class SlobrokTest { err(" { EMPTY }"); } for (Entry e : actual) { - err(" {" + e.getName() + ", " + e.getSpec() + "}"); + err(" {" + e.getName() + ", " + e.getSpecString() + "}"); } err("expected values:"); if (expect.isEmpty()) { err(" { EMPTY }"); } for (Entry e : expect) { - err(" {" + e.getName() + ", " + e.getSpec() + "}"); + err(" {" + e.getName() + ", " + e.getSpecString() + "}"); } } @@ -119,9 +119,7 @@ public class SlobrokTest { assertFalse(one.equals(null)); assertFalse(one.equals(register)); assertTrue(one.getName().equals(wantName)); - assertTrue(one.getSpec().equals(mySpec)); - int wantHC = mySpec.hashCode() + wantName.hashCode(); - assertTrue(one.hashCode() == wantHC); + assertTrue(one.getSpecString().equals(mySpec)); register.registerName("B/x"); check("B/x", new SpecList().add("B/x", mySpec)); |