Subversion Repositories general

Compare Revisions

Ignore whitespace Rev 1005 → Rev 1006

/zpath/trunk/src/ak/zpath/PathCreator.java
198,6 → 198,10
pos = stateLogicalCondition(tokens, pos);
break;
 
case Token.TOKEN_INDEX:
pos = stateIndex(tokens, pos);
break;
 
default:
throw new PathCreateException("Element condition expected", token);
}
226,6 → 230,39
return pos;
}
 
private int stateIndex(List tokens, int pos)
throws PathCreateException
{
Token token = (Token)tokens.get(pos);
 
try {
element.setIndex(Integer.parseInt(token.getValue()));
}
catch(NumberFormatException ex) {
throw new PathCreateException(
"Cannot parse '" + token.getValue() + "' as integer", token);
}
 
token = (Token)tokens.get(++pos);
 
switch(token.getType()) {
case Token.TOKEN_CLOSE_BRACKET:
pos = stateConditionEnd(tokens, pos);
break;
 
case Token.TOKEN_AND:
pos++; // go to next token for stateLogicalCondition
pos = stateLogicalCondition(tokens, pos);
break;
 
default:
throw new PathCreateException(
"End of conditions or next condition expected", token);
}
 
return pos;
}
 
private int stateConditionText(List tokens, int pos)
throws PathCreateException
{
/zpath/trunk/src/ak/zpath/DocumentTree.java
109,7 → 109,7
if("/".equals(element.getName())) { // absolute path
element = (PathElement)path.get(1);
 
if(path.size() > 0 && "**".equals(element.getName())) {
if(path.size() > 1 && "**".equals(element.getName())) {
// special case: '/**'
startPos = 2;
}
279,9 → 279,11
{
if(pos >= path.size()) return node;
 
NodeList list = node.getChildNodes();
int count = list.getLength();
PathElement element = (PathElement)path.get(pos);
NodeList list = node.getChildNodes();
int count = list.getLength();
PathElement element = (PathElement)path.get(pos);
List idxElements = new ArrayList(); // list of desired elements
// if some index is specified
 
// special element name - parent element
if("..".equals(element.getName())) {
307,9 → 309,18
Element e = (Element)subnode;
 
if(testElement(element, params, e)) {
return doStep(path, ++pos, params, e, update);
if(element.getIndex() >= 0)
idxElements.add(0, e); // if index specified then collect all desired nodes to list
else
return doStep(path, ++pos, params, e, update); // otherwise go to the node immed.
}
}
 
// if index specified, test the collected desired items
if(element.getIndex() >= 0) {
if(element.getIndex() < idxElements.size()) // go to the node
return doStep(path, ++pos, params, (Element)idxElements.get(element.getIndex()), update);
}
}
 
// nothing found
317,12 → 328,21
if(element.getName() == null)
throw new PathCreateException("Cannot create element with name '*'");
 
Element newElement = document.createElement(element.getName());
setupElement(element, params, newElement);
node.appendChild(newElement);
lastElement = newElement;
Element newElement = null;
 
return doStep(path, ++pos, params, newElement, update);
if(element.getIndex() >= 0) {
for(int i = idxElements.size(); i <= element.getIndex(); i++) {
newElement = createNewElement(element, params, node); // we need the last one only
}
}
else {
newElement = createNewElement(element, params, node);
}
 
if(newElement == null)
throw new PathCreateException("Cannot create new element, internal error");
else
return doStep(path, ++pos, params, newElement, update);
}
else { // not allowed to change document
return null;
329,6 → 349,16
}
}
 
protected Element createNewElement(PathElement element, Map params, Element node)
{
Element newElement = document.createElement(element.getName());
setupElement(element, params, newElement);
node.appendChild(newElement);
lastElement = newElement;
 
return newElement;
}
 
protected void setupElement(PathElement element, Map params, Element node)
{
for(Iterator i = element.getConditions().iterator(); i.hasNext(); ) {
534,6 → 564,20
"d", "0003"
} );
 
// text indices
tree.updateDocument(
"/Vertrag/i# := '0'",
null);
tree.updateDocument(
"/Vertrag/i[1]# := '1'",
null);
tree.updateDocument(
"/Vertrag/i[7]# := '7'",
null);
tree.updateDocument(
"/Vertrag/i[4]# := '4'",
null);
 
// test search -------------------------------------------------------------
 
tree.searchElement("/Vertrag/Sparten", (Object[])null);
/zpath/trunk/src/ak/zpath/Token.java
16,6 → 16,7
public static final int TOKEN_NEW = 12;
public static final int TOKEN_NAME = 13;
public static final int TOKEN_APPEND = 14;
public static final int TOKEN_INDEX = 15;
 
private int type;
private int pos;
60,6 → 61,7
case Token.TOKEN_OR: return "or";
case Token.TOKEN_NEW: return "new";
case Token.TOKEN_NAME: return "name [" + value + "]";
case Token.TOKEN_INDEX: return "index [" + value + "]";
default: throw new RuntimeException("Unknown token type: " + type);
}
}
/zpath/trunk/src/ak/zpath/PathElement.java
16,6 → 16,7
 
private String name;
private boolean isNew = false;
private int index = -1;
private List conditions = new ArrayList();
private PathCondition condition;
private int firstOperandType = OPERAND_NONE;
123,6 → 124,16
isNew = true;
}
 
public int getIndex()
{
return index;
}
 
public void setIndex(int index)
{
this.index = index;
}
 
public String toString()
{
return "Element [" + name + "]";
/zpath/trunk/src/ak/zpath/PathParser.java
120,8 → 120,14
break;
 
default:
if(Character.isLetter(c) || c == '_') {
if(Character.isDigit(c)) {
startPos = pos;
pos = findIntegerEnd(path, pos);
token = path.substring(startPos, pos);
addToken(tokens, startPos, Token.TOKEN_INDEX, token);
}
else if(Character.isLetter(c) || c == '_') {
startPos = pos;
pos = findTokenEnd(path, pos);
token = path.substring(startPos, pos);
if("and".equals(token))
217,6 → 223,23
return pos;
}
 
private int findIntegerEnd(String path, int pos)
throws PathParseException
{
int endPos = path.length();
char c;
 
while(true) {
pos++;
if(pos >= endPos) break;
 
c = path.charAt(pos);
if(!Character.isDigit(c)) break;
}
 
return pos;
}
 
private void addToken(List tokens, int pos, int type, String value)
{
tokens.add(new Token(type, pos, value));