aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java139
1 files changed, 0 insertions, 139 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java
deleted file mode 100644
index b199ca6ce1..0000000000
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2018 The Bazel Authors. All rights reserved.
-//
-// 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 com.google.devtools.build.lib.skyframe.serialization;
-
-import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
-import com.google.protobuf.CodedInputStream;
-import com.google.protobuf.CodedOutputStream;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.Optional;
-import javax.annotation.Nullable;
-
-/** Helper methods for polymorphic codecs using reflection. */
-public class PolymorphicHelper {
-
- private PolymorphicHelper() {}
-
- /**
- * Serializes a polymorphic type.
- *
- * @param dependency if null, it means that the parent, polymorphic type, provides no dependency.
- * It is valid for dependency to be non-null, with an enclosed null value. This means that
- * dependency itself is null (as opposed to non-existent).
- */
- @SuppressWarnings("unchecked")
- public static void serialize(
- SerializationContext context,
- Object input,
- Class<?> baseClass,
- CodedOutputStream codedOut,
- @Nullable Optional<?> dependency)
- throws IOException, SerializationException {
- if (input != null) {
- try {
- ClassAndCodec classAndCodec = getClassAndCodecInClassHierarchy(input, baseClass);
- Class<?> clazz = classAndCodec.clazz;
- Object codec = classAndCodec.codec;
- codedOut.writeBoolNoTag(true);
- StringCodecs.asciiOptimized().serialize(context, clazz.getName(), codedOut);
- if (codec instanceof ObjectCodec) {
- ((ObjectCodec) codec).serialize(context, input, codedOut);
- } else {
- throw new SerializationException(
- clazz.getCanonicalName()
- + ".CODEC has unexpected type "
- + codec.getClass().getCanonicalName());
- }
- } catch (ReflectiveOperationException e) {
- throw new SerializationException(input.getClass().getName(), e);
- }
- } else {
- codedOut.writeBoolNoTag(false);
- }
- }
-
- /**
- * Deserializes a polymorphic type.
- *
- * @param dependency if null, it means that the parent, polymorphic type, provides no dependency.
- * It is valid for dependency to be non-null, with an enclosed null value. This means the
- * dependency itself is null (as opposed to non-existent).
- */
- @SuppressWarnings("unchecked")
- public static Object deserialize(
- DeserializationContext context, CodedInputStream codedIn, @Nullable Optional<?> dependency)
- throws IOException, SerializationException {
- Object deserialized = null;
- if (codedIn.readBool()) {
- String className = StringCodecs.asciiOptimized().deserialize(context, codedIn);
- try {
- Object codec = getCodec(Class.forName(className));
- if (codec instanceof ObjectCodec) {
- return ((ObjectCodec) codec).deserialize(context, codedIn);
- } else {
- throw new SerializationException(
- className + ".CODEC has unexpected type " + codec.getClass().getCanonicalName());
- }
- } catch (ReflectiveOperationException e) {
- throw new SerializationException(className, e);
- }
- }
- return deserialized;
- }
-
- private static ClassAndCodec getClassAndCodecInClassHierarchy(Object input, Class<?> baseClass)
- throws SerializationException, IllegalAccessException {
- Class<?> clazz = input.getClass();
- Field codecField = null;
- while (!clazz.equals(baseClass)) {
- try {
- codecField = getCodecField(clazz);
- break;
- } catch (NoSuchFieldException e) {
- clazz = clazz.getSuperclass();
- }
- }
- if (clazz.equals(baseClass)) {
- throw new SerializationException("Could not find codec for " + input.getClass());
- }
- return new ClassAndCodec(clazz, getValueOfField(codecField));
- }
-
- private static Field getCodecField(Class<?> clazz) throws NoSuchFieldException {
- return clazz.getDeclaredField("CODEC");
- }
-
- private static Object getValueOfField(Field field) throws IllegalAccessException {
- field.setAccessible(true);
- return field.get(null);
- }
-
- /** Returns the static CODEC instance for {@code clazz}. */
- private static Object getCodec(Class<?> clazz)
- throws NoSuchFieldException, IllegalAccessException {
- return getValueOfField(getCodecField(clazz));
- }
-
- private static class ClassAndCodec {
- final Class<?> clazz;
- final Object codec;
-
- ClassAndCodec(Class<?> clazz, Object codec) {
- this.clazz = clazz;
- this.codec = codec;
- }
- }
-}