package eu.europeana.cloud.service.dps.storm.topologies.ic.topology.api;
import eu.europeana.cloud.service.dps.PluginParameterKeys;
import eu.europeana.cloud.service.dps.storm.StormTaskTuple;
import eu.europeana.cloud.service.dps.storm.topologies.ic.converter.converter.ConverterContext;
import eu.europeana.cloud.service.dps.storm.topologies.ic.converter.converter.ImageMagicJPGToTiff;
import eu.europeana.cloud.service.dps.storm.topologies.ic.converter.converter.KakaduConverterTiffToJP2;
import eu.europeana.cloud.service.dps.storm.topologies.ic.converter.exceptions.ConversionException;
import eu.europeana.cloud.service.dps.storm.topologies.ic.converter.exceptions.ICSException;
import eu.europeana.cloud.service.dps.storm.topologies.ic.converter.exceptions.UnexpectedExtensionsException;
import eu.europeana.cloud.service.dps.storm.topologies.ic.converter.utlis.ExtensionHelper;
import eu.europeana.cloud.service.dps.storm.topologies.ic.topology.util.ImageConverterUtil;
import eu.europeana.cloud.service.dps.storm.utils.TaskTupleUtility;
import eu.europeana.cloud.service.mcs.exception.MCSException;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.apache.tika.mime.MimeTypeException;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* Created by Tarek on 8/12/2015.
*/
/**
* Implementation of image converter service
*/
public class ImageConverterServiceImpl implements ImageConverterService {
private ConverterContext converterContext;
private ImageConverterUtil imageConverterUtil;
private final static Logger LOGGER = Logger.getLogger(ImageConverterServiceImpl.class);
private static final String TIFF_EXTENSION = ".tiff";
private static final String JPEG_EXTENSION = ".jpg";
private static final String JPEG_MIME_TYPE = "image/jpeg";
private static final String TIFF_MIME_TYPE = "image/tiff";
public ImageConverterServiceImpl(ConverterContext converterContext, ImageConverterUtil imageConverterUtil) {
this.converterContext = converterContext;
this.imageConverterUtil = imageConverterUtil;
}
public ImageConverterServiceImpl() {
converterContext = new ConverterContext(new ImageMagicJPGToTiff());
imageConverterUtil = new ImageConverterUtil();
}
/**
* Converts image file with a format to the same image with different format
*
* @param stormTaskTuple Tuple which DpsTask is part of ...
* @return path for the newly created file
* @throws MCSException on unexpected situations.
* @throws ICSException
* @throws MimeTypeException : when mimetype is not recognized or null
* @throws IOException
*/
@Override
public void convertFile(StormTaskTuple stormTaskTuple) throws IOException, MimeTypeException, MCSException, ICSException, RuntimeException {
String fileUrl = stormTaskTuple.getFileUrl();
LOGGER.info("The converting process for file " + fileUrl + " started successfully");
String folderPath = null;
try {
ByteArrayInputStream inputStream = stormTaskTuple.getFileByteDataAsStream();
if (inputStream != null) {
String inputMimeType = TaskTupleUtility.getParameterFromTuple(stormTaskTuple, PluginParameterKeys.MIME_TYPE);
if (!(TIFF_MIME_TYPE.equals(inputMimeType) || JPEG_MIME_TYPE.equals(inputMimeType)))
throw new AssertionError();
String inputExtension = ExtensionHelper.getExtension(inputMimeType);
String tempFileName = UUID.randomUUID().toString();
folderPath = ImageConverterUtil.persistStreamToTemporaryStorage(inputStream, tempFileName, inputExtension);
String inputFilePath = ImageConverterUtil.buildFilePath(folderPath, tempFileName, inputExtension);
String outputExtension = ExtensionHelper.getExtension(TaskTupleUtility.getParameterFromTuple(stormTaskTuple, PluginParameterKeys.OUTPUT_MIME_TYPE));
String outputFilePath = ImageConverterUtil.buildFilePath(folderPath, tempFileName, outputExtension);
if (JPEG_EXTENSION.equals(inputExtension)) {
inputFilePath = convertJpgToTiff(folderPath, inputFilePath, tempFileName);
}
converterContext.setConverter(new KakaduConverterTiffToJP2());
List<String> properties = new ArrayList<>();
properties.add(TaskTupleUtility.getParameterFromTuple(stormTaskTuple, PluginParameterKeys.KAKADU_ARGUEMENTS));
converterContext.convert(inputFilePath, outputFilePath, properties);
stormTaskTuple.setFileData(imageConverterUtil.getStream(outputFilePath));
stormTaskTuple.addParameter(PluginParameterKeys.OUTPUT_FILE_NAME, tempFileName + outputExtension);
LOGGER.info("The converting process for file " + fileUrl + " completed successfully");
}
} finally {
if (folderPath != null)
FileUtils.deleteDirectory(new File(folderPath));
}
}
private String convertJpgToTiff(String folderPath, String inputFilePath, String outputFileName) throws UnexpectedExtensionsException, ConversionException, IOException {
String outputFilePath = ImageConverterUtil.buildFilePath(folderPath, outputFileName, TIFF_EXTENSION);
converterContext.convert(inputFilePath, outputFilePath, null);
return outputFilePath;
}
}