diff options
6 files changed, 47 insertions, 36 deletions
diff --git a/component/abi-spec.json b/component/abi-spec.json index cd42b8ff95a..5665075f1f2 100644 --- a/component/abi-spec.json +++ b/component/abi-spec.json @@ -129,6 +129,7 @@ "public int getMicro()", "public java.lang.String getQualifier()", "public java.lang.String toString()", + "public com.yahoo.text.Utf8Array toUtf8()", "public int hashCode()", "public boolean isEmpty()", "public boolean equals(java.lang.Object)", diff --git a/component/src/main/java/com/yahoo/component/Version.java b/component/src/main/java/com/yahoo/component/Version.java index 51ff6ad5dbd..d611e1a6271 100644 --- a/component/src/main/java/com/yahoo/component/Version.java +++ b/component/src/main/java/com/yahoo/component/Version.java @@ -3,6 +3,7 @@ package com.yahoo.component; import com.yahoo.text.Utf8; import com.yahoo.text.Utf8Array; +import com.yahoo.text.Utf8String; import java.nio.ByteBuffer; @@ -28,18 +29,18 @@ import java.nio.ByteBuffer; */ public final class Version implements Comparable<Version> { - private int major = 0; - private int minor = 0; - private int micro = 0; - private String qualifier = ""; - private String stringValue; + private final int major; + private final int minor; + private final int micro; + private final String qualifier; + private final Utf8Array utf8; /** The empty version */ public static final Version emptyVersion = new Version(); /** Creates an empty version */ public Version() { - this(0, 0, 0, null); + this(0, 0, 0, ""); } /** @@ -50,7 +51,7 @@ public final class Version implements Comparable<Version> { * negative. */ public Version(int major) { - this(major, 0, 0, null); + this(major, 0, 0, ""); } /** @@ -62,7 +63,7 @@ public final class Version implements Comparable<Version> { * negative. */ public Version(int major, int minor) { - this(major, minor, 0, null); + this(major, minor, 0, ""); } /** @@ -75,7 +76,7 @@ public final class Version implements Comparable<Version> { * negative. */ public Version(int major, int minor, int micro) { - this(major, minor, micro, null); + this(major, minor, micro, ""); } /** @@ -93,8 +94,8 @@ public final class Version implements Comparable<Version> { this.major = major; this.minor = minor; this.micro = micro; - if (qualifier != null) this.qualifier = qualifier; - stringValue = toStringValue(); + this.qualifier = (qualifier != null) ? qualifier : ""; + utf8 = new Utf8String(toString()); verify(); } @@ -120,19 +121,19 @@ public final class Version implements Comparable<Version> { public Version(String versionString) { if (! "".equals(versionString)) { String[] components=versionString.split("\\."); // Split on dot - - if (components.length > 0) - major = Integer.parseInt(components[0]); - if (components.length > 1) - minor = Integer.parseInt(components[1]); - if (components.length > 2) - micro = Integer.parseInt(components[2]); - if (components.length > 3) - qualifier = components[3]; + major = (components.length > 0) ? Integer.parseInt(components[0]) : 0; + minor = (components.length > 1) ? Integer.parseInt(components[1]) : 0; + micro = (components.length > 2) ? Integer.parseInt(components[2]) : 0; + qualifier = (components.length > 3) ? components[3] : ""; if (components.length > 4) throw new IllegalArgumentException("Too many components in '" + versionString + "'"); + } else { + major = 0; + minor = 0; + micro = 0; + qualifier = ""; } - stringValue = toStringValue(); + utf8 = new Utf8String(versionString); verify(); } @@ -178,16 +179,21 @@ public final class Version implements Comparable<Version> { minor = readInt(bb); if (bb.remaining() > 0) { micro = readInt(bb); - if (bb.remaining() > 0) { - qualifier = Utf8.toString(bb); - } + qualifier = (bb.remaining() > 0) ? Utf8.toString(bb) : ""; + } else { + micro = 0; + qualifier = ""; } + } else { + minor = 0; + micro = 0; + qualifier = ""; } } else { throw new IllegalArgumentException("Empty version specification"); } + utf8 = versionString; - stringValue = versionString.toString(); verify(); } @@ -270,10 +276,14 @@ public final class Version implements Comparable<Version> { * The string representation of a Version specified here is a part of the API and will never change. */ @Override - public String toString() { return stringValue; } + public String toString() { return toStringValue(); } + + public Utf8Array toUtf8() { + return utf8; + } @Override - public int hashCode() { return stringValue.hashCode(); } + public int hashCode() { return major*3 + minor*5 + micro*7 + qualifier.hashCode()*11; } /** Returns whether this equals the empty version */ public boolean isEmpty() { return this.equals(emptyVersion); } diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCNetwork.java b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCNetwork.java index adf889a7b6f..0fd52e9bdbc 100644 --- a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCNetwork.java +++ b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCNetwork.java @@ -473,7 +473,7 @@ public class RPCNetwork implements Network, MethodHandler { synchronized (this) { if (version == null) { hasError = true; - } else if (version.compareTo(this.version) < 0) { + } else if (version.isBefore(this.version)) { this.version = version; } if (--pending == 0) { diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV1.java b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV1.java index 952bcdcfe04..ccded0e8d1b 100755 --- a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV1.java +++ b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV1.java @@ -64,7 +64,7 @@ public class RPCSendV1 extends RPCSend { long timeRemaining, byte[] payload, int traceLevel) { Request req = new Request(METHOD_NAME); Values v = req.parameters(); - v.add(new StringValue(version.toString())); + v.add(new StringValue(version.toUtf8())); v.add(new StringValue(route.toString())); v.add(new StringValue(address.getSessionName())); v.add(new Int8Value(msg.getRetryEnabled() ? (byte)1 : (byte)0)); @@ -140,7 +140,7 @@ public class RPCSendV1 extends RPCSend { eMessages[i] = error.getMessage(); eServices[i] = error.getService() != null ? error.getService() : ""; } - ret.add(new StringValue(version.toString())); + ret.add(new StringValue(version.toUtf8())); ret.add(new DoubleValue(reply.getRetryDelay())); ret.add(new Int32Array(eCodes)); ret.add(new StringArray(eMessages)); diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV2.java b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV2.java index 09f7bbb15de..bb243651447 100644 --- a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV2.java +++ b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV2.java @@ -21,7 +21,6 @@ import com.yahoo.slime.BinaryFormat; import com.yahoo.slime.Cursor; import com.yahoo.slime.Inspector; import com.yahoo.slime.Slime; -import com.yahoo.text.Utf8; import com.yahoo.text.Utf8Array; /** @@ -88,7 +87,7 @@ public class RPCSendV2 extends RPCSend { Slime slime = new Slime(); Cursor root = slime.setObject(); - root.setString(VERSION_F, version.toString()); + root.setString(VERSION_F, version.toUtf8().getBytes()); root.setString(ROUTE_F, route.toString()); root.setString(SESSION_F, address.getSessionName()); root.setString(PROTOCOL_F, msg.getProtocol().toString()); @@ -162,7 +161,7 @@ public class RPCSendV2 extends RPCSend { p.retryEnabled = root.field(USERETRY_F).asBool(); p.retry = (int)root.field(RETRY_F).asLong(); p.timeRemaining = root.field(TIMEREMAINING_F).asLong(); - p.protocolName = new Utf8Array(Utf8.toBytes(root.field(PROTOCOL_F).asString())); + p.protocolName = new Utf8Array(root.field(PROTOCOL_F).asUtf8()); p.payload = root.field(BLOB_F).asData(); p.traceLevel = (int)root.field(TRACELEVEL_F).asLong(); return p; @@ -177,9 +176,9 @@ public class RPCSendV2 extends RPCSend { Slime slime = new Slime(); Cursor root = slime.setObject(); - root.setString(VERSION_F, version.toString()); + root.setString(VERSION_F, version.toUtf8().getBytes()); root.setDouble(RETRYDELAY_F, reply.getRetryDelay()); - root.setString(PROTOCOL_F, reply.getProtocol().toString()); + root.setString(PROTOCOL_F, reply.getProtocol().getBytes()); root.setData(BLOB_F, payload); if (reply.getTrace().getLevel() > 0) { root.setString(TRACE_F, reply.getTrace().getRoot().encode()); diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTarget.java b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTarget.java index fe248c6b8df..53c0c855116 100755 --- a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTarget.java +++ b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTarget.java @@ -8,6 +8,7 @@ import com.yahoo.jrt.Spec; import com.yahoo.jrt.Supervisor; import com.yahoo.jrt.Target; import com.yahoo.log.LogLevel; +import com.yahoo.text.Utf8Array; import java.util.LinkedList; import java.util.List; @@ -133,7 +134,7 @@ public class RPCTarget implements RequestWaiter { synchronized (this) { targetInvoked = false; if (req.checkReturnTypes("s")) { - String str = req.returnValues().get(0).asString(); + Utf8Array str = req.returnValues().get(0).asUtf8Array(); try { version = new Version(str); if (shouldLog) { |