Github user JaroslavTulach commented on a diff in the pull request:
https://github.com/apache/incubator-netbeans/pull/70#discussion_r143318262
--- Diff:
nbbuild/antsrc/org/netbeans/nbbuild/reporting/RatHtmlReportTask.java ---
@@ -0,0 +1,295 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.nbbuild.reporting;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ *
+ * @author skygo
+ */
+public class RatHtmlReportTask extends Task {
+
+ private File sourceFile;
+ private File targetFile;
+ private File root;
+ // not nice but to be last
+ private static final String OTHERS_AREA = "zothers";
+
+ // parameters for the task
+ public void setSource(File sourceFile) {
+ this.sourceFile = sourceFile;
+ }
+
+ public void setTarget(File targetFile) {
+ this.targetFile = targetFile;
+ }
+
+ @Override
+ public void execute() throws BuildException {
+ super.execute();
+ root = sourceFile.getParentFile().getParentFile().getParentFile();
+ File[] modulesFolder = root.listFiles();
+
+ // build map to get cluster and module related
+ Set<String> moduleDB = new HashSet<>();
+ Map<String, Set<String>> modulebycluster = new TreeMap<>();
+ for (File module : modulesFolder) {
+ if (module.isDirectory()) {
+ moduleDB.add(module.getName());
+ }
+ }
+ Set<String> clusterList = new TreeSet<>();
+ for (String key : getProject().getProperties().keySet()) {
+ if (key.startsWith("nb.cluster.")) {
+ String simplfiedKey = key.replaceAll("nb.cluster.", "");
+ simplfiedKey = simplfiedKey.replaceAll(".dir", "");
+ simplfiedKey = simplfiedKey.replaceAll(".depends", "");
+
+ clusterList.add(simplfiedKey);
+ modulebycluster.put(simplfiedKey, new HashSet<String>());
+ }
+ }
+ for (String k : clusterList) {
+ String property = getProject().getProperty("nb.cluster." + k);
+ String[] split = property.split(",");
+ for (String amo : split) {
+ moduleDB.remove(amo);
+ modulebycluster.get(k).add(amo);
+ }
+ }
+ modulebycluster.put(OTHERS_AREA, new HashSet<String>());
+ for (String k : moduleDB) {
+ modulebycluster.get(OTHERS_AREA).add(k);
+ }
+ // remaining module soted in others
+ modulebycluster.get(OTHERS_AREA).add("XXX");
+ clusterList.add(OTHERS_AREA);
+ DocumentBuilder dBuilder;
+ Document doc = null;
+ Map<String, ModuleInfo> moduleRATInfo = new TreeMap<>();
+
+ //read XML
+ try {
+ dBuilder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ doc = dBuilder.parse(sourceFile); // open xml source
+ XPathFactory xpf = XPathFactory.newInstance();
+
+ XPath path = xpf.newXPath();
+ Element rootElement = doc.getDocumentElement();
+
+ moduleRATInfo.put("XXX", new ModuleInfo());
+
+ doPopulateUnapprouved(moduleRATInfo, rootElement, path,
modulebycluster);
+ doPopulateApprouved(moduleRATInfo, rootElement, path,
modulebycluster);
+
+ } catch (ParserConfigurationException ex) {
+
Logger.getLogger(RatHtmlReportTask.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (SAXException ex) {
+
Logger.getLogger(RatHtmlReportTask.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (IOException ex) {
+
Logger.getLogger(RatHtmlReportTask.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (XPathExpressionException ex) {
+
Logger.getLogger(RatHtmlReportTask.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ if (doc != null) {
+ FileWriter fileWriter = null;
+ BufferedWriter bw = null;
+ try {
+ fileWriter = new FileWriter(targetFile);
+ bw = new BufferedWriter(fileWriter);
+ bw.write("<!DOCTYPE html>");
+ bw.write("<html>");
+ bw.write("<head>");
+ writeStyle(bw);
+ bw.write("</head>");
+ bw.write("<body>");
+ bw.write("<div id=\"content\">");
+ writeAreas(bw, clusterList, modulebycluster,
moduleRATInfo);
+ bw.write("</div>");
+ bw.write("<nav id=\"main-menu\">");
+ writeMenu(bw, clusterList, modulebycluster, moduleRATInfo);
+ bw.write("</nav>");
+ bw.write("</body>");
+ bw.write("</html>");
+
+ } catch (IOException ex) {
+
Logger.getLogger(RatHtmlReportTask.class.getName()).log(Level.SEVERE, null, ex);
+ } finally {
+ try {
+ bw.close();
+ fileWriter.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+ }
+ }
+
+ private static void writeMenu(BufferedWriter bw, Set<String>
clusterDB, Map<String, Set<String>> modulebycluster, Map<String, ModuleInfo>
moduleRATInfo) throws IOException {
+ bw.write("<ul>");
+ for (String clusterName : clusterDB) {
+ int appscanned = 0;
+ int unappscanned = 0;
+ for (String mm : modulebycluster.get(clusterName)) {
+ ModuleInfo get = moduleRATInfo.get(mm);
+ appscanned += get.getApprouved().size();
+ unappscanned += get.getUnapprouved().size();
+ }
+ if ((unappscanned + appscanned) > 0) {
+ bw.write("<li>");
+ } else {
+ bw.write("<li class=\"notpresent\">");
+ }
+ bw.write(clusterName);
+ bw.write(" (A:" + appscanned + ", U:" + unappscanned +
")</li>");
+ }
+ bw.write("</ul>");
+ }
+
+ private void writeAreas(BufferedWriter bw, Set<String> clusterDB,
Map<String, Set<String>> modulebycluster, Map<String, ModuleInfo> unbymodule)
throws IOException {
+ for (String clusterName : clusterDB) {
+ bw.write("<div class=\"area\" id=\"" + clusterName + "\">");
+ bw.write("<h2>Cluster::" + clusterName + "</h2>");
+ for (String mm : modulebycluster.get(clusterName)) {
+ bw.write("<div class=\"module\" id=\"" + mm + "\">");
+ bw.write("<h3>Module::" + mm + "</h3>");
+ bw.write("<ul>");
+ ModuleInfo get = unbymodule.get(mm);
+ for (String mmu : get.getUnapprouved()) {
+ bw.write("<li class=\"unapprouved\">");
+ bw.write("U:<a
href=\"https://github.com/apache/incubator-netbeans/tree/master/" + mmu + "\">"
+ mmu + "</a>");
--- End diff --
Hardcoding repository URL is probably not good idea.
---