package com.constellio.model.services.contents;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import com.constellio.data.io.ConversionManager;
import com.constellio.data.io.services.facades.IOServices;
import com.constellio.model.entities.records.Content;
import com.constellio.model.entities.records.ContentVersion;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.factories.ModelLayerFactory;
import org.artofsolving.jodconverter.office.OfficeException;
public class ContentConversionManager implements AutoCloseable {
private final ContentManager contentManager;
private final IOServices ioServices;
private ConversionManager conversionManager;
private File workingFolder;
public ContentConversionManager(ModelLayerFactory modelLayerFactory) {
contentManager = modelLayerFactory.getContentManager();
ioServices = modelLayerFactory.getIOServicesFactory().newIOServices();
}
public Content replaceContentByPDFA(Content content) {
ContentVersion current = content.getCurrentVersion();
ContentVersionDataSummary summary = convertAndUpload(current);
ContentVersion pdfVersion = createVersion(current, summary);
return ContentImpl.create(content.getId(), pdfVersion, content.getHistoryVersions());
}
public void convertContentToPDFA(User user, Content content) {
String pdfFilename = changeExtension(content.getCurrentVersion().getFilename());
ContentVersion current = content.getCurrentVersion();
ContentVersionDataSummary summary = convertAndUpload(current);
content.updateContentWithName(user, summary, true, pdfFilename);
}
@Override
public void close() {
if (conversionManager != null) {
conversionManager.close();
ioServices.deleteDirectoryWithoutExpectableIOException(workingFolder);
}
}
private ContentVersionDataSummary convertAndUpload(ContentVersion current) {
InputStream original = contentManager.getContentInputStream(current.getHash(), "ContentConversionManager-original");
InputStream converted = null;
File convertedFile = null;
try {
convertedFile = conversionManager().convertToPDF(original, current.getFilename());
converted = ioServices.newFileInputStream(convertedFile, "ContentConversionManager-converted");
return contentManager.upload(converted, current.getFilename());
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} finally {
ioServices.closeQuietly(converted);
ioServices.deleteQuietly(convertedFile);
}
}
private ContentVersion createVersion(ContentVersion current, ContentVersionDataSummary summary) {
String pdfFilename = changeExtension(current.getFilename());
return new ContentVersion(summary, pdfFilename, current.getVersion(),
current.getModifiedBy(), current.getLastModificationDateTime(), null);
}
private String changeExtension(String filename) {
int start = filename.lastIndexOf('.');
if (start < 0) {
return filename + ".pdf";
} else {
return filename.substring(0, start) + ".pdf";
}
}
private ConversionManager conversionManager() {
if (conversionManager == null) {
workingFolder = ioServices.newTemporaryFolder("ContentConversionManager");
try {
conversionManager = new ConversionManager(ioServices, 1, workingFolder);
} catch(OfficeException e) {
ioServices.deleteQuietly(workingFolder);
throw e;
}
}
return conversionManager;
}
}