You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-users@xml.apache.org by st...@msoe.edu on 2006/03/04 01:20:59 UTC

NullPointerException from GetResource() call

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()
  {
  }

}



Re: NullPointerException from GetResource() call

Posted by st...@msoe.edu.
Hello,

I don't believe so.  I looked in system.xml and the XPathQueryResolver and
autoindex="false".

If this will help, here is my SysConfig from "db/System/".  (I changed the
name attributes values for this posting)
--------
Document 'database.xml'

<?xml version="1.0"?>
 <database name="db">
  <collections>
   <collection compressed=" true" name="CHANGEDFORPOST_0">
    <filer class="org.apache.xindice.core.filer.BTreeFiler" />
    <indexes />
    <collections>
     <collection compressed=" true" name="CHANGEDFORPOST_1">
      <filer class="org.apache.xindice.core.filer.BTreeFiler" />
      <indexes />
     </collection>
     <collection compressed=" true" name="CHANGEDFORPOST_2">
     <filer class="org.apache.xindice.core.filer.BTreeFiler" />
     <indexes/>
    </collection>
   </collections>
  </collection>
 </collections>
</database>

Thanks,
-Nate

> Do you have any indexes enabled?
>
> Todd
>
> stoddarn@msoe.edu wrote:
>> Hello,
>>
>> Thank you for the reply.  I should have included my java memory settings
>> in my previous post.  I'm already running tomcat with the following
>> settings:
>>   CATALINA_OPTS="-Xms128m -Xmx512m"
>>
>> I'm did some more experiments, and while I get the failure from the
>> getResource() call, I am able to call listResources(), and see that the
>> resource name that I'm trying to access.  Sometimes even after I do a
>> successful listResources(), I still get the getResource() failure.
>>
>> Thanks again for the help,
>> -Nate
>>
>>
>>>I want to say I have ran into this before I would try increasing your
>>>memory in your Tomcat. If that doesn't fix the problem let me know and I
>>>can look into it deeper.
>>>
>>>Add this
>>>
>>>JAVA_OPTS="$JAVA_OPTS -Xmx512m"
>>>
>>>To the the top of catalina.sh
>>>
>>>Todd
>>>
>>>stoddarn@msoe.edu wrote:
>>>
>>>>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()
>>>>  {
>>>>  }
>>>>
>>>>}
>>>>
>>>
>>
>



Re: NullPointerException from GetResource() call

Posted by Todd Byrne <by...@cns.montana.edu>.
Do you have any indexes enabled?

Todd

stoddarn@msoe.edu wrote:
> Hello,
> 
> Thank you for the reply.  I should have included my java memory settings
> in my previous post.  I'm already running tomcat with the following
> settings:
>   CATALINA_OPTS="-Xms128m -Xmx512m"
> 
> I'm did some more experiments, and while I get the failure from the
> getResource() call, I am able to call listResources(), and see that the
> resource name that I'm trying to access.  Sometimes even after I do a
> successful listResources(), I still get the getResource() failure.
> 
> Thanks again for the help,
> -Nate
> 
> 
>>I want to say I have ran into this before I would try increasing your
>>memory in your Tomcat. If that doesn't fix the problem let me know and I
>>can look into it deeper.
>>
>>Add this
>>
>>JAVA_OPTS="$JAVA_OPTS -Xmx512m"
>>
>>To the the top of catalina.sh
>>
>>Todd
>>
>>stoddarn@msoe.edu wrote:
>>
>>>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()
>>>  {
>>>  }
>>>
>>>}
>>>
>>
> 

Re: NullPointerException from GetResource() call

Posted by st...@msoe.edu.
Hello,

Thank you for the reply.  I should have included my java memory settings
in my previous post.  I'm already running tomcat with the following
settings:
  CATALINA_OPTS="-Xms128m -Xmx512m"

I'm did some more experiments, and while I get the failure from the
getResource() call, I am able to call listResources(), and see that the
resource name that I'm trying to access.  Sometimes even after I do a
successful listResources(), I still get the getResource() failure.

Thanks again for the help,
-Nate

> I want to say I have ran into this before I would try increasing your
> memory in your Tomcat. If that doesn't fix the problem let me know and I
> can look into it deeper.
>
> Add this
>
> JAVA_OPTS="$JAVA_OPTS -Xmx512m"
>
> To the the top of catalina.sh
>
> Todd
>
> stoddarn@msoe.edu wrote:
>> 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()
>>   {
>>   }
>>
>> }
>>
>



Re: NullPointerException from GetResource() call

Posted by Todd Byrne <by...@cns.montana.edu>.
I want to say I have ran into this before I would try increasing your
memory in your Tomcat. If that doesn't fix the problem let me know and I
can look into it deeper.

Add this

JAVA_OPTS="$JAVA_OPTS -Xmx512m"

To the the top of catalina.sh

Todd

stoddarn@msoe.edu wrote:
> 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()
>   {
>   }
> 
> }
>