This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 3f94b45  Add Javadoc link tester utility.
3f94b45 is described below

commit 3f94b450d9836c0ac39220067abdc73feb2b0ee4
Author: JamesBognar <jamesbog...@apache.org>
AuthorDate: Sat Feb 3 12:15:18 2018 -0500

    Add Javadoc link tester utility.
---
 .../org/apache/juneau/utils/JavadocLinkTester.java | 123 +++++++++++++++++++++
 1 file changed, 123 insertions(+)

diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/utils/JavadocLinkTester.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/utils/JavadocLinkTester.java
new file mode 100644
index 0000000..da32647
--- /dev/null
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/utils/JavadocLinkTester.java
@@ -0,0 +1,123 @@
+// 
***************************************************************************************************************************
+// * 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.apache.juneau.utils;
+
+import java.io.*;
+import java.util.*;
+import java.util.regex.*;
+
+import org.apache.juneau.internal.*;
+
+/**
+ * Javadoc link checker.
+ * 
+ * <p>
+ * Runs against the generated javadocs folder looking for any broken internal 
links (missing files, invalid anchor tags, etc...).
+ */
+public class JavadocLinkTester {
+
+       static Pattern p = 
Pattern.compile("(href|src)\\=['\\\"]([^'\\\"]+)['\\\"]");
+       static Pattern p2 = 
Pattern.compile("(name|id)\\=['\\\"]([^'\\\"]+)['\\\"]");
+       static int errors, files, directories, links;
+       
+       public static void main(String[] args) {
+               try {
+                       long startTime = System.currentTimeMillis();
+                       File root = new 
File("../../target/site/apidocs").getCanonicalFile();
+                       System.out.println("Checking " + root);
+                       process(root);
+                       System.out.println("Checked "+links+" links in " + 
files + " files in " + directories + " directories in 
"+(System.currentTimeMillis()-startTime)+"ms");
+                       if (errors == 0)
+                               System.out.println("No errors");
+                       else {
+                               System.out.flush();
+                               System.err.println(errors + " errors");
+                       }
+               } catch (Exception e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+       }
+       
+       static Map<String,Set<String>> ANCHORS = new LinkedHashMap<>();
+       
+       static Map<String,List<String>> ERRORS = new TreeMap<>();
+       
+       static void process(File f) throws Exception {
+               if (f.isDirectory()) {
+                       for (File fc : f.listFiles()) {
+                               if (fc.isFile() && 
fc.getName().endsWith(".html")) {
+                                       files++;
+                                       resolveLinks(fc);
+                               }
+                       }
+                       for (File fc : f.listFiles()) {
+                               if (fc.isDirectory() && ! 
fc.getName().equals("src-html")) {
+                                       directories++;
+                                       process(fc);
+                               }
+                       }
+               }
+       }
+       
+       private static boolean hasAnchor(File f, String anchor) throws 
Exception {
+               String key = f.getCanonicalPath();
+               if (! ANCHORS.containsKey(key)) {
+                       Set<String> s = new HashSet<String>();
+                       String c2 = IOUtils.read(f);
+                       Matcher m2 = p2.matcher(c2);
+                       while (m2.find()) {
+                               s.add(m2.group(2));
+                       }
+                       ANCHORS.put(key, s);
+               }
+               return ANCHORS.get(key).contains(anchor);
+       }
+       
+       private static void resolveLinks(File f) throws Exception {
+               String contents = IOUtils.read(f);
+               Matcher m = p.matcher(contents);
+               while (m.find()) {
+                       String link = m.group(2);
+                       String anchor = null;
+                       if (link.startsWith("https://";) || 
link.startsWith("http://";) || link.startsWith("mailto:";))
+                               continue;
+                       links++;
+                       if (link.indexOf('?') != -1)
+                               link = link.substring(0, link.indexOf('?'));
+                       
+                       if (link.indexOf('#') != -1) {
+                               anchor = 
link.substring(link.lastIndexOf('#')+1);
+                               link = link.substring(0, link.lastIndexOf('#'));
+                               File f2 = link.isEmpty() ? f : new 
File(f.getParentFile().getAbsolutePath() + "/" + link);
+                               if (! f2.exists()) {
+                                       error(f, "missingLink=["+link+"]");
+                               } else if (anchor != null) {
+                                       if (f2.isFile()) {
+                                               boolean foundAnchor = 
hasAnchor(f2, anchor);
+                                               if (! foundAnchor)
+                                                       error(f, 
"missingAnchor=["+link+"#"+anchor+"]");
+                                       } else {
+                                               error(f, 
"invalidAnchor=["+link+"#"+anchor+"]");
+                                       }
+                               }
+                       }
+               }
+       }
+       
+       private static void error(File f, String msg) {
+               errors++;
+               System.out.flush();
+               System.err.println("ERROR: " + f.getAbsolutePath() + ", " + 
msg);
+       }
+}

-- 
To stop receiving notification emails like this one, please contact
jamesbog...@apache.org.

Reply via email to