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);
}
}