Index: src/java/org/apache/jackrabbit/core/query/XMLTextFilter.java =================================================================== --- src/java/org/apache/jackrabbit/core/query/XMLTextFilter.java (revision 453534) +++ src/java/org/apache/jackrabbit/core/query/XMLTextFilter.java (working copy) @@ -133,7 +133,7 @@ public void characters(char[] ch, int start, int length) { boolean space = false; - for (int i = start; i < length; i++) { + for (int i = start; i < start+length; i++) { if (Character.isLetterOrDigit(ch[i])) { if (space) { buffer.append(' '); Index: src/test/org/apache/jackrabbit/core/query/test/XMLTextFilterTest.java =================================================================== --- src/test/org/apache/jackrabbit/core/query/test/XMLTextFilterTest.java (revision 0) +++ src/test/org/apache/jackrabbit/core/query/test/XMLTextFilterTest.java (revision 0) @@ -0,0 +1,67 @@ +package org.apache.jackrabbit.core.query.test; + +import java.io.IOException; +import java.io.Reader; +import java.io.StringWriter; +import java.util.Map; + +import junit.framework.TestCase; + +import org.apache.jackrabbit.core.NodeId; +import org.apache.jackrabbit.core.PropertyId; +import org.apache.jackrabbit.core.query.TextFilter; +import org.apache.jackrabbit.core.query.XMLTextFilter; +import org.apache.jackrabbit.core.query.lucene.FieldNames; +import org.apache.jackrabbit.core.state.PropertyState; +import org.apache.jackrabbit.core.value.InternalValue; +import org.apache.jackrabbit.name.QName; +import org.apache.jackrabbit.uuid.UUID; + +public class XMLTextFilterTest extends TestCase +{ + public void testCanExtractAttributes() throws Exception + { + String xml = ""; + PropertyId id = new PropertyId(new NodeId(new UUID(1, 1)), new QName("", "")); + PropertyState state = new PropertyState(id, 1, true); + + InternalValue value = InternalValue.create(xml.getBytes()); + state.setValues(new InternalValue[]{value}); + + TextFilter filter = new XMLTextFilter(); + Map fields = filter.doFilter(state, System.getProperty("encoding")); + Reader reader = (Reader)fields.get(FieldNames.FULLTEXT); + String result = getValue(reader); + assertEquals("Stockholm", result.trim()); + } + + public void testCanExtractCData() throws Exception + { + String xml = "Stockholm"; + PropertyId id = new PropertyId(new NodeId(new UUID(1, 1)), new QName("", "")); + PropertyState state = new PropertyState(id, 1, true); + + InternalValue value = InternalValue.create(xml.getBytes()); + state.setValues(new InternalValue[]{value}); + + TextFilter filter = new XMLTextFilter(); + Map fields = filter.doFilter(state, System.getProperty("encoding")); + Reader reader = (Reader)fields.get(FieldNames.FULLTEXT); + String result = getValue(reader); + assertEquals("Stockholm", result.trim()); + } + + public String getValue(Reader r) throws IOException + { + StringWriter w = new StringWriter(); + char[] buf = new char[1000]; + int length = 0; + while((length = r.read(buf)) != -1) + { + w.write(buf, 0, length); + } + + String result = w.getBuffer().toString(); + return result; + } +}