package lux.index; import static javax.xml.stream.XMLStreamConstants.CDATA; import static javax.xml.stream.XMLStreamConstants.CHARACTERS; import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; import static javax.xml.stream.XMLStreamConstants.ENTITY_REFERENCE; import static javax.xml.stream.XMLStreamConstants.SPACE; import static javax.xml.stream.XMLStreamConstants.START_DOCUMENT; import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; import java.util.ArrayList; import java.util.Arrays; import javax.xml.stream.XMLStreamReader; /** * Accumulates text for each element and each attribute. */ public class QNameTextMapper extends XmlPathMapper { private int depth = -1; private StringBuilder[] stack; private ArrayList<CharSequence> names; private ArrayList<CharSequence> values; private MutableString charBuffer = new MutableString(); public QNameTextMapper () { stack = new StringBuilder[8]; names = new ArrayList<CharSequence>(); values = new ArrayList<CharSequence>(); for (int i = 0; i < stack.length; i++) { stack[i] = new StringBuilder(); } } public ArrayList<CharSequence> getValues() { return values; } public ArrayList<CharSequence> getNames() { return names; } @Override public void reset () { super.reset(); depth = -1; names.clear(); values.clear(); } @Override public void handleEvent(XMLStreamReader reader, int eventType) { StringBuilder buf; switch (eventType) { case START_DOCUMENT: super.handleEvent(reader, eventType); break; case START_ELEMENT: super.handleEvent(reader, eventType); buf = pushStackFrame(); for (int i = 0; i < reader.getAttributeCount(); i++) { getEventAttQName (charBuffer, reader, i); String name = '@' + charBuffer.toString(); names.add(name); // surround value by terminal markers // buf.append(QNameTextField.RECORD_START). // buf.append (reader.getAttributeValue(i)); //buf.append(QNameTextField.RECORD_END); // values.add(buf.toString()); values.add(reader.getAttributeValue (i)); //buf.setLength(0); } //buf.append(QNameTextField.RECORD_START); break; case END_ELEMENT: super.handleEvent(reader, eventType); buf = popStackFrame(); //buf.append(QNameTextField.RECORD_END); names.add(getCurrentQName()); values.add(buf.toString()); break; case CDATA: case SPACE: case CHARACTERS: stack[depth].append(reader.getTextCharacters(), reader.getTextStart(), reader.getTextLength()); super.handleEvent(reader, eventType); break; case ENTITY_REFERENCE: stack[depth].append(reader.getText()); break; default: super.handleEvent(reader, eventType); break; } } private StringBuilder popStackFrame () { return stack[depth--]; } private StringBuilder pushStackFrame () { if (depth++ >= stack.length) { growStack(); } else { stack[depth].setLength(0); } return stack[depth]; } private void growStack () { stack = Arrays.copyOf(stack, stack.length + 8); } } /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */