/*
 * This file is part of the QuickServer library 
 * Copyright (C) QuickServer.org
 *
 * Use, modification, copying and distribution of this software is subject to
 * the terms and conditions of the GNU Lesser General Public License. 
 * You should have received a copy of the GNU LGP License along with this 
 * library; if not, you can download a copy from <http://www.quickserver.org/>.
 *
 * For questions, suggestions, bug-reports, enhancement-requests etc.
 * visit http://www.quickserver.org
 *
 */

package org.quickserver.util.xmlreader;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.digester3.Digester;
import org.quickserver.net.server.QuickServer;
import org.quickserver.swing.SensitiveInput;
import org.quickserver.util.io.PasswordField;

/**
 * This class reads the xml configuration and gives 
 * QuickServerConfig object.
 * @author Akshathkumar Shetty
 * @since 1.3
 */
public class ConfigReader {
	private static Logger logger = Logger.getLogger(ConfigReader.class.getName());

	/**
	 * Parses XML config of QuickServer of version 1.3 and above
	 * @since 1.3
	 */
	public static QuickServerConfig read(String fileName) throws Exception {
		File configFile = new File(fileName);
		
		FileInputStream fis = null;
		
		try {
			fis = new FileInputStream(configFile);		
			logger.log(Level.FINE, "Loading config from xml file : {0}", configFile.getAbsolutePath());

			return read(fis, configFile.getAbsolutePath());
		} finally {
			if(fis!=null) {
				fis.close();
			}
		}
	}
	
	/**
	 * Parses XML config of QuickServer of version 1.3 and above
	 * @since 1.4
	 */
	public static QuickServerConfig read(InputStream input,String config_file_location) 
			throws Exception {
		Digester digester = new Digester();
	    digester.setValidating(false);

		//digester.setNamespaceAware(true);
		//String xsd = "" + new File("quickserver_config.xsd").toURI();
		//digester.setSchema(xsd);
		String mainTag = "quickserver";
		String subTag = "";
		
		digester.addObjectCreate(mainTag, QuickServerConfig.class);
		digester.addBeanPropertySetter(mainTag+"/name", "name");
		digester.addBeanPropertySetter(mainTag+"/server-banner", "serverBanner");
		digester.addBeanPropertySetter(mainTag+"/port", "port");
		digester.addBeanPropertySetter(mainTag+"/bind-address", "bindAddr");
		//<server-mode>
		String curTag = mainTag+"/server-mode";
		digester.addObjectCreate(curTag, ServerMode.class);
		digester.addBeanPropertySetter(curTag+"/blocking", "blocking");
		digester.addSetNext(curTag,"setServerMode");
		//</server-mode>
		digester.addBeanPropertySetter(mainTag+"/client-event-handler", "clientEventHandler");//v1.4.6
		digester.addBeanPropertySetter(mainTag+"/client-command-handler", "clientCommandHandler");
		digester.addBeanPropertySetter(mainTag+"/client-object-handler", "clientObjectHandler");
		digester.addBeanPropertySetter(mainTag+"/client-binary-handler", "clientBinaryHandler");//v1.4
		digester.addBeanPropertySetter(mainTag+"/client-write-handler", "clientWriteHandler");//v1.4.5
		digester.addBeanPropertySetter(mainTag+"/authenticator", "authenticator"); //v1.3
		digester.addBeanPropertySetter(mainTag+"/client-authentication-handler", "clientAuthenticationHandler"); //v1.4.6
		digester.addBeanPropertySetter(mainTag+"/client-data", "clientData");
		digester.addBeanPropertySetter(mainTag+"/client-extended-event-handler", "clientExtendedEventHandler");//v1.4.6
		digester.addBeanPropertySetter(mainTag+"/timeout", "timeout");
		digester.addBeanPropertySetter(mainTag+"/timeout-msg", "timeoutMsg");
		digester.addBeanPropertySetter(mainTag+"/max-auth-try", "maxAuthTry");
		digester.addBeanPropertySetter(mainTag+"/max-auth-try-msg", "maxAuthTryMsg");		
		digester.addBeanPropertySetter(mainTag+"/max-connection", "maxConnection");
		digester.addBeanPropertySetter(mainTag+"/max-connection-msg", "maxConnectionMsg");
		digester.addBeanPropertySetter(mainTag+"/console-logging-level", "consoleLoggingLevel");
		digester.addBeanPropertySetter(mainTag+"/console-logging-formatter", "consoleLoggingFormatter");
		//<default-data-mode>
		curTag = mainTag+"/default-data-mode";
		digester.addObjectCreate(curTag, DefaultDataMode.class);
		digester.addBeanPropertySetter(curTag+"/data-type-in", "dataModeIn");
		digester.addBeanPropertySetter(curTag+"/data-type-out", "dataModeOut");
		digester.addSetNext(curTag,"setDefaultDataMode");
		//</default-data-mode>
		//<object-pool>
		curTag = mainTag+"/object-pool";
		digester.addObjectCreate(curTag, ObjectPoolConfig.class);
		digester.addBeanPropertySetter(curTag+"/max-active", "maxActive");
		digester.addBeanPropertySetter(curTag+"/max-idle", "maxIdle");
		digester.addBeanPropertySetter(curTag+"/init-size", "initSize");
		digester.addBeanPropertySetter(curTag+"/pool-manager", "poolManager");
		//<thread-object-pool>
		digester.addObjectCreate(curTag+"/thread-object-pool", ThreadObjectPoolConfig.class);
		digester.addBeanPropertySetter(curTag+"/thread-object-pool/max-active", "maxActive");
		digester.addBeanPropertySetter(curTag+"/thread-object-pool/max-idle", "maxIdle");
		digester.addBeanPropertySetter(curTag+"/thread-object-pool/init-size", "initSize");
		digester.addSetNext(curTag+"/thread-object-pool","setThreadObjectPoolConfig");
		//</thread-object-pool>
		//<client-handler-object-pool>
		digester.addObjectCreate(curTag+"/client-handler-object-pool", ClientHandlerObjectPoolConfig.class);
		digester.addBeanPropertySetter(curTag+"/client-handler-object-pool/max-active", "maxActive");
		digester.addBeanPropertySetter(curTag+"/client-handler-object-pool/max-idle", "maxIdle");
		digester.addBeanPropertySetter(curTag+"/client-handler-object-pool/init-size", "initSize");
		digester.addSetNext(curTag+"/client-handler-object-pool","setClientHandlerObjectPoolConfig");
		//</client-handler-object-pool>
		//<byte-buffer-object-pool>
		digester.addObjectCreate(curTag+"/byte-buffer-object-pool", ByteBufferObjectPoolConfig.class);
		digester.addBeanPropertySetter(curTag+"/byte-buffer-object-pool/max-active", "maxActive");
		digester.addBeanPropertySetter(curTag+"/byte-buffer-object-pool/max-idle", "maxIdle");
		digester.addBeanPropertySetter(curTag+"/byte-buffer-object-pool/init-size", "initSize");
		digester.addSetNext(curTag+"/byte-buffer-object-pool","setByteBufferObjectPoolConfig");
		//</byte-buffer-object-pool>
		//<client-data-object-pool>
		digester.addObjectCreate(curTag+"/client-data-object-pool", ClientDataObjectPoolConfig.class);
		digester.addBeanPropertySetter(curTag+"/client-data-object-pool/max-active", "maxActive");
		digester.addBeanPropertySetter(curTag+"/client-data-object-pool/max-idle", "maxIdle");
		digester.addBeanPropertySetter(curTag+"/client-data-object-pool/init-size", "initSize");
		digester.addSetNext(curTag+"/client-data-object-pool","setClientDataObjectPoolConfig");
		//</client-data-object-pool>
		digester.addSetNext(curTag,"setObjectPoolConfig");
		//</object-pool>
		//<communication-logging>
		digester.addBeanPropertySetter(mainTag+"/communication-logging/enable", "communicationLogging");
		//</communication-logging>
		digester.addBeanPropertySetter(mainTag+"/security-manager-class", "securityManagerClass");
		
		//<access-constraint>
		digester.addObjectCreate(mainTag+"/access-constraint", AccessConstraintConfig.class);
		//<ip-filter>
		digester.addObjectCreate(mainTag+"/access-constraint/ip-filter", IpFilterConfig.class);
		digester.addBeanPropertySetter(mainTag+"/access-constraint/ip-filter/enable", "enable");
		digester.addBeanPropertySetter(mainTag+"/access-constraint/ip-filter/allow-access", "allowAccess");
		//<ip-collection>
		digester.addCallMethod(mainTag+"/access-constraint/ip-filter/ip-collection/client-ip-address", "addClientIpAddress", 0);
		//<ip-collection>
		digester.addSetNext(mainTag+"/access-constraint/ip-filter", "setIpFilterConfig");
		//<ip-filter>
		digester.addSetNext(mainTag+"/access-constraint", "setAccessConstraintConfig");
		//</access-constraint>	

		//<application-jar-path>
		digester.addBeanPropertySetter(mainTag+"/application-jar-path", "applicationJarPath");

		//<server-hooks>
		digester.addObjectCreate(mainTag+"/server-hooks", ServerHooks.class);
		digester.addCallMethod(mainTag+"/server-hooks/class-name", "addClassName", 0);
		digester.addSetNext(mainTag+"/server-hooks", "setServerHooks");
		//</server-hooks>

		//<secure>
		curTag = mainTag+"/secure";
		digester.addObjectCreate(curTag, Secure.class);
		digester.addBeanPropertySetter(curTag+"/enable", "enable");
		digester.addBeanPropertySetter(curTag+"/load", "load");
		digester.addBeanPropertySetter(curTag+"/port", "port");
		digester.addBeanPropertySetter(curTag+"/protocol", "protocol");
		digester.addBeanPropertySetter(curTag+"/client-auth-enable", "clientAuthEnable");
		//<secure-store>
		digester.addObjectCreate(curTag+"/secure-store", SecureStore.class);
		digester.addBeanPropertySetter(curTag+"/secure-store/type", "type");
		digester.addBeanPropertySetter(curTag+"/secure-store/algorithm", "algorithm");
		digester.addBeanPropertySetter(curTag+"/secure-store/provider", "provider");
		//<key-store-info>
		digester.addObjectCreate(curTag+"/secure-store/key-store-info", KeyStoreInfo.class);
		digester.addBeanPropertySetter(curTag+"/secure-store/key-store-info/store-file", "storeFile");
		digester.addBeanPropertySetter(curTag+"/secure-store/key-store-info/store-password", "storePassword");
		digester.addBeanPropertySetter(curTag+"/secure-store/key-store-info/key-password", "keyPassword");
		digester.addSetNext(curTag+"/secure-store/key-store-info","setKeyStoreInfo");
		//</key-store-info>
		//<trust-store-info>
		digester.addObjectCreate(curTag+"/secure-store/trust-store-info", TrustStoreInfo.class);
		digester.addBeanPropertySetter(curTag+"/secure-store/trust-store-info/store-file", "storeFile");
		digester.addBeanPropertySetter(curTag+"/secure-store/trust-store-info/store-password", "storePassword");
		digester.addBeanPropertySetter(curTag+"/secure-store/trust-store-info/type", "type");
		digester.addBeanPropertySetter(curTag+"/secure-store/trust-store-info/provider", "provider");
		digester.addSetNext(curTag+"/secure-store/trust-store-info","setTrustStoreInfo");
		//</trust-store-info>
		digester.addBeanPropertySetter(curTag+"/secure-store/secure-store-manager", "secureStoreManager");
		digester.addSetNext(curTag+"/secure-store","setSecureStore");
		//</secure-store>
		digester.addSetNext(curTag,"setSecure");
		//</secure>

		//<advanced-settings>
		curTag = mainTag+"/advanced-settings";
		digester.addObjectCreate(curTag, AdvancedSettings.class);
		digester.addBeanPropertySetter(curTag+"/charset", "charset");
		digester.addBeanPropertySetter(curTag+"/byte-buffer-size", "byteBufferSize");
		digester.addBeanPropertySetter(curTag+"/backlog", "backlog");
		digester.addBeanPropertySetter(curTag+"/use-direct-byte-buffer", "useDirectByteBuffer");
		digester.addBeanPropertySetter(curTag+"/socket-linger", "socketLinger");
		digester.addBeanPropertySetter(curTag+"/debug-non-blocking-mode", "debugNonBlockingMode");
		digester.addBeanPropertySetter(curTag+"/client-identifier", "clientIdentifier");
		digester.addBeanPropertySetter(curTag+"/qsobject-pool-maker", "qsObjectPoolMaker");
		digester.addBeanPropertySetter(curTag+"/max-threads-for-nio-write", "maxThreadsForNioWrite");
		
		digester.addBeanPropertySetter(curTag+"/performance-preferences-connection-time", "performancePreferencesConnectionTime");
		digester.addBeanPropertySetter(curTag+"/performance-preferences-latency", "performancePreferencesLatency");
		digester.addBeanPropertySetter(curTag+"/performance-preferences-bandwidth", "performancePreferencesBandwidth");
		
		digester.addBeanPropertySetter(curTag+"/client-socket-tcp-no-delay", "clientSocketTcpNoDelay");
		digester.addBeanPropertySetter(curTag+"/client-socket-traffic-class", "clientSocketTrafficClass");
		
		digester.addBeanPropertySetter(curTag+"/client-socket-receive-buffer-size", "clientSocketReceiveBufferSize");
		digester.addBeanPropertySetter(curTag+"/client-socket-send-buffer-size", "clientSocketSendBufferSize");
		
		digester.addSetNext(curTag,"setAdvancedSettings");
		//</advanced-settings>

		//<qsadmin-server>
		subTag = "qsadmin-server";
		curTag = mainTag+"/"+subTag;
		digester.addObjectCreate(curTag, QSAdminServerConfig.class);
		digester.addBeanPropertySetter(curTag+"/name", "name");
		digester.addBeanPropertySetter(curTag+"/server-banner", "serverBanner");
		digester.addBeanPropertySetter(curTag+"/port", "port");
		//<server-mode>
		digester.addObjectCreate(curTag+"/server-mode", ServerMode.class);
		digester.addBeanPropertySetter(curTag+"/server-mode/blocking", "blocking");
		digester.addSetNext(curTag+"/server-mode","setServerMode");
		//</server-mode>
		digester.addBeanPropertySetter(curTag+"/client-event-handler", "clientEventHandler");
		digester.addBeanPropertySetter(curTag+"/client-command-handler", "clientCommandHandler");
		digester.addBeanPropertySetter(curTag+"/client-object-handler", "clientObjectHandler");
		digester.addBeanPropertySetter(curTag+"/client-binary-handler", "clientBinaryHandler");//v1.4
		digester.addBeanPropertySetter(curTag+"/client-write-handler", "clientWriteHandler");//v1.4.5
		digester.addBeanPropertySetter(curTag+"/authenticator", "authenticator"); //v1.3
		digester.addBeanPropertySetter(curTag+"/client-authentication-handler", "clientAuthenticationHandler"); //v1.4.6
		digester.addBeanPropertySetter(curTag+"/client-data", "clientData");
		digester.addBeanPropertySetter(curTag+"/client-extended-event-handler", "clientExtendedEventHandler");//v1.4.6
		digester.addBeanPropertySetter(curTag+"/timeout", "timeout");
		digester.addBeanPropertySetter(curTag+"/max-auth-try", "maxAuthTry");
		digester.addBeanPropertySetter(curTag+"/max-auth-try-msg", "maxAuthTryMsg");
		digester.addBeanPropertySetter(curTag+"/timeout-msg", "timeoutMsg");
		digester.addBeanPropertySetter(curTag+"/max-connection", "maxConnection");
		digester.addBeanPropertySetter(curTag+"/max-connection-msg", "maxConnectionMsg");
		digester.addBeanPropertySetter(curTag+"/bind-address", "bindAddr");
		digester.addBeanPropertySetter(curTag+"/client-object-handler", "clientObjectHandler");
		digester.addBeanPropertySetter(curTag+"/console-logging-level", "consoleLoggingLevel");
		digester.addBeanPropertySetter(curTag+"/console-logging-formatter", "consoleLoggingFormatter");
		//<default-data-mode>
		digester.addObjectCreate(curTag+"/default-data-mode", DefaultDataMode.class);
		digester.addBeanPropertySetter(curTag+"/default-data-mode/data-type-in", "dataModeIn");
		digester.addBeanPropertySetter(curTag+"/default-data-mode/data-type-out", "dataModeOut");
		digester.addSetNext(curTag+"/default-data-mode","setDefaultDataMode");
		//</default-data-mode>
		//<object-pool>
		digester.addObjectCreate(curTag+"/object-pool", ObjectPoolConfig.class);
		digester.addBeanPropertySetter(curTag+"/object-pool/max-active", "maxActive");
		digester.addBeanPropertySetter(curTag+"/object-pool/max-idle", "maxIdle");
		digester.addBeanPropertySetter(curTag+"/object-pool/init-size", "initSize");
		digester.addBeanPropertySetter(curTag+"/object-pool/pool-manager", "poolManager");
		//<thread-object-pool>
		digester.addObjectCreate(curTag+"/object-pool/thread-object-pool", ThreadObjectPoolConfig.class);
		digester.addBeanPropertySetter(curTag+"/object-pool/thread-object-pool/max-active", "maxActive");
		digester.addBeanPropertySetter(curTag+"/object-pool/thread-object-pool/max-idle", "maxIdle");
		digester.addBeanPropertySetter(curTag+"/object-pool/thread-object-pool/init-size", "initSize");
		digester.addSetNext(curTag+"/object-pool/thread-object-pool","setThreadObjectPoolConfig");
		//</thread-object-pool>
		//<client-handler-object-pool>
		digester.addObjectCreate(curTag+"/object-pool/client-handler-object-pool", ClientHandlerObjectPoolConfig.class);
		digester.addBeanPropertySetter(curTag+"/object-pool/client-handler-object-pool/max-active", "maxActive");
		digester.addBeanPropertySetter(curTag+"/object-pool/client-handler-object-pool/max-idle", "maxIdle");
		digester.addBeanPropertySetter(curTag+"/object-pool/client-handler-object-pool/init-size", "initSize");
		digester.addSetNext(curTag+"/object-pool/client-handler-object-pool","setClientHandlerObjectPoolConfig");
		//</client-handler-object-pool>
		//<byte-buffer-object-pool>
		digester.addObjectCreate(curTag+"/object-pool/byte-buffer-object-pool", ByteBufferObjectPoolConfig.class);
		digester.addBeanPropertySetter(curTag+"/object-pool/byte-buffer-object-pool/max-active", "maxActive");
		digester.addBeanPropertySetter(curTag+"/object-pool/byte-buffer-object-pool/max-idle", "maxIdle");
		digester.addBeanPropertySetter(curTag+"/object-pool/byte-buffer-object-pool/init-size", "initSize");
		digester.addSetNext(curTag+"/object-pool/byte-buffer-object-pool","setByteBufferObjectPoolConfig");
		//</byte-buffer-object-pool>
		//<client-data-object-pool>
		digester.addObjectCreate(curTag+"/object-pool/client-data-object-pool", ClientDataObjectPoolConfig.class);
		digester.addBeanPropertySetter(curTag+"/object-pool/client-data-object-pool/max-active", "maxActive");
		digester.addBeanPropertySetter(curTag+"/object-pool/client-data-object-pool/max-idle", "maxIdle");
		digester.addBeanPropertySetter(curTag+"/object-pool/client-data-object-pool/init-size", "initSize");
		digester.addSetNext(curTag+"/object-pool/client-data-object-pool","setClientDataObjectPoolConfig");
		//</client-data-object-pool>
		digester.addSetNext(curTag+"/object-pool", "setObjectPoolConfig");
		//</object-pool>		
		//<command-shell>
		digester.addBeanPropertySetter(curTag+"/command-shell/enable", "commandShellEnable");
		digester.addBeanPropertySetter(curTag+"/command-shell/prompt-name", "commandShellPromptName");
		//</command-shell>
		//<communication-logging><enable>
		digester.addBeanPropertySetter(curTag+"/communication-logging/enable", "communicationLogging");
		//<access-constraint>
		digester.addObjectCreate(curTag+"/access-constraint", AccessConstraintConfig.class);
		//<ip-filter>
		digester.addObjectCreate(curTag+"/access-constraint/ip-filter", IpFilterConfig.class);
		digester.addBeanPropertySetter(curTag+"/access-constraint/ip-filter/enable", "enable");
		digester.addBeanPropertySetter(curTag+"/access-constraint/ip-filter/allow-access", "allowAccess");
		//<ip-collection>
		digester.addCallMethod(curTag+"/access-constraint/ip-filter/ip-collection/client-ip-address", "addClientIpAddress", 0);
		//<ip-collection>
		digester.addSetNext(curTag+"/access-constraint/ip-filter", "setIpFilterConfig");
		//<ip-filter>
		digester.addSetNext(curTag+"/access-constraint", "setAccessConstraintConfig");
		//</access-constraint>	
		//<server-hooks>
		digester.addObjectCreate(curTag+"/server-hooks", ServerHooks.class);
		digester.addCallMethod(curTag+"/server-hooks/class-name", "addClassName", 0);
		digester.addSetNext(curTag+"/server-hooks", "setServerHooks");
		//</server-hooks>

		//<secure>
		digester.addObjectCreate(curTag+"/secure", Secure.class);
		digester.addBeanPropertySetter(curTag+"/secure/enable", "enable");
		digester.addBeanPropertySetter(curTag+"/secure/load", "load");
		digester.addBeanPropertySetter(curTag+"/secure/port", "port");
		digester.addBeanPropertySetter(curTag+"/secure/protocol", "protocol");
		digester.addBeanPropertySetter(curTag+"/secure/client-auth-enable", "clientAuthEnable");
		//<secure-store>
		digester.addObjectCreate(curTag+"/secure/secure-store", SecureStore.class);
		digester.addBeanPropertySetter(curTag+"/secure/secure-store/type", "type");
		digester.addBeanPropertySetter(curTag+"/secure/secure-store/algorithm", "algorithm");
		digester.addBeanPropertySetter(curTag+"/secure/secure-store/provider", "provider");
		//<key-store-info>
		digester.addObjectCreate(curTag+"/secure/secure-store/key-store-info", KeyStoreInfo.class);
		digester.addBeanPropertySetter(curTag+"/secure/secure-store/key-store-info/store-file", "storeFile");
		digester.addBeanPropertySetter(curTag+"/secure/secure-store/key-store-info/store-password", "storePassword");
		digester.addBeanPropertySetter(curTag+"/secure/secure-store/key-store-info/key-password", "keyPassword");
		digester.addSetNext(curTag+"/secure/secure-store/key-store-info","setKeyStoreInfo");
		//</key-store-info>
		//<trust-store-info>
		digester.addObjectCreate(curTag+"/secure/secure-store/trust-store-info", TrustStoreInfo.class);
		digester.addBeanPropertySetter(curTag+"/secure/secure-store/trust-store-info/store-file", "storeFile");
		digester.addBeanPropertySetter(curTag+"/secure/secure-store/trust-store-info/store-password", "storePassword");
		digester.addBeanPropertySetter(curTag+"/secure/secure-store/trust-store-info/type", "type");
		digester.addBeanPropertySetter(curTag+"/secure/secure-store/trust-store-info/provider", "provider");
		digester.addSetNext(curTag+"/secure/secure-store/trust-store-info","setTrustStoreInfo");
		//</trust-store-info>
		digester.addBeanPropertySetter(curTag+"/secure/secure-store/secure-store-manager", "secureStoreManager");
		digester.addSetNext(curTag+"/secure/secure-store","setSecureStore");
		//</secure-store>
		digester.addSetNext(curTag+"/secure","setSecure");
		//</secure>
		digester.addBeanPropertySetter(curTag+"/command-plugin", "commandPlugin");
		//<advanced-settings>
		digester.addObjectCreate(curTag+"/advanced-settings", AdvancedSettings.class);
		digester.addBeanPropertySetter(curTag+"/advanced-settings/charset", "charset");
		digester.addBeanPropertySetter(curTag+"/advanced-settings/byte-buffer-size", "byteBufferSize");
		digester.addBeanPropertySetter(curTag+"/advanced-settings/backlog", "backlog");
		digester.addBeanPropertySetter(curTag+"/advanced-settings/use-direct-byte-buffer", "useDirectByteBuffer");
		digester.addBeanPropertySetter(curTag+"/advanced-settings/socket-linger", "socketLinger");
		digester.addBeanPropertySetter(curTag+"/advanced-settings/debug-non-blocking-mode", "debugNonBlockingMode");
		digester.addBeanPropertySetter(curTag+"/advanced-settings/client-identifier", "clientIdentifier");
		digester.addBeanPropertySetter(curTag+"/advanced-settings/qsobject-pool-maker", "qsObjectPoolMaker");
		digester.addBeanPropertySetter(curTag+"/advanced-settings/max-threads-for-nio-write", "maxThreadsForNioWrite");
		digester.addSetNext(curTag+"/advanced-settings","setAdvancedSettings");
		//</advanced-settings>
		digester.addSetNext(curTag, "setQSAdminServerConfig");
		//</qsadmin-server>


		//<db-object-pool>
		subTag = "db-object-pool";
		digester.addObjectCreate(mainTag+"/"+subTag, DBObjectPoolConfig.class);
		//<database-connection-set>
		digester.addObjectCreate(mainTag+"/"+subTag+"/database-connection-set", DatabaseConnectionSet.class);
		//<database-connection>
		curTag = mainTag+"/"+subTag+"/database-connection-set/database-connection";
		digester.addObjectCreate(curTag, DatabaseConnectionConfig.class);
		digester.addBeanPropertySetter(curTag+"/id", "id");
		digester.addBeanPropertySetter(curTag+"/driver", "driver");
		digester.addBeanPropertySetter(curTag+"/url", "url");
		digester.addBeanPropertySetter(curTag+"/username", "username");
		digester.addBeanPropertySetter(curTag+"/password", "password");
		digester.addSetNext(curTag, "addDatabaseConnection");
		//</database-connection>
		digester.addSetNext(mainTag+"/"+subTag+"/database-connection-set", "setDatabaseConnectionSet");
		//</database-connection-set>
		//<db-pool-util>
		curTag = mainTag+"/"+subTag+"/db-pool-util";
		digester.addBeanPropertySetter(curTag, "dbPoolUtil");
		//</db-pool-util>		
		digester.addSetNext(mainTag+"/"+subTag, "setDBObjectPoolConfig");
		//</db-object-pool>


		//<application-configuration>
		subTag = "application-configuration";
		digester.addObjectCreate(mainTag+"/"+subTag, ApplicationConfiguration.class);
		digester.addBeanPropertySetter(mainTag+"/"+subTag+"/prompt-type", "promptType");
		curTag = mainTag+"/"+subTag+"/"+"property";
		digester.addObjectCreate(curTag, Property.class);
		digester.addBeanPropertySetter(curTag+"/property-name", "name");
		digester.addBeanPropertySetter(curTag+"/property-value", "value");
		digester.addSetNext(curTag, "addProperty");
		digester.addSetNext(mainTag+"/"+subTag, "setApplicationConfiguration");
		//</application-configuration>


		//<init-server-hooks>
		subTag = "init-server-hooks";
		digester.addObjectCreate(mainTag+"/"+subTag, InitServerHooks.class);
		digester.addCallMethod(mainTag+"/"+subTag+"/class-name", 
			"addClassName", 0);
		digester.addSetNext(mainTag+"/"+subTag, "setInitServerHooks");
		//</init-server-hooks>
		
		
		QuickServerConfig qsc = (QuickServerConfig) digester.parse(input);
				
		qsc.setConfigFile(config_file_location);
		
		loadMissingApplicationConfiguration(qsc);

		QuickServer.setDebugNonBlockingMode(qsc.getAdvancedSettings().getDebugNonBlockingMode());

		return qsc;
	}

	private static void loadMissingApplicationConfiguration(QuickServerConfig qsc) 
			throws IOException {
		ApplicationConfiguration ac = qsc.getApplicationConfiguration();
		if(ac==null) return;

		//check if any application-configuration had missing property-value
		Set propertyNames = ac.keySet();
		Iterator iterator = propertyNames.iterator();
		String key = null;
		Object value = null;
		char sv[] = null;
		SensitiveInput sensitiveInput = null;
		boolean guiPrompt = ac.getPromptType().equals("console")==false?true:false;

		while(iterator.hasNext()) {
			key = (String) iterator.next();
			value = ac.get(key);
			if(value==null) {
				if(guiPrompt && sensitiveInput==null) {
					sensitiveInput = new SensitiveInput(
						qsc.getName()+" - Input Prompt");
				}
				
				if(guiPrompt)
					sv = sensitiveInput.getInput(key);
				else
					sv = PasswordField.getPassword("Input property value for "+key+" : ");				

				if(sv!=null) {
					value = new String(sv);
					ac.put(key, value);
				}
				value = null;
			}
		}
	}

	/**
	 * Make the file passed absolute, relative to the location of 
	 * configuration file that loaded QuickServerConfig object passed. 
	 * @since 1.4
	 */
	public static File makeAbsoluteToConfig(String fileName, 
			QuickServerConfig config) {
		File file = new File(fileName);
		if(config==null) return file;
		if(file.isAbsolute()==false) {
			String temp = config.getConfigFile();
			if(temp==null)  return file;
			file = new File(temp);
			temp = file.getParent() + File.separatorChar + fileName;
			file = new File(temp);
		}
		return file;
	}
}
