You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2013/01/08 03:40:07 UTC
svn commit: r1430117 - in
/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria:
CriteriaBuilderImpl.java PredicateImpl.java
Author: ppoddar
Date: Tue Jan 8 02:40:07 2013
New Revision: 1430117
URL: http://svn.apache.org/viewvc?rev=1430117&view=rev
Log:
OPENJPA-2320: Remove static initializers because recursive Predicate constructor deadlocks
Modified:
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilderImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilderImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilderImpl.java?rev=1430117&r1=1430116&r2=1430117&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilderImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilderImpl.java Tue Jan 8 02:40:07 2013
@@ -332,7 +332,7 @@ public class CriteriaBuilderImpl impleme
if (x instanceof PredicateImpl) {
PredicateImpl predicate = (PredicateImpl)x;
if (predicate.isEmpty()) {
- return predicate.getOperator() == BooleanOperator.AND ? PredicateImpl.TRUE : PredicateImpl.FALSE;
+ return predicate.getOperator() == BooleanOperator.AND ? PredicateImpl.TRUE() : PredicateImpl.FALSE();
}
}
return new Expressions.Equal(x, true);
@@ -403,9 +403,9 @@ public class CriteriaBuilderImpl impleme
public <T> Expression<T> literal(T value) {
if (Boolean.TRUE.equals(value))
- return (Expression<T>)PredicateImpl.TRUE;
+ return (Expression<T>)PredicateImpl.TRUE();
if (Boolean.FALSE.equals(value))
- return (Expression<T>)PredicateImpl.FALSE;
+ return (Expression<T>)PredicateImpl.FALSE();
return new Expressions.Constant<T>(value);
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java?rev=1430117&r1=1430116&r2=1430117&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java Tue Jan 8 02:40:07 2013
@@ -45,17 +45,13 @@ import org.apache.openjpa.kernel.exps.Li
* @since 2.0.0
*/
abstract class PredicateImpl extends ExpressionImpl<Boolean> implements Predicate {
- private static final ExpressionImpl<Integer> ONE = new Expressions.Constant<Integer>(1);
- public static final Predicate TRUE = new Expressions.Equal(ONE,ONE);
- public static final Predicate FALSE = new Expressions.NotEqual(ONE,ONE);
+ private static Predicate TRUE;
+ private static Predicate FALSE;
protected final List<Predicate> _exps = Collections.synchronizedList(new ArrayList<Predicate>());
private final BooleanOperator _op;
private boolean _negated = false;
- static {
- System.err.println("WARNING: You are using a unofficial version of PredicateImpl.class");
- }
/**
* An AND predicate with no arguments.
*/
@@ -76,17 +72,20 @@ abstract class PredicateImpl extends Exp
*/
protected PredicateImpl(BooleanOperator op, Predicate...restrictions) {
this(op);
- if (restrictions != null) {
- for (Predicate p : restrictions)
- add(p);
- }
+ if (restrictions == null || restrictions.length == 0) return;
+
+ for (Predicate p : restrictions) {
+ add(p);
+ }
}
/**
* Adds the given predicate expression.
*/
public PredicateImpl add(Expression<Boolean> s) {
- _exps.add((Predicate)s); // all boolean expressions are Predicate
+ synchronized (_exps) {
+ _exps.add((Predicate)s); // all boolean expressions are Predicate
+ }
return this;
}
@@ -130,6 +129,22 @@ abstract class PredicateImpl extends Exp
return this;
}
+ public static Predicate TRUE() {
+ if (TRUE == null) {
+ ExpressionImpl<Integer> ONE = new Expressions.Constant<Integer>(1);
+ TRUE = new Expressions.Equal(ONE, ONE);
+ }
+ return TRUE;
+ }
+
+ public static Predicate FALSE() {
+ if (FALSE == null) {
+ ExpressionImpl<Integer> ONE = new Expressions.Constant<Integer>(1);
+ FALSE = new Expressions.NotEqual(ONE, ONE);
+ }
+ return FALSE;
+ }
+
@Override
org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
if (_exps.isEmpty()) {
@@ -141,7 +156,7 @@ abstract class PredicateImpl extends Exp
@Override
org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl<?> q) {
if (_exps.isEmpty()) {
- Predicate nil = _op == BooleanOperator.AND ? TRUE : FALSE;
+ Predicate nil = _op == BooleanOperator.AND ? TRUE() : FALSE();
return ((PredicateImpl)nil).toKernelExpression(factory, q);
}
if (_exps.size() == 1) {