Java tutorial
/* Copyright 2016 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.api.codegen.config; import com.google.api.codegen.ConfigProto; import com.google.api.codegen.ResourceNameMessageConfigProto; import com.google.api.codegen.discogapic.transformer.DiscoGapicNamer; import com.google.api.codegen.discovery.Method; import com.google.api.codegen.discovery.Schema; import com.google.api.tools.framework.model.Field; import com.google.api.tools.framework.model.MessageType; import com.google.api.tools.framework.model.Model; import com.google.api.tools.framework.model.ProtoFile; import com.google.auto.value.AutoValue; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ListMultimap; import java.util.HashSet; import java.util.Set; import javax.annotation.Nullable; /** Configuration of the resource name types for all message field. */ @AutoValue public abstract class ResourceNameMessageConfigs { abstract ImmutableMap<String, ResourceNameMessageConfig> getResourceTypeConfigMap(); /** * Get a map from fully qualified message names to Fields, where each field has a resource name * defined. */ public abstract ListMultimap<String, FieldModel> getFieldsWithResourceNamesByMessage(); @Nullable public static ResourceNameMessageConfigs createMessageResourceTypesConfig(Model model, ConfigProto configProto, String defaultPackage) { ImmutableMap.Builder<String, ResourceNameMessageConfig> builder = ImmutableMap.builder(); for (ResourceNameMessageConfigProto messageResourceTypesProto : configProto .getResourceNameGenerationList()) { ResourceNameMessageConfig messageResourceTypeConfig = ResourceNameMessageConfig .createResourceNameMessageConfig(model.getDiagCollector(), messageResourceTypesProto, defaultPackage); builder.put(messageResourceTypeConfig.messageName(), messageResourceTypeConfig); } ImmutableMap<String, ResourceNameMessageConfig> messageResourceTypeConfigMap = builder.build(); ListMultimap<String, FieldModel> fieldsByMessage = ArrayListMultimap.create(); Set<String> seenProtoFiles = new HashSet<>(); for (ProtoFile protoFile : model.getFiles()) { if (!seenProtoFiles.contains(protoFile.getSimpleName())) { seenProtoFiles.add(protoFile.getSimpleName()); for (MessageType msg : protoFile.getMessages()) { ResourceNameMessageConfig messageConfig = messageResourceTypeConfigMap.get(msg.getFullName()); if (messageConfig == null) { continue; } for (Field field : msg.getFields()) { if (messageConfig.getEntityNameForField(field.getSimpleName()) != null) { fieldsByMessage.put(msg.getFullName(), new ProtoField(field)); } } } } } return new AutoValue_ResourceNameMessageConfigs(messageResourceTypeConfigMap, fieldsByMessage); } static ResourceNameMessageConfigs createMessageResourceTypesConfig(DiscoApiModel model, ConfigProto configProto, String defaultPackage) { ImmutableMap.Builder<String, ResourceNameMessageConfig> builder = ImmutableMap.builder(); for (ResourceNameMessageConfigProto messageResourceTypesProto : configProto .getResourceNameGenerationList()) { ResourceNameMessageConfig messageResourceTypeConfig = ResourceNameMessageConfig .createResourceNameMessageConfig(model.getDiagCollector(), messageResourceTypesProto, defaultPackage); builder.put(messageResourceTypeConfig.messageName(), messageResourceTypeConfig); } ImmutableMap<String, ResourceNameMessageConfig> messageResourceTypeConfigMap = builder.build(); ListMultimap<String, FieldModel> fieldsByMessage = ArrayListMultimap.create(); DiscoGapicNamer discoGapicNamer = new DiscoGapicNamer(); for (Method method : model.getDocument().methods()) { String fullName = discoGapicNamer.getRequestMessageFullName(method, defaultPackage); ResourceNameMessageConfig messageConfig = messageResourceTypeConfigMap.get(fullName); if (messageConfig == null) { continue; } for (Schema property : method.parameters().values()) { if (messageConfig.getEntityNameForField(property.getIdentifier()) != null) { fieldsByMessage.put(fullName, DiscoveryField.create(property, model)); } } } return new AutoValue_ResourceNameMessageConfigs(messageResourceTypeConfigMap, fieldsByMessage); } public boolean isEmpty() { return getResourceTypeConfigMap().isEmpty(); } public boolean fieldHasResourceName(FieldModel field) { return fieldHasResourceName(field.getParentFullName(), field.getSimpleName()); } public boolean fieldHasResourceName(String messageFullName, String fieldSimpleName) { return getResourceNameOrNullForField(messageFullName, fieldSimpleName) != null; } public String getFieldResourceName(FieldModel field) { return getFieldResourceName(field.getParentFullName(), field.getSimpleName()); } public String getFieldResourceName(String messageSimpleName, String fieldSimpleName) { if (!fieldHasResourceName(messageSimpleName, fieldSimpleName)) { throw new IllegalArgumentException("Field " + fieldSimpleName + " of message " + messageSimpleName + " does not have a resource name."); } return getResourceNameOrNullForField(messageSimpleName, fieldSimpleName); } private String getResourceNameOrNullForField(String messageSimpleName, String fieldSimpleName) { ResourceNameMessageConfig messageResourceTypeConfig = getResourceTypeConfigMap().get(messageSimpleName); if (messageResourceTypeConfig == null) { return null; } return messageResourceTypeConfig.getEntityNameForField(fieldSimpleName); } }