/*
* DeferredHandler.java
*
* Brazil project web application toolkit,
* export version: 2.3
* Copyright (c) 2000-2008 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.2
* Created by suhler on 00/05/12
* Last modified by suhler on 08/12/19 11:13:40
*
* Version Histories:
*
* 2.2 08/12/19-11:13:40 (suhler)
* lint
*
* 2.1 02/10/01-16:36:38 (suhler)
* version change
*
* 1.4 01/08/03-18:21:54 (suhler)
* remove training ws from classnames before trying to instantiate
*
* 1.3 00/12/11-13:28:51 (suhler)
* add class=props for automatic property extraction
*
* 1.2 00/05/22-14:04:13 (suhler)
* doc updates
*
* 1.2 00/05/12-16:18:44 (Codemgr)
* SunPro Code Manager data about conflicts, renames, etc...
* Name history : 1 0 handlers/DeferredHandler.java
*
* 1.1 00/05/12-16:18:43 (suhler)
* date and time created 00/05/12 16:18:43 by suhler
*
*/
package sunlabs.brazil.handler;
import java.util.StringTokenizer;
import java.io.IOException;
import sunlabs.brazil.server.Handler;
import sunlabs.brazil.server.Request;
import sunlabs.brazil.server.Server;
/**
* Wrap another handler, deferring its initialization until request time.
* This allows handlers to be configured, but not initialized until
* a first use is attempted.
*
* Normally, when a handler's class is first resolved, if any of the
* dependent classes are not available, an error will occur, terminating the
* server. Using this handler, other handlers can be conditionally configured
* based on the availability of other specified classes at run time.
*
* NOTE: This functionallity should be integrated into the
* ChainHandler
, eliminating the need for this one.
*
* Request Properties
*
*- handler
- The token representing the handler to conditionally configure.
* This is used as the handler's prefix
*
- requires
- The names of classes required to be resolvable before
* configuring the handler
*
- [handler].class
- The name of the handler class.
*
*/
public class DeferredHandler implements Handler {
String prefix; // our prefix
String token; // our handlers token
Server server; // the server to init the handler with
Handler handler; // the handler to start
boolean initialized = false;// we tried to initialize this
boolean installed=false; // already initialized
/**
* Remember the server for deferred initialization.
*/
public boolean
init(Server server, String prefix) {
this.server = server;
this.prefix = prefix;
handler=null;
token = server.props.getProperty(prefix + "handler");
return (token != null);
}
/**
* Dispatch to the handler, installing it if needed
*/
public boolean
respond(Request request) throws IOException {
if (installed) {
return handler.respond(request);
} else if (!initialized) {
String urlPrefix = request.props.getProperty(token + ".prefix","/");
if (!request.url.startsWith(urlPrefix)) {
return false;
}
initialized = true;
request.log(Server.LOG_DIAGNOSTIC,prefix,
"Attempting to install handler");
/* make sure we can find all required classes */
StringTokenizer st = new StringTokenizer(
request.props.getProperty(prefix + "requires", ""));
while (st.hasMoreTokens()) {
String require = null;
try {
require = st.nextToken();
request.log(Server.LOG_DIAGNOSTIC,prefix,
"locating " + require);
Class.forName(require);
} catch (Exception e) {
request.log(Server.LOG_WARNING,prefix,
"Can't locate " + require);
request.log(Server.LOG_DIAGNOSTIC,prefix, e.toString());
return false;
}
}
/* Now init (and run) the handler */
try {
String name = request.props.getProperty(token + ".class");
request.log(Server.LOG_DIAGNOSTIC,prefix,
"Instantiating " + name);
handler = (Handler) Class.forName(name.trim()).newInstance();
if (handler.init(server, token + ".")) {
installed = true;
request.log(Server.LOG_DIAGNOSTIC, prefix,
"Handler " + name + " installed");
return respond(request);
} else {
request.log(Server.LOG_DIAGNOSTIC,prefix,
"Handler " + name + " NOT installed");
}
} catch (Exception e) {
request.log(Server.LOG_WARNING,prefix, e.toString());
}
return false;
} else { // didn't install
return false;
}
}
}