Move DSpace Initialization Code to Share DSpaceContextListener in dspace-api. add deprecation to Existing InitServlets and remove obsolete initialization cases from web.xml.

git-svn-id: http://scm.dspace.org/svn/repo/branches/dspace-1_5_x@3055 9c30dcfa-912a-0410-8fc2-9e0234be79fd
This commit is contained in:
Mark Diggory
2008-08-29 03:03:15 +00:00
parent 70023eb3dd
commit b7439f253c
12 changed files with 360 additions and 159 deletions

View File

@@ -40,18 +40,22 @@
package org.dspace.app.util; package org.dspace.app.util;
import org.dspace.core.ConfigurationManager;
import org.dspace.storage.rdbms.DatabaseManager; import org.dspace.storage.rdbms.DatabaseManager;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import javax.servlet.ServletContextListener; import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextEvent;
import java.beans.Introspector; import java.beans.Introspector;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Driver; import java.sql.Driver;
import java.sql.DriverManager; import java.sql.DriverManager;
import java.util.Enumeration; import java.util.Enumeration;
/** /**
* Class to initialise / cleanup resources used by DSpace when the web application * Class to initialize / cleanup resources used by DSpace when the web application
* is started or stopped * is started or stopped
*/ */
public class DSpaceContextListener implements ServletContextListener public class DSpaceContextListener implements ServletContextListener
@@ -59,11 +63,82 @@ public class DSpaceContextListener implements ServletContextListener
private static Logger log = Logger.getLogger(DSpaceContextListener.class); private static Logger log = Logger.getLogger(DSpaceContextListener.class);
/** /**
* Initialise any resources required by the application * The DSpace config parameter, this is where the path to the DSpace
* configuration file can be obtained
*/
public static final String DSPACE_CONFIG_PARAMETER = "dspace-config";
/**
* Initialize any resources required by the application
* @param event * @param event
*/ */
public void contextInitialized(ServletContextEvent event) public void contextInitialized(ServletContextEvent event)
{ {
// On Windows, URL caches can cause problems, particularly with undeployment
// So, here we attempt to disable them if we detect that we are running on Windows
try
{
String osName = System.getProperty("os.name");
if (osName != null && osName.toLowerCase().contains("windows"))
{
URL url = new URL("http://localhost/");
URLConnection urlConn = url.openConnection();
urlConn.setDefaultUseCaches(false);
}
}
catch (Throwable t)
{
log.error(t.getMessage(), t);
// Any errors thrown in disabling the caches aren't significant to
// the normal execution of the application, so we ignore them
}
// Paths to the various config files
String dspaceConfig = null;
/**
* Stage 1
*
* Locate the dspace config
*/
// first check the local per webapp parameter, then check the global parameter.
dspaceConfig = event.getServletContext().getInitParameter(DSPACE_CONFIG_PARAMETER);
// Finaly, if no config parameter found throw an error
if (dspaceConfig == null || "".equals(dspaceConfig))
{
throw new RuntimeException(
"\n\nDSpace has failed to initialize. This has occurred because it was unable to determine \n" +
"where the dspace.cfg file is located. The path to the configuration file should be stored \n" +
"in a context variable, '"+DSPACE_CONFIG_PARAMETER+"', in the global context. \n" +
"No context variable was found in either location.\n\n");
}
/**
* Stage 2
*
* Load the dspace config. Also may load log4j configuration.
* (Please rely on ConfigurationManager or Log4j to configure logging)
*
*/
try
{
ConfigurationManager.loadConfig(dspaceConfig);
}
catch (Throwable t)
{
throw new RuntimeException(
"\n\nDSpace has failed to initialize, during stage 2. Error while attempting to read the \n" +
"DSpace configuration file (Path: '"+dspaceConfig+"'). \n" +
"This has likely occurred because either the file does not exist, or it's permissions \n" +
"are set incorrectly, or the path to the configuration file is incorrect. The path to \n" +
"the DSpace configuration file is stored in a context variable, 'dspace-config', in \n" +
"either the local servlet or global context.\n\n",t);
}
} }
/** /**
@@ -93,7 +168,7 @@ public class DSpaceContextListener implements ServletContextListener
} }
catch (Throwable e) catch (Throwable e)
{ {
log.error("Failled to cleanup ClassLoader for webapp", e); log.error("Failed to cleanup ClassLoader for webapp", e);
} }
} }
} }

View File

@@ -79,6 +79,7 @@ import org.apache.log4j.helpers.OptionConverter;
* *
* @author Robert Tansley * @author Robert Tansley
* @author Larry Stone - Interpolated values. * @author Larry Stone - Interpolated values.
* @author Mark Diggory - General Improvements to detection, logging and loading.
* @version $Revision$ * @version $Revision$
*/ */
public class ConfigurationManager public class ConfigurationManager
@@ -96,6 +97,15 @@ public class ConfigurationManager
// configuration; anything greater than this is very likely to be a loop. // configuration; anything greater than this is very likely to be a loop.
private final static int RECURSION_LIMIT = 9; private final static int RECURSION_LIMIT = 9;
/**
* Identify if DSpace is properly configured
* @return boolean true if configured, false otherwise
*/
public static boolean isConfigured()
{
return properties != null;
}
/** /**
* *
*/ */
@@ -800,7 +810,7 @@ public class ConfigurationManager
private static void info(String string) private static void info(String string)
{ {
if (!isConfigured()) if (!isLog4jConfigured())
{ {
System.out.println("INFO: " + string); System.out.println("INFO: " + string);
} }
@@ -812,7 +822,7 @@ public class ConfigurationManager
private static void warn(String string) private static void warn(String string)
{ {
if (!isConfigured()) if (!isLog4jConfigured())
{ {
System.out.println("WARN: " + string); System.out.println("WARN: " + string);
} }
@@ -824,7 +834,7 @@ public class ConfigurationManager
private static void fatal(String string, Exception e) private static void fatal(String string, Exception e)
{ {
if (!isConfigured()) if (!isLog4jConfigured())
{ {
System.out.println("FATAL: " + string); System.out.println("FATAL: " + string);
e.printStackTrace(); e.printStackTrace();
@@ -837,7 +847,7 @@ public class ConfigurationManager
private static void fatal(String string) private static void fatal(String string)
{ {
if (!isConfigured()) if (!isLog4jConfigured())
{ {
System.out.println("FATAL: " + string); System.out.println("FATAL: " + string);
} }
@@ -851,7 +861,7 @@ public class ConfigurationManager
* Only current solution available to detect * Only current solution available to detect
* if log4j is truly configured. * if log4j is truly configured.
*/ */
private static boolean isConfigured() private static boolean isLog4jConfigured()
{ {
Enumeration en = org.apache.log4j.LogManager.getRootLogger() Enumeration en = org.apache.log4j.LogManager.getRootLogger()
.getAllAppenders(); .getAllAppenders();

View File

@@ -49,6 +49,16 @@ import java.net.URLConnection;
* Simple servlet to load in DSpace and log4j configurations. Should always be * Simple servlet to load in DSpace and log4j configurations. Should always be
* started up before other servlets (use <loadOnStartup>) * started up before other servlets (use <loadOnStartup>)
* *
* This class holds code to be removed in the next version of the DSpace XMLUI,
* it is now managed by a Shared Context Listener inthe dspace-api project.
*
* It is deprecated, rather than removed to maintain backward compatibility for
* local DSpace 1.5.x customized overlays.
*
* TODO: Remove in trunk
*
* @deprecated Use Servlet Context Listener provided in dspace-api (remove in >
* 1.5.x)
* @author Robert Tansley * @author Robert Tansley
* @version $Revision$ * @version $Revision$
*/ */
@@ -77,11 +87,14 @@ public class LoadDSpaceConfig extends HttpServlet
// the normal execution of the application, so we ignore them // the normal execution of the application, so we ignore them
} }
if(!ConfigurationManager.isConfigured())
{
// Get config parameter // Get config parameter
String config = getServletContext().getInitParameter("dspace-config"); String config = getServletContext().getInitParameter("dspace-config");
// Load in DSpace config // Load in DSpace config
ConfigurationManager.loadConfig(config); ConfigurationManager.loadConfig(config);
}
} }
} }

View File

@@ -126,24 +126,20 @@
<!-- Listener to clean up Commons-FileUpload --> <!-- Listener to clean up Commons-FileUpload -->
<listener> <listener>
<listener-class>org.apache.commons.fileupload.servlet.FileCleanerCleanup</listener-class> <listener-class>
org.apache.commons.fileupload.servlet.FileCleanerCleanup
</listener-class>
</listener> </listener>
<!-- Listener to initialise / clean up the application --> <!-- Listener to initialise / clean up the application -->
<listener> <listener>
<listener-class>org.dspace.app.util.DSpaceContextListener</listener-class> <listener-class>
org.dspace.app.util.DSpaceContextListener
</listener-class>
</listener> </listener>
<!-- Servlets --> <!-- Servlets -->
<!-- DSpace configuration initialisation. This needs to be loaded before
other servlets. -->
<servlet>
<servlet-name>load-dspace-config</servlet-name>
<servlet-class>org.dspace.app.webui.servlet.LoadDSpaceConfig</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet> <servlet>
<servlet-name>authorize</servlet-name> <servlet-name>authorize</servlet-name>
<servlet-class>org.dspace.app.webui.servlet.admin.AuthorizeAdminServlet</servlet-class> <servlet-class>org.dspace.app.webui.servlet.admin.AuthorizeAdminServlet</servlet-class>

View File

@@ -47,18 +47,30 @@ import org.dspace.core.ConfigurationManager;
* Simple servlet to load in DSpace and log4j configurations. Should always be * Simple servlet to load in DSpace and log4j configurations. Should always be
* started up before other servlets (use <loadOnStartup>) * started up before other servlets (use <loadOnStartup>)
* *
* This class holds code to be removed in the next version of the DSpace XMLUI,
* it is now managed by a Shared Context Listener inthe dspace-api project.
*
* It is deprecated, rather than removed to maintain backward compatibility for
* local DSpace 1.5.x customized overlays.
*
* TODO: Remove in trunk
*
* @deprecated Use Servlet Context Listener provided in dspace-api (remove in >
* 1.5.x)
* @author Robert Tansley * @author Robert Tansley
* @version $Revision: 1407 $ * @version $Revision: 1407 $
*/ */
public class LoadDSpaceLNIConfig extends HttpServlet public class LoadDSpaceLNIConfig extends HttpServlet
{ {
public void init() public void init()
{
if(!ConfigurationManager.isConfigured())
{ {
// Get config parameter // Get config parameter
String config = getServletContext().getInitParameter("dspace-config"); String config = getServletContext().getInitParameter("dspace-config");
// Load in DSpace config // Load in DSpace config
ConfigurationManager.loadConfig(config); ConfigurationManager.loadConfig(config);
}
} }
} }

View File

@@ -2,7 +2,7 @@
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<!-- <!--
- lni-web.xml - web.xml
- -
- Version: $Revision$ - Version: $Revision$
- -
@@ -51,18 +51,16 @@
</description> </description>
</context-param> </context-param>
<!-- Listener to initialise / clean up the application --> <!--
Listener to initialise DSpace configuration and clean up the application
-->
<listener> <listener>
<listener-class>org.dspace.app.util.DSpaceContextListener</listener-class> <listener-class>
org.dspace.app.util.DSpaceContextListener
</listener-class>
</listener> </listener>
<!-- DSpace configuration initialisation. This needs to be loaded before <!-- Servlets -->
other servlets. -->
<servlet>
<servlet-name>load-dspace-config</servlet-name>
<servlet-class>org.dspace.app.dav.LoadDSpaceLNIConfig</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet> <servlet>
<servlet-name>LNI-DAV</servlet-name> <servlet-name>LNI-DAV</servlet-name>

View File

@@ -47,18 +47,31 @@ import org.dspace.core.ConfigurationManager;
* Simple servlet to load in DSpace and log4j configurations. Should always be * Simple servlet to load in DSpace and log4j configurations. Should always be
* started up before other servlets (use <loadOnStartup>) * started up before other servlets (use <loadOnStartup>)
* *
* This class holds code to be removed in the next version of the DSpace XMLUI,
* it is now managed by a Shared Context Listener inthe dspace-api project.
*
* It is deprecated, rather than removed to maintain backward compatibility for
* local DSpace 1.5.x customized overlays.
*
* TODO: Remove in trunk
*
* @deprecated Use Servlet Context Listener provided in dspace-api (remove in >
* 1.5.x)
*
* @author Robert Tansley * @author Robert Tansley
* @version $Revision: 1407 $ * @version $Revision: 1407 $
*/ */
public class LoadDSpaceOAIConfig extends HttpServlet public class LoadDSpaceOAIConfig extends HttpServlet
{ {
public void init() public void init()
{
if(!ConfigurationManager.isConfigured())
{ {
// Get config parameter // Get config parameter
String config = getServletContext().getInitParameter("dspace-config"); String config = getServletContext().getInitParameter("dspace-config");
// Load in DSpace config // Load in DSpace config
ConfigurationManager.loadConfig(config); ConfigurationManager.loadConfig(config);
}
} }
} }

View File

@@ -70,19 +70,15 @@
</description> </description>
</context-param> </context-param>
<!-- Listener to initialise / clean up the application --> <!--
Listener to initialise DSpace configuration and clean up the application
-->
<listener> <listener>
<listener-class>org.dspace.app.util.DSpaceContextListener</listener-class> <listener-class>
org.dspace.app.util.DSpaceContextListener
</listener-class>
</listener> </listener>
<!-- DSpace configuration initialisation. This needs to be loaded before
other servlets. -->
<servlet>
<servlet-name>load-dspace-config</servlet-name>
<servlet-class>org.dspace.app.oai.LoadDSpaceOAIConfig</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet> <servlet>
<servlet-name>oai-handler</servlet-name> <servlet-name>oai-handler</servlet-name>
<servlet-class>ORG.oclc.oai.server.OAIHandler</servlet-class> <servlet-class>ORG.oclc.oai.server.OAIHandler</servlet-class>

View File

@@ -43,21 +43,30 @@ import org.dspace.core.ConfigurationManager;
* Simple servlet to load in DSpace and log4j configurations. Should always be * Simple servlet to load in DSpace and log4j configurations. Should always be
* started up before other servlets (use <loadOnStartup>) * started up before other servlets (use <loadOnStartup>)
* *
* This class has been duplicated into the DSpace SWORD module from its * This class holds code to be removed in the next version of the DSpace XMLUI,
* original home in the DSpace JSPUI, but authorship and copyright * it is now managed by a Shared Context Listener inthe dspace-api project.
* ownership are as dictated in this file. *
* It is deprecated, rather than removed to maintain backward compatibility for
* local DSpace 1.5.x customized overlays.
*
* TODO: Remove in trunk
*
* @deprecated Use Servlet Context Listener provided in dspace-api (remove in >
* 1.5.x)
* *
* @author Robert Tansley * @author Robert Tansley
*/ */
public class LoadDSpaceConfig extends HttpServlet public class LoadDSpaceConfig extends HttpServlet
{ {
public void init() public void init()
{
if(!ConfigurationManager.isConfigured())
{ {
// Get config parameter // Get config parameter
String config = getServletContext().getInitParameter("dspace-config"); String config = getServletContext().getInitParameter("dspace-config");
// Load in DSpace config // Load in DSpace config
ConfigurationManager.loadConfig(config); ConfigurationManager.loadConfig(config);
}
} }
} }

View File

@@ -1,12 +1,44 @@
<?xml version="1.0" encoding="ISO-8859-1" ?> <?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<!--
<!-- web.xml - lni-web.xml
- This is the web application configuration for the DSpace SWORD -
- module. It is not advisable to change the contents of this - Version: $Revision$
- file unless you know exactly what you are doing -
- Date: $Date$
-
- Copyright (c) 2002, Hewlett-Packard Company and Massachusetts
- Institute of Technology. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- - Neither the name of the Hewlett-Packard Company nor the name of the
- Massachusetts Institute of Technology nor the names of their
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGE.
--> -->
<web-app> <web-app>
<display-name>DSpace SWORD Server</display-name> <display-name>DSpace SWORD Server</display-name>
@@ -37,21 +69,16 @@
</description> </description>
</context-param> </context-param>
<!-- Servlets --> <!--
Listener to initialise DSpace configuration and clean up the application
<!-- Listener to initialise / clean up the application --> -->
<listener> <listener>
<listener-class>org.dspace.app.util.DSpaceContextListener</listener-class> <listener-class>
org.dspace.app.util.DSpaceContextListener
</listener-class>
</listener> </listener>
<!-- DSpace configuration initialisation. This needs to be loaded before <!-- Servlets -->
other servlets. -->
<servlet>
<servlet-name>load-dspace-config</servlet-name>
<servlet-class>org.dspace.sword.LoadDSpaceConfig</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet> <servlet>
<servlet-name>servicedocument</servlet-name> <servlet-name>servicedocument</servlet-name>
<servlet-class>org.purl.sword.server.ServiceDocumentServlet</servlet-class> <servlet-class>org.purl.sword.server.ServiceDocumentServlet</servlet-class>

View File

@@ -75,13 +75,21 @@ public class DSpaceCocoonServlet extends CocoonServlet
*/ */
public static final String DSPACE_CONFIG_PARAMETER = "dspace-config"; public static final String DSPACE_CONFIG_PARAMETER = "dspace-config";
/** /**
* Before this servlet will become functional replace * This method holds code to be removed in the next version
* of the DSpace XMLUI, it is now managed by a Shared Context
* Listener inthe dspace-api project.
*
* It is deprecated, rather than removed to maintain backward
* compatibility for local DSpace 1.5.x customized overlays.
*
* TODO: Remove in trunk
*
* @deprecated Use Servlet Context Listener provided
* in dspace-api (remove in > 1.5.x)
* @throws ServletException
*/ */
public void init() throws ServletException private void initDSpace() throws ServletException
{ {
// On Windows, URL caches can cause problems, particularly with undeployment // On Windows, URL caches can cause problems, particularly with undeployment
// So, here we attempt to disable them if we detect that we are running on Windows // So, here we attempt to disable them if we detect that we are running on Windows
@@ -104,14 +112,11 @@ public class DSpaceCocoonServlet extends CocoonServlet
// the normal execution of the application, so we ignore them // the normal execution of the application, so we ignore them
} }
// Check if cocoon needs to do anything at init time? /**
super.init(); * Previous stages moved to shared ServletListener available in dspace-api
*/
// Paths to the various config files
String dspaceConfig = null; String dspaceConfig = null;
String log4jConfig = null; String log4jConfig = null;
String webappConfigPath = null;
String installedConfigPath = null;
/** /**
* Stage 1 * Stage 1
@@ -143,8 +148,14 @@ public class DSpaceCocoonServlet extends CocoonServlet
*/ */
try try
{ {
if(!ConfigurationManager.isConfigured())
{
// Load in DSpace config
ConfigurationManager.loadConfig(dspaceConfig); ConfigurationManager.loadConfig(dspaceConfig);
} }
}
catch (Throwable t) catch (Throwable t)
{ {
throw new ServletException( throw new ServletException(
@@ -155,6 +166,22 @@ public class DSpaceCocoonServlet extends CocoonServlet
"the DSpace configuration file is stored in a context variable, 'dspace-config', in \n" + "the DSpace configuration file is stored in a context variable, 'dspace-config', in \n" +
"either the local servlet or global context.\n\n",t); "either the local servlet or global context.\n\n",t);
} }
}
/**
* Before this servlet will become functional replace
*/
public void init() throws ServletException
{
this.initDSpace();
// Check if cocoon needs to do anything at init time?
super.init();
// Paths to the various config files
String webappConfigPath = null;
String installedConfigPath = null;
/** /**
* Stage 3 * Stage 3

View File

@@ -2,22 +2,47 @@
<!DOCTYPE web-app <!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd"> "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- <!--
Copyright 1999-2004 The Apache Software Foundation - lni-web.xml
-
Licensed under the Apache License, Version 2.0 (the "License"); - Version: $Revision$
you may not use this file except in compliance with the License. -
You may obtain a copy of the License at - Date: $Date$
-
http://www.apache.org/licenses/LICENSE-2.0 - Copyright (c) 2002, Hewlett-Packard Company and Massachusetts
- Institute of Technology. All rights reserved.
Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - Redistribution and use in source and binary forms, with or without
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - modification, are permitted provided that the following conditions are
See the License for the specific language governing permissions and - met:
limitations under the License. -
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- - Neither the name of the Hewlett-Packard Company nor the name of the
- Massachusetts Institute of Technology nor the names of their
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGE.
--> -->
<web-app>
<display-name>Manakin</display-name> <display-name>Manakin</display-name>
<description> <description>