2042 |
aurelien |
1 |
package org.tela_botanica.client.util;
|
|
|
2 |
|
|
|
3 |
import java.util.HashMap;
|
|
|
4 |
|
|
|
5 |
import com.google.gwt.json.client.JSONArray;
|
|
|
6 |
import com.google.gwt.json.client.JSONObject;
|
|
|
7 |
import com.google.gwt.user.client.Window;
|
|
|
8 |
import com.gwtext.client.data.Node;
|
|
|
9 |
import com.gwtext.client.data.Tree;
|
|
|
10 |
import com.gwtext.client.widgets.tree.TreeNode;
|
|
|
11 |
|
|
|
12 |
public class MotsClesUtilitaire {
|
|
|
13 |
|
|
|
14 |
//TODO rassembler tout ce qui construit les arbres de mots clés ici
|
2062 |
aurelien |
15 |
private static String[] caracteresInterdits = {"\\", "/", ","};
|
2042 |
aurelien |
16 |
|
|
|
17 |
public static String obtenirCheminParent(String cheminMotCle, String motCle) {
|
2150 |
mathias |
18 |
return cheminMotCle.substring(0, cheminMotCle.length() - motCle.length() -1).toLowerCase();
|
2042 |
aurelien |
19 |
}
|
|
|
20 |
|
|
|
21 |
public static Object[] construireArbre(String NomRacine, String idRacine,
|
2062 |
aurelien |
22 |
JSONArray arbreJson, boolean afficherCheckbox) {
|
2042 |
aurelien |
23 |
|
|
|
24 |
Tree arbreMotsCles = new Tree() ;
|
|
|
25 |
HashMap<String, String> motsCles = new HashMap<String, String>(0);
|
|
|
26 |
HashMap<String, String> parentes = new HashMap<String, String>();
|
|
|
27 |
|
|
|
28 |
final int taillemax = arbreJson.size();
|
|
|
29 |
|
|
|
30 |
// on crée un arbre vide
|
|
|
31 |
TreeNode root = new TreeNode();
|
|
|
32 |
root.setId(idRacine);
|
|
|
33 |
root.setText(NomRacine);
|
|
|
34 |
String[] usObjRacine = {NomRacine, idRacine};
|
|
|
35 |
root.setUserObject(usObjRacine);
|
|
|
36 |
arbreMotsCles.setRootNode(root);
|
|
|
37 |
|
|
|
38 |
// le mot clé racine possède le chemin racine ("/")
|
|
|
39 |
parentes.put("/", idRacine);
|
|
|
40 |
|
|
|
41 |
// pour chacun des élements du tableau
|
|
|
42 |
for (int j = 0; j < taillemax; j++) {
|
|
|
43 |
// on extrait les élements du tableau
|
|
|
44 |
if (arbreJson.get(j).isObject() != null) {
|
|
|
45 |
JSONObject noeud = (JSONObject) arbreJson.get(j);
|
|
|
46 |
|
|
|
47 |
String idMotCle = noeud.get("id_mot_cle")
|
|
|
48 |
.isString().stringValue();
|
|
|
49 |
String motCle = noeud.get("mot_cle").isString()
|
|
|
50 |
.stringValue();
|
2150 |
mathias |
51 |
|
|
|
52 |
// le chemin est mis en minuscule afin de fusionner toutes
|
|
|
53 |
// la variantes minuscules majuscule d'un mot clé
|
|
|
54 |
// qui peuvent poser problème
|
2042 |
aurelien |
55 |
String chemin = noeud.get("chemin").isString()
|
2150 |
mathias |
56 |
.stringValue().toLowerCase();
|
2042 |
aurelien |
57 |
|
|
|
58 |
String cheminParent = MotsClesUtilitaire.obtenirCheminParent(chemin, motCle);
|
|
|
59 |
String parent = parentes.get(cheminParent);
|
|
|
60 |
|
|
|
61 |
String[] usObj = {motCle, idMotCle};
|
|
|
62 |
|
|
|
63 |
// et on construit l'arbre en ajoutant les noeuds un à un (qui sont renvoyés
|
|
|
64 |
// dans l'ordre hierarchique de leur niveau
|
|
|
65 |
// ce qui permet de les traiter séquentiellement)
|
|
|
66 |
TreeNode node = new TreeNode();
|
|
|
67 |
node.setId(idMotCle);
|
|
|
68 |
node.setText(motCle);
|
2062 |
aurelien |
69 |
if(afficherCheckbox) {
|
|
|
70 |
node.setChecked(false);
|
|
|
71 |
}
|
2150 |
mathias |
72 |
|
2042 |
aurelien |
73 |
Node parentNode = arbreMotsCles.getNodeById(parent);
|
|
|
74 |
node.setUserObject(usObj);
|
|
|
75 |
parentNode.appendChild(node);
|
|
|
76 |
|
|
|
77 |
parentes.put(chemin, idMotCle);
|
|
|
78 |
motsCles.put(idMotCle, motCle);
|
|
|
79 |
}
|
|
|
80 |
}
|
|
|
81 |
Object[] retour = {arbreMotsCles, motsCles};
|
|
|
82 |
return retour;
|
|
|
83 |
}
|
|
|
84 |
|
|
|
85 |
/**
|
|
|
86 |
* Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un
|
|
|
87 |
* copie du sous arbre du premier noeud, qu'elle concatène au deuxième
|
|
|
88 |
*
|
|
|
89 |
* @param ndPereOriginal
|
|
|
90 |
* le père des noeuds de l'arbre original
|
|
|
91 |
* @param ndPereCopie
|
|
|
92 |
* le père qui va recevoir les copies
|
|
|
93 |
*/
|
2062 |
aurelien |
94 |
public static void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie, boolean afficherCheckbox) {
|
2042 |
aurelien |
95 |
if (ndPereCopie != null && ndPereOriginal != null) {
|
|
|
96 |
Node[] ndNodeFils = ndPereOriginal.getChildNodes();
|
|
|
97 |
|
|
|
98 |
for (int i = 0; i < ndNodeFils.length; i++) {
|
|
|
99 |
|
|
|
100 |
String[] usObj = (String[]) ndNodeFils[i].getUserObject();
|
|
|
101 |
TreeNode child = new TreeNode(usObj[0]);
|
|
|
102 |
child.setId(usObj[1]);
|
2062 |
aurelien |
103 |
if(afficherCheckbox) {
|
|
|
104 |
child.setChecked(false);
|
|
|
105 |
}
|
2042 |
aurelien |
106 |
child.setUserObject(usObj);
|
|
|
107 |
ndPereCopie.appendChild(child);
|
|
|
108 |
|
|
|
109 |
if (!ndNodeFils[i].isLeaf()) {
|
2062 |
aurelien |
110 |
copierFilsNoeud(ndNodeFils[i], child, afficherCheckbox);
|
2042 |
aurelien |
111 |
}
|
|
|
112 |
}
|
|
|
113 |
}
|
|
|
114 |
}
|
2062 |
aurelien |
115 |
|
|
|
116 |
public static TreeNode ajouterNoeud(TreeNode parent, boolean afficherCheckbox) {
|
|
|
117 |
// on crée un nouveau noeud vide
|
|
|
118 |
TreeNode nd = new TreeNode("");
|
|
|
119 |
nd.setCls("x-view-treenode-keyword");
|
|
|
120 |
|
|
|
121 |
if(afficherCheckbox) {
|
|
|
122 |
nd.setChecked(true);
|
|
|
123 |
}
|
|
|
124 |
|
|
|
125 |
// on associe un objet au noeud qui contient des infos
|
|
|
126 |
String[] usObject = new String[2];
|
|
|
127 |
// l'objet contient le nom du noeud
|
|
|
128 |
usObject[0] = "";
|
|
|
129 |
usObject[1] = "";
|
|
|
130 |
nd.setUserObject(usObject);
|
|
|
131 |
|
|
|
132 |
String cheminTemporaireAjout = parent.getPath()+"/"+nd.getId();
|
|
|
133 |
nd.setId(cheminTemporaireAjout);
|
|
|
134 |
|
|
|
135 |
return nd;
|
|
|
136 |
}
|
|
|
137 |
|
|
|
138 |
public static String getChaineCaracteresInterdits() {
|
|
|
139 |
String interdits = "";
|
|
|
140 |
for (int i = 0; i < MotsClesUtilitaire.caracteresInterdits.length; i++) {
|
|
|
141 |
interdits += MotsClesUtilitaire.caracteresInterdits[i]+" ";
|
|
|
142 |
}
|
|
|
143 |
return interdits;
|
|
|
144 |
}
|
|
|
145 |
|
|
|
146 |
public static boolean estUnMotCleAutorise(String motCle) {
|
|
|
147 |
boolean valide = !motCle.trim().isEmpty();
|
|
|
148 |
for (int i = 0; i < MotsClesUtilitaire.caracteresInterdits.length; i++) {
|
|
|
149 |
if(motCle.indexOf(MotsClesUtilitaire.caracteresInterdits[i]) != -1) {
|
|
|
150 |
valide = false;
|
|
|
151 |
break;
|
|
|
152 |
}
|
|
|
153 |
}
|
|
|
154 |
return valide;
|
|
|
155 |
}
|
2042 |
aurelien |
156 |
}
|