
com.thoughtworks.xstream.io.binary.ReaderDepthState Maven / Gradle / Ivy
The newest version!
/*
* Copyright (C) 2006 Joe Walnes.
* Copyright (C) 2006, 2007 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 04. June 2006 by Joe Walnes
*/
package com.thoughtworks.xstream.io.binary;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Collections;
/**
* Maintains the state of a pull reader at various states in the document depth.
*
* Used by the {@link BinaryStreamReader}
*
* @author Joe Walnes
* @since 1.2
*/
class ReaderDepthState {
private static final String EMPTY_STRING = "";
private static class State {
String name;
String value;
List attributes;
boolean hasMoreChildren;
State parent;
}
private static class Attribute {
String name;
String value;
}
private State current;
public void push() {
State newState = new State();
newState.parent = current;
current = newState;
}
public void pop() {
current = current.parent;
}
public String getName() {
return current.name;
}
public void setName(String name) {
current.name = name;
}
public String getValue() {
return current.value == null ? EMPTY_STRING : current.value;
}
public void setValue(String value) {
current.value = value;
}
public boolean hasMoreChildren() {
return current.hasMoreChildren;
}
public void setHasMoreChildren(boolean hasMoreChildren) {
current.hasMoreChildren = hasMoreChildren;
}
public void addAttribute(String name, String value) {
Attribute attribute = new Attribute();
attribute.name = name;
attribute.value = value;
if (current.attributes == null) {
current.attributes = new ArrayList();
}
current.attributes.add(attribute);
}
public String getAttribute(String name) {
if (current.attributes == null) {
return null;
} else {
// For short maps, it's faster to iterate then do a hashlookup.
for (Iterator iterator = current.attributes.iterator(); iterator.hasNext();) {
Attribute attribute = (Attribute) iterator.next();
if (attribute.name.equals(name)) {
return attribute.value;
}
}
return null;
}
}
public String getAttribute(int index) {
if (current.attributes == null) {
return null;
} else {
Attribute attribute = (Attribute) current.attributes.get(index);
return attribute.value;
}
}
public String getAttributeName(int index) {
if (current.attributes == null) {
return null;
} else {
Attribute attribute = (Attribute) current.attributes.get(index);
return attribute.name;
}
}
public int getAttributeCount() {
return current.attributes == null ? 0 : current.attributes.size();
}
public Iterator getAttributeNames() {
if (current.attributes == null) {
return Collections.EMPTY_SET.iterator();
} else {
final Iterator attributeIterator = current.attributes.iterator();
return new Iterator() {
public boolean hasNext() {
return attributeIterator.hasNext();
}
public Object next() {
Attribute attribute = (Attribute) attributeIterator.next();
return attribute.name;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy