1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package org.openoffice.setup.Controller;
25 
26 import java.awt.Dimension;
27 import org.openoffice.setup.InstallData;
28 import org.openoffice.setup.Installer.Installer;
29 import org.openoffice.setup.Installer.InstallerFactory;
30 import org.openoffice.setup.PanelController;
31 import org.openoffice.setup.Panel.ChooseDirectory;
32 import org.openoffice.setup.ResourceManager;
33 import org.openoffice.setup.SetupData.SetupDataProvider;
34 import org.openoffice.setup.Util.InstallChangeCtrl;
35 import org.openoffice.setup.Util.LogManager;
36 import org.openoffice.setup.Util.SystemManager;
37 import java.io.File;
38 import java.util.Vector;
39 import javax.swing.JDialog;
40 import javax.swing.JOptionPane;
41 import org.openoffice.setup.Dialogs.DatabaseDialog;
42 import org.openoffice.setup.SetupData.PackageDescription;
43 import org.openoffice.setup.Util.Controller;
44 import org.openoffice.setup.Util.Dumper;
45 import org.openoffice.setup.Util.Informer;
46 import org.openoffice.setup.Util.ModuleCtrl;
47 import org.openoffice.setup.Util.PackageCollector;
48 
49 public class ChooseDirectoryCtrl extends PanelController {
50 
51     private String helpFile;
52 
ChooseDirectoryCtrl()53     public ChooseDirectoryCtrl() {
54         super("ChooseDirectory", new ChooseDirectory());
55         helpFile = "String_Helpfile_ChooseDirectory";
56     }
57 
getNext()58     public String getNext() {
59 
60         InstallData data = InstallData.getInstance();
61 
62         if ( data.olderVersionExists() ) {
63             return new String("InstallationImminent");
64         } else if ( data.sameVersionExists() ) {
65             return new String("ChooseComponents");
66         } else {
67             return new String("ChooseInstallationType");
68         }
69     }
70 
getPrevious()71     public String getPrevious() {
72         InstallData data = InstallData.getInstance();
73 
74         if ( data.hideEula() ) {
75             return new String("Prologue");
76         } else {
77             return new String("AcceptLicense");
78         }
79     }
80 
getHelpFileName()81     public final String getHelpFileName () {
82         return this.helpFile;
83     }
84 
removeEndingDelimiter(String s)85     private String removeEndingDelimiter(String s) {
86         s.trim();
87         if (( s.endsWith("/")) || ( s.endsWith("\\"))) {
88             // removing the last character
89             s = s.substring(0, s.length() - 1);
90         }
91         // mask spaces
92         // s.replaceAll(" ", "\\ ");
93 
94         return s;
95     }
96 
beforeShow()97     public void beforeShow() {
98         ChooseDirectory panel = (ChooseDirectory)getPanel();
99         InstallData data = InstallData.getInstance();
100 
101         if ( data.getInstallDir() == null ) {
102             String installDir = data.getDefaultDir();
103 
104             if ( data.isUserInstallation() ) {
105                 // System.getenv only supported in Java 1.5, property set in shell script
106                 // if (( System.getenv("HOME") != null ) && ( ! System.getenv("HOME").equals(""))) {
107                 //     rootDir = System.getenv("HOME");
108                 // }
109                 if (( System.getProperty("HOME") != null ) && ( ! System.getProperty("HOME").equals("") )) {
110                     installDir = System.getProperty("user.home");
111                 }
112             }
113             data.setInstallDir(installDir);
114         }
115 
116         panel.setDirectory(data.getInstallDir());
117     }
118 
afterShow(boolean nextButtonPressed)119     public boolean afterShow(boolean nextButtonPressed) {
120         boolean repeatDialog = false;
121         ChooseDirectory panel = (ChooseDirectory)getPanel();
122         String dir = panel.getDirectory();
123         dir = removeEndingDelimiter(dir);
124         InstallData data = InstallData.getInstance();
125         data.setInstallDir(dir);
126 
127         File installDefaultDir = new File(dir, data.getDefaultDir());
128         data.setInstallDefaultDir(installDefaultDir.getPath());
129 
130         SetupDataProvider.setNewMacro("DIR", installDefaultDir.getPath()); // important for string replacement
131         // SetupDataProvider.dumpMacros();
132 
133         // Check existence of directory. Try to create, if it does not exist.
134         // If successufully created, calculate available disc space
135 
136         if ( nextButtonPressed ) {
137 
138             // If the directory exists, is has to be tested, whether the user has write access
139 
140             if ( SystemManager.exists_directory(dir) ) {
141             	if ( ! Controller.createdSubDirectory(dir) ) {
142             	    repeatDialog= true;
143             	}
144             }
145 
146             // If the directory does not exist, is has to be tested, whether the user can create it
147 
148             if ( ! SystemManager.exists_directory(dir)) {
149                 String title = ResourceManager.getString("String_ChooseDirectory4_Question_Title");
150                 String message = null;
151                 message = ResourceManager.getString("String_ChooseDirectory5_Question_Message");
152 
153                 int returnValue = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
154 
155                 if (  returnValue == JOptionPane.YES_OPTION ) {
156                     if ( ! Controller.createdDirectory(dir) ) {
157             	        repeatDialog= true;
158             	    }
159                 }
160                 else if (returnValue == JOptionPane.NO_OPTION) {
161                     repeatDialog = true;
162                 }
163             }
164 
165             // Additional tasks, if the directory is okay
166 
167             if ( ! repeatDialog ) {
168                 // Calculate available disc space
169                 int discSpace = SystemManager.calculateDiscSpace(dir);
170                 data.setAvailableDiscSpace(discSpace);
171 
172                 Installer installer = InstallerFactory.getInstance();
173 
174                 // Is this a new directory, or one that was already set before.
175                 // In this case, the database does not need to be evaluated again.
176                 // -> Testing, whether the database path has changed. This can
177                 // only happen in user installations.
178                 if ( data.isUserInstallation() ) {
179                     String oldDatabasePath = data.getDatabasePath();
180                     // Setting the database path
181                     installer.defineDatabasePath();
182 
183                     if (( oldDatabasePath == null ) || ( ! oldDatabasePath.equals(data.getDatabasePath()))) {
184                         data.setDatabaseAnalyzed(false);
185                         data.setDatabaseQueried(false);
186                     } else {
187                         data.setDatabaseAnalyzed(true);
188                     }
189                 }
190 
191                 // In installations with user privileges, now it can be controlled,
192                 // if there are products installed in the selected directory.
193                 // Therefore the directory selection dialog has to be shown before.
194                 // In installations with root privileges, this can only be checked,
195                 // before the destination directory can be set, because it is fix.
196                 if ( data.isUserInstallation() ) {
197                     LogManager.setCommandsHeaderLine("Checking change installation");
198                     InstallChangeCtrl.checkInstallChange(data);
199                     // InstallChangeCtrl.checkInstallChange(data, panel);
200                 }
201 
202                 // At this point it is clear, whether the update-Package is installed or not.
203                 // If it is installed, it is also clear, in which version it is installed.
204                 // Therefore the following dialog is also defined.
205 
206                 if ( data.newerVersionExists() ) {
207                     // This can happen only in installation with user privileges.
208                     // Installations with root privileges have cancelled installation
209                     // already at first dialog.
210                     // Possibility to select a new directory, in which no
211                     // newer product exists
212                     String message = ResourceManager.getString("String_Newer_Version_Installed_Found") + "\n" + data.getInstallDir() + "\n" +
213                                      ResourceManager.getString("String_Newer_Version_Database") + ": " + data.getDatabasePath() + "\n" +
214                                      ResourceManager.getString("String_Newer_Version_Tip");
215                     String title = ResourceManager.getString("String_Error");
216                     Informer.showErrorMessage(message, title);
217 
218                     repeatDialog = true;
219                 }
220 
221                 // If an older version is found, and the update is forbidden, the user
222                 // can select another installation directory.
223 
224                 if ( data.olderVersionExists() && data.dontUpdate() ) {
225                     // This can happen only in installation with user privileges.
226                     // Installations with root privileges have cancelled installation
227                     // already at first dialog (InstallChangeCtrl.java).
228                     // Possibility to select a new directory, in which no
229                     // older product exists
230                     String message = ResourceManager.getString("String_Older_Version_Installed_Found") + "\n" + data.getInstallDir() + "\n" +
231                                      ResourceManager.getString("String_Newer_Version_Database") + ": " + data.getDatabasePath() + "\n" +
232                                      ResourceManager.getString("String_Newer_Version_Tip");
233                     String title = ResourceManager.getString("String_Error");
234                     Informer.showErrorMessage(message, title);
235 
236                     repeatDialog = true;
237                 }
238 
239                 if ( ! repeatDialog ) {
240 
241                     if ( ! data.databaseAnalyzed()) {
242                         ModuleCtrl.defaultDatabaseAnalysis(data);
243                         data.setDatabaseAnalyzed(true);
244                     }
245                 }
246             }
247         }
248 
249         return repeatDialog;
250     }
251 
252 }
253