xref: /trunk/main/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java (revision 3309286857f19787ae62bd793a98b5af4edd2ad3)
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
10cdf0e10cSrcweir  *
119a1eeea9SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
209a1eeea9SAndrew Rist  *************************************************************/
219a1eeea9SAndrew Rist 
229a1eeea9SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir package org.openoffice.setup.InstallerHelper;
25cdf0e10cSrcweir 
26cdf0e10cSrcweir import org.openoffice.setup.InstallData;
27cdf0e10cSrcweir import org.openoffice.setup.SetupData.PackageDescription;
28cdf0e10cSrcweir import org.openoffice.setup.Util.Converter;
29cdf0e10cSrcweir import org.openoffice.setup.Util.ExecuteProcess;
30cdf0e10cSrcweir import org.openoffice.setup.Util.LogManager;
31cdf0e10cSrcweir import org.openoffice.setup.Util.SystemManager;
32cdf0e10cSrcweir import java.io.File;
33cdf0e10cSrcweir import java.util.Enumeration;
34cdf0e10cSrcweir import java.util.HashMap;
35cdf0e10cSrcweir import java.util.Vector;public class LinuxHelper {
36cdf0e10cSrcweir 
LinuxHelper()37cdf0e10cSrcweir     public LinuxHelper() {
38cdf0e10cSrcweir         super();
39cdf0e10cSrcweir     }
40cdf0e10cSrcweir 
getPackageNamesContent(PackageDescription packageData, Vector packageNames)41cdf0e10cSrcweir     private void getPackageNamesContent(PackageDescription packageData, Vector packageNames) {
42cdf0e10cSrcweir         if (( packageData.getPackageName() != null ) && ( ! packageData.getPackageName().equals("")))  {
43cdf0e10cSrcweir             packageNames.add(packageData.getPackageName() + "=" + packageData.getFullPackageName());
44cdf0e10cSrcweir         }
45cdf0e10cSrcweir 
46cdf0e10cSrcweir         for (Enumeration e = packageData.children(); e.hasMoreElements(); ) {
47cdf0e10cSrcweir             PackageDescription child = (PackageDescription) e.nextElement();
48cdf0e10cSrcweir             getPackageNamesContent(child, packageNames);
49cdf0e10cSrcweir         }
50cdf0e10cSrcweir     }
51cdf0e10cSrcweir 
getPackageNameFromRpm(PackageDescription packageData, InstallData installData)52cdf0e10cSrcweir     private String getPackageNameFromRpm(PackageDescription packageData, InstallData installData) {
53cdf0e10cSrcweir         String fullPackageName = null;
54cdf0e10cSrcweir         String packagePath = installData.getPackagePath();
55cdf0e10cSrcweir 
56cdf0e10cSrcweir         if (( packageData.getPkgSubdir() != null ) && ( ! packageData.getPkgSubdir().equals("") )) {
57cdf0e10cSrcweir             File completePackageFile = new File(packagePath, packageData.getPkgSubdir());
58cdf0e10cSrcweir             packagePath = completePackageFile.getPath();
59cdf0e10cSrcweir         }
60cdf0e10cSrcweir 
61cdf0e10cSrcweir         String rpmFileName = packageData.getPackageName();
62cdf0e10cSrcweir         File rpmFile = new File(packagePath, rpmFileName);
63cdf0e10cSrcweir 
64cdf0e10cSrcweir         if ( rpmFile.exists() ) {
65cdf0e10cSrcweir             String rpmCommand = "rpm -qp " + rpmFile.getPath();
66cdf0e10cSrcweir             String[] rpmCommandArray = new String[3];
67cdf0e10cSrcweir             rpmCommandArray[0] = "rpm";
68cdf0e10cSrcweir             rpmCommandArray[1] = "-qp";
69cdf0e10cSrcweir             rpmCommandArray[2] = rpmFile.getPath();
70cdf0e10cSrcweir 
71cdf0e10cSrcweir             Vector returnVector = new Vector();
72cdf0e10cSrcweir             Vector returnErrorVector = new Vector();
73cdf0e10cSrcweir             int returnValue = ExecuteProcess.executeProcessReturnVector(rpmCommandArray, returnVector, returnErrorVector);
74cdf0e10cSrcweir             String returnString = (String) returnVector.get(0);
75cdf0e10cSrcweir 
76cdf0e10cSrcweir             String log = rpmCommand + "<br><b>Returns: " + returnString + "</b><br>";
77cdf0e10cSrcweir             LogManager.addCommandsLogfileComment(log);
78cdf0e10cSrcweir 
79cdf0e10cSrcweir             fullPackageName = returnString;
80cdf0e10cSrcweir 
81cdf0e10cSrcweir         } else {
82cdf0e10cSrcweir             System.err.println("Error: Could not find file " + rpmFile.getPath());
83cdf0e10cSrcweir         }
84cdf0e10cSrcweir 
85cdf0e10cSrcweir         return fullPackageName;
86cdf0e10cSrcweir     }
87cdf0e10cSrcweir 
checkPackageExistence(PackageDescription packageData, InstallData installData)88cdf0e10cSrcweir     private boolean checkPackageExistence(PackageDescription packageData, InstallData installData) {
89cdf0e10cSrcweir         boolean fileExists = false;
90cdf0e10cSrcweir 
91cdf0e10cSrcweir         String packagePath = installData.getPackagePath();
92cdf0e10cSrcweir 
93cdf0e10cSrcweir         if (( packageData.getPkgSubdir() != null ) && ( ! packageData.getPkgSubdir().equals("") )) {
94cdf0e10cSrcweir             File completePackageFile = new File(packagePath, packageData.getPkgSubdir());
95cdf0e10cSrcweir             packagePath = completePackageFile.getPath();
96cdf0e10cSrcweir         }
97cdf0e10cSrcweir 
98cdf0e10cSrcweir         String rpmFileName = packageData.getPackageName();
99cdf0e10cSrcweir 
100cdf0e10cSrcweir         File rpmFile = new File(packagePath, rpmFileName);
101cdf0e10cSrcweir         if ( rpmFile.exists() ) {
102cdf0e10cSrcweir             fileExists = true;
103cdf0e10cSrcweir         }
104cdf0e10cSrcweir 
105cdf0e10cSrcweir         return fileExists;
106cdf0e10cSrcweir     }
107cdf0e10cSrcweir 
analyzeVersionString(String versionString)108cdf0e10cSrcweir     private HashMap analyzeVersionString(String versionString) {
109cdf0e10cSrcweir 
110cdf0e10cSrcweir         boolean errorOccured = false;
111cdf0e10cSrcweir 
112cdf0e10cSrcweir         Integer micro = null;
113cdf0e10cSrcweir         Integer minor = null;
114cdf0e10cSrcweir         Integer major = null;
115cdf0e10cSrcweir         Integer release = null;
116cdf0e10cSrcweir 
117cdf0e10cSrcweir         String microString = null;
118cdf0e10cSrcweir         String minorString = null;
119cdf0e10cSrcweir         String majorString = null;
120cdf0e10cSrcweir         String releaseString = null;
121cdf0e10cSrcweir 
122cdf0e10cSrcweir         int pos = versionString.lastIndexOf("_");  // this is a jre RPM (1.5.0_06)
123cdf0e10cSrcweir 
124cdf0e10cSrcweir         if ( pos > -1 ) {
125cdf0e10cSrcweir             try {
126cdf0e10cSrcweir                 releaseString = versionString.substring(pos+1, versionString.length());
127cdf0e10cSrcweir                 versionString = versionString.substring(0, pos);
128cdf0e10cSrcweir             } catch (IndexOutOfBoundsException ex) {
129cdf0e10cSrcweir                 System.err.println("Error: Could not get substring from " + versionString);
130cdf0e10cSrcweir                 errorOccured = true;
131cdf0e10cSrcweir             }
132cdf0e10cSrcweir             try {
133cdf0e10cSrcweir                 int releaseInt = Integer.parseInt(releaseString);
134cdf0e10cSrcweir                 release = new Integer(releaseInt);
135cdf0e10cSrcweir             } catch (NumberFormatException ex) {
136cdf0e10cSrcweir                 System.err.println("Error: Could not convert " + releaseString + " to integer");
137cdf0e10cSrcweir                 errorOccured = true;
138cdf0e10cSrcweir             }
139cdf0e10cSrcweir         }
140cdf0e10cSrcweir 
141cdf0e10cSrcweir         // Problem: Some rpms have "2.3" instead of "2.3.0"
142cdf0e10cSrcweir         String compareString = versionString;
143cdf0e10cSrcweir         pos = compareString.lastIndexOf(".");  // returns "-1", if not found
144cdf0e10cSrcweir         if ( pos > -1 ) {
145cdf0e10cSrcweir             String substring = compareString.substring(0, pos);
146cdf0e10cSrcweir             pos = substring.lastIndexOf(".");  // returns "-1", if not found
147cdf0e10cSrcweir             if ( pos == -1 ) {
148cdf0e10cSrcweir                 versionString = versionString + ".0";
149cdf0e10cSrcweir                 // System.err.println("Warning: Changing from " + compareString + " to " + versionString);
150cdf0e10cSrcweir             }
151cdf0e10cSrcweir         } else {
152cdf0e10cSrcweir             versionString = versionString + ".0.0";
153cdf0e10cSrcweir         }
154cdf0e10cSrcweir 
155cdf0e10cSrcweir         // the standard analyzing mechanism
156cdf0e10cSrcweir         pos = versionString.lastIndexOf(".");  // returns "-1", if not found
157cdf0e10cSrcweir 
158cdf0e10cSrcweir         if ( pos > -1 )
159cdf0e10cSrcweir         {
160cdf0e10cSrcweir             try {
161cdf0e10cSrcweir                 microString = versionString.substring(pos+1, versionString.length());
162cdf0e10cSrcweir                 versionString = versionString.substring(0, pos);
163cdf0e10cSrcweir             } catch (IndexOutOfBoundsException ex) {
164cdf0e10cSrcweir                 System.err.println("Error: Could not get substring from " + versionString);
165cdf0e10cSrcweir                 errorOccured = true;
166cdf0e10cSrcweir             }
167cdf0e10cSrcweir 
168cdf0e10cSrcweir             pos = versionString.lastIndexOf(".");
169cdf0e10cSrcweir             if ( pos > -1 ) {
170cdf0e10cSrcweir                 try {
171cdf0e10cSrcweir                     minorString = versionString.substring(pos+1, versionString.length());
172cdf0e10cSrcweir                     majorString = versionString.substring(0, pos);
173cdf0e10cSrcweir                 } catch (IndexOutOfBoundsException ex) {
174cdf0e10cSrcweir                     System.err.println("Error: Could not get substring from " + versionString);
175cdf0e10cSrcweir                     errorOccured = true;
176cdf0e10cSrcweir                 }
177cdf0e10cSrcweir                 try {
178cdf0e10cSrcweir                     int microInt = Integer.parseInt(microString);
179cdf0e10cSrcweir                     int minorInt = Integer.parseInt(minorString);
180cdf0e10cSrcweir                     int majorInt = Integer.parseInt(majorString);
181cdf0e10cSrcweir                     micro = new Integer(microInt);
182cdf0e10cSrcweir                     minor = new Integer(minorInt);
183cdf0e10cSrcweir                     major = new Integer(majorInt);
184cdf0e10cSrcweir                 } catch (NumberFormatException ex) {
185cdf0e10cSrcweir                     System.err.println("Error: Could not convert " + microString + "," +
186cdf0e10cSrcweir                                        minorString + " or " + majorString + " to integer");
187cdf0e10cSrcweir                     errorOccured = true;
188cdf0e10cSrcweir                 }
189cdf0e10cSrcweir             }
190cdf0e10cSrcweir         }
191cdf0e10cSrcweir 
192cdf0e10cSrcweir         // if ( microString == null ) { microString = ""; }
193cdf0e10cSrcweir         // if ( majorString == null ) { majorString = ""; }
194cdf0e10cSrcweir         // if ( releaseString == null ) { releaseString = ""; }
195cdf0e10cSrcweir         // if ( minorString == null ) { minorString = ""; }
196cdf0e10cSrcweir         // System.err.println("Major " + majorString + " Minor: " + minorString + " Micro: " + microString + " Release: " + releaseString);
197cdf0e10cSrcweir 
198cdf0e10cSrcweir         if ( errorOccured ) {
199cdf0e10cSrcweir             micro = null;
200cdf0e10cSrcweir             minor = null;
201cdf0e10cSrcweir             major = null;
202cdf0e10cSrcweir             release = null;
203cdf0e10cSrcweir         }
204cdf0e10cSrcweir 
205cdf0e10cSrcweir         HashMap hashRpm = new HashMap();
206cdf0e10cSrcweir 
207cdf0e10cSrcweir         hashRpm.put("micro", micro);
208cdf0e10cSrcweir         hashRpm.put("minor", minor);
209cdf0e10cSrcweir         hashRpm.put("major", major);
210cdf0e10cSrcweir         hashRpm.put("release", release);
211cdf0e10cSrcweir 
212cdf0e10cSrcweir         // If one of this values is "null", procedure "compareTwoRpms" always delivers false.
213cdf0e10cSrcweir         // This means, that the installed package is not older.
214cdf0e10cSrcweir 
215cdf0e10cSrcweir         // System.err.println("Analyzed: " + "micro: " + hashRpm.get("micro").toString() + " minor: " + hashRpm.get("minor").toString() + " major: " + hashRpm.get("major").toString());
216cdf0e10cSrcweir 
217cdf0e10cSrcweir         return hashRpm;
218cdf0e10cSrcweir     }
219cdf0e10cSrcweir 
analyzeReleaseString(HashMap hashRpm, String releaseString)220cdf0e10cSrcweir     private HashMap analyzeReleaseString(HashMap hashRpm, String releaseString) {
221cdf0e10cSrcweir         int release;
222cdf0e10cSrcweir 
223cdf0e10cSrcweir         try {
224cdf0e10cSrcweir             release = Integer.parseInt(releaseString);
225cdf0e10cSrcweir             Integer releaseObj = new Integer(release);
226cdf0e10cSrcweir             hashRpm.put("release", releaseObj);
227cdf0e10cSrcweir          }
228cdf0e10cSrcweir         catch (NumberFormatException ex) {
229cdf0e10cSrcweir             // JRE often contain a string like "FCS"
230cdf0e10cSrcweir             // System.err.println("Error: Could not convert " + releaseString + " to integer");
231cdf0e10cSrcweir             hashRpm.put("release", null);
232cdf0e10cSrcweir         }
233cdf0e10cSrcweir 
234cdf0e10cSrcweir         return hashRpm;
235cdf0e10cSrcweir     }
236cdf0e10cSrcweir 
getInstalledMinor(String version)237cdf0e10cSrcweir     public int getInstalledMinor(String version) {
238cdf0e10cSrcweir 
239cdf0e10cSrcweir         int minor = 0;
240cdf0e10cSrcweir         int pos = version.indexOf(".");
241cdf0e10cSrcweir         if ( pos > -1 ) {
242cdf0e10cSrcweir             String reduced = version.substring(pos + 1, version.length());
243cdf0e10cSrcweir 
244cdf0e10cSrcweir             pos = reduced.indexOf(".");
245cdf0e10cSrcweir             if ( pos > -1 ) {
246cdf0e10cSrcweir                 reduced = reduced.substring(0, pos);
247cdf0e10cSrcweir                 minor = Integer.parseInt(reduced);
248cdf0e10cSrcweir             }
249cdf0e10cSrcweir         }
250cdf0e10cSrcweir 
251cdf0e10cSrcweir         return minor;
252cdf0e10cSrcweir     }
253cdf0e10cSrcweir 
compareTwoRpms(HashMap hash1, HashMap hash2)254cdf0e10cSrcweir     private boolean compareTwoRpms(HashMap hash1, HashMap hash2) {
255cdf0e10cSrcweir         boolean hash1IsOlder = false;
256cdf0e10cSrcweir 
257cdf0e10cSrcweir         if (( hash1.get("major") != null ) && ( hash2.get("major") != null )) {
258cdf0e10cSrcweir             if ( ((Integer)hash1.get("major")).intValue() < ((Integer)hash2.get("major")).intValue() ) {
259cdf0e10cSrcweir                 hash1IsOlder = true;
260cdf0e10cSrcweir             } else {
261cdf0e10cSrcweir                 if (( hash1.get("minor") != null ) && ( hash2.get("minor") != null )) {
262cdf0e10cSrcweir                     if ( ((Integer)hash1.get("minor")).intValue() < ((Integer)hash2.get("minor")).intValue() ) {
263cdf0e10cSrcweir                         hash1IsOlder = true;
264cdf0e10cSrcweir                     } else {
265cdf0e10cSrcweir                         if (( hash1.get("micro") != null ) && ( hash2.get("micro") != null )) {
266cdf0e10cSrcweir                             if ( ((Integer)hash1.get("micro")).intValue() < ((Integer)hash2.get("micro")).intValue() ) {
267cdf0e10cSrcweir                                 hash1IsOlder = true;
268cdf0e10cSrcweir                             } else {
269cdf0e10cSrcweir                                 if (( hash1.get("release") != null ) && ( hash2.get("release") != null )) {
270cdf0e10cSrcweir                                     if ( ((Integer)hash1.get("release")).intValue() < ((Integer)hash2.get("release")).intValue() ) {
271cdf0e10cSrcweir                                         hash1IsOlder = true;
272cdf0e10cSrcweir                                     }
273cdf0e10cSrcweir                                 }
274cdf0e10cSrcweir                             }
275cdf0e10cSrcweir                         }
276cdf0e10cSrcweir                     }
277cdf0e10cSrcweir                 }
278cdf0e10cSrcweir             }
279cdf0e10cSrcweir         }
280cdf0e10cSrcweir 
281cdf0e10cSrcweir         return hash1IsOlder;
282cdf0e10cSrcweir     }
283cdf0e10cSrcweir 
compareVersionAndRelease(String versionString, String releaseString, PackageDescription packageData, boolean checkIfInstalledIsOlder)284cdf0e10cSrcweir     public boolean compareVersionAndRelease(String versionString, String releaseString, PackageDescription packageData, boolean checkIfInstalledIsOlder) {
285cdf0e10cSrcweir         // version and release are gotten from the rpm database. packageData contains
286cdf0e10cSrcweir         // the information about the rpm, that shall be installed. It has to be installed,
287cdf0e10cSrcweir         // if the installed product defined by version and release is older.
288cdf0e10cSrcweir         // version is something like "2.0.3", release something like "164".
289cdf0e10cSrcweir         // An exception is the jre package, where version is "1.5.0_06" and release "fcs".
290cdf0e10cSrcweir 
291cdf0e10cSrcweir         HashMap installedRpm = analyzeVersionString(versionString);
292cdf0e10cSrcweir         if ( installedRpm.get("release") == null ) {
293cdf0e10cSrcweir             installedRpm = analyzeReleaseString(installedRpm, releaseString);
294cdf0e10cSrcweir         }
295cdf0e10cSrcweir 
296cdf0e10cSrcweir         // System.err.println("Package: " + packageData.getPackageName());
297cdf0e10cSrcweir         // String outputString = "Installed RPM: ";
298cdf0e10cSrcweir         // if ( installedRpm.get("major") != null ) { outputString = outputString + " major: " + installedRpm.get("major").toString(); }
299cdf0e10cSrcweir         // else { outputString = outputString + " major is null"; }
300cdf0e10cSrcweir         // if ( installedRpm.get("minor") != null ) { outputString = outputString + " minor: " + installedRpm.get("minor").toString(); }
301cdf0e10cSrcweir         // else { outputString = outputString + " minor is null"; }
302cdf0e10cSrcweir         // if ( installedRpm.get("micro") != null ) { outputString = outputString + " micro: " + installedRpm.get("micro").toString(); }
303cdf0e10cSrcweir         // else { outputString = outputString + " micro is null"; }
304cdf0e10cSrcweir         // if ( installedRpm.get("release") != null ) { outputString = outputString + " release: " + installedRpm.get("release").toString(); }
305cdf0e10cSrcweir         // else { outputString = outputString + " release is null"; }
306cdf0e10cSrcweir         // System.err.println(outputString);
307cdf0e10cSrcweir 
308cdf0e10cSrcweir         HashMap notInstalledRpm = analyzeVersionString(packageData.getPkgVersion());
309cdf0e10cSrcweir         if ( notInstalledRpm.get("release") == null ) {
310cdf0e10cSrcweir             notInstalledRpm = analyzeReleaseString(notInstalledRpm, packageData.getPkgRelease());
311cdf0e10cSrcweir         }
312cdf0e10cSrcweir 
313cdf0e10cSrcweir         // outputString = "Not installed RPM: ";
314cdf0e10cSrcweir         // if ( notInstalledRpm.get("major") != null ) { outputString = outputString + " major: " + notInstalledRpm.get("major").toString(); }
315cdf0e10cSrcweir         // else { outputString = outputString + " major is null"; }
316cdf0e10cSrcweir         // if ( notInstalledRpm.get("minor") != null ) { outputString = outputString + " minor: " + notInstalledRpm.get("minor").toString(); }
317cdf0e10cSrcweir         // else { outputString = outputString + " minor is null"; }
318cdf0e10cSrcweir         // if ( notInstalledRpm.get("micro") != null ) { outputString = outputString + " micro: " + notInstalledRpm.get("micro").toString(); }
319cdf0e10cSrcweir         // else { outputString = outputString + " micro is null"; }
320cdf0e10cSrcweir         // if ( notInstalledRpm.get("release") != null ) { outputString = outputString + " release: " + notInstalledRpm.get("release").toString(); }
321cdf0e10cSrcweir         // else { outputString = outputString + " release is null"; }
322cdf0e10cSrcweir         // System.err.println(outputString);
323cdf0e10cSrcweir 
324cdf0e10cSrcweir         boolean firstIsOlder = false;
325cdf0e10cSrcweir 
326cdf0e10cSrcweir         if ( checkIfInstalledIsOlder ) {
327cdf0e10cSrcweir             firstIsOlder = compareTwoRpms(installedRpm, notInstalledRpm);
328cdf0e10cSrcweir             // System.err.println("Result: Installed RPM is older: " + firstIsOlder);
329cdf0e10cSrcweir         } else {
330cdf0e10cSrcweir             firstIsOlder = compareTwoRpms(notInstalledRpm, installedRpm);
331cdf0e10cSrcweir             // System.err.println("Result: Not installed RPM is older: " + firstIsOlder);
332cdf0e10cSrcweir         }
333cdf0e10cSrcweir 
334cdf0e10cSrcweir         return firstIsOlder;
335cdf0e10cSrcweir     }
336cdf0e10cSrcweir 
getLinuxPackageNamesFromRpmquery(PackageDescription packageData, InstallData installData)337cdf0e10cSrcweir     public void getLinuxPackageNamesFromRpmquery(PackageDescription packageData, InstallData installData) {
338cdf0e10cSrcweir 
339cdf0e10cSrcweir         if ((packageData.getPackageName() != null) && ( ! packageData.getPackageName().equals(""))) {
340cdf0e10cSrcweir 
341cdf0e10cSrcweir             boolean rpmExists = checkPackageExistence(packageData, installData);
342cdf0e10cSrcweir 
343cdf0e10cSrcweir             if ( rpmExists ) {
344cdf0e10cSrcweir                 // Full package name not defined in xpd file
345cdf0e10cSrcweir                 if (( packageData.getFullPackageName() == null ) || ( packageData.getFullPackageName().equals(""))) {
346cdf0e10cSrcweir                     // Now it is possible to query the rpm database for the packageName, if it is not defined in xpd file!
347cdf0e10cSrcweir                     String fullPackageName = getPackageNameFromRpm(packageData, installData);
348cdf0e10cSrcweir                     if ( fullPackageName != null ) {
349cdf0e10cSrcweir                         packageData.setFullPackageName(fullPackageName);
350cdf0e10cSrcweir                     } else {
351cdf0e10cSrcweir                         System.err.println("Error: Linux package name not defined in xpd file and could not be determined: "
352cdf0e10cSrcweir                                 + packageData.getPackageName());
353cdf0e10cSrcweir                     }
354cdf0e10cSrcweir                 }
355cdf0e10cSrcweir                 packageData.setPkgExists(true);
356cdf0e10cSrcweir 
357cdf0e10cSrcweir             } else {
358cdf0e10cSrcweir                 packageData.setPkgExists(false);
359cdf0e10cSrcweir             }
360cdf0e10cSrcweir 
361cdf0e10cSrcweir         }
362cdf0e10cSrcweir 
363cdf0e10cSrcweir         for (Enumeration e = packageData.children(); e.hasMoreElements(); ) {
364cdf0e10cSrcweir             PackageDescription child = (PackageDescription) e.nextElement();
365cdf0e10cSrcweir             getLinuxPackageNamesFromRpmquery(child, installData);
366cdf0e10cSrcweir         }
367cdf0e10cSrcweir     }
368cdf0e10cSrcweir 
getLinuxDatabasePath(InstallData data)369cdf0e10cSrcweir     public String getLinuxDatabasePath(InstallData data) {
370cdf0e10cSrcweir         String databasePath = null;
371cdf0e10cSrcweir         String installDir = data.getInstallDir();
372cdf0e10cSrcweir         String databaseDir = installDir;
373cdf0e10cSrcweir         // String databaseDir = SystemManager.getParentDirectory(installDir);
374cdf0e10cSrcweir         String linuxDatabaseName = ".RPM_OFFICE_DATABASE";
375cdf0e10cSrcweir         File databaseFile = new File(databaseDir, linuxDatabaseName);
376cdf0e10cSrcweir         databasePath = databaseFile.getPath();
377cdf0e10cSrcweir         return databasePath;
378cdf0e10cSrcweir     }
379cdf0e10cSrcweir 
investigateDebian(InstallData data)380cdf0e10cSrcweir     public void investigateDebian(InstallData data) {
381cdf0e10cSrcweir 
382cdf0e10cSrcweir         // First check: Is this a Debian system?
383cdf0e10cSrcweir 
384cdf0e10cSrcweir         String dpkgFile = "/usr/bin/dpkg";
385cdf0e10cSrcweir 
386cdf0e10cSrcweir         if ( new File(dpkgFile).exists() ) {
387cdf0e10cSrcweir 
388cdf0e10cSrcweir             data.setIsDebianSystem(true);
389cdf0e10cSrcweir 
390cdf0e10cSrcweir             // Second check: If this is a Debian system, is "--force-debian" required? Older
391cdf0e10cSrcweir             // versions do not support "--force-debian".
392cdf0e10cSrcweir 
393cdf0e10cSrcweir             // String rpmQuery = "rpm --help;
394cdf0e10cSrcweir             String[] rpmQueryArray = new String[2];
395cdf0e10cSrcweir             rpmQueryArray[0] = "rpm";
396cdf0e10cSrcweir             rpmQueryArray[1] = "--help";
397cdf0e10cSrcweir 
398cdf0e10cSrcweir             Vector returnVector = new Vector();
399cdf0e10cSrcweir             Vector returnErrorVector = new Vector();
400cdf0e10cSrcweir             int returnValue = ExecuteProcess.executeProcessReturnVector(rpmQueryArray, returnVector, returnErrorVector);
401cdf0e10cSrcweir 
402cdf0e10cSrcweir             // Checking if the return vector contains the string "force-debian"
403cdf0e10cSrcweir 
404cdf0e10cSrcweir             for (int i = 0; i < returnVector.size(); i++) {
405cdf0e10cSrcweir                 String line = (String) returnVector.get(i);
406cdf0e10cSrcweir                 if ( line.indexOf("force-debian") > -1 ) {
407cdf0e10cSrcweir                     data.setUseForceDebian(true);
408cdf0e10cSrcweir                 }
409cdf0e10cSrcweir             }
410cdf0e10cSrcweir         }
411cdf0e10cSrcweir     }
412cdf0e10cSrcweir 
getLinuxFileInfo(PackageDescription packageData)413cdf0e10cSrcweir     public void getLinuxFileInfo(PackageDescription packageData) {
414cdf0e10cSrcweir         // analyzing a string like "openoffice-core01-2.0.3-159" as "name-version-release"
415cdf0e10cSrcweir         InstallData data = InstallData.getInstance();
416cdf0e10cSrcweir         if ( packageData.pkgExists() ) {
417cdf0e10cSrcweir             if (( packageData.getFullPackageName() != null ) && ( ! packageData.getFullPackageName().equals(""))) {
418cdf0e10cSrcweir                 String longName = packageData.getFullPackageName();
419cdf0e10cSrcweir 
420cdf0e10cSrcweir                 int pos = longName.lastIndexOf("-");
421cdf0e10cSrcweir                 if (data.isInstallationMode()) {
422cdf0e10cSrcweir                     // not saving at uninstallation, because it can be updated without GUI installer
423cdf0e10cSrcweir                     packageData.setPkgRelease(longName.substring(pos+1, longName.length()));
424cdf0e10cSrcweir                 }
425cdf0e10cSrcweir                 longName = longName.substring(0, pos);
426cdf0e10cSrcweir 
427cdf0e10cSrcweir                 pos = longName.lastIndexOf("-");
428cdf0e10cSrcweir                 if (data.isInstallationMode()) {
429cdf0e10cSrcweir                     // not saving at uninstallation, because it can be updated without GUI installer
430cdf0e10cSrcweir                     packageData.setPkgVersion(longName.substring(pos+1, longName.length()));
431cdf0e10cSrcweir                 }
432cdf0e10cSrcweir                 packageData.setPkgRealName(longName.substring(0, pos));
433cdf0e10cSrcweir             }
434cdf0e10cSrcweir         }
435cdf0e10cSrcweir 
436cdf0e10cSrcweir         for (Enumeration e = packageData.children(); e.hasMoreElements(); ) {
437cdf0e10cSrcweir             PackageDescription child = (PackageDescription) e.nextElement();
438cdf0e10cSrcweir             getLinuxFileInfo(child);
439cdf0e10cSrcweir         }
440cdf0e10cSrcweir 
441cdf0e10cSrcweir     }
442cdf0e10cSrcweir 
setFullPackageNameAtUninstall(PackageDescription packageData, HashMap packageNames)443cdf0e10cSrcweir     public void setFullPackageNameAtUninstall(PackageDescription packageData, HashMap packageNames) {
444cdf0e10cSrcweir 
445cdf0e10cSrcweir         if (( packageData.getPackageName() != null ) && ( ! packageData.getPackageName().equals("")))  {
446cdf0e10cSrcweir             if (( packageData.getFullPackageName() == null ) || ( packageData.getFullPackageName().equals(""))) {
447cdf0e10cSrcweir                 String packageName = packageData.getPackageName();
448cdf0e10cSrcweir                 // Does this always exist? Should not be required!
449cdf0e10cSrcweir                 // But is there another way to get the packageNames, without this file?
450cdf0e10cSrcweir                 // During installation the packageNames can be determined by querying the rpm file
451cdf0e10cSrcweir                 // -> this is not possible during uninstallation
452cdf0e10cSrcweir                 String fullPackageName = (String) packageNames.get(packageName);
453cdf0e10cSrcweir                 packageData.setFullPackageName(fullPackageName);
454cdf0e10cSrcweir             }
455cdf0e10cSrcweir         }
456cdf0e10cSrcweir 
457cdf0e10cSrcweir         for (Enumeration e = packageData.children(); e.hasMoreElements(); ) {
458cdf0e10cSrcweir             PackageDescription child = (PackageDescription) e.nextElement();
459cdf0e10cSrcweir             setFullPackageNameAtUninstall(child, packageNames);
460cdf0e10cSrcweir         }
461cdf0e10cSrcweir     }
462cdf0e10cSrcweir 
getRelocationString(PackageDescription packageData, String packageName)463cdf0e10cSrcweir     public String getRelocationString(PackageDescription packageData, String packageName) {
464cdf0e10cSrcweir         String relocationString = null;
465cdf0e10cSrcweir 
466cdf0e10cSrcweir         if ( packageData.isRelocatable() ) {
467cdf0e10cSrcweir             // String rpmQuery = "rpm -qp --qf %{PREFIXES}" + " " + packageName;
468cdf0e10cSrcweir             String[] rpmQueryArray = new String[5];
469cdf0e10cSrcweir             rpmQueryArray[0] = "rpm";
470cdf0e10cSrcweir             rpmQueryArray[1] = "-qp";
471cdf0e10cSrcweir             rpmQueryArray[2] = "--qf";
472cdf0e10cSrcweir             rpmQueryArray[3] = "%{PREFIXES}";
473cdf0e10cSrcweir             rpmQueryArray[4] = packageName;
474cdf0e10cSrcweir 
475cdf0e10cSrcweir             Vector returnVector = new Vector();
476cdf0e10cSrcweir             Vector returnErrorVector = new Vector();
477cdf0e10cSrcweir             int returnValue = ExecuteProcess.executeProcessReturnVector(rpmQueryArray, returnVector, returnErrorVector);
478cdf0e10cSrcweir             relocationString = (String) returnVector.get(0);
479cdf0e10cSrcweir         }
480cdf0e10cSrcweir 
481cdf0e10cSrcweir         return relocationString;
482cdf0e10cSrcweir     }
483cdf0e10cSrcweir 
createPackageNameFileAtPostinstall(InstallData data, PackageDescription packageData)484cdf0e10cSrcweir     public void createPackageNameFileAtPostinstall(InstallData data, PackageDescription packageData) {
485cdf0e10cSrcweir 
486cdf0e10cSrcweir         // The file "packageNames" must not be an own database! It must be possible to install
487cdf0e10cSrcweir         // and deinstall RPMs without this GUI installer. Therefore the file packageNames is
488cdf0e10cSrcweir         // not always up to date. Nevertheless it makes the deinstallation faster, because of
489cdf0e10cSrcweir         // all packages, whose "real" package name is not defined in xpd files (for example
490cdf0e10cSrcweir         // "openoffice-core01-2.0.3-159.rpm" hat the "real" name "openoffice-core01" that is
491cdf0e10cSrcweir         // used for deinstallation) this can be read in this file. Otherwise it would be
492*a893be29SPedro Giffuni         // necessary to determine the "real" name with a database question.
493cdf0e10cSrcweir         // The version and release that are also stored in file "packageNames" must not be
494cdf0e10cSrcweir         // used for deinstallation because they are probably not up to date.
495cdf0e10cSrcweir 
496cdf0e10cSrcweir         File destDir = new File(data.getInstallDefaultDir(), data.getProductDir());
497cdf0e10cSrcweir         File uninstallDir = new File(destDir, data.getUninstallDirName());
498cdf0e10cSrcweir         String fileName = "packageNames";
499cdf0e10cSrcweir         File packageNamesFile = new File(uninstallDir, fileName);
500cdf0e10cSrcweir         Vector packageNames = new Vector();
501cdf0e10cSrcweir         getPackageNamesContent(packageData, packageNames);
502cdf0e10cSrcweir         SystemManager.saveCharFileVector(packageNamesFile.getPath(), packageNames);
503cdf0e10cSrcweir     }
504cdf0e10cSrcweir 
readPackageNamesFile()505cdf0e10cSrcweir     public HashMap readPackageNamesFile() {
506cdf0e10cSrcweir         // package names are stored in file "packageNames" in data.getInfoRoot() directory
507cdf0e10cSrcweir         String fileName = "packageNames";
508cdf0e10cSrcweir         InstallData data = InstallData.getInstance();
509cdf0e10cSrcweir         File dir = data.getInfoRoot();
510cdf0e10cSrcweir         File file = new File(dir, fileName);
511cdf0e10cSrcweir         Vector fileContent = SystemManager.readCharFileVector(file.getPath());
512cdf0e10cSrcweir         HashMap map = Converter.convertVectorToHashmap(fileContent);
513cdf0e10cSrcweir         return map;
514cdf0e10cSrcweir     }
515cdf0e10cSrcweir 
saveModulesLogFile(InstallData data)516cdf0e10cSrcweir     public void saveModulesLogFile(InstallData data) {
517cdf0e10cSrcweir         if ( data.logModuleStates() ) {
518cdf0e10cSrcweir             Vector logContent = LogManager.getModulesLogFile();
519cdf0e10cSrcweir             File destDir = new File(data.getInstallDefaultDir(), data.getProductDir());
520cdf0e10cSrcweir             File uninstallDir = new File(destDir, data.getUninstallDirName());
521cdf0e10cSrcweir             File modulesLogFile = new File(uninstallDir, "moduleSettingsLog.txt");
522cdf0e10cSrcweir             SystemManager.saveCharFileVector(modulesLogFile.getPath(), logContent);
523cdf0e10cSrcweir         }
524cdf0e10cSrcweir     }
525cdf0e10cSrcweir 
fixInstallationDirectory(String installDir)526cdf0e10cSrcweir     public String fixInstallationDirectory(String installDir) {
527cdf0e10cSrcweir         // inject a second slash to the last path segment to avoid rpm 3 concatenation bug
528cdf0e10cSrcweir         int lastSlashPos = installDir.lastIndexOf('/');
529cdf0e10cSrcweir         String sub1 = installDir.substring(0,lastSlashPos);
530cdf0e10cSrcweir         String sub2 = installDir.substring(lastSlashPos);
531cdf0e10cSrcweir         String fixedInstallDir = sub1 + "/" + sub2;
532cdf0e10cSrcweir         // fixedInstallDir.replaceAll(" ", "%20");
533cdf0e10cSrcweir         return fixedInstallDir;
534cdf0e10cSrcweir     }
535cdf0e10cSrcweir 
536cdf0e10cSrcweir }
537