/** * */ package net.conselldemallorca.helium.core.util; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import javax.activation.MimetypesFileTypeMap; import net.conselldemallorca.helium.v3.core.api.exception.SistemaExternTimeoutException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.DocumentFormat; import com.artofsolving.jodconverter.DocumentFormatRegistry; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter; /** * Utilitats per a conversió de documents amb OpenOffice. * * @author Limit Tecnologies <limit@limit.es> */ @Component public class OpenOfficeUtils { private DocumentFormatRegistry documentFormatRegistry; public void convertir( String arxiuNom, byte[] arxiuContingut, String extensioSortida, OutputStream sortida) throws Exception { convertir( arxiuNom, new ByteArrayInputStream(arxiuContingut), extensioSortida, sortida); } public void convertir( String arxiuNom, InputStream arxiuContingut, String extensioSortida, OutputStream sortida) throws Exception { logger.info("Conversió OpenOffice (" + "arxiuNom=" + arxiuNom + ", " + "arxiuContingut=" + arxiuContingut.available() + "bytes, " + "extensioSortida=" + extensioSortida + ")"); DocumentFormat inputFormat = formatPerNomArxiu(arxiuNom); DocumentFormat outputFormat = getDocumentFormatRegistry().getFormatByFileExtension(extensioSortida); if (!outputFormat.getFileExtension().equals(inputFormat.getFileExtension())) { convert( arxiuContingut, inputFormat, sortida, outputFormat); } else { byte[] buffer = new byte[1024]; int len = arxiuContingut.read(buffer); while (len >= 0) { sortida.write(buffer, 0, len); len = arxiuContingut.read(buffer); } arxiuContingut.close(); sortida.close(); } } public String nomArxiuConvertit( String arxiuNom, String extensioSortida) { DocumentFormat outputFormat = getDocumentFormatRegistry().getFormatByFileExtension(extensioSortida); int indexPunt = arxiuNom.lastIndexOf("."); if (indexPunt != -1) { String nom = arxiuNom.substring(0, indexPunt); return nom + "." + outputFormat.getFileExtension(); } else { return arxiuNom + "." + outputFormat.getFileExtension(); } } public String getArxiuMimeType(String nomArxiu) { DocumentFormat format = formatPerNomArxiu(nomArxiu); if (format == null) return new MimetypesFileTypeMap().getContentType(nomArxiu); else return format.getMimeType(); } private void convert( final InputStream in, final DocumentFormat inputFormat, final OutputStream out, final DocumentFormat outputFormat) throws Exception { final String host = getPropertyHost(); final int port = getPropertyPort(); final OpenOfficeConnection connection = new SocketOpenOfficeConnection(host, port); ExecutorService executor = Executors.newSingleThreadExecutor(); try { Future<String> future = executor.submit(new Callable<String>() { @Override public String call() throws Exception { connection.connect(); DocumentConverter converter = new StreamOpenOfficeDocumentConverter( connection, getDocumentFormatRegistry()); converter.convert( in, inputFormat, out, outputFormat); return "Ok"; } }); if (getPropertyTimeout() != -1) future.get(getPropertyTimeout(), TimeUnit.SECONDS); else future.get(); } catch (TimeoutException e) { throw new SistemaExternTimeoutException( null, null, null, null, null, null, null, null, null, "(Conversió OpenOffice)", e); } finally { if (connection.isConnected()) connection.disconnect(); } executor.shutdownNow(); } private DocumentFormat formatPerNomArxiu(String fileName) { int indexPunt = fileName.lastIndexOf("."); if (indexPunt != -1) { String extensio = fileName.substring(indexPunt + 1); return getDocumentFormatRegistry().getFormatByFileExtension(extensio); } return null; } private DocumentFormatRegistry getDocumentFormatRegistry() { if (documentFormatRegistry == null) documentFormatRegistry = new DefaultDocumentFormatRegistry(); return documentFormatRegistry; } private String getPropertyHost() { return GlobalProperties.getInstance().getProperty("app.conversio.openoffice.host"); } private int getPropertyPort() { return Integer.parseInt(GlobalProperties.getInstance().getProperty("app.conversio.openoffice.port")); } private int getPropertyTimeout() { String timeout = GlobalProperties.getInstance().getProperty("app.conversio.openoffice.timeout"); if (timeout == null) return -1; else return Integer.parseInt(timeout); } private static final Logger logger = LoggerFactory.getLogger(OpenOfficeUtils.class); }