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;
+ }
+}