invocationCallback;
+}
diff --git a/bmc-common/src/main/java/com/oracle/bmc/util/internal/HttpUtils.java b/bmc-common/src/main/java/com/oracle/bmc/util/internal/HttpUtils.java
index 9121e131182..f6a06f8234c 100644
--- a/bmc-common/src/main/java/com/oracle/bmc/util/internal/HttpUtils.java
+++ b/bmc-common/src/main/java/com/oracle/bmc/util/internal/HttpUtils.java
@@ -5,12 +5,17 @@
import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper;
+import java.util.Collection;
import java.util.Date;
+import java.util.Map;
import java.util.UUID;
import javax.annotation.Nonnull;
+import javax.ws.rs.client.WebTarget;
import com.oracle.bmc.http.internal.HttpDateUtils;
+import com.oracle.bmc.http.internal.WrappedInvocationBuilder;
+import com.oracle.bmc.http.internal.WrappedWebTarget;
/**
* Utility functions related to HTTP calls.
@@ -106,4 +111,46 @@ public static Object attemptEncodeQueryParam(Object queryParam) {
}
return queryParam;
}
+
+ /**
+ * Attempts to encode a query param if it is a {@link Map}. Each key is prefixed with the value passed as
+ * {@code prefix}. If a value is a {@link Collection}, then the "{prefix}{key}={item}" output is repeated for each
+ * item in the collection, where "{item}" is encoded using {@link HttpUtils#attemptEncodeQueryParam(Object)}.
+ * If the value is not a collection, then the output is simply "{prefix}{key}={value}", where the value is again
+ * encoded.
+ *
+ * Note: this should be called much lower in the HTTP stack (currently being
+ * called through the generated code), so it can encode the serialized values.
+ *
+ * @param target target instance
+ * @param prefix prefix for each key
+ * @param queryParam The map query parameter to encode.
+ * @return a new target instance
+ */
+ public static WrappedWebTarget encodeMapQueryParam(
+ WrappedWebTarget target, String prefix, Map queryParam) {
+ if (prefix == null) {
+ prefix = "";
+ }
+ if (queryParam != null) {
+ for (Map.Entry e : queryParam.entrySet()) {
+ target = encodeMapQueryParamValue(target, prefix + e.getKey(), e.getValue());
+ }
+ }
+ return target;
+ }
+
+ private static WrappedWebTarget encodeMapQueryParamValue(
+ WrappedWebTarget target, String prefixedKey, Object value) {
+ String name = attemptEncodeQueryParam(prefixedKey).toString();
+ if (value instanceof Collection) {
+ Collection> c = (Collection>) value;
+ for (Object v : c) {
+ target = target.queryParam(name, attemptEncodeQueryParam(v));
+ }
+ } else {
+ target = target.queryParam(name, attemptEncodeQueryParam(value));
+ }
+ return target;
+ }
}
diff --git a/bmc-common/src/main/java/com/oracle/bmc/waiter/Waiters.java b/bmc-common/src/main/java/com/oracle/bmc/waiter/Waiters.java
index 03a94052a34..f85cbd991ee 100644
--- a/bmc-common/src/main/java/com/oracle/bmc/waiter/Waiters.java
+++ b/bmc-common/src/main/java/com/oracle/bmc/waiter/Waiters.java
@@ -52,6 +52,6 @@ public static BmcGenericWaiter newWaiter(
}
private static long secondsToMillis(int seconds) {
- return seconds * 1000;
+ return seconds * 1000L;
}
}
diff --git a/bmc-common/src/test/java/com/oracle/bmc/ClientRuntimeTest.java b/bmc-common/src/test/java/com/oracle/bmc/ClientRuntimeTest.java
new file mode 100644
index 00000000000..1090a5b04e6
--- /dev/null
+++ b/bmc-common/src/test/java/com/oracle/bmc/ClientRuntimeTest.java
@@ -0,0 +1,18 @@
+/**
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
+ */
+package com.oracle.bmc;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+
+public class ClientRuntimeTest {
+ @Test
+ public void setClientUserAgent() {
+ String clientUserAgent = "foobar";
+ ClientRuntime.setClientUserAgent(clientUserAgent);
+ String userAgent = ClientRuntime.getRuntime().getUserAgent();
+ assertTrue(userAgent.contains(clientUserAgent));
+ }
+}
diff --git a/bmc-common/src/test/java/com/oracle/bmc/http/internal/ExplicitlySetFilterTest.java b/bmc-common/src/test/java/com/oracle/bmc/http/internal/ExplicitlySetFilterTest.java
new file mode 100644
index 00000000000..950cfde0b80
--- /dev/null
+++ b/bmc-common/src/test/java/com/oracle/bmc/http/internal/ExplicitlySetFilterTest.java
@@ -0,0 +1,240 @@
+/**
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
+ */
+package com.oracle.bmc.http.internal;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.PropertyWriter;
+import com.oracle.bmc.ClientConfiguration;
+import com.oracle.bmc.http.signing.RequestSigner;
+import com.oracle.bmc.requests.BmcRequest;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.*;
+
+@Ignore("DEX-1801: Fix Mockito Problem in Release TeamCity Job")
+public class ExplicitlySetFilterTest {
+ @Test
+ public void testFieldInSuperclass() throws Exception {
+ Subclass pojo = Subclass.builder().baseVal(1).subVal("two").build();
+ JsonGenerator jgen = mock(JsonGenerator.class);
+ SerializerProvider provider = mock(SerializerProvider.class);
+ PropertyWriter writer = mock(PropertyWriter.class);
+
+ when(writer.getName()).thenReturn("baseVal");
+
+ ExplicitlySetFilter.INSTANCE.serializeAsField(pojo, jgen, provider, writer);
+
+ verify(writer, atLeast(1)).getName();
+ verify(writer).serializeAsField(pojo, jgen, provider);
+ verifyNoMoreInteractions(writer);
+ }
+
+ @Test
+ public void testFieldInSubclass() throws Exception {
+ Subclass pojo = Subclass.builder().baseVal(1).subVal("two").build();
+ JsonGenerator jgen = mock(JsonGenerator.class);
+ SerializerProvider provider = mock(SerializerProvider.class);
+ PropertyWriter writer = mock(PropertyWriter.class);
+
+ when(writer.getName()).thenReturn("subVal");
+
+ ExplicitlySetFilter.INSTANCE.serializeAsField(pojo, jgen, provider, writer);
+
+ verify(writer, atLeast(1)).getName();
+ verify(writer).serializeAsField(pojo, jgen, provider);
+ verifyNoMoreInteractions(writer);
+ }
+
+ @Test
+ public void testExplicitNullFieldInSuperclass() throws Exception {
+ Subclass pojo = Subclass.builder().baseVal(null).subVal("two").build();
+ JsonGenerator jgen = mock(JsonGenerator.class);
+ SerializerProvider provider = mock(SerializerProvider.class);
+ PropertyWriter writer = mock(PropertyWriter.class);
+
+ when(writer.getName()).thenReturn("baseVal");
+
+ ExplicitlySetFilter.INSTANCE.serializeAsField(pojo, jgen, provider, writer);
+
+ verify(writer, atLeast(1)).getName();
+ verify(writer).serializeAsField(pojo, jgen, provider);
+ verifyNoMoreInteractions(writer);
+ }
+
+ @Test
+ public void testExplicitNullInSubclass() throws Exception {
+ Subclass pojo = Subclass.builder().baseVal(1).subVal(null).build();
+ JsonGenerator jgen = mock(JsonGenerator.class);
+ SerializerProvider provider = mock(SerializerProvider.class);
+ PropertyWriter writer = mock(PropertyWriter.class);
+
+ when(writer.getName()).thenReturn("subVal");
+
+ ExplicitlySetFilter.INSTANCE.serializeAsField(pojo, jgen, provider, writer);
+
+ verify(writer, atLeast(1)).getName();
+ verify(writer).serializeAsField(pojo, jgen, provider);
+ verifyNoMoreInteractions(writer);
+ }
+
+ @Test
+ public void testNullFieldInSuperclass() throws Exception {
+ Subclass pojo = Subclass.builder().subVal("two").build();
+ JsonGenerator jgen = mock(JsonGenerator.class);
+ SerializerProvider provider = mock(SerializerProvider.class);
+ PropertyWriter writer = mock(PropertyWriter.class);
+
+ when(writer.getName()).thenReturn("baseVal");
+
+ ExplicitlySetFilter.INSTANCE.serializeAsField(pojo, jgen, provider, writer);
+
+ verify(writer, atLeast(1)).getName();
+ verifyNoMoreInteractions(writer);
+ }
+
+ @Test
+ public void testNullInSubclass() throws Exception {
+ Subclass pojo = Subclass.builder().baseVal(1).build();
+ JsonGenerator jgen = mock(JsonGenerator.class);
+ SerializerProvider provider = mock(SerializerProvider.class);
+ PropertyWriter writer = mock(PropertyWriter.class);
+
+ when(writer.getName()).thenReturn("subVal");
+
+ ExplicitlySetFilter.INSTANCE.serializeAsField(pojo, jgen, provider, writer);
+
+ verify(writer, atLeast(1)).getName();
+ verifyNoMoreInteractions(writer);
+ }
+
+ @Test
+ public void deserializeNoDiscriminator() throws IOException {
+ Subclass sub = Subclass.builder().baseVal(1).subVal("two").build();
+
+ RequestSigner signer = mock(RequestSigner.class);
+
+ Client client = mock(Client.class);
+ EntityFactory ef = mock(EntityFactory.class);
+ RestClient rc = new RestClient(client, ef);
+
+ Invocation.Builder ib = mock(Invocation.Builder.class);
+ rc.post(new WrappedInvocationBuilder(ib), sub, new BmcRequest());
+
+ ArgumentCaptor