ANY23-348 handle malformed microdata types gracefully
authorHans <firedrake93@gmail.com>
Fri, 18 May 2018 22:38:28 +0000 (17:38 -0500)
committerHans <firedrake93@gmail.com>
Fri, 18 May 2018 22:38:28 +0000 (17:38 -0500)
core/src/main/java/org/apache/any23/extractor/microdata/ItemScope.java
core/src/main/java/org/apache/any23/extractor/microdata/MicrodataParser.java

index f36828a..0ab0fee 100644 (file)
@@ -17,6 +17,9 @@
 
 package org.apache.any23.extractor.microdata;
 
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.rdf4j.common.net.ParsedIRI;
+
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -69,20 +72,29 @@ public class ItemScope extends Item {
      * @param itemId    <i>itemscope</i> id. Can be <code>null</code>.
      */
     public ItemScope(String xpath, ItemProp[] itemProps, String id, String[] refs, String type, String itemId) {
-        super(xpath);
+        this(xpath, itemProps, id, refs, stringToUrl(type), itemId);
+    }
 
-        if (itemProps == null) {
-            throw new NullPointerException("itemProps list cannot be null.");
-        }
-        if (type != null) {
+    static URL stringToUrl(String type) {
+        if (StringUtils.isNotBlank(type)) {
             try {
-                this.type = new URL(type);
+                return new URL(ParsedIRI.create(type.trim()).toString());
             } catch (MalformedURLException murle) {
                 throw new IllegalArgumentException("Invalid type '" + type + "', must be a valid URL.");
             }
         } else {
-            this.type = null;
+            return null;
+        }
+    }
+
+    ItemScope(String xpath, ItemProp[] itemProps, String id, String[] refs, URL type, String itemId) {
+        super(xpath);
+
+        if (itemProps == null) {
+            throw new NullPointerException("itemProps list cannot be null.");
         }
+
+        this.type = type;
         this.id = id;
         this.refs = refs;
         this.itemId = itemId;
index e54a533..32faec3 100644 (file)
@@ -26,6 +26,7 @@ import org.w3c.dom.traversal.NodeFilter;
 import org.w3c.dom.traversal.TreeWalker;
 
 import java.io.PrintStream;
+import java.net.URL;
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -90,7 +91,7 @@ public class MicrodataParser {
     /**
      * List of collected errors. Used when {@link #errorMode} <code>==</code> {@link ErrorMode#FULL_REPORT}.
      */
-    private List<MicrodataParserException> errors = new ArrayList<>();
+    private final List<MicrodataParserException> errors = new ArrayList<>();
 
     public static final String ITEMSCOPE_ATTRIBUTE = "itemscope";
     public static final String ITEMPROP_ATTRIBUTE  = "itemprop";
@@ -504,12 +505,20 @@ public class MicrodataParser {
             itemProps.add(deferredProperty);
         }
 
+        URL type;
+        try {
+            type = ItemScope.stringToUrl(itemType);
+        } catch (IllegalArgumentException e) {
+            manageError(new MicrodataParserException(e.getMessage(), node));
+            type = null;
+        }
+
         final ItemScope newItemScope = new ItemScope(
                 DomUtils.getXPathForNode(node),
                 itemProps.toArray(new ItemProp[itemProps.size()]),
                 id,
                 itemrefIDs,
-                itemType,
+                type,
                 itemId
         );
         itemScopes.put(node, newItemScope);
@@ -517,15 +526,15 @@ public class MicrodataParser {
     }
 
     private void manageError(MicrodataParserException mpe) throws MicrodataParserException {
-        if(errorMode == ErrorMode.STOP_AT_FIRST_ERROR) {
-            throw mpe;
-        }
-        if(errorMode != ErrorMode.FULL_REPORT)
-            throw new IllegalStateException("Unsupported mode " + errorMode);
-        if(errors == null) {
-            errors = new ArrayList<>();
+        switch (errorMode) {
+            case FULL_REPORT:
+                errors.add(mpe);
+                break;
+            case STOP_AT_FIRST_ERROR:
+                throw mpe;
+            default:
+                throw new IllegalStateException("Unsupported mode " + errorMode);
         }
-        errors.add(mpe);
     }
 
 }