ExtensionRegistry.java
Go to the documentation of this file.
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 // * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 package com.google.protobuf;
32 
35 import java.util.Collection;
36 import java.util.Collections;
37 import java.util.HashMap;
38 import java.util.HashSet;
39 import java.util.Map;
40 import java.util.Set;
41 
93  public static ExtensionRegistry newInstance() {
94  return new ExtensionRegistry();
95  }
96 
99  return EMPTY_REGISTRY;
100  }
101 
102 
104  @Override
106  return new ExtensionRegistry(this);
107  }
108 
110  public static final class ExtensionInfo {
113 
118  public final Message defaultInstance;
119 
121  this.descriptor = descriptor;
122  defaultInstance = null;
123  }
124 
126  this.descriptor = descriptor;
127  this.defaultInstance = defaultInstance;
128  }
129  }
130 
132  @Deprecated
133  public ExtensionInfo findExtensionByName(final String fullName) {
134  return findImmutableExtensionByName(fullName);
135  }
136 
143  public ExtensionInfo findImmutableExtensionByName(final String fullName) {
144  return immutableExtensionsByName.get(fullName);
145  }
146 
153  public ExtensionInfo findMutableExtensionByName(final String fullName) {
154  return mutableExtensionsByName.get(fullName);
155  }
156 
158  @Deprecated
160  final Descriptor containingType, final int fieldNumber) {
161  return findImmutableExtensionByNumber(containingType, fieldNumber);
162  }
163 
170  final Descriptor containingType, final int fieldNumber) {
171  return immutableExtensionsByNumber.get(new DescriptorIntPair(containingType, fieldNumber));
172  }
173 
180  final Descriptor containingType, final int fieldNumber) {
181  return mutableExtensionsByNumber.get(new DescriptorIntPair(containingType, fieldNumber));
182  }
183 
190  public Set<ExtensionInfo> getAllMutableExtensionsByExtendedType(final String fullName) {
191  HashSet<ExtensionInfo> extensions = new HashSet<ExtensionInfo>();
192  for (DescriptorIntPair pair : mutableExtensionsByNumber.keySet()) {
193  if (pair.descriptor.getFullName().equals(fullName)) {
194  extensions.add(mutableExtensionsByNumber.get(pair));
195  }
196  }
197  return extensions;
198  }
199 
207  public Set<ExtensionInfo> getAllImmutableExtensionsByExtendedType(final String fullName) {
208  HashSet<ExtensionInfo> extensions = new HashSet<ExtensionInfo>();
209  for (DescriptorIntPair pair : immutableExtensionsByNumber.keySet()) {
210  if (pair.descriptor.getFullName().equals(fullName)) {
211  extensions.add(immutableExtensionsByNumber.get(pair));
212  }
213  }
214  return extensions;
215  }
216 
218  public void add(final Extension<?, ?> extension) {
219  if (extension.getExtensionType() != Extension.ExtensionType.IMMUTABLE
220  && extension.getExtensionType() != Extension.ExtensionType.MUTABLE) {
221  // do not support other extension types. ignore
222  return;
223  }
224  add(newExtensionInfo(extension), extension.getExtensionType());
225  }
226 
230  }
231 
232  static ExtensionInfo newExtensionInfo(final Extension<?, ?> extension) {
233  if (extension.getDescriptor().getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
234  if (extension.getMessageDefaultInstance() == null) {
235  throw new IllegalStateException(
236  "Registered message-type extension had null default instance: "
237  + extension.getDescriptor().getFullName());
238  }
239  return new ExtensionInfo(
240  extension.getDescriptor(), (Message) extension.getMessageDefaultInstance());
241  } else {
242  return new ExtensionInfo(extension.getDescriptor(), null);
243  }
244  }
245 
247  public void add(final FieldDescriptor type) {
248  if (type.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
249  throw new IllegalArgumentException(
250  "ExtensionRegistry.add() must be provided a default instance when "
251  + "adding an embedded message extension.");
252  }
253  ExtensionInfo info = new ExtensionInfo(type, null);
256  }
257 
259  public void add(final FieldDescriptor type, final Message defaultInstance) {
260  if (type.getJavaType() != FieldDescriptor.JavaType.MESSAGE) {
261  throw new IllegalArgumentException(
262  "ExtensionRegistry.add() provided a default instance for a non-message extension.");
263  }
264  add(new ExtensionInfo(type, defaultInstance), Extension.ExtensionType.IMMUTABLE);
265  }
266 
267  // =================================================================
268  // Private stuff.
269 
270  private ExtensionRegistry() {
271  this.immutableExtensionsByName = new HashMap<String, ExtensionInfo>();
272  this.mutableExtensionsByName = new HashMap<String, ExtensionInfo>();
273  this.immutableExtensionsByNumber = new HashMap<DescriptorIntPair, ExtensionInfo>();
274  this.mutableExtensionsByNumber = new HashMap<DescriptorIntPair, ExtensionInfo>();
275  }
276 
278  super(other);
279  this.immutableExtensionsByName = Collections.unmodifiableMap(other.immutableExtensionsByName);
280  this.mutableExtensionsByName = Collections.unmodifiableMap(other.mutableExtensionsByName);
282  Collections.unmodifiableMap(other.immutableExtensionsByNumber);
283  this.mutableExtensionsByNumber = Collections.unmodifiableMap(other.mutableExtensionsByNumber);
284  }
285 
286  private final Map<String, ExtensionInfo> immutableExtensionsByName;
287  private final Map<String, ExtensionInfo> mutableExtensionsByName;
288  private final Map<DescriptorIntPair, ExtensionInfo> immutableExtensionsByNumber;
289  private final Map<DescriptorIntPair, ExtensionInfo> mutableExtensionsByNumber;
290 
291  ExtensionRegistry(boolean empty) {
292  super(EMPTY_REGISTRY_LITE);
293  this.immutableExtensionsByName = Collections.<String, ExtensionInfo>emptyMap();
294  this.mutableExtensionsByName = Collections.<String, ExtensionInfo>emptyMap();
295  this.immutableExtensionsByNumber = Collections.<DescriptorIntPair, ExtensionInfo>emptyMap();
296  this.mutableExtensionsByNumber = Collections.<DescriptorIntPair, ExtensionInfo>emptyMap();
297  }
298 
299  static final ExtensionRegistry EMPTY_REGISTRY = new ExtensionRegistry(true);
300 
301  private void add(final ExtensionInfo extension, final Extension.ExtensionType extensionType) {
302  if (!extension.descriptor.isExtension()) {
303  throw new IllegalArgumentException(
304  "ExtensionRegistry.add() was given a FieldDescriptor for a regular "
305  + "(non-extension) field.");
306  }
307 
308  Map<String, ExtensionInfo> extensionsByName;
309  Map<DescriptorIntPair, ExtensionInfo> extensionsByNumber;
310  switch (extensionType) {
311  case IMMUTABLE:
312  extensionsByName = immutableExtensionsByName;
314  break;
315  case MUTABLE:
316  extensionsByName = mutableExtensionsByName;
318  break;
319  default:
320  // Ignore the unknown supported type.
321  return;
322  }
323 
324  extensionsByName.put(extension.descriptor.getFullName(), extension);
325  extensionsByNumber.put(
326  new DescriptorIntPair(
327  extension.descriptor.getContainingType(), extension.descriptor.getNumber()),
328  extension);
329 
330  final FieldDescriptor field = extension.descriptor;
331  if (field.getContainingType().getOptions().getMessageSetWireFormat()
332  && field.getType() == FieldDescriptor.Type.MESSAGE
333  && field.isOptional()
334  && field.getExtensionScope() == field.getMessageType()) {
335  // This is an extension of a MessageSet type defined within the extension
336  // type's own scope. For backwards-compatibility, allow it to be looked
337  // up by type name.
338  extensionsByName.put(field.getMessageType().getFullName(), extension);
339  }
340  }
341 
343  private static final class DescriptorIntPair {
344  private final Descriptor descriptor;
345  private final int number;
346 
347  DescriptorIntPair(final Descriptor descriptor, final int number) {
348  this.descriptor = descriptor;
349  this.number = number;
350  }
351 
352  @Override
353  public int hashCode() {
354  return descriptor.hashCode() * ((1 << 16) - 1) + number;
355  }
356 
357  @Override
358  public boolean equals(final Object obj) {
359  if (!(obj instanceof DescriptorIntPair)) {
360  return false;
361  }
362  final DescriptorIntPair other = (DescriptorIntPair) obj;
363  return descriptor == other.descriptor && number == other.number;
364  }
365  }
366 }
com.google.protobuf.Descriptors
Definition: Descriptors.java:80
google::protobuf::extension
const Descriptor::ReservedRange const EnumValueDescriptor const MethodDescriptor extension
Definition: src/google/protobuf/descriptor.h:2001
com.google.protobuf.ExtensionRegistry.add
void add(final Extension<?, ?> extension)
Definition: ExtensionRegistry.java:218
com.google.protobuf.Extension.ExtensionType
Definition: Extension.java:59
com.google.protobuf.ExtensionRegistry.DescriptorIntPair.descriptor
final Descriptor descriptor
Definition: ExtensionRegistry.java:344
com.google.protobuf.ExtensionRegistry.ExtensionInfo
Definition: ExtensionRegistry.java:110
com.google.protobuf.ExtensionRegistry.ExtensionRegistry
ExtensionRegistry(ExtensionRegistry other)
Definition: ExtensionRegistry.java:277
com.google.protobuf.ExtensionRegistry.mutableExtensionsByName
final Map< String, ExtensionInfo > mutableExtensionsByName
Definition: ExtensionRegistry.java:287
com.google.protobuf.ExtensionRegistry.ExtensionRegistry
ExtensionRegistry()
Definition: ExtensionRegistry.java:270
com.google.protobuf.Descriptors.FieldDescriptor.Type.MESSAGE
MESSAGE
Definition: Descriptors.java:1226
com.google.protobuf.ExtensionRegistry.getAllMutableExtensionsByExtendedType
Set< ExtensionInfo > getAllMutableExtensionsByExtendedType(final String fullName)
Definition: ExtensionRegistry.java:190
com.google.protobuf.ExtensionRegistry.getAllImmutableExtensionsByExtendedType
Set< ExtensionInfo > getAllImmutableExtensionsByExtendedType(final String fullName)
Definition: ExtensionRegistry.java:207
com.google.protobuf
Definition: ProtoCaliperBenchmark.java:2
com.google.protobuf.ExtensionRegistry.findImmutableExtensionByName
ExtensionInfo findImmutableExtensionByName(final String fullName)
Definition: ExtensionRegistry.java:143
com.google.protobuf.ExtensionRegistry.findMutableExtensionByNumber
ExtensionInfo findMutableExtensionByNumber(final Descriptor containingType, final int fieldNumber)
Definition: ExtensionRegistry.java:179
com.google.protobuf.GeneratedMessage.GeneratedExtension
Definition: GeneratedMessage.java:1757
com.google.protobuf.Descriptors.FieldDescriptor.Type
Definition: Descriptors.java:1215
com.google.protobuf.ExtensionRegistry.findImmutableExtensionByNumber
ExtensionInfo findImmutableExtensionByNumber(final Descriptor containingType, final int fieldNumber)
Definition: ExtensionRegistry.java:169
com.google.protobuf.ExtensionRegistry.DescriptorIntPair.equals
boolean equals(final Object obj)
Definition: ExtensionRegistry.java:358
com.google.protobuf.ExtensionRegistry.ExtensionInfo.ExtensionInfo
ExtensionInfo(final FieldDescriptor descriptor, final Message defaultInstance)
Definition: ExtensionRegistry.java:125
obj
GLsizei GLsizei GLuint * obj
Definition: glcorearb.h:3066
com.google.protobuf.ExtensionRegistry.add
void add(final FieldDescriptor type)
Definition: ExtensionRegistry.java:247
com.google.protobuf.ExtensionRegistry.DescriptorIntPair
Definition: ExtensionRegistry.java:343
com.google.protobuf.ExtensionRegistry.mutableExtensionsByNumber
final Map< DescriptorIntPair, ExtensionInfo > mutableExtensionsByNumber
Definition: ExtensionRegistry.java:289
com.google.protobuf.ExtensionRegistry.DescriptorIntPair.number
final int number
Definition: ExtensionRegistry.java:345
com.google.protobuf.ExtensionRegistry.immutableExtensionsByNumber
final Map< DescriptorIntPair, ExtensionInfo > immutableExtensionsByNumber
Definition: ExtensionRegistry.java:288
com.google.protobuf.ExtensionRegistry.ExtensionInfo.ExtensionInfo
ExtensionInfo(final FieldDescriptor descriptor)
Definition: ExtensionRegistry.java:120
com.google.protobuf.Descriptors.FieldDescriptor.JavaType
Definition: Descriptors.java:1262
com.google.protobuf.ExtensionRegistry.add
void add(final ExtensionInfo extension, final Extension.ExtensionType extensionType)
Definition: ExtensionRegistry.java:301
com.google.protobuf.ExtensionRegistry.add
void add(final GeneratedMessage.GeneratedExtension<?, ?> extension)
Definition: ExtensionRegistry.java:228
com.google.protobuf.GeneratedMessage
Definition: GeneratedMessage.java:61
com.google.protobuf.ExtensionRegistryLite
Definition: ExtensionRegistryLite.java:70
field
const FieldDescriptor * field
Definition: parser_unittest.cc:2694
com.google.protobuf.ExtensionRegistry.getEmptyRegistry
static ExtensionRegistry getEmptyRegistry()
Definition: ExtensionRegistry.java:98
java
com.google.protobuf.Descriptors.Descriptor
Definition: Descriptors.java:629
type
GLenum type
Definition: glcorearb.h:2695
com.google.protobuf.ExtensionRegistryLite.extensionsByNumber
final Map< ObjectIntPair, GeneratedMessageLite.GeneratedExtension<?, ?> > extensionsByNumber
Definition: ExtensionRegistryLite.java:208
com.google.protobuf.ExtensionRegistry.findExtensionByName
ExtensionInfo findExtensionByName(final String fullName)
Definition: ExtensionRegistry.java:133
com.google.protobuf.ExtensionRegistry.DescriptorIntPair.hashCode
int hashCode()
Definition: ExtensionRegistry.java:353
com.google.protobuf.Extension.ExtensionType.MUTABLE
MUTABLE
Definition: Extension.java:61
com.google.protobuf.ExtensionRegistry.ExtensionInfo.descriptor
final FieldDescriptor descriptor
Definition: ExtensionRegistry.java:112
com.google.protobuf.ExtensionRegistry.newInstance
static ExtensionRegistry newInstance()
Definition: ExtensionRegistry.java:93
com.google.protobuf.ExtensionRegistry.getUnmodifiable
ExtensionRegistry getUnmodifiable()
Definition: ExtensionRegistry.java:105
com.google
com
com.google.protobuf.ExtensionRegistry.immutableExtensionsByName
final Map< String, ExtensionInfo > immutableExtensionsByName
Definition: ExtensionRegistry.java:286
com.google.protobuf.ExtensionRegistry
Definition: ExtensionRegistry.java:91
com.google.protobuf.Extension
Definition: Extension.java:39
com.google.protobuf.ExtensionRegistry.findMutableExtensionByName
ExtensionInfo findMutableExtensionByName(final String fullName)
Definition: ExtensionRegistry.java:153
com.google.protobuf.ExtensionRegistry.ExtensionInfo.defaultInstance
final Message defaultInstance
Definition: ExtensionRegistry.java:118
com.google.protobuf.ExtensionRegistry.findExtensionByNumber
ExtensionInfo findExtensionByNumber(final Descriptor containingType, final int fieldNumber)
Definition: ExtensionRegistry.java:159
com.google.protobuf.ExtensionRegistry.add
void add(final FieldDescriptor type, final Message defaultInstance)
Definition: ExtensionRegistry.java:259
com.google.protobuf.Extension.ExtensionType.IMMUTABLE
IMMUTABLE
Definition: Extension.java:60
com.google.protobuf.Message
Definition: Message.java:50
com.google.protobuf.Descriptors.FieldDescriptor
Definition: Descriptors.java:949
com.google.protobuf.Descriptors.FieldDescriptor.JavaType.MESSAGE
MESSAGE
Definition: Descriptors.java:1271


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:51