SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

536 lines
18 KiB

/*
* $Header: /cvsroot-fuse/jdbforms/dbforms/src/org/dbforms/servlets/ConfigServlet.java,v 1.42 2006/09/18 21:52:43 fzimper Exp $
* $Revision: 1.42 $
* $Date: 2006/09/18 21:52:43 $
*
* DbForms - a Rapid Application Development Framework
* Copyright (C) 2001 Joachim Peer <joepeer@excite.com>
*
* 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 Temaple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package de.superx.servlet;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.validator.ValidatorResources;
import org.apache.commons.validator.ValidatorResourcesInitializer;
import org.apache.log4j.LogManager;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;
import org.dbforms.config.ConfigLoader;
import org.dbforms.config.DbFormsConfig;
import org.dbforms.config.DbFormsConfigRegistry;
import org.dbforms.config.DbFormsErrors;
import org.dbforms.util.MessageResources;
import org.dbforms.util.Util;
import org.dbforms.validation.ValidatorConstants;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* This Servlet runs at application startup and reads the XML configuration in
* dbforms-config.xml, populates a DbFormsConfig - Object and stores it in
* application context.
*
* @author Joe Peer
*/
public class SxDbformsConfigServlet extends HttpServlet {
/** DOCUMENT ME! */
private static Log logCat;
// ----------------------------------------------------- Instance Variables
private transient ConfigLoader loader = new ConfigLoader();
// ---------------------------------------------------- HttpServlet Methods
/**
* Gracefully shut down this controller servlet, releasing any resources
* that were allocated at initialization.
*/
public void destroy() {
log("finalizing");
}
/**
* Process an HTTP "GET" request.
*
* @param request The servlet request we are processing
* @param response The servlet response we are creating
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet exception occurs
*/
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
/**
* Process an HTTP "POST" request.
*
* @param request The servlet request we are processing
* @param response The servlet response we are creating
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet exception occurs
*/
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
/**
* Initialize this servlet.
*
* @exception ServletException if we cannot configure ourselves correctly
*/
public void init() throws ServletException {
try {
initLogging();
loader.setFieldClassName(getServletConfig().getInitParameter("className.Field"));
loader.setTableClassName(getServletConfig().getInitParameter("className.Table"));
loader.setQueryClassName(getServletConfig().getInitParameter("className.Query"));
loader.setForeignKeyClassName(getServletConfig().getInitParameter("className.ForeignKey"));
loader.setReferenceClassName(getServletConfig().getInitParameter("className.Reference"));
initXMLConfig();
initXMLErrors();
initXMLValidator();
initApplicationResources();
initLocaleKey();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Initialize Logging for this web application a url/path to a log4j
* properties or xml file should be defined by the servlet init parameter
* "log4j.configuration"
*/
public void initLogging() {
String configurationStr = this.getServletConfig()
.getInitParameter("log4j.configuration");
boolean usingURL = true;
if (!Util.isNull(configurationStr)) {
try {
//Works fine with Tomcat 4.1.27 and Weblogic
InputStream fis = getServletContext()
.getResourceAsStream(configurationStr);
if (fis != null) {
try {
LogManager.resetConfiguration();
if (configurationStr.endsWith(".xml")) {
// log4j config in xml format
new DOMConfigurator().doConfigure(fis,LogManager.getLoggerRepository());
}
else {
// log4j config in properties format
Properties log4jProperties = new Properties();
log4jProperties.load(fis);
PropertyConfigurator.configure(log4jProperties);
}
} finally {
fis.close();
}
} else {
System.err.println("ConfigServlet::initLogging - log4j.configuration not found!");
}
} catch (IOException e) {
System.err.println("ConfigServlet::initLogging - log4j.properties not found!");
PropertyConfigurator.configure(configurationStr);
usingURL = false;
}
logCat = LogFactory.getLog(SxDbformsConfigServlet.class.getName());
// logging category for this class
logCat.info("### LOGGING INITALIZED, USING URL: " + usingURL + " ###"
+ configurationStr);
} else {
logCat = LogFactory.getLog(SxDbformsConfigServlet.class.getName());
// logging category for this class
logCat.info("### LOGGING INITALIZED, USING DEFAULT CONFIGURATION.");
}
}
/**
* Initialize the SubClass information use by the ResourceBundle for this
* application. ATTENTION: Here the "application" it's use as Class name,
* not like path/file coordonnates. (see java.util.ResourceBundle)
*
* @exception IOException if an input/output error is encountered
* @exception ServletException if we cannot initialize these resources
*/
protected void initApplicationResources() {
logCat.info("initialize Application Resources.");
String value = getServletConfig()
.getInitParameter(ValidatorConstants.RESOURCE_BUNDLE);
if (value == null) {
logCat.warn(" Application Resources file not setted in Web.xml, ApplicationResources handler disabled!");
return;
}
MessageResources.setSubClass(value);
logCat.info(" DbForms Application Resources : SubClass initialized ");
}
/**
* Initialize the Locale key for Session scope. Usefull for sharing the same
* Locale across different framework. Ex: By setting "localeKey" to
* "org.apache.struts.action.LOCALE" you can share the same Locale in the
* session scope with Struts.
*/
protected void initLocaleKey() {
logCat.info("initialize Locale Key for session attribute.");
String value = getServletConfig()
.getInitParameter("localeKey");
if (value == null) {
logCat.warn(" Locale Key not setted, use \""
+ MessageResources.LOCALE_KEY
+ "\" as key to access the Locale in session scope.");
} else {
MessageResources.LOCALE_KEY = value.trim();
logCat.info(" Locale Key setted with \"" + MessageResources.LOCALE_KEY
+ "\" as key to access the Locale in session scope.");
}
}
/**
* Initialize the mapping information for this application.
*
* @exception IOException if an input/output error is encountered
* @exception ServletException if we cannot initialize these resources
*/
protected void initXMLConfig() throws IOException, ServletException {
// Initialize the context-relative path to our configuration resources
String value = getServletConfig().getInitParameter(DbFormsConfig.CONFIG);
loader.setConfig(value);
String[] s = StringUtils.split(loader.getConfig(), ",");
for (int i = 0; i < s.length; i++)
initXMLConfigFile(s[i]);
}
/**
* DOCUMENT ME!
*
* @param config DOCUMENT ME!
*
* @throws IOException DOCUMENT ME!
* @throws ServletException DOCUMENT ME!
*/
protected void initXMLConfigFile(String config)
throws IOException, ServletException {
InputStream input = getServletContext()
.getResourceAsStream(config);
if (input == null) {
throw new UnavailableException("configMissing");
}
try {
// register the config object into the DbFormsConfigRegistry
// as the default config (fossato, 2002.12.02)
DbFormsConfigRegistry registry = DbFormsConfigRegistry.instance();
DbFormsConfig dbFormsConfig = null;
try {
dbFormsConfig = registry.lookup();
} catch (Exception e) {
dbFormsConfig = null;
}
if (dbFormsConfig == null) {
dbFormsConfig = new DbFormsConfig(config);
// store a reference to ServletConfig (for interoperation with other parts of the Web-App!)
dbFormsConfig.setServletConfig(getServletConfig());
// ---------------------------------------------------------------
registry.setServletContext(getServletContext());
registry.register(dbFormsConfig);
}
// ---------------------------------------------------------------
// Parse the input stream to configure our mappings
try {
loader.loadConfig(input, dbFormsConfig);
} catch (SAXException e) {
logCat.error("::initXMLConfig - SaxException", e);
throw new ServletException(e.toString());
}
} finally {
input.close();
}
}
// --------------------------------------------------------- Public Methods
// ------------------------------------------------------ Protected Methods
/**
* Initialize the mapping information for this application.
*
* @exception IOException if an input/output error is encountered
* @exception ServletException if we cannot initialize these resources
*/
protected void initXMLErrors() throws IOException, ServletException {
logCat.info("initialize XML Errors.");
// Look to see if developer has specified his/her own errors filename & location
String value = getServletConfig()
.getInitParameter(DbFormsErrors.ERRORS);
// no xmlError file specified in web.xml. Skip this step
if (value == null) {
logCat.warn("XML Errors file not configured, XML error handler disabled!");
return;
}
loader.setErrors(value);
// Acquire an input stream to our errors resource
InputStream input = getServletContext()
.getResourceAsStream(loader.getErrors());
if (input == null) {
// File not available, log warning
logCat.warn("XML Errors file not found, XML error handler disabled!");
return;
}
try {
// Build a digester to process our errors resource
DbFormsErrors dbFormsErrors = new DbFormsErrors();
// store a reference to ServletErrors (for interoperation with other parts of the Web-App!)
dbFormsErrors.setServletConfig(getServletConfig());
// store this errors object in the servlet context ("application")
getServletContext()
.setAttribute(DbFormsErrors.ERRORS, dbFormsErrors);
try {
loader.loadErrors(input, dbFormsErrors);
} catch (SAXException e) {
throw new ServletException(e.toString());
}
logCat.info("DbForms Error: " + dbFormsErrors);
} finally {
input.close();
}
}
/**
* Initialize the ValidatorResources information for this application.
*
* @exception IOException if an input/output error is encountered
* @exception ServletException if we cannot initialize these resources
*/
protected void initXMLValidator() throws ServletException {
// Map the commons-logging used by commons-validator to Log4J logger
/* 200050906-HKK Not neccesary to configure logging here.
* Use the global logging configuration in init logging instead!!!
try {
System.setProperty("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.Log4JCategoryLog");
} catch (java.security.AccessControlException e) {
logCat.warn("Unable map commons-logging to Log4j, due to SecurityManager",
e);
}
*/
ValidatorResources resources = new ValidatorResources();
logCat.info("initialize XML Validator.");
String value;
value = getServletConfig()
.getInitParameter(ValidatorConstants.VALIDATOR_RULES);
loader.setValidatorRules(value);
initXMLValidatorRules(resources, loader.getValidatorRules());
value = getServletConfig()
.getInitParameter(ValidatorConstants.VALIDATION);
loader.setValidation(value);
String[] s = StringUtils.split(loader.getValidation(), ",");
for (int i = 0; i < s.length; i++)
initXMLValidatorValidation(resources, s[i]);
// store this errors object in the servlet context ("application")
getServletContext()
.setAttribute(ValidatorConstants.VALIDATOR, resources);
logCat.info(" DbForms Validator : Loaded ");
}
/**
* DOCUMENT ME!
*
* @param resources DOCUMENT ME!
* @param validator_rules DOCUMENT ME!
*
* @throws IOException DOCUMENT ME!
* @throws ServletException DOCUMENT ME!
*/
protected void initXMLValidatorRules(ValidatorResources resources,
String validator_rules)
throws ServletException {
// Acquire an input stream validator_rules
InputStream inputValidatorRules = getServletContext()
.getResourceAsStream(validator_rules);
if (inputValidatorRules == null) {
// File not available, log warning
logCat.warn("XML Validator rule file not found, XML Validator handler disabled!");
return;
}
//
// Initialize ValidatorResources
//
try {
ValidatorResourcesInitializer.initialize(resources, inputValidatorRules);
} catch (IOException e) {
logCat.warn("XML Validator Exception ValidatorResourcesInitializer.initialize : "
+ e.getMessage());
throw new ServletException(e.toString());
} finally {
try {
inputValidatorRules.close();
} catch (Exception e) {
logCat.error("initXMLValidatorRules", e);
}
}
}
/**
* DOCUMENT ME!
*
* @param resources DOCUMENT ME!
* @param validation DOCUMENT ME!
*
* @throws IOException DOCUMENT ME!
* @throws ServletException DOCUMENT ME!
*/
protected void initXMLValidatorValidation(ValidatorResources resources,
String validation)
throws ServletException {
//
// LOAD Validation & Validator_rules files
//
// Acquire an input stream validation
InputStream inputValidation = getServletContext()
.getResourceAsStream(validation);
if (inputValidation == null) {
// File not available, log warning
logCat.warn("XML Validation file not found, XML Validator handler disabled!");
return;
}
try {
ValidatorResourcesInitializer.initialize(resources, inputValidation);
} catch (IOException e) {
logCat.warn("XML Validator Exception ValidatorResourcesInitializer.initialize : "
+ e.getMessage());
throw new ServletException(e.toString());
} finally {
try {
inputValidation.close();
} catch (Exception e) {
logCat.error("initXMLValidatorValidation", e);
}
}
}
/**
* Process an HTTP request.
*
* @param request The servlet request we are processing
* @param response The servlet response we are creating
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet exception occurs
*/
protected void process(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
PrintWriter out = response.getWriter();
try {
DbFormsConfig dbFormsConfig = DbFormsConfigRegistry.instance()
.lookup();
out.println(dbFormsConfig.toString());
} catch (Exception e) {
throw new IOException(e.getMessage());
}
}
}