org.springframework.core.io.support
Class PathMatchingResourcePatternResolver

java.lang.Object
  extended by org.springframework.core.io.support.PathMatchingResourcePatternResolver
All Implemented Interfaces:
ResourceLoader, ResourcePatternResolver
Direct Known Subclasses:
ServletContextResourcePatternResolver

public class PathMatchingResourcePatternResolver
extends Object
implements ResourcePatternResolver

ResourcePatternResolver implementation that applies Ant-style path matching, using Spring's PathMatcher utility.

Locations can either be suitable for ResourceLoader.getResource (URLs like "file:C:/context.xml", pseudo-URLs like "classpath:/context.xml", relative file paths like "/WEB-INF/context.xml"), or Ant-style patterns like "/WEB-INF/*-context.xml".

In the pattern case, the location has to be resolvable to java.io.File or to a "jar:" URL (leading to a java.net.JarURLConnection) to allow for searching though the specified directory tree. In particular, this is not guaranteed to work with a WAR file that is not expanded.

There is special support for retrieving multiple class path resources with the same name, via the "classpath*" prefix. For example, "classpath*:META-INF/beans.xml" will find all "beans.xml" files in the class path, be it in "classes" directories or in JAR files. This is particularly useful for autodetecting config files of the same name at the same location within each jar file.

The "classpath*:" prefix can also be combined with a PathMatcher pattern, for example "classpath*:META-INF/*-beans.xml". In this case, all matching resources in the class path will be found, even if multiple resources of the same name exist in different jar files.

WARNING: Note that "classpath*:" will only work reliably with at least one root directory before the pattern starts, unless the actual target files reside in the file system. This means that a pattern like "classpath*:*.xml" will not retrieve files from the root of jar files but rather only from the root of expanded directories. This originates from a limitation in the JDK's ClassLoader.getResources method which only returns file system locations for a passed-in empty String (indicating potential roots to search).

Warning: Ant-style patterns with "classpath:" resources are not guaranteed to find matching resources if the root package to search is available in multiple class path locations. Preferably, use "classpath*:" with the same Ant-style pattern in such a case, which will search all class path locations that contain the root package.

If neither given a PathMatcher pattern nor a "classpath*:" location, this resolver will return a single resource via the underlying ResourceLoader.

Since:
1.0.2
Author:
Juergen Hoeller
See Also:
ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX, AntPathMatcher, ResourceLoader.getResource(String), ClassLoader.getResources(String)

Field Summary
protected  Log logger
           
 
Fields inherited from interface org.springframework.core.io.support.ResourcePatternResolver
CLASSPATH_ALL_URL_PREFIX, CLASSPATH_URL_PREFIX
 
Constructor Summary
PathMatchingResourcePatternResolver()
          Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader.
PathMatchingResourcePatternResolver(ClassLoader classLoader)
          Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader.
PathMatchingResourcePatternResolver(ResourceLoader resourceLoader)
          Create a new PathMatchingResourcePatternResolver.
PathMatchingResourcePatternResolver(ResourceLoader resourceLoader, ClassLoader classLoader)
          Create a new PathMatchingResourcePatternResolver.
 
Method Summary
protected  Resource convertClassLoaderURL(URL url)
          Convert the given URL as returned from the ClassLoader into a Resource object.
protected  String determineRootDir(String location)
          Determine the root directory for the given location.
protected  Set doFindMatchingFileSystemResources(File rootDir, String subPattern)
          Find all resources in the file system that match the given location pattern via the Ant-style PathMatcher.
protected  Set doFindPathMatchingFileResources(Resource rootDirResource, String subPattern)
          Find all resources in the file system that match the given location pattern via the Ant-style PathMatcher.
protected  Set doFindPathMatchingJarResources(Resource rootDirResource, String subPattern)
          Find all resources in jar files that match the given location pattern via the Ant-style PathMatcher.
protected  void doRetrieveMatchingFiles(String fullPattern, File dir, Set result)
          Recursively retrieve files that match the given pattern, adding them to the given result list.
protected  Resource[] findAllClassPathResources(String location)
          Find all class location resources with the given location via the ClassLoader.
protected  Resource[] findPathMatchingResources(String locationPattern)
          Find all resources that match the given location pattern via the Ant-style PathMatcher.
 ClassLoader getClassLoader()
          Return the ClassLoader that this pattern resolver works with (never null).
 PathMatcher getPathMatcher()
          Return the PathMatcher that this resource pattern resolver uses.
 Resource getResource(String location)
          Return a Resource handle for the specified resource.
 ResourceLoader getResourceLoader()
          Return the ResourceLoader that this pattern resolver works with.
 Resource[] getResources(String locationPattern)
          Resolve the given location pattern into Resource objects.
protected  boolean isJarResource(Resource resource)
          Return whether the given resource handle indicates a jar resource that the doFindPathMatchingJarResources method can handle.
protected  Set retrieveMatchingFiles(File rootDir, String pattern)
          Retrieve files that match the given path pattern, checking the given directory and its subdirectories.
 void setPathMatcher(PathMatcher pathMatcher)
          Set the PathMatcher implementation to use for this resource pattern resolver.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

logger

protected final Log logger
Constructor Detail

PathMatchingResourcePatternResolver

public PathMatchingResourcePatternResolver()
Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader.

ClassLoader access will happen via the thread context class loader.

See Also:
DefaultResourceLoader

PathMatchingResourcePatternResolver

public PathMatchingResourcePatternResolver(ClassLoader classLoader)
Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader.

Parameters:
classLoader - the ClassLoader to load classpath resources with, or null for using the thread context class loader
See Also:
DefaultResourceLoader

PathMatchingResourcePatternResolver

public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader)
Create a new PathMatchingResourcePatternResolver.

ClassLoader access will happen via the thread context class loader.

Parameters:
resourceLoader - the ResourceLoader to load root directories and actual resources with

PathMatchingResourcePatternResolver

public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader,
                                           ClassLoader classLoader)
Create a new PathMatchingResourcePatternResolver.

Parameters:
resourceLoader - the ResourceLoader to load root directories and actual resources with
classLoader - the ClassLoader to load classpath resources with, or null for using the thread context class loader
Method Detail

getResourceLoader

public ResourceLoader getResourceLoader()
Return the ResourceLoader that this pattern resolver works with.


getClassLoader

public ClassLoader getClassLoader()
Return the ClassLoader that this pattern resolver works with (never null).


setPathMatcher

public void setPathMatcher(PathMatcher pathMatcher)
Set the PathMatcher implementation to use for this resource pattern resolver. Default is AntPathMatcher.

See Also:
AntPathMatcher

getPathMatcher

public PathMatcher getPathMatcher()
Return the PathMatcher that this resource pattern resolver uses.


getResource

public Resource getResource(String location)
Description copied from interface: ResourceLoader
Return a Resource handle for the specified resource. The handle should always be a reusable resource descriptor, allowing for multiple getInputStream calls.

Note that a Resource handle does not imply an existing resource; you need to invoke Resource's "exists" to check for existence.

Specified by:
getResource in interface ResourceLoader
Parameters:
location - the resource location
Returns:
a corresponding Resource handle
See Also:
ResourceLoader.CLASSPATH_URL_PREFIX, Resource.exists(), InputStreamSource.getInputStream()

getResources

public Resource[] getResources(String locationPattern)
                        throws IOException
Description copied from interface: ResourcePatternResolver
Resolve the given location pattern into Resource objects.

Overlapping resource entries that point to the same physical resource should be avoided, as far as possible. The result should have set semantics.

Specified by:
getResources in interface ResourcePatternResolver
Parameters:
locationPattern - the location pattern to resolve
Returns:
the corresponding Resource objects
Throws:
IOException - in case of I/O errors

findAllClassPathResources

protected Resource[] findAllClassPathResources(String location)
                                        throws IOException
Find all class location resources with the given location via the ClassLoader.

Parameters:
location - the absolute path within the classpath
Returns:
the result as Resource array
Throws:
IOException - in case of I/O errors
See Also:
ClassLoader.getResources(java.lang.String), convertClassLoaderURL(java.net.URL)

convertClassLoaderURL

protected Resource convertClassLoaderURL(URL url)
Convert the given URL as returned from the ClassLoader into a Resource object.

The default implementation simply creates a UrlResource instance.

Parameters:
url - a URL as returned from the ClassLoader
Returns:
the corresponding Resource object
See Also:
ClassLoader.getResources(java.lang.String), Resource

findPathMatchingResources

protected Resource[] findPathMatchingResources(String locationPattern)
                                        throws IOException
Find all resources that match the given location pattern via the Ant-style PathMatcher. Supports resources in jar files and zip files and in the file system.

Parameters:
locationPattern - the location pattern to match
Returns:
the result as Resource array
Throws:
IOException - in case of I/O errors
See Also:
doFindPathMatchingJarResources(org.springframework.core.io.Resource, java.lang.String), doFindPathMatchingFileResources(org.springframework.core.io.Resource, java.lang.String), PathMatcher

determineRootDir

protected String determineRootDir(String location)
Determine the root directory for the given location.

Used for determining the starting point for file matching, resolving the root directory location to a java.io.File and passing it into retrieveMatchingFiles, with the remainder of the location as pattern.

Will return "/WEB-INF" for the pattern "/WEB-INF/*.xml", for example.

Parameters:
location - the location to check
Returns:
the part of the location that denotes the root directory
See Also:
retrieveMatchingFiles(java.io.File, java.lang.String)

isJarResource

protected boolean isJarResource(Resource resource)
                         throws IOException
Return whether the given resource handle indicates a jar resource that the doFindPathMatchingJarResources method can handle.

The default implementation checks against the URL protocols "jar", "zip" and "wsjar" (the latter are used by BEA WebLogic Server and IBM WebSphere, respectively, but can be treated like jar files).

Parameters:
resource - the resource handle to check (usually the root directory to start path matching from)
Throws:
IOException
See Also:
doFindPathMatchingJarResources(org.springframework.core.io.Resource, java.lang.String)

doFindPathMatchingJarResources

protected Set doFindPathMatchingJarResources(Resource rootDirResource,
                                             String subPattern)
                                      throws IOException
Find all resources in jar files that match the given location pattern via the Ant-style PathMatcher.

Parameters:
rootDirResource - the root directory as Resource
subPattern - the sub pattern to match (below the root directory)
Returns:
the Set of matching Resource instances
Throws:
IOException - in case of I/O errors
See Also:
JarURLConnection, PathMatcher

doFindPathMatchingFileResources

protected Set doFindPathMatchingFileResources(Resource rootDirResource,
                                              String subPattern)
                                       throws IOException
Find all resources in the file system that match the given location pattern via the Ant-style PathMatcher.

Parameters:
rootDirResource - the root directory as Resource
subPattern - the sub pattern to match (below the root directory)
Returns:
the Set of matching Resource instances
Throws:
IOException - in case of I/O errors
See Also:
retrieveMatchingFiles(java.io.File, java.lang.String), PathMatcher

doFindMatchingFileSystemResources

protected Set doFindMatchingFileSystemResources(File rootDir,
                                                String subPattern)
                                         throws IOException
Find all resources in the file system that match the given location pattern via the Ant-style PathMatcher.

Parameters:
rootDir - the root directory in the file system
subPattern - the sub pattern to match (below the root directory)
Returns:
the Set of matching Resource instances
Throws:
IOException - in case of I/O errors
See Also:
retrieveMatchingFiles(java.io.File, java.lang.String), PathMatcher

retrieveMatchingFiles

protected Set retrieveMatchingFiles(File rootDir,
                                    String pattern)
                             throws IOException
Retrieve files that match the given path pattern, checking the given directory and its subdirectories.

Parameters:
rootDir - the directory to start from
pattern - the pattern to match against, relative to the root directory
Returns:
the Set of matching File instances
Throws:
IOException - if directory contents could not be retrieved

doRetrieveMatchingFiles

protected void doRetrieveMatchingFiles(String fullPattern,
                                       File dir,
                                       Set result)
                                throws IOException
Recursively retrieve files that match the given pattern, adding them to the given result list.

Parameters:
fullPattern - the pattern to match against, with preprended root directory path
dir - the current directory
result - the Set of matching File instances to add to
Throws:
IOException - if directory contents could not be retrieved


Copyright (c) 2002-2007 The Spring Framework Project.