/******************************************************************************* * Copyright (c) 2002, 2007 Innoopract Informationssysteme GmbH. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Innoopract Informationssysteme GmbH - initial API and implementation ******************************************************************************/ package org.eclipse.rwt.internal; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.Map; import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.*; /** * This is a helping class for the W4TApplication to read * the initialisations, which are stored in w4t.xml in the conf/ * directory of the web applications root. */ public class ConfigurationReader { private static final String W4_TOOLKIT_SCHEMA = "w4t.xsd"; private static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; private static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; private static Document document = null; private static IConfiguration configuration = null; private static final Map values = new HashMap(); private static File configurationFile = null; private static IEngineConfig engineConfig = null; private static final class ConfigurationImpl implements IConfiguration { private IInitialization initialization = null; private IFileUpload fileUpload = null; public IInitialization getInitialization() { if( initialization == null ) { initialization = new InitializationImpl(); } return initialization; } public IFileUpload getFileUpload() { if( fileUpload == null ) { fileUpload = new FileUploadImpl(); } return fileUpload; } } private static final class InitializationImpl implements IInitialization { public String getStartUpForm() { // do not use Startup.class.getName() since in name space mode // that class must be loaded in session scope return getConfigValue( "startUpForm", "com.w4t.administration.Startup" ); } public String getLifeCycle() { String defaultValue = IInitialization.LIFE_CYCLE_DEFAULT; return getConfigValue( IInitialization.PARAM_LIFE_CYCLE, defaultValue ); } public String getErrorPage() { // do not use DefaultErrorForm.class.getName() since in name space mode // that class must be loaded in session scope String defaultValue = "com.w4t.administration.DefaultErrorForm"; return getConfigValue( "errorPage", defaultValue ); } public String getAdministrationStartupForm() { // do not use Startup.class.getName() since in name space mode // that class must be loaded in session scope String defaultValue = "com.w4t.administration.Startup"; return getConfigValue( "administrationStartupForm", defaultValue ); } public String getMessagePage() { // do not use DefaultMessageForm.class.getName() since in name space mode // that class must be loaded in session scope String defaultValue = "com.w4t.administration.DefaultMessageForm"; return getConfigValue( "messagePage", defaultValue ); } public String getWorkDirectory() { return getConfigValue( "workDirectory", "WEB-INF/classes/" ); } public long getClosingTimeout() { String value = getConfigValue( "closingTimeout", "3600000" ); long result = Long.parseLong( value ); return ( result < 60000 ) ? 60000 : result; } public long getSkimmerFrequenzy() { String value = getConfigValue( "skimmerFrequency", "60000" ); return Long.parseLong( value ); } public boolean isDirectMonitoringAccess() { String value = getConfigValue( "directMonitoringAccess", "true" ); return Boolean.valueOf( value ).booleanValue(); } public boolean isCompression() { String value = getConfigValue( "org.eclipse.rwt.compression", "false" ); return Boolean.valueOf( value ).booleanValue(); } public boolean isProcessTime() { String value = getConfigValue( "processTime", "false" ); return Boolean.valueOf( value ).booleanValue(); } public String getNoscriptSubmitters() { String defaultValue = IInitialization.NOSCRIPT_SUBMITTERS_CREATE; return getConfigValue( "noscriptSubmitters", defaultValue ); } public String getResources() { String defaultValue = IInitialization.RESOURCES_DELIVER_FROM_DISK; return getConfigValue( "resources", defaultValue ); } public long getMaxSessionUnboundToForceGC() { String tagName = "maxSessionUnboundToForceGC"; String value = getConfigValue( tagName, "0" ); return Long.parseLong( value ); } public String getHandleMissingI18NResource() { String defaultValue = IInitialization.HANDLE_MISSING_I18N_RESOURCE_EMPTY; return getConfigValue( "handleMissingI18NResource", defaultValue ); } } private static final class FileUploadImpl implements IFileUpload { public long getMaxUploadSize() { String value = getConfigValue( "maxUploadSize", "4194304" ); return Long.parseLong( value ); } public int getMaxMemorySize() { String value = getConfigValue( "maxMemorySize", "524288" ); return Integer.parseInt( value ); } } public static IConfiguration getConfiguration() { if( configuration == null ) { configuration = new ConfigurationImpl(); } return configuration; } public static void setConfigurationFile( final File configurationFile ) throws FactoryConfigurationError, ParserConfigurationException, SAXException, IOException { reset(); if( configurationFile != null ) { if( !configurationFile.exists() ) { String msg = "Parameter 'configurationFile [" + configurationFile.toString() + "]' does not exist."; throw new IllegalArgumentException( msg ); } if( configurationFile.isDirectory() ) { String msg = "Parameter 'configurationFile' must not be a directory."; throw new IllegalArgumentException( msg ); } ConfigurationReader.configurationFile = configurationFile; } if( configurationFile != null ) { parseConfiguration(); } } public static IEngineConfig getEngineConfig() { return engineConfig; } public static void setEngineConfig( final IEngineConfig engineConfig ) throws FactoryConfigurationError, ParserConfigurationException, SAXException, IOException { ConfigurationReader.engineConfig = engineConfig; setConfigurationFile( engineConfig.getConfigFile() ); } ////////////////// // helping methods private static void reset() { values.clear(); document = null; configuration = null; configurationFile = null; } private static void parseConfiguration() throws FactoryConfigurationError, ParserConfigurationException, SAXException, IOException { if( configurationFile != null ) { InputStream is = new FileInputStream( configurationFile ); try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware( true ); ClassLoader loader = ConfigurationReader.class.getClassLoader(); final URL schema = loader.getResource( W4_TOOLKIT_SCHEMA ); factory.setValidating( schema != null ); try { factory.setAttribute( JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA ); } catch( final IllegalArgumentException iae ) { // XML-Processing does not support JAXP 1.2 or greater factory.setNamespaceAware( false ); factory.setValidating( false ); } DocumentBuilder builder = factory.newDocumentBuilder(); builder.setEntityResolver( new EntityResolver() { public InputSource resolveEntity( final String publicID, final String systemID ) throws IOException, SAXException { InputSource result = null; if( schema != null && systemID.endsWith( W4_TOOLKIT_SCHEMA ) ) { URLConnection connection = schema.openConnection(); connection.setUseCaches( false ); result = new InputSource( connection.getInputStream() ); } return result; } } ); // TODO: more sophisticated ErrorHandler implementation... builder.setErrorHandler( new ErrorHandler() { public void error( final SAXParseException spe ) throws SAXException { System.out.println( "Error parsing W4 Toolkit configuration:" ); System.out.println( configurationFile.toString() ); System.out.println( spe.getMessage() ); } public void fatalError( final SAXParseException spe ) throws SAXException { String msg = "Fatal error parsing W4 Toolkit configuration:"; System.out.println( msg ); System.out.println( configurationFile.toString() ); System.out.println( spe.getMessage() ); } public void warning( final SAXParseException spe ) throws SAXException { System.out.println( "Warning parsing W4 Toolkit configuration:" ); System.out.println( configurationFile.toString() ); System.out.println( spe.getMessage() ); } } ); document = builder.parse( is ); } finally { is.close(); } } } private static String getConfigValue( final String tagName, final String defaultValue ) { if( !values.containsKey( tagName ) ) { String result = ""; if( System.getProperty( tagName ) != null ) { result = System.getProperty( tagName ); } else if( document != null ) { NodeList nodeList = document.getElementsByTagName( tagName ); Node item = nodeList.item( 0 ); if( item != null ) { Node firstChild = item.getFirstChild(); if( firstChild != null ) { String nodeValue = firstChild.getNodeValue(); result = nodeValue.trim(); } } else { result = defaultValue; } } else { result = defaultValue; } values.put( tagName, result ); } return ( String )values.get( tagName ); } }