下面列出了com.google.protobuf.Descriptors#GenericDescriptor ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private <T extends Descriptors.GenericDescriptor> void diffGenericDescriptor(
List<T> mt_ref,
List<T> mt_new,
Consumer<T> removal,
Consumer<T> addition,
BiConsumer<T, T> diff) {
Map<String, T> m_ref = toMap4Descriptor(mt_ref);
Map<String, T> m_new = toMap4Descriptor(mt_new);
Set<String> onlyRef = onlyInLeft(m_ref, m_new);
onlyRef.forEach(k -> removal.accept(m_ref.get(k)));
Set<String> onlyNew = onlyInLeft(m_new, m_ref);
onlyNew.forEach(k -> addition.accept(m_new.get(k)));
Set<String> common = onlyInCommon(m_new, m_ref);
common.forEach(k -> diff.accept(m_ref.get(k), m_new.get(k)));
}
private static Router<Message> dynamicRouter(JsonNode router) {
String addressTemplate = Selectors.textAt(router, Pointers.Routers.SPEC_TARGET);
String descriptorSetPath = Selectors.textAt(router, Pointers.Routers.SPEC_DESCRIPTOR);
String messageType = Selectors.textAt(router, Pointers.Routers.SPEC_MESSAGE_TYPE);
ProtobufDescriptorMap descriptorPath = protobufDescriptorMap(descriptorSetPath);
Optional<Descriptors.GenericDescriptor> maybeDescriptor =
descriptorPath.getDescriptorByName(messageType);
if (!maybeDescriptor.isPresent()) {
throw new IllegalStateException(
"Error while processing a router definition. Unable to locate a message "
+ messageType
+ " in a descriptor set "
+ descriptorSetPath);
}
return ProtobufRouter.forAddressTemplate(
(Descriptors.Descriptor) maybeDescriptor.get(), addressTemplate);
}
private static Router<Message> dynamicRouter(JsonNode router) {
String addressTemplate = Selectors.textAt(router, SpecPointers.TARGET);
String descriptorSetPath = Selectors.textAt(router, SpecPointers.DESCRIPTOR);
String messageType = Selectors.textAt(router, SpecPointers.MESSAGE_TYPE);
ProtobufDescriptorMap descriptorPath = protobufDescriptorMap(descriptorSetPath);
Optional<Descriptors.GenericDescriptor> maybeDescriptor =
descriptorPath.getDescriptorByName(messageType);
if (!maybeDescriptor.isPresent()) {
throw new IllegalStateException(
"Error while processing a router definition. Unable to locate a message "
+ messageType
+ " in a descriptor set "
+ descriptorSetPath);
}
return ProtobufRouter.forAddressTemplate(
(Descriptors.Descriptor) maybeDescriptor.get(), addressTemplate);
}
@Inject
Renderer(
Provider<SoyFileSet.Builder> filesetBuilderProvider,
ImmutableSet<Descriptors.GenericDescriptor> descriptors,
JsonRenderer jsonRenderer) {
this.filesetBuilderProvider = filesetBuilderProvider;
this.tofu =
filesetBuilderProvider
.get()
.add(Renderer.class.getResource("resources/types.soy"))
.add(Renderer.class.getResource("resources/dossier.soy"))
.addProtoDescriptors(descriptors)
.build()
.compileToTofu();
this.jsonRenderer = jsonRenderer;
}
private <T extends Descriptors.GenericDescriptor> Map<String, T> toMap4Descriptor(List<T> in) {
Map<String, T> out = new HashMap<>();
in.forEach(
descriptor -> {
out.put(descriptor.getName(), descriptor);
});
return out;
}
public static ProtobufDescriptorMap from(DescriptorProtos.FileDescriptorSet fileDescriptorSet) {
Map<String, Descriptors.FileDescriptor> resolvedSet =
FileDescriptorResolver.resolve(fileDescriptorSet);
Map<String, Descriptors.GenericDescriptor> messageOrEnumDescriptors = new HashMap<>();
for (Descriptors.FileDescriptor fileDescriptor : resolvedSet.values()) {
addMessages(messageOrEnumDescriptors, fileDescriptor, packageName(fileDescriptor));
addEnums(messageOrEnumDescriptors, fileDescriptor, packageName(fileDescriptor));
}
return new ProtobufDescriptorMap(messageOrEnumDescriptors);
}
private static void addMessages(
Map<String, Descriptors.GenericDescriptor> descriptors,
Descriptors.FileDescriptor proto,
String packageName) {
for (Descriptors.Descriptor message : proto.getMessageTypes()) {
String fullName = packageName + message.getName();
descriptors.put(fullName, message);
}
}
private static void addEnums(
Map<String, Descriptors.GenericDescriptor> descriptors,
Descriptors.FileDescriptor descriptor,
String packageName) {
for (Descriptors.EnumDescriptor message : descriptor.getEnumTypes()) {
String fullName = packageName + message.getName();
descriptors.put(fullName, message);
}
}
public static ProtobufDescriptorMap from(DescriptorProtos.FileDescriptorSet fileDescriptorSet) {
Map<String, Descriptors.FileDescriptor> resolvedSet =
FileDescriptorResolver.resolve(fileDescriptorSet);
Map<String, Descriptors.GenericDescriptor> messageOrEnumDescriptors = new HashMap<>();
for (Descriptors.FileDescriptor fileDescriptor : resolvedSet.values()) {
addMessages(messageOrEnumDescriptors, fileDescriptor, packageName(fileDescriptor));
addEnums(messageOrEnumDescriptors, fileDescriptor, packageName(fileDescriptor));
}
return new ProtobufDescriptorMap(messageOrEnumDescriptors);
}
private static void addMessages(
Map<String, Descriptors.GenericDescriptor> descriptors,
Descriptors.FileDescriptor proto,
String packageName) {
for (Descriptors.Descriptor message : proto.getMessageTypes()) {
String fullName = packageName + message.getName();
descriptors.put(fullName, message);
}
}
private static void addEnums(
Map<String, Descriptors.GenericDescriptor> descriptors,
Descriptors.FileDescriptor descriptor,
String packageName) {
for (Descriptors.EnumDescriptor message : descriptor.getEnumTypes()) {
String fullName = packageName + message.getName();
descriptors.put(fullName, message);
}
}
@Provides
@Singleton
ImmutableSet<Descriptors.GenericDescriptor> provideProtoDescriptors() {
return ImmutableSet.copyOf(
collectDescriptors(
DescriptorProtos.getDescriptor(), Dossier.getDescriptor(), Expression.getDescriptor()));
}
private static Set<Descriptors.GenericDescriptor> collectDescriptors(
Descriptors.FileDescriptor... fileDescriptors) {
Set<Descriptors.GenericDescriptor> set = new HashSet<>();
for (Descriptors.FileDescriptor file : fileDescriptors) {
set.addAll(file.getEnumTypes());
for (Descriptors.Descriptor descriptor : file.getMessageTypes()) {
collectDescriptors(set, descriptor);
}
}
return set;
}
private static void collectDescriptors(
Set<Descriptors.GenericDescriptor> set, Descriptors.Descriptor descriptor) {
if (!set.add(descriptor)) {
return;
}
set.addAll(descriptor.getEnumTypes());
for (Descriptors.FieldDescriptor field : descriptor.getFields()) {
if (field.getJavaType() == Descriptors.FieldDescriptor.JavaType.MESSAGE) {
collectDescriptors(set, field.getMessageType());
}
}
}
private ProtobufDescriptorMap(Map<String, Descriptors.GenericDescriptor> descriptorByName) {
this.descriptorByName = descriptorByName;
}
public Optional<Descriptors.GenericDescriptor> getDescriptorByName(String messageFullName) {
Descriptors.GenericDescriptor descriptor = descriptorByName.get(messageFullName);
return Optional.ofNullable(descriptor);
}
private ProtobufDescriptorMap(Map<String, Descriptors.GenericDescriptor> descriptorByName) {
this.descriptorByName = descriptorByName;
}
public Optional<Descriptors.GenericDescriptor> getDescriptorByName(String messageFullName) {
Descriptors.GenericDescriptor descriptor = descriptorByName.get(messageFullName);
return Optional.ofNullable(descriptor);
}
public static void main(String[] args) throws IOException {
checkArgument(args.length > 0, "no output directory specified");
Path outputDir = FileSystems.getDefault().getPath(args[0]);
checkArgument(Files.isDirectory(outputDir), "not a directory: %s", outputDir);
Injector injector = Guice.createInjector(new DossierSoyModule());
ImmutableSet<Descriptors.GenericDescriptor> descriptors =
injector.getInstance(
Key.get(new TypeLiteral<ImmutableSet<Descriptors.GenericDescriptor>>() {}));
SoyFileSet fileSet =
injector
.getInstance(SoyFileSet.Builder.class)
.add(Renderer.class.getResource("resources/dossier.soy"))
.add(Renderer.class.getResource("resources/nav.soy"))
.add(Renderer.class.getResource("resources/types.soy"))
.addProtoDescriptors(descriptors)
.build();
SoyJsSrcOptions options = new SoyJsSrcOptions();
options.setShouldGenerateGoogModules(true);
Pattern googModulePattern = Pattern.compile("(goog\\.module\\('.*'\\);)");
String missingContent =
"\n/** @suppress {extraRequire} */\n"
+ "goog.require('dossier.soyplugins');\n"
+ "/** @suppress {extraRequire} */\n"
+ "goog.require('goog.soy.data.SanitizedContent');\n";
Iterator<Path> files =
ImmutableList.of(
outputDir.resolve("dossier.soy.js"),
outputDir.resolve("nav.soy.js"),
outputDir.resolve("types.soy.js"))
.iterator();
for (String string : fileSet.compileToJsSrc(options, null)) {
Matcher matcher = googModulePattern.matcher(string);
if (matcher.find()) {
string = matcher.replaceFirst("$1\n" + missingContent);
}
Path file = files.next();
Files.write(file, string.getBytes(StandardCharsets.UTF_8));
}
}