/**
* Copyright 2007 Charlie Hubbard
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package flexjson;
import java.util.Arrays;
/**
* This is an internal class for Flexjson. It's used to match on fields it encounters
* while walking the object graph. Every expression is expressed in dot notation like foo.bar.baz. Each term
* between the dots is a field name in that parent object. All expressions are relative to some parent object
* within the context in which they are used. Typically it is the object you're serializing. Expressions may
* also contain wildcards like *.class.
*/
public class PathExpression {
String[] expression;
boolean wildcard = false;
boolean included = true;
public PathExpression(String expr, boolean anInclude) {
expression = expr.split("\\.");
wildcard = expr.indexOf('*') >= 0;
included = anInclude;
}
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("[");
for (int i = 0; i < expression.length; i++) {
builder.append(expression[i]);
if (i < expression.length - 1) {
builder.append(",");
}
}
builder.append("]");
return builder.toString();
}
public boolean matches(Path path) {
int exprCurrentIndex = 0;
int pathCurrentIndex = 0;
while (pathCurrentIndex < path.length()) {
String current = path.getPath().get(pathCurrentIndex);
if (exprCurrentIndex < expression.length && expression[exprCurrentIndex].equals("*")) {
exprCurrentIndex++;
} else if (exprCurrentIndex < expression.length && expression[exprCurrentIndex].equals(current)) {
pathCurrentIndex++;
exprCurrentIndex++;
} else if (exprCurrentIndex - 1 >= 0 && expression[exprCurrentIndex - 1].equals("*")) {
pathCurrentIndex++;
} else {
return false;
}
}
if (exprCurrentIndex > 0 && expression[exprCurrentIndex - 1].equals("*")) {
return pathCurrentIndex >= path.length() && exprCurrentIndex >= expression.length;
} else {
return pathCurrentIndex >= path.length() && path.length() > 0;
}
}
public boolean isWildcard() {
return wildcard;
}
public boolean isIncluded() {
return included;
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PathExpression that = (PathExpression) o;
if (!Arrays.equals(expression, that.expression)) return false;
return true;
}
public int hashCode() {
return (expression != null ? Arrays.hashCode(expression) : 0);
}
}
|