/*
* DefaultFileHandler.java
*
* Brazil project web application toolkit,
* export version: 2.3
* Copyright (c) 2000-2005 Sun Microsystems, Inc.
*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License Version
* 1.0 (the "License"). You may not use this file except in compliance with
* the License. A copy of the License is included as the file "license.terms",
* and also available at http://www.sun.com/
*
* The Original Code is from:
* Brazil project web application toolkit release 2.3.
* The Initial Developer of the Original Code is: suhler.
* Portions created by suhler are Copyright (C) Sun Microsystems, Inc.
* All Rights Reserved.
*
* Contributor(s): suhler.
*
* Version: 2.3
* Created by suhler on 00/08/16
* Last modified by suhler on 05/06/28 10:16:54
*
* Version Histories:
*
* 2.3 05/06/28-10:16:54 (suhler)
* nit
*
* 2.2 03/08/01-16:18:28 (suhler)
* fixes for javadoc
*
* 2.1 02/10/01-16:36:37 (suhler)
* version change
*
* 1.3 01/08/07-11:00:15 (suhler)
* add (optional) code for dealing with ordinary files that have a
* trailing '/' by mistake.
*
* 1.2 00/12/11-13:29:00 (suhler)
* add class=props for automatic property extraction
*
* 1.2 00/08/16-12:09:33 (Codemgr)
* SunPro Code Manager data about conflicts, renames, etc...
* Name history : 1 0 handlers/DefaultFileHandler.java
*
* 1.1 00/08/16-12:09:32 (suhler)
* date and time created 00/08/16 12:09:32 by suhler
*
*/
package sunlabs.brazil.handler;
import java.io.File;
import java.io.IOException;
import java.util.StringTokenizer;
import sunlabs.brazil.server.FileHandler;
import sunlabs.brazil.server.Handler;
import sunlabs.brazil.server.Request;
import sunlabs.brazil.server.Server;
/**
* Handler for appending a url ending with '/' into the appropriate
* url based on a default file in the file system.
*
* The following request properties are used:
*
* - defaults
- The names of the default files to search for in
* the directory implied by the URL.
* The first one that exists will
* cause its name to be appended to the URL. Defaults
* to "index.html".
*
- root
- The document root to look for files. If none is found with our
* prefix, then "root" is examined. Defaults to ".".
*
- DirectoryName
- This property is set if the URL represents a valid
* directory in the document root.
*
- fileName
- This property is set to the name of the default file,
* if one was found.
*
* If a url ends with "/", but is a readable plain file, the "/" is
* removed
*
* @author Stephen Uhler
* @version %V% 05/06/28
*/
public class DefaultFileHandler implements Handler {
static final String DEFAULTS = "defaults"; // list of default files
static final String ROOT = "root"; // document root
String prefix; // our properties prefix
/**
* Remember our prefix in the properties table.
*/
public boolean
init(Server server, String prefix) {
this.prefix = prefix;
return true;
}
/**
* If the url ends with a "/" look around in the corrosponding directory
* to find a suitable default file, and then change the url.
*
* @return Always returns false.
*/
public boolean
respond(Request request) throws IOException {
if (!request.url.startsWith("/") || !request.url.endsWith("/")) {
return false;
}
String root = request.props.getProperty(prefix + ROOT,
request.props.getProperty(ROOT, "."));
String dir = root + FileHandler.urlToPath(request.url);
request.log(Server.LOG_DIAGNOSTIC, prefix, "Checking directory: "+ dir);
File base = new File(dir);
if (!base.isDirectory()) {
request.log(Server.LOG_DIAGNOSTIC, prefix, " Not a directory");
/*
// See if its a "real file" with a redundant "/"
// If so, remove the / and redirect
File check = new File(dir.substring(0, dir.length() -1));
if (check.isFile() && check.canRead()) {
request.redirect(request.url.substring(0,
request.url.length()-1), null);
request.log(Server.LOG_DIAGNOSTIC, prefix,
"Plain file; redirect with superfluous / removed");
return true;
}
*/
return false;
}
request.props.put("DirectoryName", base.getPath());
StringTokenizer st = new StringTokenizer(request.props.getProperty(
prefix + DEFAULTS, "index.html"));
while (st.hasMoreTokens()) {
String token = st.nextToken();
File name = new File(base, token);
request.log(Server.LOG_DIAGNOSTIC, prefix, name + " ?");
if (name.isFile()) {
request.url += token;
request.props.put("fileName", name.getPath());
request.log(Server.LOG_DIAGNOSTIC, prefix,
"new url: " + request.url);
break;
}
}
return false;
}
}