Index: third_party/protobuf/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java |
diff --git a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java |
index 65cf73857642534c0f368229919c6e7fb5ff1656..f3d48d3af34e7e3eeb71601bfeca4c2561038a9a 100644 |
--- a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java |
+++ b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java |
@@ -79,6 +79,22 @@ public class ExtensionRegistryLite { |
// applications. Need to support this feature on smaller granularity. |
private static volatile boolean eagerlyParseMessageSets = false; |
+ // Visible for testing. |
+ static final String EXTENSION_CLASS_NAME = "com.google.protobuf.Extension"; |
+ |
+ /* @Nullable */ |
+ static Class<?> resolveExtensionClass() { |
+ try { |
+ return Class.forName(EXTENSION_CLASS_NAME); |
+ } catch (ClassNotFoundException e) { |
+ // See comment in ExtensionRegistryFactory on the potential expense of this. |
+ return null; |
+ } |
+ } |
+ |
+ /* @Nullable */ |
+ private static final Class<?> extensionClass = resolveExtensionClass(); |
+ |
public static boolean isEagerlyParseMessageSets() { |
return eagerlyParseMessageSets; |
} |
@@ -87,16 +103,25 @@ public class ExtensionRegistryLite { |
eagerlyParseMessageSets = isEagerlyParse; |
} |
- /** Construct a new, empty instance. */ |
+ /** |
+ * Construct a new, empty instance. |
+ * |
+ * <p>This may be an {@code ExtensionRegistry} if the full (non-Lite) proto libraries are |
+ * available. |
+ */ |
public static ExtensionRegistryLite newInstance() { |
- return new ExtensionRegistryLite(); |
+ return ExtensionRegistryFactory.create(); |
} |
- /** Get the unmodifiable singleton empty instance. */ |
+ /** |
+ * Get the unmodifiable singleton empty instance of either ExtensionRegistryLite or |
+ * {@code ExtensionRegistry} (if the full (non-Lite) proto libraries are available). |
+ */ |
public static ExtensionRegistryLite getEmptyRegistry() { |
- return EMPTY; |
+ return ExtensionRegistryFactory.createEmpty(); |
} |
+ |
/** Returns an unmodifiable view of the registry. */ |
public ExtensionRegistryLite getUnmodifiable() { |
return new ExtensionRegistryLite(this); |
@@ -128,6 +153,23 @@ public class ExtensionRegistryLite { |
extension); |
} |
+ /** |
+ * Add an extension from a lite generated file to the registry only if it is |
+ * a non-lite extension i.e. {@link GeneratedMessageLite.GeneratedExtension}. */ |
+ public final void add(ExtensionLite<?, ?> extension) { |
+ if (GeneratedMessageLite.GeneratedExtension.class.isAssignableFrom(extension.getClass())) { |
+ add((GeneratedMessageLite.GeneratedExtension<?, ?>) extension); |
+ } |
+ if (ExtensionRegistryFactory.isFullRegistry(this)) { |
+ try { |
+ this.getClass().getMethod("add", extensionClass).invoke(this, extension); |
+ } catch (Exception e) { |
+ throw new IllegalArgumentException( |
+ String.format("Could not invoke ExtensionRegistry#add for %s", extension), e); |
+ } |
+ } |
+ } |
+ |
// ================================================================= |
// Private stuff. |
@@ -139,9 +181,11 @@ public class ExtensionRegistryLite { |
new HashMap<ObjectIntPair, |
GeneratedMessageLite.GeneratedExtension<?, ?>>(); |
} |
+ static final ExtensionRegistryLite EMPTY_REGISTRY_LITE = |
+ new ExtensionRegistryLite(true); |
ExtensionRegistryLite(ExtensionRegistryLite other) { |
- if (other == EMPTY) { |
+ if (other == EMPTY_REGISTRY_LITE) { |
this.extensionsByNumber = Collections.emptyMap(); |
} else { |
this.extensionsByNumber = |
@@ -153,11 +197,9 @@ public class ExtensionRegistryLite { |
GeneratedMessageLite.GeneratedExtension<?, ?>> |
extensionsByNumber; |
- private ExtensionRegistryLite(boolean empty) { |
+ ExtensionRegistryLite(boolean empty) { |
this.extensionsByNumber = Collections.emptyMap(); |
} |
- private static final ExtensionRegistryLite EMPTY = |
- new ExtensionRegistryLite(true); |
/** A (Object, int) pair, used as a map key. */ |
private static final class ObjectIntPair { |