src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java
changeset 50614 3810c9a2efa1
parent 47216 71c04702a3d5
child 54731 81de17a33575
equal deleted inserted replaced
50613:0f93a75b9213 50614:3810c9a2efa1
    40  * URI in which the link to the new resource is defined and the baseURI of the
    40  * URI in which the link to the new resource is defined and the baseURI of the
    41  * file/entity in which the URI occurs (the baseURI is the same as the SystemId).
    41  * file/entity in which the URI occurs (the baseURI is the same as the SystemId).
    42  */
    42  */
    43 public class ResourceResolver {
    43 public class ResourceResolver {
    44 
    44 
    45     /** {@link org.apache.commons.logging} logging facility */
    45     private static final com.sun.org.slf4j.internal.Logger LOG =
    46     private static java.util.logging.Logger log =
    46         com.sun.org.slf4j.internal.LoggerFactory.getLogger(ResourceResolver.class);
    47         java.util.logging.Logger.getLogger(ResourceResolver.class.getName());
       
    48 
    47 
    49     /** these are the system-wide resolvers */
    48     /** these are the system-wide resolvers */
    50     private static List<ResourceResolver> resolverList = new ArrayList<ResourceResolver>();
    49     private static final List<ResourceResolver> resolverList = new ArrayList<>();
    51 
    50 
    52     /** Field resolverSpi */
    51     /** Field resolverSpi */
    53     private final ResourceResolverSpi resolverSpi;
    52     private final ResourceResolverSpi resolverSpi;
    54 
    53 
    55     /**
    54     /**
    62     }
    61     }
    63 
    62 
    64     /**
    63     /**
    65      * Method getInstance
    64      * Method getInstance
    66      *
    65      *
    67      * @param uri
    66      * @param uriAttr
    68      * @param baseURI
       
    69      * @return the instance
       
    70      *
       
    71      * @throws ResourceResolverException
       
    72      */
       
    73     public static final ResourceResolver getInstance(Attr uri, String baseURI)
       
    74         throws ResourceResolverException {
       
    75         return getInstance(uri, baseURI, false);
       
    76     }
       
    77 
       
    78     /**
       
    79      * Method getInstance
       
    80      *
       
    81      * @param uri
       
    82      * @param baseURI
    67      * @param baseURI
    83      * @param secureValidation
    68      * @param secureValidation
    84      * @return the instance
    69      * @return the instance
    85      *
    70      *
    86      * @throws ResourceResolverException
    71      * @throws ResourceResolverException
    98             for (ResourceResolver resolver : resolverList) {
    83             for (ResourceResolver resolver : resolverList) {
    99                 ResourceResolver resolverTmp = resolver;
    84                 ResourceResolver resolverTmp = resolver;
   100                 if (!resolver.resolverSpi.engineIsThreadSafe()) {
    85                 if (!resolver.resolverSpi.engineIsThreadSafe()) {
   101                     try {
    86                     try {
   102                         @SuppressWarnings("deprecation")
    87                         @SuppressWarnings("deprecation")
   103                         ResourceResolver tmp = new ResourceResolver(resolver.resolverSpi.getClass().newInstance());
    88                         ResourceResolver tmp =
       
    89                             new ResourceResolver(resolver.resolverSpi.getClass().newInstance());
   104                         resolverTmp = tmp;
    90                         resolverTmp = tmp;
   105                             ;
       
   106                     } catch (InstantiationException e) {
    91                     } catch (InstantiationException e) {
   107                         throw new ResourceResolverException("", e, context.attr, context.baseUri);
    92                         throw new ResourceResolverException(e, context.uriToResolve, context.baseUri, "");
   108                     } catch (IllegalAccessException e) {
    93                     } catch (IllegalAccessException e) {
   109                         throw new ResourceResolverException("", e, context.attr, context.baseUri);
    94                         throw new ResourceResolverException(e, context.uriToResolve, context.baseUri, "");
   110                     }
    95                     }
   111                 }
    96                 }
   112 
    97 
   113                 if (log.isLoggable(java.util.logging.Level.FINE)) {
    98                 LOG.debug("check resolvability by class {}", resolverTmp.getClass().getName());
   114                     log.log(java.util.logging.Level.FINE,
    99 
   115                         "check resolvability by class " + resolverTmp.getClass().getName()
   100                 if (resolverTmp != null && resolverTmp.canResolve(context)) {
   116                     );
       
   117                 }
       
   118 
       
   119                 if ((resolverTmp != null) && resolverTmp.canResolve(context)) {
       
   120                     // Check to see whether the Resolver is allowed
   101                     // Check to see whether the Resolver is allowed
   121                     if (context.secureValidation
   102                     if (context.secureValidation
   122                         && (resolverTmp.resolverSpi instanceof ResolverLocalFilesystem
   103                         && (resolverTmp.resolverSpi instanceof ResolverLocalFilesystem
   123                             || resolverTmp.resolverSpi instanceof ResolverDirectHTTP)) {
   104                             || resolverTmp.resolverSpi instanceof ResolverDirectHTTP)) {
   124                         Object exArgs[] = { resolverTmp.resolverSpi.getClass().getName() };
   105                         Object exArgs[] = { resolverTmp.resolverSpi.getClass().getName() };
   125                         throw new ResourceResolverException(
   106                         throw new ResourceResolverException(
   126                             "signature.Reference.ForbiddenResolver", exArgs, context.attr, context.baseUri
   107                             "signature.Reference.ForbiddenResolver", exArgs, context.uriToResolve, context.baseUri
   127                         );
   108                         );
   128                     }
   109                     }
   129                     return resolverTmp;
   110                     return resolverTmp;
   130                 }
   111                 }
   131             }
   112             }
   132         }
   113         }
   133 
   114 
   134         Object exArgs[] = { ((context.uriToResolve != null)
   115         Object exArgs[] = { context.uriToResolve != null
   135                 ? context.uriToResolve : "null"), context.baseUri };
   116                 ? context.uriToResolve : "null", context.baseUri };
   136 
   117 
   137         throw new ResourceResolverException("utils.resolver.noClass", exArgs, context.attr, context.baseUri);
   118         throw new ResourceResolverException("utils.resolver.noClass", exArgs, context.uriToResolve, context.baseUri);
   138     }
   119     }
   139 
   120 
   140     /**
   121     /**
   141      * Method getInstance
   122      * Method getInstance
   142      *
   123      *
   148      * @throws ResourceResolverException
   129      * @throws ResourceResolverException
   149      */
   130      */
   150     public static ResourceResolver getInstance(
   131     public static ResourceResolver getInstance(
   151         Attr uri, String baseURI, List<ResourceResolver> individualResolvers
   132         Attr uri, String baseURI, List<ResourceResolver> individualResolvers
   152     ) throws ResourceResolverException {
   133     ) throws ResourceResolverException {
   153         return getInstance(uri, baseURI, individualResolvers, false);
   134         return getInstance(uri, baseURI, individualResolvers, true);
   154     }
   135     }
   155 
   136 
   156     /**
   137     /**
   157      * Method getInstance
   138      * Method getInstance
   158      *
   139      *
   165      * @throws ResourceResolverException
   146      * @throws ResourceResolverException
   166      */
   147      */
   167     public static ResourceResolver getInstance(
   148     public static ResourceResolver getInstance(
   168         Attr uri, String baseURI, List<ResourceResolver> individualResolvers, boolean secureValidation
   149         Attr uri, String baseURI, List<ResourceResolver> individualResolvers, boolean secureValidation
   169     ) throws ResourceResolverException {
   150     ) throws ResourceResolverException {
   170         if (log.isLoggable(java.util.logging.Level.FINE)) {
   151         LOG.debug(
   171             log.log(java.util.logging.Level.FINE,
   152             "I was asked to create a ResourceResolver and got {}",
   172                 "I was asked to create a ResourceResolver and got "
   153             (individualResolvers == null ? 0 : individualResolvers.size())
   173                 + (individualResolvers == null ? 0 : individualResolvers.size())
   154         );
   174             );
       
   175         }
       
   176 
   155 
   177         ResourceResolverContext context = new ResourceResolverContext(uri, baseURI, secureValidation);
   156         ResourceResolverContext context = new ResourceResolverContext(uri, baseURI, secureValidation);
   178 
   157 
   179         // first check the individual Resolvers
   158         // first check the individual Resolvers
   180         if (individualResolvers != null) {
   159         if (individualResolvers != null) {
   181             for (int i = 0; i < individualResolvers.size(); i++) {
   160             for (int i = 0; i < individualResolvers.size(); i++) {
   182                 ResourceResolver resolver = individualResolvers.get(i);
   161                 ResourceResolver resolver = individualResolvers.get(i);
   183 
   162 
   184                 if (resolver != null) {
   163                 if (resolver != null) {
   185                     if (log.isLoggable(java.util.logging.Level.FINE)) {
   164                     String currentClass = resolver.resolverSpi.getClass().getName();
   186                         String currentClass = resolver.resolverSpi.getClass().getName();
   165                     LOG.debug("check resolvability by class {}", currentClass);
   187                         log.log(java.util.logging.Level.FINE, "check resolvability by class " + currentClass);
       
   188                     }
       
   189 
   166 
   190                     if (resolver.canResolve(context)) {
   167                     if (resolver.canResolve(context)) {
   191                         return resolver;
   168                         return resolver;
   192                     }
   169                     }
   193                 }
   170                 }
   196 
   173 
   197         return internalGetInstance(context);
   174         return internalGetInstance(context);
   198     }
   175     }
   199 
   176 
   200     /**
   177     /**
   201      * Registers a ResourceResolverSpi class. This method logs a warning if
   178      * Registers a ResourceResolverSpi class. This method LOGs a warning if
   202      * the class cannot be registered.
   179      * the class cannot be registered.
   203      *
   180      *
   204      * @param className the name of the ResourceResolverSpi class to be registered
   181      * @param className the name of the ResourceResolverSpi class to be registered
   205      * @throws SecurityException if a security manager is installed and the
   182      * @throws SecurityException if a security manager is installed and the
   206      *    caller does not have permission to register a resource resolver
   183      *    caller does not have permission to register a resource resolver
   208     @SuppressWarnings("unchecked")
   185     @SuppressWarnings("unchecked")
   209     public static void register(String className) {
   186     public static void register(String className) {
   210         JavaUtils.checkRegisterPermission();
   187         JavaUtils.checkRegisterPermission();
   211         try {
   188         try {
   212             Class<ResourceResolverSpi> resourceResolverClass =
   189             Class<ResourceResolverSpi> resourceResolverClass =
   213                 (Class<ResourceResolverSpi>) Class.forName(className);
   190                 (Class<ResourceResolverSpi>)
       
   191                 ClassLoaderUtils.loadClass(className, ResourceResolver.class);
   214             register(resourceResolverClass, false);
   192             register(resourceResolverClass, false);
   215         } catch (ClassNotFoundException e) {
   193         } catch (ClassNotFoundException e) {
   216             log.log(java.util.logging.Level.WARNING, "Error loading resolver " + className + " disabling it");
   194             LOG.warn("Error loading resolver " + className + " disabling it");
   217         }
   195         }
   218     }
   196     }
   219 
   197 
   220     /**
   198     /**
   221      * Registers a ResourceResolverSpi class at the beginning of the provider
   199      * Registers a ResourceResolverSpi class at the beginning of the provider
   222      * list. This method logs a warning if the class cannot be registered.
   200      * list. This method LOGs a warning if the class cannot be registered.
   223      *
   201      *
   224      * @param className the name of the ResourceResolverSpi class to be registered
   202      * @param className the name of the ResourceResolverSpi class to be registered
   225      * @throws SecurityException if a security manager is installed and the
   203      * @throws SecurityException if a security manager is installed and the
   226      *    caller does not have permission to register a resource resolver
   204      *    caller does not have permission to register a resource resolver
   227      */
   205      */
   228     @SuppressWarnings("unchecked")
   206     @SuppressWarnings("unchecked")
   229     public static void registerAtStart(String className) {
   207     public static void registerAtStart(String className) {
   230         JavaUtils.checkRegisterPermission();
   208         JavaUtils.checkRegisterPermission();
   231         try {
   209         try {
   232             Class<ResourceResolverSpi> resourceResolverClass =
   210             Class<ResourceResolverSpi> resourceResolverClass =
   233                 (Class<ResourceResolverSpi>) Class.forName(className);
   211                 (Class<ResourceResolverSpi>)
       
   212                 ClassLoaderUtils.loadClass(className, ResourceResolver.class);
   234             register(resourceResolverClass, true);
   213             register(resourceResolverClass, true);
   235         } catch (ClassNotFoundException e) {
   214         } catch (ClassNotFoundException e) {
   236             log.log(java.util.logging.Level.WARNING, "Error loading resolver " + className + " disabling it");
   215             LOG.warn("Error loading resolver " + className + " disabling it");
   237         }
   216         }
   238     }
   217     }
   239 
   218 
   240     /**
   219     /**
   241      * Registers a ResourceResolverSpi class. This method logs a warning if the class
   220      * Registers a ResourceResolverSpi class. This method LOGs a warning if the class
   242      * cannot be registered.
   221      * cannot be registered.
   243      * @param className
   222      * @param className
   244      * @param start
   223      * @param start
   245      * @throws SecurityException if a security manager is installed and the
   224      * @throws SecurityException if a security manager is installed and the
   246      *    caller does not have permission to register a resource resolver
   225      *    caller does not have permission to register a resource resolver
   250         try {
   229         try {
   251             @SuppressWarnings("deprecation")
   230             @SuppressWarnings("deprecation")
   252             ResourceResolverSpi resourceResolverSpi = className.newInstance();
   231             ResourceResolverSpi resourceResolverSpi = className.newInstance();
   253             register(resourceResolverSpi, start);
   232             register(resourceResolverSpi, start);
   254         } catch (IllegalAccessException e) {
   233         } catch (IllegalAccessException e) {
   255             log.log(java.util.logging.Level.WARNING, "Error loading resolver " + className + " disabling it");
   234             LOG.warn("Error loading resolver " + className + " disabling it");
   256         } catch (InstantiationException e) {
   235         } catch (InstantiationException e) {
   257             log.log(java.util.logging.Level.WARNING, "Error loading resolver " + className + " disabling it");
   236             LOG.warn("Error loading resolver " + className + " disabling it");
   258         }
   237         }
   259     }
   238     }
   260 
   239 
   261     /**
   240     /**
   262      * Registers a ResourceResolverSpi instance. This method logs a warning if the class
   241      * Registers a ResourceResolverSpi instance. This method LOGs a warning if the class
   263      * cannot be registered.
   242      * cannot be registered.
   264      * @param resourceResolverSpi
   243      * @param resourceResolverSpi
   265      * @param start
   244      * @param start
   266      * @throws SecurityException if a security manager is installed and the
   245      * @throws SecurityException if a security manager is installed and the
   267      *    caller does not have permission to register a resource resolver
   246      *    caller does not have permission to register a resource resolver
   273                 resolverList.add(0, new ResourceResolver(resourceResolverSpi));
   252                 resolverList.add(0, new ResourceResolver(resourceResolverSpi));
   274             } else {
   253             } else {
   275                 resolverList.add(new ResourceResolver(resourceResolverSpi));
   254                 resolverList.add(new ResourceResolver(resourceResolverSpi));
   276             }
   255             }
   277         }
   256         }
   278         if (log.isLoggable(java.util.logging.Level.FINE)) {
   257         LOG.debug("Registered resolver: {}", resourceResolverSpi.toString());
   279             log.log(java.util.logging.Level.FINE, "Registered resolver: " + resourceResolverSpi.toString());
       
   280         }
       
   281     }
   258     }
   282 
   259 
   283     /**
   260     /**
   284      * This method registers the default resolvers.
   261      * This method registers the default resolvers.
   285      */
   262      */
   291             resolverList.add(new ResourceResolver(new ResolverDirectHTTP()));
   268             resolverList.add(new ResourceResolver(new ResolverDirectHTTP()));
   292         }
   269         }
   293     }
   270     }
   294 
   271 
   295     /**
   272     /**
   296      * @deprecated New clients should use {@link #resolve(Attr, String, boolean)}
       
   297      */
       
   298     @Deprecated
       
   299     public XMLSignatureInput resolve(Attr uri, String baseURI)
       
   300         throws ResourceResolverException {
       
   301         return resolve(uri, baseURI, true);
       
   302     }
       
   303 
       
   304     /**
       
   305      * Method resolve
   273      * Method resolve
   306      *
   274      *
   307      * @param uri
   275      * @param uri
   308      * @param baseURI
   276      * @param baseURI
   309      * @return the resource
   277      * @return the resource