1 | // Jomic - a viewer for comic book archives. |
2 | // Copyright (C) 2004-2011 Thomas Aglassinger |
3 | // |
4 | // This program is free software: you can redistribute it and/or modify |
5 | // it under the terms of the GNU General Public License as published by |
6 | // the Free Software Foundation, either version 3 of the License, or |
7 | // (at your option) any later version. |
8 | // |
9 | // This program is distributed in the hope that it will be useful, |
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | // GNU General Public License for more details. |
13 | // |
14 | // You should have received a copy of the GNU General Public License |
15 | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | package net.sf.jomic.tools; |
17 | |
18 | import java.io.File; |
19 | |
20 | import org.apache.commons.logging.Log; |
21 | import org.apache.commons.logging.LogFactory; |
22 | |
23 | /** |
24 | * Task to extract contents of a RAR file to a target folder. |
25 | * |
26 | * @author Thomas Aglassinger |
27 | */ |
28 | public class ExtractRarTask extends AbstractTask |
29 | { |
30 | private static final double WEIGHT_LIST = 0.15; |
31 | private Log logger; |
32 | private FileArchive rarArchive; |
33 | |
34 | private File rarFile; |
35 | private File targetFolder; |
36 | |
37 | public ExtractRarTask(File newRarFile, File newTargetFolder) { |
38 | this(); |
39 | rarFile = newRarFile; |
40 | targetFolder = newTargetFolder; |
41 | setMaxProgress(rarFile.length() + 1); |
42 | } |
43 | |
44 | private ExtractRarTask() { |
45 | super(); |
46 | logger = LogFactory.getLog(ExtractRarTask.class); |
47 | } |
48 | |
49 | public void start() |
50 | throws Exception { |
51 | setProgress(0); |
52 | rarArchive = new FileArchive(rarFile); |
53 | |
54 | long progressAfterListRar = Math.round(WEIGHT_LIST * getMaxProgress()); |
55 | String[] fileNamesToExtract = rarArchive.list(); |
56 | boolean allFilesExtracted = false; |
57 | |
58 | setProgress(progressAfterListRar); |
59 | try { |
60 | rarArchive.extract(targetFolder, fileNamesToExtract, null, 0); |
61 | setProgress(getMaxProgress()); |
62 | allFilesExtracted = !isInterrupted(); |
63 | } finally { |
64 | if (!allFilesExtracted) { |
65 | if (logger.isInfoEnabled()) { |
66 | logger.info("removing files extracted so far"); |
67 | } |
68 | for (int fileNameToDeleteIndex = 0; fileNameToDeleteIndex < fileNamesToExtract.length; fileNameToDeleteIndex += 1) { |
69 | File fileToDelete = new File(targetFolder, fileNamesToExtract[fileNameToDeleteIndex]); |
70 | |
71 | fileToDelete.delete(); |
72 | } |
73 | } |
74 | } |
75 | } |
76 | } |