diff --git a/src/main/java/com/uber/cadence/converter/JsonDataConverter.java b/src/main/java/com/uber/cadence/converter/JsonDataConverter.java index aed0c91e5..26ff1a615 100644 --- a/src/main/java/com/uber/cadence/converter/JsonDataConverter.java +++ b/src/main/java/com/uber/cadence/converter/JsonDataConverter.java @@ -33,12 +33,10 @@ import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.function.Function; -import org.apache.thrift.protocol.TJSONProtocol; /** * Implements conversion through GSON JSON processor. To extend use {@link - * #JsonDataConverter(Function)} constructor. Thrift structures are converted using {@link - * TJSONProtocol}. When using thrift only one argument of a method is expected. + * #JsonDataConverter(Function)} constructor. * * @author fateev */ @@ -78,9 +76,7 @@ public JsonDataConverter(Function builderInterceptor) GsonBuilder gsonBuilder = new GsonBuilder() .serializeNulls() - .registerTypeAdapterFactory(new ThrowableTypeAdapterFactory()) - .registerTypeAdapterFactory(new TBaseTypeAdapterFactory(metricsScope)) - .registerTypeAdapterFactory(new TEnumTypeAdapterFactory()); + .registerTypeAdapterFactory(new ThrowableTypeAdapterFactory()); GsonBuilder intercepted = builderInterceptor.apply(gsonBuilder); gson = intercepted.create(); } diff --git a/src/main/java/com/uber/cadence/converter/TBaseTypeAdapterFactory.java b/src/main/java/com/uber/cadence/converter/TBaseTypeAdapterFactory.java deleted file mode 100644 index c2f4d2b5b..000000000 --- a/src/main/java/com/uber/cadence/converter/TBaseTypeAdapterFactory.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Modifications copyright (C) 2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not - * use this file except in compliance with the License. A copy of the License is - * located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file 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 com.uber.cadence.converter; - -import com.google.gson.Gson; -import com.google.gson.TypeAdapter; -import com.google.gson.TypeAdapterFactory; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; -import com.uber.m3.tally.Scope; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import org.apache.thrift.TBase; -import org.apache.thrift.TDeserializer; -import org.apache.thrift.TException; -import org.apache.thrift.TSerializer; -import org.apache.thrift.protocol.TJSONProtocol; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Special handling of TBase message serialization and deserialization. This is to support for - * inline Thrift fields in Java class. - */ -public class TBaseTypeAdapterFactory implements TypeAdapterFactory { - - private static final Logger logger = LoggerFactory.getLogger(TBaseTypeAdapterFactory.class); - private final Scope metricsScope; - - public TBaseTypeAdapterFactory(Scope metricsScope) { - this.metricsScope = metricsScope; - } - - @Override - public TypeAdapter create(Gson gson, TypeToken typeToken) { - // this class only serializes 'TBase' and its subtypes - if (!TBase.class.isAssignableFrom(typeToken.getRawType())) { - return null; - } - TypeAdapter result = - new TypeAdapter() { - @Override - public void write(JsonWriter jsonWriter, T value) throws IOException { - if (metricsScope != null) { - metricsScope.counter("tbase_message_write").inc(1); - } - try { - String result = - newThriftSerializer().toString((TBase) value, StandardCharsets.UTF_8.name()); - jsonWriter.value(result); - logger.warn( - "TBase message will no longer be support in cadence-java-client V4, payload {}", - result); - } catch (TException e) { - throw new DataConverterException("Failed to serialize TBase", e); - } - } - - @Override - public T read(JsonReader jsonReader) throws IOException { - if (metricsScope != null) { - metricsScope.counter("tbase_message_read").inc(1); - } - String value = jsonReader.nextString(); - try { - logger.warn( - "TBase message will no longer be support in cadence-java-client V4, payload {}", - value); - @SuppressWarnings("unchecked") - T instance = (T) typeToken.getRawType().getConstructor().newInstance(); - newThriftDeserializer() - .deserialize((TBase) instance, value, StandardCharsets.UTF_8.name()); - return instance; - } catch (Exception e) { - throw new DataConverterException("Failed to deserialize TBase", e); - } - } - }.nullSafe(); - return result; - } - - private static TSerializer newThriftSerializer() { - return new TSerializer(new TJSONProtocol.Factory()); - } - - private static TDeserializer newThriftDeserializer() { - return new TDeserializer(new TJSONProtocol.Factory()); - } -} diff --git a/src/main/java/com/uber/cadence/converter/TEnumTypeAdapterFactory.java b/src/main/java/com/uber/cadence/converter/TEnumTypeAdapterFactory.java deleted file mode 100644 index 22e9d1859..000000000 --- a/src/main/java/com/uber/cadence/converter/TEnumTypeAdapterFactory.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Modifications copyright (C) 2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not - * use this file except in compliance with the License. A copy of the License is - * located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file 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 com.uber.cadence.converter; - -import com.google.gson.Gson; -import com.google.gson.TypeAdapter; -import com.google.gson.TypeAdapterFactory; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; -import java.io.IOException; -import java.lang.reflect.Method; -import org.apache.thrift.TEnum; - -/** - * Special handling of TEnum serialization and deserialization. This is to support for inline TEnum - * fields in Java class. The default gson serde serialize the TEnum with its String name - * representation, this adapter serialize the TEnum class with its int representation. - */ -public class TEnumTypeAdapterFactory implements TypeAdapterFactory { - - @Override - public TypeAdapter create(Gson gson, TypeToken typeToken) { - // this class only serializes 'TEnum' and its subtypes - if (!TEnum.class.isAssignableFrom(typeToken.getRawType())) { - return null; - } - TypeAdapter result = - new TypeAdapter() { - @Override - public void write(JsonWriter jsonWriter, T value) throws IOException { - jsonWriter.value(((TEnum) value).getValue()); - } - - @Override - public T read(JsonReader jsonReader) throws IOException { - int value = jsonReader.nextInt(); - try { - Method m = (typeToken.getRawType().getDeclaredMethod("findByValue", Integer.TYPE)); - @SuppressWarnings("unchecked") - T instance = (T) m.invoke(null, value); - return instance; - } catch (Exception e) { - throw new DataConverterException("Failed to deserilize TEnum", e); - } - } - }.nullSafe(); - return result; - } -} diff --git a/src/test/java/com/uber/cadence/converter/JsonDataConverterTest.java b/src/test/java/com/uber/cadence/converter/JsonDataConverterTest.java index 57862ddc1..7c7fcd74a 100644 --- a/src/test/java/com/uber/cadence/converter/JsonDataConverterTest.java +++ b/src/test/java/com/uber/cadence/converter/JsonDataConverterTest.java @@ -20,12 +20,6 @@ import static org.junit.Assert.*; import com.google.gson.JsonIOException; -import com.uber.cadence.EventType; -import com.uber.cadence.History; -import com.uber.cadence.HistoryEvent; -import com.uber.cadence.TaskList; -import com.uber.cadence.WorkflowExecutionStartedEventAttributes; -import com.uber.cadence.WorkflowType; import com.uber.cadence.activity.Activity; import java.io.File; import java.io.FileInputStream; @@ -33,10 +27,8 @@ import java.io.InputStream; import java.lang.reflect.Method; import java.lang.reflect.Type; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.UUID; import org.junit.Test; @@ -44,126 +36,6 @@ public class JsonDataConverterTest { private final DataConverter converter = JsonDataConverter.getInstance(); - static class TestData { - String val1; - // TBase value; - HistoryEvent val2; - // TEnum value; - EventType val3; - - public TestData(String val1, HistoryEvent val2, EventType val3) { - this.val1 = val1; - this.val2 = val2; - this.val3 = val3; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof TestData)) return false; - TestData testData = (TestData) o; - return Objects.equals(val1, testData.val1) - && Objects.equals(val2, testData.val2) - && val3 == testData.val3; - } - - @Override - public int hashCode() { - - return Objects.hash(val1, val2, val3); - } - } - - @Test - public void testThrift() { - List events = new ArrayList<>(); - WorkflowExecutionStartedEventAttributes started = - new WorkflowExecutionStartedEventAttributes() - .setExecutionStartToCloseTimeoutSeconds(11) - .setIdentity("testIdentity") - .setInput("input".getBytes(StandardCharsets.UTF_8)) - .setWorkflowType(new WorkflowType().setName("workflowType1")) - .setTaskList(new TaskList().setName("taskList1")); - events.add( - new HistoryEvent() - .setTimestamp(1234567) - .setEventId(321) - .setWorkflowExecutionStartedEventAttributes(started)); - History history = new History().setEvents(events); - byte[] converted = converter.toData(history); - History fromConverted = converter.fromData(converted, History.class, History.class); - assertEquals(new String(converted, StandardCharsets.UTF_8), history, fromConverted); - } - - @Test - public void testThriftArray() { - List events = new ArrayList<>(); - WorkflowExecutionStartedEventAttributes started = - new WorkflowExecutionStartedEventAttributes() - .setExecutionStartToCloseTimeoutSeconds(11) - .setIdentity("testIdentity") - .setInput("input".getBytes(StandardCharsets.UTF_8)) - .setWorkflowType(new WorkflowType().setName("workflowType1")) - .setTaskList(new TaskList().setName("taskList1")); - events.add( - new HistoryEvent() - .setTimestamp(1234567) - .setEventId(321) - .setWorkflowExecutionStartedEventAttributes(started)); - History history = new History().setEvents(events); - byte[] converted = converter.toData("abc", history); - Object[] fromConverted = converter.fromDataArray(converted, String.class, History.class); - assertEquals(new String(converted, StandardCharsets.UTF_8), "abc", fromConverted[0]); - assertEquals(new String(converted, StandardCharsets.UTF_8), history, fromConverted[1]); - } - - @Test - public void testThriftFieldsInPOJO() { - WorkflowExecutionStartedEventAttributes started = - new WorkflowExecutionStartedEventAttributes() - .setExecutionStartToCloseTimeoutSeconds(11) - .setIdentity("testIdentity") - .setInput("input".getBytes(StandardCharsets.UTF_8)) - .setWorkflowType(new WorkflowType().setName("workflowType1")) - .setTaskList(new TaskList().setName("taskList1")); - - HistoryEvent historyEvent = - new HistoryEvent() - .setTimestamp(1234567) - .setEventId(321) - .setWorkflowExecutionStartedEventAttributes(started); - - TestData testData = new TestData("test-thrift", historyEvent, EventType.ActivityTaskCompleted); - - byte[] converted = converter.toData(testData); - TestData fromConverted = converter.fromData(converted, TestData.class, TestData.class); - assertEquals(new String(converted, StandardCharsets.UTF_8), testData, fromConverted); - } - - @Test - public void testThriftFieldsInPOJOArray() { - WorkflowExecutionStartedEventAttributes started = - new WorkflowExecutionStartedEventAttributes() - .setExecutionStartToCloseTimeoutSeconds(11) - .setIdentity("testIdentity") - .setInput("input".getBytes(StandardCharsets.UTF_8)) - .setWorkflowType(new WorkflowType().setName("workflowType1")) - .setTaskList(new TaskList().setName("taskList1")); - - HistoryEvent historyEvent = - new HistoryEvent() - .setTimestamp(1234567) - .setEventId(321) - .setWorkflowExecutionStartedEventAttributes(started); - - TestData testData = new TestData("test-thrift", historyEvent, EventType.ActivityTaskCompleted); - - byte[] converted = converter.toData("abc", testData); - Object[] fromConverted = converter.fromDataArray(converted, String.class, TestData.class); - assertEquals(new String(converted, StandardCharsets.UTF_8), "abc", fromConverted[0]); - assertEquals(new String(converted, StandardCharsets.UTF_8), testData, fromConverted[1]); - } - public static void foo(List arg) {} @Test