NullPointerException from GetResource() call
[email protected] Fri, 3 Mar 2006 18:20:59 -0600 (CST)
| Newsgroups | gmane.text.xml.xindice.user |
|---|---|
| Message-ID | <[email protected]> |
Hello,
I searched around these mail archives for posts about
NullPointerExceptions, but I wasn't able to find a solution to my problem
below. Any advice on how to find a solution would be greatly appreciated.
Here is the message I receive from XMLDBException.GetMessage() call:
Failed to execute command 'GetResource' on server:
http://localhost:8080/xindice/, message: java.lang.Exception:
java.lang.NullPointerException
I'm using the following versions:
Xindice: 1.1b4
Tomcat: 5.0.25
JVM: 1.4.2_01-b06
OS: Linux 2.4.18-14
Here is the sequence that causes this error:
1. User updates web form and post to my Servlet
2. My servlet does a GetResource() to pull the current version of the
XML data.
3. My servlet updates the XML data.
4. My servlet does a createResource() and storeResource() to update the
XML data back into Xindice.
5. ... later user repeats steps 1 to 4.
Each time the user updates the form to Add/Update/Delete data. About one
in every ten cycles the NullPointException will be thrown when I perform
the GetResource(). I tried having my code sleep for 2 seconds after the
first GetResource() failed and then retry to call, but that only solves
the problem once in awhile.
My XML data is usually somewhere in the 5 - 200 Kb range. A posting said
a storeResource should take about 3ms/KB, so I thought sleeping for 2
seconds should have been enough delay for any of my files.
Thanks for the help,
-Nate
Here is some code snippets. I create a singleton that owns this class, so
there is only one of these (currently). Therefore EnableDatabase() is
only executed once the first time that object is used.
/*
* XindiceGateway.java
*
* Created on August 25, 2004, 9:31 PM
*/
package org.test.gateways;
import java.util.Vector;
import org.apache.log4j.Logger;
import org.apache.xindice.client.xmldb.services.CollectionManager;
import org.apache.xindice.xml.dom.DOMParser;
import org.test.commands.DatabaseCommand;
import org.w3c.dom.Node;
import org.xmldb.api.base.*;
import org.xmldb.api.modules.*;
import org.xmldb.api.*;
/**
*
* @author stoddarn
*/
public class XindiceGateway
{
// Log4j Logger
static Logger m_logger = Logger.getLogger(XindiceGateway.class);
// Static mutex on the database
static String m_databaseMutex = new String ("mutex");
private boolean m_databaseRegistered = false;
// Static XINDICE data
private static String XINDICE_DB_DRIVER = new
String("org.apache.xindice.client.xmldb.DatabaseImpl");
// The root to the database
private static String XINDICE_DB_ROOT = new
String("xmldb:xindice://localhost:8080/db/"); // LINUX Penguin
// Xindice API version
private static String XINDICE_API_VERSION = new String ("1.0");
// Xindice file setup
private static String XINDICE_COMPRESSION_ENABLED = new String ("true");
private static String XINDICE_FILTER_CLASS = new
String("org.apache.xindice.core.filer.BTreeFiler");
/** Make sure the database is registered */
protected void EnableDatabase ()
throws ClassNotFoundException, InstantiationException,
IllegalAccessException,
XMLDBException
{
// If the database isn't already registered
if (! m_databaseRegistered)
{
m_databaseRegistered = true;
m_logger.info("Enabling Xindice Database");
Class c = Class.forName(XINDICE_DB_DRIVER);
Database database = (Database) c.newInstance();
DatabaseManager.registerDatabase(database);
// Update the CodeReview paths
boolean baseCollectionFound = false;
boolean projectListingsCollectionFound = false;
boolean projectListingsFileFound = false;
boolean projectsCollectionFound = false;
// Check for "test"
String [] baseCollection = ListCollections("");
// Loop to see if there is a match
for (int bcItr = 0; !baseCollectionFound && bcItr <
baseCollection.length; bcItr++)
{
if (baseCollection[bcItr].equals("test"))
{
baseCollectionFound = true;
}
}
// If the baseCollection is missing add it
if (!baseCollectionFound)
{
m_logger.info("Create codereview collection required");
CreateCollection("", "test");
}
// Check for "projectlistings" and "projects"
String [] testCollection = ListCollections("test");
// Loop to see if there is a match for project listings and projects
for (int crItr = 0; (!projectListingsCollectionFound ||
!projectsCollectionFound) && crItr < testCollection.length; crItr++)
{
if (testCollection[crItr].equals("projectlistings"))
{
projectListingsCollectionFound = true;
}
else if (testCollection[crItr].equals("projects"))
{
projectsCollectionFound = true;
}
}
// If the baseCollection is missing add it
if (!projectListingsCollectionFound)
{
m_logger.info("Create projectlistings collection required");
CreateCollection("test", "projectlistings");
}
// If the baseCollection is missing add it
if (!projectsCollectionFound)
{
m_logger.info("Create projects collection required");
CreateCollection("test", "projects");
}
}
}
/** Add documents to a collection */
public void AddDocument(String collectionName, String documentName, String
documentXML)
{
Collection col = null;
String[] documents = null;
synchronized (m_databaseMutex)
{
try {
EnableDatabase();
// Get the collection
col = DatabaseManager.getCollection(XINDICE_DB_ROOT + collectionName);
XMLResource document = (XMLResource)
col.createResource(documentName, "XMLResource");
document.setContent(documentXML);
col.storeResource(document);
}
catch (XMLDBException e) {
m_logger.error("AddDocument: XML:DB Exception occured: " +
e.getMessage());
}
catch (Exception e) {
m_logger.error("AddDocument: Other Exception occured");
}
finally
{
// If the colletion was created, then make sure we close it
if (col != null)
{
try
{
// Close the collection
col.close();
}
catch (Exception e)
{
// Catch any issues with closing the exception.
m_logger.error("Unable to close collection. " + e.getMessage());
}
}
}
}
}
/** Read a document */
public String ReadDocument(String collectionName, String documentName)
{
Collection col = null;
String returnString = null;
synchronized (m_databaseMutex)
{
try {
EnableDatabase();
col = DatabaseManager.getCollection(XINDICE_DB_ROOT + collectionName);
XMLResource document = (XMLResource) col.getResource(documentName);
returnString = (String)document.getContent();
}
catch (XMLDBException e) {
m_logger.error("ReadDocument (" + collectionName + "/" +
documentName + "): " + e.getMessage());
}
catch (Exception e) {
m_logger.error("ReadDocument (" + collectionName + "/" +
documentName + "): " + e.getMessage());
}
finally
{
// If the colletion was created, then make sure we close it
if (col != null)
{
try
{
// Close the collection
col.close();
}
catch (Exception e)
{
// Catch any issues with closing the exception.
m_logger.error("Unable to close collection. " + e.getMessage());
}
}
}
}
return (returnString);
}
/** Creates a new instance of XindiceGateway */
public XindiceGateway()
{
}
}