Vadim Gritsenko wrote:

Kevin Ross wrote:

Now, how about that ' XINDICE_HOME catch 22' patch? ;)


Ok, here it is. In short: I found out that XINDICE_DB_HOME is already defined in the Xindice.java and (almost) used in XindiceServlet. Behavior is that XINDICE_DB_HOME is optional, and when present, it overrides other preferences:
- XindiceServlet prefers /WEB-INF directory as default location.
- Embedded database impl prefers directory of the system.xml file as default location.


All this happens only when system.xml contains relative path. Once this patch is applied, following is possible:

set xindice_home=<xindice cvs checkout>
set xindice_db_home=<any dir>
cd %xindice_home%\bin
xindice lc -l -c /db -d ..\config\system.xml

Patch attached.

PS There is still place for improvement... Does it make sense to allow initializing DB with arbitrary system.xml file?

PPS PROP_CMD_HOME was not used anywhere. xmlRpcDriver and getXmlRpcDriver() too. So I took the liberty of removing them.

Vadim

Index: java/src/org/apache/xindice/client/xmldb/embed/DatabaseImpl.java
===================================================================
RCS file: 
/home/cvspublic/xml-xindice/java/src/org/apache/xindice/client/xmldb/embed/DatabaseImpl.java,v
retrieving revision 1.12
diff -u -r1.12 DatabaseImpl.java
--- java/src/org/apache/xindice/client/xmldb/embed/DatabaseImpl.java    17 Jul 
2003 14:33:20 -0000      1.12
+++ java/src/org/apache/xindice/client/xmldb/embed/DatabaseImpl.java    30 Jul 
2003 01:08:57 -0000
@@ -120,12 +120,13 @@
 
     protected Configuration loadConfiguration() throws FileNotFoundException, 
XindiceException, ReadOnlyException {
         Configuration config;
+        String configDir = null;
         String configFile = 
System.getProperty(Xindice.PROP_XINDICE_CONFIGURATION);
         if (configFile != null && !configFile.equals("")) {
-
             log.info("Specified configuration file: '" + configFile + "'");
-            FileInputStream configXMLFile = new FileInputStream(new 
File(configFile));
+            FileInputStream configXMLFile = new FileInputStream(configFile);
             config = new Configuration(DOMParser.toDocument(configXMLFile), 
false);
+            configDir = new File(configFile).getAbsoluteFile().getParent();
         }
         else {
             log.info("No configuration file specified, going with the default 
configuration");
@@ -133,6 +134,24 @@
         }
 
         config = config.getChild("root-collection", false);
+        String dbRoot = config.getAttribute(Database.DBROOT, 
Database.DBROOT_DEFAULT);
+        if (!new File(dbRoot).isAbsolute()) {
+            // Let's see if the property was specified.
+            String home = System.getProperty(Xindice.PROP_XINDICE_DB_HOME);
+            if (home != null) {
+                config.setAttribute(Database.DBROOT, home + File.separator + 
dbRoot);
+            }
+            else if (configDir != null) {
+                config.setAttribute(Database.DBROOT, configDir + 
File.separator + dbRoot);
+            }
+            else {
+                log.warn("The database configuration file is not specified and 
there was no "
+                        + Xindice.PROP_XINDICE_DB_HOME + " property set, "
+                        + "so Xindice was unable to determine a database 
location. "
+                        + "Database will be created relative to the current 
directory.");
+                config.setAttribute(Database.DBROOT, new 
File(".").getAbsolutePath() + File.separator + dbRoot);
+            }
+        }
         return config;
     }
 
Index: java/src/org/apache/xindice/core/Database.java
===================================================================
RCS file: 
/home/cvspublic/xml-xindice/java/src/org/apache/xindice/core/Database.java,v
retrieving revision 1.21
diff -u -r1.21 Database.java
--- java/src/org/apache/xindice/core/Database.java      14 Jul 2003 19:07:14 
-0000      1.21
+++ java/src/org/apache/xindice/core/Database.java      30 Jul 2003 01:08:58 
-0000
@@ -73,6 +73,7 @@
 import org.apache.xindice.util.ConfigurationException;
 import org.apache.xindice.util.Named;
 import org.apache.xindice.util.XindiceException;
+import org.apache.xindice.server.Xindice;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -83,11 +84,13 @@
 
     public static final String DBROOT = "dbroot";
     public static final String NAME = "name";
-    public static final String PROP_XINDICE_HOME = "xindice.home";
     private static final String QUERYENGINE = "queryengine";
     private static final String COLKEY = "database.xml";
     private static final String DATABASE = "database";
     private static final String METADATA = "use-metadata";
+
+    public static final String DBROOT_DEFAULT = "./db/";
+
     private static Log log = LogFactory.getLog("org.apache.xindice.core");
     private static final Map databases = new HashMap(); // String to Database
 
@@ -120,8 +123,8 @@
                     try {
                         database.setConfig(config);
                     }
-                    catch (XindiceException x) { // TODO: Configurable 
interface should use ConfigurationException instead of XindiceException.
-
+                    catch (XindiceException x) {
+                        // TODO: Configurable interface should use 
ConfigurationException instead of XindiceException.
                         throw new ConfigurationException(x);
                     }
 
@@ -289,13 +292,14 @@
     public void setConfig(Configuration config) throws XindiceException {
         super.setConfig(config);
 
-        setName(config.getAttribute(NAME));
+        // FIXME: super sets this: setName(config.getAttribute(NAME));
         setCanonicalName('/' + getName());
 
         String dbroot = config.getAttribute(DBROOT);
         File dbrootDir = new File(dbroot);
         if (!dbrootDir.isAbsolute()) {
-            dbrootDir = new File(System.getProperty(PROP_XINDICE_HOME), 
dbroot);
+            // TODO: Here, DB root already should be absolute. XMLRPC and 
Embed drivers take care of it.
+            dbrootDir = new 
File(System.getProperty(Xindice.PROP_XINDICE_DB_HOME), dbroot);
         }
         setCollectionRoot(dbrootDir);
         log.info("Database points to " + dbrootDir.getAbsolutePath());
@@ -303,11 +307,11 @@
 
         try {
             Configuration queryCfg = config.getChild(QUERYENGINE);
-            if (queryCfg != null)
+            if (queryCfg != null) {
                 this.engine.setConfig(queryCfg);
+            }
         }
         catch (Exception e) {
-
             log.warn(e);
         }
 
Index: java/src/org/apache/xindice/server/Xindice.java
===================================================================
RCS file: 
/home/cvspublic/xml-xindice/java/src/org/apache/xindice/server/Xindice.java,v
retrieving revision 1.11
diff -u -r1.11 Xindice.java
--- java/src/org/apache/xindice/server/Xindice.java     14 Jul 2003 16:20:58 
-0000      1.11
+++ java/src/org/apache/xindice/server/Xindice.java     30 Jul 2003 01:08:58 
-0000
@@ -65,8 +65,19 @@
 public interface Xindice {
 
        // Global Property Information
+
+       /**
+        * System property specyfying location of the xindice CVS checkout.
+        * Used by the tools to locate configuration file.
+        */
        public static final String PROP_XINDICE_HOME = "xindice.home";
-       public static final String PROP_CMD_HOME = "cmd.home";
+
+       /**
+        * System property specyfying location of the xindice database.
+        * If present, this property overrides location determined by the 
driver.
+        */
+       public static final String PROP_XINDICE_DB_HOME = "xindice.db.home";
+
        public static final String PROP_XINDICE_CONFIGURATION = 
"xindice.configuration";
 
        // Version Information
Index: java/src/org/apache/xindice/server/XindiceServlet.java
===================================================================
RCS file: 
/home/cvspublic/xml-xindice/java/src/org/apache/xindice/server/XindiceServlet.java,v
retrieving revision 1.16
diff -u -r1.16 XindiceServlet.java
--- java/src/org/apache/xindice/server/XindiceServlet.java      14 Jul 2003 
18:30:55 -0000      1.16
+++ java/src/org/apache/xindice/server/XindiceServlet.java      30 Jul 2003 
01:08:59 -0000
@@ -97,8 +97,6 @@
        protected Database database;
        protected XmlRpcServer xmlrpcServer;
 
-       private String xmlRpcDriver;
-
        public void destroy() {
                try {
                        // When the servlet engine goes down we need to close 
the
@@ -136,18 +134,6 @@
        }
 
        /**
-        * Return the XML-RPC driver, a classname or shorthand string informing
-        * the XmlRpc package which SAX parser we wish it to use.  [Created for
-        * unit-testing purposes.]
-        *
-        * @returns String containing the classname or shorthand name of the SAX
-        *          parser the XmlRpc package will use.
-        */
-       public String getXmlRpcDriver() {
-               return xmlRpcDriver;
-       }
-
-       /**
         * TODO: verify that if is an error occured, the database will be closed
         * propertly
         */
@@ -162,7 +148,6 @@
                        Configuration rootCollectionConfiguration = 
configuration.getChild("root-collection");
 
                        if (rootCollectionConfiguration == null) {
-
                                throw new ConfigurationException("The database 
configuration is missing the <root-collection> element");
                        }
                        else {
@@ -176,13 +161,12 @@
                                //      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, "./db/");
-                               File dbRootDir = new File(dbRoot);
+                               String dbRoot = 
rootCollectionConfiguration.getAttribute(Database.DBROOT, 
Database.DBROOT_DEFAULT);
 
                                //
                                // If there is no absolute path, we have to 
perform some checks.
                                //
-                               if (!dbRootDir.isAbsolute()) {
+                               if (!new File(dbRoot).isAbsolute()) {
 
                                        // Stupid hack but spec compliant. 
                                        //              If getRealPath() 
returns null the war archive has not been unpacked.
@@ -190,30 +174,27 @@
                                        String realPath = 
servletConfig.getServletContext().getRealPath("/WEB-INF");
 
                                        // Let's see if the property was 
specified.
-                                       String home = 
System.getProperty("xindice.db.home");
-
+                                       String home = 
System.getProperty(Xindice.PROP_XINDICE_DB_HOME);
                                        if (home != null) {
-                                               
rootCollectionConfiguration.setAttribute(Database.DBROOT, home + 
System.getProperty("file.separator") + dbRoot);
+                                               
rootCollectionConfiguration.setAttribute(Database.DBROOT, home + File.separator 
+ dbRoot);
                                        }
                                        else if (realPath != null) {
+                                               String root = realPath + 
File.separator + dbRoot;
                                                log.warn(
                                                        "The database root 
directory has been set to "
-                                                               + realPath
-                                                               + 
System.getProperty("file.separator")
-                                                               + dbRoot
+                                                               + root
                                                                + ". Keep in 
mind that if a war upgrade will take place the database will be lost.");
-
-                                               
rootCollectionConfiguration.setAttribute(Database.DBROOT, realPath + 
System.getProperty("file.separator") + dbRoot);
+                                               
rootCollectionConfiguration.setAttribute(Database.DBROOT, root);
                                        }
                                        else {
                                                throw new 
ConfigurationException(
                                                        "The database 
configuration points to a relative path, "
-                                                               + "but there 
was no xindice.home property set. "
+                                                               + "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.db.home system property.");
+                                                               + "or specify a 
suitable " + Xindice.PROP_XINDICE_DB_HOME + " system property.");
                                        }
                                }
 

Reply via email to