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="===============6615543165054709244=="
--===============6615543165054709244==
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",
--===============6615543165054709244==--