EMMA Coverage Report (generated Sun Apr 20 22:38:01 CEST 2008)
[all classes][net.sf.jomic.comic]

COVERAGE SUMMARY FOR SOURCE FILE [ConvertComicTask.java]

nameclass, %method, %block, %line, %
ConvertComicTask.java100% (1/1)100% (8/8)82%  (314/383)85%  (63.2/74)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class ConvertComicTask100% (1/1)100% (8/8)82%  (314/383)85%  (63.2/74)
startSubtask (int, Task): void 100% (1/1)68%  (13/19)94%  (5.7/6)
ConvertComicTask (): void 100% (1/1)71%  (12/17)93%  (3.7/4)
start (): void 100% (1/1)77%  (147/190)78%  (30.4/39)
<static initializer> 100% (1/1)80%  (12/15)80%  (0.8/1)
ConvertComicTask (File, File, Conversion, ConversionReportItem): void 100% (1/1)88%  (92/104)91%  (13.6/15)
ConvertComicTask (File, File, Conversion): void 100% (1/1)100% (7/7)100% (2/2)
progressChanged (Task): void 100% (1/1)100% (23/23)100% (4/4)
setReportItemState (String): void 100% (1/1)100% (8/8)100% (3/3)

1// Jomic - a viewer for comic book archives.
2// Copyright (C) 2004-2008 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/>.
16package net.sf.jomic.comic;
17 
18import java.io.File;
19import java.util.ArrayList;
20import java.util.Collections;
21import java.util.List;
22 
23import net.sf.jomic.tools.AbstractTask;
24import net.sf.jomic.tools.CreateImagInfoMapTask;
25import net.sf.jomic.tools.FileTools;
26import net.sf.jomic.tools.ImageInfo;
27import net.sf.jomic.tools.NaturalCaseInsensitiveOrderComparator;
28import net.sf.jomic.tools.ProgressChangeListener;
29import net.sf.jomic.tools.Task;
30import net.sf.wraplog.Logger;
31 
32/**
33 *  Task to convert a comic according to a <code>Conversion</code>.
34 *
35 * @see       net.sf.jomic.comic.Conversion
36 * @author    Thomas Aglassinger
37 */
38public class ConvertComicTask extends AbstractTask implements ProgressChangeListener
39{
40    private static final int SUBTASK_ANALYSE_FILES = 1;
41    private static final int SUBTASK_CREATE_TARGET = 2;
42    private static final int SUBTASK_EXTRACT_SOURCE = 0;
43    private static final double WEIGHT_ANALYSE_FILES = 0.10;
44    private static final double WEIGHT_CREATE_TARGET = 0.5;
45    private static final double WEIGHT_EXTRACT_SOURCE = 0.3;
46    private Conversion conversion;
47    private FileTools fileTools;
48    private Logger logger;
49    private ConversionReportItem reportItem;
50    private File sourceComic;
51    private long[] subtaskBaseProgress;
52    private int subtaskIndex;
53    private double[] subtaskWeights;
54    private File targetComic;
55 
56    public ConvertComicTask(File newSourceComic, File newTargetComic, Conversion newConversion, ConversionReportItem newReportItem) {
57        this();
58        assert newSourceComic != null;
59        assert newTargetComic != null;
60        assert newConversion != null;
61 
62        sourceComic = newSourceComic;
63        targetComic = newTargetComic;
64        conversion = newConversion;
65        reportItem = newReportItem;
66        setMaxProgress(sourceComic.length() + 1);
67        subtaskWeights = new double[]{
68                WEIGHT_EXTRACT_SOURCE, WEIGHT_ANALYSE_FILES, WEIGHT_CREATE_TARGET
69                };
70        subtaskBaseProgress = new long[subtaskWeights.length];
71        subtaskBaseProgress[0] = 0;
72        for (int i = 1; i < subtaskWeights.length; i += 1) {
73            subtaskBaseProgress[i] = subtaskBaseProgress[i - 1] + Math.round(getMaxProgress() * subtaskWeights[i - 1]);
74        }
75    }
76 
77    public ConvertComicTask(File newSourceComic, File newTargetComic, Conversion newConversion) {
78        this(newSourceComic, newTargetComic, newConversion, null);
79    }
80 
81    private ConvertComicTask() {
82        super();
83        logger = Logger.getLogger(ConvertComicTask.class);
84        fileTools = FileTools.instance();
85    }
86 
87    private void setReportItemState(String newState) {
88        if (reportItem != null) {
89            reportItem.setState(newState);
90        }
91    }
92 
93    public void progressChanged(Task source) {
94        long baseProgress = subtaskBaseProgress[subtaskIndex];
95        long weightedProgress = Math.round(subtaskWeights[subtaskIndex] * source.getProgress());
96 
97        setProgress(baseProgress + weightedProgress);
98    }
99 
100    public void start()
101        throws Exception {
102        setProgress(0);
103        setReportItemState(ConversionReportItem.STATE_CONVERTING);
104 
105        File tempFolder = fileTools.createTempDir("jomic-convert-");
106        File[] extractedFiles;
107        Task extractSourceTask;
108        CreateImagInfoMapTask analyseImagesTask;
109        Task createTargetTask;
110 
111        try {
112            extractSourceTask = new ExtractComicTask(sourceComic, tempFolder);
113            startSubtask(SUBTASK_EXTRACT_SOURCE, extractSourceTask);
114            extractedFiles = fileTools.listFilesRecursively(tempFolder);
115 
116            analyseImagesTask = new CreateImagInfoMapTask(extractedFiles);
117            startSubtask(SUBTASK_ANALYSE_FILES, analyseImagesTask);
118 
119            List imageFiles = new ArrayList();
120            List otherFiles = new ArrayList();
121 
122            for (int fileIndex = 0; fileIndex < extractedFiles.length; fileIndex += 1) {
123                File fileToExamine = extractedFiles[fileIndex];
124                ImageInfo imageInfo = (ImageInfo) analyseImagesTask.getImageInfoMap().get(fileToExamine);
125 
126                if (imageInfo.hasError()) {
127                    otherFiles.add(fileToExamine);
128                } else if (conversion.isAddable(imageInfo)) {
129                    imageFiles.add(fileToExamine);
130                } else {
131                    logger.info("excluding file: " + fileToExamine);
132                }
133            }
134 
135            List filesToInclude = new ArrayList(imageFiles);
136 
137            if (!conversion.isAddOnlyImages() && !conversion.getComicFormat().equals(Conversion.COMIC_FORMAT_PDF)) {
138                filesToInclude.addAll(otherFiles);
139            }
140            if (filesToInclude.size() > 0) {
141                Collections.sort(filesToInclude, new NaturalCaseInsensitiveOrderComparator());
142 
143                File[] filesToIncludeArray = (File[]) filesToInclude.toArray(new File[]{});
144                String[] namesOfFilesToInclude = fileTools.getRelativePaths(tempFolder, filesToIncludeArray);
145 
146                createTargetTask = new CreateComicTask(tempFolder, namesOfFilesToInclude, targetComic, conversion);
147                startSubtask(SUBTASK_CREATE_TARGET, createTargetTask);
148            }
149            if (isInterrupted()) {
150                setReportItemState(ConversionReportItem.STATE_CANCELLED);
151            } else {
152                setReportItemState(ConversionReportItem.STATE_DONE);
153            }
154        } catch (Exception error) {
155            if (reportItem != null) {
156                reportItem.setState(ConversionReportItem.STATE_ERROR_DURING_CONVERSION);
157                reportItem.setConversionError(error);
158            }
159            throw error;
160        } finally {
161            fileTools.attemptToDeleteAll(tempFolder, logger);
162        }
163 
164        setProgress(getMaxProgress());
165    }
166 
167    private void startSubtask(int newSubtaskIndex, Task subtask)
168        throws Exception {
169        subtaskIndex = newSubtaskIndex;
170        subtask.addProgressChangeListener(this);
171        try {
172            subtask.start();
173        } finally {
174            subtask.removeProgressChangeListener(this);
175        }
176    }
177}

[all classes][net.sf.jomic.comic]
EMMA 2.0.4217 (C) Vladimir Roubtsov