1 | package com.medias.annuaire; |
---|
2 | |
---|
3 | import com.medias.ConversionException; |
---|
4 | import com.medias.utils.Entity; |
---|
5 | import com.medias.xml.XMLBuilder; |
---|
6 | import com.medias.xml.metadata.Contact; |
---|
7 | import com.medias.xml.metadata.Metadata; |
---|
8 | import org.apache.struts.action.ActionMessage; |
---|
9 | import org.apache.struts.action.ActionMessages; |
---|
10 | import org.jdom.Element; |
---|
11 | import org.jdom.JDOMException; |
---|
12 | |
---|
13 | import java.io.IOException; |
---|
14 | import java.util.ArrayList; |
---|
15 | import java.util.Iterator; |
---|
16 | import java.util.List; |
---|
17 | |
---|
18 | /** |
---|
19 | * @author combaz |
---|
20 | * |
---|
21 | * Created on 22 févr. 2005 |
---|
22 | */ |
---|
23 | public class Annuaire implements Entity |
---|
24 | { |
---|
25 | /** |
---|
26 | * |
---|
27 | */ |
---|
28 | private static final long serialVersionUID = 1L; |
---|
29 | |
---|
30 | /** |
---|
31 | * L'attribut que l'on prend pour constituer le login |
---|
32 | */ |
---|
33 | public static String LOGIN_FIELD = "mail"; |
---|
34 | |
---|
35 | public static String KWD_FIELD = "mdp"; |
---|
36 | |
---|
37 | private String xmlFileName; |
---|
38 | |
---|
39 | private ArrayList<Object> contacts; |
---|
40 | |
---|
41 | public Annuaire(String file) { |
---|
42 | this.xmlFileName = file; |
---|
43 | this.contacts = new ArrayList<Object>(); |
---|
44 | try { |
---|
45 | this.update(); |
---|
46 | } |
---|
47 | catch(Exception e){ |
---|
48 | e.printStackTrace(); |
---|
49 | } |
---|
50 | } |
---|
51 | |
---|
52 | /** |
---|
53 | * @return Returns the contacts. |
---|
54 | */ |
---|
55 | public Object[] getContacts() { |
---|
56 | if(this.contacts.isEmpty()) { |
---|
57 | Contact pers = new Contact(); |
---|
58 | this.contacts.add(pers); |
---|
59 | } |
---|
60 | return this.contacts.toArray(); |
---|
61 | } |
---|
62 | /** |
---|
63 | * @param contacts The contacts to set. |
---|
64 | */ |
---|
65 | public void setContacts(Contact[] contacts) { |
---|
66 | this.contacts = new ArrayList<Object>(); |
---|
67 | for(int i=0; i<contacts.length; i++) |
---|
68 | this.contacts.add(contacts[i]); |
---|
69 | } |
---|
70 | /** |
---|
71 | * @return Returns the xmlFileName. |
---|
72 | */ |
---|
73 | public String getXmlFileName() { |
---|
74 | return xmlFileName; |
---|
75 | } |
---|
76 | /** |
---|
77 | * @param xmlFileName The xmlFileName to set. |
---|
78 | */ |
---|
79 | public void setXmlFileName(String xmlFileName) { |
---|
80 | this.xmlFileName = xmlFileName; |
---|
81 | } |
---|
82 | |
---|
83 | public void fromXmlElement(Element el) throws ConversionException { |
---|
84 | List<?> p = el.getChildren("personne"); |
---|
85 | Iterator<?> it = p.iterator(); |
---|
86 | |
---|
87 | if((p==null)) { |
---|
88 | throw new ConversionException(ConversionException.ERROR_fromXml + "Annuaire !"); |
---|
89 | } |
---|
90 | |
---|
91 | while(it.hasNext()){ |
---|
92 | Element child = (Element)it.next(); |
---|
93 | Personne pers = new Personne(); |
---|
94 | pers.fromXmlElement(child); |
---|
95 | this.contacts.add(pers); |
---|
96 | } |
---|
97 | } |
---|
98 | |
---|
99 | public Element toXmlElement(String title) { |
---|
100 | ArrayList<Element> pl = new ArrayList<Element>(); |
---|
101 | for(int i = 0; i<this.contacts.size(); i++) { |
---|
102 | Personne pers = (Personne)this.contacts.get(i); |
---|
103 | Element p = pers.toXmlElement("personne"); |
---|
104 | pl.add(p); |
---|
105 | } |
---|
106 | Element result = new Element(title); |
---|
107 | result.addContent(pl); |
---|
108 | |
---|
109 | return result; |
---|
110 | } |
---|
111 | |
---|
112 | public ArrayList<Element> getPersonnes(String login) throws IOException, JDOMException { |
---|
113 | ArrayList<Element> result = new ArrayList<Element>(); |
---|
114 | XMLBuilder builder = new XMLBuilder(); |
---|
115 | builder.readXml(this.xmlFileName); |
---|
116 | List<?> personnes = builder.getRoot().getChildren("personne"); |
---|
117 | Iterator<?> it = personnes.iterator(); |
---|
118 | |
---|
119 | while(it.hasNext()) { |
---|
120 | Element pers = (Element) it.next(); |
---|
121 | Element key = pers.getChild(Annuaire.LOGIN_FIELD); |
---|
122 | if(key.getText().equals(login)) |
---|
123 | result.add(pers); |
---|
124 | } |
---|
125 | |
---|
126 | return result; |
---|
127 | } |
---|
128 | |
---|
129 | public Personne getPersonne(String login, String pwd) throws IOException, JDOMException, ConversionException { |
---|
130 | ArrayList<Element> selection = this.getPersonnes(login); |
---|
131 | Iterator<Element> it = selection.iterator(); |
---|
132 | |
---|
133 | while(it.hasNext()) { |
---|
134 | Element pers = it.next(); |
---|
135 | if(pers.getChild(Annuaire.KWD_FIELD).getText().equals(pwd)) { |
---|
136 | Personne p = new Personne(); |
---|
137 | p.fromXmlElement(pers); |
---|
138 | return p; |
---|
139 | } |
---|
140 | } |
---|
141 | |
---|
142 | return null; |
---|
143 | } |
---|
144 | |
---|
145 | // private boolean jeuHasRole (String jeu, String role) { |
---|
146 | // /* Recherche d'un contact ayant le role dans le jeu */ |
---|
147 | // Iterator it = this.contacts.iterator(); |
---|
148 | // while(it.hasNext()) { |
---|
149 | // Contact pers = (Contact) it.next(); |
---|
150 | // if(pers.getRole().equalsIgnoreCase(role)) { |
---|
151 | // return true; |
---|
152 | // } |
---|
153 | // } |
---|
154 | // |
---|
155 | // return false; |
---|
156 | // } |
---|
157 | |
---|
158 | /** |
---|
159 | * A partir d'un contact récupéré dans une métadonnée, va ajouter la personne correspondante à l'annuaire si elle |
---|
160 | * n'existe pas, ou bien, dans le cas contraire, remettre simplement à jour la liste de jeux qui lui est associée. |
---|
161 | * Pour un jeu donné, il ne peut y avoir qu'une seule personne par rÎle. |
---|
162 | * @param c Le contact à ajouter |
---|
163 | * @param jeu Le jeu associé à ce contact. |
---|
164 | * @throws IOException |
---|
165 | */ |
---|
166 | public boolean addPersonne(Contact c, String jeu, ActionMessages messages) throws IOException{ |
---|
167 | /* On vérifie si une autre personne détient le rÎle de la personne à ajouter au niveau du jeu. Si tel est le |
---|
168 | * cas, la personne n'est ni ajouté à l'annuaire, ni au jeu */ |
---|
169 | |
---|
170 | // String role = c.getRole(); |
---|
171 | // if (!jeuHasRole (jeu, role)) { |
---|
172 | Personne p = new Personne(); |
---|
173 | p.fromContact(c); |
---|
174 | ArrayList<String> l = new ArrayList<String>(); |
---|
175 | l.add(jeu); |
---|
176 | p.setJeux(l); |
---|
177 | boolean res = this.addPersonne(p,messages); |
---|
178 | c.setMdp(p.getMdp()); |
---|
179 | return res; |
---|
180 | // } |
---|
181 | } |
---|
182 | |
---|
183 | /** |
---|
184 | * Ajoute une personne à l'annuaire si elle n'existe pas encore, ou compléter la liste de jeux qui lui est associée. |
---|
185 | * @param p la personne à ajouter |
---|
186 | * @return true si la personne a bien été ajoutée, false si la personne existait déjà . |
---|
187 | */ |
---|
188 | private boolean addPersonne(Personne p, ActionMessages messages) throws IOException { |
---|
189 | boolean result = false; |
---|
190 | |
---|
191 | if(!this.contains(p)){ |
---|
192 | this.contacts.add(p); |
---|
193 | result = true; |
---|
194 | } |
---|
195 | else { |
---|
196 | Iterator<Object> it = this.contacts.iterator(); |
---|
197 | //on trouve l'enregistrement dans l'annuaire correspondant à la personne à mettre à jour |
---|
198 | while(it.hasNext()){ |
---|
199 | Personne pers = (Personne)it.next(); |
---|
200 | if(pers.equals(p)) { |
---|
201 | // Si la personne existe déjà mais que le mot de passe saisi est différent, on l'indique par un message d'info |
---|
202 | if (!pers.getMdp().toLowerCase().equals(p.getMdp().trim().toLowerCase())) { |
---|
203 | messages.add("warning", new ActionMessage("data.upload.newSet.pwdexist",pers.getMail(),pers.getMdp())); |
---|
204 | p.setMdp(pers.getMdp()); |
---|
205 | } |
---|
206 | Iterator<String> pit = p.getJeux().iterator(); |
---|
207 | ArrayList<String> l = pers.getJeux(); |
---|
208 | //on parcourt les jeux à rajouter et on ajoute ceux qui manquent |
---|
209 | while(pit.hasNext()) { |
---|
210 | String jeu = (String) pit.next(); |
---|
211 | if(!l.contains(jeu)) { |
---|
212 | l.add(jeu); |
---|
213 | } |
---|
214 | } |
---|
215 | pers.setJeux(l); |
---|
216 | } |
---|
217 | |
---|
218 | } |
---|
219 | } |
---|
220 | return result; |
---|
221 | } |
---|
222 | |
---|
223 | public void createXmlFile() throws IOException { |
---|
224 | Element root = this.toXmlElement("annuaire"); |
---|
225 | XMLBuilder builder = new XMLBuilder(root); |
---|
226 | builder.writeXml(this.getXmlFileName()); |
---|
227 | } |
---|
228 | |
---|
229 | /** |
---|
230 | * Remet à jour le fichier com.medias.xml d'annuaire à partir des contacts associés à un jeu de données. |
---|
231 | * @param metadata Les métadonnées associées au jeu, dans lesquelles on va trouver les contacts en question |
---|
232 | * @throws IOException |
---|
233 | */ |
---|
234 | public int update(Metadata metadata, ActionMessages messages) throws IOException { |
---|
235 | //le nom du jeu, Ã associer aux contacts dans l'annuaire, |
---|
236 | String jeu = metadata.getPres().getNom(); |
---|
237 | Iterator<Contact> meta_it = metadata.getPres().getContactsList().iterator(); |
---|
238 | //pour chacun des contacts trouvés, on complÚte l'annuaire, |
---|
239 | int nbPersonnesAPrevenir=0; |
---|
240 | while(meta_it.hasNext()) { |
---|
241 | Contact pers = meta_it.next(); |
---|
242 | if((pers.getMail() != null) && (pers.getMail().length() != 0)) { |
---|
243 | this.addPersonne(pers,jeu,messages); |
---|
244 | nbPersonnesAPrevenir++; |
---|
245 | } |
---|
246 | } |
---|
247 | |
---|
248 | //puis, on vérifie la cohérence (en cas de suppression de contacts associés au jeu) |
---|
249 | Iterator<Object> annu_it = this.contacts.iterator(); |
---|
250 | while(annu_it.hasNext()) { |
---|
251 | Personne pers = (Personne) annu_it.next(); |
---|
252 | Iterator<String> jeu_it = pers.getJeux().iterator(); |
---|
253 | boolean remove = false; |
---|
254 | while((!remove)&&(jeu_it.hasNext())) { |
---|
255 | String jeu_pers = (String) jeu_it.next(); |
---|
256 | if(jeu_pers.equals(jeu)) { |
---|
257 | remove = true; |
---|
258 | meta_it = metadata.getPres().getContactsList().iterator(); |
---|
259 | while(meta_it.hasNext()) { |
---|
260 | Contact contact = meta_it.next(); |
---|
261 | Personne p = new Personne(); |
---|
262 | p.fromContact(contact); |
---|
263 | if(pers.equals(p)) |
---|
264 | remove = false; |
---|
265 | } |
---|
266 | if(remove==true) { |
---|
267 | pers.getJeux().remove(jeu); |
---|
268 | } |
---|
269 | } |
---|
270 | } |
---|
271 | } |
---|
272 | this.createXmlFile(); |
---|
273 | return nbPersonnesAPrevenir; |
---|
274 | } |
---|
275 | |
---|
276 | public void update() throws IOException, JDOMException, ConversionException { |
---|
277 | XMLBuilder builder = new XMLBuilder(); |
---|
278 | builder.readXml(this.xmlFileName); |
---|
279 | Element root = builder.getRoot(); |
---|
280 | this.fromXmlElement(root); |
---|
281 | } |
---|
282 | |
---|
283 | public boolean contains(Personne p) { |
---|
284 | Iterator<Object> it = this.contacts.iterator(); |
---|
285 | while(it.hasNext()){ |
---|
286 | Personne pers = (Personne) it.next(); |
---|
287 | if(pers.equals(p)) |
---|
288 | return true; |
---|
289 | } |
---|
290 | return false; |
---|
291 | } |
---|
292 | |
---|
293 | public void deleteSet(String setName) throws IOException { |
---|
294 | Iterator<Object> pers_it = this.contacts.iterator(); |
---|
295 | while(pers_it.hasNext()) { |
---|
296 | Personne pers = (Personne) pers_it.next(); |
---|
297 | pers.removeSet(setName); |
---|
298 | } |
---|
299 | this.createXmlFile(); |
---|
300 | } |
---|
301 | } |
---|