Browse Source

Improved escape handling and fixed JsonValueNode issue.

pull/169/head
Kalle Stenflo 9 years ago
parent
commit
ac83feea14
  1. 66
      json-path/src/main/java/com/jayway/jsonpath/internal/CharacterIndex.java
  2. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/PathRef.java
  3. 4
      json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java
  4. 1
      json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java
  5. 9
      json-path/src/main/java/com/jayway/jsonpath/spi/json/TapestryJsonProvider.java
  6. 4
      json-path/src/main/java/com/jayway/jsonpath/spi/mapper/TapestryMappingProvider.java
  7. 2
      json-path/src/test/java/com/jayway/jsonpath/FilterCompilerTest.java
  8. 21
      json-path/src/test/java/com/jayway/jsonpath/InlineFilterTest.java

66
json-path/src/main/java/com/jayway/jsonpath/internal/CharacterIndex.java

@ -77,51 +77,22 @@ public class CharacterIndex {
int readPosition = startPosition + 1; int readPosition = startPosition + 1;
while (inBounds(readPosition)) { while (inBounds(readPosition)) {
if (skipStrings) { if (skipStrings) {
if (charAt(readPosition) == SINGLE_QUOTE) { char quoteChar = charAt(readPosition);
boolean escaped = false; if (quoteChar == SINGLE_QUOTE || quoteChar == DOUBLE_QUOTE){
while (inBounds(readPosition)) { readPosition = nextIndexOfUnescaped(readPosition, quoteChar);
readPosition++; if(readPosition == -1){
if (escaped) { throw new InvalidPathException("Could not find matching close quote for " + quoteChar + " when parsing : " + charSequence);
escaped = false;
continue;
}
if (charAt(readPosition) == ESCAPE) {
escaped = true;
continue;
} }
if (charAt(readPosition) == SINGLE_QUOTE) {
readPosition++; readPosition++;
break;
}
}
} else if (charAt(readPosition) == DOUBLE_QUOTE) {
boolean escaped = false;
while (inBounds(readPosition)) {
readPosition++;
if (escaped) {
escaped = false;
continue;
}
if (charAt(readPosition) == ESCAPE) {
escaped = true;
continue;
}
if (charAt(readPosition) == DOUBLE_QUOTE) {
readPosition++;
break;
}
}
} }
} }
if (skipRegex) { if (skipRegex) {
if (charAt(readPosition) == REGEX) { if (charAt(readPosition) == REGEX) {
while (inBounds(readPosition)) { readPosition = nextIndexOfUnescaped(readPosition, REGEX);
readPosition++; if(readPosition == -1){
if (charAt(readPosition) == REGEX) { throw new InvalidPathException("Could not find matching close for " + REGEX + " when parsing regex in : " + charSequence);
readPosition++;
break;
}
} }
readPosition++;
} }
} }
if (charAt(readPosition) == openChar) { if (charAt(readPosition) == openChar) {
@ -174,20 +145,19 @@ public class CharacterIndex {
} }
public int nextIndexOfUnescaped(char c) { public int nextIndexOfUnescaped(char c) {
return nextIndexOfUnescaped(position + 1, c); return nextIndexOfUnescaped(position, c);
} }
public int nextIndexOfUnescaped(int startPosition, char c) { public int nextIndexOfUnescaped(int startPosition, char c) {
int readPosition = startPosition;
char prev1;
char prev2;
while (!isOutOfBounds(readPosition)) {
prev1 = charAtOr(readPosition - 1, ' ');
prev2 = charAtOr(readPosition - 2, ' ');
boolean ignore = (prev1 == '\\' && prev2 == '\\');
boolean escaped = (prev1 == '\\' && !ignore);
if (charAt(readPosition) == c && !escaped) { int readPosition = startPosition + 1;
boolean inEscape = false;
while (!isOutOfBounds(readPosition)) {
if(inEscape){
inEscape = false;
} else if('\\' == charAt(readPosition)){
inEscape = true;
} else if (c == charAt(readPosition) && !inEscape){
return readPosition; return readPosition;
} }
readPosition ++; readPosition ++;

2
json-path/src/main/java/com/jayway/jsonpath/internal/PathRef.java

@ -218,8 +218,6 @@ public abstract class PathRef implements Comparable<PathRef> {
} }
} }
private static class ObjectPropertyPathRef extends PathRef { private static class ObjectPropertyPathRef extends PathRef {
private String property; private String property;

4
json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java

@ -174,8 +174,8 @@ public abstract class ValueNode {
if(o instanceof ValueNode) return (ValueNode)o; if(o instanceof ValueNode) return (ValueNode)o;
if(o instanceof Class) return createClassNode((Class)o); if(o instanceof Class) return createClassNode((Class)o);
else if(isPath(o)) return new PathNode(o.toString(), false, false); else if(isPath(o)) return new PathNode(o.toString(), false, false);
else if(isJson(o)) return createStringNode(o.toString(), false); else if(isJson(o)) return createJsonNode(o.toString());
else if(o instanceof String) return createStringNode(o.toString(), false); else if(o instanceof String) return createStringNode(o.toString(), true);
else if(o instanceof Character) return createStringNode(o.toString(), false); else if(o instanceof Character) return createStringNode(o.toString(), false);
else if(o instanceof Number) return createNumberNode(o.toString()); else if(o instanceof Number) return createNumberNode(o.toString());
else if(o instanceof Boolean) return createBooleanNode(o.toString()); else if(o instanceof Boolean) return createBooleanNode(o.toString());

1
json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java

@ -256,7 +256,6 @@ public class PathCompiler {
Predicate predicate = FilterCompiler.compile(criteria); Predicate predicate = FilterCompiler.compile(criteria);
//Predicate predicate = Filter.parse(criteria);
appender.appendPathToken(PathTokenFactory.createPredicatePathToken(predicate)); appender.appendPathToken(PathTokenFactory.createPredicatePathToken(predicate));
path.setPosition(closeStatementBracketIndex + 1); path.setPosition(closeStatementBracketIndex + 1);

9
json-path/src/main/java/com/jayway/jsonpath/spi/json/TapestryJsonProvider.java

@ -1,14 +1,13 @@
package com.jayway.jsonpath.spi.json; package com.jayway.jsonpath.spi.json;
import java.io.InputStream; import com.jayway.jsonpath.InvalidJsonException;
import java.util.Collection;
import java.util.Scanner;
import org.apache.tapestry5.json.JSONArray; import org.apache.tapestry5.json.JSONArray;
import org.apache.tapestry5.json.JSONCollection; import org.apache.tapestry5.json.JSONCollection;
import org.apache.tapestry5.json.JSONObject; import org.apache.tapestry5.json.JSONObject;
import com.jayway.jsonpath.InvalidJsonException; import java.io.InputStream;
import java.util.Collection;
import java.util.Scanner;
public class TapestryJsonProvider extends AbstractJsonProvider { public class TapestryJsonProvider extends AbstractJsonProvider {

4
json-path/src/main/java/com/jayway/jsonpath/spi/mapper/TapestryMappingProvider.java

@ -14,11 +14,11 @@
*/ */
package com.jayway.jsonpath.spi.mapper; package com.jayway.jsonpath.spi.mapper;
import java.util.ArrayList;
import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.TypeRef; import com.jayway.jsonpath.TypeRef;
import java.util.ArrayList;
public class TapestryMappingProvider implements MappingProvider { public class TapestryMappingProvider implements MappingProvider {
@Override @Override

2
json-path/src/test/java/com/jayway/jsonpath/FilterCompilerTest.java

@ -81,7 +81,7 @@ public class FilterCompilerTest {
compile(filter); compile(filter);
throw new AssertionError("Expected " + filter + " to throw InvalidPathException"); throw new AssertionError("Expected " + filter + " to throw InvalidPathException");
} catch (InvalidPathException e){ } catch (InvalidPathException e){
e.printStackTrace(); //e.printStackTrace();
} }
} }
} }

21
json-path/src/test/java/com/jayway/jsonpath/InlineFilterTest.java

@ -186,6 +186,27 @@ public class InlineFilterTest extends BaseTest {
assertHasOneResult("[{\"value\":5.1}]", "$[?(@.value<7)]", conf); assertHasOneResult("[{\"value\":5.1}]", "$[?(@.value<7)]", conf);
assertHasNoResults("[{\"value\":7.1}]", "$[?(@.value<5)]", conf); assertHasNoResults("[{\"value\":7.1}]", "$[?(@.value<5)]", conf);
}
@Test
public void escaped_literals() {
if(conf.jsonProvider().getClass().getSimpleName().startsWith("Jackson")){
return;
}
assertHasOneResult("[\"\\'foo\"]", "$[?(@ == '\\'foo')]", conf);
}
@Test
public void escaped_literals2() {
if(conf.jsonProvider().getClass().getSimpleName().startsWith("Jackson")){
return;
}
assertHasOneResult("[\"\\\\'foo\"]", "$[?(@ == \"\\\\'foo\")]", conf);
}
@Test
public void escape_pattern() {
assertHasOneResult("[\"x\"]", "$[?(@ =~ /\\/|x/)]", conf);
} }
} }

Loading…
Cancel
Save