src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -22,10 +22,14 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
 package javax.xml.catalog;
 
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
 import jdk.xml.internal.SecuritySupport;
 
 /**
  * The CatalogFeatures holds a collection of features and properties.
  * <p>

@@ -378,14 +382,11 @@
      *
      * @param builder the builder to build the CatalogFeatures
      */
     CatalogFeatures(Builder builder) {
         init();
-        setProperty(Feature.FILES.ordinal(), State.APIPROPERTY, builder.files);
-        setProperty(Feature.PREFER.ordinal(), State.APIPROPERTY, builder.prefer);
-        setProperty(Feature.DEFER.ordinal(), State.APIPROPERTY, builder.defer);
-        setProperty(Feature.RESOLVE.ordinal(), State.APIPROPERTY, builder.resolve);
+        setProperties(builder);
     }
 
     /**
      * Returns the value of the specified feature.
      *

@@ -408,10 +409,19 @@
         //read system properties or jaxp.properties
         readSystemProperties();
     }
 
     /**
+     * Sets properties by the Builder.
+     * @param builder the CatalogFeatures builder
+     */
+    private void setProperties(Builder builder) {
+        builder.values.entrySet().stream().forEach((entry) -> {
+            setProperty(entry.getKey().ordinal(), State.APIPROPERTY, entry.getValue());
+        });
+    }
+    /**
      * Sets the value of a property by its index, updates only if it shall override.
      *
      * @param index the index of the property
      * @param state the state of the property
      * @param value the value of the property

@@ -430,15 +440,28 @@
             } else if (index == Feature.RESOLVE.ordinal()) {
                 if (!value.equals(RESOLVE_STRICT) && !value.equals(RESOLVE_CONTINUE)
                          && !value.equals(RESOLVE_IGNORE)) {
                     CatalogMessages.reportIAE(new Object[]{value, Feature.RESOLVE.name()}, null);
                 }
+            } else if (index == Feature.FILES.ordinal()) {
+                try {
+                    if (Util.verifyAndGetURI(value, null) == null) {
+                        CatalogMessages.reportIAE(new Object[]{value, Feature.FILES.name()}, null);
+                    }
+                }catch (MalformedURLException | URISyntaxException | IllegalArgumentException ex) {
+                    CatalogMessages.reportIAE(new Object[]{value, Feature.FILES.name()}, ex);
+                }
+
             }
             if (states[index] == null || state.compareTo(states[index]) >= 0) {
                 values[index] = value;
                 states[index] = state;
             }
+        } else {
+            if (state == State.SYSTEMPROPERTY || state == State.JAXPDOTPROPERTIES) {
+                CatalogMessages.reportIAE(new Object[]{value, Feature.values()[index].name()}, null);
+            }
         }
     }
 
     /**
      * Reads from system properties, or those in jaxp.properties

@@ -484,13 +507,13 @@
     /**
      * The Builder class for building the CatalogFeatures object.
      */
     public static class Builder {
         /**
-         * Variables for the features supported by CatalogFeatures.
+         * Values of the features supported by CatalogFeatures.
          */
-        String files, prefer, defer, resolve;
+        Map<Feature, String> values = new HashMap<>();
 
         /**
          * Instantiation of Builder is not allowed.
          */
         private Builder() {}

@@ -503,24 +526,14 @@
          * @throws IllegalArgumentException if the value is not valid for the
          * Feature or has the wrong syntax for the {@code javax.xml.catalog.files}
          * property
          */
         public Builder with(Feature feature, String value) {
-            switch (feature) {
-                case FILES :
-                    files = value;
-                    break;
-                case PREFER :
-                    prefer = value;
-                    break;
-                case DEFER :
-                    defer = value;
-                    break;
-                case RESOLVE :
-                    resolve = value;
-                    break;
+            if (value == null || value.length() == 0) {
+                CatalogMessages.reportIAE(new Object[]{value, feature.name()}, null);
             }
+            values.put(feature, value);
             return this;
         }
 
         /**
          * Returns a CatalogFeatures object built by this builder.