public void execute()

in plugins/templates-maven-plugin/src/main/java/com/google/cloud/teleport/plugin/maven/TemplatesReleaseFinishMojo.java [92:241]


  public void execute() {

    if (librariesBucketName == null || librariesBucketName.isEmpty()) {
      librariesBucketName = bucketName;
    }

    File projectFolder = project.getParentFile();
    if (projectFolder == null) {
      projectFolder = new File(System.getProperty("user.dir"));
      LOG.warn("Project folder is null. Using current directory instead.");
    }
    while (projectFolder.getParentFile() != null
        && new File(projectFolder.getParentFile(), "pom.xml").exists()) {
      projectFolder = projectFolder.getParentFile();
    }

    LOG.info("Wrapping up release. Folder to look: {}", projectFolder);

    final PathMatcher pathMatcher =
        FileSystems.getDefault().getPathMatcher("glob:**/target/*-generated-metadata.json");
    final PathMatcher specPathMatcher =
        FileSystems.getDefault().getPathMatcher("glob:**/target/*-spec-generated-metadata.json");
    final Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();

    // Using LinkedHashMap to preserve ordering
    Map<String, TemplatesCategoryJson> categories = new LinkedHashMap<>();
    for (TemplateCategory category : TemplateCategory.ORDERED) {
      categories.put(
          category.getName(),
          new TemplatesCategoryJson(category.getName(), category.getDisplayName()));
    }

    try {
      Set<String> templateNames = new HashSet<>();

      Files.walkFileTree(
          projectFolder.toPath(),
          new SimpleFileVisitor<>() {

            @Override
            public FileVisitResult visitFile(Path path, BasicFileAttributes attrs)
                throws FileNotFoundException {
              // Match metadata but not spec metadata, as the latter is only for Flex
              if (!pathMatcher.matches(path) || specPathMatcher.matches(path)) {
                return FileVisitResult.CONTINUE;
              }

              ImageSpecMetadata imageSpec =
                  gson.fromJson(new FileReader(path.toFile()), ImageSpecMetadata.class);

              // If the template is hidden, or same template is scanned twice in the classpath
              // (which happens for submodules), just log and ignore.
              if (imageSpec.isHidden() || !templateNames.add(imageSpec.getInternalName())) {
                LOG.info(
                    "Skipping template {} from spec file: {}", imageSpec.getInternalName(), path);
                return FileVisitResult.CONTINUE;
              }

              LOG.info(
                  "Processing metadata Spec File: {}, template: {}", path, imageSpec.getName());

              TemplatesCategoryJsonTemplate template = new TemplatesCategoryJsonTemplate();
              template.setName(imageSpec.getInternalName());
              template.setDisplayName(imageSpec.getName());
              template.setTemplateType(imageSpec.isFlexTemplate() ? "FLEX" : "LEGACY");

              TemplatesCategoryJson categoryJson =
                  categories.get(imageSpec.getCategory().getName());
              if (categoryJson == null) {
                throw new IllegalArgumentException(
                    "Category " + imageSpec.getCategory().getName() + " is invalid.");
              }
              categoryJson.getTemplates().add(template);

              return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) {
              return FileVisitResult.CONTINUE;
            }
          });

      synchronized (TemplatesReleaseFinishMojo.class) {
        final TemplatesCategoryJsonModel categoryJsonModel = new TemplatesCategoryJsonModel();
        categoryJsonModel.setCategories(categories.values());

        // Sort all templates by name
        for (TemplatesCategoryJson categoryJson : categories.values()) {
          categoryJson
              .getTemplates()
              .sort(Comparator.comparing(TemplatesCategoryJsonTemplate::getDisplayName));
        }

        File categoriesFile = new File(targetDirectory, "categories.json");
        FileWriter out = new FileWriter(categoriesFile);
        out.write(gson.toJson(categoryJsonModel));
        out.close();

        String categoriesPath =
            "gs://"
                + bucketNameOnly(bucketName)
                + "/"
                + stagePrefix
                + "/ui_metadata/categories.json";

        String[] copyCmd =
            new String[] {
              "gcloud",
              "storage",
              "cp",
              categoriesFile.getAbsolutePath(),
              categoriesPath,
              "--project",
              projectId,
            };
        LOG.info("Running: {}", String.join(" ", copyCmd));

        Process process = Runtime.getRuntime().exec(copyCmd);

        if (process.waitFor() != 0) {
          throw new RuntimeException(
              "Error copying metadata using 'gcloud storage'. Please make sure it is up to date. "
                  + new String(process.getInputStream().readAllBytes(), StandardCharsets.UTF_8)
                  + "\n"
                  + new String(process.getErrorStream().readAllBytes(), StandardCharsets.UTF_8));
        }

        // Write the index with all templates
        System.out.println("---- List of Templates for README.md ----");

        for (TemplatesCategoryJson categoryJson : categories.values()) {
          System.out.println("- " + categoryJson.getCategory().getDisplayName());
          for (TemplatesCategoryJsonTemplate template : categoryJson.getTemplates()) {
            System.out.println(
                "  - ["
                    + template.getDisplayName()
                    + "](https://github.com/search?q=repo%3AGoogleCloudPlatform%2FDataflowTemplates%20"
                    + template.getName()
                    + "&type=code)");
          }
        }
      }

    } catch (IOException e) {
      throw new RuntimeException("Error looking for metadata files", e);
    } catch (InterruptedException e) {
      throw new RuntimeException("Error creating categories file", e);
    }
  }