diff --git a/azure-client-authentication/build.gradle b/azure-client-authentication/build.gradle index 2b40ada004e0e..65c1c86a20a36 100644 --- a/azure-client-authentication/build.gradle +++ b/azure-client-authentication/build.gradle @@ -14,9 +14,9 @@ version = '1.0.0-SNAPSHOT' checkstyle { toolVersion = "6.18" - configFile = new File("$rootDir/ClientRuntimes/Java/build-tools/src/main/resources/checkstyle.xml") - configProperties = [samedir: "$rootDir/ClientRuntimes/Java/build-tools/src/main/resources"] - reportsDir = new File("$rootDir/ClientRuntimes/Java/build-tools/reports") + configFile = new File("$rootDir/src/client/Java/build-tools/src/main/resources/checkstyle.xml") + configProperties = [samedir: "$rootDir/src/client/Java/build-tools/src/main/resources"] + reportsDir = new File("$rootDir/src/client/Java/build-tools/reports") } dependencies { @@ -92,7 +92,7 @@ artifacts { test { reports.getHtml() - reports.html.destination = file("${projectDir}/../../../TestResults/JavaAzureRuntime") + reports.html.destination = file("$rootDir/TestResults/JavaAzureRuntime") } tasks.compileJava.dependsOn 'clean' diff --git a/azure-client-runtime/build.gradle b/azure-client-runtime/build.gradle index 5c29359536abc..db64fd0b46abd 100644 --- a/azure-client-runtime/build.gradle +++ b/azure-client-runtime/build.gradle @@ -14,9 +14,9 @@ version = '1.0.0-SNAPSHOT' checkstyle { toolVersion = "6.18" - configFile = new File("$rootDir/ClientRuntimes/Java/build-tools/src/main/resources/checkstyle.xml") - configProperties = [samedir: "$rootDir/ClientRuntimes/Java/build-tools/src/main/resources"] - reportsDir = new File("$rootDir/ClientRuntimes/Java/build-tools/reports") + configFile = new File("$rootDir/src/client/Java/build-tools/src/main/resources/checkstyle.xml") + configProperties = [samedir: "$rootDir/src/client/Java/build-tools/src/main/resources"] + reportsDir = new File("$rootDir/src/client/Java/build-tools/reports") } dependencies { @@ -90,7 +90,7 @@ artifacts { test { reports.getHtml() - reports.html.destination = file("${projectDir}/../../../TestResults/JavaAzureRuntime") + reports.html.destination = file("$rootDir/TestResults/JavaAzureRuntime") } tasks.compileJava.dependsOn 'clean' diff --git a/build-tools/src/main/resources/checkstyle.xml b/build-tools/src/main/resources/checkstyle.xml index 1875d6f100cab..b7f934898253c 100644 --- a/build-tools/src/main/resources/checkstyle.xml +++ b/build-tools/src/main/resources/checkstyle.xml @@ -231,7 +231,6 @@ --> - diff --git a/client-runtime/build.gradle b/client-runtime/build.gradle index 73750c0d3d935..e530072694672 100644 --- a/client-runtime/build.gradle +++ b/client-runtime/build.gradle @@ -16,9 +16,9 @@ version = '1.0.0-SNAPSHOT' checkstyle { toolVersion = "6.18" - configFile = new File("$rootDir/ClientRuntimes/Java/build-tools/src/main/resources/checkstyle.xml") - configProperties = [samedir: "$rootDir/ClientRuntimes/Java/build-tools/src/main/resources"] - reportsDir = new File("$rootDir/ClientRuntimes/Java/build-tools/reports") + configFile = new File("$rootDir/src/client/Java/build-tools/src/main/resources/checkstyle.xml") + configProperties = [samedir: "$rootDir/src/client/Java/build-tools/src/main/resources"] + reportsDir = new File("$rootDir/src/client/Java/build-tools/reports") } dependencies { @@ -99,7 +99,7 @@ artifacts { test { reports.getHtml() - reports.html.destination = file("${projectDir}/../../../TestResults/JavaRuntime") + reports.html.destination = file("$rootDir/TestResults/JavaRuntime") } tasks.compileJava.dependsOn 'clean' diff --git a/client-runtime/src/main/java/com/microsoft/rest/Base64Url.java b/client-runtime/src/main/java/com/microsoft/rest/Base64Url.java new file mode 100644 index 0000000000000..61b02879feae1 --- /dev/null +++ b/client-runtime/src/main/java/com/microsoft/rest/Base64Url.java @@ -0,0 +1,94 @@ +/** + * + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * + */ + +package com.microsoft.rest; + +import com.google.common.io.BaseEncoding; + +import java.util.Arrays; + +/** + * Simple wrapper over Base64Url encoded byte array used during serialization/deserialization. + */ +public final class Base64Url { + /** + * The Base64Url encoded bytes. + */ + private final byte[] bytes; + + /** + * Creates a new Base64Url object with the specified encoded string. + * + * @param string The encoded string. + */ + private Base64Url(String string) { + if (string == null) { + this.bytes = null; + } else { + this.bytes = string.getBytes(); + } + } + + /** + * Encode a byte array into Base64Url encoded bytes. + * + * @param bytes The byte array to encode. + * @return a Base64Url instance + */ + public static Base64Url encode(byte[] bytes) { + if (bytes == null) { + return new Base64Url(null); + } else { + return new Base64Url(BaseEncoding.base64Url().omitPadding().encode(bytes)); + } + } + + /** + * Returns the underlying encoded byte array. + * + * @return The underlying encoded byte array. + */ + public byte[] getEncodedBytes() { + return bytes; + } + + /** + * Decode the bytes and return. + * + * @return The decoded byte array. + */ + public byte[] getDecodedBytes() { + if (this.bytes == null) { + return null; + } + return BaseEncoding.base64Url().decode(new String(bytes)); + } + + @Override + public String toString() { + return new String(bytes); + } + + @Override + public int hashCode() { + return Arrays.hashCode(bytes); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (!(obj instanceof Base64Url)) { + return false; + } + + Base64Url rhs = (Base64Url) obj; + return Arrays.equals(this.bytes, rhs.getEncodedBytes()); + } +} \ No newline at end of file diff --git a/client-runtime/src/main/java/com/microsoft/rest/ServiceClient.java b/client-runtime/src/main/java/com/microsoft/rest/ServiceClient.java index 8311a243de139..5d6f0f850336c 100644 --- a/client-runtime/src/main/java/com/microsoft/rest/ServiceClient.java +++ b/client-runtime/src/main/java/com/microsoft/rest/ServiceClient.java @@ -40,6 +40,9 @@ protected ServiceClient(String baseUrl) { /** * Initializes a new instance of the ServiceClient class. * + * @param baseUrl the service base uri + * @param clientBuilder the http client builder + * @param restBuilder the retrofit rest client builder */ protected ServiceClient(String baseUrl, OkHttpClient.Builder clientBuilder, Retrofit.Builder restBuilder) { if (clientBuilder == null) { diff --git a/client-runtime/src/main/java/com/microsoft/rest/serializer/Base64UrlSerializer.java b/client-runtime/src/main/java/com/microsoft/rest/serializer/Base64UrlSerializer.java new file mode 100644 index 0000000000000..757ab735e2c0d --- /dev/null +++ b/client-runtime/src/main/java/com/microsoft/rest/serializer/Base64UrlSerializer.java @@ -0,0 +1,38 @@ +/** + * + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * + */ + +package com.microsoft.rest.serializer; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.microsoft.rest.Base64Url; + +import java.io.IOException; + +/** + * Custom serializer for serializing {@link Byte[]} objects into Base64 strings. + */ +public class Base64UrlSerializer extends JsonSerializer { + /** + * Gets a module wrapping this serializer as an adapter for the Jackson + * ObjectMapper. + * + * @return a simple module to be plugged onto Jackson ObjectMapper. + */ + public static SimpleModule getModule() { + SimpleModule module = new SimpleModule(); + module.addSerializer(Base64Url.class, new Base64UrlSerializer()); + return module; + } + + @Override + public void serialize(Base64Url value, JsonGenerator jgen, SerializerProvider provider) throws IOException { + jgen.writeString(value.toString()); + } +} diff --git a/client-runtime/src/main/java/com/microsoft/rest/serializer/JacksonMapperAdapter.java b/client-runtime/src/main/java/com/microsoft/rest/serializer/JacksonMapperAdapter.java index a59247207502b..ea938fe50c9c5 100644 --- a/client-runtime/src/main/java/com/microsoft/rest/serializer/JacksonMapperAdapter.java +++ b/client-runtime/src/main/java/com/microsoft/rest/serializer/JacksonMapperAdapter.java @@ -56,6 +56,7 @@ protected void initializeObjectMapper(ObjectMapper mapper) { .setSerializationInclusion(JsonInclude.Include.NON_NULL) .registerModule(new JodaModule()) .registerModule(ByteArraySerializer.getModule()) + .registerModule(Base64UrlSerializer.getModule()) .registerModule(DateTimeSerializer.getModule()) .registerModule(DateTimeRfc1123Serializer.getModule()) .registerModule(HeadersSerializer.getModule());