Administrator
|
Hi Gil,
Not yet sure it's only me (Windows) but I get this locally org.apache.ofbiz.entity.EntityConditionVisitorTests > basicTest FAILED org.junit.ComparisonFailure at EntityConditionVisitorTests.java:83 Buildbot should run soon (after r1843921), and tells us... Jacques Le 13/10/2018 à 21:50, [hidden email] a écrit : > Author: pgil > Date: Sat Oct 13 19:50:27 2018 > New Revision: 1843780 > > URL: http://svn.apache.org/viewvc?rev=1843780&view=rev > Log: > Improved: Rewrite EntityConditionVisitor interface to respect visitor Pattern > (OFBIZ-10593) > > Remove visit methods from current EntityConditionBase type hierarchy. > Add or rewrite accept method in EntityCondition type hierachy. > Add documentation in EntityConditionVisitor, introducing implementation examples. > Add junit test validating documented examples. > Thanks to Mathieu Lirzin for your contribution, and Jacques for the review. > > Added: > ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java (with props) > Modified: > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityComparisonOperator.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionFunction.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionList.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionSubSelect.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionValue.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionVisitor.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityDateFilterCondition.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldMap.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldValue.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFunction.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityOperator.java > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityWhereString.java > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityComparisonOperator.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityComparisonOperator.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityComparisonOperator.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityComparisonOperator.java Sat Oct 13 19:50:27 2018 > @@ -78,12 +78,6 @@ public abstract class EntityComparisonOp > } > > @Override > - public void visit(EntityConditionVisitor visitor, L lhs, R rhs) { > - visitor.accept(lhs); > - visitor.accept(rhs); > - } > - > - @Override > public void addSqlValue(StringBuilder sql, ModelEntity entity, List<EntityConditionParam> entityConditionParams, boolean compat, L lhs, R rhs, Datasource datasourceInfo) { > > // if this is an IN operator and the rhs Object isEmpty, add "1=0" instead of the normal SQL. Note that "FALSE" does not work with all databases. > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java Sat Oct 13 19:50:27 2018 > @@ -109,9 +109,12 @@ public abstract class EntityCondition ex > return makeWhereString(null, new ArrayList<EntityConditionParam>(), null); > } > > - public void accept(EntityConditionVisitor visitor) { > - throw new IllegalArgumentException(getClass().getName() + ".accept not implemented"); > - } > + /** > + * Applies a visitor to this condition. > + * > + * @param visitor the visitor to be applied > + */ > + abstract public void accept(EntityConditionVisitor visitor); > > abstract public String makeWhereString(ModelEntity modelEntity, List<EntityConditionParam> entityConditionParams, Datasource datasourceInfo); > > @@ -132,8 +135,4 @@ public abstract class EntityCondition ex > abstract public boolean mapMatches(Delegator delegator, Map<String, ? extends Object> map); > > abstract public EntityCondition freeze(); > - > - public void visit(EntityConditionVisitor visitor) { > - throw new IllegalArgumentException(getClass().getName() + ".visit not implemented"); > - } > } > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java Sat Oct 13 19:50:27 2018 > @@ -84,6 +84,10 @@ public class EntityConditionBuilder exte > return condition.equals(obj); > } > > + @Override > + public void accept(EntityConditionVisitor visitor) { > + throw new IllegalArgumentException(getClass().getName() + ".accept not implemented"); > + } > } > > @Override > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionFunction.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionFunction.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionFunction.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionFunction.java Sat Oct 13 19:50:27 2018 > @@ -80,8 +80,8 @@ public abstract class EntityConditionFun > } > > @Override > - public void visit(EntityConditionVisitor visitor) { > - visitor.acceptEntityConditionFunction(this, condition); > + public void accept(EntityConditionVisitor visitor) { > + visitor.visit(this); > } > > @Override > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionList.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionList.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionList.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionList.java Sat Oct 13 19:50:27 2018 > @@ -43,6 +43,6 @@ public class EntityConditionList<T exten > > @Override > public void accept(EntityConditionVisitor visitor) { > - visitor.acceptEntityConditionList(this); > + visitor.visit(this); > } > } > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java Sat Oct 13 19:50:27 2018 > @@ -61,11 +61,6 @@ public abstract class EntityConditionLis > } > > @Override > - public void visit(EntityConditionVisitor visitor) { > - visitor.acceptEntityJoinOperator(operator, conditionList); > - } > - > - @Override > public boolean isEmpty() { > return operator.isEmpty(conditionList); > } > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionSubSelect.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionSubSelect.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionSubSelect.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionSubSelect.java Sat Oct 13 19:50:27 2018 > @@ -146,11 +146,4 @@ public class EntityConditionSubSelect ex > public void validateSql(ModelEntity modelEntity) throws GenericModelException { > // do nothing for now > } > - > - @Override > - public void visit(EntityConditionVisitor visitor) { > - if (whereCond != null) { > - whereCond.visit(visitor); > - } > - } > } > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionValue.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionValue.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionValue.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionValue.java Sat Oct 13 19:50:27 2018 > @@ -45,11 +45,6 @@ public abstract class EntityConditionVal > } > > @Override > - public void accept(EntityConditionVisitor visitor) { > - visitor.acceptEntityConditionValue(this); > - } > - > - @Override > public void addSqlValue(StringBuilder sql, Map<String, String> tableAliases, ModelEntity modelEntity, List<EntityConditionParam> entityConditionParams, boolean includeTableNamePrefix, Datasource datasourceinfo) { > sql.append(value); > } > @@ -77,11 +72,6 @@ public abstract class EntityConditionVal > @Override > public void validateSql(org.apache.ofbiz.entity.model.ModelEntity modelEntity) { > } > - > - @Override > - public void visit(EntityConditionVisitor visitor) { > - visitor.acceptObject(value); > - } > } > > public abstract ModelField getModelField(ModelEntity modelEntity); > @@ -109,12 +99,6 @@ public abstract class EntityConditionVal > > public abstract EntityConditionValue freeze(); > > - public abstract void visit(EntityConditionVisitor visitor); > - > - public void accept(EntityConditionVisitor visitor) { > - throw new IllegalArgumentException("accept not implemented"); > - } > - > public void toString(StringBuilder sb) { > addSqlValue(sb, null, new ArrayList<EntityConditionParam>(), false, null); > } > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionVisitor.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionVisitor.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionVisitor.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionVisitor.java Sat Oct 13 19:50:27 2018 > @@ -1,4 +1,4 @@ > -/******************************************************************************* > +/* > * Licensed to the Apache Software Foundation (ASF) under one > * or more contributor license agreements. See the NOTICE file > * distributed with this work for additional information > @@ -15,40 +15,139 @@ > * KIND, either express or implied. See the License for the > * specific language governing permissions and limitations > * under the License. > - *******************************************************************************/ > - > + */ > package org.apache.ofbiz.entity.condition; > > -import java.util.List; > - > +// Keep the tests from EntityConditionVisitorTests in sync with the code examples. > /** > - * <p>Represents the conditions to be used to constrain a query.</p> > - * <p>An EntityCondition can represent various type of constraints, including:</p> > - * <ul> > - * <li>EntityConditionList: a list of EntityConditions, combined with the operator specified > - * <li>EntityExpr: for simple expressions or expressions that combine EntityConditions > - * <li>EntityFieldMap: a map of fields where the field (key) equals the value, combined with the operator specified > - * </ul> > - * These can be used in various combinations using the EntityConditionList and EntityExpr objects. > + * A visitor of entity conditions in the style of the visitor design pattern. > + * <p> > + * Classes implementing this interface can extend the dynamically dispatched > + * behavior associated with {@link EntityCondition} without augmenting its > + * interface. Those classes are meant be passed to the > + * {@link EntityCondition#accept(EntityConditionVisitor) accept} method which > + * calls the corresponding method in the visitor. > + * <p> > + * <b>Usage Examples:</b> > + * Here is a dummy example that should print <i>EntityExpr\n</i> to > + * the standard output. > + * <pre>{@code > + * EntityExpr expr; > + * expr.accept(new EntityConditionVisitor() { > + * public void visit(EntityConditionFunction func) { > + * system.out.println("EntityConditionFunction"); > + * } > + * > + * public <T extends EntityCondition> void visit(EntityConditionList<T> l) { > + * system.out.println("EntityConditionList"); > + * } > + * > + * public void visit(EntityFieldMap m) { > + * system.out.println("EntityFieldMap"); > + * } > + * > + * public void visit(EntityDateFilterCondition df) { > + * system.out.println("EntityDateFilterCondition"); > + * } > + * > + * public void visit(EntityExpr expr) { > + * system.out.println("EntityExpr"); > + * } > + * > + * public void visit(EntityWhereString ws) { > + * system.out.println("EntityWhereString"); > + * } > + * }); > + * }</pre> > + * <p> > + * Here is a more complex example asserting the presence of a raw string condition > + * even when it is embedded inside another one. > + * <pre>{@code > + * class ContainsRawCondition implements EntityConditionVisitor { > + * public boolean hasRawCondition = false; > + * > + * public void visit(EntityConditionFunction func) {} > + * public void visit(EntityFieldMap m) {} > + * public void visit(EntityDateFilterCondition df) {} > * > + * public <T extends EntityCondition> void visit(EntityConditionList<T> l) { > + * Iterator<T> it = l.getConditionIterator(); > + * while (it.hasNext()) { > + * it.next().accept(this); > + * } > + * } > + * > + * public void visit(EntityExpr expr) { > + * Object lhs = expr.getLhs(); > + * Object rhs = expr.getRhs(); > + * if (lhs instanceof EntityCondition) { > + * ((EntityCondition) lhs).accept(this); > + * } > + * if (rhs instanceof EntityCondition) { > + * ((EntityCondition) rhs).accept(this); > + * } > + * } > + * > + * public void visit(EntityWhereString ws) { > + * hasRawCondition = true; > + * } > + * } > + * > + * EntityCondition ec = > + * EntityCondition.makeCondition(EntityCondition.makeConditionWhere("foo=bar")); > + * EntityConditionVisitor visitor = new ContainsRawCondition(); > + * ec.accept(visitor); > + * assert visitor.hasRawCondition; > + * }</pre> > + * > + * @see EntityCondition > */ > public interface EntityConditionVisitor { > - <T> void visit(T obj); > - <T> void accept(T obj); > - void acceptObject(Object obj); > - void acceptEntityCondition(EntityCondition condition); > - <T extends EntityCondition> void acceptEntityJoinOperator(EntityJoinOperator op, List<T> conditions); > - <L,R,T> void acceptEntityOperator(EntityOperator<L, R, T> op, L lhs, R rhs); > - <L,R> void acceptEntityComparisonOperator(EntityComparisonOperator<L, R> op, L lhs, R rhs); > - void acceptEntityConditionValue(EntityConditionValue value); > - void acceptEntityFieldValue(EntityFieldValue value); > - > - void acceptEntityExpr(EntityExpr expr); > - <T extends EntityCondition> void acceptEntityConditionList(EntityConditionList<T> list); > - void acceptEntityFieldMap(EntityFieldMap fieldMap); > - void acceptEntityConditionFunction(EntityConditionFunction func, EntityCondition nested); > - <T extends Comparable<?>> void acceptEntityFunction(EntityFunction<T> func); > - void acceptEntityWhereString(EntityWhereString condition); > + /** > + * Visits an entity condition function. > + * > + * @param func the visited class > + * @see EntityConditionFunction > + */ > + void visit(EntityConditionFunction func); > + > + /** > + * Visits a list of entity conditions. > + * > + * @param l the visited class > + * @see EntityConditionList > + */ > + <T extends EntityCondition> void visit(EntityConditionList<T> l); > + > + /** > + * Visits a map of entity fields. > + * > + * @param m the visited class > + * @see EntityFieldMap > + */ > + void visit(EntityFieldMap m); > + > + /** > + * Visits a date filter condition. > + * > + * @param df the visited class > + * @see EntityDateFilterCondition > + */ > + void visit(EntityDateFilterCondition df); > + > + /** > + * Visits an entity expression. > + * > + * @param expr the visited class > + * @see EntityExpr > + */ > + void visit(EntityExpr expr); > > - void acceptEntityDateFilterCondition(EntityDateFilterCondition condition); > + /** > + * Visits a raw string condition. > + * > + * @param ws the visited class > + * @see EntityWhereString > + */ > + void visit(EntityWhereString ws); > } > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityDateFilterCondition.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityDateFilterCondition.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityDateFilterCondition.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityDateFilterCondition.java Sat Oct 13 19:50:27 2018 > @@ -82,13 +82,8 @@ public final class EntityDateFilterCondi > } > > @Override > - public void visit(EntityConditionVisitor visitor) { > - visitor.acceptEntityDateFilterCondition(this); > - } > - > - @Override > public void accept(EntityConditionVisitor visitor) { > - visitor.acceptEntityDateFilterCondition(this); > + visitor.visit(this); > } > > @Override > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java Sat Oct 13 19:50:27 2018 > @@ -149,13 +149,8 @@ public final class EntityExpr extends En > } > > @Override > - public void visit(EntityConditionVisitor visitor) { > - visitor.acceptEntityOperator(operator, lhs, rhs); > - } > - > - @Override > public void accept(EntityConditionVisitor visitor) { > - visitor.acceptEntityExpr(this); > + visitor.visit(this); > } > > public void checkRhsType(ModelEntity modelEntity, Delegator delegator) { > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldMap.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldMap.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldMap.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldMap.java Sat Oct 13 19:50:27 2018 > @@ -74,6 +74,6 @@ public final class EntityFieldMap extend > > @Override > public void accept(EntityConditionVisitor visitor) { > - visitor.acceptEntityFieldMap(this); > + visitor.visit(this); > } > } > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldValue.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldValue.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldValue.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldValue.java Sat Oct 13 19:50:27 2018 > @@ -199,16 +199,6 @@ public class EntityFieldValue extends En > } > > @Override > - public void visit(EntityConditionVisitor visitor) { > - visitor.acceptEntityFieldValue(this); > - } > - > - @Override > - public void accept(EntityConditionVisitor visitor) { > - visitor.acceptEntityFieldValue(this); > - } > - > - @Override > public EntityConditionValue freeze() { > return this; > } > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFunction.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFunction.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFunction.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFunction.java Sat Oct 13 19:50:27 2018 > @@ -201,20 +201,6 @@ public abstract class EntityFunction<T e > } > > @Override > - public void visit(EntityConditionVisitor visitor) { > - if (nested != null) { > - visitor.acceptEntityConditionValue(nested); > - } else { > - visitor.acceptObject(value); > - } > - } > - > - @Override > - public void accept(EntityConditionVisitor visitor) { > - visitor.acceptEntityFunction(this); > - } > - > - @Override > public ModelField getModelField(ModelEntity modelEntity) { > if (nested != null) { > return nested.getModelField(modelEntity); > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java Sat Oct 13 19:50:27 2018 > @@ -96,20 +96,6 @@ public class EntityJoinOperator extends > return EntityCondition.makeCondition(newList, this); > } > > - public void visit(EntityConditionVisitor visitor, List<? extends EntityCondition> conditionList) { > - if (UtilValidate.isNotEmpty(conditionList)) { > - for (EntityCondition condition: conditionList) { > - visitor.visit(condition); > - } > - } > - } > - > - @Override > - public void visit(EntityConditionVisitor visitor, EntityCondition lhs, EntityCondition rhs) { > - lhs.visit(visitor); > - visitor.visit(rhs); > - } > - > public Boolean eval(GenericEntity entity, EntityCondition lhs, EntityCondition rhs) { > return entityMatches(entity, lhs, rhs) ? Boolean.TRUE : Boolean.FALSE; > } > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityOperator.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityOperator.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityOperator.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityOperator.java Sat Oct 13 19:50:27 2018 > @@ -296,7 +296,6 @@ public abstract class EntityOperator<L, > > public abstract void addSqlValue(StringBuilder sql, ModelEntity entity, List<EntityConditionParam> entityConditionParams, boolean compat, L lhs, R rhs, Datasource datasourceInfo); > public abstract EntityCondition freeze(L lhs, R rhs); > - public abstract void visit(EntityConditionVisitor visitor, L lhs, R rhs); > > public static final Comparable<?> WILDCARD = new Comparable<Object>() { > public int compareTo(Object obj) { > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityWhereString.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityWhereString.java?rev=1843780&r1=1843779&r2=1843780&view=diff > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityWhereString.java (original) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityWhereString.java Sat Oct 13 19:50:27 2018 > @@ -82,8 +82,8 @@ public final class EntityWhereString ext > } > > @Override > - public void visit(EntityConditionVisitor visitor) { > - visitor.acceptEntityWhereString(this); > + public void accept(EntityConditionVisitor visitor) { > + visitor.visit(this); > } > > @Override > > Added: ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java?rev=1843780&view=auto > ============================================================================== > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java (added) > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java Sat Oct 13 19:50:27 2018 > @@ -0,0 +1,128 @@ > +/* > + * Licensed to the Apache Software Foundation (ASF) under one > + * or more contributor license agreements. See the NOTICE file > + * distributed with this work for additional information > + * regarding copyright ownership. The ASF licenses this file > + * to you 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 org.apache.ofbiz.entity; > + > +import static org.junit.Assert.assertEquals; > +import static org.junit.Assert.assertTrue; > + > +import java.io.ByteArrayOutputStream; > +import java.io.OutputStream; > +import java.io.PrintWriter; > +import java.util.Iterator; > + > +import org.apache.ofbiz.entity.condition.EntityComparisonOperator; > +import org.apache.ofbiz.entity.condition.EntityCondition; > +import org.apache.ofbiz.entity.condition.EntityConditionFunction; > +import org.apache.ofbiz.entity.condition.EntityConditionList; > +import org.apache.ofbiz.entity.condition.EntityConditionVisitor; > +import org.apache.ofbiz.entity.condition.EntityDateFilterCondition; > +import org.apache.ofbiz.entity.condition.EntityExpr; > +import org.apache.ofbiz.entity.condition.EntityFieldMap; > +import org.apache.ofbiz.entity.condition.EntityWhereString; > +import org.junit.Test; > + > +/* Tests adapted from code examples described in the javadoc of the > + * EntityConditionVisitor interface. They should be kept in sync with > + * those code examples. */ > +public class EntityConditionVisitorTests { > + > + // Checks the dummy visitor example which must print "EntityExpr\n". > + @Test > + public void basicTest() { > + EntityExpr expr = new EntityExpr("foo", EntityComparisonOperator.EQUALS, "bar"); > + OutputStream os = new ByteArrayOutputStream(); > + PrintWriter pw = new PrintWriter(os); > + expr.accept(new EntityConditionVisitor() { > + @Override > + public void visit(EntityConditionFunction func) { > + pw.println("EntityConditionFunction"); > + } > + > + @Override > + public <T extends EntityCondition> void visit(EntityConditionList<T> l) { > + pw.println("EntityConditionList"); > + } > + > + @Override > + public void visit(EntityFieldMap m) { > + pw.println("EntityFieldMap"); > + } > + > + @Override > + public void visit(EntityDateFilterCondition df) { > + pw.println("EntityDateFilterConfition"); > + } > + > + @Override > + public void visit(EntityExpr expr) { > + pw.println("EntityExpr"); > + } > + > + @Override > + public void visit(EntityWhereString ws) { > + pw.println("EntityWhereString"); > + } > + }); > + pw.flush(); > + assertEquals("EntityExpr\n", os.toString()); > + } > + > + /* Checks the more complex example which asserts the presence of a raw string > + * condition even when it is embedded inside another one. */ > + @Test > + public void complexTest() { > + class ContainsRawCondition implements EntityConditionVisitor { > + public boolean hasRawCondition = false; > + > + @Override public void visit(EntityConditionFunction func) {} > + @Override public void visit(EntityFieldMap m) {} > + @Override public void visit(EntityDateFilterCondition df) {} > + > + @Override > + public <T extends EntityCondition> void visit(EntityConditionList<T> l) { > + Iterator<T> it = l.getConditionIterator(); > + while (it.hasNext()) { > + it.next().accept(this); > + } > + } > + > + @Override > + public void visit(EntityExpr expr) { > + Object lhs = expr.getLhs(); > + Object rhs = expr.getRhs(); > + if (lhs instanceof EntityCondition) { > + ((EntityCondition) lhs).accept(this); > + } > + if (rhs instanceof EntityCondition) { > + ((EntityCondition) rhs).accept(this); > + } > + } > + > + @Override > + public void visit(EntityWhereString ws) { > + hasRawCondition = true; > + } > + } > + > + EntityCondition ec = EntityCondition.makeCondition(EntityCondition.makeConditionWhere("foo=bar")); > + ContainsRawCondition visitor = new ContainsRawCondition(); > + ec.accept(visitor); > + assertTrue(visitor.hasRawCondition); > + } > +} > > Propchange: ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java > ------------------------------------------------------------------------------ > svn:keywords = Date Rev Author URL Id > > Propchange: ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > > |
Hello,
I think that is an incompatibiliy with Windows newline char (\n vs \r\n). Thanks for the feedback, I'll improve that soon. Gil Le lundi 15 oct. 2018 à 18:09:30 (+0200), Jacques Le Roux a écrit : > Hi Gil, > > Not yet sure it's only me (Windows) but I get this locally > > org.apache.ofbiz.entity.EntityConditionVisitorTests > basicTest FAILED > org.junit.ComparisonFailure at EntityConditionVisitorTests.java:83 > > Buildbot should run soon (after r1843921), and tells us... > > Jacques > > > Le 13/10/2018 à 21:50, [hidden email] a écrit : > > Author: pgil > > Date: Sat Oct 13 19:50:27 2018 > > New Revision: 1843780 > > > > URL: http://svn.apache.org/viewvc?rev=1843780&view=rev > > Log: > > Improved: Rewrite EntityConditionVisitor interface to respect visitor Pattern > > (OFBIZ-10593) > > > > Remove visit methods from current EntityConditionBase type hierarchy. > > Add or rewrite accept method in EntityCondition type hierachy. > > Add documentation in EntityConditionVisitor, introducing implementation examples. > > Add junit test validating documented examples. > > Thanks to Mathieu Lirzin for your contribution, and Jacques for the review. > > > > Added: > > ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java (with props) > > Modified: > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityComparisonOperator.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionFunction.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionList.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionSubSelect.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionValue.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionVisitor.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityDateFilterCondition.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldMap.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldValue.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFunction.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityOperator.java > > ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityWhereString.java > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityComparisonOperator.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityComparisonOperator.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityComparisonOperator.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityComparisonOperator.java Sat Oct 13 19:50:27 2018 > > @@ -78,12 +78,6 @@ public abstract class EntityComparisonOp > > } > > @Override > > - public void visit(EntityConditionVisitor visitor, L lhs, R rhs) { > > - visitor.accept(lhs); > > - visitor.accept(rhs); > > - } > > - > > - @Override > > public void addSqlValue(StringBuilder sql, ModelEntity entity, List<EntityConditionParam> entityConditionParams, boolean compat, L lhs, R rhs, Datasource datasourceInfo) { > > // if this is an IN operator and the rhs Object isEmpty, add "1=0" instead of the normal SQL. Note that "FALSE" does not work with all databases. > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java Sat Oct 13 19:50:27 2018 > > @@ -109,9 +109,12 @@ public abstract class EntityCondition ex > > return makeWhereString(null, new ArrayList<EntityConditionParam>(), null); > > } > > - public void accept(EntityConditionVisitor visitor) { > > - throw new IllegalArgumentException(getClass().getName() + ".accept not implemented"); > > - } > > + /** > > + * Applies a visitor to this condition. > > + * > > + * @param visitor the visitor to be applied > > + */ > > + abstract public void accept(EntityConditionVisitor visitor); > > abstract public String makeWhereString(ModelEntity modelEntity, List<EntityConditionParam> entityConditionParams, Datasource datasourceInfo); > > @@ -132,8 +135,4 @@ public abstract class EntityCondition ex > > abstract public boolean mapMatches(Delegator delegator, Map<String, ? extends Object> map); > > abstract public EntityCondition freeze(); > > - > > - public void visit(EntityConditionVisitor visitor) { > > - throw new IllegalArgumentException(getClass().getName() + ".visit not implemented"); > > - } > > } > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java Sat Oct 13 19:50:27 2018 > > @@ -84,6 +84,10 @@ public class EntityConditionBuilder exte > > return condition.equals(obj); > > } > > + @Override > > + public void accept(EntityConditionVisitor visitor) { > > + throw new IllegalArgumentException(getClass().getName() + ".accept not implemented"); > > + } > > } > > @Override > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionFunction.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionFunction.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionFunction.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionFunction.java Sat Oct 13 19:50:27 2018 > > @@ -80,8 +80,8 @@ public abstract class EntityConditionFun > > } > > @Override > > - public void visit(EntityConditionVisitor visitor) { > > - visitor.acceptEntityConditionFunction(this, condition); > > + public void accept(EntityConditionVisitor visitor) { > > + visitor.visit(this); > > } > > @Override > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionList.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionList.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionList.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionList.java Sat Oct 13 19:50:27 2018 > > @@ -43,6 +43,6 @@ public class EntityConditionList<T exten > > @Override > > public void accept(EntityConditionVisitor visitor) { > > - visitor.acceptEntityConditionList(this); > > + visitor.visit(this); > > } > > } > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java Sat Oct 13 19:50:27 2018 > > @@ -61,11 +61,6 @@ public abstract class EntityConditionLis > > } > > @Override > > - public void visit(EntityConditionVisitor visitor) { > > - visitor.acceptEntityJoinOperator(operator, conditionList); > > - } > > - > > - @Override > > public boolean isEmpty() { > > return operator.isEmpty(conditionList); > > } > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionSubSelect.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionSubSelect.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionSubSelect.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionSubSelect.java Sat Oct 13 19:50:27 2018 > > @@ -146,11 +146,4 @@ public class EntityConditionSubSelect ex > > public void validateSql(ModelEntity modelEntity) throws GenericModelException { > > // do nothing for now > > } > > - > > - @Override > > - public void visit(EntityConditionVisitor visitor) { > > - if (whereCond != null) { > > - whereCond.visit(visitor); > > - } > > - } > > } > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionValue.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionValue.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionValue.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionValue.java Sat Oct 13 19:50:27 2018 > > @@ -45,11 +45,6 @@ public abstract class EntityConditionVal > > } > > @Override > > - public void accept(EntityConditionVisitor visitor) { > > - visitor.acceptEntityConditionValue(this); > > - } > > - > > - @Override > > public void addSqlValue(StringBuilder sql, Map<String, String> tableAliases, ModelEntity modelEntity, List<EntityConditionParam> entityConditionParams, boolean includeTableNamePrefix, Datasource datasourceinfo) { > > sql.append(value); > > } > > @@ -77,11 +72,6 @@ public abstract class EntityConditionVal > > @Override > > public void validateSql(org.apache.ofbiz.entity.model.ModelEntity modelEntity) { > > } > > - > > - @Override > > - public void visit(EntityConditionVisitor visitor) { > > - visitor.acceptObject(value); > > - } > > } > > public abstract ModelField getModelField(ModelEntity modelEntity); > > @@ -109,12 +99,6 @@ public abstract class EntityConditionVal > > public abstract EntityConditionValue freeze(); > > - public abstract void visit(EntityConditionVisitor visitor); > > - > > - public void accept(EntityConditionVisitor visitor) { > > - throw new IllegalArgumentException("accept not implemented"); > > - } > > - > > public void toString(StringBuilder sb) { > > addSqlValue(sb, null, new ArrayList<EntityConditionParam>(), false, null); > > } > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionVisitor.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionVisitor.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionVisitor.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionVisitor.java Sat Oct 13 19:50:27 2018 > > @@ -1,4 +1,4 @@ > > -/******************************************************************************* > > +/* > > * Licensed to the Apache Software Foundation (ASF) under one > > * or more contributor license agreements. See the NOTICE file > > * distributed with this work for additional information > > @@ -15,40 +15,139 @@ > > * KIND, either express or implied. See the License for the > > * specific language governing permissions and limitations > > * under the License. > > - *******************************************************************************/ > > - > > + */ > > package org.apache.ofbiz.entity.condition; > > -import java.util.List; > > - > > +// Keep the tests from EntityConditionVisitorTests in sync with the code examples. > > /** > > - * <p>Represents the conditions to be used to constrain a query.</p> > > - * <p>An EntityCondition can represent various type of constraints, including:</p> > > - * <ul> > > - * <li>EntityConditionList: a list of EntityConditions, combined with the operator specified > > - * <li>EntityExpr: for simple expressions or expressions that combine EntityConditions > > - * <li>EntityFieldMap: a map of fields where the field (key) equals the value, combined with the operator specified > > - * </ul> > > - * These can be used in various combinations using the EntityConditionList and EntityExpr objects. > > + * A visitor of entity conditions in the style of the visitor design pattern. > > + * <p> > > + * Classes implementing this interface can extend the dynamically dispatched > > + * behavior associated with {@link EntityCondition} without augmenting its > > + * interface. Those classes are meant be passed to the > > + * {@link EntityCondition#accept(EntityConditionVisitor) accept} method which > > + * calls the corresponding method in the visitor. > > + * <p> > > + * <b>Usage Examples:</b> > > + * Here is a dummy example that should print <i>EntityExpr\n</i> to > > + * the standard output. > > + * <pre>{@code > > + * EntityExpr expr; > > + * expr.accept(new EntityConditionVisitor() { > > + * public void visit(EntityConditionFunction func) { > > + * system.out.println("EntityConditionFunction"); > > + * } > > + * > > + * public <T extends EntityCondition> void visit(EntityConditionList<T> l) { > > + * system.out.println("EntityConditionList"); > > + * } > > + * > > + * public void visit(EntityFieldMap m) { > > + * system.out.println("EntityFieldMap"); > > + * } > > + * > > + * public void visit(EntityDateFilterCondition df) { > > + * system.out.println("EntityDateFilterCondition"); > > + * } > > + * > > + * public void visit(EntityExpr expr) { > > + * system.out.println("EntityExpr"); > > + * } > > + * > > + * public void visit(EntityWhereString ws) { > > + * system.out.println("EntityWhereString"); > > + * } > > + * }); > > + * }</pre> > > + * <p> > > + * Here is a more complex example asserting the presence of a raw string condition > > + * even when it is embedded inside another one. > > + * <pre>{@code > > + * class ContainsRawCondition implements EntityConditionVisitor { > > + * public boolean hasRawCondition = false; > > + * > > + * public void visit(EntityConditionFunction func) {} > > + * public void visit(EntityFieldMap m) {} > > + * public void visit(EntityDateFilterCondition df) {} > > * > > + * public <T extends EntityCondition> void visit(EntityConditionList<T> l) { > > + * Iterator<T> it = l.getConditionIterator(); > > + * while (it.hasNext()) { > > + * it.next().accept(this); > > + * } > > + * } > > + * > > + * public void visit(EntityExpr expr) { > > + * Object lhs = expr.getLhs(); > > + * Object rhs = expr.getRhs(); > > + * if (lhs instanceof EntityCondition) { > > + * ((EntityCondition) lhs).accept(this); > > + * } > > + * if (rhs instanceof EntityCondition) { > > + * ((EntityCondition) rhs).accept(this); > > + * } > > + * } > > + * > > + * public void visit(EntityWhereString ws) { > > + * hasRawCondition = true; > > + * } > > + * } > > + * > > + * EntityCondition ec = > > + * EntityCondition.makeCondition(EntityCondition.makeConditionWhere("foo=bar")); > > + * EntityConditionVisitor visitor = new ContainsRawCondition(); > > + * ec.accept(visitor); > > + * assert visitor.hasRawCondition; > > + * }</pre> > > + * > > + * @see EntityCondition > > */ > > public interface EntityConditionVisitor { > > - <T> void visit(T obj); > > - <T> void accept(T obj); > > - void acceptObject(Object obj); > > - void acceptEntityCondition(EntityCondition condition); > > - <T extends EntityCondition> void acceptEntityJoinOperator(EntityJoinOperator op, List<T> conditions); > > - <L,R,T> void acceptEntityOperator(EntityOperator<L, R, T> op, L lhs, R rhs); > > - <L,R> void acceptEntityComparisonOperator(EntityComparisonOperator<L, R> op, L lhs, R rhs); > > - void acceptEntityConditionValue(EntityConditionValue value); > > - void acceptEntityFieldValue(EntityFieldValue value); > > - > > - void acceptEntityExpr(EntityExpr expr); > > - <T extends EntityCondition> void acceptEntityConditionList(EntityConditionList<T> list); > > - void acceptEntityFieldMap(EntityFieldMap fieldMap); > > - void acceptEntityConditionFunction(EntityConditionFunction func, EntityCondition nested); > > - <T extends Comparable<?>> void acceptEntityFunction(EntityFunction<T> func); > > - void acceptEntityWhereString(EntityWhereString condition); > > + /** > > + * Visits an entity condition function. > > + * > > + * @param func the visited class > > + * @see EntityConditionFunction > > + */ > > + void visit(EntityConditionFunction func); > > + > > + /** > > + * Visits a list of entity conditions. > > + * > > + * @param l the visited class > > + * @see EntityConditionList > > + */ > > + <T extends EntityCondition> void visit(EntityConditionList<T> l); > > + > > + /** > > + * Visits a map of entity fields. > > + * > > + * @param m the visited class > > + * @see EntityFieldMap > > + */ > > + void visit(EntityFieldMap m); > > + > > + /** > > + * Visits a date filter condition. > > + * > > + * @param df the visited class > > + * @see EntityDateFilterCondition > > + */ > > + void visit(EntityDateFilterCondition df); > > + > > + /** > > + * Visits an entity expression. > > + * > > + * @param expr the visited class > > + * @see EntityExpr > > + */ > > + void visit(EntityExpr expr); > > - void acceptEntityDateFilterCondition(EntityDateFilterCondition condition); > > + /** > > + * Visits a raw string condition. > > + * > > + * @param ws the visited class > > + * @see EntityWhereString > > + */ > > + void visit(EntityWhereString ws); > > } > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityDateFilterCondition.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityDateFilterCondition.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityDateFilterCondition.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityDateFilterCondition.java Sat Oct 13 19:50:27 2018 > > @@ -82,13 +82,8 @@ public final class EntityDateFilterCondi > > } > > @Override > > - public void visit(EntityConditionVisitor visitor) { > > - visitor.acceptEntityDateFilterCondition(this); > > - } > > - > > - @Override > > public void accept(EntityConditionVisitor visitor) { > > - visitor.acceptEntityDateFilterCondition(this); > > + visitor.visit(this); > > } > > @Override > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java Sat Oct 13 19:50:27 2018 > > @@ -149,13 +149,8 @@ public final class EntityExpr extends En > > } > > @Override > > - public void visit(EntityConditionVisitor visitor) { > > - visitor.acceptEntityOperator(operator, lhs, rhs); > > - } > > - > > - @Override > > public void accept(EntityConditionVisitor visitor) { > > - visitor.acceptEntityExpr(this); > > + visitor.visit(this); > > } > > public void checkRhsType(ModelEntity modelEntity, Delegator delegator) { > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldMap.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldMap.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldMap.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldMap.java Sat Oct 13 19:50:27 2018 > > @@ -74,6 +74,6 @@ public final class EntityFieldMap extend > > @Override > > public void accept(EntityConditionVisitor visitor) { > > - visitor.acceptEntityFieldMap(this); > > + visitor.visit(this); > > } > > } > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldValue.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldValue.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldValue.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFieldValue.java Sat Oct 13 19:50:27 2018 > > @@ -199,16 +199,6 @@ public class EntityFieldValue extends En > > } > > @Override > > - public void visit(EntityConditionVisitor visitor) { > > - visitor.acceptEntityFieldValue(this); > > - } > > - > > - @Override > > - public void accept(EntityConditionVisitor visitor) { > > - visitor.acceptEntityFieldValue(this); > > - } > > - > > - @Override > > public EntityConditionValue freeze() { > > return this; > > } > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFunction.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFunction.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFunction.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityFunction.java Sat Oct 13 19:50:27 2018 > > @@ -201,20 +201,6 @@ public abstract class EntityFunction<T e > > } > > @Override > > - public void visit(EntityConditionVisitor visitor) { > > - if (nested != null) { > > - visitor.acceptEntityConditionValue(nested); > > - } else { > > - visitor.acceptObject(value); > > - } > > - } > > - > > - @Override > > - public void accept(EntityConditionVisitor visitor) { > > - visitor.acceptEntityFunction(this); > > - } > > - > > - @Override > > public ModelField getModelField(ModelEntity modelEntity) { > > if (nested != null) { > > return nested.getModelField(modelEntity); > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java Sat Oct 13 19:50:27 2018 > > @@ -96,20 +96,6 @@ public class EntityJoinOperator extends > > return EntityCondition.makeCondition(newList, this); > > } > > - public void visit(EntityConditionVisitor visitor, List<? extends EntityCondition> conditionList) { > > - if (UtilValidate.isNotEmpty(conditionList)) { > > - for (EntityCondition condition: conditionList) { > > - visitor.visit(condition); > > - } > > - } > > - } > > - > > - @Override > > - public void visit(EntityConditionVisitor visitor, EntityCondition lhs, EntityCondition rhs) { > > - lhs.visit(visitor); > > - visitor.visit(rhs); > > - } > > - > > public Boolean eval(GenericEntity entity, EntityCondition lhs, EntityCondition rhs) { > > return entityMatches(entity, lhs, rhs) ? Boolean.TRUE : Boolean.FALSE; > > } > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityOperator.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityOperator.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityOperator.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityOperator.java Sat Oct 13 19:50:27 2018 > > @@ -296,7 +296,6 @@ public abstract class EntityOperator<L, > > public abstract void addSqlValue(StringBuilder sql, ModelEntity entity, List<EntityConditionParam> entityConditionParams, boolean compat, L lhs, R rhs, Datasource datasourceInfo); > > public abstract EntityCondition freeze(L lhs, R rhs); > > - public abstract void visit(EntityConditionVisitor visitor, L lhs, R rhs); > > public static final Comparable<?> WILDCARD = new Comparable<Object>() { > > public int compareTo(Object obj) { > > > > Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityWhereString.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityWhereString.java?rev=1843780&r1=1843779&r2=1843780&view=diff > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityWhereString.java (original) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityWhereString.java Sat Oct 13 19:50:27 2018 > > @@ -82,8 +82,8 @@ public final class EntityWhereString ext > > } > > @Override > > - public void visit(EntityConditionVisitor visitor) { > > - visitor.acceptEntityWhereString(this); > > + public void accept(EntityConditionVisitor visitor) { > > + visitor.visit(this); > > } > > @Override > > > > Added: ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java > > URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java?rev=1843780&view=auto > > ============================================================================== > > --- ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java (added) > > +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java Sat Oct 13 19:50:27 2018 > > @@ -0,0 +1,128 @@ > > +/* > > + * Licensed to the Apache Software Foundation (ASF) under one > > + * or more contributor license agreements. See the NOTICE file > > + * distributed with this work for additional information > > + * regarding copyright ownership. The ASF licenses this file > > + * to you 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 org.apache.ofbiz.entity; > > + > > +import static org.junit.Assert.assertEquals; > > +import static org.junit.Assert.assertTrue; > > + > > +import java.io.ByteArrayOutputStream; > > +import java.io.OutputStream; > > +import java.io.PrintWriter; > > +import java.util.Iterator; > > + > > +import org.apache.ofbiz.entity.condition.EntityComparisonOperator; > > +import org.apache.ofbiz.entity.condition.EntityCondition; > > +import org.apache.ofbiz.entity.condition.EntityConditionFunction; > > +import org.apache.ofbiz.entity.condition.EntityConditionList; > > +import org.apache.ofbiz.entity.condition.EntityConditionVisitor; > > +import org.apache.ofbiz.entity.condition.EntityDateFilterCondition; > > +import org.apache.ofbiz.entity.condition.EntityExpr; > > +import org.apache.ofbiz.entity.condition.EntityFieldMap; > > +import org.apache.ofbiz.entity.condition.EntityWhereString; > > +import org.junit.Test; > > + > > +/* Tests adapted from code examples described in the javadoc of the > > + * EntityConditionVisitor interface. They should be kept in sync with > > + * those code examples. */ > > +public class EntityConditionVisitorTests { > > + > > + // Checks the dummy visitor example which must print "EntityExpr\n". > > + @Test > > + public void basicTest() { > > + EntityExpr expr = new EntityExpr("foo", EntityComparisonOperator.EQUALS, "bar"); > > + OutputStream os = new ByteArrayOutputStream(); > > + PrintWriter pw = new PrintWriter(os); > > + expr.accept(new EntityConditionVisitor() { > > + @Override > > + public void visit(EntityConditionFunction func) { > > + pw.println("EntityConditionFunction"); > > + } > > + > > + @Override > > + public <T extends EntityCondition> void visit(EntityConditionList<T> l) { > > + pw.println("EntityConditionList"); > > + } > > + > > + @Override > > + public void visit(EntityFieldMap m) { > > + pw.println("EntityFieldMap"); > > + } > > + > > + @Override > > + public void visit(EntityDateFilterCondition df) { > > + pw.println("EntityDateFilterConfition"); > > + } > > + > > + @Override > > + public void visit(EntityExpr expr) { > > + pw.println("EntityExpr"); > > + } > > + > > + @Override > > + public void visit(EntityWhereString ws) { > > + pw.println("EntityWhereString"); > > + } > > + }); > > + pw.flush(); > > + assertEquals("EntityExpr\n", os.toString()); > > + } > > + > > + /* Checks the more complex example which asserts the presence of a raw string > > + * condition even when it is embedded inside another one. */ > > + @Test > > + public void complexTest() { > > + class ContainsRawCondition implements EntityConditionVisitor { > > + public boolean hasRawCondition = false; > > + > > + @Override public void visit(EntityConditionFunction func) {} > > + @Override public void visit(EntityFieldMap m) {} > > + @Override public void visit(EntityDateFilterCondition df) {} > > + > > + @Override > > + public <T extends EntityCondition> void visit(EntityConditionList<T> l) { > > + Iterator<T> it = l.getConditionIterator(); > > + while (it.hasNext()) { > > + it.next().accept(this); > > + } > > + } > > + > > + @Override > > + public void visit(EntityExpr expr) { > > + Object lhs = expr.getLhs(); > > + Object rhs = expr.getRhs(); > > + if (lhs instanceof EntityCondition) { > > + ((EntityCondition) lhs).accept(this); > > + } > > + if (rhs instanceof EntityCondition) { > > + ((EntityCondition) rhs).accept(this); > > + } > > + } > > + > > + @Override > > + public void visit(EntityWhereString ws) { > > + hasRawCondition = true; > > + } > > + } > > + > > + EntityCondition ec = EntityCondition.makeCondition(EntityCondition.makeConditionWhere("foo=bar")); > > + ContainsRawCondition visitor = new ContainsRawCondition(); > > + ec.accept(visitor); > > + assertTrue(visitor.hasRawCondition); > > + } > > +} > > > > Propchange: ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java > > ------------------------------------------------------------------------------ > > svn:eol-style = native > > > > Propchange: ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java > > ------------------------------------------------------------------------------ > > svn:keywords = Date Rev Author URL Id > > > > Propchange: ofbiz/ofbiz-framework/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/EntityConditionVisitorTests.java > > ------------------------------------------------------------------------------ > > svn:mime-type = text/plain > > > > > > > > |
Free forum by Nabble | Edit this page |