1 19 20 package com.izforge.izpack.uninstaller; 21 22 import java.io.BufferedReader ; 23 import java.io.File ; 24 import java.io.InputStream ; 25 import java.io.InputStreamReader ; 26 import java.io.ObjectInputStream ; 27 import java.io.PrintWriter ; 28 import java.io.StringWriter ; 29 import java.util.ArrayList ; 30 import java.util.Collections ; 31 import java.util.Iterator ; 32 import java.util.List ; 33 import java.util.TreeSet ; 34 35 import com.izforge.izpack.ExecutableFile; 36 import com.izforge.izpack.event.UninstallerListener; 37 import com.izforge.izpack.installer.UninstallData; 38 import com.izforge.izpack.util.AbstractUIProgressHandler; 39 import com.izforge.izpack.util.Debug; 40 import com.izforge.izpack.util.FileExecutor; 41 import com.izforge.izpack.util.OsVersion; 42 import com.izforge.izpack.util.os.unix.ShellScript; 43 44 45 50 public class Destroyer extends Thread 51 { 52 53 54 private boolean forceDestroy; 55 56 57 private String installPath; 58 59 60 private AbstractUIProgressHandler handler; 61 62 69 public Destroyer(String installPath, boolean forceDestroy, AbstractUIProgressHandler handler) 70 { 71 super("IzPack - Destroyer"); 72 73 this.installPath = installPath; 74 this.forceDestroy = forceDestroy; 75 this.handler = handler; 76 } 77 78 79 public void run() 80 { 81 try 82 { 83 List [] listeners = getListenerLists(); 85 ArrayList executables = getExecutablesList(); 87 88 FileExecutor executor = new FileExecutor(executables); 89 executor.executeFiles(ExecutableFile.UNINSTALL, this.handler); 90 91 ArrayList files = getFilesList(); 92 int size = files.size(); 93 94 informListeners(listeners[0], UninstallerListener.BEFORE_DELETION, files, handler); 96 97 handler.startAction("destroy", size); 98 99 for (int i = 0; i < size; i++) 101 { 102 File file = (File ) files.get(i); 103 informListeners(listeners[1], UninstallerListener.BEFORE_DELETE, file, handler); 105 106 file.delete(); 107 108 informListeners(listeners[1], UninstallerListener.AFTER_DELETE, file, handler); 110 111 handler.progress(i, file.getAbsolutePath()); 112 } 113 114 informListeners(listeners[0], UninstallerListener.AFTER_DELETION, files, handler); 116 117 if( OsVersion.IS_UNIX ) 118 { 119 execRootScript(getRootScript()); 120 } 121 handler.progress(size, "[ cleanups ]"); 123 cleanup(new File (installPath)); 124 125 handler.stopAction(); 126 } 127 catch (Exception err) 128 { 129 handler.stopAction(); 130 err.printStackTrace(); 131 132 StackTraceElement str[] = err.getStackTrace(); 133 for(int idx = 0; idx < str.length;idx++) 134 { 135 136 } 137 138 StringWriter trace = new StringWriter (); 139 err.printStackTrace(new PrintWriter (trace)); 141 142 handler.emitError("exception caught", err.toString() + "\n" + trace.toString() ); 143 } 144 } 145 146 151 172 private ArrayList getFilesList() throws Exception 173 { 174 TreeSet files = new TreeSet (Collections.reverseOrder()); 176 InputStream in = Destroyer.class.getResourceAsStream("/install.log"); 177 InputStreamReader inReader = new InputStreamReader (in); 178 BufferedReader reader = new BufferedReader (inReader); 179 180 reader.readLine(); 182 183 String read = reader.readLine(); 185 while (read != null) 186 { 187 files.add(new File (read)); 188 read = reader.readLine(); 189 } 190 191 return new ArrayList (files); 193 } 194 195 200 private ArrayList getExecutablesList() throws Exception 201 { 202 ArrayList executables = new ArrayList (); 203 ObjectInputStream in = new ObjectInputStream (Destroyer.class 204 .getResourceAsStream("/executables")); 205 int num = in.readInt(); 206 for (int i = 0; i < num; i++) 207 { 208 ExecutableFile file = (ExecutableFile) in.readObject(); 209 executables.add(file); 210 } 211 return executables; 212 } 213 214 220 private String getRootScript() throws Exception 221 { 222 String result = new String (); 223 ObjectInputStream in = new ObjectInputStream (Destroyer.class.getResourceAsStream("/" 224 + UninstallData.ROOTSCRIPT)); 225 226 result = in.readUTF(); 227 228 229 return result; 230 } 231 232 237 private void execRootScript(String aRootScript) 238 { 239 if(!"".equals(aRootScript)) 240 { 241 Debug.log("Will Execute: " + aRootScript.toString()); 242 243 try 244 { 245 String result = ShellScript.execAndDelete(new StringBuffer ( aRootScript ), File.createTempFile( 246 this.getClass().getName(), 247 Long.toString(System.currentTimeMillis()) + ".sh").toString()); 248 Debug.log("Result: " + result); 249 } 250 catch (Exception ex) 251 { 252 Debug.log("Exeption during su remove: " + ex.getMessage()); 253 } 254 } 255 } 256 257 263 private void cleanup(File file) throws Exception 264 { 265 if (file.isDirectory()) 266 { 267 File [] files = file.listFiles(); 268 int size = files.length; 269 for (int i = 0; i < size; i++) 270 cleanup(files[i]); 271 file.delete(); 272 } 273 else if (forceDestroy) file.delete(); 274 275 } 276 277 279 285 private List [] getListenerLists() throws Exception 286 { 287 ArrayList [] uninstaller = new ArrayList [] { new ArrayList (), new ArrayList ()}; 288 InputStream in; 290 ObjectInputStream objIn; 291 in = Destroyer.class.getResourceAsStream("/uninstallerListeners"); 292 if (in != null) 293 { 294 objIn = new ObjectInputStream (in); 295 List listeners = (List ) objIn.readObject(); 296 objIn.close(); 297 Iterator iter = listeners.iterator(); 298 while (iter != null && iter.hasNext()) 299 { 300 Class clazz = Class.forName(((String ) iter.next())); 301 UninstallerListener ul = (UninstallerListener) clazz.newInstance(); 302 if (ul.isFileListener()) uninstaller[1].add(ul); 303 uninstaller[0].add(ul); 304 } 305 } 306 return uninstaller; 307 } 308 309 317 318 private void informListeners(List listeners, int action, Object param, 319 AbstractUIProgressHandler handler) 320 { 321 Iterator iter = listeners.iterator(); 323 UninstallerListener il = null; 324 while (iter.hasNext()) 325 { 326 try 327 { 328 il = (UninstallerListener) iter.next(); 329 switch (action) 330 { 331 case UninstallerListener.BEFORE_DELETION: 332 il.beforeDeletion((List ) param, handler); 333 break; 334 case UninstallerListener.AFTER_DELETION: 335 il.afterDeletion((List ) param, handler); 336 break; 337 case UninstallerListener.BEFORE_DELETE: 338 il.beforeDelete((File ) param, handler); 339 break; 340 case UninstallerListener.AFTER_DELETE: 341 il.afterDelete((File ) param, handler); 342 break; 343 } 344 } 345 catch (Throwable e) 346 { handler.emitError("Skipping custom action because exception caught during " 348 + il.getClass().getName(), e.toString()); 349 } 350 } 351 } 352 353 355 } 356 | Popular Tags |