JAL-2119 case-sensitive href filename checking
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 12 Sep 2016 08:59:16 +0000 (09:59 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 12 Sep 2016 08:59:16 +0000 (09:59 +0100)
utils/HelpLinksChecker.java

index a0853a9..9463758 100644 (file)
@@ -64,7 +64,7 @@ public class HelpLinksChecker
     if (args.length == 0 || args.length > 2
             || (args.length == 2 && !args[1].equals("-nointernet")))
     {
-      System.out.println("Usage: <pathToHelpFolder> [-nointernet]");
+      log("Usage: <pathToHelpFolder> [-nointernet]");
       return;
     }
 
@@ -84,11 +84,11 @@ public class HelpLinksChecker
    */
   void checkLinks(String helpDirectoryPath) throws IOException
   {
-    System.out.println("Checking help file links");
+    log("Checking help file links");
     File helpFolder = new File(helpDirectoryPath).getCanonicalFile();
     if (!helpFolder.exists())
     {
-      System.out.println("Can't find " + helpDirectoryPath);
+      log("Can't find " + helpDirectoryPath);
       return;
     }
 
@@ -159,7 +159,7 @@ public class HelpLinksChecker
         unusedTargets.remove(image);
         if (!tocTargets.containsKey(image))
         {
-          System.out.println(String.format(
+          log(String.format(
                   "Invalid image '%s' at line %d of %s", image, lineNo,
                   HELP_HS));
           invalidImageCount++;
@@ -177,29 +177,29 @@ public class HelpLinksChecker
    */
   private void reportResults(Map<String, String> unusedTargets)
   {
-    System.out.println("\nResults:");
-    System.out.println(targetCount + " distinct help targets");
-    System.out.println(mapCount + " help mappings");
-    System.out.println(invalidTargetCount + " invalid targets");
-    System.out.println(unusedTargets.size() + " unused targets");
+    log("\nResults:");
+    log(targetCount + " distinct help targets");
+    log(mapCount + " help mappings");
+    log(invalidTargetCount + " invalid targets");
+    log(unusedTargets.size() + " unused targets");
     for (String target : unusedTargets.keySet())
     {
-      System.out.println(String.format("    %s: %s", target,
+      log(String.format("    %s: %s", target,
               unusedTargets.get(target)));
     }
-    System.out.println(invalidMapUrlCount + " invalid map urls");
-    System.out.println(invalidImageCount + " invalid image attributes");
-    System.out.println(String.format(
-            "%d internal href links (%d with anchors - not checked)",
-            internalHrefCount, anchorRefCount));
-    System.out.println(invalidInternalHrefCount
+    log(invalidMapUrlCount + " invalid map urls");
+    log(invalidImageCount + " invalid image attributes");
+    log(String.format(
+            "%d internal href links (%d with anchors)", internalHrefCount,
+            anchorRefCount));
+    log(invalidInternalHrefCount
             + " invalid internal href links");
-    System.out.println(invalidAnchorRefCount
+    log(invalidAnchorRefCount
             + " invalid internal anchor links");
-    System.out.println(externalHrefCount + " external href links");
+    log(externalHrefCount + " external href links");
     if (internetAvailable)
     {
-      System.out.println(invalidExternalHrefCount
+      log(invalidExternalHrefCount
               + " invalid external href links");
     }
     else
@@ -210,8 +210,18 @@ public class HelpLinksChecker
     if (invalidInternalHrefCount > 0 || invalidExternalHrefCount > 0
             || invalidImageCount > 0 || invalidAnchorRefCount > 0)
     {
+      log("*** Failed ***");
       System.exit(1);
     }
+    log("*** Success ***");
+  }
+
+  /**
+   * @param s
+   */
+  static void log(String s)
+  {
+    System.out.println(s);
   }
 
   /**
@@ -262,7 +272,7 @@ public class HelpLinksChecker
           internalHrefCount++;
           File hrefFile = href.equals("") ? htmlFile : new File(htmlFolder,
                   href);
-          if (!hrefFile.exists())
+          if (hrefFile != htmlFile && !fileExists(hrefFile, href))
           {
             badLink = true;
             invalidInternalHrefCount++;
@@ -274,7 +284,7 @@ public class HelpLinksChecker
             {
               if (!checkAnchorExists(hrefFile, anchor))
               {
-                System.out.println(String.format(
+                log(String.format(
                         "Invalid anchor: %s at line %d of %s", anchor,
                         lineNo, getPath(htmlFile)));
                 invalidAnchorRefCount++;
@@ -284,7 +294,7 @@ public class HelpLinksChecker
         }
         if (badLink)
         {
-          System.out.println(String.format(
+          log(String.format(
                   "Invalid href %s at line %d of %s", href, lineNo,
                   getPath(htmlFile)));
         }
@@ -295,6 +305,35 @@ public class HelpLinksChecker
   }
 
   /**
+   * Performs a case-sensitive check that the href'd file exists
+   * 
+   * @param hrefFile
+   * @return
+   * @throws IOException
+   */
+  boolean fileExists(File hrefFile, String href) throws IOException
+  {
+    if (!hrefFile.exists())
+    {
+      return false;
+    }
+
+    /*
+     * On Mac or Windows, file.exists() is not case sensitive, so do an
+     * additional check with case sensitivity 
+     */
+    int slashPos = href.lastIndexOf("/");
+    String expectedFileName = slashPos == -1 ? href : href
+            .substring(slashPos + 1);
+    String cp = hrefFile.getCanonicalPath();
+    slashPos = cp.lastIndexOf("/");
+    String actualFileName = slashPos == -1 ? cp : cp
+            .substring(slashPos + 1);
+
+    return expectedFileName.equals(actualFileName);
+  }
+
+  /**
    * Reads the file and checks for the presence of the given html anchor
    * 
    * @param hrefFile
@@ -392,7 +431,7 @@ public class HelpLinksChecker
         mapCount++;
         if (targets.containsKey(target))
         {
-          System.out.println(String.format(
+          log(String.format(
                   "Duplicate target mapping to %s at line %d of %s",
                   target, lineNo, HELP_JHM));
         }
@@ -416,7 +455,7 @@ public class HelpLinksChecker
         }
         if (!new File(helpFolder, url).exists())
         {
-          System.out.println(String.format(
+          log(String.format(
                   "Invalid url path '%s' at line %d of %s", url, lineNo,
                   HELP_JHM));
           invalidMapUrlCount++;
@@ -459,7 +498,7 @@ public class HelpLinksChecker
         unusedTargets.remove(target);
         if (!tocTargets.containsKey(target))
         {
-          System.out.println(String.format(
+          log(String.format(
                   "Invalid target '%s' at line %d of %s", target, lineNo,
                   HELP_TOC_XML));
           invalidTargetCount++;