Browse Source

Renamed internal 'compiler' package to 'token'

pull/56/head
Kalle Stenflo 10 years ago
parent
commit
1bb52b59b0
  1. 69
      json-path/src/main/java/com/jayway/jsonpath/Configuration.java
  2. 57
      json-path/src/main/java/com/jayway/jsonpath/Criteria.java
  3. 10
      json-path/src/main/java/com/jayway/jsonpath/Filter.java
  4. 1
      json-path/src/main/java/com/jayway/jsonpath/InvalidCriteriaException.java
  5. 1
      json-path/src/main/java/com/jayway/jsonpath/InvalidJsonException.java
  6. 4
      json-path/src/main/java/com/jayway/jsonpath/internal/CompiledPath.java
  7. 157
      json-path/src/main/java/com/jayway/jsonpath/internal/Parser.java
  8. 14
      json-path/src/main/java/com/jayway/jsonpath/internal/PathCompiler.java
  9. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/token/ArrayPathToken.java
  10. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/token/EvaluationContextImpl.java
  11. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/token/PathToken.java
  12. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/token/PredicateContextImpl.java
  13. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/token/PredicatePathToken.java
  14. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/token/PropertyPathToken.java
  15. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/token/RootPathToken.java
  16. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/token/ScanPathToken.java
  17. 2
      json-path/src/main/java/com/jayway/jsonpath/internal/token/WildcardPathToken.java
  18. 4
      json-path/src/test/java/com/jayway/jsonpath/BaseTest.java
  19. 6
      json-path/src/test/java/com/jayway/jsonpath/old/IssuesTest.java
  20. 2
      json-path/src/test/java/com/jayway/jsonpath/old/JsonPathTest.java
  21. 4
      json-path/src/test/java/com/jayway/jsonpath/old/NullHandlingTest.java
  22. 2
      json-path/src/test/java/com/jayway/jsonpath/old/internal/PropertyPathTokenTest.java

69
json-path/src/main/java/com/jayway/jsonpath/Configuration.java

@ -26,6 +26,9 @@ import java.util.Set;
import static com.jayway.jsonpath.internal.Utils.notNull;
import static java.util.Arrays.asList;
/**
* Immutable configuration object
*/
public class Configuration {
private static Defaults DEFAULTS = new Defaults() {
@ -62,55 +65,103 @@ public class Configuration {
private Configuration(JsonProvider jsonProvider, MappingProvider mappingProvider, EnumSet<Option> options) {
notNull(jsonProvider, "jsonProvider can not be null");
notNull(mappingProvider, "mappingProvider can not be null");
notNull(options, "options can not be null");
notNull(options, "setOptions can not be null");
this.jsonProvider = jsonProvider;
this.mappingProvider = mappingProvider;
this.options = Collections.unmodifiableSet(options);
}
/**
* Creates a new Configuration based on the given {@link com.jayway.jsonpath.spi.json.JsonProvider}
* @param newJsonProvider json provider to use in new configuration
* @return a new configuration
*/
public Configuration jsonProvider(JsonProvider newJsonProvider) {
return Configuration.builder().jsonProvider(newJsonProvider).mappingProvider(mappingProvider).options(options).build();
}
/**
* Returns {@link com.jayway.jsonpath.spi.json.JsonProvider} used by this configuration
* @return jsonProvider used
*/
public JsonProvider jsonProvider() {
return jsonProvider;
}
public MappingProvider mappingProvider() {
return mappingProvider;
}
/**
* Creates a new Configuration based on the given {@link com.jayway.jsonpath.spi.mapper.MappingProvider}
* @param newMappingProvider mapping provider to use in new configuration
* @return a new configuration
*/
public Configuration mappingProvider(MappingProvider newMappingProvider) {
return Configuration.builder().jsonProvider(jsonProvider).mappingProvider(newMappingProvider).options(options).build();
}
/**
* Returns {@link com.jayway.jsonpath.spi.mapper.MappingProvider} used by this configuration
* @return mappingProvider used
*/
public MappingProvider mappingProvider() {
return mappingProvider;
}
/**
* Creates a new configuration by adding the new options to the options used in this configuration.
* @param options options to add
* @return a new configuration
*/
public Configuration addOptions(Option... options) {
EnumSet<Option> opts = EnumSet.noneOf(Option.class);
opts.addAll(this.options);
opts.addAll(asList(options));
return Configuration.builder().jsonProvider(jsonProvider).mappingProvider(mappingProvider).options(opts).build();
}
public Configuration options(Option... options) {
/**
* Creates a new configuration with the provided options. Options in this configuration are discarded.
* @param options
* @return
*/
public Configuration setOptions(Option... options) {
return Configuration.builder().jsonProvider(jsonProvider).mappingProvider(mappingProvider).options(options).build();
}
/**
* Returns the options used by this configuration
* @return
*/
public Set<Option> getOptions() {
return options;
}
/**
* Check if this configuration contains the given option
* @param option option to check
* @return true if configurations contains option
*/
public boolean containsOption(Option option){
return options.contains(option);
}
/**
* Creates a new configuration based on default values
* @return a new configuration based on defaults
*/
public static Configuration defaultConfiguration() {
return Configuration.builder().jsonProvider(DEFAULTS.jsonProvider()).options(DEFAULTS.options()).build();
}
/**
* Returns a new ConfigurationBuilder
* @return a builder
*/
public static ConfigurationBuilder builder() {
return new ConfigurationBuilder();
}
/**
* Configuration builder
*/
public static class ConfigurationBuilder {
private JsonProvider jsonProvider;
@ -158,8 +209,8 @@ public class Configuration {
JsonProvider jsonProvider();
/**
* Returns default options
* @return options
* Returns default setOptions
* @return setOptions
*/
Set<Option> options();

57
json-path/src/main/java/com/jayway/jsonpath/Criteria.java

@ -2,7 +2,7 @@ package com.jayway.jsonpath;
import com.jayway.jsonpath.internal.Path;
import com.jayway.jsonpath.internal.PathCompiler;
import com.jayway.jsonpath.internal.compiler.PredicateContextImpl;
import com.jayway.jsonpath.internal.token.PredicateContextImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -566,6 +566,38 @@ public class Criteria implements Predicate {
return this;
}
/**
* Creates a new criteria
* @param path path to evaluate in criteria
* @param operator operator
* @param expected expected value
* @return a new Criteria
*/
public static Criteria create(String path, String operator, String expected) {
if (!expected.isEmpty() && expected.charAt(0) == '\'' && expected.charAt(expected.length() - 1) == '\'') {
expected = expected.substring(1, expected.length() - 1);
}
Path p = PathCompiler.compile(path);
if (("$".equals(path) || "@".equals(path) )&& (operator == null || operator.isEmpty()) && (expected == null || expected.isEmpty())) {
return new Criteria(p, CriteriaType.NE, null);
} else if (operator.isEmpty()) {
return Criteria.where(path).exists(true);
} else {
if(expected.startsWith("$") || expected.startsWith("@")){
Path compile = PathCompiler.compile(expected);
if(!compile.isDefinite()){
throw new InvalidPathException("the predicate path: " + expected + " is not definite");
}
return new Criteria(p, CriteriaType.parse(operator), compile);
} else {
return new Criteria(p, CriteriaType.parse(operator), expected);
}
}
}
private static int safeCompare(Object expected, Object providerParsed) throws ValueCompareException {
if(expected == providerParsed){
@ -605,30 +637,7 @@ public class Criteria implements Predicate {
return (o == null || ((o instanceof String) && ("null".equals(o))));
}
public static Criteria create(String path, String operator, String expected) {
if (!expected.isEmpty() && expected.charAt(0) == '\'' && expected.charAt(expected.length() - 1) == '\'') {
expected = expected.substring(1, expected.length() - 1);
}
Path p = PathCompiler.compile(path);
if (("$".equals(path) || "@".equals(path) )&& (operator == null || operator.isEmpty()) && (expected == null || expected.isEmpty())) {
return new Criteria(p, CriteriaType.NE, null);
} else if (operator.isEmpty()) {
return Criteria.where(path).exists(true);
} else {
if(expected.startsWith("$") || expected.startsWith("@")){
Path compile = PathCompiler.compile(expected);
if(!compile.isDefinite()){
throw new InvalidPathException("the predicate path: " + expected + " is not definite");
}
return new Criteria(p, CriteriaType.parse(operator), compile);
} else {
return new Criteria(p, CriteriaType.parse(operator), expected);
}
}
}
@Override
public String toString() {

10
json-path/src/main/java/com/jayway/jsonpath/Filter.java

@ -18,10 +18,20 @@ public class Filter implements Predicate {
this.criteriaList = criteriaList;
}
/**
* Creates a new Filter based on given criteria
* @param criteria criteria
* @return a new Filter
*/
public static Filter filter(Predicate criteria) {
return new Filter(criteria);
}
/**
* Create a new Filter based on given list of criteria.
* @param criteriaList list of criteria
* @return
*/
public static Filter filter(List<Predicate> criteriaList) {
return new Filter(criteriaList);
}

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

@ -14,6 +14,7 @@
*/
package com.jayway.jsonpath;
@SuppressWarnings("serial")
public class InvalidCriteriaException extends RuntimeException {
public InvalidCriteriaException() {
}

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

@ -14,7 +14,6 @@
*/
package com.jayway.jsonpath;
@SuppressWarnings("serial")
public class InvalidJsonException extends RuntimeException {

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

@ -1,8 +1,8 @@
package com.jayway.jsonpath.internal;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.internal.compiler.EvaluationContextImpl;
import com.jayway.jsonpath.internal.compiler.PathToken;
import com.jayway.jsonpath.internal.token.EvaluationContextImpl;
import com.jayway.jsonpath.internal.token.PathToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

157
json-path/src/main/java/com/jayway/jsonpath/internal/Parser.java

@ -1,157 +0,0 @@
package com.jayway.jsonpath.internal;
public class Parser {
public enum Token {
DOT('.'),
OPEN_BRACKET('['),
CLOSE_BRACKET(']'),
OPEN_PARENTHESIS('('),
CLOSE_PARENTHESIS(')'),
BLANK(' '),
TICK('\''),
END('^');
private final char c;
Token(char c) {
this.c = c;
}
}
protected String buffer;
private int i;
public Parser(String src) {
buffer = src;
i = -1;
}
public char prev(){
return buffer.charAt(i-1);
}
public boolean prevIs(char c){
if(i <= 0){
return false;
}
return prev() == c;
}
public char curr(){
return buffer.charAt(i);
}
public char peek(){
return buffer.charAt(i + 1);
}
public boolean peekIs(Token token){
return buffer.charAt(i+1) == token.c;
}
public char next(){
return buffer.charAt(++i);
}
public boolean hasNext(){
return i < buffer.length() - 1;
}
public String next(int count){
//i++;
int y = i;
i = i + count - 1;
return buffer.substring(y, i+1);
//return Arrays.copyOfRange(buffer, y, i+1);
}
public void trim(Token token){
while (peekIs(token)){
next();
}
}
public int findOffset(Token... tokens){
int y = i;
char check;
do {
if(y == buffer.length()-1 && contains(tokens, Token.END.c)){
y++;
break;
}
check = buffer.charAt(++y);
} while (!contains(tokens, check));
return y-i;
}
public String nextUntil(Token... tokens){
next();
int offset = findOffset(tokens);
return next(offset);
}
public static boolean isInts(String chars, boolean allowSequence){
for (int i = 0; i < chars.length(); i++){
char c = chars.charAt(i);
boolean isSequenceChar = (c == ' ' || c == ',');
if(!Character.isDigit(c) || (isSequenceChar && allowSequence)){
return false;
}
}
return true;
}
private static boolean contains(Token[] arr, char checkFor){
for (int i = 0; i < arr.length; i++){
if(arr[i].c == checkFor){
return true;
}
}
return false;
}
/*
public Filter2 parse(String filterString){
char[] chars = filterString.trim().toCharArray();
int i = 0;
do {
char current = chars[i];
switch (current){
case '?':
break;
case '(':
break;
case ')':
break;
case '\'';
}
i++;
} while (i < chars.length);
}
*/
}

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

@ -4,13 +4,13 @@ import com.jayway.jsonpath.Criteria;
import com.jayway.jsonpath.Filter;
import com.jayway.jsonpath.InvalidPathException;
import com.jayway.jsonpath.Predicate;
import com.jayway.jsonpath.internal.compiler.ArrayPathToken;
import com.jayway.jsonpath.internal.compiler.PathToken;
import com.jayway.jsonpath.internal.compiler.PredicatePathToken;
import com.jayway.jsonpath.internal.compiler.PropertyPathToken;
import com.jayway.jsonpath.internal.compiler.RootPathToken;
import com.jayway.jsonpath.internal.compiler.ScanPathToken;
import com.jayway.jsonpath.internal.compiler.WildcardPathToken;
import com.jayway.jsonpath.internal.token.ArrayPathToken;
import com.jayway.jsonpath.internal.token.PathToken;
import com.jayway.jsonpath.internal.token.PredicatePathToken;
import com.jayway.jsonpath.internal.token.PropertyPathToken;
import com.jayway.jsonpath.internal.token.RootPathToken;
import com.jayway.jsonpath.internal.token.ScanPathToken;
import com.jayway.jsonpath.internal.token.WildcardPathToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

2
json-path/src/main/java/com/jayway/jsonpath/internal/compiler/ArrayPathToken.java → json-path/src/main/java/com/jayway/jsonpath/internal/token/ArrayPathToken.java

@ -1,4 +1,4 @@
package com.jayway.jsonpath.internal.compiler;
package com.jayway.jsonpath.internal.token;
import com.jayway.jsonpath.InvalidPathException;
import com.jayway.jsonpath.PathNotFoundException;

2
json-path/src/main/java/com/jayway/jsonpath/internal/compiler/EvaluationContextImpl.java → json-path/src/main/java/com/jayway/jsonpath/internal/token/EvaluationContextImpl.java

@ -1,4 +1,4 @@
package com.jayway.jsonpath.internal.compiler;
package com.jayway.jsonpath.internal.token;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.Option;

2
json-path/src/main/java/com/jayway/jsonpath/internal/compiler/PathToken.java → json-path/src/main/java/com/jayway/jsonpath/internal/token/PathToken.java

@ -1,4 +1,4 @@
package com.jayway.jsonpath.internal.compiler;
package com.jayway.jsonpath.internal.token;
import com.jayway.jsonpath.InvalidPathException;
import com.jayway.jsonpath.Option;

2
json-path/src/main/java/com/jayway/jsonpath/internal/compiler/PredicateContextImpl.java → json-path/src/main/java/com/jayway/jsonpath/internal/token/PredicateContextImpl.java

@ -1,4 +1,4 @@
package com.jayway.jsonpath.internal.compiler;
package com.jayway.jsonpath.internal.token;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.Predicate;

2
json-path/src/main/java/com/jayway/jsonpath/internal/compiler/PredicatePathToken.java → json-path/src/main/java/com/jayway/jsonpath/internal/token/PredicatePathToken.java

@ -1,4 +1,4 @@
package com.jayway.jsonpath.internal.compiler;
package com.jayway.jsonpath.internal.token;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.InvalidPathException;

2
json-path/src/main/java/com/jayway/jsonpath/internal/compiler/PropertyPathToken.java → json-path/src/main/java/com/jayway/jsonpath/internal/token/PropertyPathToken.java

@ -1,4 +1,4 @@
package com.jayway.jsonpath.internal.compiler;
package com.jayway.jsonpath.internal.token;
import com.jayway.jsonpath.PathNotFoundException;
import com.jayway.jsonpath.internal.Utils;

2
json-path/src/main/java/com/jayway/jsonpath/internal/compiler/RootPathToken.java → json-path/src/main/java/com/jayway/jsonpath/internal/token/RootPathToken.java

@ -1,4 +1,4 @@
package com.jayway.jsonpath.internal.compiler;
package com.jayway.jsonpath.internal.token;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

2
json-path/src/main/java/com/jayway/jsonpath/internal/compiler/ScanPathToken.java → json-path/src/main/java/com/jayway/jsonpath/internal/token/ScanPathToken.java

@ -1,4 +1,4 @@
package com.jayway.jsonpath.internal.compiler;
package com.jayway.jsonpath.internal.token;
import com.jayway.jsonpath.spi.json.JsonProvider;

2
json-path/src/main/java/com/jayway/jsonpath/internal/compiler/WildcardPathToken.java → json-path/src/main/java/com/jayway/jsonpath/internal/token/WildcardPathToken.java

@ -1,4 +1,4 @@
package com.jayway.jsonpath.internal.compiler;
package com.jayway.jsonpath.internal.token;
import com.jayway.jsonpath.PathNotFoundException;

4
json-path/src/test/java/com/jayway/jsonpath/BaseTest.java

@ -1,6 +1,6 @@
package com.jayway.jsonpath;
import com.jayway.jsonpath.internal.compiler.PredicateContextImpl;
import com.jayway.jsonpath.internal.token.PredicateContextImpl;
import com.jayway.jsonpath.internal.spi.json.GsonJsonProvider;
import com.jayway.jsonpath.internal.spi.mapper.GsonMappingProvider;
@ -14,7 +14,7 @@ public class BaseTest {
}
@Override
public Set<Option> options() {
public Set<Option> setOptions() {
return EnumSet.noneOf(Option.class);
}

6
json-path/src/test/java/com/jayway/jsonpath/old/IssuesTest.java

@ -251,7 +251,7 @@ public class IssuesTest {
@Test
public void issue_22b() throws Exception {
String json = "{\"a\":[{\"b\":1,\"c\":2},{\"b\":5,\"c\":2}]}";
List<Object> res = JsonPath.using(Configuration.defaultConfiguration().options(Option.DEFAULT_PATH_LEAF_TO_NULL)).parse(json).read("a[?(@.b==5)].d");
List<Object> res = JsonPath.using(Configuration.defaultConfiguration().setOptions(Option.DEFAULT_PATH_LEAF_TO_NULL)).parse(json).read("a[?(@.b==5)].d");
Assertions.assertThat(res).hasSize(1).containsNull();
}
@ -383,7 +383,7 @@ public class IssuesTest {
Assertions.assertThat(read(json, "test")).isNull();
Assertions.assertThat(JsonPath.using(Configuration.defaultConfiguration().options(Option.SUPPRESS_EXCEPTIONS)).parse(json).read("nonExistingProperty")).isNull();
Assertions.assertThat(JsonPath.using(Configuration.defaultConfiguration().setOptions(Option.SUPPRESS_EXCEPTIONS)).parse(json).read("nonExistingProperty")).isNull();
try {
read(json, "nonExistingProperty");
@ -419,7 +419,7 @@ public class IssuesTest {
String json = "{\"a\": {}}";
Configuration configuration = Configuration.defaultConfiguration().options(Option.SUPPRESS_EXCEPTIONS);
Configuration configuration = Configuration.defaultConfiguration().setOptions(Option.SUPPRESS_EXCEPTIONS);
Assertions.assertThat(JsonPath.using(configuration).parse(json).read("a.x")).isNull();
try {

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

@ -82,7 +82,7 @@ public class JsonPathTest extends BaseTest {
@Test(expected = PathNotFoundException.class)
public void missing_prop() {
//Object read = JsonPath.using(Configuration.defaultConfiguration().options(Option.THROW_ON_MISSING_PROPERTY)).parse(DOCUMENT).read("$.store.book[*].fooBar");
//Object read = JsonPath.using(Configuration.defaultConfiguration().setOptions(Option.THROW_ON_MISSING_PROPERTY)).parse(DOCUMENT).read("$.store.book[*].fooBar");
//Object read = JsonPath.using(Configuration.defaultConfiguration()).parse(DOCUMENT).read("$.store.book[*].fooBar");
Object read2 = JsonPath.using(Configuration.defaultConfiguration()).parse(DOCUMENT).read("$.store.book[*].fooBar.not");

4
json-path/src/test/java/com/jayway/jsonpath/old/NullHandlingTest.java

@ -65,7 +65,7 @@ public class NullHandlingTest {
@Test
public void the_age_of_all_with_age_defined() {
//List<Integer> result = JsonPath.read(DOCUMENT, "$.children[*].age");
List<Integer> result = JsonPath.using(Configuration.defaultConfiguration().options(Option.SUPPRESS_EXCEPTIONS)).parse(DOCUMENT).read("$.children[*].age");
List<Integer> result = JsonPath.using(Configuration.defaultConfiguration().setOptions(Option.SUPPRESS_EXCEPTIONS)).parse(DOCUMENT).read("$.children[*].age");
Assertions.assertThat(result).containsSequence(0, null);
@ -81,7 +81,7 @@ public class NullHandlingTest {
public void path() {
String json = "{\"a\":[{\"b\":1,\"c\":2},{\"b\":5,\"c\":2}]}";
List<Object> result = JsonPath.using(Configuration.defaultConfiguration().options(Option.DEFAULT_PATH_LEAF_TO_NULL)).parse(json).read("a[?(@.b==5)].d");
List<Object> result = JsonPath.using(Configuration.defaultConfiguration().setOptions(Option.DEFAULT_PATH_LEAF_TO_NULL)).parse(json).read("a[?(@.b==5)].d");
System.out.println(result);

2
json-path/src/test/java/com/jayway/jsonpath/old/internal/PropertyPathTokenTest.java

@ -63,7 +63,7 @@ public class PropertyPathTokenTest {
@Test(expected = PathNotFoundException.class)
public void property_not_found_option_throw() {
//String result = JsonPath.using(Configuration.defaultConfiguration().options(Option.THROW_ON_MISSING_PROPERTY)).parse(SIMPLE_MAP).read("$.not-found");
//String result = JsonPath.using(Configuration.defaultConfiguration().setOptions(Option.THROW_ON_MISSING_PROPERTY)).parse(SIMPLE_MAP).read("$.not-found");
String result = JsonPath.using(Configuration.defaultConfiguration()).parse(SIMPLE_MAP).read("$.not-found");
assertThat(result).isNull();

Loading…
Cancel
Save