[Buix-commits] r1262 - in jaxx/trunk/jaxx-runtime-validator/src: main/java/jaxx/runtime/validator/field test/java/jaxx/runtime/validator test/java/jaxx/runtime/validator/field
Author: tchemit Date: 2009-03-10 22:57:22 +0000 (Tue, 10 Mar 2009) New Revision: 1262 Modified: jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidator.java jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/ValidatorBean.java jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidatorTest.java Log: improve CollectionUniqueKeyValidator Modified: jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidator.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidator.java 2009-03-09 00:39:23 UTC (rev 1261) +++ jaxx/trunk/jaxx-runtime-validator/src/main/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidator.java 2009-03-10 22:57:22 UTC (rev 1262) @@ -18,8 +18,8 @@ */ public class CollectionUniqueKeyValidator extends FieldExpressionValidator { + public enum Mode { - public enum Mode { /** au moins une entrée de la collection doit etre valide */ AT_LEAST_ONE, /** exactement une entrée dela collection doit être valide */ @@ -29,17 +29,36 @@ /** aucune valeur de la collection doivent etre valides */ NONE } - /** * la liste des propriétés d'une entrée de la collection qui définit la * clef unique. */ protected String[] keys; + /** + * Une propriété optionnelle pour valider que l'objet reflétée par cette + * propriété ne viole pas l'intégrité de la clef unique. + * Cela permet de valider l'unicité sans que l'objet soit dans la collection + */ + protected String againstProperty; + /** + * Lors de l'utilisation de la againstProperty et qu'un ne peut pas utiliser + * le equals sur l'objet, on peut spécifier une expression pour exclure des tests + * à exclure lors de la recherche de la violation de clef unique. + */ + protected String againstIndexExpression; public String[] getKeys() { return keys; } + public String getAgainstProperty() { + return againstProperty; + } + + public String getAgainstIndexExpression() { + return againstIndexExpression; + } + public void setKeys(String[] keys) { if (keys != null && keys.length == 1 && keys[0].indexOf(",") != -1) { this.keys = keys[0].split(","); @@ -48,6 +67,14 @@ } } + public void setAgainstProperty(String againstProperty) { + this.againstProperty = againstProperty; + } + + public void setAgainstIndexExpression(String againstIndexExpression) { + this.againstIndexExpression = againstIndexExpression; + } + @Override public void validate(Object object) throws ValidationException { @@ -59,26 +86,55 @@ Collection<?> col = getCollection(object); - if (col.size() < 2) { + Object againstBean = againstProperty == null ? null : getFieldValue(againstProperty, object); + + Integer againstIndex = (Integer) (againstIndexExpression == null ? -1 : getFieldValue(againstIndexExpression, object)); + if (againstIndex == null) { + againstIndex = -1; + } + if (againstBean == null && col.size() < 2) { // la liste ne contient pas deux entrées donc c'est valide return; } boolean answer = true; + Integer againstHashCode = againstBean == null ? null : getUniqueKeyHashCode(againstBean); + List<Integer> hashCodes = new ArrayList<Integer>(); + int index = 0; for (Object o : col) { Integer hash = getUniqueKeyHashCode(o); - if (hashCodes.contains(hash)) { - // on a deja rencontre cette clef unique, - // donc la validation a echouee - answer = false; - break; + if (againstBean == null) { + if (hashCodes.contains(hash)) { + // on a deja rencontre cette clef unique, + // donc la validation a echouee + answer = false; + break; + } + } else { + // utilisation de againstBean + if (againstIndex != -1) { + if (index != againstIndex && hash.equals(againstHashCode)) { + // on a deja rencontre cette clef unique, + // donc la validation a echouee + answer = false; + break; + } + } else { + if (!againstBean.equals(o) && hash.equals(againstHashCode)) { + // on a deja rencontre cette clef unique, + // donc la validation a echouee + answer = false; + break; + } + } } - // nouveau hashcode enregistre hashCodes.add(hash); + // index suivant + index++; } if (!answer) { @@ -137,5 +193,4 @@ public String getValidatorType() { return "collectionUniqueKey"; } - } \ No newline at end of file Modified: jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/ValidatorBean.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/ValidatorBean.java 2009-03-09 00:39:23 UTC (rev 1261) +++ jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/ValidatorBean.java 2009-03-10 22:57:22 UTC (rev 1262) @@ -59,6 +59,8 @@ protected String stringValue; + protected ValidatorBeanEntry entry; + PropertyChangeSupport p; public ValidatorBean() { @@ -101,6 +103,10 @@ return notExistingDirectory; } + public ValidatorBeanEntry getEntry() { + return entry; + } + public Collection<ValidatorBeanEntry> getEntries() { return entries; } @@ -142,4 +148,11 @@ p.firePropertyChange("entries", null, entries); } + public void setEntry(ValidatorBeanEntry entry) { + this.entry = entry; + p.firePropertyChange("entry", null, entry); + } + + + } \ No newline at end of file Modified: jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidatorTest.java =================================================================== --- jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidatorTest.java 2009-03-09 00:39:23 UTC (rev 1261) +++ jaxx/trunk/jaxx-runtime-validator/src/test/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidatorTest.java 2009-03-10 22:57:22 UTC (rev 1262) @@ -21,6 +21,7 @@ assertFieldInError("entries", "collectionUniqueKey.two.failed", false); assertFieldInError("entries", "collectionUniqueKey.three.failed", false); assertFieldInError("entries", "collectionUniqueKey.four.failed", false); + assertFieldInError("entries", "collectionUniqueKey.five.failed", false); // add a entry bean.setEntries(Arrays.asList(beanEntry)); @@ -29,7 +30,17 @@ assertFieldInError("entries", "collectionUniqueKey.two.failed", false); assertFieldInError("entries", "collectionUniqueKey.three.failed", false); assertFieldInError("entries", "collectionUniqueKey.four.failed", false); + assertFieldInError("entries", "collectionUniqueKey.five.failed", false); + // add violating property + bean.setEntry(beanEntry3); + assertFieldInError("entries", "collectionUniqueKey.one.failed", false); + assertFieldInError("entries", "collectionUniqueKey.two.failed", false); + assertFieldInError("entries", "collectionUniqueKey.three.failed", false); + assertFieldInError("entries", "collectionUniqueKey.four.failed", false); + assertFieldInError("entries", "collectionUniqueKey.five.failed", true); + + // two entries with same key bean.setEntries(Arrays.asList(beanEntry, beanEntry));
participants (1)
-
tchemit@users.labs.libre-entreprise.org