use of org.apache.axiom.core.CoreAttribute in project webservices-axiom by apache.
the class AttributeIterator method next.
public final S next() {
if (hasNext()) {
CoreAttribute attribute = nextAttribute;
currentAttribute = attribute;
nextAttribute = null;
nextAttributeSet = false;
return mapper.map(type.cast(attribute));
} else {
throw new NoSuchElementException();
}
}
use of org.apache.axiom.core.CoreAttribute in project webservices-axiom by apache.
the class NamespaceContextPreservationFilterHandler method attributesCompleted.
@Override
public void attributesCompleted() throws StreamException {
if (!done) {
try {
CoreElement current = contextElement;
while (true) {
CoreAttribute attr = current.coreGetFirstAttribute();
while (attr != null) {
if (attr instanceof CoreNamespaceDeclaration) {
CoreNamespaceDeclaration decl = (CoreNamespaceDeclaration) attr;
String prefix = decl.coreGetDeclaredPrefix();
if (prefixesAlreadyBound.add(prefix)) {
super.processNamespaceDeclaration(prefix, decl.coreGetCharacterData().toString());
}
}
attr = attr.coreGetNextAttribute();
}
CoreParentNode parent = current.coreGetParent();
if (!(parent instanceof CoreElement)) {
break;
}
current = (CoreElement) parent;
}
prefixesAlreadyBound = null;
done = true;
} catch (CoreModelException ex) {
throw new StreamException(ex);
}
}
super.attributesCompleted();
}
use of org.apache.axiom.core.CoreAttribute in project webservices-axiom by apache.
the class TreeWalkerImpl method proceed.
@Override
public boolean proceed() throws StreamException {
if (incremental && !handler.drain()) {
return false;
}
try {
// Determine the next node (i.e. the node for which the next event is generated) and
// update the state
final CoreNode previousNode = node;
final CoreNode nextNode;
if (state == STATE_PASS_THROUGH || state == STATE_STREAMING) {
nextNode = previousNode;
} else if (previousNode == null) {
if (state == STATE_NONE && !(root instanceof CoreDocument)) {
nextNode = null;
state = STATE_START_FRAGMENT;
} else {
nextNode = root;
state = STATE_NOT_VISITED;
}
} else if (state == STATE_VISITED && previousNode == root) {
nextNode = null;
} else if (state == STATE_NOT_VISITED && previousNode instanceof CoreElement) {
final CoreElement element = (CoreElement) previousNode;
// TODO: handle case with preserve == false
CoreAttribute firstAttribute = element.coreGetFirstAttribute();
if (firstAttribute == null) {
nextNode = element;
state = STATE_ATTRIBUTES_VISITED;
} else {
nextNode = firstAttribute;
state = STATE_NOT_VISITED;
}
} else if (state == STATE_NOT_VISITED || state == STATE_ATTRIBUTES_VISITED) {
final CoreParentNode parent = (CoreParentNode) previousNode;
int nodeState = parent.getState();
if (preserve || nodeState == CoreParentNode.COMPLETE || nodeState == CoreParentNode.COMPACT) {
// TODO: bad because it will expand the node if the state is COMPACT
CoreChildNode child = parent.coreGetFirstChild();
if (child == null) {
nextNode = parent;
state = STATE_VISITED;
} else {
nextNode = child;
state = STATE_NOT_VISITED;
}
} else {
CoreChildNode child = parent.coreGetFirstChildIfAvailable();
if (child == null) {
nextNode = parent;
if (nodeState == CoreParentNode.DISCARDING || nodeState == CoreParentNode.DISCARDED) {
throw new NodeConsumedException();
}
parent.coreGetInputContext().setPassThroughHandler(handler);
state = STATE_PASS_THROUGH;
} else {
nextNode = child;
state = STATE_NOT_VISITED;
}
}
} else if (previousNode instanceof CoreChildNode) {
final CoreChildNode previousChildNode = (CoreChildNode) previousNode;
if (preserve) {
CoreChildNode sibling = previousChildNode.coreGetNextSibling();
if (sibling == null) {
nextNode = previousChildNode.coreGetParent();
state = STATE_VISITED;
} else {
nextNode = sibling;
state = STATE_NOT_VISITED;
}
} else {
CoreChildNode sibling = previousChildNode.coreGetNextSiblingIfAvailable();
if (sibling == null) {
CoreParentNode parent = previousChildNode.coreGetParent();
nextNode = parent;
int nodeState = parent.getState();
// TODO: <hack>
if (nodeState == CoreParentNode.INCOMPLETE && parent.coreGetInputContext() == null) {
nodeState = CoreParentNode.COMPLETE;
}
if (nodeState == CoreParentNode.COMPLETE) {
state = STATE_VISITED;
} else if (nodeState == CoreParentNode.DISCARDING || nodeState == CoreParentNode.DISCARDED) {
throw new NodeConsumedException();
} else {
parent.coreGetInputContext().setPassThroughHandler(handler);
state = STATE_PASS_THROUGH;
}
} else {
nextNode = sibling;
state = STATE_NOT_VISITED;
}
}
} else {
final CoreAttribute attribute = (CoreAttribute) previousNode;
// TODO: handle case with preserve == false
CoreAttribute nextAttribute = attribute.coreGetNextAttribute();
if (nextAttribute == null) {
nextNode = attribute.coreGetOwnerElement();
state = STATE_ATTRIBUTES_VISITED;
} else {
nextNode = nextAttribute;
state = STATE_NOT_VISITED;
}
}
// been visited yet. It may be a sourced element or a leaf node
if (state == STATE_NOT_VISITED) {
if (nextNode instanceof CoreNSAwareElement) {
XmlInput input = ((CoreNSAwareElement) nextNode).getXmlInput(preserve, incremental);
if (input != null) {
reader = input.createReader(new DocumentElementExtractingFilterHandler(handler));
state = STATE_STREAMING;
}
} else if (nextNode instanceof CoreLeafNode) {
state = STATE_LEAF;
} else if (nextNode instanceof CoreAttribute) {
state = STATE_ATTRIBUTE;
}
}
switch(state) {
case STATE_START_FRAGMENT:
handler.startFragment();
break;
case STATE_LEAF:
((CoreLeafNode) nextNode).internalSerialize(handler, preserve);
break;
case STATE_ATTRIBUTE:
((CoreAttribute) nextNode).internalSerialize(handler, preserve);
break;
case STATE_NOT_VISITED:
((CoreParentNode) nextNode).serializeStartEvent(handler);
break;
case STATE_ATTRIBUTES_VISITED:
handler.attributesCompleted();
break;
case STATE_VISITED:
if (nextNode == null) {
handler.completed();
} else {
((CoreParentNode) nextNode).serializeEndEvent(handler);
}
break;
case STATE_PASS_THROUGH:
{
CoreParentNode parent = (CoreParentNode) nextNode;
parent.coreGetInputContext().getBuilder().next();
if (parent.coreGetInputContext() == null) {
state = STATE_VISITED;
}
break;
}
case STATE_STREAMING:
if (reader.proceed()) {
state = STATE_VISITED;
reader = null;
}
break;
default:
throw new IllegalStateException();
}
node = nextNode;
return state == STATE_VISITED && (nextNode == null || nextNode instanceof CoreDocument);
} catch (CoreModelException ex) {
throw new CoreModelStreamException(ex);
}
}
use of org.apache.axiom.core.CoreAttribute in project webservices-axiom by apache.
the class AttributesNamedNodeMap method getLength.
public int getLength() {
int length = 0;
CoreAttribute attr = element.coreGetFirstAttribute();
while (attr != null) {
attr = attr.coreGetNextAttribute();
length++;
}
return length;
}
use of org.apache.axiom.core.CoreAttribute in project webservices-axiom by apache.
the class AttributeIterator method hasNext.
public final boolean hasNext() {
if (!nextAttributeSet) {
CoreAttribute attribute = currentAttribute;
do {
attribute = attribute.coreGetNextAttribute();
} while (attribute != null && !type.isInstance(attribute));
nextAttribute = attribute;
nextAttributeSet = true;
}
return nextAttribute != null;
}
Aggregations