You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by ra...@apache.org on 2003/03/02 20:40:14 UTC
cvs commit: jakarta-jetspeed/src/java/org/apache/jetspeed/services/template JetspeedTemplateLocatorService.java
raphael 2003/03/02 11:40:14
Modified: src/java/org/apache/jetspeed/services/template
JetspeedTemplateLocatorService.java
Log:
Updated template locator code to use media types fallback.
Revision Changes Path
1.14 +342 -156 jakarta-jetspeed/src/java/org/apache/jetspeed/services/template/JetspeedTemplateLocatorService.java
Index: JetspeedTemplateLocatorService.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/services/template/JetspeedTemplateLocatorService.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- JetspeedTemplateLocatorService.java 8 Nov 2002 10:05:19 -0000 1.13
+++ JetspeedTemplateLocatorService.java 2 Mar 2003 19:40:13 -0000 1.14
@@ -61,6 +61,7 @@
// java.util
import java.util.Iterator;
import java.util.List;
+import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.Locale;
@@ -146,8 +147,8 @@
* @exception throws a <code>InitializationException</code> if the service
* fails to initialize
*/
- public synchronized void init(ServletConfig conf) throws InitializationException {
-
+ public synchronized void init(ServletConfig conf) throws InitializationException
+ {
// already initialized
if (getInit()) return;
@@ -155,17 +156,21 @@
// initialization done
setInit(true);
-
}
- public void init() throws InitializationException {
+ public void init() throws InitializationException
+ {
Log.info( "Late init for JetspeedTemplateLocatorService called" );
- while( !getInit() ) {
+ while( !getInit() )
+ {
//Not yet...
- try {
+ try
+ {
Thread.sleep( 100 );
Log.info( "Waiting for init of JetspeedTemplateLocatorService..." );
- } catch (InterruptedException ie ) {
+ }
+ catch (InterruptedException ie )
+ {
Log.error( ie );
}
}
@@ -175,7 +180,8 @@
* This is the shutdown method called by the
* Turbine <code>Service</code> framework
*/
- public void shutdown() {
+ public void shutdown()
+ {
}
/**
@@ -190,25 +196,53 @@
*/
public String locateScreenTemplate(RunData data, String template)
{
- String path = localizeTemplateName(data);
+ List templatePaths = localizeTemplateName(data);
+ Iterator i = templatePaths.iterator();
+ String located = null;
- String located = locateTemplate(data, DIR_SCREENS, path, template);
- if (null == located)
+ while (i.hasNext())
{
- // Try to locate it directly on file system, perhaps it was recently added
- useNameCache = false;
+ String path = (String)i.next();
located = locateTemplate(data, DIR_SCREENS, path, template);
+
+ if (null == located)
+ {
+ // Try to locate it directly on file system, perhaps it was recently added
+ useNameCache = false;
+ located = locateTemplate(data, DIR_SCREENS, path, template);
+
+ if (null != located)
+ {
+ // add it to the map
+ templateMap.put( located, null );
+ }
+
+ useNameCache = true;
+ }
+
if (null != located)
{
- // add it to the map
- templateMap.put( located, null );
+ return located;
}
- else
+ }
+
+ if (null == located)
+ {
+ //we have not found the requested sreen but still need to return
+ //something, search for the default screen
+
+ i = templatePaths.iterator();
+ template = "/default." + getTemplateExtension(template);
+ while (i.hasNext())
{
- template = "/default." + getTemplateExtension(template);
+ String path = (String)i.next();
located = locateTemplate(data, DIR_SCREENS, path, template);
+
+ if (null != located)
+ {
+ return located;
+ }
}
- useNameCache = true;
}
return located;
@@ -226,129 +260,191 @@
*/
public String locateLayoutTemplate(RunData data, String template)
{
- String path = localizeTemplateName(data);
+ List templatePaths = localizeTemplateName(data);
+ Iterator i = templatePaths.iterator();
+ String located = null;
- String located = locateTemplate(data, DIR_LAYOUTS, path, template);
- if (null == located)
+ while (i.hasNext())
{
- // Try to locate it directly on file system, perhaps it was recently added
- useNameCache = false;
+ String path = (String)i.next();
located = locateTemplate(data, DIR_LAYOUTS, path, template);
+
+ if (null == located)
+ {
+ // Try to locate it directly on file system, perhaps it was recently added
+ useNameCache = false;
+ located = locateTemplate(data, DIR_LAYOUTS, path, template);
+
+ if (null != located)
+ {
+ // add it to the map
+ templateMap.put( located, null );
+ }
+
+ useNameCache = true;
+ }
+
if (null != located)
{
- // add it to the map
- templateMap.put( located, null );
+ return located;
}
- else
+ }
+
+ if (null == located)
+ {
+ //we have not found the requested layout but still need to return
+ //something, search for the default layout
+
+ i = templatePaths.iterator();
+ template = "/default." + getTemplateExtension(template);
+ while (i.hasNext())
{
- template = "/default." + getTemplateExtension(template);
+ String path = (String)i.next();
located = locateTemplate(data, DIR_LAYOUTS, path, template);
- }
- useNameCache = true;
+
+ if (null != located)
+ {
+ return located;
+ }
+ }
}
return located;
}
/**
- * Locate a portlet template using Jetspeed template location algorithm, searching by
+ * Locate a controller template using Jetspeed template location algorithm, searching by
* mediatype and language criteria extracted from the request state in rundata.
*
* @param data The rundata for the request.
* @param template The name of the template.
*
- * @return The path relative to the portlets directory for the requested portlet template,
+ * @return The path relative to the controllers directory for the requested controller template,
* or null if not found.
*/
- public String locatePortletTemplate(RunData data, String template)
+ public String locateNavigationTemplate(RunData data, String template)
{
- String path = localizeTemplateName(data);
+ List templatePaths = localizeTemplateName(data);
+ Iterator i = templatePaths.iterator();
- String located = locateTemplate(data, DIR_PORTLETS, path, template);
- if (null == located)
+ while (i.hasNext())
{
- // Try to locate it directly on file system, perhaps it was recently added
- useNameCache = false;
- located = locateTemplate(data, DIR_PORTLETS, path, template);
+ String path = (String)i.next();
+ String located = locateTemplate(data, DIR_NAVIGATIONS, path, template);
+
+ if (null == located)
+ {
+ // Try to locate it directly on file system, perhaps it was recently added
+ useNameCache = false;
+ located = locateTemplate(data, DIR_NAVIGATIONS, path, template);
+
+ if (null != located)
+ {
+ // add it to the map
+ templateMap.put( located, null );
+ }
+
+ useNameCache = true;
+ }
+
if (null != located)
{
- // add it to the map
- templateMap.put( located, null );
+ return located;
}
- useNameCache = true;
}
- if (null != located)
- return DIR_PORTLETS + located;
return null;
}
/**
- * Locate a control template using Jetspeed template location algorithm, searching by
+ * Locate a portlet template using Jetspeed template location algorithm, searching by
* mediatype and language criteria extracted from the request state in rundata.
*
* @param data The rundata for the request.
* @param template The name of the template.
*
- * @return The path relative to the controls directory for the requested control template,
+ * @return The path relative to the portlets directory for the requested portlet template,
* or null if not found.
*/
- public String locateControlTemplate(RunData data, String template)
+ public String locatePortletTemplate(RunData data, String template)
{
- String path = localizeTemplateName(data);
+ List templatePaths = localizeTemplateName(data);
+ Iterator i = templatePaths.iterator();
- String located = locateTemplate(data, DIR_CONTROLS, path, template);
- if (null == located)
+ while (i.hasNext())
{
- // Try to locate it directly on file system, perhaps it was recently added
- useNameCache = false;
- located = locateTemplate(data, DIR_CONTROLS, path, template);
+ String path = (String)i.next();
+ String located = locateTemplate(data, DIR_PORTLETS, path, template);
+
+ if (null == located)
+ {
+ // Try to locate it directly on file system, perhaps it was recently added
+ useNameCache = false;
+ located = locateTemplate(data, DIR_PORTLETS, path, template);
+
+ if (null != located)
+ {
+ // add it to the map
+ templateMap.put( located, null );
+ }
+
+ useNameCache = true;
+ }
+
if (null != located)
{
- // add it to the map
- templateMap.put( located, null );
+ return DIR_PORTLETS + located;
}
- useNameCache = true;
}
- if (null != located)
- return DIR_CONTROLS + located;
return null;
}
/**
- * Locate a controller template using Jetspeed template location algorithm, searching by
+ * Locate a control template using Jetspeed template location algorithm, searching by
* mediatype and language criteria extracted from the request state in rundata.
*
* @param data The rundata for the request.
* @param template The name of the template.
*
- * @return The path relative to the controllers directory for the requested controller template,
+ * @return The path relative to the controls directory for the requested control template,
* or null if not found.
*/
- public String locateControllerTemplate(RunData data, String template)
+ public String locateControlTemplate(RunData data, String template)
{
- String path = localizeTemplateName(data);
+ List templatePaths = localizeTemplateName(data);
+ Iterator i = templatePaths.iterator();
- String located = locateTemplate(data, DIR_CONTROLLERS, path, template);
- if (null == located)
+ while (i.hasNext())
{
- // Try to locate it directly on file system, perhaps it was recently added
- useNameCache = false;
- located = locateTemplate(data, DIR_CONTROLLERS, path, template);
+ String path = (String)i.next();
+ String located = locateTemplate(data, DIR_CONTROLS, path, template);
+
+ if (null == located)
+ {
+ // Try to locate it directly on file system, perhaps it was recently added
+ useNameCache = false;
+ located = locateTemplate(data, DIR_CONTROLS, path, template);
+
+ if (null != located)
+ {
+ // add it to the map
+ templateMap.put( located, null );
+ }
+
+ useNameCache = true;
+ }
+
if (null != located)
{
- // add it to the map
- templateMap.put( located, null );
+ return DIR_CONTROLS + located;
}
- useNameCache = true;
}
- if (null != located)
- return DIR_CONTROLLERS + located;
+
return null;
}
- /**
+ /**
* Locate a controller template using Jetspeed template location algorithm, searching by
* mediatype and language criteria extracted from the request state in rundata.
*
@@ -358,25 +454,37 @@
* @return The path relative to the controllers directory for the requested controller template,
* or null if not found.
*/
- public String locateNavigationTemplate(RunData data, String template)
+ public String locateControllerTemplate(RunData data, String template)
{
- String path = localizeTemplateName(data);
+ List templatePaths = localizeTemplateName(data);
+ Iterator i = templatePaths.iterator();
- String located = locateTemplate(data, DIR_NAVIGATIONS, path, template);
- if (null == located)
+ while (i.hasNext())
{
- // Try to locate it directly on file system, perhaps it was recently added
- useNameCache = false;
- located = locateTemplate(data, DIR_NAVIGATIONS, path, template);
+ String path = (String)i.next();
+ String located = locateTemplate(data, DIR_CONTROLLERS, path, template);
+
+ if (null == located)
+ {
+ // Try to locate it directly on file system, perhaps it was recently added
+ useNameCache = false;
+ located = locateTemplate(data, DIR_CONTROLLERS, path, template);
+
+ if (null != located)
+ {
+ // add it to the map
+ templateMap.put( located, null );
+ }
+
+ useNameCache = true;
+ }
+
if (null != located)
{
- // add it to the map
- templateMap.put( located, null );
+ return DIR_CONTROLLERS + located;
}
- useNameCache = true;
}
- if (null != located)
- return located;
+
return null;
}
@@ -392,7 +500,7 @@
*/
public String locateEmailTemplate(RunData data, String template)
{
- return locateEmailTemplate( data, template, LocaleDetector.getLocale(data));
+ return locateEmailTemplate( data, template, LocaleDetector.getLocale(data));
}
/**
@@ -408,23 +516,36 @@
*/
public String locateEmailTemplate(RunData data, String template, Locale locale)
{
- String path = localizeTemplateName(data, locale);
- String located = locateTemplate(data, DIR_EMAILS, path, template);
- if (null == located)
- {
- // Try to locate it directly on file system, perhaps it was recently added
- useNameCache = false;
- located = locateTemplate(data, DIR_EMAILS, path, template);
- if (null != located)
- {
- // add it to the map
- templateMap.put( located, null );
- }
- useNameCache = true;
- }
- if (null != located)
- return DIR_EMAILS + located;
- return null;
+ List templatePaths = localizeTemplateName(data,locale);
+ Iterator i = templatePaths.iterator();
+
+ while (i.hasNext())
+ {
+ String path = (String)i.next();
+ String located = locateTemplate(data, DIR_EMAILS, path, template);
+
+ if (null == located)
+ {
+ // Try to locate it directly on file system, perhaps it was recently added
+ useNameCache = false;
+ located = locateTemplate(data, DIR_EMAILS, path, template);
+
+ if (null != located)
+ {
+ // add it to the map
+ templateMap.put( located, null );
+ }
+
+ useNameCache = true;
+ }
+
+ if (null != located)
+ {
+ return DIR_EMAILS + located;
+ }
+ }
+
+ return null;
}
/**
@@ -439,24 +560,33 @@
*/
public String locateParameterTemplate(RunData data, String template)
{
- String path = localizeTemplateName(data);
+ List templatePaths = localizeTemplateName(data);
+ Iterator i = templatePaths.iterator();
- String located = locateTemplate(data, DIR_PARAMETERS, path, template);
- if (null == located)
+ while (i.hasNext())
{
- // Try to locate it directly on file system, perhaps it was recently added
- useNameCache = false;
- located = locateTemplate(data, DIR_PARAMETERS, path, template);
+ String path = (String)i.next();
+ String located = locateTemplate(data, DIR_PARAMETERS, path, template);
+
+ if (null == located)
+ {
+ // Try to locate it directly on file system, perhaps it was recently added
+ useNameCache = false;
+ located = locateTemplate(data, DIR_PARAMETERS, path, template);
+ if (null != located)
+ {
+ // add it to the map
+ templateMap.put( located, null );
+ }
+ useNameCache = true;
+ }
+
if (null != located)
{
- // add it to the map
- templateMap.put( located, null );
+ return DIR_PARAMETERS + located;
}
- useNameCache = true;
}
- if (null != located)
- return DIR_PARAMETERS + located;
return null;
}
@@ -527,9 +657,11 @@
StringBuffer fullPath = new StringBuffer( templateRoot );
if (!templateRoot.endsWith(PATH_SEPARATOR))
+ {
fullPath.append(PATH_SEPARATOR);
- fullPath.append(getTemplateExtension(template));
+ }
+ fullPath.append(getTemplateExtension(template));
fullPath.append(resourceType);
String basePath = fullPath.toString();
@@ -544,7 +676,11 @@
// the current template exists, return the corresponding path
if (templateExists(realPath))
{
- Log.debug("template exists: "+realPath+" returning "+workingPath);
+ if (Log.getLogger().isDebugEnabled())
+ {
+ Log.debug("TemplateLocator: template exists: "+realPath+" returning "+workingPath);
+ }
+
return workingPath;
}
// else strip path of one of its components and loop
@@ -565,29 +701,35 @@
/**
* Helper function for template locator to find a localized (NLS) resource.
- * Considers both language and country resources.
+ * Considers both language and country resources as well as all the possible
+ * media-types for the request
*
* @param data The rundata for the request.
*
- * @return The possible path to a localized template.
+ * @return The possible paths to a localized template ordered by
+ * descending preference
*/
- private String localizeTemplateName(RunData data)
+ private List localizeTemplateName(RunData data)
{
- return localizeTemplateName(data, null);
+ return localizeTemplateName(data, null);
}
/**
* Helper function for template locator to find a localized (NLS) resource.
- * Considers both language and country resources.
+ * Considers both language and country resources as well as all the possible
+ * media-types for the request
*
* @param data The rundata for the request.
* @param locale The locale for the request.
*
- * @return The possible path to a localized template.
+ * @return The possible paths to a localized template ordered by
+ * descending preference
*/
- private String localizeTemplateName(RunData data, Locale inLocale)
+ private List localizeTemplateName(RunData data, Locale inLocale)
{
+ List templates = new ArrayList();
Locale tmplocale = null;
+
if (inLocale != null)
{
tmplocale = inLocale;
@@ -596,8 +738,10 @@
{
tmplocale = LocaleDetector.getLocale(data);
}
+
// Get the locale store it in the user object
- if (tmplocale == null) {
+ if (tmplocale == null)
+ {
tmplocale = new Locale(
TurbineResources.getString("locale.default.language", "en"),
TurbineResources.getString("locale.default.country", "US"));
@@ -607,26 +751,54 @@
StringBuffer templatePath = new StringBuffer();
- // set the content type (including charset)
+ // retrieve all the possible media types
String type = data.getParameters().getString(Profiler.PARAM_MEDIA_TYPE, null);
+ List types = new ArrayList();
CapabilityMap cm = ((JetspeedRunData)data).getCapability();
- if (null == type)
- {
- type = cm.getPreferredType().getCode();
- }
- //data.setContentType( cm.getPreferredType().toString() );
- if ((type != null) && (type.length() > 0))
- templatePath.append(PATH_SEPARATOR).append(type);
// Grab the Locale from the temporary storage in the User object
Locale locale = (Locale)data.getUser().getTemp("locale");
String language = locale.getLanguage();
String country = locale.getCountry();
- if ((language != null) && (language.length() > 0))
- templatePath.append(PATH_SEPARATOR).append(language);
- if ((country != null) && (country.length() > 0))
- templatePath.append(PATH_SEPARATOR).append(country);
- return templatePath.toString();
+
+ if (null != type)
+ {
+ types.add(type);
+ }
+ else
+ {
+ Iterator i = cm.listMediaTypes();
+ while(i.hasNext())
+ {
+ types.add(i.next());
+ }
+ }
+
+ Iterator typeIterator = types.iterator();
+
+ while(typeIterator.hasNext())
+ {
+ type = (String)typeIterator.next();
+
+ if ((type != null) && (type.length() > 0))
+ {
+ templatePath.append(PATH_SEPARATOR).append(type);
+ }
+
+ if ((language != null) && (language.length() > 0))
+ {
+ templatePath.append(PATH_SEPARATOR).append(language);
+ }
+
+ if ((country != null) && (country.length() > 0))
+ {
+ templatePath.append(PATH_SEPARATOR).append(country);
+ }
+
+ templates.add(templatePath.toString());
+ }
+
+ return templates;
}
/**
@@ -682,24 +854,33 @@
templateRoots = JetspeedResources.getStringArray(TurbineServices.SERVICE_PREFIX
+ TemplateLocatorService.SERVICE_NAME
+ CONFIG_TEMPLATE_ROOT);
+
if ((templateRoots == null) || (templateRoots.length == 0))
+ {
throw new InitializationException(
MSG_MISSING_PARAMETER + CONFIG_TEMPLATE_ROOT);
+ }
templateMap = new HashMap();
- for (int i = 0; i < templateRoots.length; i++) {
+ for (int i = 0; i < templateRoots.length; i++)
+ {
String templateRoot = templateRoots[i];
- if (!templateRoot.endsWith(PATH_SEPARATOR)) {
+ if (!templateRoot.endsWith(PATH_SEPARATOR))
+ {
templateRoot = templateRoot + PATH_SEPARATOR;
}
- if (Log.getLogger().isDebugEnabled()) Log.debug("Adding templateRoot:"+templateRoot);
+ if (Log.getLogger().isDebugEnabled())
+ {
+ Log.debug("TemplateLocator: Adding templateRoot:"+templateRoot);
+ }
// traverse starting from the root template directory and add resources
String templateRootPath = TurbineServlet.getRealPath( templateRoot );
- if (null != templateRootPath) {
+ if (null != templateRootPath)
+ {
loadNameCache( templateRootPath, "" );
}
}
@@ -714,23 +895,28 @@
private void loadNameCache(String path, String name)
{
File file = new File(path);
- if(file.isFile()) {
-
+ if (file.isFile())
+ {
// add it to the map
templateMap.put( path, null );
-
- } else if(file.isDirectory()) {
-
- if(!path.endsWith(File.separator))
- path += File.separator;
-
- String list[] = file.list();
-
- // Process all files recursivly
- for(int ix = 0; list != null && ix < list.length; ix++)
- loadNameCache(path + list[ix], list[ix]);
+ }
+ else
+ {
+ if (file.isDirectory())
+ {
+ if (!path.endsWith(File.separator))
+ {
+ path += File.separator;
+ }
+
+ String list[] = file.list();
+
+ // Process all files recursivly
+ for(int ix = 0; list != null && ix < list.length; ix++)
+ {
+ loadNameCache(path + list[ix], list[ix]);
+ }
+ }
}
}
-
-
}
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jetspeed-dev-help@jakarta.apache.org
RE: cvs commit: jakarta-jetspeed/src/java/org/apache/jetspeed/services/template JetspeedTemplateLocatorService.java
Posted by Mark Orciuch <ma...@yahoo.com>.
> -----Original Message-----
> From: raphael@apache.org [mailto:raphael@apache.org]
> Sent: Sunday, March 02, 2003 1:40 PM
> To: jakarta-jetspeed-cvs@apache.org
> Subject: cvs commit:
> jakarta-jetspeed/src/java/org/apache/jetspeed/services/template
> JetspeedTemplateLocatorService.java
>
Raphael,
What exactly was the change to this class? I couldn't find any information
in Bugzilla or mailing list (perhaps I didn't look hard enough). I am trying
to figure out why this exception occurs intermittently:
[03 Mar 2003 20:12:35 ERROR] - Error rendering Velocity template:
layouts/default.vm: Unable to find resource 'layouts/default.vm'
[03 Mar 2003 20:12:35 ERROR] - Error rendering Velocity template:
layouts/default.vm: Unable to find resource 'layouts/default.vm'
org.apache.velocity.exception.ResourceNotFoundException: Unable to find
resource 'layouts/default.vm'
at
org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(Resour
ceManagerImpl.java:501)
at
org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(Resourc
eManagerImpl.java:384)
at
org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java
:814)
at
org.apache.velocity.runtime.RuntimeSingleton.getTemplate(RuntimeSingleton.ja
va:355)
at org.apache.velocity.app.Velocity.mergeTemplate(Velocity.java:482)
at org.apache.velocity.app.Velocity.mergeTemplate(Velocity.java:461)
rethrown as
org.apache.turbine.util.TurbineException: Error rendering Velocity template:
layouts/default.vm: Unable to find resource 'layouts/default.vm'
at
org.apache.turbine.services.velocity.TurbineVelocityService.renderingError(T
urbineVelocityService.java:533)
at
org.apache.turbine.services.velocity.TurbineVelocityService.decodeRequest(Tu
rbineVelocityService.java:499)
at
org.apache.turbine.services.velocity.TurbineVelocityService.handleRequest(Tu
rbineVelocityService.java:336)
at
org.apache.turbine.services.velocity.TurbineVelocity.handleRequest(TurbineVe
locity.java:143)
at
org.apache.turbine.modules.layouts.VelocityDirectLayout.doBuild(VelocityDire
ctLayout.java:106)
I'm hoping that your fix addresses this problem.
Best regards,
Mark Orciuch - morciuch@apache.org
Jakarta Jetspeed - Enterprise Portal in Java
http://jakarta.apache.org/jetspeed/
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jetspeed-dev-help@jakarta.apache.org