/zpath/trunk/src/ak/zpath/PathCreator.java |
---|
198,10 → 198,6 |
pos = stateLogicalCondition(tokens, pos); |
break; |
case Token.TOKEN_INDEX: |
pos = stateIndex(tokens, pos); |
break; |
default: |
throw new PathCreateException("Element condition expected", token); |
} |
230,39 → 226,6 |
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() > 1 && "**".equals(element.getName())) { |
if(path.size() > 0 && "**".equals(element.getName())) { |
// special case: '/**' |
startPos = 2; |
} |
282,8 → 282,6 |
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())) { |
309,19 → 307,10 |
Element e = (Element)subnode; |
if(testElement(element, params, e)) { |
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. |
return doStep(path, ++pos, params, e, update); |
} |
} |
// 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 |
if(update) { // create a new one |
328,20 → 317,11 |
if(element.getName() == null) |
throw new PathCreateException("Cannot create element with name '*'"); |
Element newElement = null; |
Element newElement = document.createElement(element.getName()); |
setupElement(element, params, newElement); |
node.appendChild(newElement); |
lastElement = newElement; |
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 |
349,16 → 329,6 |
} |
} |
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(); ) { |
564,20 → 534,6 |
"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,7 → 16,6 |
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; |
61,7 → 60,6 |
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,7 → 16,6 |
private String name; |
private boolean isNew = false; |
private int index = -1; |
private List conditions = new ArrayList(); |
private PathCondition condition; |
private int firstOperandType = OPERAND_NONE; |
124,16 → 123,6 |
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,14 → 120,8 |
break; |
default: |
if(Character.isDigit(c)) { |
if(Character.isLetter(c) || 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)) |
223,23 → 217,6 |
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)); |