Author: bpoussin Date: 2012-04-06 17:00:42 +0200 (Fri, 06 Apr 2012) New Revision: 1469 Url: http://nuiton.org/repositories/revision/wikitty/1469 Log: au lieu de retourner faux, retourne vrai pour l'instant si on a une contrainte allowed non verifier, et un message de warn est affiche a la place Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java 2012-04-06 10:00:12 UTC (rev 1468) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java 2012-04-06 15:00:42 UTC (rev 1469) @@ -35,6 +35,7 @@ import java.util.Set; import java.util.regex.Pattern; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.ListUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.wikitty.WikittyClient; @@ -202,11 +203,10 @@ */ protected boolean isAllowedWikitty(String fqfield, FieldType field, Collection<String> ids, Collection<String> errors) { - boolean result = false; - if (CollectionUtils.isEmpty(ids)) { - // si la liste est vide, alors on sait que la valeur est autorisee - result = true; - } else { + boolean result = true; + // par defaut s'il n'y a rien a verifier le resultat est vrai + if (!CollectionUtils.isEmpty(ids)) { + // creation de la requete qui ramene tous les ids d'objets autorisé WikittyQuery q = null; if (field.hasAllowedQuery()) { // construire les requetes @@ -220,43 +220,89 @@ q = maker.end(); } - List<String> allowed = null; + List<String> unallowed = null; + // si il y a une requete qui contraint ... if (q != null) { - q.setOffset(0); - q.setLimit(WikittyQuery.MAX); + // ... on lui ajoute la liste des ids qu'a le champs comme valeur + // et le resultat doit etre identique a cette liste. + // sinon cela veut dire que certain id du champs ne sont pas + // dans les valeurs acceptables + WikittyQuery checkQuery = new WikittyQueryMaker().and() + .condition(q.getCondition()) + .containsOne(Element.ID, ids).end() + .setOffset(0).setLimit(WikittyQuery.MAX); + WikittyQueryResult<String> queryResult = + ws.findAllByQuery(token, Collections.singletonList(checkQuery)).get(0); + List<String> idResult = queryResult.getAll(); - WikittyQuery wq = new WikittyQueryMaker().containsOne(Element.ID, ids).end(); - wq.setOffset(0); - wq.setLimit(WikittyQuery.MAX); - - List<WikittyQueryResult<String>> queryResult = - ws.findAllByQuery(token, Arrays.asList(q, wq)); - allowed = queryResult.get(0).getAll(); - List<String> findedIds = queryResult.get(1).getAll(); - - // on ne check que sur les ids trouve dans la base et on espere - // que les autres sont bon :). En fait, lorsqu'on store plusieurs - // wikitties en meme temps donc un wikitty qui doit etre la valeur - // d'un champs d'un autre. Celui ci n'est pas retrouvable dans la - // base et donc on ne peut pas verifier facilement la contrainte. - // Pour l'instant on ne fait rien, car les solutions seraient trop - // couteuse (creeer un storage in memory y mettre les objets a - // checker, faire le check en requetant le vrai repo et le in memory - // si tout va bien faire le store reel sur le vrai repo. - result = allowed.containsAll(findedIds); - if (log.isDebugEnabled() && findedIds.size() != ids.size()) { + result = idResult.size() == ids.size(); + if (!result) { + unallowed = ListUtils.removeAll(ids, idResult); + } + if (log.isDebugEnabled() && !result) { log.debug(String.format( - "For field '%s' allowed contraint not checked for: %s", - fqfield, CollectionUtils.disjunction(findedIds, ids))); + "For field '%s' allowed contraint not checked for: %s (ids=%s, idResult=%s)(request=%s)", + fqfield, unallowed, ids, idResult, queryResult.getQueryString())); } + } + +// List<String> allowed = null; +// if (q != null) { +// q.setOffset(0); +// q.setLimit(WikittyQuery.MAX); +// +// WikittyQuery wq = new WikittyQueryMaker().containsOne(Element.ID, ids).end(); +// wq.setOffset(0); +// wq.setLimit(WikittyQuery.MAX); +// +// List<WikittyQueryResult<String>> queryResult = +// ws.findAllByQuery(token, Arrays.asList(q, wq)); +// allowed = queryResult.get(0).getAll(); +// List<String> findedIds = queryResult.get(1).getAll(); +// +// // on ne check que sur les ids trouve dans la base et on espere +// // que les autres sont bon :). En fait, lorsqu'on store plusieurs +// // wikitties en meme temps donc un wikitty qui doit etre la valeur +// // d'un champs d'un autre. Celui ci n'est pas retrouvable dans la +// // base et donc on ne peut pas verifier facilement la contrainte. +// // Pour l'instant on ne fait rien, car les solutions seraient trop +// // couteuse (creeer un storage in memory y mettre les objets a +// // checker, faire le check en requetant le vrai repo et le in memory +// // si tout va bien faire le store reel sur le vrai repo. +// result = allowed.containsAll(findedIds); +// if (log.isDebugEnabled() && findedIds.size() != ids.size()) { +// log.debug(String.format( +// "For field '%s' allowed contraint not checked for: %s", +// fqfield, CollectionUtils.disjunction(findedIds, ids))); +// } +// } + if (errors != null && !result) { errors.add(String.format( - "Field '%s' contains unallowed Wikitty values %s allowed %s", - fqfield, ids, allowed)); + "Field '%s' contains unallowed Wikitty values %s", + fqfield, unallowed)); } + + + // FIXME poussin 20120406: on ne peut pas garantir cette contrainte + // actuellement car l'objet qui est mis dan le champs a checker peut + // aussi etre un objet en cours de stockage. Donc pour l'instant on ne + // leve pas d'erreur, mais on mes un warn dans les logs. + // + // Une solution serait de creeer un storage in memory y mettre les + // objets a checker, faire le check en requetant le vrai repo et sur + // les ids en erreur refaire la meme requete sur le in memory + if (!result) { + result = true; + log.warn(String.format( + "Field '%s' contains unallowed Wikitty values %s", + fqfield, unallowed)); + } + // FIN du FIXME } + return result; }