From 8f12bbb6c4cececf894e333214bdaa540a12c24b Mon Sep 17 00:00:00 2001 From: rbygrave Date: Sat, 9 May 2015 01:08:53 +1200 Subject: [PATCH] No effective change - change newline char --- .../ebeaninternal/server/el/CharMatch.java | 118 ++-- .../ebeaninternal/server/el/ElComparator.java | 38 +- .../server/el/ElComparatorCompound.java | 96 +-- .../server/el/ElComparatorProperty.java | 106 +-- .../ebeaninternal/server/el/ElFilter.java | 504 +++++++------- .../server/el/ElMatchBuilder.java | 576 ++++++++-------- .../ebeaninternal/server/el/ElMatcher.java | 24 +- .../server/el/ElPropertyChain.java | 614 +++++++++--------- .../server/el/ElPropertyChainBuilder.java | 128 ++-- .../server/el/ElPropertyValue.java | 234 +++---- .../ebeaninternal/server/el/ElSetValue.java | 20 +- .../server/expression/AbstractExpression.java | 104 +-- .../expression/BetweenPropertyExpression.java | 136 ++-- .../server/expression/FilterExprPath.java | 86 +-- 14 files changed, 1392 insertions(+), 1392 deletions(-) diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/CharMatch.java b/src/main/java/com/avaje/ebeaninternal/server/el/CharMatch.java index 48848b5ee..0fb7a43da 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/CharMatch.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/CharMatch.java @@ -1,59 +1,59 @@ -package com.avaje.ebeaninternal.server.el; - -/** - * Case insensitive string matching. - *

- * Provides an alternative to using regular expressions. - *

- */ -public final class CharMatch { - - private final char[] upperChars; - - private final int maxLength; - - public CharMatch(String s) { - this.upperChars = s.toUpperCase().toCharArray(); - this.maxLength = upperChars.length; - } - - public boolean startsWith(String other) { - - if (other == null || other.length() < maxLength){ - return false; - } - - char ta[] = other.toCharArray(); - - int pos = -1; - while (++pos < maxLength) { - char c1 = upperChars[pos]; - char c2 = Character.toUpperCase(ta[pos]); - if (c1 != c2) { - return false; - } - } - return true; - } - - public boolean endsWith(String other) { - - if (other == null || other.length() < maxLength){ - return false; - } - - char ta[] = other.toCharArray(); - - int offset = ta.length - maxLength; - int pos = maxLength; - while (--pos >= 0) { - char c1 = upperChars[pos]; - char c2 = Character.toUpperCase(ta[offset+pos]); - if (c1 != c2) { - return false; - } - } - return true; - } - -} +package com.avaje.ebeaninternal.server.el; + +/** + * Case insensitive string matching. + *

+ * Provides an alternative to using regular expressions. + *

+ */ +public final class CharMatch { + + private final char[] upperChars; + + private final int maxLength; + + public CharMatch(String s) { + this.upperChars = s.toUpperCase().toCharArray(); + this.maxLength = upperChars.length; + } + + public boolean startsWith(String other) { + + if (other == null || other.length() < maxLength){ + return false; + } + + char ta[] = other.toCharArray(); + + int pos = -1; + while (++pos < maxLength) { + char c1 = upperChars[pos]; + char c2 = Character.toUpperCase(ta[pos]); + if (c1 != c2) { + return false; + } + } + return true; + } + + public boolean endsWith(String other) { + + if (other == null || other.length() < maxLength){ + return false; + } + + char ta[] = other.toCharArray(); + + int offset = ta.length - maxLength; + int pos = maxLength; + while (--pos >= 0) { + char c1 = upperChars[pos]; + char c2 = Character.toUpperCase(ta[offset+pos]); + if (c1 != c2) { + return false; + } + } + return true; + } + +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/ElComparator.java b/src/main/java/com/avaje/ebeaninternal/server/el/ElComparator.java index 13edc5d76..ead232da8 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/ElComparator.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/ElComparator.java @@ -1,20 +1,20 @@ -package com.avaje.ebeaninternal.server.el; - -import java.util.Comparator; - -/** - * Comparator for use with the expression objects. - */ -public interface ElComparator extends Comparator { - - /** - * Compare given 2 beans. - */ - public int compare(T o1, T o2); - - /** - * Compare with a fixed value to a given bean. - */ - public int compareValue(Object value, T o2); - +package com.avaje.ebeaninternal.server.el; + +import java.util.Comparator; + +/** + * Comparator for use with the expression objects. + */ +public interface ElComparator extends Comparator { + + /** + * Compare given 2 beans. + */ + public int compare(T o1, T o2); + + /** + * Compare with a fixed value to a given bean. + */ + public int compareValue(Object value, T o2); + } \ No newline at end of file diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/ElComparatorCompound.java b/src/main/java/com/avaje/ebeaninternal/server/el/ElComparatorCompound.java index eabe3fb43..3dbcc1524 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/ElComparatorCompound.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/ElComparatorCompound.java @@ -1,48 +1,48 @@ -package com.avaje.ebeaninternal.server.el; - -import java.util.Comparator; - -/** - * Comparator based on multiple ordered comparators. - *

- * eg. "name, orderDate desc, id" - *

- */ -public final class ElComparatorCompound implements Comparator, ElComparator { - - private final ElComparator[] array; - - public ElComparatorCompound(ElComparator[] array) { - this.array = array; - } - - public int compare(T o1, T o2) { - - for (int i = 0; i < array.length; i++) { - int ret = array[i].compare(o1, o2); - if (ret != 0){ - return ret; - } - } - - return 0; - } - - public int compareValue(Object value, T o2) { - - for (int i = 0; i < array.length; i++) { - int ret = array[i].compareValue(value, o2); - if (ret != 0){ - return ret; - } - } - - return 0; - } - - - - - - -} +package com.avaje.ebeaninternal.server.el; + +import java.util.Comparator; + +/** + * Comparator based on multiple ordered comparators. + *

+ * eg. "name, orderDate desc, id" + *

+ */ +public final class ElComparatorCompound implements Comparator, ElComparator { + + private final ElComparator[] array; + + public ElComparatorCompound(ElComparator[] array) { + this.array = array; + } + + public int compare(T o1, T o2) { + + for (int i = 0; i < array.length; i++) { + int ret = array[i].compare(o1, o2); + if (ret != 0){ + return ret; + } + } + + return 0; + } + + public int compareValue(Object value, T o2) { + + for (int i = 0; i < array.length; i++) { + int ret = array[i].compareValue(value, o2); + if (ret != 0){ + return ret; + } + } + + return 0; + } + + + + + + +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/ElComparatorProperty.java b/src/main/java/com/avaje/ebeaninternal/server/el/ElComparatorProperty.java index 59e65abe2..48edafffb 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/ElComparatorProperty.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/ElComparatorProperty.java @@ -1,53 +1,53 @@ -package com.avaje.ebeaninternal.server.el; - -import java.util.Comparator; - -import com.avaje.ebean.bean.EntityBean; - -/** - * Comparator based on a ElGetValue. - */ -public final class ElComparatorProperty implements Comparator, ElComparator { - - private final ElPropertyValue elGetValue; - - private final int nullOrder; - - private final int asc; - - public ElComparatorProperty(ElPropertyValue elGetValue, boolean ascending, boolean nullsHigh) { - this.elGetValue = elGetValue; - this.asc = ascending ? 1 : -1; - this.nullOrder = asc * (nullsHigh ? 1 : -1); - } - - public int compare(T o1, T o2) { - - Object val1 = elGetValue.elGetValue((EntityBean)o1); - Object val2 = elGetValue.elGetValue((EntityBean)o2); - - return compareValues(val1, val2); - } - - public int compareValue(Object value, T o2) { - - Object val2 = elGetValue.elGetValue((EntityBean)o2); - - return compareValues(value, val2); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - public int compareValues(Object val1, Object val2){ - - if (val1 == null){ - return val2 == null ? 0 : nullOrder; - } - if (val2 == null){ - return -1 * nullOrder; - } - Comparable c = (Comparable)val1; - return asc * c.compareTo(val2); - } - - -} +package com.avaje.ebeaninternal.server.el; + +import java.util.Comparator; + +import com.avaje.ebean.bean.EntityBean; + +/** + * Comparator based on a ElGetValue. + */ +public final class ElComparatorProperty implements Comparator, ElComparator { + + private final ElPropertyValue elGetValue; + + private final int nullOrder; + + private final int asc; + + public ElComparatorProperty(ElPropertyValue elGetValue, boolean ascending, boolean nullsHigh) { + this.elGetValue = elGetValue; + this.asc = ascending ? 1 : -1; + this.nullOrder = asc * (nullsHigh ? 1 : -1); + } + + public int compare(T o1, T o2) { + + Object val1 = elGetValue.elGetValue((EntityBean)o1); + Object val2 = elGetValue.elGetValue((EntityBean)o2); + + return compareValues(val1, val2); + } + + public int compareValue(Object value, T o2) { + + Object val2 = elGetValue.elGetValue((EntityBean)o2); + + return compareValues(value, val2); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + public int compareValues(Object val1, Object val2){ + + if (val1 == null){ + return val2 == null ? 0 : nullOrder; + } + if (val2 == null){ + return -1 * nullOrder; + } + Comparable c = (Comparable)val1; + return asc * c.compareTo(val2); + } + + +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/ElFilter.java b/src/main/java/com/avaje/ebeaninternal/server/el/ElFilter.java index 1372e7d4c..6769a9854 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/ElFilter.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/ElFilter.java @@ -1,252 +1,252 @@ -package com.avaje.ebeaninternal.server.el; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.regex.Pattern; - -import com.avaje.ebean.Filter; -import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; - -/** - * Default implementation of the Filter interface. - */ -public final class ElFilter implements Filter { - - private final BeanDescriptor beanDescriptor; - - private ArrayList> matches = new ArrayList>(); - - private int maxRows; - - private String sortByClause; - - public ElFilter(BeanDescriptor beanDescriptor) { - this.beanDescriptor = beanDescriptor; - } - - private Object convertValue(String propertyName, Object value) { - // convert type of value to match expected type - ElPropertyValue elGetValue = beanDescriptor.getElGetValue(propertyName); - return elGetValue.elConvertType(value); - } - - private ElComparator getElComparator(String propertyName) { - - return beanDescriptor.getElComparator(propertyName); - } - - private ElPropertyValue getElGetValue(String propertyName) { - - return beanDescriptor.getElGetValue(propertyName); - } - - public Filter sort(String sortByClause) { - this.sortByClause = sortByClause; - return this; - } - - protected boolean isMatch(T bean) { - for (int i = 0; i < matches.size(); i++) { - ElMatcher matcher = matches.get(i); - if (!matcher.isMatch(bean)){ - return false; - } - } - return true; - } - - - public Filter in(String propertyName, Set matchingValues) { - - ElPropertyValue elGetValue = getElGetValue(propertyName); - - matches.add(new ElMatchBuilder.InSet(matchingValues, elGetValue)); - return this; - } - - public Filter eq(String propertyName, Object value) { - - value = convertValue(propertyName, value); - ElComparator comparator = getElComparator(propertyName); - - matches.add(new ElMatchBuilder.Eq(value, comparator)); - return this; - } - - - public Filter ne(String propertyName, Object value) { - - value = convertValue(propertyName, value); - ElComparator comparator = getElComparator(propertyName); - - matches.add(new ElMatchBuilder.Ne(value, comparator)); - return this; - } - - public Filter between(String propertyName, Object min, Object max) { - - ElPropertyValue elGetValue = getElGetValue(propertyName); - min = elGetValue.elConvertType(min); - max = elGetValue.elConvertType(max); - - ElComparator elComparator = getElComparator(propertyName); - - matches.add(new ElMatchBuilder.Between(min, max, elComparator)); - return this; - } - - - public Filter gt(String propertyName, Object value) { - - value = convertValue(propertyName, value); - ElComparator comparator = getElComparator(propertyName); - - matches.add(new ElMatchBuilder.Gt(value, comparator)); - return this; - } - - public Filter ge(String propertyName, Object value) { - - value = convertValue(propertyName, value); - ElComparator comparator = getElComparator(propertyName); - - matches.add(new ElMatchBuilder.Ge(value, comparator)); - return this; - } - - public Filter ieq(String propertyName, String value) { - - ElPropertyValue elGetValue = getElGetValue(propertyName); - - matches.add(new ElMatchBuilder.Ieq(elGetValue, value)); - return this; - } - - - public Filter isNotNull(String propertyName) { - - ElPropertyValue elGetValue = getElGetValue(propertyName); - - matches.add(new ElMatchBuilder.IsNotNull(elGetValue)); - return this; - } - - - public Filter isNull(String propertyName) { - - ElPropertyValue elGetValue = getElGetValue(propertyName); - - matches.add(new ElMatchBuilder.IsNull(elGetValue)); - return this; - } - - - public Filter le(String propertyName, Object value) { - - value = convertValue(propertyName, value); - ElComparator comparator = getElComparator(propertyName); - - matches.add(new ElMatchBuilder.Le(value, comparator)); - return this; - } - - - public Filter lt(String propertyName, Object value) { - - value = convertValue(propertyName, value); - ElComparator comparator = getElComparator(propertyName); - - matches.add(new ElMatchBuilder.Lt(value, comparator)); - return this; - } - - - public Filter regex(String propertyName, String regEx) { - return regex(propertyName, regEx, 0); - } - - public Filter regex(String propertyName, String regEx, int options) { - - ElPropertyValue elGetValue = getElGetValue(propertyName); - - matches.add(new ElMatchBuilder.RegularExpr(elGetValue, regEx, options)); - return this; - } - - public Filter contains(String propertyName, String value) { - - String quote = ".*"+Pattern.quote(value)+".*"; - - ElPropertyValue elGetValue = getElGetValue(propertyName); - matches.add(new ElMatchBuilder.RegularExpr(elGetValue, quote, 0)); - return this; - } - - public Filter icontains(String propertyName, String value) { - - String quote = ".*"+Pattern.quote(value)+".*"; - - ElPropertyValue elGetValue = getElGetValue(propertyName); - matches.add(new ElMatchBuilder.RegularExpr(elGetValue, quote, Pattern.CASE_INSENSITIVE)); - return this; - } - - - public Filter endsWith(String propertyName, String value) { - - ElPropertyValue elGetValue = getElGetValue(propertyName); - matches.add(new ElMatchBuilder.EndsWith(elGetValue, value)); - return this; - } - - public Filter startsWith(String propertyName, String value) { - - ElPropertyValue elGetValue = getElGetValue(propertyName); - matches.add(new ElMatchBuilder.StartsWith(elGetValue, value)); - return this; - } - - public Filter iendsWith(String propertyName, String value) { - - ElPropertyValue elGetValue = getElGetValue(propertyName); - matches.add(new ElMatchBuilder.IEndsWith(elGetValue, value)); - return this; - } - - public Filter istartsWith(String propertyName, String value) { - - ElPropertyValue elGetValue = getElGetValue(propertyName); - matches.add(new ElMatchBuilder.IStartsWith(elGetValue, value)); - return this; - } - - public Filter maxRows(int maxRows) { - this.maxRows = maxRows; - return this; - } - - public List filter(List list) { - - if (sortByClause != null){ - // create shallow copy and sort - list = new ArrayList(list); - beanDescriptor.sort(list, sortByClause); - } - - ArrayList filterList = new ArrayList(); - - for (int i = 0; i < list.size(); i++) { - T t = list.get(i); - if (isMatch(t)) { - filterList.add(t); - if (maxRows > 0 && filterList.size() >= maxRows){ - break; - } - } - } - - return filterList; - } - -} +package com.avaje.ebeaninternal.server.el; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; + +import com.avaje.ebean.Filter; +import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; + +/** + * Default implementation of the Filter interface. + */ +public final class ElFilter implements Filter { + + private final BeanDescriptor beanDescriptor; + + private ArrayList> matches = new ArrayList>(); + + private int maxRows; + + private String sortByClause; + + public ElFilter(BeanDescriptor beanDescriptor) { + this.beanDescriptor = beanDescriptor; + } + + private Object convertValue(String propertyName, Object value) { + // convert type of value to match expected type + ElPropertyValue elGetValue = beanDescriptor.getElGetValue(propertyName); + return elGetValue.elConvertType(value); + } + + private ElComparator getElComparator(String propertyName) { + + return beanDescriptor.getElComparator(propertyName); + } + + private ElPropertyValue getElGetValue(String propertyName) { + + return beanDescriptor.getElGetValue(propertyName); + } + + public Filter sort(String sortByClause) { + this.sortByClause = sortByClause; + return this; + } + + protected boolean isMatch(T bean) { + for (int i = 0; i < matches.size(); i++) { + ElMatcher matcher = matches.get(i); + if (!matcher.isMatch(bean)){ + return false; + } + } + return true; + } + + + public Filter in(String propertyName, Set matchingValues) { + + ElPropertyValue elGetValue = getElGetValue(propertyName); + + matches.add(new ElMatchBuilder.InSet(matchingValues, elGetValue)); + return this; + } + + public Filter eq(String propertyName, Object value) { + + value = convertValue(propertyName, value); + ElComparator comparator = getElComparator(propertyName); + + matches.add(new ElMatchBuilder.Eq(value, comparator)); + return this; + } + + + public Filter ne(String propertyName, Object value) { + + value = convertValue(propertyName, value); + ElComparator comparator = getElComparator(propertyName); + + matches.add(new ElMatchBuilder.Ne(value, comparator)); + return this; + } + + public Filter between(String propertyName, Object min, Object max) { + + ElPropertyValue elGetValue = getElGetValue(propertyName); + min = elGetValue.elConvertType(min); + max = elGetValue.elConvertType(max); + + ElComparator elComparator = getElComparator(propertyName); + + matches.add(new ElMatchBuilder.Between(min, max, elComparator)); + return this; + } + + + public Filter gt(String propertyName, Object value) { + + value = convertValue(propertyName, value); + ElComparator comparator = getElComparator(propertyName); + + matches.add(new ElMatchBuilder.Gt(value, comparator)); + return this; + } + + public Filter ge(String propertyName, Object value) { + + value = convertValue(propertyName, value); + ElComparator comparator = getElComparator(propertyName); + + matches.add(new ElMatchBuilder.Ge(value, comparator)); + return this; + } + + public Filter ieq(String propertyName, String value) { + + ElPropertyValue elGetValue = getElGetValue(propertyName); + + matches.add(new ElMatchBuilder.Ieq(elGetValue, value)); + return this; + } + + + public Filter isNotNull(String propertyName) { + + ElPropertyValue elGetValue = getElGetValue(propertyName); + + matches.add(new ElMatchBuilder.IsNotNull(elGetValue)); + return this; + } + + + public Filter isNull(String propertyName) { + + ElPropertyValue elGetValue = getElGetValue(propertyName); + + matches.add(new ElMatchBuilder.IsNull(elGetValue)); + return this; + } + + + public Filter le(String propertyName, Object value) { + + value = convertValue(propertyName, value); + ElComparator comparator = getElComparator(propertyName); + + matches.add(new ElMatchBuilder.Le(value, comparator)); + return this; + } + + + public Filter lt(String propertyName, Object value) { + + value = convertValue(propertyName, value); + ElComparator comparator = getElComparator(propertyName); + + matches.add(new ElMatchBuilder.Lt(value, comparator)); + return this; + } + + + public Filter regex(String propertyName, String regEx) { + return regex(propertyName, regEx, 0); + } + + public Filter regex(String propertyName, String regEx, int options) { + + ElPropertyValue elGetValue = getElGetValue(propertyName); + + matches.add(new ElMatchBuilder.RegularExpr(elGetValue, regEx, options)); + return this; + } + + public Filter contains(String propertyName, String value) { + + String quote = ".*"+Pattern.quote(value)+".*"; + + ElPropertyValue elGetValue = getElGetValue(propertyName); + matches.add(new ElMatchBuilder.RegularExpr(elGetValue, quote, 0)); + return this; + } + + public Filter icontains(String propertyName, String value) { + + String quote = ".*"+Pattern.quote(value)+".*"; + + ElPropertyValue elGetValue = getElGetValue(propertyName); + matches.add(new ElMatchBuilder.RegularExpr(elGetValue, quote, Pattern.CASE_INSENSITIVE)); + return this; + } + + + public Filter endsWith(String propertyName, String value) { + + ElPropertyValue elGetValue = getElGetValue(propertyName); + matches.add(new ElMatchBuilder.EndsWith(elGetValue, value)); + return this; + } + + public Filter startsWith(String propertyName, String value) { + + ElPropertyValue elGetValue = getElGetValue(propertyName); + matches.add(new ElMatchBuilder.StartsWith(elGetValue, value)); + return this; + } + + public Filter iendsWith(String propertyName, String value) { + + ElPropertyValue elGetValue = getElGetValue(propertyName); + matches.add(new ElMatchBuilder.IEndsWith(elGetValue, value)); + return this; + } + + public Filter istartsWith(String propertyName, String value) { + + ElPropertyValue elGetValue = getElGetValue(propertyName); + matches.add(new ElMatchBuilder.IStartsWith(elGetValue, value)); + return this; + } + + public Filter maxRows(int maxRows) { + this.maxRows = maxRows; + return this; + } + + public List filter(List list) { + + if (sortByClause != null){ + // create shallow copy and sort + list = new ArrayList(list); + beanDescriptor.sort(list, sortByClause); + } + + ArrayList filterList = new ArrayList(); + + for (int i = 0; i < list.size(); i++) { + T t = list.get(i); + if (isMatch(t)) { + filterList.add(t); + if (maxRows > 0 && filterList.size() >= maxRows){ + break; + } + } + } + + return filterList; + } + +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/ElMatchBuilder.java b/src/main/java/com/avaje/ebeaninternal/server/el/ElMatchBuilder.java index ab97f3362..277b5153c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/ElMatchBuilder.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/ElMatchBuilder.java @@ -1,288 +1,288 @@ -package com.avaje.ebeaninternal.server.el; - -import java.util.HashSet; -import java.util.Set; -import java.util.regex.Pattern; - -import com.avaje.ebean.bean.EntityBean; - - -/** - * Contains the various ElMatcher implementations. - */ -class ElMatchBuilder { - - /** - * Case insensitive equals. - */ - static class RegularExpr implements ElMatcher { - - final ElPropertyValue elGetValue; - final String value; - final Pattern pattern; - - RegularExpr(ElPropertyValue elGetValue, String value, int options){ - this.elGetValue = elGetValue; - this.value = value; - this.pattern = Pattern.compile(value, options); - } - - public boolean isMatch(T bean) { - String v = (String)elGetValue.elGetValue((EntityBean)bean); - return pattern.matcher(v).matches(); - } - } - - /** - * Case insensitive equals. - */ - static abstract class BaseString implements ElMatcher { - - final ElPropertyValue elGetValue; - final String value; - - public BaseString(ElPropertyValue elGetValue, String value){ - this.elGetValue = elGetValue; - this.value = value; - } - - public abstract boolean isMatch(T bean); - } - - static class Ieq extends BaseString { - Ieq(ElPropertyValue elGetValue, String value) { - super(elGetValue, value); - } - - public boolean isMatch(T bean) { - String v = (String)elGetValue.elGetValue((EntityBean)bean); - return value.equalsIgnoreCase(v); - } - } - - /** - * Case insensitive starts with matcher. - */ - static class IStartsWith implements ElMatcher { - - final ElPropertyValue elGetValue; - final CharMatch charMatch; - - IStartsWith(ElPropertyValue elGetValue, String value) { - this.elGetValue = elGetValue; - this.charMatch = new CharMatch(value); - } - - public boolean isMatch(T bean) { - - String v = (String)elGetValue.elGetValue((EntityBean)bean); - return charMatch.startsWith(v); - } - } - - /** - * Case insensitive ends with matcher. - */ - static class IEndsWith implements ElMatcher { - - final ElPropertyValue elGetValue; - final CharMatch charMatch; - - IEndsWith(ElPropertyValue elGetValue, String value) { - this.elGetValue = elGetValue; - this.charMatch = new CharMatch(value); - } - - public boolean isMatch(T bean) { - - String v = (String)elGetValue.elGetValue((EntityBean)bean); - return charMatch.endsWith(v); - } - } - - static class StartsWith extends BaseString { - StartsWith(ElPropertyValue elGetValue, String value) { - super(elGetValue, value); - } - - public boolean isMatch(T bean) { - String v = (String)elGetValue.elGetValue((EntityBean)bean); - return value.startsWith(v); - } - } - - static class EndsWith extends BaseString { - EndsWith(ElPropertyValue elGetValue, String value) { - super(elGetValue, value); - } - - public boolean isMatch(T bean) { - String v = (String)elGetValue.elGetValue((EntityBean)bean); - return value.endsWith(v); - } - } - - static class IsNull implements ElMatcher { - - final ElPropertyValue elGetValue; - - public IsNull(ElPropertyValue elGetValue){ - this.elGetValue = elGetValue; - } - - public boolean isMatch(T bean) { - return (null == elGetValue.elGetValue((EntityBean)bean)); - } - } - - static class IsNotNull implements ElMatcher { - - final ElPropertyValue elGetValue; - - public IsNotNull(ElPropertyValue elGetValue){ - this.elGetValue = elGetValue; - } - - public boolean isMatch(T bean) { - return (null != elGetValue.elGetValue((EntityBean)bean)); - } - } - - static abstract class Base implements ElMatcher { - - final Object filterValue; - - final ElComparator comparator; - - public Base(Object filterValue, ElComparator comparator){ - this.filterValue = filterValue; - this.comparator = comparator; - } - - public abstract boolean isMatch(T value); - } - - static class InSet implements ElMatcher { - - final Set set; - final ElPropertyValue elGetValue; - - @SuppressWarnings({ "unchecked", "rawtypes" }) - public InSet(Set set, ElPropertyValue elGetValue){ - this.set = new HashSet(set); - this.elGetValue = elGetValue; - } - - public boolean isMatch(T bean) { - - Object value = elGetValue.elGetValue((EntityBean)bean); - if (value == null){ - return false; - } - - return set.contains(value); - } - - } - /** - * Equal To. - */ - static class Eq extends Base { - - public Eq(Object filterValue, ElComparator comparator){ - super(filterValue, comparator); - } - - public boolean isMatch(T value) { - return comparator.compareValue(filterValue, value) == 0; - } - } - - /** - * Not Equal To. - */ - static class Ne extends Base { - - public Ne(Object filterValue, ElComparator comparator){ - super(filterValue, comparator); - } - - public boolean isMatch(T value) { - return comparator.compareValue(filterValue, value) != 0; - } - } - - /** - * Between. - */ - static class Between implements ElMatcher { - - final Object min; - final Object max; - final ElComparator comparator; - - Between(Object min, Object max, ElComparator comparator){ - this.min = min; - this.max = max; - this.comparator = comparator; - } - - public boolean isMatch(T value) { - - return (comparator.compareValue(min, value) <= 0 - && comparator.compareValue(max, value) >= 0); - } - } - - /** - * Greater Than. - */ - static class Gt extends Base { - Gt(Object filterValue, ElComparator comparator){ - super(filterValue, comparator); - } - - public boolean isMatch(T value) { - return comparator.compareValue(filterValue, value) == -1; - } - } - - /** - * Greater Than or Equal To. - */ - static class Ge extends Base { - Ge(Object filterValue, ElComparator comparator){ - super(filterValue, comparator); - } - - public boolean isMatch(T value) { - return comparator.compareValue(filterValue, value) >= 0; - } - } - - /** - * Less Than or Equal To. - */ - static class Le extends Base { - Le(Object filterValue, ElComparator comparator){ - super(filterValue, comparator); - } - - public boolean isMatch(T value) { - return comparator.compareValue(filterValue, value) <= 0; - } - } - - /** - * Less Than. - */ - static class Lt extends Base { - Lt(Object filterValue, ElComparator comparator){ - super(filterValue, comparator); - } - - public boolean isMatch(T value) { - return comparator.compareValue(filterValue, value) == 1; - } - } -} +package com.avaje.ebeaninternal.server.el; + +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; + +import com.avaje.ebean.bean.EntityBean; + + +/** + * Contains the various ElMatcher implementations. + */ +class ElMatchBuilder { + + /** + * Case insensitive equals. + */ + static class RegularExpr implements ElMatcher { + + final ElPropertyValue elGetValue; + final String value; + final Pattern pattern; + + RegularExpr(ElPropertyValue elGetValue, String value, int options){ + this.elGetValue = elGetValue; + this.value = value; + this.pattern = Pattern.compile(value, options); + } + + public boolean isMatch(T bean) { + String v = (String)elGetValue.elGetValue((EntityBean)bean); + return pattern.matcher(v).matches(); + } + } + + /** + * Case insensitive equals. + */ + static abstract class BaseString implements ElMatcher { + + final ElPropertyValue elGetValue; + final String value; + + public BaseString(ElPropertyValue elGetValue, String value){ + this.elGetValue = elGetValue; + this.value = value; + } + + public abstract boolean isMatch(T bean); + } + + static class Ieq extends BaseString { + Ieq(ElPropertyValue elGetValue, String value) { + super(elGetValue, value); + } + + public boolean isMatch(T bean) { + String v = (String)elGetValue.elGetValue((EntityBean)bean); + return value.equalsIgnoreCase(v); + } + } + + /** + * Case insensitive starts with matcher. + */ + static class IStartsWith implements ElMatcher { + + final ElPropertyValue elGetValue; + final CharMatch charMatch; + + IStartsWith(ElPropertyValue elGetValue, String value) { + this.elGetValue = elGetValue; + this.charMatch = new CharMatch(value); + } + + public boolean isMatch(T bean) { + + String v = (String)elGetValue.elGetValue((EntityBean)bean); + return charMatch.startsWith(v); + } + } + + /** + * Case insensitive ends with matcher. + */ + static class IEndsWith implements ElMatcher { + + final ElPropertyValue elGetValue; + final CharMatch charMatch; + + IEndsWith(ElPropertyValue elGetValue, String value) { + this.elGetValue = elGetValue; + this.charMatch = new CharMatch(value); + } + + public boolean isMatch(T bean) { + + String v = (String)elGetValue.elGetValue((EntityBean)bean); + return charMatch.endsWith(v); + } + } + + static class StartsWith extends BaseString { + StartsWith(ElPropertyValue elGetValue, String value) { + super(elGetValue, value); + } + + public boolean isMatch(T bean) { + String v = (String)elGetValue.elGetValue((EntityBean)bean); + return value.startsWith(v); + } + } + + static class EndsWith extends BaseString { + EndsWith(ElPropertyValue elGetValue, String value) { + super(elGetValue, value); + } + + public boolean isMatch(T bean) { + String v = (String)elGetValue.elGetValue((EntityBean)bean); + return value.endsWith(v); + } + } + + static class IsNull implements ElMatcher { + + final ElPropertyValue elGetValue; + + public IsNull(ElPropertyValue elGetValue){ + this.elGetValue = elGetValue; + } + + public boolean isMatch(T bean) { + return (null == elGetValue.elGetValue((EntityBean)bean)); + } + } + + static class IsNotNull implements ElMatcher { + + final ElPropertyValue elGetValue; + + public IsNotNull(ElPropertyValue elGetValue){ + this.elGetValue = elGetValue; + } + + public boolean isMatch(T bean) { + return (null != elGetValue.elGetValue((EntityBean)bean)); + } + } + + static abstract class Base implements ElMatcher { + + final Object filterValue; + + final ElComparator comparator; + + public Base(Object filterValue, ElComparator comparator){ + this.filterValue = filterValue; + this.comparator = comparator; + } + + public abstract boolean isMatch(T value); + } + + static class InSet implements ElMatcher { + + final Set set; + final ElPropertyValue elGetValue; + + @SuppressWarnings({ "unchecked", "rawtypes" }) + public InSet(Set set, ElPropertyValue elGetValue){ + this.set = new HashSet(set); + this.elGetValue = elGetValue; + } + + public boolean isMatch(T bean) { + + Object value = elGetValue.elGetValue((EntityBean)bean); + if (value == null){ + return false; + } + + return set.contains(value); + } + + } + /** + * Equal To. + */ + static class Eq extends Base { + + public Eq(Object filterValue, ElComparator comparator){ + super(filterValue, comparator); + } + + public boolean isMatch(T value) { + return comparator.compareValue(filterValue, value) == 0; + } + } + + /** + * Not Equal To. + */ + static class Ne extends Base { + + public Ne(Object filterValue, ElComparator comparator){ + super(filterValue, comparator); + } + + public boolean isMatch(T value) { + return comparator.compareValue(filterValue, value) != 0; + } + } + + /** + * Between. + */ + static class Between implements ElMatcher { + + final Object min; + final Object max; + final ElComparator comparator; + + Between(Object min, Object max, ElComparator comparator){ + this.min = min; + this.max = max; + this.comparator = comparator; + } + + public boolean isMatch(T value) { + + return (comparator.compareValue(min, value) <= 0 + && comparator.compareValue(max, value) >= 0); + } + } + + /** + * Greater Than. + */ + static class Gt extends Base { + Gt(Object filterValue, ElComparator comparator){ + super(filterValue, comparator); + } + + public boolean isMatch(T value) { + return comparator.compareValue(filterValue, value) == -1; + } + } + + /** + * Greater Than or Equal To. + */ + static class Ge extends Base { + Ge(Object filterValue, ElComparator comparator){ + super(filterValue, comparator); + } + + public boolean isMatch(T value) { + return comparator.compareValue(filterValue, value) >= 0; + } + } + + /** + * Less Than or Equal To. + */ + static class Le extends Base { + Le(Object filterValue, ElComparator comparator){ + super(filterValue, comparator); + } + + public boolean isMatch(T value) { + return comparator.compareValue(filterValue, value) <= 0; + } + } + + /** + * Less Than. + */ + static class Lt extends Base { + Lt(Object filterValue, ElComparator comparator){ + super(filterValue, comparator); + } + + public boolean isMatch(T value) { + return comparator.compareValue(filterValue, value) == 1; + } + } +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/ElMatcher.java b/src/main/java/com/avaje/ebeaninternal/server/el/ElMatcher.java index cac78e208..06858c61c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/ElMatcher.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/ElMatcher.java @@ -1,12 +1,12 @@ -package com.avaje.ebeaninternal.server.el; - -/** - * Interface for defining matches for filter expressions. - */ -public interface ElMatcher { - - /** - * Return true if the bean matches the expression. - */ - public boolean isMatch(T bean); -} +package com.avaje.ebeaninternal.server.el; + +/** + * Interface for defining matches for filter expressions. + */ +public interface ElMatcher { + + /** + * Return true if the bean matches the expression. + */ + public boolean isMatch(T bean); +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyChain.java b/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyChain.java index 1c5526389..57849026d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyChain.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyChain.java @@ -1,307 +1,307 @@ -package com.avaje.ebeaninternal.server.el; - -import com.avaje.ebean.bean.EntityBean; -import com.avaje.ebean.text.StringFormatter; -import com.avaje.ebean.text.StringParser; -import com.avaje.ebeaninternal.server.deploy.BeanProperty; -import com.avaje.ebeaninternal.server.lib.util.StringHelper; -import com.avaje.ebeaninternal.server.query.SplitName; -import com.avaje.ebeaninternal.server.type.ScalarType; - -import java.util.Arrays; - - -/** - * A ElGetValue based on a chain of properties. - *

- * Used to get the value for an compound expression like customer.name or - * customer.shippingAddress.city etc. - *

- *

- * Note that if any element in the chain returns null, then null is returned and - * no further processing of the chain occurs. - *

- */ -public class ElPropertyChain implements ElPropertyValue { - - private final String prefix; - - private final String placeHolder; - private final String placeHolderEncrypted; - - private final String name; - - private final String expression; - - private final boolean containsMany; - - private final ElPropertyValue[] chain; - - private final boolean assocId; - private final int last; - private final BeanProperty lastBeanProperty; - private final ScalarType scalarType; - - private final ElPropertyValue lastElPropertyValue; - - public ElPropertyChain(boolean containsMany, boolean embedded, String expression, ElPropertyValue[] chain) { - - this.containsMany = containsMany; - this.chain = chain; - this.expression = expression; - int dotPos = expression.lastIndexOf('.'); - if (dotPos > -1){ - this.name = expression.substring(dotPos+1); - if (embedded){ - int embPos = expression.lastIndexOf('.',dotPos-1); - this.prefix = embPos == -1 ? null : expression.substring(0, embPos); - - } else { - this.prefix = expression.substring(0, dotPos); - } - } else { - this.prefix = null; - this.name = expression; - } - - this.assocId = chain[chain.length-1].isAssocId(); - - this.last = chain.length-1; - this.lastBeanProperty = chain[chain.length-1].getBeanProperty(); - if (lastBeanProperty != null){ - this.scalarType = lastBeanProperty.getScalarType(); - } else { - // case for nested compound type (non-scalar) - this.scalarType = null; - } - this.lastElPropertyValue = chain[chain.length-1]; - this.placeHolder = getElPlaceHolder(prefix, lastElPropertyValue, false); - this.placeHolderEncrypted = getElPlaceHolder(prefix, lastElPropertyValue, true); - } - - public String toString() { - return "expr:"+expression+" chain:"+ Arrays.toString(chain); - } - - private String getElPlaceHolder(String prefix, ElPropertyValue lastElPropertyValue, boolean encrypted) { - if (prefix == null){ - return lastElPropertyValue.getElPlaceholder(encrypted); - } - - String el = lastElPropertyValue.getElPlaceholder(encrypted); - - if (!el.contains("${}")){ - // typically a secondary table property - return StringHelper.replaceString(el, "${", "${"+prefix+"."); - } else { - return StringHelper.replaceString(el, ROOT_ELPREFIX, "${"+prefix+"}"); - } - } - - /** - * Full ElGetValue support. - */ - public boolean isDeployOnly() { - return false; - } - - /** - * Return true if there is a many property from sinceProperty to - * the end of this chain. - */ - public boolean containsManySince(String sinceProperty) { - if (sinceProperty == null){ - return containsMany; - } - if (!expression.startsWith(sinceProperty)){ - return containsMany; - } - - int i = 1 + SplitName.count('.', sinceProperty); - - for (; i < chain.length; i++) { - if (chain[i].getBeanProperty().containsMany()) { - return true; - } - } - - return false; - } - - @Override - public boolean containsFormulaWithJoin() { - // Not cascading the check at this stage - return false; - } - - public boolean containsMany() { - return containsMany; - } - - public String getElPrefix() { - return prefix; - } - - public String getName() { - return name; - } - - public String getElName() { - return expression; - } - - public String getElPlaceholder(boolean encrypted) { - return encrypted ? placeHolderEncrypted : placeHolder; - } - - public boolean isDbEncrypted() { - return lastElPropertyValue.isDbEncrypted(); - } - - public boolean isLocalEncrypted() { - return lastElPropertyValue.isLocalEncrypted(); - } - - public Object[] getAssocOneIdValues(EntityBean bean) { - // Don't navigate the object graph as bean - // is assumed to be the appropriate type - return lastElPropertyValue.getAssocOneIdValues(bean); - } - - public String getAssocOneIdExpr(String prefix, String operator) { - return lastElPropertyValue.getAssocOneIdExpr(expression, operator); - } - - public String getAssocIdInExpr(String prefix) { - return lastElPropertyValue.getAssocIdInExpr(prefix); - } - - public String getAssocIdInValueExpr(int size) { - return lastElPropertyValue.getAssocIdInValueExpr(size); - } - - public int getDeployOrder() { - int i = lastBeanProperty.getDeployOrder(); - int max = chain.length-1; - for (int j = 0; j < max; j++) { - int xtra = ((max-j)*1000) * chain[j].getDeployOrder(); - i += xtra; - } - return i; - } - - public boolean isAssocId() { - return assocId; - } - - public boolean isAssocProperty() { - for (int i = 0; i < chain.length; i++) { - if (chain[i].isAssocProperty()){ - return true; - } - } - return false; - } - - public String getDbColumn() { - return lastElPropertyValue.getDbColumn(); - } - - public BeanProperty getBeanProperty() { - return lastBeanProperty; - } - - - public boolean isDateTimeCapable() { - return scalarType != null && scalarType.isDateTimeCapable(); - } - - public int getJdbcType() { - return scalarType == null ? 0 : scalarType.getJdbcType(); - } - - public Object parseDateTime(long systemTimeMillis) { - return scalarType.convertFromMillis(systemTimeMillis); - } - - public StringParser getStringParser() { - return scalarType; - } - - public StringFormatter getStringFormatter() { - return scalarType; - } - - public Object elConvertType(Object value){ - // just convert using the last one in the chain - return lastElPropertyValue.elConvertType(value); - } - - public Object elGetValue(EntityBean bean) { - - for (int i = 0; i < chain.length; i++) { - bean = (EntityBean)chain[i].elGetValue(bean); - if (bean == null) { - return null; - } - } - - return bean; - } - - public Object elGetReference(EntityBean bean) { - - EntityBean prevBean = bean; - for (int i = 0; i < last; i++) { - // always return non null prevBean - prevBean = (EntityBean)chain[i].elGetReference(prevBean); - } - // try the last step in the chain - return chain[last].elGetValue(prevBean); - } - - - public void elSetLoaded(EntityBean bean) { - - for (int i = 0; i < last; i++) { - bean = (EntityBean)chain[i].elGetValue(bean); - if (bean == null){ - break; - } - } - if (bean != null){ - ((EntityBean)bean)._ebean_getIntercept().setLoaded(); - } - } - - public void elSetValue(EntityBean bean, Object value, boolean populate) { - - EntityBean prevBean = bean; - if (populate){ - for (int i = 0; i < last; i++) { - // always return non null prevBean - prevBean = (EntityBean)chain[i].elGetReference(prevBean); - } - } else { - for (int i = 0; i < last; i++) { - // always return non null prevBean - prevBean = (EntityBean)chain[i].elGetValue(prevBean); - if (prevBean == null){ - break; - } - } - } - if (prevBean != null){ - if (lastBeanProperty != null){ - // last chain element maps to a real scalar property - lastBeanProperty.setValueIntercept(prevBean, value); - - } else { - // a non-scalar property of a Compound value object - lastElPropertyValue.elSetValue(prevBean, value, populate); - } - } - } - - -} +package com.avaje.ebeaninternal.server.el; + +import com.avaje.ebean.bean.EntityBean; +import com.avaje.ebean.text.StringFormatter; +import com.avaje.ebean.text.StringParser; +import com.avaje.ebeaninternal.server.deploy.BeanProperty; +import com.avaje.ebeaninternal.server.lib.util.StringHelper; +import com.avaje.ebeaninternal.server.query.SplitName; +import com.avaje.ebeaninternal.server.type.ScalarType; + +import java.util.Arrays; + + +/** + * A ElGetValue based on a chain of properties. + *

+ * Used to get the value for an compound expression like customer.name or + * customer.shippingAddress.city etc. + *

+ *

+ * Note that if any element in the chain returns null, then null is returned and + * no further processing of the chain occurs. + *

+ */ +public class ElPropertyChain implements ElPropertyValue { + + private final String prefix; + + private final String placeHolder; + private final String placeHolderEncrypted; + + private final String name; + + private final String expression; + + private final boolean containsMany; + + private final ElPropertyValue[] chain; + + private final boolean assocId; + private final int last; + private final BeanProperty lastBeanProperty; + private final ScalarType scalarType; + + private final ElPropertyValue lastElPropertyValue; + + public ElPropertyChain(boolean containsMany, boolean embedded, String expression, ElPropertyValue[] chain) { + + this.containsMany = containsMany; + this.chain = chain; + this.expression = expression; + int dotPos = expression.lastIndexOf('.'); + if (dotPos > -1){ + this.name = expression.substring(dotPos+1); + if (embedded){ + int embPos = expression.lastIndexOf('.',dotPos-1); + this.prefix = embPos == -1 ? null : expression.substring(0, embPos); + + } else { + this.prefix = expression.substring(0, dotPos); + } + } else { + this.prefix = null; + this.name = expression; + } + + this.assocId = chain[chain.length-1].isAssocId(); + + this.last = chain.length-1; + this.lastBeanProperty = chain[chain.length-1].getBeanProperty(); + if (lastBeanProperty != null){ + this.scalarType = lastBeanProperty.getScalarType(); + } else { + // case for nested compound type (non-scalar) + this.scalarType = null; + } + this.lastElPropertyValue = chain[chain.length-1]; + this.placeHolder = getElPlaceHolder(prefix, lastElPropertyValue, false); + this.placeHolderEncrypted = getElPlaceHolder(prefix, lastElPropertyValue, true); + } + + public String toString() { + return "expr:"+expression+" chain:"+ Arrays.toString(chain); + } + + private String getElPlaceHolder(String prefix, ElPropertyValue lastElPropertyValue, boolean encrypted) { + if (prefix == null){ + return lastElPropertyValue.getElPlaceholder(encrypted); + } + + String el = lastElPropertyValue.getElPlaceholder(encrypted); + + if (!el.contains("${}")){ + // typically a secondary table property + return StringHelper.replaceString(el, "${", "${"+prefix+"."); + } else { + return StringHelper.replaceString(el, ROOT_ELPREFIX, "${"+prefix+"}"); + } + } + + /** + * Full ElGetValue support. + */ + public boolean isDeployOnly() { + return false; + } + + /** + * Return true if there is a many property from sinceProperty to + * the end of this chain. + */ + public boolean containsManySince(String sinceProperty) { + if (sinceProperty == null){ + return containsMany; + } + if (!expression.startsWith(sinceProperty)){ + return containsMany; + } + + int i = 1 + SplitName.count('.', sinceProperty); + + for (; i < chain.length; i++) { + if (chain[i].getBeanProperty().containsMany()) { + return true; + } + } + + return false; + } + + @Override + public boolean containsFormulaWithJoin() { + // Not cascading the check at this stage + return false; + } + + public boolean containsMany() { + return containsMany; + } + + public String getElPrefix() { + return prefix; + } + + public String getName() { + return name; + } + + public String getElName() { + return expression; + } + + public String getElPlaceholder(boolean encrypted) { + return encrypted ? placeHolderEncrypted : placeHolder; + } + + public boolean isDbEncrypted() { + return lastElPropertyValue.isDbEncrypted(); + } + + public boolean isLocalEncrypted() { + return lastElPropertyValue.isLocalEncrypted(); + } + + public Object[] getAssocOneIdValues(EntityBean bean) { + // Don't navigate the object graph as bean + // is assumed to be the appropriate type + return lastElPropertyValue.getAssocOneIdValues(bean); + } + + public String getAssocOneIdExpr(String prefix, String operator) { + return lastElPropertyValue.getAssocOneIdExpr(expression, operator); + } + + public String getAssocIdInExpr(String prefix) { + return lastElPropertyValue.getAssocIdInExpr(prefix); + } + + public String getAssocIdInValueExpr(int size) { + return lastElPropertyValue.getAssocIdInValueExpr(size); + } + + public int getDeployOrder() { + int i = lastBeanProperty.getDeployOrder(); + int max = chain.length-1; + for (int j = 0; j < max; j++) { + int xtra = ((max-j)*1000) * chain[j].getDeployOrder(); + i += xtra; + } + return i; + } + + public boolean isAssocId() { + return assocId; + } + + public boolean isAssocProperty() { + for (int i = 0; i < chain.length; i++) { + if (chain[i].isAssocProperty()){ + return true; + } + } + return false; + } + + public String getDbColumn() { + return lastElPropertyValue.getDbColumn(); + } + + public BeanProperty getBeanProperty() { + return lastBeanProperty; + } + + + public boolean isDateTimeCapable() { + return scalarType != null && scalarType.isDateTimeCapable(); + } + + public int getJdbcType() { + return scalarType == null ? 0 : scalarType.getJdbcType(); + } + + public Object parseDateTime(long systemTimeMillis) { + return scalarType.convertFromMillis(systemTimeMillis); + } + + public StringParser getStringParser() { + return scalarType; + } + + public StringFormatter getStringFormatter() { + return scalarType; + } + + public Object elConvertType(Object value){ + // just convert using the last one in the chain + return lastElPropertyValue.elConvertType(value); + } + + public Object elGetValue(EntityBean bean) { + + for (int i = 0; i < chain.length; i++) { + bean = (EntityBean)chain[i].elGetValue(bean); + if (bean == null) { + return null; + } + } + + return bean; + } + + public Object elGetReference(EntityBean bean) { + + EntityBean prevBean = bean; + for (int i = 0; i < last; i++) { + // always return non null prevBean + prevBean = (EntityBean)chain[i].elGetReference(prevBean); + } + // try the last step in the chain + return chain[last].elGetValue(prevBean); + } + + + public void elSetLoaded(EntityBean bean) { + + for (int i = 0; i < last; i++) { + bean = (EntityBean)chain[i].elGetValue(bean); + if (bean == null){ + break; + } + } + if (bean != null){ + ((EntityBean)bean)._ebean_getIntercept().setLoaded(); + } + } + + public void elSetValue(EntityBean bean, Object value, boolean populate) { + + EntityBean prevBean = bean; + if (populate){ + for (int i = 0; i < last; i++) { + // always return non null prevBean + prevBean = (EntityBean)chain[i].elGetReference(prevBean); + } + } else { + for (int i = 0; i < last; i++) { + // always return non null prevBean + prevBean = (EntityBean)chain[i].elGetValue(prevBean); + if (prevBean == null){ + break; + } + } + } + if (prevBean != null){ + if (lastBeanProperty != null){ + // last chain element maps to a real scalar property + lastBeanProperty.setValueIntercept(prevBean, value); + + } else { + // a non-scalar property of a Compound value object + lastElPropertyValue.elSetValue(prevBean, value, populate); + } + } + } + + +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyChainBuilder.java b/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyChainBuilder.java index 49387b63b..60e5e252c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyChainBuilder.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyChainBuilder.java @@ -1,64 +1,64 @@ -package com.avaje.ebeaninternal.server.el; - -import java.util.ArrayList; -import java.util.List; - -/** - * Utility object used to build a ElPropertyChain. - *

- * Builds a ElPropertyChain based on a chain of properties with dot separators. - *

- *

- * This can navigate an object graph based on dot notation such as - * order.customer.name. - *

- */ -public class ElPropertyChainBuilder { - - private final String expression; - - private final List chain = new ArrayList(); - - private final boolean embedded; - - private boolean containsMany; - - /** - * Create with the original expression. - */ - public ElPropertyChainBuilder(boolean embedded, String expression) { - this.embedded = embedded; - this.expression = expression; - } - - public boolean isContainsMany() { - return containsMany; - } - - public void setContainsMany(boolean containsMany) { - this.containsMany = containsMany; - } - - public String getExpression() { - return expression; - } - - /** - * Add a ElGetValue element to the chain. - */ - public ElPropertyChainBuilder add(ElPropertyValue element) { - if (element == null){ - throw new NullPointerException("element null in expression "+expression); - } - chain.add(element); - return this; - } - - /** - * Build the immutable ElGetChain from the build information. - */ - public ElPropertyChain build() { - return new ElPropertyChain(containsMany, embedded, expression, chain.toArray(new ElPropertyValue[chain.size()])); - } - -} +package com.avaje.ebeaninternal.server.el; + +import java.util.ArrayList; +import java.util.List; + +/** + * Utility object used to build a ElPropertyChain. + *

+ * Builds a ElPropertyChain based on a chain of properties with dot separators. + *

+ *

+ * This can navigate an object graph based on dot notation such as + * order.customer.name. + *

+ */ +public class ElPropertyChainBuilder { + + private final String expression; + + private final List chain = new ArrayList(); + + private final boolean embedded; + + private boolean containsMany; + + /** + * Create with the original expression. + */ + public ElPropertyChainBuilder(boolean embedded, String expression) { + this.embedded = embedded; + this.expression = expression; + } + + public boolean isContainsMany() { + return containsMany; + } + + public void setContainsMany(boolean containsMany) { + this.containsMany = containsMany; + } + + public String getExpression() { + return expression; + } + + /** + * Add a ElGetValue element to the chain. + */ + public ElPropertyChainBuilder add(ElPropertyValue element) { + if (element == null){ + throw new NullPointerException("element null in expression "+expression); + } + chain.add(element); + return this; + } + + /** + * Build the immutable ElGetChain from the build information. + */ + public ElPropertyChain build() { + return new ElPropertyChain(containsMany, embedded, expression, chain.toArray(new ElPropertyValue[chain.size()])); + } + +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyValue.java b/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyValue.java index 344e3b4f2..39d045256 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyValue.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/ElPropertyValue.java @@ -1,117 +1,117 @@ -package com.avaje.ebeaninternal.server.el; - -import com.avaje.ebean.bean.EntityBean; -import com.avaje.ebean.text.StringFormatter; -import com.avaje.ebean.text.StringParser; - -/** - * The expression language object that can get values. - *

- * This can be used for local sorting and filtering. - *

- */ -public interface ElPropertyValue extends ElPropertyDeploy { - - /** - * Return the Id values for the given bean value. - */ - public Object[] getAssocOneIdValues(EntityBean bean); - - /** - * Return the Id expression string. - *

- * Typically used to produce id = ? expression strings. - *

- */ - public String getAssocOneIdExpr(String prefix, String operator); - - /** - * Return the logical id value expression taking into account embedded id's. - */ - public String getAssocIdInValueExpr(int size); - - /** - * Return the logical id in expression taking into account embedded id's. - */ - public String getAssocIdInExpr(String prefix); - - /** - * Return true if this is an ManyToOne or OneToOne associated bean property. - */ - public boolean isAssocId(); - - /** - * Return true if any path of this path contains a Associated One or Many. - */ - public boolean isAssocProperty(); - - /** - * Return true if the property is encrypted via Java. - */ - public boolean isLocalEncrypted(); - - /** - * Return true if the property is encrypted in the DB. - */ - public boolean isDbEncrypted(); - - /** - * Return the deploy order for the property. - */ - public int getDeployOrder(); - - /** - * Return the default StringParser for the scalar property. - */ - public StringParser getStringParser(); - - /** - * Return the default StringFormatter for the scalar property. - */ - public StringFormatter getStringFormatter(); - - /** - * Return true if the last type is "DateTime capable" - can support - * {@link #parseDateTime(long)}. - */ - public boolean isDateTimeCapable(); - - /** - * Return the underlying JDBC type or 0 if this is not a scalar type. - */ - public int getJdbcType(); - - /** - * For DateTime capable scalar types convert the long systemTimeMillis into - * an appropriate java time (Date,Timestamp,Time,Calendar, JODA type etc). - */ - public Object parseDateTime(long systemTimeMillis); - - /** - * Return the value from a given entity bean. - */ - public Object elGetValue(EntityBean bean); - - /** - * Return the value ensuring objects prior to the top scalar property are - * automatically populated. - */ - public Object elGetReference(EntityBean bean); - - /** - * Set a value given a root level bean. - *

- * If populate then - *

- */ - public void elSetValue(EntityBean bean, Object value, boolean populate); - - /** - * Convert the value to the expected type. - *

- * Typically useful for converting strings to the appropriate number type - * etc. - *

- */ - public Object elConvertType(Object value); -} +package com.avaje.ebeaninternal.server.el; + +import com.avaje.ebean.bean.EntityBean; +import com.avaje.ebean.text.StringFormatter; +import com.avaje.ebean.text.StringParser; + +/** + * The expression language object that can get values. + *

+ * This can be used for local sorting and filtering. + *

+ */ +public interface ElPropertyValue extends ElPropertyDeploy { + + /** + * Return the Id values for the given bean value. + */ + public Object[] getAssocOneIdValues(EntityBean bean); + + /** + * Return the Id expression string. + *

+ * Typically used to produce id = ? expression strings. + *

+ */ + public String getAssocOneIdExpr(String prefix, String operator); + + /** + * Return the logical id value expression taking into account embedded id's. + */ + public String getAssocIdInValueExpr(int size); + + /** + * Return the logical id in expression taking into account embedded id's. + */ + public String getAssocIdInExpr(String prefix); + + /** + * Return true if this is an ManyToOne or OneToOne associated bean property. + */ + public boolean isAssocId(); + + /** + * Return true if any path of this path contains a Associated One or Many. + */ + public boolean isAssocProperty(); + + /** + * Return true if the property is encrypted via Java. + */ + public boolean isLocalEncrypted(); + + /** + * Return true if the property is encrypted in the DB. + */ + public boolean isDbEncrypted(); + + /** + * Return the deploy order for the property. + */ + public int getDeployOrder(); + + /** + * Return the default StringParser for the scalar property. + */ + public StringParser getStringParser(); + + /** + * Return the default StringFormatter for the scalar property. + */ + public StringFormatter getStringFormatter(); + + /** + * Return true if the last type is "DateTime capable" - can support + * {@link #parseDateTime(long)}. + */ + public boolean isDateTimeCapable(); + + /** + * Return the underlying JDBC type or 0 if this is not a scalar type. + */ + public int getJdbcType(); + + /** + * For DateTime capable scalar types convert the long systemTimeMillis into + * an appropriate java time (Date,Timestamp,Time,Calendar, JODA type etc). + */ + public Object parseDateTime(long systemTimeMillis); + + /** + * Return the value from a given entity bean. + */ + public Object elGetValue(EntityBean bean); + + /** + * Return the value ensuring objects prior to the top scalar property are + * automatically populated. + */ + public Object elGetReference(EntityBean bean); + + /** + * Set a value given a root level bean. + *

+ * If populate then + *

+ */ + public void elSetValue(EntityBean bean, Object value, boolean populate); + + /** + * Convert the value to the expected type. + *

+ * Typically useful for converting strings to the appropriate number type + * etc. + *

+ */ + public Object elConvertType(Object value); +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/el/ElSetValue.java b/src/main/java/com/avaje/ebeaninternal/server/el/ElSetValue.java index 0a14caabc..d1f7a79b6 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/el/ElSetValue.java +++ b/src/main/java/com/avaje/ebeaninternal/server/el/ElSetValue.java @@ -1,10 +1,10 @@ -package com.avaje.ebeaninternal.server.el; - -public interface ElSetValue { - - /** - * Set the value to the bean. - */ - public void elSetValue(Object bean, Object value); - -} +package com.avaje.ebeaninternal.server.el; + +public interface ElSetValue { + + /** + * Set the value to the bean. + */ + public void elSetValue(Object bean, Object value); + +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/AbstractExpression.java b/src/main/java/com/avaje/ebeaninternal/server/expression/AbstractExpression.java index 2642d4282..530390cf8 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/AbstractExpression.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/AbstractExpression.java @@ -1,52 +1,52 @@ -package com.avaje.ebeaninternal.server.expression; - -import com.avaje.ebeaninternal.api.ManyWhereJoins; -import com.avaje.ebeaninternal.api.SpiExpression; -import com.avaje.ebeaninternal.api.SpiExpressionRequest; -import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; -import com.avaje.ebeaninternal.server.el.ElPropertyDeploy; -import com.avaje.ebeaninternal.server.el.ElPropertyValue; - -/** - * Base class for simple expressions. - * - * @author rbygrave - */ -public abstract class AbstractExpression implements SpiExpression { - - private static final long serialVersionUID = 4072786211853856174L; - - protected final String propName; - - protected AbstractExpression(String propName) { - this.propName = propName; - } - - public String getPropertyName() { - return propName; - } - - public void containsMany(BeanDescriptor desc, ManyWhereJoins manyWhereJoin) { - - String propertyName = getPropertyName(); - if (propertyName != null) { - ElPropertyDeploy elProp = desc.getElPropertyDeploy(propertyName); - if (elProp != null) { - if (elProp.containsFormulaWithJoin()) { - // for findRowCount query select clause - manyWhereJoin.addFormulaWithJoin(propertyName); - } - if (elProp.containsMany()) { - // for findRowCount we join to a many property - manyWhereJoin.add(elProp); - } - } - } - } - - protected ElPropertyValue getElProp(SpiExpressionRequest request) { - - String propertyName = getPropertyName(); - return request.getBeanDescriptor().getElGetValue(propertyName); - } -} +package com.avaje.ebeaninternal.server.expression; + +import com.avaje.ebeaninternal.api.ManyWhereJoins; +import com.avaje.ebeaninternal.api.SpiExpression; +import com.avaje.ebeaninternal.api.SpiExpressionRequest; +import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; +import com.avaje.ebeaninternal.server.el.ElPropertyDeploy; +import com.avaje.ebeaninternal.server.el.ElPropertyValue; + +/** + * Base class for simple expressions. + * + * @author rbygrave + */ +public abstract class AbstractExpression implements SpiExpression { + + private static final long serialVersionUID = 4072786211853856174L; + + protected final String propName; + + protected AbstractExpression(String propName) { + this.propName = propName; + } + + public String getPropertyName() { + return propName; + } + + public void containsMany(BeanDescriptor desc, ManyWhereJoins manyWhereJoin) { + + String propertyName = getPropertyName(); + if (propertyName != null) { + ElPropertyDeploy elProp = desc.getElPropertyDeploy(propertyName); + if (elProp != null) { + if (elProp.containsFormulaWithJoin()) { + // for findRowCount query select clause + manyWhereJoin.addFormulaWithJoin(propertyName); + } + if (elProp.containsMany()) { + // for findRowCount we join to a many property + manyWhereJoin.add(elProp); + } + } + } + } + + protected ElPropertyValue getElProp(SpiExpressionRequest request) { + + String propertyName = getPropertyName(); + return request.getBeanDescriptor().getElGetValue(propertyName); + } +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/BetweenPropertyExpression.java b/src/main/java/com/avaje/ebeaninternal/server/expression/BetweenPropertyExpression.java index 232ac64c9..b4562bc51 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/BetweenPropertyExpression.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/BetweenPropertyExpression.java @@ -1,68 +1,68 @@ -package com.avaje.ebeaninternal.server.expression; - -import com.avaje.ebean.event.BeanQueryRequest; -import com.avaje.ebeaninternal.api.HashQueryPlanBuilder; -import com.avaje.ebeaninternal.api.ManyWhereJoins; -import com.avaje.ebeaninternal.api.SpiExpression; -import com.avaje.ebeaninternal.api.SpiExpressionRequest; -import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; -import com.avaje.ebeaninternal.server.el.ElPropertyDeploy; - -/** - * Between expression where a value is between two properties. - */ -class BetweenPropertyExpression implements SpiExpression { - - private static final long serialVersionUID = 2078918165221454910L; - - private static final String BETWEEN = " between "; - - private final String lowProperty; - private final String highProperty; - private final Object value; - - BetweenPropertyExpression(String lowProperty, String highProperty, Object value) { - this.lowProperty = lowProperty; - this.highProperty = highProperty; - this.value = value; - } - - protected String name(String propName) { - return propName; - } - - public void containsMany(BeanDescriptor desc, ManyWhereJoins manyWhereJoin) { - - ElPropertyDeploy elProp = desc.getElPropertyDeploy(name(lowProperty)); - if (elProp != null && elProp.containsMany()) { - manyWhereJoin.add(elProp); - } - - elProp = desc.getElPropertyDeploy(name(highProperty)); - if (elProp != null && elProp.containsMany()) { - manyWhereJoin.add(elProp); - } - } - - public void addBindValues(SpiExpressionRequest request) { - request.addBindValue(value); - } - - public void addSql(SpiExpressionRequest request) { - - request.append(" ? ").append(BETWEEN).append(name(lowProperty)).append(" and ").append(name(highProperty)); - } - - public void queryAutoFetchHash(HashQueryPlanBuilder builder) { - builder.add(BetweenPropertyExpression.class).add(lowProperty).add(highProperty); - builder.bind(1); - } - - public void queryPlanHash(BeanQueryRequest request, HashQueryPlanBuilder builder) { - queryAutoFetchHash(builder); - } - - public int queryBindHash() { - return value.hashCode(); - } -} +package com.avaje.ebeaninternal.server.expression; + +import com.avaje.ebean.event.BeanQueryRequest; +import com.avaje.ebeaninternal.api.HashQueryPlanBuilder; +import com.avaje.ebeaninternal.api.ManyWhereJoins; +import com.avaje.ebeaninternal.api.SpiExpression; +import com.avaje.ebeaninternal.api.SpiExpressionRequest; +import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; +import com.avaje.ebeaninternal.server.el.ElPropertyDeploy; + +/** + * Between expression where a value is between two properties. + */ +class BetweenPropertyExpression implements SpiExpression { + + private static final long serialVersionUID = 2078918165221454910L; + + private static final String BETWEEN = " between "; + + private final String lowProperty; + private final String highProperty; + private final Object value; + + BetweenPropertyExpression(String lowProperty, String highProperty, Object value) { + this.lowProperty = lowProperty; + this.highProperty = highProperty; + this.value = value; + } + + protected String name(String propName) { + return propName; + } + + public void containsMany(BeanDescriptor desc, ManyWhereJoins manyWhereJoin) { + + ElPropertyDeploy elProp = desc.getElPropertyDeploy(name(lowProperty)); + if (elProp != null && elProp.containsMany()) { + manyWhereJoin.add(elProp); + } + + elProp = desc.getElPropertyDeploy(name(highProperty)); + if (elProp != null && elProp.containsMany()) { + manyWhereJoin.add(elProp); + } + } + + public void addBindValues(SpiExpressionRequest request) { + request.addBindValue(value); + } + + public void addSql(SpiExpressionRequest request) { + + request.append(" ? ").append(BETWEEN).append(name(lowProperty)).append(" and ").append(name(highProperty)); + } + + public void queryAutoFetchHash(HashQueryPlanBuilder builder) { + builder.add(BetweenPropertyExpression.class).add(lowProperty).add(highProperty); + builder.bind(1); + } + + public void queryPlanHash(BeanQueryRequest request, HashQueryPlanBuilder builder) { + queryAutoFetchHash(builder); + } + + public int queryBindHash() { + return value.hashCode(); + } +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/FilterExprPath.java b/src/main/java/com/avaje/ebeaninternal/server/expression/FilterExprPath.java index 89b06f168..a60d6e031 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/FilterExprPath.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/FilterExprPath.java @@ -1,43 +1,43 @@ -package com.avaje.ebeaninternal.server.expression; - -import java.io.Serializable; - -/** - * This is the path prefix for filterMany. - *

- * The actual path can change due to FetchConfig query joins that proceed the - * query that includes the filterMany. - *

- */ -public class FilterExprPath implements Serializable { - - private static final long serialVersionUID = -6420905565372842018L; - - /** - * The path of the filterMany. - */ - private String path; - - public FilterExprPath(String path) { - this.path = path; - } - - /** - * Return a copy of the FilterExprPath trimming off leading part of the path - * due to a proceeding (earlier) query join etc. - */ - public FilterExprPath trimPath(int prefixTrim) { - if (prefixTrim >= path.length()) { - return new FilterExprPath(null); - } - return new FilterExprPath(path.substring(prefixTrim)); - } - - /** - * Return the path. This is a prefix used in the filterMany expressions. - */ - public String getPath() { - return path; - } - -} +package com.avaje.ebeaninternal.server.expression; + +import java.io.Serializable; + +/** + * This is the path prefix for filterMany. + *

+ * The actual path can change due to FetchConfig query joins that proceed the + * query that includes the filterMany. + *

+ */ +public class FilterExprPath implements Serializable { + + private static final long serialVersionUID = -6420905565372842018L; + + /** + * The path of the filterMany. + */ + private String path; + + public FilterExprPath(String path) { + this.path = path; + } + + /** + * Return a copy of the FilterExprPath trimming off leading part of the path + * due to a proceeding (earlier) query join etc. + */ + public FilterExprPath trimPath(int prefixTrim) { + if (prefixTrim >= path.length()) { + return new FilterExprPath(null); + } + return new FilterExprPath(path.substring(prefixTrim)); + } + + /** + * Return the path. This is a prefix used in the filterMany expressions. + */ + public String getPath() { + return path; + } + +}