Skip to content

Commit 609bd5f

Browse files
committed
feat: Enhance metadata generation with HATEOAS links and simplify structure
1 parent 841de95 commit 609bd5f

File tree

1 file changed

+47
-16
lines changed

1 file changed

+47
-16
lines changed

build/main/java/org/greencodeinitiative/tools/exporter/infra/MetadataWriter.java

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import java.util.stream.Collectors;
2424
import java.util.stream.Stream;
2525

26+
import static jakarta.json.Json.createArrayBuilder;
27+
import static jakarta.json.Json.createObjectBuilder;
2628
import static java.lang.System.Logger.Level.DEBUG;
2729

2830
public class MetadataWriter implements Runnable {
@@ -53,18 +55,46 @@ public void run() {
5355
var rulesMap = new TreeMap<String, JsonObjectBuilder>();
5456

5557
getResourcesToCopy().forEach(rule -> {
56-
var rulesByLanguage = rulesMap.computeIfAbsent(rule.ruleKey(), k -> Json.createObjectBuilder());
58+
var rulesByLanguage = rulesMap.computeIfAbsent(rule.ruleKey(), k -> createObjectBuilder());
5759
var resultMetadata = mergeOrCopyJsonMetadata(rule.metadata(), rule.specificMetadata(), rule.getMetadataTargetPath(targetDir));
5860

5961
var htmlDescriptionRelativePath = this.indexFilepath.getParent()
6062
.relativize(rule.getHtmlDescriptionTargetPath(targetDir))
6163
.toString();
62-
var resultMetadataBuilder = Json.createObjectBuilder(resultMetadata);
63-
resultMetadataBuilder.add("key", rule.ruleKey());
64-
resultMetadataBuilder.add("language", rule.language());
65-
resultMetadataBuilder.add("severity", resultMetadata.getString("defaultSeverity").toUpperCase(Locale.ENGLISH));
66-
resultMetadataBuilder.add("htmlDescription", htmlDescriptionRelativePath);
67-
resultMetadataBuilder.add("terms", extractTermsFromHtmlFile(rule.htmlDescription()));
64+
65+
var metadataRelativePath = this.indexFilepath.getParent()
66+
.relativize(rule.getMetadataTargetPath(targetDir))
67+
.toString();
68+
69+
var resultMetadataBuilder = createObjectBuilder()
70+
.add("key", rule.ruleKey())
71+
.add("language", rule.language())
72+
.add(
73+
"links",
74+
createArrayBuilder()
75+
.add(createObjectBuilder()
76+
.add("rel", "description")
77+
.add("title", resultMetadata.get("title"))
78+
.add("hreflang", "en")
79+
.add("href", htmlDescriptionRelativePath))
80+
.add(createObjectBuilder()
81+
.add("rel", "metadata")
82+
.add("href", metadataRelativePath))
83+
)
84+
.add(
85+
"terms",
86+
createObjectBuilder()
87+
.add("en", extractTermsFromHtmlFile(rule.htmlDescription()))
88+
);
89+
90+
List
91+
.of(
92+
"type",
93+
"status",
94+
"tags",
95+
"defaultSeverity"
96+
)
97+
.forEach(key -> resultMetadataBuilder.add(key, resultMetadata.get(key)));
6898

6999
rulesByLanguage.add(rule.language(), resultMetadataBuilder);
70100
copyFile(rule.htmlDescription(), rule.getHtmlDescriptionTargetPath(targetDir));
@@ -82,7 +112,7 @@ private String extractTermsFromHtmlFile(Path htmlFile) {
82112
.toLowerCase(Locale.ENGLISH)
83113
.replaceAll("[^a-zA-Z0-9]", " ")
84114
.trim()
85-
.split("[\\s\\n\\r]+")
115+
.split("\\s+")
86116
)
87117
.filter(term -> term.length() >= minTermLength)
88118
.distinct()
@@ -94,19 +124,21 @@ private String extractTermsFromHtmlFile(Path htmlFile) {
94124
}
95125

96126
private String removeDiacritics(String text) {
97-
Normalizer.normalize(text, Normalizer.Form.NFKD);
98-
return text.replaceAll("[^\\p{ASCII}]", "").replaceAll("\\p{M}", "");
127+
return Normalizer
128+
.normalize(text, Normalizer.Form.NFKD)
129+
.replaceAll("[^\\p{ASCII}]", "")
130+
.replaceAll("\\p{M}", "");
99131
}
100132

101133
private void writeIndexFile(TreeMap<String, JsonObjectBuilder> rulesMap) {
102134
if (indexFilepath == null) {
103135
return;
104136
}
105-
var rules = Json.createObjectBuilder();
137+
var rules = createObjectBuilder();
106138
rulesMap.forEach(rules::add);
107-
var result = Json.createObjectBuilder();
139+
var result = createObjectBuilder();
108140

109-
var specification = Json.createObjectBuilder();
141+
var specification = createObjectBuilder();
110142
this.specificationInfo.forEach(specification::add);
111143
result.add("specification", specification);
112144

@@ -124,8 +156,7 @@ private List<Rule> getResourcesToCopy() {
124156
return stream
125157
.filter(Files::isRegularFile)
126158
.map(Rule::createFromHtmlDescription)
127-
.filter(Optional::isPresent)
128-
.map(Optional::get)
159+
.flatMap(Optional::stream)
129160
.collect(Collectors.toList());
130161
} catch (IOException e) {
131162
throw new IllegalStateException(e);
@@ -178,7 +209,7 @@ private void copyFile(Path source, Path target) {
178209
LOGGER.log(DEBUG, "Copy: {0} -> {1}", source, target);
179210
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
180211
} catch (IOException e) {
181-
throw new ProcessException("unable to copy '" + source + "' to '" + target + "'", e);
212+
throw new ProcessException("Unable to copy '" + source + "' to '" + target + "'", e);
182213
}
183214
}
184215
}

0 commit comments

Comments
 (0)