henning
Sat, 04 Nov 2006 11:09:12 -0800
Author: henning Date: Sat Nov 4 11:08:45 2006 New Revision: 471247 URL: http://svn.apache.org/viewvc?view=rev&rev=471247 Log: Major rewrite of the ResourceManager implementation to use Iterators and clear up the init logic. Mostly happened while hunting for the template loading race condition found here.
Modified:
jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/resource/ResourceManagerImpl.java
Modified:
jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/resource/ResourceManagerImpl.java
URL:
http://svn.apache.org/viewvc/jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/resource/ResourceManagerImpl.java?view=diff&rev=471247&r1=471246&r2=471247
==============================================================================
---
jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/resource/ResourceManagerImpl.java
(original)
+++
jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/resource/ResourceManagerImpl.java
Sat Nov 4 11:08:45 2006
@@ -16,12 +16,14 @@
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
- * under the License.
+ * under the License.
*/
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
import java.util.Vector;
import org.apache.commons.collections.ExtendedProperties;
@@ -35,171 +37,163 @@
import org.apache.velocity.util.ClassUtils;
import org.apache.velocity.util.StringUtils;
+
/**
- * Class to manage the text resource for the Velocity
- * Runtime.
+ * Class to manage the text resource for the Velocity Runtime.
*
- * @author <a href="[EMAIL PROTECTED]">Will Glass-Husain</a>
- * @author <a href="[EMAIL PROTECTED]">Jason van Zyl</a>
- * @author <a href="[EMAIL PROTECTED]">Paulo Gaspar</a>
- * @author <a href="[EMAIL PROTECTED]">Geir Magnusson Jr.</a>
- * @version $Id$
+ * @author <a href="[EMAIL PROTECTED]">Will Glass-Husain</a>
+ * @author <a href="[EMAIL PROTECTED]">Jason van Zyl</a>
+ * @author <a href="[EMAIL PROTECTED]">Paulo Gaspar</a>
+ * @author <a href="[EMAIL PROTECTED]">Geir Magnusson Jr.</a>
+ * @author <a href="[EMAIL PROTECTED]">Henning P. Schmiedehausen</a>
+ * @version $Id$
*/
-public class ResourceManagerImpl implements ResourceManager
+public class ResourceManagerImpl
+ implements ResourceManager
{
- /**
- * A template resources.
- */
+
+ /** A template resources. */
public static final int RESOURCE_TEMPLATE = 1;
- /**
- * A static content resource.
- */
+ /** A static content resource. */
public static final int RESOURCE_CONTENT = 2;
- /**
- * token used to identify the loader internally
- */
+ /** token used to identify the loader internally. */
private static final String RESOURCE_LOADER_IDENTIFIER =
"_RESOURCE_LOADER_IDENTIFIER_";
- /**
- * Object implementing ResourceCache to
- * be our resource manager's Resource cache.
- */
+ /** Object implementing ResourceCache to be our resource manager's
Resource cache. */
protected ResourceCache globalCache = null;
- /**
- * The List of templateLoaders that the Runtime will
- * use to locate the InputStream source of a template.
- */
- protected ArrayList resourceLoaders = new ArrayList();
+ /** The List of templateLoaders that the Runtime will use to locate the
InputStream source of a template. */
+ protected final List resourceLoaders = new ArrayList();
/**
- * This is a list of the template input stream source
- * initializers, basically properties for a particular
- * template stream source. The order in this list
- * reflects numbering of the properties i.e.
+ * This is a list of the template input stream source initializers,
basically properties for a particular template stream
+ * source. The order in this list reflects numbering of the properties i.e.
*
- * <loader-id>.resource.loader.<property> = <value>
+ * <p><loader-id>.resource.loader.<property> =
<value></p>
*/
- private ArrayList sourceInitializerList = new ArrayList();
+ private final List sourceInitializerList = new ArrayList();
/**
- * Each loader needs a configuration object for
- * its initialization, this flags keeps track of whether
- * or not the configuration objects have been created
- * for the resource loaders.
+ * Has this Manager been initialized?
*/
- private boolean resourceLoaderInitializersActive = false;
+ private boolean isInit = false;
- /**
- * switch to turn off log notice when a resource is found for
- * the first time.
- */
- private boolean logWhenFound = true;
+ /** switch to turn off log notice when a resource is found for the first
time. */
+ private boolean logWhenFound = true;
+ /** The internal RuntimeServices object. */
protected RuntimeServices rsvc = null;
+
+ /** Logging. */
protected Log log = null;
/**
* Initialize the ResourceManager.
- * @param rs
- * @throws Exception
+ *
+ * @param rs The Runtime Services object which is associated with this
Resource Manager.
+ *
+ * @throws Exception
*/
- public void initialize( RuntimeServices rs )
+ public synchronized void initialize(final RuntimeServices rsvc)
throws Exception
{
- rsvc = rs;
+ if (isInit)
+ {
+ log.warn("Re-initialization of ResourceLoader attempted!");
+ return;
+ }
+
+ ResourceLoader resourceLoader = null;
+
+ this.rsvc = rsvc;
log = rsvc.getLog();
log.debug("Default ResourceManager initializing. (" + this.getClass()
+ ")");
- ResourceLoader resourceLoader;
-
assembleResourceLoaderInitializers();
- for (int i = 0; i < sourceInitializerList.size(); i++)
+ for (Iterator it = sourceInitializerList.iterator(); it.hasNext();)
{
/**
* Resource loader can be loaded either via class name or be passed
* in as an instance.
*/
- ExtendedProperties configuration =
- (ExtendedProperties) sourceInitializerList.get(i);
+ ExtendedProperties configuration = (ExtendedProperties) it.next();
+
String loaderClass =
StringUtils.nullTrim(configuration.getString("class"));
- ResourceLoader loaderInstance =
- (ResourceLoader) configuration.get("instance");
+ ResourceLoader loaderInstance = (ResourceLoader)
configuration.get("instance");
- if ( (loaderClass == null) && (loaderInstance == null) )
+ if (loaderInstance != null)
{
- log.error("Unable to find '"
- +
configuration.getString(RESOURCE_LOADER_IDENTIFIER)
- + ".resource.loader.class' specification in
configuation."
- + " This is a critical value. Please adjust
configuration.");
- continue;
-
+ resourceLoader = loaderInstance;
}
- else if ( loaderInstance != null )
+ else if (loaderClass != null)
{
- resourceLoader = loaderInstance;
-
+ resourceLoader = ResourceLoaderFactory.getLoader(rsvc,
loaderClass);
}
else
{
- resourceLoader = ResourceLoaderFactory.getLoader( rsvc,
loaderClass);
+ log.error("Unable to find '" +
+ configuration.getString(RESOURCE_LOADER_IDENTIFIER) +
+ ".resource.loader.class' specification in
configuation." +
+ " This is a critical value. Please adjust
configuration.");
+
+ continue; // for(...
}
- resourceLoader.commonInit( rsvc, configuration);
+ resourceLoader.commonInit(rsvc, configuration);
resourceLoader.init(configuration);
resourceLoaders.add(resourceLoader);
-
}
/*
* now see if this is overridden by configuration
*/
- logWhenFound = rsvc.getBoolean(
RuntimeConstants.RESOURCE_MANAGER_LOGWHENFOUND, true );
+ logWhenFound =
rsvc.getBoolean(RuntimeConstants.RESOURCE_MANAGER_LOGWHENFOUND, true);
/*
* now, is a global cache specified?
*/
- String claz = rsvc.getString(
RuntimeConstants.RESOURCE_MANAGER_CACHE_CLASS );
+ String cacheClassName =
rsvc.getString(RuntimeConstants.RESOURCE_MANAGER_CACHE_CLASS);
- Object o = null;
+ Object cacheObject = null;
- if ( claz != null && claz.length() > 0 )
+ if (org.apache.commons.lang.StringUtils.isNotEmpty(cacheClassName))
{
+
try
{
- o = ClassUtils.getNewInstance( claz );
+ cacheObject = ClassUtils.getNewInstance(cacheClassName);
}
- catch (ClassNotFoundException cnfe )
+ catch (ClassNotFoundException cnfe)
{
- log.error("The specified class for ResourceCache (" + claz +
+ log.error("The specified class for ResourceCache (" +
cacheClassName +
") does not exist or is not accessible to the
current classloader.");
- o = null;
+ cacheObject = null;
}
- if (!(o instanceof ResourceCache) )
+ if (!(cacheObject instanceof ResourceCache))
{
- log.error("The specified class for ResourceCache (" + claz +
+ log.error("The specified class for ResourceCache (" +
cacheClassName +
") does not implement " +
ResourceCache.class.getName() +
" ResourceManager. Using default ResourceCache
implementation.");
- o = null;
+ cacheObject = null;
}
}
/*
* if we didn't get through that, just use the default.
*/
- if (o == null)
+ if (cacheObject == null)
{
- o = new ResourceCacheImpl();
+ cacheObject = new ResourceCacheImpl();
}
- globalCache = (ResourceCache)o;
+ globalCache = (ResourceCache) cacheObject;
globalCache.initialize(rsvc);
@@ -207,25 +201,17 @@
}
/**
- * This will produce a List of Hashtables, each
- * hashtable contains the intialization info for
- * a particular resource loader. This Hastable
- * will be passed in when initializing the
- * the template loader.
+ * This will produce a List of Hashtables, each hashtable contains the
intialization info for a particular resource loader. This
+ * Hashtable will be passed in when initializing the the template loader.
*/
private void assembleResourceLoaderInitializers()
{
- if (resourceLoaderInitializersActive)
- {
- return;
- }
-
- Vector resourceLoaderNames =
-
rsvc.getConfiguration().getVector(RuntimeConstants.RESOURCE_LOADER);
+ Vector resourceLoaderNames =
rsvc.getConfiguration().getVector(RuntimeConstants.RESOURCE_LOADER);
StringUtils.trimStrings(resourceLoaderNames);
- for (int i = 0; i < resourceLoaderNames.size(); i++)
+ for (Iterator it = resourceLoaderNames.iterator(); it.hasNext(); )
{
+
/*
* The loader id might look something like the following:
*
@@ -234,20 +220,22 @@
* The loader id is the prefix used for all properties
* pertaining to a particular loader.
*/
- String loaderID =
- resourceLoaderNames.get(i) + "." +
RuntimeConstants.RESOURCE_LOADER;
+ String loaderName = (String) it.next();
+ StringBuffer loaderID = new StringBuffer(loaderName);
+ loaderID.append(".").append(RuntimeConstants.RESOURCE_LOADER);
- ExtendedProperties loaderConfiguration =
- rsvc.getConfiguration().subset(loaderID);
+ ExtendedProperties loaderConfiguration =
+ rsvc.getConfiguration().subset(loaderID.toString());
/*
* we can't really count on ExtendedProperties to give us an
empty set
*/
- if ( loaderConfiguration == null)
+ if (loaderConfiguration == null)
{
- log.warn("ResourceManager : No configuration information for
resource loader named '"
- + resourceLoaderNames.get(i) + "'. Skipping.");
+ log.warn("ResourceManager : No configuration information for
resource loader named '" +
+ loaderName + "'. Skipping.");
+
continue;
}
@@ -257,7 +245,7 @@
* in the 'name' field
*/
- loaderConfiguration.setProperty( RESOURCE_LOADER_IDENTIFIER,
resourceLoaderNames.get(i));
+ loaderConfiguration.setProperty(RESOURCE_LOADER_IDENTIFIER,
loaderName);
/*
* Add resources to the list of resource loader
@@ -265,27 +253,26 @@
*/
sourceInitializerList.add(loaderConfiguration);
}
-
- resourceLoaderInitializersActive = true;
}
/**
- * Gets the named resource. Returned class type corresponds to specified
type
- * (i.e. <code>Template</code> to <code>RESOURCE_TEMPLATE</code>).
+ * Gets the named resource. Returned class type corresponds to specified
type (i.e. <code>Template</code> to <code>
+ * RESOURCE_TEMPLATE</code>).
*
- * @param resourceName The name of the resource to retrieve.
- * @param resourceType The type of resource
(<code>RESOURCE_TEMPLATE</code>,
- * <code>RESOURCE_CONTENT</code>, etc.).
- * @param encoding The character encoding to use.
- * @return Resource with the template parsed and ready.
- * @throws ResourceNotFoundException if template not found
- * from any available source.
- * @throws ParseErrorException if template cannot be parsed due
- * to syntax (or other) error.
- * @throws Exception if a problem in parse
- */
- public synchronized Resource getResource(String resourceName, int
resourceType, String encoding )
- throws ResourceNotFoundException, ParseErrorException, Exception
+ * @param resourceName The name of the resource to retrieve.
+ * @param resourceType The type of resource
(<code>RESOURCE_TEMPLATE</code>, <code>RESOURCE_CONTENT</code>, etc.).
+ * @param encoding The character encoding to use.
+ *
+ * @return Resource with the template parsed and ready.
+ *
+ * @throws ResourceNotFoundException if template not found from any
available source.
+ * @throws ParseErrorException if template cannot be parsed due to
syntax (or other) error.
+ * @throws Exception if a problem in parse
+ */
+ public synchronized Resource getResource(final String resourceName, final
int resourceType, final String encoding)
+ throws ResourceNotFoundException,
+ ParseErrorException,
+ Exception
{
/*
* Check to see if the resource was placed in the cache.
@@ -300,7 +287,7 @@
String resourceKey = resourceType + resourceName;
Resource resource = globalCache.get(resourceKey);
- if( resource != null)
+ if (resource != null)
{
/*
* refresh the resource
@@ -308,9 +295,9 @@
try
{
- refreshResource( resource, encoding );
+ refreshResource(resource, encoding);
}
- catch( ResourceNotFoundException rnfe )
+ catch (ResourceNotFoundException rnfe)
{
/*
* something exceptional happened to that resource
@@ -318,19 +305,23 @@
* so clear the cache and try again
*/
- globalCache.remove( resourceKey );
+ globalCache.remove(resourceKey);
- return getResource( resourceName, resourceType, encoding );
+ return getResource(resourceName, resourceType, encoding);
}
- catch( ParseErrorException pee )
+ catch (ParseErrorException pee)
{
log.error("ResourceManager.getResource() exception", pee);
throw pee;
}
- catch( Exception eee )
+ catch (RuntimeException re)
{
- log.error("ResourceManager.getResource() exception", eee);
- throw eee;
+ throw re;
+ }
+ catch (Exception e)
+ {
+ log.error("ResourceManager.getResource() exception", e);
+ throw e;
}
}
else
@@ -341,28 +332,32 @@
* it's not in the cache, so load it.
*/
- resource = loadResource( resourceName, resourceType, encoding
);
+ resource = loadResource(resourceName, resourceType, encoding);
if (resource.getResourceLoader().isCachingOn())
{
globalCache.put(resourceKey, resource);
}
}
- catch( ResourceNotFoundException rnfe2 )
+ catch (ResourceNotFoundException rnfe)
{
log.error("ResourceManager : unable to find resource '" +
resourceName + "' in any resource loader.");
- throw rnfe2;
+ throw rnfe;
}
- catch( ParseErrorException pee )
+ catch (ParseErrorException pee)
{
log.error("ResourceManager.getResource() parse exception",
pee);
throw pee;
}
- catch( Exception ee )
+ catch (RuntimeException re)
{
- log.error("ResourceManager.getResource() exception new", ee);
- throw ee;
+ throw re;
+ }
+ catch (Exception e)
+ {
+ log.error("ResourceManager.getResource() exception new", e);
+ throw e;
}
}
@@ -370,28 +365,29 @@
}
/**
- * Loads a resource from the current set of resource loaders
+ * Loads a resource from the current set of resource loaders.
*
- * @param resourceName The name of the resource to retrieve.
- * @param resourceType The type of resource
(<code>RESOURCE_TEMPLATE</code>,
- * <code>RESOURCE_CONTENT</code>, etc.).
- * @param encoding The character encoding to use.
- * @return Resource with the template parsed and ready.
- * @throws ResourceNotFoundException if template not found
- * from any available source.
- * @throws ParseErrorException if template cannot be parsed due
- * to syntax (or other) error.
- * @throws Exception if a problem in parse
- */
- protected Resource loadResource(String resourceName, int resourceType,
String encoding )
- throws ResourceNotFoundException, ParseErrorException, Exception
+ * @param resourceName The name of the resource to retrieve.
+ * @param resourceType The type of resource
(<code>RESOURCE_TEMPLATE</code>, <code>RESOURCE_CONTENT</code>, etc.).
+ * @param encoding The character encoding to use.
+ *
+ * @return Resource with the template parsed and ready.
+ *
+ * @throws ResourceNotFoundException if template not found from any
available source.
+ * @throws ParseErrorException if template cannot be parsed due to
syntax (or other) error.
+ * @throws Exception if a problem in parse
+ */
+ protected Resource loadResource(String resourceName, int resourceType,
String encoding)
+ throws ResourceNotFoundException,
+ ParseErrorException,
+ Exception
{
Resource resource = ResourceFactory.getResource(resourceName,
resourceType);
- resource.setRuntimeServices( rsvc );
+ resource.setRuntimeServices(rsvc);
- resource.setName( resourceName );
- resource.setEncoding( encoding );
+ resource.setName(resourceName);
+ resource.setEncoding(encoding);
/*
* Now we have to try to find the appropriate
@@ -401,13 +397,11 @@
* make a resource with.
*/
- long howOldItWas = 0; // Initialize to avoid warnings
+ long howOldItWas = 0;
- ResourceLoader resourceLoader = null;
-
- for (int i = 0; i < resourceLoaders.size(); i++)
+ for (Iterator it = resourceLoaders.iterator(); it.hasNext();)
{
- resourceLoader = (ResourceLoader) resourceLoaders.get(i);
+ ResourceLoader resourceLoader = (ResourceLoader) it.next();
resource.setResourceLoader(resourceLoader);
/*
@@ -417,29 +411,31 @@
try
{
+
if (resource.process())
{
- /*
- * FIXME (gmj)
- * moved in here - technically still
- * a problem - but the resource needs to be
- * processed before the loader can figure
- * it out due to to the new
- * multi-path support - will revisit and fix
- */
-
- if (logWhenFound && log.isDebugEnabled())
- {
- log.debug("ResourceManager : found " + resourceName +
+ /*
+ * FIXME (gmj)
+ * moved in here - technically still
+ * a problem - but the resource needs to be
+ * processed before the loader can figure
+ * it out due to to the new
+ * multi-path support - will revisit and fix
+ */
+
+ if (logWhenFound && log.isDebugEnabled())
+ {
+ log.debug("ResourceManager : found " + resourceName +
" with loader " +
resourceLoader.getClassName());
- }
+ }
+
+ howOldItWas = resourceLoader.getLastModified(resource);
- howOldItWas = resourceLoader.getLastModified( resource );
- break;
- }
+ break;
+ }
}
- catch( ResourceNotFoundException rnfe )
+ catch (ResourceNotFoundException rnfe)
{
/*
* that's ok - it's possible to fail in
@@ -453,18 +449,15 @@
*/
if (resource.getData() == null)
{
- throw new ResourceNotFoundException(
- "Unable to find resource '" + resourceName + "'");
+ throw new ResourceNotFoundException("Unable to find resource '" +
resourceName + "'");
}
/*
* some final cleanup
*/
- resource.setLastModified( howOldItWas );
-
- resource.setModificationCheckInterval(
- resourceLoader.getModificationCheckInterval());
+ resource.setLastModified(howOldItWas);
+
resource.setModificationCheckInterval(resource.getResourceLoader().getModificationCheckInterval());
resource.touch();
@@ -472,23 +465,22 @@
}
/**
- * Takes an existing resource, and 'refreshes' it. This
- * generally means that the source of the resource is checked
- * for changes according to some cache/check algorithm
- * and if the resource changed, then the resource data is
- * reloaded and re-parsed.
- *
- * @param resource resource to refresh
- *
- * @throws ResourceNotFoundException if template not found
- * from current source for this Resource
- * @throws ParseErrorException if template cannot be parsed due
- * to syntax (or other) error.
- * @throws Exception if a problem in parse
- */
- protected void refreshResource( Resource resource, String encoding )
- throws ResourceNotFoundException, ParseErrorException, Exception
+ * Takes an existing resource, and 'refreshes' it. This generally means
that the source of the resource is checked for changes
+ * according to some cache/check algorithm and if the resource changed,
then the resource data is reloaded and re-parsed.
+ *
+ * @param resource resource to refresh
+ * @param encoding character encoding of the resource to refresh.
+ *
+ * @throws ResourceNotFoundException if template not found from current
source for this Resource
+ * @throws ParseErrorException if template cannot be parsed due to
syntax (or other) error.
+ * @throws Exception if a problem in parse
+ */
+ protected void refreshResource(final Resource resource, final String
encoding)
+ throws ResourceNotFoundException,
+ ParseErrorException,
+ Exception
{
+
/*
* The resource knows whether it needs to be checked
* or not, and the resource's loader can check to
@@ -497,7 +489,7 @@
* the input stream and parse it to make a new
* AST for the resource.
*/
- if ( resource.requiresChecking() )
+ if (resource.requiresChecking())
{
/*
* touch() the resource to reset the counters
@@ -505,7 +497,7 @@
resource.touch();
- if( resource.isSourceModified() )
+ if (resource.isSourceModified())
{
/*
* now check encoding info. It's possible that the newly
declared
@@ -513,21 +505,21 @@
* this strikes me as bad...
*/
- if (!resource.getEncoding().equals( encoding ) )
+ if
(!org.apache.commons.lang.StringUtils.equals(resource.getEncoding(), encoding))
{
log.warn("Declared encoding for template '" +
- resource.getName() +
- "' is different on reload. Old = '" +
- resource.getEncoding() + "' New = '" + encoding);
+ resource.getName() +
+ "' is different on reload. Old = '" +
+ resource.getEncoding() + "' New = '" + encoding);
- resource.setEncoding( encoding );
+ resource.setEncoding(encoding);
}
/*
* read how old the resource is _before_
* processing (=>reading) it
*/
- long howOldItWas =
resource.getResourceLoader().getLastModified( resource );
+ long howOldItWas =
resource.getResourceLoader().getLastModified(resource);
/*
* read in the fresh stream and parse
@@ -540,54 +532,51 @@
* the modification check counters
*/
- resource.setLastModified( howOldItWas );
+ resource.setLastModified(howOldItWas);
}
}
}
- /**
- * Gets the named resource. Returned class type corresponds to specified
type
- * (i.e. <code>Template</code> to <code>RESOURCE_TEMPLATE</code>).
- *
- * @param resourceName The name of the resource to retrieve.
- * @param resourceType The type of resource
(<code>RESOURCE_TEMPLATE</code>,
- * <code>RESOURCE_CONTENT</code>, etc.).
- * @return Resource with the template parsed and ready.
- * @throws ResourceNotFoundException if template not found
- * from any available source.
- * @throws ParseErrorException if template cannot be parsed due
- * to syntax (or other) error.
- * @throws Exception if a problem in parse
- *
- * @deprecated Use
- * [EMAIL PROTECTED] #getResource(String resourceName, int resourceType,
- * String encoding )}
+ /**
+ * Gets the named resource. Returned class type corresponds to specified
type (i.e. <code>Template</code> to <code>
+ * RESOURCE_TEMPLATE</code>).
+ *
+ * @param resourceName The name of the resource to retrieve.
+ * @param resourceType The type of resource
(<code>RESOURCE_TEMPLATE</code>, <code>RESOURCE_CONTENT</code>, etc.).
+ *
+ * @return Resource with the template parsed and ready.
+ *
+ * @throws ResourceNotFoundException if template not found from any
available source.
+ * @throws ParseErrorException if template cannot be parsed due to
syntax (or other) error.
+ * @throws Exception if a problem in parse
+ *
+ * @deprecated Use [EMAIL PROTECTED] #getResource(String resourceName,
int resourceType, String encoding )}
*/
- public Resource getResource(String resourceName, int resourceType )
- throws ResourceNotFoundException, ParseErrorException, Exception
+ public Resource getResource(String resourceName, int resourceType)
+ throws ResourceNotFoundException,
+ ParseErrorException,
+ Exception
{
- return getResource( resourceName, resourceType,
RuntimeConstants.ENCODING_DEFAULT);
+ return getResource(resourceName, resourceType,
RuntimeConstants.ENCODING_DEFAULT);
}
/**
- * Determines is a template exists, and returns name of the loader that
- * provides it. This is a slightly less hokey way to support
- * the Velocity.templateExists() utility method, which was broken
- * when per-template encoding was introduced. We can revisit this.
+ * Determines if a template exists, and returns name of the loader that
provides it. This is a slightly less hokey way to
+ * support the Velocity.templateExists() utility method, which was broken
when per-template encoding was introduced. We can
+ * revisit this.
*
- * @param resourceName Name of template or content resource
- * @return class name of loader than can provide it
+ * @param resourceName Name of template or content resource
+ *
+ * @return class name of loader than can provide it
*/
- public String getLoaderNameForResource(String resourceName )
+ public String getLoaderNameForResource(String resourceName)
{
- ResourceLoader resourceLoader = null;
-
/*
* loop through our loaders...
*/
- for (int i = 0; i < resourceLoaders.size(); i++)
+ for (Iterator it = resourceLoaders.iterator(); it.hasNext(); )
{
- resourceLoader = (ResourceLoader) resourceLoaders.get(i);
+ ResourceLoader resourceLoader = (ResourceLoader) it.next();
InputStream is = null;
@@ -597,14 +586,14 @@
*/
try
{
- is=resourceLoader.getResourceStream( resourceName );
+ is = resourceLoader.getResourceStream(resourceName);
- if( is != null)
+ if (is != null)
{
return resourceLoader.getClass().toString();
}
}
- catch( ResourceNotFoundException e)
+ catch (ResourceNotFoundException rnfe)
{
/*
* this isn't a problem. keep going
@@ -612,23 +601,24 @@
}
finally
{
+
/*
* if we did find one, clean up because we were
* returned an open stream
*/
if (is != null)
{
+
try
{
is.close();
}
catch (IOException supressed)
- {
- }
+ { }
}
}
}
return null;
}
-}
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]