Mercurial > repos > yufei-luo > s_mart
comparison SMART/Java/Installer/SmartInstallerTask.java @ 31:0ab839023fe4
Uploaded
| author | m-zytnicki |
|---|---|
| date | Tue, 30 Apr 2013 14:33:21 -0400 |
| parents | 769e306b7933 |
| children |
comparison
equal
deleted
inserted
replaced
| 30:5677346472b5 | 31:0ab839023fe4 |
|---|---|
| 1 import java.util.*; | |
| 2 import java.awt.event.ActionEvent; | |
| 3 import java.awt.event.ActionListener; | |
| 4 import java.io.*; | |
| 5 import javax.swing.*; | |
| 6 import javax.swing.filechooser.*; | |
| 7 import javax.swing.border.*; | |
| 8 import javax.swing.SwingUtilities; | |
| 9 import java.net.*; | |
| 10 import java.util.Stack; | |
| 11 import java.util.zip.ZipEntry; | |
| 12 import java.util.zip.ZipInputStream; | |
| 13 | |
| 14 public class SmartInstallerTask extends SwingWorker<Boolean, String> { | |
| 15 | |
| 16 int BUFFER = 1024; | |
| 17 | |
| 18 int architecture = 0; | |
| 19 String installDirectoryName = null; | |
| 20 JTextArea logArea = null; | |
| 21 boolean[] selectedPrograms = null; | |
| 22 | |
| 23 // program chooser buttons | |
| 24 String programChoosers[] = {"R", "R Color Brewer Package", "R HMisc Package", "Python 2.6", "S-MART"}; | |
| 25 | |
| 26 // Web addresses for the tools | |
| 27 String packageAddresses[][] = { | |
| 28 {"http://cran.cict.fr/bin/windows/base/R-2.11.0-win32.exe", "http://cran.cict.fr/bin/windows64/base/R-2.11.0-win64.exe"}, | |
| 29 {"", ""}, | |
| 30 {"", ""}, | |
| 31 {"http://www.python.org/ftp/python/2.6.5/python-2.6.5.msi", "http://www.python.org/ftp/python/2.6.5/python-2.6.5.amd64.msi"}, | |
| 32 {"http://urgi.versailles.inra.fr/content/download/1929/17848/file/s-mart-1.0.15.zip", "http://urgi.versailles.inra.fr/content/download/1929/17848/file/s-mart-1.0.15.zip"} | |
| 33 }; | |
| 34 | |
| 35 // Packages to install | |
| 36 String rPackages[] = {"RColorBrewer", "Hmisc"}; | |
| 37 | |
| 38 // Script lines | |
| 39 String scriptLines[][] = { | |
| 40 {"\"<INSTALLDIR>\\R-2.11.0-win32.exe\"", "\"<INSTALLDIR>\\R-2.11.0-win64.exe\""}, | |
| 41 {"\"<RFILE>\" CMD BATCH \"<INSTALLDIR>\\installRColorBrewer.R\"", "\"<RFILE>\" CMD BATCH \"<INSTALLDIR>\\installRColorBrewer.R\""}, | |
| 42 {"\"<RFILE>\" CMD BATCH \"<INSTALLDIR>\\installHmisc.R\"", "\"<RFILE>\" CMD BATCH \"<INSTALLDIR>\\installHmisc.R\""}, | |
| 43 {"msiexec /i \"<INSTALLDIR>\\python-2.6.5.msi\"", "msiexec /i \"<INSTALLDIR>\\python-2.6.5.amd64.msi\""}, | |
| 44 {"", ""} | |
| 45 }; | |
| 46 | |
| 47 // Files to uncompress | |
| 48 String compressedFiles[][] = { | |
| 49 {"", ""}, | |
| 50 {"", ""}, | |
| 51 {"", ""}, | |
| 52 {"", ""}, | |
| 53 {"<INSTALLDIR>\\s-mart-1.0.15.zip", "<INSTALLDIR>\\s-mart-1.0.15.zip"} | |
| 54 }; | |
| 55 | |
| 56 | |
| 57 public SmartInstallerTask(JTextArea ta, boolean[] b, String s, int a) { | |
| 58 logArea = ta; | |
| 59 selectedPrograms = b; | |
| 60 installDirectoryName = s; | |
| 61 architecture = a; | |
| 62 } | |
| 63 | |
| 64 | |
| 65 @Override | |
| 66 public Boolean doInBackground() { | |
| 67 boolean installOk; | |
| 68 publish("Starting install\n"); | |
| 69 writeFiles(); | |
| 70 for (int i = 0; i < selectedPrograms.length; i++) { | |
| 71 if (selectedPrograms[i]) { | |
| 72 if (! install(i)) { | |
| 73 return Boolean.FALSE; | |
| 74 } | |
| 75 } | |
| 76 } | |
| 77 removeFiles(); | |
| 78 setEnvironmentVariables(); | |
| 79 publish("Ending install\n"); | |
| 80 return Boolean.TRUE; | |
| 81 } | |
| 82 | |
| 83 | |
| 84 @Override | |
| 85 protected void process(List<String> chunks) { | |
| 86 for (String chunk: chunks) { | |
| 87 logArea.append(chunk); | |
| 88 } | |
| 89 } | |
| 90 | |
| 91 | |
| 92 private boolean launch(String command) { | |
| 93 return realLaunch(new ProcessBuilder(command), command); | |
| 94 } | |
| 95 | |
| 96 private boolean launch(String[] command) { | |
| 97 return realLaunch(new ProcessBuilder(command), Arrays.toString(command)); | |
| 98 } | |
| 99 | |
| 100 private boolean realLaunch(ProcessBuilder pb, String command) { | |
| 101 BufferedReader outputReader; | |
| 102 pb = pb.redirectErrorStream(true); | |
| 103 Process process = null; | |
| 104 publish(" Starting command '" + command + "'\n"); | |
| 105 try { | |
| 106 process = pb.start(); | |
| 107 BufferedInputStream outputStream = new BufferedInputStream(process.getInputStream()); | |
| 108 InputStream is = process.getInputStream(); | |
| 109 InputStreamReader isr = new InputStreamReader(is); | |
| 110 outputReader = new BufferedReader(isr); | |
| 111 } | |
| 112 catch (Exception exception) { | |
| 113 publish(" !Process cannot be started (command is '" + command + "')!\n"); | |
| 114 exception.printStackTrace(); | |
| 115 return false; | |
| 116 } | |
| 117 if (outputReader == null) { | |
| 118 publish(" !Problem in the output of the command!\n"); | |
| 119 return false; | |
| 120 } | |
| 121 else { | |
| 122 publish(" Output is:\n"); | |
| 123 try { | |
| 124 publish(" ---\n"); | |
| 125 String line; | |
| 126 while ((line = outputReader.readLine()) != null) { | |
| 127 publish(" " + line + "\r\n"); | |
| 128 } | |
| 129 publish(" ---\n"); | |
| 130 } | |
| 131 catch (IOException e) { | |
| 132 publish(" !Cannot get the output of the command!\n"); | |
| 133 return false; | |
| 134 } | |
| 135 } | |
| 136 int exitValue = process.exitValue(); | |
| 137 if (exitValue != 0) { | |
| 138 publish(" !Problem during the execution of the command '" + command + "'!\n"); | |
| 139 return false; | |
| 140 } | |
| 141 publish(" Ending command '" + command + "'\n"); | |
| 142 return true; | |
| 143 } | |
| 144 | |
| 145 | |
| 146 private File lookForFile(String fileName, String[] putativePlaces) { | |
| 147 publish(" Looking for file " + fileName + "\n"); | |
| 148 for (String place: putativePlaces) { | |
| 149 File file = new File(place, fileName); | |
| 150 publish(" Look at " + file.getAbsolutePath() + "\n"); | |
| 151 if (file.exists()) { | |
| 152 publish(" Found it in expected place " + file.getAbsolutePath() + "\n"); | |
| 153 return file; | |
| 154 } | |
| 155 } | |
| 156 Stack<File> files = new Stack<File>(); | |
| 157 files.push(new File("\\")); | |
| 158 while (! files.empty()) { | |
| 159 File file = files.pop(); | |
| 160 for (File childFile: file.listFiles()) { | |
| 161 if (childFile.isDirectory()) { | |
| 162 files.push(childFile); | |
| 163 } | |
| 164 else { | |
| 165 if (fileName.compareToIgnoreCase(childFile.getName()) == 0) { | |
| 166 publish(" Found it in unexpected place " + childFile.getAbsolutePath() + "\n"); | |
| 167 return childFile; | |
| 168 } | |
| 169 } | |
| 170 } | |
| 171 } | |
| 172 publish(" !Cannot file file '" + fileName + "'!\n"); | |
| 173 return null; | |
| 174 } | |
| 175 | |
| 176 | |
| 177 private boolean writeFile(String fileName, String content) { | |
| 178 try { | |
| 179 FileWriter fw = new FileWriter(fileName); | |
| 180 BufferedWriter bw = new BufferedWriter(fw); | |
| 181 bw.write(content); | |
| 182 bw.close(); | |
| 183 fw.close(); | |
| 184 } | |
| 185 catch (Exception e) { | |
| 186 publish(" !Cannot write file '" + fileName + "'!\n"); | |
| 187 return false; | |
| 188 } | |
| 189 return true; | |
| 190 } | |
| 191 | |
| 192 | |
| 193 private boolean removeFile(String fileName) { | |
| 194 File file = new File(fileName); | |
| 195 if (file.exists()) { | |
| 196 if (! file.delete()) { | |
| 197 publish(" !Cannot delete file '" + file.getAbsolutePath() + "'!\n"); | |
| 198 return false; | |
| 199 } | |
| 200 } | |
| 201 return true; | |
| 202 } | |
| 203 | |
| 204 | |
| 205 private boolean writeFiles() { | |
| 206 for (String rPackage: rPackages) { | |
| 207 String fileName = installDirectoryName + File.separator + "install" + rPackage + ".R"; | |
| 208 String content = "install.packages(\"" + rPackage + "\", repos = \"http://cran.cict.fr\", dependencies = TRUE)\n"; | |
| 209 if (! writeFile(fileName, content)) { | |
| 210 publish(" !Cannot write file for R package '" + rPackage + "'!\n"); | |
| 211 return false; | |
| 212 } | |
| 213 } | |
| 214 return true; | |
| 215 } | |
| 216 | |
| 217 private boolean removeFiles() { | |
| 218 for (String rPackage: rPackages) { | |
| 219 File file = new File(installDirectoryName + File.separator + "install" + rPackage + ".R"); | |
| 220 if (! file.delete()) { | |
| 221 publish("!Cannot delete R install file for " + rPackage + "!\n"); | |
| 222 return false; | |
| 223 } | |
| 224 } | |
| 225 File file = new File(installDirectoryName + File.separator + "createUser.sql"); | |
| 226 if (! file.delete()) { | |
| 227 publish("!Cannot delete mySQL configuration file!\n"); | |
| 228 return false; | |
| 229 } | |
| 230 return true; | |
| 231 } | |
| 232 | |
| 233 private boolean install(int element) { | |
| 234 publish(" Starting install of " + programChoosers[element] + "\n"); | |
| 235 downloadPackage(element); | |
| 236 executeInstall(element); | |
| 237 uncompressPackage(element); | |
| 238 removePackage(element); | |
| 239 postProcess(element); | |
| 240 publish(" Ending install of " + programChoosers[element] + "\n"); | |
| 241 return true; | |
| 242 } | |
| 243 | |
| 244 | |
| 245 private String getLocalName(String remoteName) { | |
| 246 String localName = installDirectoryName + File.separator + (new File(remoteName)).getName(); | |
| 247 int position = localName.indexOf("?"); | |
| 248 if (position >= 0) { | |
| 249 localName = localName.substring(0, position); | |
| 250 } | |
| 251 return localName; | |
| 252 } | |
| 253 | |
| 254 | |
| 255 private boolean downloadPackage(int element) { | |
| 256 String fileName = packageAddresses[element][architecture]; | |
| 257 if (! "".equals(fileName)) { | |
| 258 publish(" Starting download of " + programChoosers[element] + "\n"); | |
| 259 try { | |
| 260 BufferedInputStream bis = new BufferedInputStream(new URL(fileName).openStream()); | |
| 261 FileOutputStream fos = new FileOutputStream(getLocalName(fileName)); | |
| 262 BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER); | |
| 263 byte[] data = new byte[BUFFER]; | |
| 264 int x = 0; | |
| 265 while((x = bis.read(data, 0, BUFFER)) >= 0) { | |
| 266 bos.write(data, 0, x); | |
| 267 } | |
| 268 bos.close(); | |
| 269 fos.close(); | |
| 270 bis.close(); | |
| 271 } | |
| 272 catch (IOException e) { | |
| 273 publish(" !Cannot download file '" + fileName + "'!\n"); | |
| 274 return false; | |
| 275 } | |
| 276 publish(" Ending download of " + programChoosers[element] + "\n"); | |
| 277 } | |
| 278 return true; | |
| 279 } | |
| 280 | |
| 281 | |
| 282 private String replaceSubstring(String line) { | |
| 283 if (line.contains("<INSTALLDIR>")) { | |
| 284 String protectedDirectory = installDirectoryName.replaceAll("\\\\", "\\\\\\\\"); | |
| 285 line = line.replaceAll("<INSTALLDIR>", protectedDirectory); | |
| 286 } | |
| 287 if (line.contains("<RFILE>")) { | |
| 288 String userName = System.getenv().get("USERNAME"); | |
| 289 String[] possibleRDirectories = {"C:\\Program Files\\R-2.11.0", "C:\\Documents and Settings\\" + userName + "\\Mes documents\\R\\R-2.11.0\\bin", "C:\\Documents and Settings\\" + userName + "\\My documents\\R\\R-2.11.0\\bin"}; | |
| 290 String rDirectory = lookForFile("'.exe", possibleRDirectories).getAbsolutePath(); | |
| 291 rDirectory = rDirectory.replaceAll("\\\\", "\\\\\\\\"); | |
| 292 line = line.replaceAll("<RFILE>", rDirectory); | |
| 293 } | |
| 294 return line; | |
| 295 } | |
| 296 | |
| 297 | |
| 298 private boolean executeInstall(int element) { | |
| 299 String commands = scriptLines[element][architecture]; | |
| 300 if (! "".equals(commands)) { | |
| 301 for (String command: commands.split(";")) { | |
| 302 command = replaceSubstring(command); | |
| 303 publish(" Starting command '" + command + "'\n"); | |
| 304 Process process = null; | |
| 305 try { | |
| 306 process = Runtime.getRuntime().exec(command); | |
| 307 } | |
| 308 catch (IOException e) { | |
| 309 publish(" !Cannot execute command '" + command + "'!\n"); | |
| 310 return false; | |
| 311 } | |
| 312 try { | |
| 313 process.waitFor(); | |
| 314 } | |
| 315 catch (InterruptedException e) { | |
| 316 publish(" !Cannot wait for the end of the command '" + command + "'!\n"); | |
| 317 return false; | |
| 318 } | |
| 319 int exitValue = process.exitValue(); | |
| 320 if (exitValue != 0) { | |
| 321 publish(" !Problem during the execution of the command '" + command + "'!\n"); | |
| 322 return false; | |
| 323 } | |
| 324 publish(" Ending command '" + command + "'\n"); | |
| 325 } | |
| 326 } | |
| 327 return true; | |
| 328 } | |
| 329 | |
| 330 | |
| 331 private boolean uncompressPackage(int element) { | |
| 332 String file = compressedFiles[element][architecture]; | |
| 333 if (! "".equals(file)) { | |
| 334 file = replaceSubstring(file); | |
| 335 publish(" Starting uncompressing file '" + file + "'\n"); | |
| 336 try { | |
| 337 FileInputStream fis = new FileInputStream(file); | |
| 338 BufferedInputStream bis = new BufferedInputStream(fis); | |
| 339 ZipInputStream zis = new ZipInputStream(bis); | |
| 340 ZipEntry entry; | |
| 341 while ((entry = zis.getNextEntry()) != null) { | |
| 342 if (! entry.isDirectory()) { | |
| 343 File newFile = new File(installDirectoryName + File.separator + entry.getName()); | |
| 344 // create parent directories | |
| 345 File upDirectory = newFile.getParentFile(); | |
| 346 while (upDirectory != null){ | |
| 347 if (! upDirectory.exists()) { | |
| 348 upDirectory.mkdir(); | |
| 349 publish(" Creating directory '" + upDirectory.getAbsolutePath() + "'\n"); | |
| 350 } | |
| 351 upDirectory = upDirectory.getParentFile(); | |
| 352 } | |
| 353 // write the files to the disk | |
| 354 publish(" Extracting '" + entry.getName() + "' to '" + newFile.getAbsolutePath() + "'\n"); | |
| 355 int count; | |
| 356 byte data[] = new byte[BUFFER]; | |
| 357 FileOutputStream fos = new FileOutputStream(newFile); | |
| 358 BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER); | |
| 359 while ((count = zis.read(data, 0, BUFFER)) != -1){ | |
| 360 bos.write(data, 0, count); | |
| 361 } | |
| 362 bos.flush(); | |
| 363 bos.close(); | |
| 364 fos.close(); | |
| 365 } | |
| 366 } | |
| 367 zis.close(); | |
| 368 bis.close(); | |
| 369 fis.close(); | |
| 370 } | |
| 371 catch(FileNotFoundException e) { | |
| 372 publish(" !Cannot find file '" + file + "'!\n"); | |
| 373 return false; | |
| 374 } | |
| 375 catch(Exception e){ | |
| 376 publish(" !Cannot uncompress file '" + file + "'!\n"); | |
| 377 return false; | |
| 378 } | |
| 379 publish(" Ending uncompressing file '" + file + "'\n"); | |
| 380 } | |
| 381 return true; | |
| 382 } | |
| 383 | |
| 384 | |
| 385 private boolean removePackage(int element) { | |
| 386 String packageName = packageAddresses[element][architecture]; | |
| 387 if ("".equals(packageName)) { | |
| 388 return true; | |
| 389 } | |
| 390 String fileName = getLocalName(packageAddresses[element][architecture]); | |
| 391 return removeFile(fileName); | |
| 392 } | |
| 393 | |
| 394 | |
| 395 private boolean postProcess(int element) { | |
| 396 switch (element) { | |
| 397 case 4: | |
| 398 // Move S-MART files to parent directory | |
| 399 File installDirectory = new File(installDirectoryName + File.separator + "S-Mart"); | |
| 400 for (File file: installDirectory.listFiles()) { | |
| 401 File destinationFile = new File(file.getParentFile().getParentFile(), file.getName()); | |
| 402 if (! file.renameTo(destinationFile)) { | |
| 403 publish(" !Cannot move '" + file.getAbsolutePath() + "' to '" + destinationFile.getAbsolutePath() + "'!\n"); | |
| 404 } | |
| 405 } | |
| 406 if (! installDirectory.delete()) { | |
| 407 publish(" !Cannot remove installation S-MART directory '" + installDirectory.getAbsolutePath() + "'!\n"); | |
| 408 } | |
| 409 } | |
| 410 return true; | |
| 411 } | |
| 412 | |
| 413 | |
| 414 private boolean setEnvironmentVariables() { | |
| 415 String[] command = {"REG", "ADD", "HKCU\\Environment", "/v", "PYTHONPATH", "/t", "REG_SZ", "/d", "\"" + installDirectoryName + "\\Python\"", "/f"}; | |
| 416 return launch(command); | |
| 417 } | |
| 418 } | |
| 419 |
