1 10 11 package org.mmbase.applications.packaging; 12 13 import java.io.File ; 14 import java.util.ArrayList ; 15 import java.util.HashMap ; 16 import java.util.Iterator ; 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 ; 30 import org.w3c.dom.NamedNodeMap ; 31 32 38 public class ShareManager { 39 private static Logger log = Logging.getLoggerInstance(ShareManager.class); 40 private static boolean state = false; 41 42 private static String callbackurl = ""; 43 44 private static String providername = ""; 45 46 private static HashMap users = new HashMap (); 47 48 private static HashMap groups = new HashMap (); 49 50 private static HashMap clients = new HashMap (); 51 52 private static HashMap providingpaths = new HashMap (); 53 54 55 public static final String DTD_SHARING_1_0 = "shared_1_0.dtd"; 56 57 58 public static final String PUBLIC_ID_SHARING_1_0 = "-//MMBase//DTD shared config 1.0//EN"; 59 60 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 86 public static Iterator getSharedPackages() { 87 if (PackageManager.isRunning()) { 89 Iterator p = PackageManager.getPackages(); 90 ArrayList reallyshared = new ArrayList (); 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 ()).iterator(); 100 } 101 } 102 103 104 106 public static Iterator getSharedBundles() { 107 if (BundleManager.isRunning()) { 109 Iterator b = BundleManager.getBundles(); 110 ArrayList reallyshared = new ArrayList (); 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 ()).iterator(); 120 } 121 } 122 123 124 128 public static Iterator getNotSharedPackages() { 129 if (PackageManager.isRunning()) { 131 Iterator p = PackageManager.getPackages(); 132 ArrayList reallynotshared = new ArrayList (); 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 ()).iterator(); 142 } 143 } 144 145 146 150 public static Iterator getNotSharedBundles() { 151 if (BundleManager.isRunning()) { 153 Iterator b = BundleManager.getBundles(); 154 ArrayList reallynotshared = new ArrayList (); 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 ()).iterator(); 164 } 165 } 166 167 168 172 public static Iterator getRemoteSharedPackages(String user,String password,String method,String host) { 173 if (PackageManager.isRunning()) { 175 Iterator p = PackageManager.getPackages(); 176 ArrayList reallyshared = new ArrayList (); 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 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 ()).iterator(); 204 } 205 } 206 207 208 public static void readShared() { 209 String filename = PackageManager.getConfigPath()+File.separator+"packaging"+File.separator+"sharing.xml"; 210 File file = new File (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 for(Iterator ns = reader.getChildElements("shared","packaging");ns.hasNext(); ) { 221 Element n = (Element )ns.next(); 222 223 for(Iterator ns2 = reader.getChildElements(n,"package");ns2.hasNext(); ) { 224 Element n2 = (Element )ns2.next(); 225 NamedNodeMap nm = n2.getAttributes(); 226 if (nm != null) { 227 String name = null; 228 String maintainer = null; 229 String type = null; 230 String versions = null; 231 String active = null; 232 233 org.w3c.dom.Node n3 = nm.getNamedItem("name"); 235 if (n3 != null) { 236 name = n3.getNodeValue(); 237 } 238 239 n3 = nm.getNamedItem("maintainer"); 241 if (n3 != null) { 242 maintainer = n3.getNodeValue(); 243 } 244 245 n3 = nm.getNamedItem("type"); 247 if (n3 != null) { 248 type = n3.getNodeValue(); 249 } 250 251 n3 = nm.getNamedItem("versions"); 253 if (n3 != null) { 254 versions = n3.getNodeValue(); 255 } 256 257 n3 = nm.getNamedItem("active"); 259 if (n3 != null) { 260 active = n3.getNodeValue(); 261 } 262 263 264 String 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 for(Iterator ns = reader.getChildElements("shared","bundles");ns.hasNext(); ) { 292 Element n = (Element )ns.next(); 293 for(Iterator ns2 = reader.getChildElements(n,"bundle");ns2.hasNext(); ) { 294 Element n2 = (Element )ns2.next(); 295 NamedNodeMap nm = n2.getAttributes(); 296 if (nm != null) { 297 String name = null; 298 String maintainer = null; 299 String type = null; 300 String versions = null; 301 String active = null; 302 303 org.w3c.dom.Node n3 = nm.getNamedItem("name"); 305 if (n3 != null) { 306 name = n3.getNodeValue(); 307 } 308 309 n3 = nm.getNamedItem("maintainer"); 311 if (n3 != null) { 312 maintainer = n3.getNodeValue(); 313 } 314 315 n3 = nm.getNamedItem("type"); 317 if (n3 != null) { 318 type = n3.getNodeValue(); 319 } 320 321 n3 = nm.getNamedItem("versions"); 323 if (n3 != null) { 324 versions = n3.getNodeValue(); 325 } 326 327 n3=nm.getNamedItem("active"); 329 if (n3!=null) { 330 active=n3.getNodeValue(); 331 } 332 333 String 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 e) { 366 ShareInfo s = p.getShareInfo(); 367 if (s != null) { 368 for (Iterator e2 = reader.getChildElements(e,"login"); e2.hasNext();) { 369 org.w3c.dom.Node loginnode = (org.w3c.dom.Node )e2.next(); 370 NamedNodeMap nm = loginnode.getAttributes(); 371 if (nm != null) { 372 org.w3c.dom.Node n = nm.getNamedItem("user"); 374 if (n != null) { 375 String user = n.getNodeValue(); 376 s.addUser(user); 377 } 378 379 n = nm.getNamedItem("group"); 381 if (n != null) { 382 String 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 e) { 392 ShareInfo s = b.getShareInfo(); 393 if (s != null) { 394 for (Iterator e2 = reader.getChildElements(e,"login"); e2.hasNext();) { 395 org.w3c.dom.Node loginnode = (org.w3c.dom.Node )e2.next(); 396 NamedNodeMap nm = loginnode.getAttributes(); 397 if (nm != null) { 398 org.w3c.dom.Node n = nm.getNamedItem("user"); 400 if (n != null) { 401 String user = n.getNodeValue(); 402 s.addUser(user); 403 } 404 405 n = nm.getNamedItem("group"); 407 if (n != null) { 408 String 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 ns = reader.getChildElements("shared","users");ns.hasNext(); ) { 421 Element n = (Element )ns.next(); 422 for(Iterator ns2 = reader.getChildElements(n,"user");ns2.hasNext(); ) { 423 Element n2 = (Element )ns2.next(); 424 NamedNodeMap nm = n2.getAttributes(); 425 if (nm != null) { 426 String name = null; 427 String password = null; 428 String method = null; 429 String ip = null; 430 431 org.w3c.dom.Node n3 = nm.getNamedItem("name"); 433 if (n3 != null) { 434 name = n3.getNodeValue(); 435 } 436 437 n3 = nm.getNamedItem("password"); 439 if (n3 != null) { 440 password = n3.getNodeValue(); 441 } 442 443 n3 = nm.getNamedItem("method"); 445 if (n3 != null) { 446 method = n3.getNodeValue(); 447 } 448 449 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 ns = reader.getChildElements("shared","providingpaths");ns.hasNext(); ) { 468 Element n = (Element )ns.next(); 469 for(Iterator ns2 = reader.getChildElements(n,"providingpath");ns2.hasNext(); ) { 470 Element n2 = (Element )ns2.next(); 471 NamedNodeMap nm = n2.getAttributes(); 472 if (nm != null) { 473 String method = null; 474 String path = null; 475 476 org.w3c.dom.Node n3 = nm.getNamedItem("path"); 478 if (n3 != null) { 479 path = n3.getNodeValue(); 480 } 481 482 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 ns = reader.getChildElements("shared","settings");ns.hasNext(); ) { 500 Element n = (Element )ns.next(); 501 org.w3c.dom.Node n2 = n.getFirstChild(); 502 while (n2 != null) { 503 String name = n2.getNodeName(); 504 org.w3c.dom.Node n3 = n2.getFirstChild(); 505 if (n3 != null) { 506 String 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 ns = reader.getChildElements("shared","groups");ns.hasNext(); ) { 522 Element n = (Element )ns.next(); 523 524 for(Iterator ns2 = reader.getChildElements(n,"group");ns2.hasNext(); ) { 525 Element n2 = (Element )ns2.next(); 526 NamedNodeMap nm = n2.getAttributes(); 527 if (nm != null) { 528 String name = null; 529 530 org.w3c.dom.Node n3 = nm.getNamedItem("name"); 532 if (n3 != null) { 533 name = n3.getNodeValue(); 534 } 535 536 ShareGroup sg = new ShareGroup(name); 537 for(Iterator ns3 = reader.getChildElements(n2,"member");ns3.hasNext(); ) { 538 Element n4 = (Element )ns3.next(); 539 NamedNodeMap nm2 = n4.getAttributes(); 540 if (nm2 != null) { 541 String member = null; 542 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 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 name) { 569 groups.remove(name); 570 writeShareFile(); 571 return true; 572 } 573 574 public static Iterator getShareUsers() { 575 return users.values().iterator(); 576 } 577 578 public static Iterator getShareGroups() { 579 return groups.values().iterator(); 580 } 581 582 public static ShareUser getShareUser(String name) { 583 Object 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 name) { 592 Object 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 getProviderName() { 606 return providername; 607 } 608 609 610 public static void setProviderName(String name) { 611 providername = name; 612 } 613 614 public static String getCallbackUrl() { 615 return callbackurl; 616 } 617 618 public static void setCallbackUrl(String url) { 619 callbackurl = url; 620 } 621 622 public static String createNewUser(String account,String password,String method,String 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 delUser(String 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 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 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 getProvidingPath(String method) { 665 return (String )providingpaths.get(method); 666 } 667 668 public static HashMap getProvidingPaths() { 669 return providingpaths; 670 } 671 672 } 673 | Popular Tags |