📄 resourcemanagerimpl.java
字号:
package org.apache.velocity.runtime.resource;
/*
* Copyright 2000-2001,2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "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.
*/
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Vector;
import java.io.InputStream;
import java.io.IOException;
import org.apache.velocity.runtime.RuntimeServices;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.ResourceFactory;
import org.apache.velocity.runtime.resource.loader.ResourceLoader;
import org.apache.velocity.runtime.resource.loader.ResourceLoaderFactory;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.commons.collections.ExtendedProperties;
/**
* Class to manage the text resource for the Velocity
* Runtime.
*
* @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
* @author <a href="mailto:paulo.gaspar@krankikom.de">Paulo Gaspar</a>
* @author <a href="mailto:geirm@optonline.net">Geir Magnusson Jr.</a>
* @version $Id: ResourceManagerImpl.java,v 1.7.4.1 2004/03/03 23:23:01 geirm Exp $
*/
public class ResourceManagerImpl implements ResourceManager
{
/**
* A template resources.
*/
public static final int RESOURCE_TEMPLATE = 1;
/**
* A static content resource.
*/
public static final int RESOURCE_CONTENT = 2;
/**
* 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.
*/
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();
/**
* 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>
*/
private ArrayList sourceInitializerList = new ArrayList();
/**
* This is a map of public name of the template
* stream source to it's initializer. This is so
* that clients of velocity can set properties of
* a template source stream with its public name.
* So for example, a client could set the
* File.resource.path property and this would
* change the resource.path property for the
* file template stream source.
*/
private Hashtable sourceInitializerMap = new Hashtable();
/**
* 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.
*/
private boolean resourceLoaderInitializersActive = false;
/**
* switch to turn off log notice when a resource is found for
* the first time.
*/
private boolean logWhenFound = true;
protected RuntimeServices rsvc = null;
/**
* Initialize the ResourceManager.
*/
public void initialize( RuntimeServices rs )
throws Exception
{
rsvc = rs;
rsvc.info("Default ResourceManager initializing. (" + this.getClass() + ")");
ResourceLoader resourceLoader;
assembleResourceLoaderInitializers();
for (int i = 0; i < sourceInitializerList.size(); i++)
{
ExtendedProperties configuration = (ExtendedProperties) sourceInitializerList.get(i);
String loaderClass = configuration.getString("class");
if ( loaderClass == null)
{
rsvc.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 = ResourceLoaderFactory.getLoader( rsvc, loaderClass);
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 );
/*
* now, is a global cache specified?
*/
String claz = rsvc.getString( RuntimeConstants.RESOURCE_MANAGER_CACHE_CLASS );
Object o = null;
if ( claz != null && claz.length() > 0 )
{
try
{
o = Class.forName( claz ).newInstance();
}
catch (ClassNotFoundException cnfe )
{
String err = "The specified class for ResourceCache ("
+ claz
+ ") does not exist (or is not accessible to the current classlaoder).";
rsvc.error( err );
o = null;
}
if (!(o instanceof ResourceCache) )
{
String err = "The specified class for ResourceCache ("
+ claz
+ ") does not implement org.apache.runtime.resource.ResourceCache."
+ " ResourceManager. Using default ResourceCache implementation.";
rsvc.error( err);
o = null;
}
}
/*
* if we didn't get through that, just use the default.
*/
if ( o == null)
o = new ResourceCacheImpl();
globalCache = (ResourceCache) o;
globalCache.initialize( rsvc );
rsvc.info("Default ResourceManager initialization complete.");
}
/**
* 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.
*/
private void assembleResourceLoaderInitializers()
{
if (resourceLoaderInitializersActive)
{
return;
}
Vector resourceLoaderNames =
rsvc.getConfiguration().getVector(RuntimeConstants.RESOURCE_LOADER);
for (int i = 0; i < resourceLoaderNames.size(); i++)
{
/*
* The loader id might look something like the following:
*
* file.resource.loader
*
* The loader id is the prefix used for all properties
* pertaining to a particular loader.
*/
String loaderID =
resourceLoaderNames.get(i) + "." + RuntimeConstants.RESOURCE_LOADER;
ExtendedProperties loaderConfiguration =
rsvc.getConfiguration().subset(loaderID);
/*
* we can't really count on ExtendedProperties to give us an empty set
*/
if ( loaderConfiguration == null)
{
rsvc.warn("ResourceManager : No configuration information for resource loader named '"
+ resourceLoaderNames.get(i) + "'. Skipping.");
continue;
}
/*
* add the loader name token to the initializer if we need it
* for reference later. We can't count on the user to fill
* in the 'name' field
*/
loaderConfiguration.setProperty( RESOURCE_LOADER_IDENTIFIER, resourceLoaderNames.get(i));
/*
* Add resources to the list of resource loader
* initializers.
*/
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>).
*
* @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 Resource getResource(String resourceName, int resourceType, String encoding )
throws ResourceNotFoundException, ParseErrorException, Exception
{
/*
* Check to see if the resource was placed in the cache.
* If it was placed in the cache then we will use
* the cached version of the resource. If not we
* will load it.
*/
Resource resource = globalCache.get(resourceName);
if( resource != null)
{
/*
* refresh the resource
*/
try
{
refreshResource( resource, encoding );
}
catch( ResourceNotFoundException rnfe )
{
/*
* something exceptional happened to that resource
* this could be on purpose,
* so clear the cache and try again
*/
globalCache.remove( resourceName );
return getResource( resourceName, resourceType, encoding );
}
catch( ParseErrorException pee )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -