KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > applications > packaging > ShareManager


1 /*
2  
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5  
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8  
9  */

10
11 package org.mmbase.applications.packaging;
12
13 import java.io.File JavaDoc;
14 import java.util.ArrayList JavaDoc;
15 import java.util.HashMap JavaDoc;
16 import java.util.Iterator JavaDoc;
17
18 import org.mmbase.applications.packaging.bundlehandlers.BundleContainer;
19 import org.mmbase.applications.packaging.packagehandlers.PackageContainer;
20 import org.mmbase.applications.packaging.sharehandlers.ShareClientSession;
21 import org.mmbase.applications.packaging.sharehandlers.ShareFileWriter;
22 import org.mmbase.applications.packaging.sharehandlers.ShareGroup;
23 import org.mmbase.applications.packaging.sharehandlers.ShareInfo;
24 import org.mmbase.applications.packaging.sharehandlers.ShareUser;
25 import org.mmbase.applications.packaging.util.ExtendedDocumentReader;
26 import org.mmbase.util.XMLEntityResolver;
27 import org.mmbase.util.logging.Logger;
28 import org.mmbase.util.logging.Logging;
29 import org.w3c.dom.Element JavaDoc;
30 import org.w3c.dom.NamedNodeMap JavaDoc;
31
32 /**
33  * provider manager, maintains the package/bundles providers and abstracts
34  * their access methods for the Bundle and Package manager.
35  *
36  * @author Daniel Ockeloen (MMBased)
37  */

38 public class ShareManager {
39     private static Logger log = Logging.getLoggerInstance(ShareManager.class);
40     private static boolean state = false;
41
42     private static String JavaDoc callbackurl = "";
43
44     private static String JavaDoc providername = "";
45
46     private static HashMap JavaDoc users = new HashMap JavaDoc();
47
48     private static HashMap JavaDoc groups = new HashMap JavaDoc();
49
50     private static HashMap JavaDoc clients = new HashMap JavaDoc();
51
52     private static HashMap JavaDoc providingpaths = new HashMap JavaDoc();
53
54     /** DTD resource filename of the sharing DTD version 1.0 */
55     public static final String JavaDoc DTD_SHARING_1_0 = "shared_1_0.dtd";
56
57     /** Public ID of the sharing DTD version 1.0 */
58     public static final String JavaDoc PUBLIC_ID_SHARING_1_0 = "-//MMBase//DTD shared config 1.0//EN";
59
60     /**
61      * Register the Public Ids for DTDs used by DatabaseReader
62      * This method is called by XMLEntityResolver.
63      */

64     public static void registerPublicIDs() {
65         XMLEntityResolver.registerPublicID(PUBLIC_ID_SHARING_1_0, "DTD_SHARING_1_0", ShareManager.class);
66     }
67
68     
69     public static synchronized void init() {
70         if (!isRunning()) {
71             state=true;
72             readShared();
73         }
74     }
75
76     public static boolean isRunning() {
77         return state;
78     }
79
80
81
82     /**
83      * return all packages based on the input query
84      * @return all packages
85      */

86     public static Iterator JavaDoc getSharedPackages() {
87         // first get the PackageManager
88
if (PackageManager.isRunning()) {
89             Iterator JavaDoc p = PackageManager.getPackages();
90             ArrayList JavaDoc reallyshared = new ArrayList JavaDoc();
91             while (p.hasNext()) {
92                 PackageContainer e = (PackageContainer)p.next();
93                 if (e.isShared()) {
94                     reallyshared.add(e);
95                 }
96             }
97             return reallyshared.iterator();
98         } else {
99             return (new ArrayList JavaDoc()).iterator();
100         }
101     }
102
103
104     /**
105      */

106     public static Iterator JavaDoc getSharedBundles() {
107         // first getthe BundleManager
108
if (BundleManager.isRunning()) {
109             Iterator JavaDoc b = BundleManager.getBundles();
110             ArrayList JavaDoc reallyshared = new ArrayList JavaDoc();
111             while (b.hasNext()) {
112                 BundleContainer e = (BundleContainer)b.next();
113                 if (e.isShared()) {
114                     reallyshared.add(e);
115                 }
116             }
117             return reallyshared.iterator();
118         } else {
119             return (new ArrayList JavaDoc()).iterator();
120         }
121     }
122
123
124     /**
125      * return all packages based on the input query
126      * @return all packages
127      */

128     public static Iterator JavaDoc getNotSharedPackages() {
129         // first get the PackageManager
130
if (PackageManager.isRunning()) {
131             Iterator JavaDoc p = PackageManager.getPackages();
132             ArrayList JavaDoc reallynotshared = new ArrayList JavaDoc();
133             while (p.hasNext()) {
134                 PackageContainer e = (PackageContainer)p.next();
135                 if (!e.isShared()) {
136                     reallynotshared.add(e);
137                 }
138             }
139             return reallynotshared.iterator();
140         } else {
141             return (new ArrayList JavaDoc()).iterator();
142         }
143     }
144
145
146     /**
147      * return all packages based on the input query
148      * @return all packages
149      */

150     public static Iterator JavaDoc getNotSharedBundles() {
151         // first get the BundleManager
152
if (BundleManager.isRunning()) {
153             Iterator JavaDoc b = BundleManager.getBundles();
154             ArrayList JavaDoc reallynotshared = new ArrayList JavaDoc();
155             while (b.hasNext()) {
156                 BundleContainer e = (BundleContainer)b.next();
157                 if (!e.isShared()) {
158                     reallynotshared.add(e);
159                 }
160             }
161             return reallynotshared.iterator();
162         } else {
163             return (new ArrayList JavaDoc()).iterator();
164         }
165     }
166
167
168     /**
169      * return all packages based on the input query
170      * @return all packages
171      */

172     public static Iterator JavaDoc getRemoteSharedPackages(String JavaDoc user,String JavaDoc password,String JavaDoc method,String JavaDoc host) {
173         // first get the PackageManager
174
if (PackageManager.isRunning()) {
175             Iterator JavaDoc p = PackageManager.getPackages();
176             ArrayList JavaDoc reallyshared = new ArrayList JavaDoc();
177             while (p.hasNext()) {
178                 PackageContainer e = (PackageContainer)p.next();
179                 if (e.isShared()) {
180                     ShareInfo shareinfo = e.getShareInfo();
181                     if (shareinfo!=null && shareinfo.isActive()) {
182                         if (shareinfo.sharedForUser(user,password,method,host)) {
183                             reallyshared.add(e);
184                         }
185                     }
186                 }
187             }
188
189             Iterator JavaDoc b = BundleManager.getBundles();
190             while (b.hasNext()) {
191                 BundleContainer e = (BundleContainer)b.next();
192                 if (e.isShared()) {
193                     ShareInfo shareinfo = e.getShareInfo();
194                     if (shareinfo != null && shareinfo.isActive()) {
195                         if (shareinfo.sharedForUser(user,password,method,host)) {
196                             reallyshared.add(e);
197                         }
198                     }
199                 }
200             }
201             return reallyshared.iterator();
202         } else {
203             return (new ArrayList JavaDoc()).iterator();
204         }
205     }
206
207
208     public static void readShared() {
209         String JavaDoc filename = PackageManager.getConfigPath()+File.separator+"packaging"+File.separator+"sharing.xml";
210         File JavaDoc file = new File JavaDoc(filename);
211         if(file.exists()) {
212             ExtendedDocumentReader reader = new ExtendedDocumentReader(filename,ShareManager.class);
213             if(reader != null) {
214                 decodeSettings(reader);
215                 decodeProvidingPaths(reader);
216                 decodeUsers(reader);
217                 decodeGroups(reader);
218
219                 // decode packages
220
for(Iterator JavaDoc ns = reader.getChildElements("shared","packaging");ns.hasNext(); ) {
221                     Element JavaDoc n = (Element JavaDoc)ns.next();
222
223                         for(Iterator JavaDoc ns2 = reader.getChildElements(n,"package");ns2.hasNext(); ) {
224                             Element JavaDoc n2 = (Element JavaDoc)ns2.next();
225                             NamedNodeMap JavaDoc nm = n2.getAttributes();
226                             if (nm != null) {
227                                 String JavaDoc name = null;
228                                 String JavaDoc maintainer = null;
229                                 String JavaDoc type = null;
230                                 String JavaDoc versions = null;
231                                 String JavaDoc active = null;
232                 
233                                 // decode name
234
org.w3c.dom.Node JavaDoc n3 = nm.getNamedItem("name");
235                                 if (n3 != null) {
236                                     name = n3.getNodeValue();
237                                 }
238
239                                 // decode maintainer
240
n3 = nm.getNamedItem("maintainer");
241                                 if (n3 != null) {
242                                     maintainer = n3.getNodeValue();
243                                 }
244
245                                 // decode type
246
n3 = nm.getNamedItem("type");
247                                 if (n3 != null) {
248                                     type = n3.getNodeValue();
249                                 }
250
251                                 // decode versions
252
n3 = nm.getNamedItem("versions");
253                                 if (n3 != null) {
254                                     versions = n3.getNodeValue();
255                                 }
256
257                                 // decode active
258
n3 = nm.getNamedItem("active");
259                                 if (n3 != null) {
260                                     active = n3.getNodeValue();
261                                 }
262
263
264                                 // create its id (name+maintainer)
265
String JavaDoc id = name+"@"+maintainer+"_"+type;
266                                 id = id.replace(' ','_');
267                                 id = id.replace('/','_');
268                                 PackageContainer p = (PackageContainer)PackageManager.getPackage(id);
269                                 if (p != null) {
270                                     ShareInfo shareinfo = p.getShareInfo();
271                                     if (shareinfo == null) {
272                                         shareinfo = new ShareInfo();
273                                         if (active.equals("true")) {
274                                             shareinfo.setActive(true);
275                                         } else {
276                                             shareinfo.setActive(false);
277                                         }
278                                     }
279                                     if (versions.equals("best")) {
280                                         p.setShareInfo(shareinfo);
281                                     }
282                                     decodeLogins(p,reader,n2);
283                                 } else {
284                                     log.error("trying to share a non available package, ignoring");
285                                 }
286                             }
287                         }
288                 }
289
290                 // decode bundles
291
for(Iterator JavaDoc ns = reader.getChildElements("shared","bundles");ns.hasNext(); ) {
292                     Element JavaDoc n = (Element JavaDoc)ns.next();
293                     for(Iterator JavaDoc ns2 = reader.getChildElements(n,"bundle");ns2.hasNext(); ) {
294                         Element JavaDoc n2 = (Element JavaDoc)ns2.next();
295                         NamedNodeMap JavaDoc nm = n2.getAttributes();
296                         if (nm != null) {
297                             String JavaDoc name = null;
298                             String JavaDoc maintainer = null;
299                             String JavaDoc type = null;
300                             String JavaDoc versions = null;
301                             String JavaDoc active = null;
302                 
303                             // decode name
304
org.w3c.dom.Node JavaDoc n3 = nm.getNamedItem("name");
305                             if (n3 != null) {
306                                 name = n3.getNodeValue();
307                             }
308
309                             // decode maintainer
310
n3 = nm.getNamedItem("maintainer");
311                             if (n3 != null) {
312                                 maintainer = n3.getNodeValue();
313                             }
314
315                             // decode type
316
n3 = nm.getNamedItem("type");
317                             if (n3 != null) {
318                                 type = n3.getNodeValue();
319                             }
320
321                             // decode versions
322
n3 = nm.getNamedItem("versions");
323                             if (n3 != null) {
324                                 versions = n3.getNodeValue();
325                             }
326
327                             // decode active
328
n3=nm.getNamedItem("active");
329                             if (n3!=null) {
330                                 active=n3.getNodeValue();
331                             }
332
333                             // create its id (name+maintainer)
334
String JavaDoc id = name+"@"+maintainer+"_"+type;
335                             id = id.replace(' ','_');
336                             id = id.replace('/','_');
337                             BundleContainer b = (BundleContainer)BundleManager.getBundle(id);
338                             if (b != null) {
339                                 ShareInfo shareinfo = b.getShareInfo();
340                                 if (shareinfo == null) {
341                                     shareinfo = new ShareInfo();
342                                     if (active.equals("true")) {
343                                         shareinfo.setActive(true);
344                                     } else {
345                                         shareinfo.setActive(false);
346                                     }
347                                 }
348                                 if (versions.equals("best")) {
349                                     b.setShareInfo(shareinfo);
350                                 }
351                                 decodeBundleLogins(b,reader,n2);
352                             } else {
353                                 log.error("trying to share a non available package, ignoring");
354                             }
355                         }
356                     }
357                 }
358             }
359         } else {
360             log.error("missing shares file : "+filename);
361         }
362     }
363     
364
365     private static boolean decodeLogins(PackageContainer p,ExtendedDocumentReader reader,Element JavaDoc e) {
366         ShareInfo s = p.getShareInfo();
367         if (s != null) {
368             for (Iterator JavaDoc e2 = reader.getChildElements(e,"login"); e2.hasNext();) {
369                 org.w3c.dom.Node JavaDoc loginnode = (org.w3c.dom.Node JavaDoc)e2.next();
370                 NamedNodeMap JavaDoc nm = loginnode.getAttributes();
371                 if (nm != null) {
372                     // decode possible user
373
org.w3c.dom.Node JavaDoc n = nm.getNamedItem("user");
374                     if (n != null) {
375                         String JavaDoc user = n.getNodeValue();
376                         s.addUser(user);
377                     }
378
379                     // decode possible group
380
n = nm.getNamedItem("group");
381                     if (n != null) {
382                         String JavaDoc group = n.getNodeValue();
383                         s.addGroup(group);
384                     }
385                 }
386             }
387         }
388         return true;
389     }
390
391     private static boolean decodeBundleLogins(BundleContainer b,ExtendedDocumentReader reader,Element JavaDoc e) {
392         ShareInfo s = b.getShareInfo();
393         if (s != null) {
394             for (Iterator JavaDoc e2 = reader.getChildElements(e,"login"); e2.hasNext();) {
395                 org.w3c.dom.Node JavaDoc loginnode = (org.w3c.dom.Node JavaDoc)e2.next();
396                 NamedNodeMap JavaDoc nm = loginnode.getAttributes();
397                 if (nm != null) {
398                     // decode possible user
399
org.w3c.dom.Node JavaDoc n = nm.getNamedItem("user");
400                     if (n != null) {
401                         String JavaDoc user = n.getNodeValue();
402                         s.addUser(user);
403                     }
404
405                     // decode possible group
406
n = nm.getNamedItem("group");
407                     if (n != null) {
408                         String JavaDoc group = n.getNodeValue();
409                         s.addGroup(group);
410                     }
411                 }
412             }
413         }
414         return true;
415     }
416
417
418
419     private static boolean decodeUsers(ExtendedDocumentReader reader) {
420         for(Iterator JavaDoc ns = reader.getChildElements("shared","users");ns.hasNext(); ) {
421             Element JavaDoc n = (Element JavaDoc)ns.next();
422             for(Iterator JavaDoc ns2 = reader.getChildElements(n,"user");ns2.hasNext(); ) {
423                 Element JavaDoc n2 = (Element JavaDoc)ns2.next();
424                 NamedNodeMap JavaDoc nm = n2.getAttributes();
425                 if (nm != null) {
426                     String JavaDoc name = null;
427                     String JavaDoc password = null;
428                     String JavaDoc method = null;
429                     String JavaDoc ip = null;
430             
431                     // decode name
432
org.w3c.dom.Node JavaDoc n3 = nm.getNamedItem("name");
433                     if (n3 != null) {
434                         name = n3.getNodeValue();
435                     }
436
437                     // decode password
438
n3 = nm.getNamedItem("password");
439                     if (n3 != null) {
440                         password = n3.getNodeValue();
441                     }
442
443                     // decode method
444
n3 = nm.getNamedItem("method");
445                     if (n3 != null) {
446                         method = n3.getNodeValue();
447                     }
448
449                     // decode ip
450
n3 = nm.getNamedItem("ip");
451                     if (n3 != null) {
452                         ip = n3.getNodeValue();
453                     }
454
455                     ShareUser su = new ShareUser(name);
456                     if (password != null) su.setPassword(password);
457                     if (method != null) su.setMethod(method);
458                     if (ip != null) su.setHost(ip);
459                     users.put(name,su);
460                 }
461             }
462         }
463         return true;
464     }
465
466     private static boolean decodeProvidingPaths(ExtendedDocumentReader reader) {
467         for(Iterator JavaDoc ns = reader.getChildElements("shared","providingpaths");ns.hasNext(); ) {
468             Element JavaDoc n = (Element JavaDoc)ns.next();
469             for(Iterator JavaDoc ns2 = reader.getChildElements(n,"providingpath");ns2.hasNext(); ) {
470                 Element JavaDoc n2 = (Element JavaDoc)ns2.next();
471                 NamedNodeMap JavaDoc nm = n2.getAttributes();
472                 if (nm != null) {
473                     String JavaDoc method = null;
474                     String JavaDoc path = null;
475             
476                     // decode path
477
org.w3c.dom.Node JavaDoc n3 = nm.getNamedItem("path");
478                     if (n3 != null) {
479                         path = n3.getNodeValue();
480                     }
481
482                     // decode method
483
n3 = nm.getNamedItem("method");
484                     if (n3 != null) {
485                         method = n3.getNodeValue();
486                     }
487     
488                     if (path != null && method != null) {
489                         providingpaths.put(method,path);
490                     }
491                 }
492             }
493         }
494         return true;
495     }
496
497
498     private static boolean decodeSettings(ExtendedDocumentReader reader) {
499         for(Iterator JavaDoc ns = reader.getChildElements("shared","settings");ns.hasNext(); ) {
500             Element JavaDoc n = (Element JavaDoc)ns.next();
501             org.w3c.dom.Node JavaDoc n2 = n.getFirstChild();
502                 while (n2 != null) {
503                 String JavaDoc name = n2.getNodeName();
504                 org.w3c.dom.Node JavaDoc n3 = n2.getFirstChild();
505                 if (n3 != null) {
506                     String JavaDoc value = n3.getNodeValue();
507                     if (name.equals("providername")) {
508                         providername = value;
509                     } else if (name.equals("callbackurl")) {
510                         callbackurl = value;
511                     }
512                 }
513                 n2 = n2.getNextSibling();
514             }
515         }
516         return true;
517     }
518
519
520     private static boolean decodeGroups(ExtendedDocumentReader reader) {
521         for(Iterator JavaDoc ns = reader.getChildElements("shared","groups");ns.hasNext(); ) {
522             Element JavaDoc n = (Element JavaDoc)ns.next();
523
524             for(Iterator JavaDoc ns2 = reader.getChildElements(n,"group");ns2.hasNext(); ) {
525                 Element JavaDoc n2 = (Element JavaDoc)ns2.next();
526                 NamedNodeMap JavaDoc nm = n2.getAttributes();
527                 if (nm != null) {
528                     String JavaDoc name = null;
529             
530                     // decode name
531
org.w3c.dom.Node JavaDoc n3 = nm.getNamedItem("name");
532                     if (n3 != null) {
533                         name = n3.getNodeValue();
534                     }
535
536                     ShareGroup sg = new ShareGroup(name);
537                     for(Iterator JavaDoc ns3 = reader.getChildElements(n2,"member");ns3.hasNext(); ) {
538                         Element JavaDoc n4 = (Element JavaDoc)ns3.next();
539                         NamedNodeMap JavaDoc nm2 = n4.getAttributes();
540                         if (nm2 != null) {
541                             String JavaDoc member = null;
542                             // decode member
543
n3 = nm2.getNamedItem("user");
544                             if (n3 != null) {
545                                 member = n3.getNodeValue();
546                                 sg.addMember(member);
547                             }
548                         }
549                     }
550                     groups.put(name,sg);
551                 }
552             }
553         }
554         return true;
555     }
556
557     public static boolean createGroup(String JavaDoc name) {
558         if (!name.equals("") && groups.get(name) == null) {
559             ShareGroup sg = new ShareGroup(name);
560             groups.put(name,sg);
561             writeShareFile();
562             return true;
563         } else {
564             return false;
565         }
566     }
567
568     public static boolean removeGroup(String JavaDoc name) {
569         groups.remove(name);
570         writeShareFile();
571         return true;
572     }
573
574     public static Iterator JavaDoc getShareUsers() {
575         return users.values().iterator();
576     }
577
578     public static Iterator JavaDoc getShareGroups() {
579         return groups.values().iterator();
580     }
581
582     public static ShareUser getShareUser(String JavaDoc name) {
583         Object JavaDoc o=users.get(name);
584         if (o!=null) {
585             return (ShareUser)users.get(name);
586         }
587         log.error("Share refers to a user ("+name+") that is not defined");
588         return null;
589     }
590
591     public static ShareGroup getShareGroup(String JavaDoc name) {
592         Object JavaDoc o = groups.get(name);
593         if (o != null) {
594             return (ShareGroup)groups.get(name);
595         }
596         log.error("Share refers to a group ("+name+") that is not defined");
597         return null;
598     }
599
600     public static boolean writeShareFile() {
601         ShareFileWriter.write();
602         return true;
603     }
604
605     public static String JavaDoc getProviderName() {
606         return providername;
607     }
608
609
610     public static void setProviderName(String JavaDoc name) {
611         providername = name;
612     }
613
614     public static String JavaDoc getCallbackUrl() {
615         return callbackurl;
616     }
617
618     public static void setCallbackUrl(String JavaDoc url) {
619         callbackurl = url;
620     }
621
622     public static String JavaDoc createNewUser(String JavaDoc account,String JavaDoc password,String JavaDoc method,String JavaDoc ip) {
623         if (!users.containsKey(account)) {
624             ShareUser su = new ShareUser(account);
625             if (password != null) su.setPassword(password);
626             if (method != null) su.setMethod(method);
627             if (ip != null && !ip.equals("none")) su.setHost(ip);
628             users.put(account,su);
629             return "user added";
630         } else {
631             return "user allready defined";
632         }
633     }
634
635
636     public static String JavaDoc delUser(String JavaDoc account) {
637         if (users.containsKey(account)) {
638             users.remove(account);
639             return "user deleted";
640         } else {
641             return "user not found so can't delete it";
642         }
643     }
644
645     public static void reportClientSession(String JavaDoc callbackurl) {
646         ShareClientSession scs = (ShareClientSession)clients.get(callbackurl);
647         if (scs != null) {
648         } else {
649             if (callbackurl != null && !callbackurl.equals("")) {
650                 scs=new ShareClientSession(callbackurl);
651                 clients.put(callbackurl,scs);
652             }
653         }
654     }
655
656     public static void signalRemoteClients() {
657         Iterator JavaDoc e = clients.values().iterator();
658         while (e.hasNext()) {
659             ShareClientSession s = (ShareClientSession)e.next();
660             s.sendRemoteSignal(getProviderName());
661         }
662     }
663
664     public static String JavaDoc getProvidingPath(String JavaDoc method) {
665         return (String JavaDoc)providingpaths.get(method);
666     }
667
668     public static HashMap JavaDoc getProvidingPaths() {
669         return providingpaths;
670     }
671
672 }
673
Popular Tags