package org.rr.jeborker.converter;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.commons.io.FilenameUtils;
import org.rr.commons.mufs.IResourceHandler;
import org.rr.commons.mufs.MimeUtils;
import org.rr.commons.mufs.ResourceHandlerFactory;
import org.rr.commons.utils.compression.CompressedDataEntry;
import org.rr.jeborker.app.preferences.APreferenceStore;
import org.rr.jeborker.app.preferences.PreferenceStoreFactory;
import org.rr.jeborker.gui.ConverterPreferenceController;
import org.rr.jeborker.gui.MainController;
import org.rr.pm.image.IImageProvider;
import org.rr.pm.image.ImageProviderFactory;
import org.rr.pm.image.ImageUtils;
public abstract class AArchiveToArchiveConverter implements IEBookConverter {
private static String IMAGE_QUALITY_LABEL = Bundle.getString("MultipleConverter.imageQuality.label");
private static String IMAGE_QUALITY_KEY = AArchiveToArchiveConverter.class.getName() + "." + IMAGE_QUALITY_LABEL;
private APreferenceStore preferenceStore = PreferenceStoreFactory.getPreferenceStore(PreferenceStoreFactory.DB_STORE);
private ConverterPreferenceController converterPreferenceController;
private IResourceHandler archiveResource;
public AArchiveToArchiveConverter(IResourceHandler archiveResource) {
this.archiveResource = archiveResource;
}
@Override
public IResourceHandler convert() throws IOException {
ConverterPreferenceController converterPreferenceController = getConverterPreferenceController();
if(converterPreferenceController.isConfirmed()) {
try {
List<CompressedDataEntry> sourceFiles = extractArchive(archiveResource);
return convertAndWriteToTargetArchive(converterPreferenceController, sourceFiles);
} finally {
preferenceStore.addGenericEntryAsNumber(IMAGE_QUALITY_KEY, getImageQuality());
}
}
return null;
}
protected IResourceHandler convertAndWriteToTargetArchive(ConverterPreferenceController converterPreferenceController,
List<CompressedDataEntry> sourceFiles) throws IOException {
IResourceHandler targetArchiveResource = ResourceHandlerFactory.getUniqueResourceHandler(archiveResource, getTargetArchiveExtension());
for (CompressedDataEntry sourceFile : sourceFiles) {
byte[] bytes = sourceFile.getBytes();
if(ConverterUtils.isImageFileName(sourceFile.getName())) {
BufferedImage image = getBufferedImageFromArchive(new ByteArrayInputStream(bytes));
List<BufferedImage> modifiedImages = ConverterUtils.processImageModifications(image, getImageQuality(), converterPreferenceController);
for (int i = 0; i < modifiedImages.size(); i++) {
BufferedImage modifiedImage = modifiedImages.get(i);
String targetMime = MimeUtils.getImageMimeFromFileName(sourceFile.getName(), "image/" + FilenameUtils.getExtension(sourceFile.getName()));
byte[] imageBytes = ImageUtils.getImageBytes(modifiedImage, targetMime);
if(modifiedImages.size() > 1) {
addToArchive(targetArchiveResource, sourceFile, i, imageBytes);
} else {
addToArchive(targetArchiveResource, sourceFile, imageBytes);
}
}
} else {
addToArchive(targetArchiveResource, sourceFile, bytes);
}
}
return targetArchiveResource;
}
protected abstract String getTargetArchiveExtension();
protected abstract void addToArchive(IResourceHandler targetCbzResource, CompressedDataEntry sourceFile, byte[] imageBytes);
protected abstract void addToArchive(IResourceHandler targetCbzResource, CompressedDataEntry sourceFile, int i, byte[] imageBytes);
protected String injectCounterToFileName(String fileName, int count) {
return FilenameUtils.getBaseName(fileName) + "_" + count + "." + FilenameUtils.getExtension(fileName);
}
public void setConverterPreferenceController(ConverterPreferenceController controller) {
this.converterPreferenceController = controller;
}
/**
* Gets the {@link ConverterPreferenceController} for this instance. Creates a new
* {@link ConverterPreferenceController} if no one is created previously.
* @see #createConverterPreferenceController()
*/
protected ConverterPreferenceController getConverterPreferenceController() {
if(this.converterPreferenceController == null) {
this.converterPreferenceController = this.createConverterPreferenceController();
}
if(!this.converterPreferenceController.hasShown()) {
this.converterPreferenceController.showPreferenceDialog();
}
return this.converterPreferenceController;
}
/**
* Create a new {@link ConverterPreferenceController} instance.
*/
public ConverterPreferenceController createConverterPreferenceController() {
ConverterPreferenceController preferenceController = MainController.getController().getConverterPreferenceController();
preferenceController.addCommonSlider(IMAGE_QUALITY_LABEL, preferenceStore.getGenericEntryAsNumber(IMAGE_QUALITY_KEY, 100).intValue());
preferenceController.setShowLandscapePageEntries(true);
return preferenceController;
}
private int getImageQuality() {
return getConverterPreferenceController().getCommonValueAsInt(IMAGE_QUALITY_LABEL);
}
protected BufferedImage getBufferedImageFromArchive(InputStream compressionEntryStream) {
IImageProvider imageProvider = ImageProviderFactory.getImageProvider(ResourceHandlerFactory.getResourceHandler(compressionEntryStream));
return imageProvider.getImage();
}
protected abstract List<CompressedDataEntry> extractArchive(IResourceHandler cbzResource);
}