/*******************************************************************************
* Copyright (c) 2015 MEDEVIT and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* MEDEVIT <office@medevit.at> - initial API and implementation
*******************************************************************************/
package ch.elexis.fop.service.config;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.fop.apps.FopConfParser;
import org.apache.fop.apps.FopFactoryBuilder;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import ch.elexis.core.data.util.PlatformHelper;
public class ConfigFile {
Element root;
Document doc;
public Element getRootElement(){
return root;
}
/**
* Create a ConfigFile instance containing FOP specific configuration. It should be used as
* input to the {@link FopConfParser} when creating a new {@link FopFactoryBuilder}.
*
*/
public ConfigFile(){
try {
// other features should contribute fonts to this directory via p2 touchpoint
final File fonts =
new File(PlatformHelper.getBasePath("ch.elexis.fop.service"), "rsc/fonts");
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
doc = docBuilder.newDocument();
root = doc.createElement("fop");
root.setAttribute("version", "1.0");
doc.appendChild(root);
Element renderers = doc.createElement("renderers");
root.appendChild(renderers);
Element rendererPDF = doc.createElement("renderer");
rendererPDF.setAttribute("mime", "application/pdf");
renderers.appendChild(rendererPDF);
Element rendererPS = doc.createElement("renderer");
rendererPS.setAttribute("mime", "application/postscript");
renderers.appendChild(rendererPS);
Element fontsPDF = doc.createElement("fonts");
Element fontsPS = doc.createElement("fonts");
Element autodetect = doc.createElement("auto-detect");
Element directory = doc.createElement("directory");
directory.setAttribute("recursive", "true");
directory.setTextContent(fonts.getAbsolutePath());
fontsPDF.appendChild(directory.cloneNode(true));
fontsPDF.appendChild(autodetect.cloneNode(true));
fontsPS.appendChild(directory.cloneNode(true));
fontsPS.appendChild(autodetect.cloneNode(true));
rendererPDF.appendChild(fontsPDF);
rendererPS.appendChild(fontsPS);
} catch (ParserConfigurationException e) {
LoggerFactory.getLogger(ConfigFile.class).error("Error during FOP configuration.", e);
throw new IllegalStateException(e);
}
}
private String getAsString(){
try {
// set up a transformer
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
trans.setOutputProperty(OutputKeys.INDENT, "yes");
// create string from xml tree
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
trans.transform(source, result);
return sw.toString();
} catch (TransformerException e) {
LoggerFactory.getLogger(ConfigFile.class).error("Error during FOP configuration.", e);
throw new IllegalStateException(e);
}
}
public String outputElement(){
return getAsString();
}
public InputStream getAsInputStream(){
return new ByteArrayInputStream(getAsString().getBytes());
}
}