ArrayIndexOutOfBounds thrown on re-index of repository
------------------------------------------------------

         Key: JCR-195
         URL: http://issues.apache.org/jira/browse/JCR-195
     Project: Jackrabbit
        Type: Bug
  Components: query, xml  
    Versions: 1.0    
 Environment: Windows 2003, Java 1.5, Pentinum Xeon system
    Reporter: Ernest Evans
    Priority: Minor


I encountered a problem with the Lucene NodeIndexer when forcing the repository 
to re-index itself.

Using the default repository.xml file provided with the examples contribution, 
I loaded a number of PDF files using the sample application FSImport.  In this 
utility, the "encoding" property is set to the empty string "" for all the 
files.  The system appeared to index everything properly.  I then stopped the 
repository, deleted the index files and then restarted the repositoyr.  
Re-indexing was initiated and a "ArrayIndexOutOfBoundsException" was thrown 
from the org.apache.jackrabbit.core.query.lucene.NodeIndexer.java

The code in question:

                // jcr:encoding is not mandatory
                String encoding = null;
                if (node.hasPropertyName(JCR_ENCODING)) {
                    PropertyState encodingProp =
                            (PropertyState) stateProvider.getItemState(new 
PropertyId(node.getUUID(), JCR_ENCODING));
                    encodingProp.getValues()[0].internalValue().toString();


                }

Expects the encodingProperty to be set if the property exists.  However, the 
node has the property, but the XMLPersistenceManager did not create any entries 
in the property array.  Either there is a problem in the XMLPersistenceManager 
(zero length string issues), or the NodeIndexer needs to be altered to verify 
that there is actually a value for a particular property.

Since the jcr:encoding property is not considered a multi-value property, the 
requirement to check for an initialized array is probably not the correct route.

Looking at the code for the XMLPersistenceManager readState(DOMWalker walker, 
PropertyState state) method (line 294), it indicates that if the content length 
for a property is zero, the property will not have a value added.  However, our 
encoding property is configured as the empty string and should be created.  
Therefore, a suggested alteration is to check if the property is a string, and, 
even if zero length, add the property value.

        ArrayList values = new ArrayList();
        if (walker.enterElement(VALUES_ELEMENT)) {
            while (walker.iterateElements(VALUE_ELEMENT)) {
                // read serialized value
                String content = walker.getContent();
                if ((content.length() > 0) || (PropertyType.STRING == type)) {  
 // <==== suggested update
                    if (type == PropertyType.BINARY) {
                        // special handling required for binary value:
                        // the value stores the path to the actual binary file 
in the blob store
                        try {
                            values.add(InternalValue.create(new 
FileSystemResource(blobStore, content)));
                        } catch (IOException ioe) {
                            String msg = "error while reading serialized binary 
value";
                            log.debug(msg);
                            throw new ItemStateException(msg, ioe);
                        }
                    } else {
                        values.add(InternalValue.valueOf(content, type));
                    }
                }
            }
            walker.leaveElement();
        }


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to