aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBogdan Drutu <bdrutu@google.com>2018-08-28 15:49:51 -0700
committerGitHub <noreply@github.com>2018-08-28 15:49:51 -0700
commitd2af3ddd9f8bd10d8dbdec0d1d2b238c7e9cd175 (patch)
treef51ac1738e8afeea48e2da5ceffdce8e25d9ad3c
parent658c63ad26317f1551338efb9fa95a944de0e55c (diff)
downloadopencensus-java-d2af3ddd9f8bd10d8dbdec0d1d2b238c7e9cd175.tar.gz
Remove guava dependency from the API artifact. (#1393)
* Remove guava dependency from the API artifact. * Make LowerCaseBase16Encoding static and remove import control.
-rw-r--r--api/build.gradle3
-rw-r--r--api/src/main/java/io/opencensus/trace/SpanId.java13
-rw-r--r--api/src/main/java/io/opencensus/trace/TraceId.java13
-rw-r--r--api/src/main/java/io/opencensus/trace/internal/LowerCaseBase16Encoding.java93
-rw-r--r--api/src/test/java/io/opencensus/trace/internal/LowerCaseBase16EncodingTest.java83
-rw-r--r--buildscripts/import-control.xml3
-rw-r--r--contrib/grpc_metrics/build.gradle3
-rw-r--r--exporters/stats/prometheus/build.gradle1
-rw-r--r--exporters/stats/signalfx/build.gradle3
-rw-r--r--exporters/stats/stackdriver/build.gradle3
-rw-r--r--exporters/trace/instana/build.gradle3
-rw-r--r--exporters/trace/jaeger/build.gradle3
-rw-r--r--exporters/trace/stackdriver/build.gradle3
-rw-r--r--exporters/trace/zipkin/build.gradle1
-rw-r--r--testing/build.gradle3
15 files changed, 201 insertions, 30 deletions
diff --git a/api/build.gradle b/api/build.gradle
index 6d527c06..e494ce08 100644
--- a/api/build.gradle
+++ b/api/build.gradle
@@ -1,8 +1,7 @@
description = 'OpenCensus API'
dependencies {
- compile libraries.grpc_context,
- libraries.guava
+ compile libraries.grpc_context
compileOnly libraries.auto_value
diff --git a/api/src/main/java/io/opencensus/trace/SpanId.java b/api/src/main/java/io/opencensus/trace/SpanId.java
index 06ff0458..44119d6b 100644
--- a/api/src/main/java/io/opencensus/trace/SpanId.java
+++ b/api/src/main/java/io/opencensus/trace/SpanId.java
@@ -16,8 +16,8 @@
package io.opencensus.trace;
-import com.google.common.io.BaseEncoding;
import io.opencensus.internal.Utils;
+import io.opencensus.trace.internal.LowerCaseBase16Encoding;
import java.util.Arrays;
import java.util.Random;
import javax.annotation.Nullable;
@@ -109,8 +109,7 @@ public final class SpanId implements Comparable<SpanId> {
public static SpanId fromLowerBase16(CharSequence src) {
Utils.checkArgument(
src.length() == HEX_SIZE, "Invalid size: expected %s, got %s", HEX_SIZE, src.length());
- byte[] bytes = BaseEncoding.base16().lowerCase().decode(src);
- return new SpanId(bytes);
+ return new SpanId(LowerCaseBase16Encoding.decodeToBytes(src));
}
/**
@@ -177,11 +176,7 @@ public final class SpanId implements Comparable<SpanId> {
* @since 0.11
*/
public String toLowerBase16() {
- return toLowerBase16(bytes);
- }
-
- private static String toLowerBase16(byte[] bytes) {
- return BaseEncoding.base16().lowerCase().encode(bytes);
+ return LowerCaseBase16Encoding.encodeToString(bytes);
}
@Override
@@ -205,7 +200,7 @@ public final class SpanId implements Comparable<SpanId> {
@Override
public String toString() {
- return "SpanId{spanId=" + toLowerBase16(bytes) + "}";
+ return "SpanId{spanId=" + toLowerBase16() + "}";
}
@Override
diff --git a/api/src/main/java/io/opencensus/trace/TraceId.java b/api/src/main/java/io/opencensus/trace/TraceId.java
index c7aa48f0..983b21c3 100644
--- a/api/src/main/java/io/opencensus/trace/TraceId.java
+++ b/api/src/main/java/io/opencensus/trace/TraceId.java
@@ -16,9 +16,9 @@
package io.opencensus.trace;
-import com.google.common.io.BaseEncoding;
import io.opencensus.common.Internal;
import io.opencensus.internal.Utils;
+import io.opencensus.trace.internal.LowerCaseBase16Encoding;
import java.util.Arrays;
import java.util.Random;
import javax.annotation.Nullable;
@@ -110,8 +110,7 @@ public final class TraceId implements Comparable<TraceId> {
public static TraceId fromLowerBase16(CharSequence src) {
Utils.checkArgument(
src.length() == HEX_SIZE, "Invalid size: expected %s, got %s", HEX_SIZE, src.length());
- byte[] bytes = BaseEncoding.base16().lowerCase().decode(src);
- return new TraceId(bytes);
+ return new TraceId(LowerCaseBase16Encoding.decodeToBytes(src));
}
/**
@@ -178,11 +177,7 @@ public final class TraceId implements Comparable<TraceId> {
* @since 0.11
*/
public String toLowerBase16() {
- return toLowerBase16(bytes);
- }
-
- private static String toLowerBase16(byte[] bytes) {
- return BaseEncoding.base16().lowerCase().encode(bytes);
+ return LowerCaseBase16Encoding.encodeToString(bytes);
}
/**
@@ -227,7 +222,7 @@ public final class TraceId implements Comparable<TraceId> {
@Override
public String toString() {
- return "TraceId{traceId=" + toLowerBase16(bytes) + "}";
+ return "TraceId{traceId=" + toLowerBase16() + "}";
}
@Override
diff --git a/api/src/main/java/io/opencensus/trace/internal/LowerCaseBase16Encoding.java b/api/src/main/java/io/opencensus/trace/internal/LowerCaseBase16Encoding.java
new file mode 100644
index 00000000..d9b2cf09
--- /dev/null
+++ b/api/src/main/java/io/opencensus/trace/internal/LowerCaseBase16Encoding.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2018, OpenCensus Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.opencensus.trace.internal;
+
+import io.opencensus.common.Internal;
+import io.opencensus.internal.Utils;
+import java.util.Arrays;
+
+/** Internal copy of the Guava implementation of the {@code BaseEncoding.base16().lowerCase()}. */
+@Internal
+public final class LowerCaseBase16Encoding {
+ private static final String ALPHABET = "0123456789abcdef";
+ private static final int ASCII_CHARACTERS = 128;
+ private static final char[] ENCODING = buildEncodingArray();
+ private static final byte[] DECODING = buildDecodingArray();
+
+ private static char[] buildEncodingArray() {
+ char[] encoding = new char[512];
+ for (int i = 0; i < 256; ++i) {
+ encoding[i] = ALPHABET.charAt(i >>> 4);
+ encoding[i | 0x100] = ALPHABET.charAt(i & 0xF);
+ }
+ return encoding;
+ }
+
+ private static byte[] buildDecodingArray() {
+ byte[] decoding = new byte[ASCII_CHARACTERS];
+ Arrays.fill(decoding, (byte) -1);
+ for (int i = 0; i < ALPHABET.length(); i++) {
+ char c = ALPHABET.charAt(i);
+ decoding[c] = (byte) i;
+ }
+ return decoding;
+ }
+
+ /**
+ * Encodes the specified byte array, and returns the encoded {@code String}.
+ *
+ * @param bytes byte array to be encoded.
+ * @return the encoded {@code String}.
+ */
+ public static String encodeToString(byte[] bytes) {
+ StringBuilder stringBuilder = new StringBuilder(bytes.length * 2);
+ for (byte byteVal : bytes) {
+ int b = byteVal & 0xFF;
+ stringBuilder.append(ENCODING[b]);
+ stringBuilder.append(ENCODING[b | 0x100]);
+ }
+ return stringBuilder.toString();
+ }
+
+ /**
+ * Decodes the specified character sequence, and returns the resulting {@code byte[]}.
+ *
+ * @param chars the character sequence to be decoded.
+ * @return the resulting {@code byte[]}
+ * @throws IllegalArgumentException if the input is not a valid encoded string according to this
+ * encoding.
+ */
+ public static byte[] decodeToBytes(CharSequence chars) {
+ Utils.checkArgument(chars.length() % 2 == 0, "Invalid input length " + chars.length());
+ int bytesWritten = 0;
+ byte[] bytes = new byte[chars.length() / 2];
+ for (int i = 0; i < chars.length(); i += 2) {
+ bytes[bytesWritten++] = decodeByte(chars.charAt(i), chars.charAt(i + 1));
+ }
+ return bytes;
+ }
+
+ private static byte decodeByte(char hi, char lo) {
+ Utils.checkArgument(lo < ASCII_CHARACTERS && DECODING[lo] != -1, "Invalid character " + lo);
+ Utils.checkArgument(hi < ASCII_CHARACTERS && DECODING[hi] != -1, "Invalid character " + hi);
+ int decoded = DECODING[hi] << 4 | DECODING[lo];
+ return (byte) decoded;
+ }
+
+ // Private constructor to disallow instances.
+ private LowerCaseBase16Encoding() {}
+}
diff --git a/api/src/test/java/io/opencensus/trace/internal/LowerCaseBase16EncodingTest.java b/api/src/test/java/io/opencensus/trace/internal/LowerCaseBase16EncodingTest.java
new file mode 100644
index 00000000..bcc51ab6
--- /dev/null
+++ b/api/src/test/java/io/opencensus/trace/internal/LowerCaseBase16EncodingTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2018, OpenCensus Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.opencensus.trace.internal;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import java.nio.charset.Charset;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Unit tests for {@link LowerCaseBase16Encoding}. */
+@RunWith(JUnit4.class)
+public class LowerCaseBase16EncodingTest {
+ private static final Charset CHARSET = Charset.forName("UTF-8");
+
+ @Rule public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void valid_EncodeDecode() {
+ testEncoding("", "");
+ testEncoding("f", "66");
+ testEncoding("fo", "666f");
+ testEncoding("foo", "666f6f");
+ testEncoding("foob", "666f6f62");
+ testEncoding("fooba", "666f6f6261");
+ testEncoding("foobar", "666f6f626172");
+ }
+
+ @Test
+ public void invalidDecodings_UnrecongnizedCharacters() {
+ // These contain bytes not in the decoding.
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("Invalid character g");
+ LowerCaseBase16Encoding.decodeToBytes("efhg");
+ }
+
+ @Test
+ public void invalidDecodings_InvalidInputLength() {
+ // Valid base16 strings always have an even length.
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("Invalid input length 3");
+ LowerCaseBase16Encoding.decodeToBytes("abc");
+ }
+
+ @Test
+ public void invalidDecodings_InvalidInputLengthAndCharacter() {
+ // These have a combination of invalid length and unrecognized characters.
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("Invalid input length 1");
+ LowerCaseBase16Encoding.decodeToBytes("?");
+ }
+
+ private static void testEncoding(String decoded, String encoded) {
+ testEncodes(decoded, encoded);
+ testDecodes(encoded, decoded);
+ }
+
+ private static void testEncodes(String decoded, String encoded) {
+ assertThat(LowerCaseBase16Encoding.encodeToString(decoded.getBytes(CHARSET)))
+ .isEqualTo(encoded);
+ }
+
+ private static void testDecodes(String encoded, String decoded) {
+ assertThat(LowerCaseBase16Encoding.decodeToBytes(encoded)).isEqualTo(decoded.getBytes(CHARSET));
+ }
+}
diff --git a/buildscripts/import-control.xml b/buildscripts/import-control.xml
index 7375eb5f..d0000c57 100644
--- a/buildscripts/import-control.xml
+++ b/buildscripts/import-control.xml
@@ -54,9 +54,6 @@ General guidelines on imports:
<allow pkg="io.opencensus.internal"/>
<allow pkg="io.opencensus.trace"/>
- <!-- TODO(#1081): Remove this dependency on Guava. -->
- <allow class="com.google.common.io.BaseEncoding"/>
-
<!-- These dependencies on impl/implcore are only needed by -->
<!-- io.opencensus.trace.TraceComponentImpl and io.opencensus.trace.TraceComponentImplLite, -->
<!-- which are deprecated. -->
diff --git a/contrib/grpc_metrics/build.gradle b/contrib/grpc_metrics/build.gradle
index db698199..a2de78d0 100644
--- a/contrib/grpc_metrics/build.gradle
+++ b/contrib/grpc_metrics/build.gradle
@@ -8,7 +8,8 @@ apply plugin: 'java'
}
dependencies {
- compile project(':opencensus-api')
+ compile project(':opencensus-api'),
+ libraries.guava
signature "org.codehaus.mojo.signature:java17:1.0@signature"
signature "net.sf.androidscents.signature:android-api-level-14:4.0_r4@signature"
diff --git a/exporters/stats/prometheus/build.gradle b/exporters/stats/prometheus/build.gradle
index 0fa0dec6..fe8563c4 100644
--- a/exporters/stats/prometheus/build.gradle
+++ b/exporters/stats/prometheus/build.gradle
@@ -9,6 +9,7 @@ dependencies {
compileOnly libraries.auto_value
compile project(':opencensus-api'),
+ libraries.guava,
libraries.prometheus_simpleclient
testCompile project(':opencensus-api')
diff --git a/exporters/stats/signalfx/build.gradle b/exporters/stats/signalfx/build.gradle
index 9dcb1ef7..d496b1e5 100644
--- a/exporters/stats/signalfx/build.gradle
+++ b/exporters/stats/signalfx/build.gradle
@@ -8,7 +8,8 @@ description = 'OpenCensus SignalFx Stats Exporter'
dependencies {
compileOnly libraries.auto_value
- compile project(':opencensus-api')
+ compile project(':opencensus-api'),
+ libraries.guava
compile (libraries.signalfx_java) {
// Prefer library version.
diff --git a/exporters/stats/stackdriver/build.gradle b/exporters/stats/stackdriver/build.gradle
index 72a03819..0bc302a6 100644
--- a/exporters/stats/stackdriver/build.gradle
+++ b/exporters/stats/stackdriver/build.gradle
@@ -10,7 +10,8 @@ dependencies {
compile project(':opencensus-api'),
project(':opencensus-contrib-monitored-resource-util'),
- libraries.google_auth
+ libraries.google_auth,
+ libraries.guava
compile (libraries.google_cloud_monitoring) {
// Prefer library version.
diff --git a/exporters/trace/instana/build.gradle b/exporters/trace/instana/build.gradle
index ca30e2d6..028bc208 100644
--- a/exporters/trace/instana/build.gradle
+++ b/exporters/trace/instana/build.gradle
@@ -6,7 +6,8 @@ description = 'OpenCensus Trace Instana Exporter'
}
dependencies {
- compile project(':opencensus-api')
+ compile project(':opencensus-api'),
+ libraries.guava
testCompile project(':opencensus-api')
diff --git a/exporters/trace/jaeger/build.gradle b/exporters/trace/jaeger/build.gradle
index 252950fa..04829aa4 100644
--- a/exporters/trace/jaeger/build.gradle
+++ b/exporters/trace/jaeger/build.gradle
@@ -17,7 +17,8 @@ sourceSets {
}
dependencies {
- compile project(':opencensus-api')
+ compile project(':opencensus-api'),
+ libraries.guava
compile(libraries.jaeger_reporter) {
// Prefer library version.
diff --git a/exporters/trace/stackdriver/build.gradle b/exporters/trace/stackdriver/build.gradle
index 8af1d96e..83dc970e 100644
--- a/exporters/trace/stackdriver/build.gradle
+++ b/exporters/trace/stackdriver/build.gradle
@@ -10,7 +10,8 @@ dependencies {
compile project(':opencensus-api'),
project(':opencensus-contrib-monitored-resource-util'),
- libraries.google_auth
+ libraries.google_auth,
+ libraries.guava
compile (libraries.google_cloud_trace) {
// Prefer library version.
diff --git a/exporters/trace/zipkin/build.gradle b/exporters/trace/zipkin/build.gradle
index f36e5615..530dff7d 100644
--- a/exporters/trace/zipkin/build.gradle
+++ b/exporters/trace/zipkin/build.gradle
@@ -7,6 +7,7 @@ description = 'OpenCensus Trace Zipkin Exporter'
dependencies {
compile project(':opencensus-api'),
+ libraries.guava,
libraries.zipkin_reporter,
libraries.zipkin_urlconnection
diff --git a/testing/build.gradle b/testing/build.gradle
index 33008e28..811b0597 100644
--- a/testing/build.gradle
+++ b/testing/build.gradle
@@ -1,7 +1,8 @@
description = 'OpenCensus Testing'
dependencies {
- compile project(':opencensus-api')
+ compile project(':opencensus-api'),
+ libraries.guava
testCompile project(':opencensus-api')