Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 28 | Rev 31 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7 aperonnet 1
package org.tela_botanica.client.image;
2
 
25 aperonnet 3
import java.util.HashMap;
16 aperonnet 4
import java.util.Iterator;
5
 
7 aperonnet 6
import org.tela_botanica.client.interfaces.Rafraichissable;
19 aperonnet 7
import org.tela_botanica.client.modeles.ImageAsynchroneDAO;
16 aperonnet 8
import org.tela_botanica.client.modeles.ImageCarnet;
12 aperonnet 9
import org.tela_botanica.client.modeles.ImageUploaderAsynchroneDAO;
19 aperonnet 10
import org.tela_botanica.client.modeles.ListeImageCarnet;
7 aperonnet 11
import org.tela_botanica.client.modeles.ListeImageAsynchroneDAO;
28 aperonnet 12
import org.tela_botanica.client.modeles.MotsClesAsynchroneDAO;
7 aperonnet 13
 
30 aperonnet 14
import com.google.gwt.json.client.JSONArray;
15
import com.google.gwt.json.client.JSONObject;
20 aperonnet 16
import com.gwtext.client.data.ArrayReader;
17
import com.gwtext.client.data.FieldDef;
18
import com.gwtext.client.data.IntegerFieldDef;
19
import com.gwtext.client.data.MemoryProxy;
25 aperonnet 20
import com.gwtext.client.data.Node;
28 aperonnet 21
import com.gwtext.client.data.NodeTraversalCallback;
20 aperonnet 22
import com.gwtext.client.data.RecordDef;
23
import com.gwtext.client.data.Store;
24
import com.gwtext.client.data.StringFieldDef;
28 aperonnet 25
import com.gwtext.client.data.Tree;
25 aperonnet 26
import com.gwtext.client.widgets.tree.TreeNode;
20 aperonnet 27
 
12 aperonnet 28
/**
29
 * Modèle d'accès aux données pour les images.
30
 * C'est un singleton
31
 * @author aurelien
32
 *
33
 */
20 aperonnet 34
public class ImageModele implements Rafraichissable {
7 aperonnet 35
 
12 aperonnet 36
	private static boolean estInstancie = false ;
37
 
7 aperonnet 38
	private ImageMediateur iMediateur = null ;
39
 
19 aperonnet 40
	private ListeImageCarnet cacheImage = new ListeImageCarnet(0) ;
16 aperonnet 41
 
28 aperonnet 42
	private HashMap motsCles = new HashMap(0) ;
25 aperonnet 43
 
20 aperonnet 44
	private Store st = null ;
45
 
30 aperonnet 46
	private com.gwtext.client.data.Tree arbreMotsCles =  new Tree() ;
25 aperonnet 47
 
12 aperonnet 48
	static ImageModele Instance(ImageMediateur im)
49
	{
50
		if(!estInstancie)
51
		{
52
			return new ImageModele(im);
53
		}
54
		else
55
		{
56
			return null ;
57
		}
58
	}
59
 
60
	private ImageModele(ImageMediateur im) {
7 aperonnet 61
 
62
		iMediateur = im ;
63
	}
64
 
18 aperonnet 65
	public ImageMediateur getIMediateur()
66
	{
67
		return iMediateur ;
68
	}
69
 
30 aperonnet 70
	/**
71
	 * Appelle le DAO asynchrone pour obtenir la liste des images
72
	 * @param r le rafraichissable auxquel on enverra les données
73
	 */
7 aperonnet 74
	public void obtenirPhotoGalerie(Rafraichissable r)
75
	{
76
		ListeImageAsynchroneDAO liaDAO = new ListeImageAsynchroneDAO();
20 aperonnet 77
		liaDAO.ObtenirListeImages(this);
7 aperonnet 78
	}
12 aperonnet 79
 
30 aperonnet 80
	/**
81
	 * Appelle le DAO d'upload qui va choisir la methode d'upload adaptée
82
	 * et lancer l'interface appropriée
83
	 */
12 aperonnet 84
	public void uploaderImages()
85
	{
18 aperonnet 86
		ImageUploaderAsynchroneDAO IuADaO = new ImageUploaderAsynchroneDAO() ;
87
		IuADaO.setIMediateur(getIMediateur());
88
		IuADaO.choisirMethodeUpload() ;
12 aperonnet 89
	}
16 aperonnet 90
 
30 aperonnet 91
	/**
92
	 * Met à jour la liste des images à partir d'un objet
93
	 * @param o la nouvelle liste d'image
94
	 */
16 aperonnet 95
	public void rafraichirListeImage(Object o)
96
	{
19 aperonnet 97
		cacheImage = (ListeImageCarnet)o ;
16 aperonnet 98
	}
99
 
30 aperonnet 100
	/**
101
	 * Met à jour l'arbre des mots clés à partir d'un objet
102
	 * @param o le nouvel arbre de mots clés
103
	 */
25 aperonnet 104
	public void rafraichirArbreMotsCles(Object o)
105
	{
28 aperonnet 106
		arbreMotsCles = (com.gwtext.client.data.Tree)o ;
25 aperonnet 107
	}
108
 
30 aperonnet 109
	/**
110
	 * Met à jour la table de correspondance mots clés / ids
111
	 * à partir d'un objet
112
	 * @param o la nouvelle table des mots clés
113
	 */
25 aperonnet 114
	public void rafraichirMotsCles(Object o)
115
	{
28 aperonnet 116
		motsCles = (HashMap)o ;
25 aperonnet 117
	}
118
 
30 aperonnet 119
	/**
120
	 * Va chercher les métadonnées associées à une image dans la liste
121
	 * des images chargée dans le modèle
122
	 * @param r le rafraichissable auquel on enverra les informations
123
	 * @param id l'identifiant de l'image
124
	 */
16 aperonnet 125
	public void obtenirMetadonnees(Rafraichissable r, String id)
30 aperonnet 126
	{
25 aperonnet 127
		ImageCarnet im = (ImageCarnet)cacheImage.get(id) ;
16 aperonnet 128
 
30 aperonnet 129
		Object meta[] = new Object[3] ;
130
		meta[0] = im.getMetadonnesExif() ;
131
		meta[1] = im.getMetadonnesIptc() ;
132
		meta[2] = im.getInfoGenerales() ;
133
 
134
		r.rafraichir(meta,false) ;
16 aperonnet 135
	}
18 aperonnet 136
 
30 aperonnet 137
	/**
138
	 * Va chercher les mots clés associés à une image dans la liste
139
	 * des images chargée dans le modèle
140
	 * @param r le rafraichissable auquel on enverra les informations
141
	 * @param id l'identifiant de l'image
142
	 */
25 aperonnet 143
	public void obtenirMotsClesId(Rafraichissable r, String id)
30 aperonnet 144
	{
25 aperonnet 145
		ImageCarnet im = (ImageCarnet)cacheImage.get(id) ;
146
		String motsClesId = im.getMotsCles() ;
147
		String[] motsClesIdTab = motsClesId.split(",") ;
148
 
149
		r.rafraichir(motsClesIdTab, false) ;
150
	}
151
 
30 aperonnet 152
	/**
153
	 * Met à jour la liste des images en local et appelle le DAO de mise
154
	 * à jour pour les commentaires et la date des images selectionnées
155
	 * @param commentaires le commentaire à appliquer
156
	 * @param date la date à appliquer
157
	 * @param ids les identifiants des images selectionnées
158
	 */
18 aperonnet 159
	public void mettreAJourCacheImage(String commentaires, String date, String ids[])
160
	{
25 aperonnet 161
			for (int i = 0; i < ids.length; i++)
162
			{
18 aperonnet 163
				String key = ids[i] ;
164
				ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;
165
				ic.miseAJourInfoGenerales(commentaires, date) ;
28 aperonnet 166
				mettreAjourBaseDeDonneesImageCarnet(ic) ;
18 aperonnet 167
			}
168
	}
19 aperonnet 169
 
30 aperonnet 170
	/**
171
	 * Ajoute un nouveau mot clés à la liste des mots clés locale
172
	 * @param text le mot clé
173
	 * @param id l'identifiant du mot clé
174
	 */
25 aperonnet 175
	public void mettreAjourMotsClesId(String text, String id)
176
	{
28 aperonnet 177
				 motsCles.put(id, text) ;
25 aperonnet 178
	}
179
 
30 aperonnet 180
	/**
181
	 * Appelle le DAO chargé de mettre à jour la base de données avec
182
	 * les toutes les informations des images modifiées par l'utilisateur
183
	 */
28 aperonnet 184
	public void mettreAJourBaseDeDonneesListeImageCarnet()
185
	{
19 aperonnet 186
		ListeImageAsynchroneDAO liDaO = new ListeImageAsynchroneDAO();
187
		liDaO.setIMediateur(iMediateur);
188
 
189
		liDaO.SynchroniserBaseDeDonnees(cacheImage);
190
	}
191
 
30 aperonnet 192
	/**
193
	 * Appelle le DAO chargé de mettre à jour la base de données avec
194
	 * les toutes les informations d'une image donnée
195
	 * @param ic l'image à synchroniser avec la base
196
	 */
28 aperonnet 197
	public void mettreAjourBaseDeDonneesImageCarnet(ImageCarnet ic)
19 aperonnet 198
	{
199
		ImageAsynchroneDAO iaDaO = new ImageAsynchroneDAO();
200
		iaDaO.setIMediateur(iMediateur);
201
		iaDaO.SynchroniserBaseDeDonnees(ic) ;
202
	}
7 aperonnet 203
 
30 aperonnet 204
	/**
205
	 * Supprime les images données du cache local et appelle le DAO
206
	 * qui les supprime de la base de données
207
	 * @param ids les identifiants des images selectionnées
208
	 */
209
	public void supprimerImages(String[] ids)
210
	{
20 aperonnet 211
		String rids[] = new String[ids.length] ;
212
		ListeImageAsynchroneDAO liDao = new ListeImageAsynchroneDAO() ;
213
		liDao.setIMediateur(iMediateur);
214
 
30 aperonnet 215
		for (int i = 0; i < ids.length; i++)
216
		{
20 aperonnet 217
			String key = ids[i] ;
218
			ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;
219
			rids[i] = ic.getId() ;
220
		}
221
 
222
		if(rids.length != 0)
223
		{
224
			liDao.supprimerBaseDeDonnees(rids);
30 aperonnet 225
		}
20 aperonnet 226
	}
227
 
30 aperonnet 228
	/**
229
	 * Met à jour les données locales suivant le type des nouvelles données
230
	 * et appelle le médiateur pour le notifier de la mise à jour
231
	 */
232
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement)
233
	{
234
		if(nouvelleDonnees instanceof ListeImageCarnet)
235
		{
236
				ListeImageCarnet data = (ListeImageCarnet) nouvelleDonnees ;
237
				Object[][] photoData = new Object[data.size()][7];
238
				int i = 0 ;
239
				for (Iterator it = data.keySet().iterator(); it.hasNext();)
240
				{
241
					ImageCarnet im = (ImageCarnet) data.get(it.next());
242
					photoData[i][0] = im.getOrdre() ;
243
					photoData[i][1] = im.getDate() ;
244
					photoData[i][2] = im.getIptcCity() ;
245
					photoData[i][3] = im.getMake()+" "+im.getModel() ;
246
					photoData[i][4] = im.getSUrl() ;
247
					photoData[i][5] = im.getMUrl() ;
248
					photoData[i][6] = im.getUrl() ;
249
 
250
					i++ ;
251
				}
20 aperonnet 252
 
30 aperonnet 253
				// creation du store
254
				FieldDef defNumImage = new IntegerFieldDef("num_image");
255
				FieldDef defDatImage = new StringFieldDef("dat_image");
256
				FieldDef defLieImage = new StringFieldDef("lie_image");
257
				FieldDef defAppImage = new StringFieldDef("app_image");
258
				FieldDef defUrlImageS = new StringFieldDef("url_image_S");
259
				FieldDef defUrlImageM = new StringFieldDef("url_image_M");
260
				FieldDef defUrlImage = new StringFieldDef("url_image");
261
				FieldDef[] defTab = {defNumImage,defDatImage,defLieImage,defAppImage,defUrlImageS,defUrlImageM,defUrlImage};
262
				RecordDef rd = new RecordDef(defTab) ;
25 aperonnet 263
 
30 aperonnet 264
				final MemoryProxy dataProxy = new MemoryProxy(photoData);
265
				final ArrayReader reader = new ArrayReader(rd);
266
 
267
				final Store photoStore = new Store(dataProxy, reader);
268
 
269
				rafraichirListeImage(nouvelleDonnees);
270
 
271
				st = photoStore ;
20 aperonnet 272
 
30 aperonnet 273
				if(repandreRafraichissement)
274
				{
275
					getIMediateur().synchroniserDonneesZoomListeGalerie(st, this) ;
276
				}
277
		}
278
 
279
		if(nouvelleDonnees instanceof JSONArray)
280
		{
281
			JSONArray reponse = (JSONArray)nouvelleDonnees ;
25 aperonnet 282
 
30 aperonnet 283
			final int taillemax = reponse.size();
25 aperonnet 284
 
30 aperonnet 285
			if(taillemax == 0)
25 aperonnet 286
			{
30 aperonnet 287
				TreeNode root = new TreeNode() ;
288
				root.setId("racine") ;
289
				root.setText("Tags") ;
290
				root.setIcon("tela.png") ;
291
				String[] usObj = {"Tags","racine"} ;
292
				root.setUserObject(usObj) ;
293
				arbreMotsCles.setRootNode(root) ;
25 aperonnet 294
			}
30 aperonnet 295
 
296
			for (int j = 0; j < taillemax ; j++)
297
			{
298
 
299
				if(reponse.get(j).isObject() != null)
300
				{
301
					JSONObject noeud = (JSONObject)reponse.get(j) ;
302
 
303
					String id_noeud = noeud.get("cmc_id_mot_cle_utilisateur").isString().stringValue() ;
304
					String mot_cle = noeud.get("cmc_mot_cle").isString().stringValue() ;
305
					String parent = noeud.get("cmc_id_parent").isString().stringValue() ;
306
 
307
					String[] usObj = {mot_cle, id_noeud} ;
308
 
309
					if(id_noeud.equals("racine"))
310
					{
311
						TreeNode root = new TreeNode() ;
312
						root.setId(id_noeud) ;
313
						root.setText(mot_cle) ;
314
						root.setIcon("tela.png") ;
315
						root.setUserObject(usObj) ;
316
						arbreMotsCles.setRootNode(root) ;
317
					}
318
					else
319
					{
320
						TreeNode node = new TreeNode() ;
321
						node.setId(id_noeud) ;
322
						node.setText(mot_cle) ;
323
						node.setChecked(false) ;
324
						Node parentNode = arbreMotsCles.getNodeById(parent) ;
325
						node.setIcon("tela.png") ;
326
						node.setUserObject(usObj) ;
327
						parentNode.appendChild(node) ;
328
					}
329
				}
330
			}
331
				rafraichirArbreMotsCles(arbreMotsCles) ;
332
				getIMediateur().getMetadonneesIptcExif().getPanneauMotsCles().rafraichir(arbreMotsCles, true) ;
333
		}
25 aperonnet 334
	}
20 aperonnet 335
 
30 aperonnet 336
	/**
337
	 * Affiche les paires / valeur de tous les mots clés stockés
338
	 */
25 aperonnet 339
	public void afficherMotsCles()
340
	{
28 aperonnet 341
		for(Iterator it = motsCles.keySet().iterator() ; it.hasNext() ;)
20 aperonnet 342
		{
25 aperonnet 343
			String key = (String)it.next() ;
28 aperonnet 344
			String valeur = (String)motsCles.get(key) ;
25 aperonnet 345
			System.out.println("clé : "+key+" valeur : "+valeur);
20 aperonnet 346
		}
25 aperonnet 347
	}
348
 
30 aperonnet 349
	/**
350
	 * Met à jour les mots clés associés à une image et appelle le DAO pour synchroniser la base de données
351
	 * @param ids les identifiants des images selectionnées
352
	 * @param motsClesEnCours les mots clés à appliquer aux images
353
	 * @param arbreMC l'arbre de mots clés en cours
354
	 */
355
	public void mettreAjourMotsCles(String[] ids, String motsClesEnCours, com.gwtext.client.data.Tree arbreMC)
356
	{
357
		for (int i = 0; i < ids.length; i++)
358
		{
25 aperonnet 359
			if(cacheImage.containsKey(ids[i]))
360
			{
361
				ImageCarnet ic = (ImageCarnet)cacheImage.get(ids[i]) ;
362
				ic.mettreAjourMotsCles(motsClesEnCours) ;
30 aperonnet 363
 
364
				ImageAsynchroneDAO imgDao = new ImageAsynchroneDAO() ;
365
				imgDao.setIMediateur(getIMediateur()) ;
366
				imgDao.SynchroniserMotsClesImageBaseDeDonnees(ic) ;
25 aperonnet 367
			}
368
		}
369
 
28 aperonnet 370
		rafraichirArbreMotsCles(arbreMC) ;
25 aperonnet 371
	}
28 aperonnet 372
 
30 aperonnet 373
 
374
	/**
375
	 * Appelle le DAO des mots clés pour obtenir l'arbre complet stocké dans la base de données
376
	 */
377
	public void initialiserArbreMotsCles()
378
	{
379
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
380
		MCDao.setIMediateur(getIMediateur()) ;
381
 
382
		MCDao.obtenirListeMotsCles(this) ;
383
	}
384
 
385
	/**
386
	 * Envoie l'arbre des mots clés stocké localement à l'élément rafrachissable donné, qui le demande
387
	 * @param r le rafraichissable demandeur de l'arbre
388
	 */
389
	public void obtenirArbreMotCle(Rafraichissable r)
390
	{
391
		r.rafraichir(arbreMotsCles, false) ;
392
	}
28 aperonnet 393
 
30 aperonnet 394
	/**
395
	 * Ajoute un mot clé à l'arbre des mots clés local et appelle le DAO qui fait la mise
396
	 * à jour de l'arbre des mots clés dans la base
397
	 * @param n le nouveau noeud contenant le mot clé
398
	 * @param arbreMC l'arbre des mots cles en cours
399
	 */
400
	public void ajouterMotCleDansArbre(TreeNode n, com.gwtext.client.data.Tree arbreMC)
401
	{
28 aperonnet 402
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
403
		MCDao.setIMediateur(getIMediateur()) ;
404
 
405
		String[] usObj = (String[])n.getUserObject() ;
406
		String motCle = usObj[0] ;
407
		String id = usObj[1] ;
30 aperonnet 408
		String parentId = "" ;
409
 
28 aperonnet 410
		if(!id.equals("racine"))
411
		{
412
			String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;
413
			parentId = parentUsObj[1] ;
414
		}
415
		else
416
		{
417
			parentId = "racine" ;
418
		}
419
 
420
		rafraichirArbreMotsCles(arbreMC) ;
421
 
422
		String nouveauMotCle = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;
30 aperonnet 423
		MCDao.ajouterBaseDeDonnees(nouveauMotCle) ;
28 aperonnet 424
	}
425
 
30 aperonnet 426
	/**
427
	 * Supprime un noeud de l'arbre des mots clés et appelle le DAO qui va supprimer
428
	 * les mots clés associés dans la base
429
	 * @param n le noeud à supprimer
430
	 * @param arbreMC l'arbre des mots clés en cours
431
	 */
432
	public void supprimerMotCleDansArbre(TreeNode n, Tree arbreMC)
433
	{
28 aperonnet 434
 
435
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
436
		MCDao.setIMediateur(getIMediateur()) ;
437
 
438
		String[] usObj = (String[])n.getUserObject() ;
439
		String motCle = usObj[0] ;
440
		String id = usObj[1] ;
441
 
442
		String motCleASupprimer = id ;
443
 
444
		MCDao.supprimerBaseDeDonnees(id) ;
445
 
446
	}
447
 
30 aperonnet 448
	/**
449
	 * Modifie le noeud donné dans l'arbre des mots clés en cours et appelle le DAO
450
	 * qui synchronise la modification dans la base de données
451
	 * @param n le noeud modifié
452
	 * @param arbreMC l'arbre des mots clés en cours
453
	 */
454
	public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC)
455
	{
28 aperonnet 456
 
457
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
458
		MCDao.setIMediateur(getIMediateur()) ;
459
 
460
		String[] usObj = (String[])n.getUserObject() ;
461
		String motCle = usObj[0] ;
462
		String id = usObj[1] ;
30 aperonnet 463
		String parentId = "" ;
464
 
28 aperonnet 465
		if(!id.equals("racine"))
466
		{
467
			String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;
468
			parentId = parentUsObj[1] ;
469
		}
470
		else
471
		{
472
			parentId = "racine" ;
473
		}
474
 
475
		rafraichirArbreMotsCles(arbreMC) ;
476
 
30 aperonnet 477
		String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;
28 aperonnet 478
		MCDao.modifierBaseDeDonnees(motCleModifie) ;
479
 
480
	}
481
 
30 aperonnet 482
	/**
483
	 * Deplace un noeud dans l'arbre des mots cles et appelle le DAO qui reorganise l'arbre
484
	 * dans la base de donnees suivant le changement
485
	 * @param n le noeud deplace (et son sous arbre associe)
486
	 * @param arbreMC l'arbre des mots cles en cours
487
	 */
28 aperonnet 488
	public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC)
489
	{
490
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
491
		MCDao.setIMediateur(getIMediateur()) ;
492
 
493
		String[] usObj = (String[])n.getUserObject() ;
494
		String motCle = usObj[0] ;
495
		String id = usObj[1] ;
30 aperonnet 496
		String parentId = "" ;
28 aperonnet 497
		if(!id.equals("racine"))
498
		{
499
			String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;
500
			parentId = parentUsObj[1] ;
501
		}
502
		else
503
		{
504
			parentId = "racine" ;
505
		}
506
 
507
		rafraichirArbreMotsCles(arbreMC) ;
508
 
30 aperonnet 509
		String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;
28 aperonnet 510
		MCDao.deplacerBaseDeDonnees(motCleModifie) ;
511
	}
512
 
7 aperonnet 513
}