/** * 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); } }
/** * 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; }