@Override public Map<String, FileDescriptor> parse(FileDescriptorSource fileDescriptorSource) throws DescriptorParserException { Map<String, char[]> input = fileDescriptorSource.getFileDescriptors(); Map<String, FileDescriptor> fileDescriptorMap = new LinkedHashMap<>(input.size()); for (Map.Entry<String, char[]> entry : input.entrySet()) { String fileName = entry.getKey(); try { ProtoFile protoFile = ProtoParser.parse(fileName, new CharArrayReader(entry.getValue())); checkUniqueFileOptions(protoFile); FileDescriptor fileDescriptor = PROTOFILE_MAPPER.map(protoFile); fileDescriptor.setConfiguration(configuration); fileDescriptorMap.put(fileName, fileDescriptor); } catch (DescriptorParserException e) { reportParsingError(fileDescriptorSource, fileDescriptorMap, fileName, e); } catch (IOException | RuntimeException e) { reportParsingError(fileDescriptorSource, fileDescriptorMap, fileName, new DescriptorParserException(e)); } } return fileDescriptorMap; }
@Override public void registerProtoFiles(FileDescriptorSource source) throws DescriptorParserException { if (log.isDebugEnabled()) { log.debugf("Registering proto files : %s", source.getFileDescriptors().keySet()); } Map<String, FileDescriptor> fileDescriptorMap = parser.parse(source); writeLock.lock(); try { // unregister all types from the files that are being overwritten for (String fileName : fileDescriptorMap.keySet()) { FileDescriptor oldFileDescriptor = fileDescriptors.get(fileName); if (oldFileDescriptor != null) { unregisterFileDescriptorTypes(oldFileDescriptor); } } fileDescriptors.putAll(fileDescriptorMap); // resolve imports and types for all files ResolutionContext resolutionContext = new ResolutionContext(source.getProgressCallback(), fileDescriptors, genericDescriptors, typeIds, enumValueDescriptors); resolutionContext.resolve(); } finally { writeLock.unlock(); } }