1 // Copyright 2020 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 package com.google.api.generator.gapic.protoparser;
16 
17 import com.google.api.generator.gapic.model.GapicLanguageSettings;
18 import com.google.common.annotations.VisibleForTesting;
19 import com.google.common.base.Strings;
20 import java.io.File;
21 import java.io.IOException;
22 import java.nio.charset.StandardCharsets;
23 import java.nio.file.Files;
24 import java.nio.file.Paths;
25 import java.util.Map;
26 import java.util.Optional;
27 import org.yaml.snakeyaml.LoaderOptions;
28 import org.yaml.snakeyaml.Yaml;
29 import org.yaml.snakeyaml.constructor.SafeConstructor;
30 
31 public class GapicLanguageSettingsParser {
32   private static final String YAML_KEY_LANGUAGE_SETTINGS = "language_settings";
33   private static final String YAML_KEY_JAVA = "java";
34   private static final String YAML_KEY_PACKAGE_NAME = "package_name";
35   private static final String YAML_KEY_INTERFACE_NAMES = "interface_names";
36 
parse(Optional<String> gapicYamlConfigFilePathOpt)37   public static Optional<GapicLanguageSettings> parse(Optional<String> gapicYamlConfigFilePathOpt) {
38     return gapicYamlConfigFilePathOpt.isPresent()
39         ? parse(gapicYamlConfigFilePathOpt.get())
40         : Optional.empty();
41   }
42 
43   @VisibleForTesting
parse(String gapicYamlConfigFilePath)44   static Optional<GapicLanguageSettings> parse(String gapicYamlConfigFilePath) {
45     if (Strings.isNullOrEmpty(gapicYamlConfigFilePath)
46         || !(new File(gapicYamlConfigFilePath)).exists()) {
47       return Optional.empty();
48     }
49 
50     String fileContents = null;
51 
52     try {
53       fileContents =
54           new String(
55               Files.readAllBytes(Paths.get(gapicYamlConfigFilePath)), StandardCharsets.UTF_8);
56     } catch (IOException e) {
57       return Optional.empty();
58     }
59 
60     Yaml yaml = new Yaml(new SafeConstructor(new LoaderOptions()));
61     Map<String, Object> yamlMap = yaml.load(fileContents);
62     return parseFromMap(yamlMap);
63   }
64 
parseFromMap(Map<String, Object> yamlMap)65   private static Optional<GapicLanguageSettings> parseFromMap(Map<String, Object> yamlMap) {
66     if (!yamlMap.containsKey(YAML_KEY_LANGUAGE_SETTINGS)) {
67       return Optional.empty();
68     }
69 
70     Map<String, Object> languageYamlConfig =
71         (Map<String, Object>) yamlMap.get(YAML_KEY_LANGUAGE_SETTINGS);
72     if (!languageYamlConfig.containsKey(YAML_KEY_JAVA)) {
73       return Optional.empty();
74     }
75 
76     Map<String, Object> javaYamlConfig =
77         (Map<String, Object>) languageYamlConfig.get(YAML_KEY_JAVA);
78     if (!javaYamlConfig.containsKey(YAML_KEY_PACKAGE_NAME)) {
79       return Optional.empty();
80     }
81 
82     GapicLanguageSettings.Builder gapicLanguageSettingsBuilder =
83         GapicLanguageSettings.builder()
84             .setPakkage((String) javaYamlConfig.get(YAML_KEY_PACKAGE_NAME));
85 
86     if (!javaYamlConfig.containsKey(YAML_KEY_INTERFACE_NAMES)) {
87       return Optional.of(gapicLanguageSettingsBuilder.build());
88     }
89 
90     return Optional.of(
91         gapicLanguageSettingsBuilder
92             .setProtoServiceToJavaClassname(
93                 (Map<String, String>) javaYamlConfig.get(YAML_KEY_INTERFACE_NAMES))
94             .build());
95   }
96 }
97