2323import java .util .stream .Collectors ;
2424import java .util .stream .Stream ;
2525
26+ import static jakarta .json .Json .createArrayBuilder ;
27+ import static jakarta .json .Json .createObjectBuilder ;
2628import static java .lang .System .Logger .Level .DEBUG ;
2729
2830public 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