1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 package org.openoffice.setup.Util; 29 30 import java.io.File; 31 import java.util.Enumeration; 32 import java.util.Vector; 33 import org.openoffice.setup.InstallData; 34 import org.openoffice.setup.Installer.Installer; 35 import org.openoffice.setup.Installer.InstallerFactory; 36 import org.openoffice.setup.Panel.ChooseDirectory; 37 import org.openoffice.setup.ResourceManager; 38 import org.openoffice.setup.SetupData.PackageDescription; 39 import org.openoffice.setup.SetupData.SetupDataProvider; 40 import org.openoffice.setup.Util.Informer; 41 42 public class ModuleCtrl { 43 44 private ModuleCtrl() { 45 } 46 47 static public void setModuleSize(PackageDescription packageData) { 48 // Setting the package size for visible node modules, that have hidden children 49 // -> Java module has three hidden children and 0 byte size 50 51 if (( ! packageData.isLeaf() ) && ( ! packageData.isHidden() )) { 52 boolean setNewSize = false; 53 int size = packageData.getSize(); 54 55 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 56 PackageDescription child = (PackageDescription) e.nextElement(); 57 // if (( child.isHidden() ) && ( child.getSelectionState() == PackageDescription.DONT_KNOW )) { 58 if ( child.isHidden() ) { 59 setNewSize = true; 60 size = size + child.getSize(); 61 } 62 } 63 64 if ( setNewSize ) { 65 packageData.setSize(size); 66 } 67 } 68 69 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 70 PackageDescription child = (PackageDescription) e.nextElement(); 71 setModuleSize(child); 72 } 73 74 } 75 76 static public void setDefaultModuleSettings(PackageDescription data) { 77 // Setting default module settings for modules, that are not hidden 78 // Hidden modules do not get a defined state now 79 boolean isInstalled = false; 80 InstallData installdata = InstallData.getInstance(); 81 boolean isUninstall = installdata.isUninstallationMode(); 82 83 if (isUninstall) { 84 isInstalled = true; 85 } 86 87 if (isUninstall) { 88 if (isInstalled) { 89 data.setSelectionState(PackageDescription.REMOVE); 90 } else { 91 data.setSelectionState(PackageDescription.IGNORE); 92 System.err.println("NEVER"); 93 } 94 } else { 95 if (isInstalled) { 96 data.setSelectionState(PackageDescription.IGNORE); 97 System.err.println("NEVER"); 98 } else if (data.isDefault()) { 99 data.setSelectionState(PackageDescription.INSTALL); 100 } else if ( ! data.isDefault()) { 101 data.setSelectionState(PackageDescription.DONT_INSTALL); 102 } else { 103 data.setSelectionState(PackageDescription.DONT_INSTALL); 104 } 105 } 106 } 107 108 static public void setParentDefaultModuleSettings(PackageDescription packageData) { 109 // Setting the module states of parent modules. 110 // Called after ChooseDirectoryCtrl.java, because 111 // the database has to be known. In user installation it is important, 112 // that the installation directory is known, to find the database. 113 // Called during uninstallation in UninstallationPrologueCtrl.java 114 115 // Iteration before setting the module states. Because of this, all children 116 // get their final setting before the parent. 117 118 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 119 PackageDescription child = (PackageDescription) e.nextElement(); 120 setParentDefaultModuleSettings(child); 121 } 122 123 if ( ! packageData.isLeaf() ) { 124 // System.err.println("setParentDefaultModuleSettings: " + packageData.getName()); 125 int state = packageData.getSelectionState(); 126 InstallData installdata = InstallData.getInstance(); 127 boolean allChildrenIgnored = true; 128 boolean atLeastOneInstalled = false; 129 boolean allChildrenHidden = true; 130 131 // System.err.println(" STATE before iterating over children: " + state); 132 133 for (Enumeration e = packageData.children(); e.hasMoreElements();) { 134 PackageDescription child = (PackageDescription) e.nextElement(); 135 int childState = child.getSelectionState(); 136 137 // System.err.println(" Child: " + child.getName() + " : " + childState); 138 139 if ( childState != PackageDescription.IGNORE) { 140 allChildrenIgnored = false; 141 } 142 143 if (( childState == PackageDescription.INSTALL) || ( childState == PackageDescription.INSTALL_SOME)) { 144 atLeastOneInstalled = true; 145 } 146 147 if ( ! child.isHidden() ) { 148 allChildrenHidden = false; 149 } 150 151 if ((state == PackageDescription.DONT_KNOW) || (state == PackageDescription.IGNORE)) { 152 state = childState; 153 // } else if ((state != childState) && (childState != PackageDescription.IGNORE)) { 154 } else if ((state != childState) && (childState != PackageDescription.IGNORE) && (childState != PackageDescription.DONT_KNOW)) { 155 if ( installdata.isUninstallationMode() ) { 156 state = PackageDescription.REMOVE_SOME; 157 } else { 158 state = PackageDescription.INSTALL_SOME; 159 } 160 } 161 162 // System.err.println(" NEW state after child: " + state); 163 } 164 165 if ( allChildrenIgnored ) { 166 state = PackageDescription.IGNORE; 167 } 168 169 if ( installdata.isInstallationMode() ) { 170 if (( state == PackageDescription.INSTALL_SOME ) && ( ! atLeastOneInstalled )) { 171 state = PackageDescription.DONT_INSTALL; 172 } 173 } 174 175 if ( allChildrenHidden ) { 176 packageData.setAllChildrenHidden(true); 177 // System.err.println("Setting allChildrenHidden for module " + packageData.getName() ); 178 } 179 180 // If older version exist, only modules without packages shall be updated, 181 // because all packages are already determined by querying the database. 182 if ( installdata.olderVersionExists() ) { 183 if ( packageData.getPackageName().equals("") ) { 184 packageData.setSelectionState(state); 185 } 186 } else { 187 packageData.setSelectionState(state); 188 } 189 } 190 } 191 192 static public void setHiddenModuleSettingsInstall(PackageDescription packageData) { 193 // update selection states for hidden modules during installation 194 if (( packageData.isHidden() ) && ( packageData.getSelectionState() != packageData.IGNORE )) { 195 PackageDescription parent = (PackageDescription)packageData.getParent(); 196 if ( parent != null ) { 197 packageData.setSelectionState(parent.getSelectionState()); 198 // hidden modules at root module always have to be installed, if they are not already installed 199 if ( parent.getName() == "" ) { 200 packageData.setSelectionState(packageData.INSTALL); 201 // System.err.println("Setting 1 INSTALL flag to: " + packageData.getName()); 202 } 203 } 204 205 // INSTALL_SOME is not valid for leaves 206 if (( packageData.getSelectionState() == packageData.INSTALL_SOME ) && ( packageData.isLeaf() )) { 207 packageData.setSelectionState(packageData.INSTALL); 208 // System.err.println("Setting 2 INSTALL flag to: " + packageData.getName()); 209 } 210 } 211 212 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 213 PackageDescription child = (PackageDescription) e.nextElement(); 214 setHiddenModuleSettingsInstall(child); 215 } 216 } 217 218 static public void setHiddenModuleSettingsUninstall(PackageDescription packageData) { 219 InstallData data = InstallData.getInstance(); 220 // update selection states for hidden modules during uninstallation 221 if (( packageData.isHidden() ) && ( packageData.getSelectionState() != packageData.IGNORE )) { 222 // System.err.println("Package name: " + packageData.getName()); 223 // System.err.println("Selection: " + packageData.getSelectionState()); 224 225 PackageDescription parent = (PackageDescription)packageData.getParent(); 226 if ( parent != null ) { 227 packageData.setSelectionState(parent.getSelectionState()); 228 // Hidden modules at root module have to be uninstalled at complete uninstallation 229 // In Uninstallation the complete is the typical installation type 230 if (( parent.getName() == "" ) && ( data.isTypicalInstallation() )) { 231 packageData.setSelectionState(packageData.REMOVE); 232 } 233 // Hidden modules at root module must not be uninstalled at custom uninstallation 234 // But if all visible modules are selected for uninstallation, this shall be handled 235 // as complete uninstallation. 236 if ( ! data.isMaskedCompleteUninstallation() ) 237 { 238 if (( parent.getName() == "" ) && ( data.isCustomInstallation() )) { 239 packageData.setSelectionState(packageData.IGNORE); 240 } 241 } 242 } 243 244 // REMOVE_SOME is not valid for leaves 245 // if ( data.isTypicalInstallation() ) { 246 if (( packageData.getSelectionState() == packageData.REMOVE_SOME ) && ( packageData.isLeaf() )) { 247 packageData.setSelectionState(packageData.REMOVE); 248 } 249 // } 250 251 } 252 253 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 254 PackageDescription child = (PackageDescription) e.nextElement(); 255 setHiddenModuleSettingsUninstall(child); 256 } 257 } 258 259 static private boolean checkRequiredCoreModule(PackageDescription packageData) { 260 261 // This function uses a similar mechanism to determine 262 // core modules as function "setHiddenModuleSettingsInstall" 263 // -> only hidden parents, until there is a module without name (getName) 264 // Only searching until grandpa. 265 266 boolean requiredCoreModule = false; 267 268 // if packageData.getSelectionState() DONT_KNOW && parent auch DONT_KNOW 269 if (( packageData.isHidden() ) && 270 ( packageData.getSelectionState() != packageData.IGNORE ) && 271 ( packageData.getPackageName() != null )) { 272 //( packageData.isLeaf() )) { 273 PackageDescription parent = (PackageDescription)packageData.getParent(); 274 if ( parent != null ) { 275 if (( parent.getName().equals("") ) || ( parent.getName() == null )) { 276 requiredCoreModule = true; 277 } else { 278 if ( parent.isHidden() ) { 279 PackageDescription grandpa = (PackageDescription)parent.getParent(); 280 if ( grandpa != null ) { 281 if (( grandpa.getName().equals("") ) || ( grandpa.getName() == null )) { 282 requiredCoreModule = true; 283 } 284 } 285 } 286 } 287 } 288 } 289 290 return requiredCoreModule; 291 } 292 293 static public void setDatabaseSettings(PackageDescription packageData, InstallData installData, Installer installer) { 294 // Analyzing the system database and setting the module states. 295 // Called during installation in ChooseInstallationTypeCtrl.java, because 296 // the database has to be known. In user installation it is important, 297 // the the installation directory is known, to find the database. 298 // Called during uninstallation in UninstallationPrologueCtrl.java 299 300 boolean isUninstall = installData.isUninstallationMode(); 301 boolean isInstalled = installer.isPackageInstalled(packageData, installData); 302 303 if (isUninstall) { 304 if (isInstalled) { 305 packageData.setSelectionState(PackageDescription.REMOVE); 306 // The following is no longer required !? (IS, 06/05/08) 307 // PackageDescription parent = packageData.getParent(); 308 // if ( parent != null ) { 309 // if ( parent.getSelectionState() != PackageDescription.REMOVE ) { 310 // parent.setSelectionState(PackageDescription.REMOVE); 311 // System.err.println("Setting remove to " + parent.getName()); 312 // } 313 // } 314 } else { 315 // Attention: Setting all nodes to ignore! If a children gets REMOVE, 316 // then REMOVE is also set to the parent. Setting REMOVE happens after 317 // setting IGNORE, because children are evaluated after the parents. 318 // The default for uninstallation is set in setDefaultModuleSettings to REMOVE. 319 packageData.setSelectionState(PackageDescription.IGNORE); 320 } 321 } else { 322 boolean goodDepends = true; 323 if ( installData.getOSType().equalsIgnoreCase("SunOS") ) { 324 if (( installData.isRootInstallation() ) && ( packageData.getCheckSolaris() != null ) && ( ! packageData.getCheckSolaris().equals("") )) { 325 // the package has to be installed. Creating a new package with only packagename 326 if ( ! installer.isPackageNameInstalled(packageData.getCheckSolaris(), installData) ) { 327 goodDepends = false; 328 } 329 } 330 } 331 332 if ( ! goodDepends ) { 333 // The package dependencies are not valid -> ignoring package. 334 packageData.setSelectionState(PackageDescription.IGNORE); 335 // too late to hide the module 336 // packageData.setIsHidden(true); 337 } 338 else { 339 if ( isInstalled ) { 340 // Maybe a required core module is installed in an older version from another product 341 boolean isRequiredCoreModule = checkRequiredCoreModule(packageData); 342 if (( packageData.isJavaPackage() ) || ( isRequiredCoreModule )) { // only selected checks, because of performance reasons 343 boolean installedPackageIsOlder = installer.isInstalledPackageOlder(packageData, installData); 344 if ( ! installedPackageIsOlder ) { 345 // The package is already installed in the same or in a newer version 346 packageData.setSelectionState(PackageDescription.IGNORE); 347 } else { 348 // This is also something like migrating feature states 349 packageData.setSelectionState(PackageDescription.INSTALL); 350 LogManager.addLogfileComment("<b>Adding required older installed package:</b> " + packageData.getPackageName() + "</br>"); 351 } 352 } else { // no version check done -> so what is a good setting for already installed packages? 353 if ( installData.olderVersionExists() ) { // should never be the case in this function 354 packageData.setSelectionState(PackageDescription.INSTALL); 355 } else { 356 packageData.setSelectionState(PackageDescription.IGNORE); 357 } 358 } 359 } 360 else { 361 // Special handling for core modules, which are required, but not installed. 362 // This can be deinstalled by hand for example. 363 boolean isRequiredCoreModule = checkRequiredCoreModule(packageData); 364 if ( isRequiredCoreModule ) { 365 if ( packageData.getSelectionState() != PackageDescription.INSTALL ) { 366 packageData.setSelectionState(PackageDescription.INSTALL); 367 LogManager.addLogfileComment("<b>Adding required package:</b> " + packageData.getPackageName() + "</br>"); 368 } 369 // This package has to exist! 370 if ( ! packageExists(packageData, installData) ) { 371 372 String packagePath = installData.getPackagePath(); 373 if (( packageData.getPkgSubdir() != null ) && ( ! packageData.getPkgSubdir().equals("") )) { 374 File completePackageFile = new File(packagePath, packageData.getPkgSubdir()); 375 packagePath = completePackageFile.getPath(); 376 } 377 String packageName = packageData.getPackageName(); 378 File packageFile = new File(packagePath, packageName); 379 380 String log = "<b>Error: Missing required package " + packageFile.getPath() + "</b><br>"; 381 System.err.println(log); 382 String message = ResourceManager.getString("String_File_Not_Found") + ": " + packageFile.getPath(); 383 String title = ResourceManager.getString("String_Error"); 384 Informer.showErrorMessage(message, title); 385 System.exit(1); 386 } 387 } 388 } 389 } 390 } 391 392 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 393 PackageDescription child = (PackageDescription) e.nextElement(); 394 setDatabaseSettings(child, installData, installer); 395 } 396 } 397 398 static public void setShowInUserInstallFlags(PackageDescription packageData) { 399 400 // This function is not needed during deinstallation, because a 401 // module that could not be selected during installation, is always 402 // not installed during deinstallation and therefore gets "IGNORE" 403 // in function setDatabaseSettings 404 405 if ( ! packageData.showInUserInstall() ) { 406 packageData.setSelectionState(PackageDescription.IGNORE); 407 // too late to hide the module 408 // packageData.setIsHidden(true); 409 // packageData.setAllChildrenHidden(true); 410 } 411 412 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 413 PackageDescription child = (PackageDescription) e.nextElement(); 414 setShowInUserInstallFlags(child); 415 } 416 } 417 418 static public void setForcedUpdateProductSettings(PackageDescription packageData) { 419 420 if ( packageData.forceIntoUpdate() ) { 421 packageData.setSelectionState(PackageDescription.INSTALL); 422 } 423 424 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 425 PackageDescription child = (PackageDescription) e.nextElement(); 426 setForcedUpdateProductSettings(child); 427 } 428 } 429 430 static public void setShowInUserInstallOnlyFlags(PackageDescription packageData) { 431 432 // This function is not needed during deinstallation, because a 433 // module that could not be selected during installation, is always 434 // not installed during deinstallation and therefore gets "IGNORE" 435 // in function setDatabaseSettings 436 437 if ( packageData.showInUserInstallOnly() ) { 438 packageData.setSelectionState(PackageDescription.IGNORE); 439 // too late to hide the module 440 // packageData.setIsHidden(true); 441 // packageData.setAllChildrenHidden(true); 442 } 443 444 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 445 PackageDescription child = (PackageDescription) e.nextElement(); 446 setShowInUserInstallOnlyFlags(child); 447 } 448 } 449 450 static public void setIgnoreNonRelocatablePackages(PackageDescription packageData) { 451 if ( ! packageData.isRelocatable() ) { 452 packageData.setSelectionState(PackageDescription.IGNORE); 453 System.err.println("Ignoring package " + packageData.getName() + " " + packageData.getPackageName()); 454 } 455 456 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 457 PackageDescription child = (PackageDescription) e.nextElement(); 458 setIgnoreNonRelocatablePackages(child); 459 } 460 } 461 462 static public void setHiddenLanguageModuleDefaultSettings(PackageDescription packageData) { 463 464 // This function is needed during installation for the language modules, 465 // if there is only one language in the installation set. In this case the language 466 // modules are hidden (no selection possible) and therefore get no value in 467 // setDefaultModuleSettings(). This default value is set now. 468 469 if ( packageData.showMultiLingualOnly() ) { 470 packageData.setSelectionState(PackageDescription.INSTALL); 471 } 472 473 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 474 PackageDescription child = (PackageDescription) e.nextElement(); 475 setHiddenLanguageModuleDefaultSettings(child); 476 } 477 } 478 479 static private boolean packageExists(PackageDescription packageData, InstallData installData) { 480 boolean fileExists = false; 481 String packagePath = installData.getPackagePath(); 482 483 if (( packageData.getPkgSubdir() != null ) && ( ! packageData.getPkgSubdir().equals("") )) { 484 File completePackageFile = new File(packagePath, packageData.getPkgSubdir()); 485 packagePath = completePackageFile.getPath(); 486 } 487 488 String packageName = packageData.getPackageName(); 489 File packageFile = new File(packagePath, packageName); 490 491 if ( packageFile.exists() ) { 492 fileExists = true; 493 } 494 495 return fileExists; 496 } 497 498 static public void disableNonExistingPackages(PackageDescription packageData, InstallData installData) { 499 if ((( packageData.getPackageName() == null ) || ( packageData.getPackageName().equals("") )) 500 && packageData.isLeaf() ) { 501 packageData.setSelectionState(PackageDescription.IGNORE); 502 } else if ( ! packageExists(packageData, installData) ) { 503 packageData.setSelectionState(PackageDescription.IGNORE); 504 } 505 506 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 507 PackageDescription child = (PackageDescription) e.nextElement(); 508 disableNonExistingPackages(child, installData); 509 } 510 } 511 512 static public void setDontUninstallFlags(PackageDescription packageData) { 513 if ( packageData.dontUninstall() ) { 514 packageData.setSelectionState(PackageDescription.IGNORE); 515 } 516 517 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 518 PackageDescription child = (PackageDescription) e.nextElement(); 519 setDontUninstallFlags(child); 520 } 521 } 522 523 static public void setDontUninstallUserInstallOnylFlags(PackageDescription packageData) { 524 if ( packageData.showInUserInstallOnly() ) { 525 packageData.setSelectionState(PackageDescription.IGNORE); 526 } 527 528 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 529 PackageDescription child = (PackageDescription) e.nextElement(); 530 setDontUninstallUserInstallOnylFlags(child); 531 } 532 } 533 534 static public void checkVisibleModulesInstall(PackageDescription packageData, InstallData data) { 535 boolean setToTrue = false; 536 537 if (( ! packageData.isHidden() ) && ( packageData.getSelectionState() == packageData.INSTALL )) { 538 setToTrue = true; 539 data.setVisibleModulesChecked(true); 540 } 541 542 if ( ! setToTrue ) { 543 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 544 PackageDescription child = (PackageDescription) e.nextElement(); 545 checkVisibleModulesInstall(child, data); 546 } 547 } 548 } 549 550 static public void checkApplicationSelection(PackageDescription packageData, InstallData data) { 551 boolean setToTrue = false; 552 553 if (( packageData.isApplicationPackage() ) && 554 ( ! packageData.isHidden() ) && 555 ( packageData.getSelectionState() == packageData.INSTALL )) { 556 setToTrue = true; 557 data.setApplicationModulesChecked(true); 558 } 559 560 if ( ! setToTrue ) { 561 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 562 PackageDescription child = (PackageDescription) e.nextElement(); 563 checkApplicationSelection(child, data); 564 } 565 } 566 } 567 568 static public void checkLanguageSelection(PackageDescription packageData, InstallData data) { 569 boolean setToTrue = false; 570 571 if (( packageData.showMultiLingualOnly() ) && 572 ( ! packageData.isHidden() ) && 573 ( packageData.getSelectionState() == packageData.INSTALL )) { 574 setToTrue = true; 575 data.setLanguageModulesChecked(true); 576 } 577 578 if ( ! setToTrue ) { 579 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 580 PackageDescription child = (PackageDescription) e.nextElement(); 581 checkLanguageSelection(child, data); 582 } 583 } 584 } 585 586 static public void checkVisibleModulesUninstall(PackageDescription packageData, InstallData data) { 587 boolean setToTrue = false; 588 589 if (( ! packageData.isHidden() ) && ( packageData.getSelectionState() == packageData.REMOVE )) { 590 // ignoring the top level module, that has the state REMOVE (but no name) 591 if (( packageData.getName() != null ) && ( ! packageData.getName().equals("") )) { 592 setToTrue = true; 593 data.setVisibleModulesChecked(true); 594 } 595 } 596 597 if ( ! setToTrue ) { 598 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 599 PackageDescription child = (PackageDescription) e.nextElement(); 600 checkVisibleModulesUninstall(child, data); 601 } 602 } 603 } 604 605 static public void checkApplicationModulesUninstall(PackageDescription packageData, InstallData data) { 606 boolean setToTrue = false; 607 608 // At least one language module should not be uninstalled. Then this function returns true. 609 // An exeption is the complete uninstallation or the masked complete uninstallation. 610 611 if (( packageData.isApplicationPackage() ) && 612 ( ! packageData.isHidden() ) && 613 ( packageData.getSelectionState() != packageData.IGNORE ) && 614 ( packageData.getSelectionState() != packageData.REMOVE )) { 615 setToTrue = true; 616 data.setApplicationModulesChecked(true); 617 } 618 619 if ( ! setToTrue ) { 620 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 621 PackageDescription child = (PackageDescription) e.nextElement(); 622 checkApplicationModulesUninstall(child, data); 623 } 624 } 625 } 626 627 static public void checkLanguageModulesUninstall(PackageDescription packageData, InstallData data) { 628 boolean setToTrue = false; 629 630 // At least one language module should not be uninstalled. Then this function returns true. 631 // An exeption is the complete uninstallation or the masked complete uninstallation. 632 633 if (( packageData.showMultiLingualOnly() ) && 634 ( ! packageData.isHidden() ) && 635 ( packageData.getSelectionState() != packageData.IGNORE ) && 636 ( packageData.getSelectionState() != packageData.REMOVE )) { 637 setToTrue = true; 638 data.setLanguageModulesChecked(true); 639 } 640 641 if ( ! setToTrue ) { 642 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 643 PackageDescription child = (PackageDescription) e.nextElement(); 644 checkLanguageModulesUninstall(child, data); 645 } 646 } 647 } 648 649 static public void checkMaskedCompleteUninstallation(PackageDescription packageData, InstallData data) { 650 boolean setToFalse = false; 651 652 // If there is at least one visible module, that is not selected for removal 653 // this is no masked complete uninstallation 654 655 if (( ! packageData.isHidden() ) 656 && ( packageData.getSelectionState() != packageData.REMOVE ) 657 && ( packageData.getSelectionState() != packageData.IGNORE )) { 658 // ignoring the top level module, that has no name 659 if (( packageData.getName() != null ) && ( ! packageData.getName().equals("") )) { 660 setToFalse = true; 661 data.setMaskedCompleteUninstallation(false); 662 // System.err.println("This is no masked complete uninstallation!"); 663 // System.err.println("Caused by: " + packageData.getName() + " with " + packageData.getSelectionState()); 664 } 665 } 666 667 if ( ! setToFalse ) { 668 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 669 PackageDescription child = (PackageDescription) e.nextElement(); 670 checkMaskedCompleteUninstallation(child, data); 671 } 672 } 673 } 674 675 static public void saveTypicalSelectionStates(PackageDescription packageData) { 676 packageData.setTypicalSelectionState(packageData.getSelectionState()); 677 678 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 679 PackageDescription child = (PackageDescription) e.nextElement(); 680 saveTypicalSelectionStates(child); 681 } 682 } 683 684 static public void saveCustomSelectionStates(PackageDescription packageData) { 685 packageData.setCustomSelectionState(packageData.getSelectionState()); 686 687 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 688 PackageDescription child = (PackageDescription) e.nextElement(); 689 saveCustomSelectionStates(child); 690 } 691 } 692 693 static public void saveStartSelectionStates(PackageDescription packageData) { 694 packageData.setStartSelectionState(packageData.getSelectionState()); 695 696 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 697 PackageDescription child = (PackageDescription) e.nextElement(); 698 saveStartSelectionStates(child); 699 } 700 } 701 702 static public void restoreTypicalSelectionStates(PackageDescription packageData) { 703 packageData.setSelectionState(packageData.getTypicalSelectionState()); 704 705 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 706 PackageDescription child = (PackageDescription) e.nextElement(); 707 restoreTypicalSelectionStates(child); 708 } 709 } 710 711 static public void restoreCustomSelectionStates(PackageDescription packageData) { 712 packageData.setSelectionState(packageData.getCustomSelectionState()); 713 714 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 715 PackageDescription child = (PackageDescription) e.nextElement(); 716 restoreCustomSelectionStates(child); 717 } 718 } 719 720 static public void restoreStartSelectionStates(PackageDescription packageData) { 721 packageData.setSelectionState(packageData.getStartSelectionState()); 722 723 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 724 PackageDescription child = (PackageDescription) e.nextElement(); 725 restoreStartSelectionStates(child); 726 } 727 } 728 729 static public void setUpdateOlderProductSettings(PackageDescription packageData, InstallData data, Installer installer) { 730 if (( packageData.getPackageName() != null ) && ( ! packageData.getPackageName().equals(""))) { 731 if ( installer.isPackageInstalled(packageData, data) ) { 732 packageData.setSelectionState(PackageDescription.INSTALL); 733 734 // Special handling for jre package, because this is not necessarily older, if an older product is updated. 735 if ( packageData.isJavaPackage() ) { 736 if ( ! installer.isInstalledPackageOlder(packageData, data) ) { 737 packageData.setSelectionState(PackageDescription.DONT_INSTALL); 738 } 739 } 740 } else { 741 packageData.setSelectionState(PackageDescription.DONT_INSTALL); 742 // Special handling for Major Upgrade 743 if ( data.isMajorUpgrade() ) { 744 String basis = "ooobasis3"; 745 if ( data.getOSType().equalsIgnoreCase("Linux") ) { basis = basis + "."; } 746 String search = basis + data.getProductMinor(); 747 String replacestring = basis + data.getInstalledProductMinor(); 748 int pos = packageData.getPackageName().indexOf(search); 749 if ( pos > -1 ) { 750 // Check if this package is installed with a lower product minor 751 // Creating new package for removal, very simple PackageDescription 752 PackageDescription localPackage = new PackageDescription(); 753 localPackage.setUninstallCanFail(true); 754 localPackage.setIsRelocatable(packageData.isRelocatable()); 755 String localName = packageData.getPackageName(); 756 localName = localName.replace(search, replacestring); 757 localPackage.setPackageName(localName); 758 759 if ( ( packageData.getPkgRealName() != null ) && ( ! packageData.getPkgRealName().equals("") )) { 760 localName = packageData.getPkgRealName(); 761 localName = localName.replace(search, replacestring); 762 localPackage.setPkgRealName(localName); 763 } 764 765 if (( packageData.getName() != null ) && ( ! packageData.getName().equals("") )) { 766 localName = packageData.getName(); 767 localName = localName.replace(search, replacestring); 768 localPackage.setName(localName); 769 } 770 771 // saving also the order, needed for order of uninstallation 772 localPackage.setOrder(packageData.getOrder()); 773 774 // If the old package is installed, the new package can be installed, too, 775 // and the old package can be marked for removal (with dependency check). 776 if ( installer.isPackageInstalled(localPackage, data) ) { 777 packageData.setSelectionState(PackageDescription.INSTALL); 778 779 // Collecting all installed older packages for uninstallation 780 Vector oldPackages = data.getOldPackages(); 781 oldPackages.add(localPackage); 782 data.setOldPackages(oldPackages); 783 } 784 } 785 } 786 } 787 } 788 789 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 790 PackageDescription child = (PackageDescription) e.nextElement(); 791 setUpdateOlderProductSettings(child, data, installer); 792 } 793 } 794 795 static public void checkLanguagesPackages(PackageDescription packageData, InstallData installData) { 796 if (( packageData.getPkgLanguage() != null ) && ( ! packageData.getPkgLanguage().equals(""))) { 797 // This is a package with a specific language. 798 // pkgLanguage can be a comma separated list, for example "ja,ja_JP.PCK,ja_JP.UTF-8" 799 String allLang = packageData.getPkgLanguage(); 800 String[] allLangs = allLang.split(","); 801 802 Vector systemLanguages = installData.getSystemLanguages(); 803 804 boolean foundLang = false; 805 for (int i = 0; i < allLangs.length; i++) { 806 String oneLang = allLangs[i]; 807 oneLang = oneLang.trim(); 808 if ( systemLanguages.contains(oneLang)) { 809 foundLang = true; 810 int count = installData.getPreselectedLanguages(); 811 count++; 812 installData.setPreselectedLanguages(count); 813 break; 814 } 815 } 816 817 if ( ! foundLang ) { 818 packageData.setSelectionState(PackageDescription.DONT_INSTALL); 819 } 820 } 821 822 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 823 PackageDescription child = (PackageDescription) e.nextElement(); 824 checkLanguagesPackages(child, installData); 825 } 826 } 827 828 static public void setLanguagesPackages(PackageDescription packageData) { 829 if (( packageData.getPkgLanguage() != null ) && ( ! packageData.getPkgLanguage().equals(""))) { 830 // This is a package with a specific language. 831 packageData.setSelectionState(PackageDescription.INSTALL); 832 } 833 834 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 835 PackageDescription child = (PackageDescription) e.nextElement(); 836 setLanguagesPackages(child); 837 } 838 } 839 840 static public void setRequiredNewCoreModules(PackageDescription packageData, InstallData installData) { 841 // Special handling for core modules, which are required, but not installed. 842 boolean isRequiredCoreModule = checkRequiredCoreModule(packageData); 843 if ( isRequiredCoreModule ) { 844 if ( packageData.getSelectionState() != PackageDescription.INSTALL ) { 845 packageData.setSelectionState(PackageDescription.INSTALL); 846 LogManager.addLogfileComment("<b>Adding required package:</b> " + packageData.getPackageName() + "</br>"); 847 } 848 // This package has to exist! 849 if ( ! packageExists(packageData, installData) ) { 850 851 String packagePath = installData.getPackagePath(); 852 if (( packageData.getPkgSubdir() != null ) && ( ! packageData.getPkgSubdir().equals("") )) { 853 File completePackageFile = new File(packagePath, packageData.getPkgSubdir()); 854 packagePath = completePackageFile.getPath(); 855 } 856 String packageName = packageData.getPackageName(); 857 File packageFile = new File(packagePath, packageName); 858 859 String log = "<b>Error: Missing required package " + packageFile.getPath() + "</b><br>"; 860 System.err.println(log); 861 String message = ResourceManager.getString("String_File_Not_Found") + ": " + packageFile.getPath(); 862 String title = ResourceManager.getString("String_Error"); 863 Informer.showErrorMessage(message, title); 864 System.exit(1); 865 } 866 } 867 868 for (Enumeration e = packageData.children(); e.hasMoreElements(); ) { 869 PackageDescription child = (PackageDescription) e.nextElement(); 870 setRequiredNewCoreModules(child, installData); 871 } 872 } 873 874 static public void defaultDatabaseAnalysis(InstallData data) { 875 876 PackageDescription packageData = SetupDataProvider.getPackageDescription(); 877 Installer installer = InstallerFactory.getInstance(); 878 879 // restore default settings 880 if ( data.startSelectionStateSaved() ) { 881 // System.err.println("Restoring start selection states"); 882 ModuleCtrl.restoreStartSelectionStates(packageData); 883 } else { 884 ModuleCtrl.saveStartSelectionStates(packageData); 885 data.setStartSelectionStateSaved(true); 886 } 887 888 // Special ToDos, if this is an update installation of an older product. 889 // In this case, "chooseInstallationType" and "chooseComponents" are not called. 890 // Is it necessary to call "analyzeDatabase" ? 891 if ( data.olderVersionExists() ) { 892 // Calculation of size is not necessary, because only 893 // already installed packages will be updated. 894 895 if ( data.logModuleStates() ) { 896 Dumper.logModuleStates(packageData, "ChooseDirectory: Before setUpdateOlderProductSettings"); 897 } 898 899 // Updating only those packages that are installed. 900 ModuleCtrl.setUpdateOlderProductSettings(packageData, data, installer); 901 902 if ( data.logModuleStates() ) { 903 Dumper.logModuleStates(packageData, "ChooseDirectory: After setUpdateOlderProductSettings"); 904 } 905 906 // Setting packages that are forced into update, because they did not exist in older version. 907 ModuleCtrl.setForcedUpdateProductSettings(packageData); 908 909 if ( data.logModuleStates() ) { 910 Dumper.logModuleStates(packageData, "ChooseDirectory: After setForcedUpdateProductSettings"); 911 } 912 913 // Setting required root module packages (that are new in the update product). 914 ModuleCtrl.setRequiredNewCoreModules(packageData, data); 915 916 if ( data.logModuleStates() ) { 917 Dumper.logModuleStates(packageData, "ChooseDirectory: After setRequiredNewCoreModules"); 918 } 919 920 // Checking, if all packages are available 921 ModuleCtrl.disableNonExistingPackages(packageData, data); 922 923 if ( data.logModuleStates() ) { 924 Dumper.logModuleStates(packageData, "ChooseDirectory: After disableNonExistingPackages"); 925 } 926 927 // disable packages, that are not valid in user installation 928 if ( data.isUserInstallation() ) { 929 ModuleCtrl.setShowInUserInstallFlags(packageData); 930 931 if ( data.logModuleStates() ) { 932 Dumper.logModuleStates(packageData, "ChooseDirectory: After setShowInUserInstallFlags"); 933 } 934 } 935 else { // disable packages, that are not valid in root installation 936 ModuleCtrl.setShowInUserInstallOnlyFlags(packageData); 937 938 if ( data.logModuleStates() ) { 939 Dumper.logModuleStates(packageData, "ChooseDirectory: After setShowInUserInstallOnlyFlags"); 940 } 941 } 942 943 // Setting parent module settings. Only required for displaying correct module settings before starting installation. 944 ModuleCtrl.setParentDefaultModuleSettings(packageData); 945 946 if ( data.logModuleStates() ) { 947 Dumper.logModuleStates(packageData, "ChooseDirectory: After setParentDefaultModuleSettings"); 948 } 949 950 // Collecting packages to install 951 // This has to be done here, because "ChooseInstallationType" and "ChooseComponents" 952 // are not called. 953 Vector installPackages = new Vector(); 954 PackageCollector.collectInstallPackages(packageData, installPackages); 955 data.setInstallPackages(installPackages); 956 957 } else { // same version exists or no version exists 958 959 // database changed -> ignore saved states 960 data.setTypicalSelectionStateSaved(false); 961 data.setCustomSelectionStateSaved(false); 962 963 if ( data.logModuleStates() ) { 964 Dumper.logModuleStates(packageData, "analyzeDatabase: Start"); 965 } 966 967 // searching in the database for already installed packages 968 LogManager.setCommandsHeaderLine("Analyzing system database"); 969 ModuleCtrl.setDatabaseSettings(packageData, data, installer); 970 971 if ( data.logModuleStates() ) { 972 Dumper.logModuleStates(packageData, "analyzeDatabase: After setDatabaseSettings"); 973 } 974 975 // ModuleCtrl.analyzeDatabase(); 976 ModuleCtrl.disableNonExistingPackages(packageData, data); 977 978 if ( data.logModuleStates() ) { 979 Dumper.logModuleStates(packageData, "ChooseDirectory: After disableNonExistingPackages"); 980 } 981 982 // disable packages, that are not valid in user installation 983 if ( data.isUserInstallation() ) { 984 ModuleCtrl.setShowInUserInstallFlags(packageData); 985 986 if ( data.logModuleStates() ) { 987 Dumper.logModuleStates(packageData, "ChooseDirectory: After setShowInUserInstallFlags"); 988 } 989 } else { // disable packages, that are not valid in root installation 990 ModuleCtrl.setShowInUserInstallOnlyFlags(packageData); 991 992 if ( data.logModuleStates() ) { 993 Dumper.logModuleStates(packageData, "ChooseDirectory: After setShowInUserInstallOnlyFlags"); 994 } 995 } 996 997 // Problem: If all submodules have flag IGNORE, the parent can also get IGNORE 998 // That is interesting for language packs with three submodules. 999 ModuleCtrl.setParentDefaultModuleSettings(packageData); 1000 1001 if ( data.logModuleStates() ) { 1002 Dumper.logModuleStates(packageData, "ChooseDirectory: After setParentDefaultModuleSettings"); 1003 } 1004 } 1005 } 1006 1007 } 1008