144 lines
6.0 KiB
Java
Executable File
144 lines
6.0 KiB
Java
Executable File
/*
|
|
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public License
|
|
* as published by the Free Software Foundation; either version 2.1 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
*/
|
|
package com.arsdigita.web;
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.RequestDispatcher;
|
|
|
|
import org.apache.log4j.Logger;
|
|
|
|
|
|
/**
|
|
* The default implementation deals with templates files belonging to a specific
|
|
* application, e.g. cms. Because of the modular structure of CCM all file
|
|
* resources of an application are stored below that application's module
|
|
* directory. The directory structure itself is application specific.
|
|
*/
|
|
public class DefaultApplicationFileResolver implements ApplicationFileResolver {
|
|
|
|
/** Internal logger instance to faciliate debugging. Enable logging output
|
|
* by editing /WEB-INF/conf/log4j.properties int hte runtime environment
|
|
* and set com.arsdigita.web.DefaultApplicationFileResolver=DEBUG by
|
|
* uncommenting or adding the line. */
|
|
private static final Logger s_log = Logger.getLogger
|
|
(DefaultApplicationFileResolver.class);
|
|
|
|
/** List of alternative greeting files. Typical vales are index.jsp and
|
|
* index.html */
|
|
private static final String[] WELCOME_FILES = new String[] {
|
|
"index.jsp", "index.html"
|
|
};
|
|
|
|
/**
|
|
* Determines from the passsed in request URL a suitable template file in
|
|
* the templates subdirectory. It returns an identified template wrapped
|
|
* in a RequestDispatcher enabling it to be executed (forwarded). The
|
|
* request will typically something like
|
|
* <pre>/[appCtx]/[webappInstance]/[webappInstInternalDir]/[template.jsp]</pre>
|
|
* For the content section "info" administration page installed in the
|
|
* ROOT context (i.e. [appCtx] is empty) in would be
|
|
* <pre>/info/admin/index.jsp</pre>
|
|
* The actual template is actual stored in the file system at
|
|
* <pre>/templates/ccm-cms/content-section/admin/index.jsp</pre> and the
|
|
* content-section to be administrated has to be passed in as parameter.
|
|
*
|
|
* @param templatePath
|
|
* @param sreq
|
|
* @param sresp
|
|
* @param app
|
|
* @return
|
|
*/
|
|
@Override
|
|
public RequestDispatcher resolve(String templatePath,
|
|
HttpServletRequest sreq,
|
|
HttpServletResponse sresp,
|
|
Application app) {
|
|
|
|
String contextPath = app.getContextPath(); // constant from Application!
|
|
String pathInfo = sreq.getPathInfo(); // effectively provides an url
|
|
if (s_log.isDebugEnabled()) { // with application part stripped
|
|
s_log.debug("Resolving resource for " + pathInfo);
|
|
}
|
|
|
|
// determine the URL the application INSTANCE is really installed at
|
|
// will replace the application part stripped above
|
|
String node = app.getPath();
|
|
|
|
do {
|
|
|
|
// First check the complete path for the instance. Parameter
|
|
// templatePath denotes the template directory for the application
|
|
// TYPE.
|
|
String path = templatePath + node + pathInfo;
|
|
|
|
// Just in case of a directory the list of welcome files have to be
|
|
// probed.
|
|
if (path.endsWith("/")) {
|
|
for (String welcomeFile : WELCOME_FILES) { //1.5 enhanced for-loop
|
|
if (s_log.isDebugEnabled()) {
|
|
s_log.debug("Trying welcome resource " +
|
|
path + welcomeFile);
|
|
}
|
|
RequestDispatcher rd = Web.findResourceDispatcher(
|
|
contextPath + path + welcomeFile);
|
|
if (rd != null) {
|
|
if (s_log.isDebugEnabled()) {
|
|
s_log.debug("Got dispatcher " + rd);
|
|
}
|
|
return rd;
|
|
}
|
|
}
|
|
} else {
|
|
if (s_log.isDebugEnabled()) {
|
|
s_log.debug("Trying resource " + path);
|
|
}
|
|
|
|
RequestDispatcher rd = Web.findResourceDispatcher(
|
|
contextPath + path);
|
|
if (rd != null) {
|
|
if (s_log.isDebugEnabled()) {
|
|
s_log.debug("Got dispatcher " + rd);
|
|
}
|
|
return rd;
|
|
}
|
|
}
|
|
|
|
// If nothing has been found at the complete path, probe variations
|
|
// of the node part by clipping element-wise
|
|
if ("".equals(node)) {
|
|
// if node is already empty we can't clip anything - fallthrough
|
|
node = null;
|
|
} else {
|
|
// clipp the last part of node retaining the first / in case
|
|
// of multiple parts or clip at all (in case of a single part)
|
|
int index = node.lastIndexOf("/", node.length() - 2);
|
|
node = node.substring(0, index);
|
|
}
|
|
} while (node != null);
|
|
|
|
if (s_log.isDebugEnabled()) {
|
|
s_log.debug("No dispatcher found");
|
|
}
|
|
// fallthrough, no success - returning null
|
|
return null;
|
|
}
|
|
|
|
}
|