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