001: package org.apache.turbine.modules.pages;
002:
003: /*
004: * Copyright 2001-2005 The Apache Software Foundation.
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License")
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: */
018:
019: import org.apache.turbine.services.template.TurbineTemplate;
020: import org.apache.turbine.util.RunData;
021: import org.apache.turbine.util.TurbineException;
022:
023: /**
024: * When building sites using templates, Screens need only be defined
025: * for templates which require dynamic (database or object) data.
026: *
027: * <p>
028: *
029: * This page can be used on sites where the number of Screens can be
030: * much less than the number of templates. The templates can be
031: * grouped in directories with common layouts. Screen modules are
032: * then expected to be placed in packages corresponding with the
033: * templates' directories and follow a specific naming scheme.
034: *
035: * <p>
036: *
037: * The template parameter is parsed and and a Screen whose package
038: * matches the templates path and shares the same name minus any
039: * extension and beginning with a capital letter is searched for. If
040: * not found, a Screen in a package matching the template's path with
041: * name Default is searched for. If still not found, a Screen with
042: * name Default is looked for in packages corresponding to parent
043: * directories in the template's path until a match is found.
044: *
045: * <p>
046: *
047: * For example if data.getParameters().getString("template") returns
048: * /about_us/directions/driving.wm, the search follows
049: * about_us.directions.Driving, about_us.directions.Default,
050: * about_us.Default, Default, WebMacroSiteScreen (i.e. the default
051: * screen set in TurbineResources).
052: *
053: * <p>
054: *
055: * Only one Layout module is used, since it is expected that any
056: * dynamic content will be placed in navigations and screens. The
057: * layout template to be used is found in a similar way to the Screen.
058: * For example the following paths will be searched in the layouts
059: * subdirectory: /about_us/directions/driving.wm,
060: * /about_us/directions/default.wm, /about_us/default.wm, /default.wm,
061: * where wm is the value of the template.default.extension property.
062: *
063: * <p>
064: *
065: * This approach allows a site with largely static content to be
066: * updated and added to regularly by those with little Java
067: * experience.
068: *
069: * @author <a href="mailto:john.mcnally@clearink.com">John D. McNally</a>
070: * @author <a href="mailto:mbryson@mont.mindspring.com">Dave Bryson</a>
071: * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
072: * @version $Id: TemplatePage.java 264148 2005-08-29 14:21:04Z henning $
073: */
074: public class TemplatePage extends DefaultPage {
075: /**
076: * Works with TemplateService to set up default templates and
077: * corresponding class modules.
078: *
079: * @param data Turbine information.
080: * @exception Exception, a generic exception.
081: */
082: protected void doBuildAfterAction(RunData data) throws Exception {
083: // The Template Service at this point must fetch the Screen class
084: // to match a given template. If the Screen class has already been
085: // set by an action, skip this, because the user has the already
086: // specified the Screen class he wants to use.
087: if (!data.hasScreen()) {
088: // This is effectively getting the "template" parameter
089: // from the parameter parser in rundata. This is coming
090: // from the request for a template.
091: String template = data.getTemplateInfo()
092: .getScreenTemplate();
093:
094: // Get the layout template and the correct Screen.
095: String layoutTemplate = TurbineTemplate
096: .getLayoutTemplateName(template);
097: data.getTemplateInfo().setLayoutTemplate(layoutTemplate);
098:
099: String screen = TurbineTemplate.getScreenName(template);
100:
101: if (screen == null) {
102: String errMsg = "Couldn't map Template " + template
103: + " to any Screen class!";
104: log.error(errMsg);
105: throw new TurbineException(errMsg);
106: }
107: data.setScreen(screen);
108: }
109: }
110: }
|