From bpoussin@users.nuiton.org Wed Mar 7 19:42:05 2012 From: bpoussin@users.nuiton.org To: wikitty-commits@list.nuiton.org Subject: [Wikitty-commits] r1446 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query Date: Wed, 07 Mar 2012 19:42:05 +0100 Message-ID: <20120307184205.35EFF5A78C@nuiton.codelutin.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8000114448269676287==" --===============8000114448269676287== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Author: bpoussin Date: 2012-03-07 19:42:05 +0100 (Wed, 07 Mar 2012) New Revision: 1446 Url: http://nuiton.org/repositories/revision/wikitty/1446 Log: synchronisation de la map d'alias pour eviter les problemes de parsing Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParse= r.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQue= ryParser.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryPars= er.java 2012-03-07 18:17:46 UTC (rev 1445) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryPars= er.java 2012-03-07 18:42:05 UTC (rev 1446) @@ -24,6 +24,7 @@ */ package org.nuiton.wikitty.query; =20 +import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -71,7 +72,9 @@ =20 /** * Cette classe permet d'interpreter une requete faite textuellement en la - * convertisant en sa representation objet. + * convertisant en sa representation objet. Si l'objet est instancier pour + * utiliser les fonctionnalites d'alias, il est possible de l'utiliser dans + * plusieurs thread concurent. La map d'alias est protegee. * * Pour plus d'information reportez-vous =C3=A0 la * document= ation @@ -154,20 +157,45 @@ return true; } =20 + /** + * Retourne une vue non modifiable des alias disponibles. + * @return + */ public Map getAlias() { - return alias; + return Collections.unmodifiableMap(alias); } =20 + /** + * Modifie l'ensemble des alias, la map passee en parametre est copiee en + * interne. + * @param alias la map des alias qui sera copiee + * @return le WikittyQueryParser lui meme (this) + */ public WikittyQueryParser setAlias(Map alias) { - this.alias =3D alias; + // on passe par la creation d'une nouvelle map, pour eviter que l'ut= ilisateur + // ne puisse modifier les alias depuis l'exterieur et eviter le plus + // possible les synchronize + this.alias =3D new LinkedHashMap(); + if (alias !=3D null) { + this.alias.putAll(alias); + } return this; } =20 public WikittyQueryParser addAlias(String aliasName, String aliasValue) { - alias.put(aliasName, aliasValue); + synchronized(alias) { + alias.put(aliasName, aliasValue); + } return this; } =20 + public WikittyQueryParser clearAlias() { + // on passe par la creation d'une nouvelle map, pour eviter le plus + // possible les synchronize + this.alias =3D new LinkedHashMap(); + return this; + } + /** * Parse query and use alias added with {@link #addAlias} or {@link #set= Alias} * @@ -200,9 +228,16 @@ static public WikittyQuery parse(String queryString, Map= alias) { if (alias !=3D null) { String queryStringInit =3D queryString; - // first replace alias in queryString - for (Map.Entry a : alias.entrySet()) { - queryString =3D queryString.replaceAll(a.getKey(), a.getValu= e()); + // on synchronise l'utilisation de la map, pour etre sur qu'il n= 'y + // ait pas d'ajout/modif durant son utilisation pour le remplace= ment + // on fait direcement les remplacements de la requete car, c'est + // le seul endroit ou l'alias est utilise, et c'est aussi rapide + // que de faire une copie de la map + synchronized(alias) { + // first replace alias in queryString + for (Map.Entry a : alias.entrySet()) { + queryString =3D queryString.replaceAll(a.getKey(), a.get= Value()); + } } if (log.isDebugEnabled()) { log.debug(String.format("QueryString \n'%s' become after ali= as \n'%s'\naliases are %s", --===============8000114448269676287==--