package jp.aegif.nemaki.businesslogic.rendition.impl;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.document.DefaultDocumentFormatRegistry;
import org.artofsolving.jodconverter.document.DocumentFormat;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;
import jp.aegif.nemaki.businesslogic.rendition.RenditionManager;
import jp.aegif.nemaki.util.PropertyManager;
import jp.aegif.nemaki.util.YamlManager;
import jp.aegif.nemaki.util.constant.PropertyKey;
public class JodRenditionManagerImpl implements RenditionManager {
private PropertyManager propertyManager;
private DefaultDocumentFormatRegistry registry;
private static final Log log = LogFactory
.getLog(JodRenditionManagerImpl.class);
@PostConstruct
public void init() {
registry = new DefaultDocumentFormatRegistry();
String definitionFile = "";
try {
definitionFile = propertyManager.readValue(
PropertyKey.JODCONVERTER_REGISTRY_DATAFORMATS);
} catch (Exception e) {
log.error("Cannot read a permission definition file", e);
}
// Parse definition file
YamlManager manager = new YamlManager(definitionFile);
List<Map<String, Object>> yml = (List<Map<String, Object>>) manager.loadYml();
if (CollectionUtils.isNotEmpty(yml)) {
for (Map<String, Object> format : yml) {
String name = (String) (format.get("name"));
String extension = (String) (format.get("extension"));
String mediaType = (String) (format.get("mediaType"));
DocumentFormat df = new DocumentFormat(name, extension,
mediaType);
registry.addFormat(df);
}
}
}
public ContentStream convertToPdf(ContentStream contentStream,
String documentName) {
OutputStream outputStream = null;
try {
String prefix = getPrefix(documentName);
String suffix = getSuffix(documentName);
File inputFile = convertInputStreamToFile(prefix, "." + suffix,
contentStream.getStream());
inputFile.deleteOnExit();
File outputFile = File.createTempFile("output", ".pdf");
outputFile.deleteOnExit();
String officehome = propertyManager
.readValue(PropertyKey.JODCONVERTER_OFFICEHOME);
OfficeManager officeManager = new DefaultOfficeManagerConfiguration()
.setPortNumber(8100).setOfficeHome(officehome)
.buildOfficeManager();
officeManager.start();
OfficeDocumentConverter converter = new OfficeDocumentConverter(
officeManager);
converter.convert(inputFile, outputFile);
officeManager.stop();
// convert back
FileInputStream fis = new FileInputStream(outputFile);
ContentStreamImpl result = new ContentStreamImpl();
result.setStream(fis);
result.setFileName(contentStream.getFileName());
result.setMimeType("application/pdf");
result.setLength(BigInteger.valueOf(outputFile.length()));
return result;
} catch (IOException e) {
// TODO Auto-generated catch block
// log.debug(e);
} finally {
if (outputStream != null) {
try {
// outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* @param inputStream
* @return
* @throws IOException
*/
private File convertInputStreamToFile(String prefix, String suffix,
InputStream inputStream) throws IOException {
File file = File.createTempFile(prefix, suffix);
try {
OutputStream out = new FileOutputStream(file);
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
inputStream.close();
out.flush();
out.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
return file;
}
private String getSuffix(String fileName) {
if (fileName == null)
return null;
int point = fileName.lastIndexOf(".");
if (point != -1) {
return fileName.substring(point + 1);
}
return fileName;
}
private String getPrefix(String fileName) {
if (fileName == null)
return null;
int point = fileName.lastIndexOf(".");
if (point != -1) {
return fileName.substring(0, point);
}
return fileName;
}
public boolean checkConvertible(String mediatype) {
DocumentFormat df = registry.getFormatByMediaType(mediatype);
return df != null;
}
public void setPropertyManager(PropertyManager propertyManager) {
this.propertyManager = propertyManager;
}
}