/**
  * Loads a Protobuf file descriptor set into an ubermap of file descriptors.
  *
  * @param set FileDescriptorSet
  * @param dependenciesMap FileDescriptor dependency map
  * @param fileDescriptorMap The populated map of FileDescriptors
  * @throws StageException
  */
 public static void getAllFileDescriptors(
     DescriptorProtos.FileDescriptorSet set,
     Map<String, Set<Descriptors.FileDescriptor>> dependenciesMap,
     Map<String, Descriptors.FileDescriptor> fileDescriptorMap)
     throws StageException {
   List<DescriptorProtos.FileDescriptorProto> fileList = set.getFileList();
   try {
     for (DescriptorProtos.FileDescriptorProto fdp : fileList) {
       if (!fileDescriptorMap.containsKey(fdp.getName())) {
         Set<Descriptors.FileDescriptor> dependencies = dependenciesMap.get(fdp.getName());
         if (dependencies == null) {
           dependencies = new LinkedHashSet<>();
           dependenciesMap.put(fdp.getName(), dependencies);
           dependencies.addAll(getDependencies(dependenciesMap, fileDescriptorMap, fdp, set));
         }
         Descriptors.FileDescriptor fileDescriptor =
             Descriptors.FileDescriptor.buildFrom(
                 fdp, dependencies.toArray(new Descriptors.FileDescriptor[dependencies.size()]));
         fileDescriptorMap.put(fdp.getName(), fileDescriptor);
       }
     }
   } catch (Descriptors.DescriptorValidationException e) {
     throw new StageException(Errors.PROTOBUF_07, e.getDescription(), e);
   }
 }
예제 #2
0
  /**
   * Returns a Message {@link Descriptor} for a dynamically generated DescriptorProto.
   *
   * @param descProto
   * @throws DescriptorValidationException
   */
  public static Descriptor makeMessageDescriptor(DescriptorProto descProto)
      throws DescriptorValidationException {

    DescriptorProtos.FileDescriptorProto fileDescP =
        DescriptorProtos.FileDescriptorProto.newBuilder().addMessageType(descProto).build();

    Descriptors.FileDescriptor[] fileDescs = new Descriptors.FileDescriptor[0];
    Descriptors.FileDescriptor dynamicDescriptor =
        Descriptors.FileDescriptor.buildFrom(fileDescP, fileDescs);
    return dynamicDescriptor.findMessageTypeByName(descProto.getName());
  }
 private static Set<Descriptors.FileDescriptor> getDependencies(
     Map<String, Set<Descriptors.FileDescriptor>> dependenciesMap,
     Map<String, Descriptors.FileDescriptor> fileDescriptorMap,
     DescriptorProtos.FileDescriptorProto file,
     DescriptorProtos.FileDescriptorSet set)
     throws StageException {
   Set<Descriptors.FileDescriptor> result = new LinkedHashSet<>();
   for (String name : file.getDependencyList()) {
     DescriptorProtos.FileDescriptorProto fileDescriptorProto = null;
     for (DescriptorProtos.FileDescriptorProto fdp : set.getFileList()) {
       if (name.equals(fdp.getName())) {
         fileDescriptorProto = fdp;
         break;
       }
     }
     if (fileDescriptorProto == null) {
       // could not find the message type from all the proto files contained in the descriptor file
       throw new StageException(Errors.PROTOBUF_01, file.getName());
     }
     Descriptors.FileDescriptor fileDescriptor;
     if (fileDescriptorMap.containsKey(fileDescriptorProto.getName())) {
       fileDescriptor = fileDescriptorMap.get(fileDescriptorProto.getName());
     } else {
       Set<Descriptors.FileDescriptor> deps = new LinkedHashSet<>();
       if (dependenciesMap.containsKey(name)) {
         deps.addAll(dependenciesMap.get(name));
       } else {
         deps.addAll(
             getDependencies(dependenciesMap, fileDescriptorMap, fileDescriptorProto, set));
       }
       try {
         fileDescriptor =
             Descriptors.FileDescriptor.buildFrom(
                 fileDescriptorProto, deps.toArray(new Descriptors.FileDescriptor[deps.size()]));
       } catch (Descriptors.DescriptorValidationException e) {
         throw new StageException(Errors.PROTOBUF_07, e.getDescription(), e);
       }
     }
     result.add(fileDescriptor);
   }
   return result;
 }