package de.jos.labelgenerator.pdf;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.commons.io.IOUtils;
import de.jos.labelgenerator.components.button.ButtonLabel;
import de.jos.labelgenerator.configuration.Layout;
import de.jos.labelgenerator.configuration.addressProvider.MockAddress;
import de.jos.labelgenerator.configuration.addressProvider.MockAddress2;
import de.jos.labelgenerator.template.TemplatingEngine;
public class StylesheetTransformation {
private static final Logger LOGGER = Logger.getLogger(StylesheetTransformation.class.getName());
private static final ClassLoader classLoader = StylesheetTransformation.class.getClassLoader();
private static final String XSLT_FILENAME = "xslt/replacement_template.xsl";
private static final String TEMPLATE_TO_MAKE_DYNAMIC = "layouts/odt/template.xml";
private TemplatingEngine templateEngine = new TemplatingEngine();
public StylesheetTransformation() {
}
/**
* Returns the generated updated content.xml file after the stylesheet
* transformation. Returns null if an error occured.
*
* @param layout
* @param buttonLabelList
* @return
* @throws Exception
*/
public String generate(Layout layout, List<ButtonLabel> buttonLabelList) throws Exception {
LOGGER.log(Level.INFO, "Performing Stylesheet tranformation.");
// read the xslt file
final String originalStylesheet = readFileFromResourceInString(XSLT_FILENAME);
final String originalTemplate = readFileFromResourceInString(TEMPLATE_TO_MAKE_DYNAMIC);
final TransformerFactory transformerFactory = TransformerFactory.newInstance();
String workingTemplate = originalTemplate;
// now start applying the velocity placeholders for each address
for (ButtonLabel tmpButtonLabel : buttonLabelList) {
// replace address, frameNumber, leadingBlanks
final String renderedXslt = templateEngine.renderXsltTempalte(tmpButtonLabel.getAddress(),
originalStylesheet, tmpButtonLabel.getIndex());
final Transformer transformer = transformerFactory.newTransformer(new StreamSource(
new ByteArrayInputStream(renderedXslt.getBytes())));
// perform stylesheet transformation
final ByteArrayOutputStream bout = new ByteArrayOutputStream();
transformer.transform(new StreamSource(new ByteArrayInputStream(workingTemplate.getBytes())),
new StreamResult(bout));
workingTemplate = bout.toString("UTF-8");
}
System.out.println(workingTemplate);
return workingTemplate;
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
List<ButtonLabel> buttonLabels = new ArrayList<ButtonLabel>();
ButtonLabel buttonLabel = new ButtonLabel(4);
buttonLabel.setAddress(new MockAddress2());
buttonLabels.add(buttonLabel);
buttonLabel = new ButtonLabel(2);
buttonLabel.setAddress(new MockAddress());
buttonLabels.add(buttonLabel);
StylesheetTransformation transformation = new StylesheetTransformation();
transformation.generate(null, buttonLabels);
}
/**
* TODO move to file utils.
*
* Read content from a file and put it into a String.
*
* @param fileName
* @return
* @throws IOException
*/
private String readFileFromResourceInString(String fileName) throws IOException {
final InputStream inputStream = classLoader.getResourceAsStream(fileName);
return IOUtils.toString(inputStream);
}
}