You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-dev@xml.apache.org by vg...@apache.org on 2004/02/11 15:03:10 UTC
cvs commit: xml-xindice/java/src/org/apache/xindice/server UglyBrowser.java XindiceServlet.java
vgritsenko 2004/02/11 06:03:10
Modified: . status.xml
config system.xml
java/src/org/apache/xindice/server UglyBrowser.java
XindiceServlet.java
Log:
Support multiple databases in XindiceServlet and UglyBrowser
Revision Changes Path
1.30 +8 -1 xml-xindice/status.xml
Index: status.xml
===================================================================
RCS file: /home/cvs/xml-xindice/status.xml,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- status.xml 7 Feb 2004 19:34:20 -0000 1.29
+++ status.xml 11 Feb 2004 14:03:09 -0000 1.30
@@ -59,7 +59,14 @@
</todo>
<changes>
- <release version="1.1b4-dev" date="February 6 2004">
+ <release version="1.1b4-dev" date="February 11 2004">
+ <action dev="VG" type="update">
+ Xindice server and XML-RPC driver support multiple database instances.
+ </action>
+ <action dev="VG" type="fix">
+ Xindice now uses <link href="http://www.apache.org/licenses/LICENSE-2.0.html">
+ Apache License, Version 2.0</link>
+ </action>
<action dev="VG" type="fix">
In results of the queries like "//*", declare
http://xml.apache.org/xindice/Query namespace just once.
1.17 +23 -16 xml-xindice/config/system.xml
Index: system.xml
===================================================================
RCS file: /home/cvs/xml-xindice/config/system.xml,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- system.xml 8 Feb 2004 01:11:34 -0000 1.16
+++ system.xml 11 Feb 2004 14:03:09 -0000 1.17
@@ -23,6 +23,7 @@
-
- Version: $Revision$ $Date$
- Author: Kimbro Staken (kstaken@xmldatabases.org)
+ - Author: Vadim Gritsenko (vgritsenko@apache.org)
-->
<xindice>
@@ -39,37 +40,43 @@
- for this database instance.
-->
<root-collection dbroot="./db/" name="db" use-metadata="on">
- <!-- TODO: Describe symbols config
- <symbols>
- </symbols>
- -->
-
- <!-- TODO: Describe filer config
- <filer class="" pagesize="" maxkeysize="">
- </filer>
- -->
<!--
- Query Engine Configuration.
-->
<queryengine>
- <resolver autoindex="false" class="org.apache.xindice.core.query.XPathQueryResolver"/>
+ <!--
+ - XPath query engine. Has single configuration parameter.
+ - autoindex:
+ - If true, for every XPath query, XPath query engine will create
+ - all the indexes it can use to evaluate the query.
+ -->
+ <resolver class="org.apache.xindice.core.query.XPathQueryResolver"
+ autoindex="false"/>
+
+ <!--
+ - XUpdate engine. Has no configuration parameters.
+ -->
<resolver class="org.apache.xindice.core.xupdate.XUpdateQueryResolver"/>
</queryengine>
</root-collection>
<!--
- - Embedded driver suuports several DB instances.
- -->
+ - Xindice supports multiple DB instances. Uncomment entry below to have
+ - second database instance, named 'db2'.
+ -
<root-collection dbroot="./db2/" name="db2" use-metadata="off">
<queryengine>
- <resolver autoindex="false" class="org.apache.xindice.core.query.XPathQueryResolver"/>
+ <resolver class="org.apache.xindice.core.query.XPathQueryResolver"
+ autoindex="false"/>
<resolver class="org.apache.xindice.core.xupdate.XUpdateQueryResolver"/>
</queryengine>
</root-collection>
+ -->
<!--
- - TODO: Describe XML-RPC config
+ - XML-RPC configuration for the Xindice server. Specifies name of the parser
+ - to be used by XML-RPC.
-->
<xml-rpc>
<driver name="xerces"/>
1.13 +24 -13 xml-xindice/java/src/org/apache/xindice/server/UglyBrowser.java
Index: UglyBrowser.java
===================================================================
RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/server/UglyBrowser.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- UglyBrowser.java 8 Feb 2004 02:54:25 -0000 1.12
+++ UglyBrowser.java 11 Feb 2004 14:03:09 -0000 1.13
@@ -36,7 +36,7 @@
/**
* Moved out of XindiceServlet for separation of display and server bootstrapping.
*
- * @author kross
+ * @author Kevin Ross
* @version CVS $Revision$, $Date$
*/
public class UglyBrowser {
@@ -50,8 +50,10 @@
super();
}
- // Get handling to provide simple HTTP access to the Xindice instance.
- public static void doGet(HttpServletRequest request, HttpServletResponse response, Database db) throws ServletException {
+ /**
+ * Get handling to provide simple HTTP access to the Xindice instance.
+ */
+ public static void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
try {
String contextPath = request.getContextPath();
StringBuffer sb = new StringBuffer();
@@ -59,11 +61,16 @@
sb.append("<html><body><center>");
if (path == null) {
sb.append("<h2>THIS IS AN UGLY DEBUG TOOL!</h2><p>");
- sb.append("To browse the database, follow the link ");
- sb.append("<a href=\"" + contextPath + "/?/" + db.getName() + "\">" + db.getName() + "</a>");
+ sb.append("To browse the database, follow the link: ");
+ String [] databases = Database.listDatabases();
+ for (int i = 0; i < databases.length; i++) {
+ String db = databases[i];
+ sb.append("<a href=\"" + contextPath + "/?/" + db + "\">" + db + "</a> ");
+ }
} else {
// we have something to chew on
XPathPseudoParser parser = new XPathPseudoParser(path);
+ Database db = Database.getDatabase(parser.getDatabase());
/* building the page once we have all the information */
sb.append("<table border=\"1\" width=\"90%\">\n");
@@ -128,7 +135,7 @@
String dbLoc = parser.getDatabase();
String parserPath = parser.getPath();
StringBuffer baseHref = new StringBuffer();
- baseHref.append("<a href=\"" + contextPath + "/?" + dbLoc);
+ baseHref.append("<a href=\"" + contextPath + "/?/" + dbLoc);
if(parserPath.startsWith("/") || dbLoc.endsWith("/")) {
baseHref.append(parserPath);
} else {
@@ -179,7 +186,7 @@
return "Document '" + document + "' not found";
}
- return "Document '" + document + "'<p>\n"
+ return "Document '" + document + "'<p>\n"
+ escapeHtml(TextWriter.toString(doc));
}
@@ -228,7 +235,6 @@
}
public static class XPathPseudoParser {
-
private String query;
public XPathPseudoParser(String query) throws Exception {
@@ -240,12 +246,17 @@
}
public String getDatabase() {
+ String db;
int max = query.indexOf("/", 1);
if (max > 1) {
- return query.substring(0, max);
+ db = query.substring(0, max);
} else {
- return query;
+ db = query;
+ }
+ if (db.startsWith("/")) {
+ db = db.substring(1);
}
+ return db;
}
public String getPath() {
1.30 +72 -66 xml-xindice/java/src/org/apache/xindice/server/XindiceServlet.java
Index: XindiceServlet.java
===================================================================
RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/server/XindiceServlet.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- XindiceServlet.java 8 Feb 2004 02:54:25 -0000 1.29
+++ XindiceServlet.java 11 Feb 2004 14:03:09 -0000 1.30
@@ -49,6 +49,7 @@
* @author <a href="mailto:kstaken@xmldatabases.org">Kimbro Staken</a>
* @author <a href="mailto:vladimir@apache.org">Vladimir R. Bossicard</a>
* @author <a href="mailto:gianugo@apache.org">Gianugo Rabellino</a>
+ * @author <a href="mailto:vgritsenko@apache.org">Vadim Gritsenko</a>
* @version CVS $Revision$, $Date$
*/
public class XindiceServlet extends HttpServlet {
@@ -56,29 +57,29 @@
private static final Log log = LogFactory.getLog(XindiceServlet.class);
private static final String DEFAULT_XMLRPC_DRIVER = "xerces";
- protected Database database;
protected XmlRpcServer xmlrpcServer;
public void destroy() {
- try {
- // When the servlet engine goes down we need to close the database instance.
- // By the time destroy() is called, no more client requests can come in,
- // so no need to worry about multithreading.
- if (this.database != null) {
- this.database.close();
- log.info("Database successfully closed");
+ // When the servlet engine goes down we need to close the database instance.
+ // By the time destroy() is called, no more client requests can come in,
+ // so no need to worry about multithreading.
+ String[] databases = Database.listDatabases();
+ for (int i = 0; i < databases.length; i++) {
+ String name = databases[i];
+ try {
+ Database.getDatabase(name).close();
+ log.info("Database '" + name + "' successfully closed");
+ } catch (Exception e) {
+ log.error("Error closing database '" + name + "'", e);
}
- } catch (Exception e) {
- log.error("Error closing database", e);
}
- this.database = null;
}
/**
- * Delegate requests with method = GET to the UglyBrowser.
+ * Delegate GET requests to the UglyBrowser.
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- UglyBrowser.doGet(request, response, this.database);
+ UglyBrowser.doGet(request, response);
}
/**
@@ -105,61 +106,66 @@
// The configuration is wrapped in a <xindice> element so we need to get the "root-collection" configuration.
//
try {
- Configuration rootCollectionConfiguration = configuration.getChild("root-collection");
- if (rootCollectionConfiguration == null) {
+ Configuration[] rootConfigurations = configuration.getChildren("root-collection");
+ if (rootConfigurations.length == 0) {
throw new ConfigurationException("The database configuration is missing the <root-collection> element");
} else {
-
- //
- // We need to ensure that the database points to a place where it makes
- // sense. If the path in the system.xml file is an absolute path, then
- // honor it. If it's not, we first check for the system property "xindice.db.home"
- // and if the lookup is successful we use it as the database root parent. If
- // the property is not set, we use /WEB-INF relative to the servlet context, unless
- // the war has not been unpacked. In this case, we throw an exception and
- // ask the user to specify the location of database root
- //
- String dbRoot = rootCollectionConfiguration.getAttribute(Database.DBROOT, Database.DBROOT_DEFAULT);
-
- //
- // If there is no absolute path, we have to perform some checks.
- //
- if (!new File(dbRoot).isAbsolute()) {
-
- // Stupid hack but spec compliant:
- // If getRealPath() returns null the war archive has not been unpacked.
- String realPath = servletConfig.getServletContext().getRealPath("/WEB-INF");
-
- // Let's see if the property was specified.
- String home = System.getProperty(Xindice.PROP_XINDICE_DB_HOME);
- if (log.isDebugEnabled()) {
- log.debug(Xindice.PROP_XINDICE_DB_HOME + " is set to " + home);
+ for (int i = 0; i < rootConfigurations.length; i++) {
+ Configuration rootConfiguration = rootConfigurations[i];
+ String name = rootConfiguration.getAttribute(Database.NAME);
+
+ //
+ // We need to ensure that the database points to a place where it makes
+ // sense. If the path in the system.xml file is an absolute path, then
+ // honor it. If it's not, we first check for the system property "xindice.db.home"
+ // and if the lookup is successful we use it as the database root parent. If
+ // the property is not set, we use /WEB-INF relative to the servlet context, unless
+ // the war has not been unpacked. In this case, we throw an exception and
+ // ask the user to specify the location of database root
+ //
+ String dbRoot = rootConfiguration.getAttribute(Database.DBROOT, Database.DBROOT_DEFAULT);
+
+ //
+ // If there is no absolute path, we have to perform some checks.
+ //
+ if (!new File(dbRoot).isAbsolute()) {
+
+ // Stupid hack but spec compliant:
+ // If getRealPath() returns null the war archive has not been unpacked.
+ String realPath = servletConfig.getServletContext().getRealPath("/WEB-INF");
+
+ // Let's see if the property was specified.
+ String home = System.getProperty(Xindice.PROP_XINDICE_DB_HOME);
+ if (log.isDebugEnabled()) {
+ log.debug(Xindice.PROP_XINDICE_DB_HOME + " is set to " + home);
+ }
+
+ if (home != null) {
+ dbRoot = new File(home + File.separator + dbRoot).getCanonicalPath();
+ } else if (realPath != null) {
+ dbRoot = new File(realPath + File.separator + dbRoot).getCanonicalPath();
+ log.warn("The database '" + name + "' root directory has been set to " + dbRoot +
+ ". Keep in mind that if a war upgrade will take place the database will be lost.");
+ } else {
+ throw new ConfigurationException(
+ "The database '" + name + "' configuration points to a relative path, "
+ + "but there was no " + Xindice.PROP_XINDICE_DB_HOME + " property set. "
+ + "Furthermore, the war was not unpacked by the application server "
+ + "so Xindice was unable to find a database location "
+ + "Please check /WEB-INF/system.xml and set an absolute path "
+ + "as the \"dbroot\" attribute of \"root-collection\" "
+ + "or specify a suitable " + Xindice.PROP_XINDICE_DB_HOME + " system property.");
+ }
+ rootConfiguration.setAttribute(Database.DBROOT, dbRoot);
}
- if (home != null) {
- dbRoot = new File(home + File.separator + dbRoot).getCanonicalPath();
- } else if (realPath != null) {
- dbRoot = new File(realPath + File.separator + dbRoot).getCanonicalPath();
- log.warn("The database root directory has been set to " + dbRoot +
- ". Keep in mind that if a war upgrade will take place the database will be lost.");
- } else {
- throw new ConfigurationException(
- "The database configuration points to a relative path, "
- + "but there was no " + Xindice.PROP_XINDICE_DB_HOME + " property set. "
- + "Furthermore, the war was not unpacked by the application server "
- + "so Xindice was unable to find a database location "
- + "Please check /WEB-INF/system.xml and set an absolute path "
- + "as the \"dbroot\" attribute of \"root-collection\" "
- + "or specify a suitable " + Xindice.PROP_XINDICE_DB_HOME + " system property.");
- }
- rootCollectionConfiguration.setAttribute(Database.DBROOT, dbRoot);
+ //
+ // We need to use this method to be consistent between deployments (embed, standalone, etc)
+ // and let the Database object maintain the set of Databases.
+ //
+ Database.getDatabase(rootConfiguration);
+ log.info("Database '" + name + "' successfully opened");
}
-
- //
- // We need to use this method to be consistent between deployments (embed, standalone, etc)
- // and let the Database object maintain the set of Databases.
- //
- this.database = Database.getDatabase(rootCollectionConfiguration);
}
// Setup the XML-RPC impl to support UTF-8 input via Xerces.
@@ -196,7 +202,7 @@
throw new ConfigurationException("Failed to add default handler to XmlRpc server.", e);
}
- log.info("Database successfully started");
+ log.info("Xindice server successfully started");
} catch (Exception e) {
log.fatal("Failed to initialize database, throwing ServletException", e);
// Make sure to close database if it was opened already.