/* * This is eMonocot, a global online biodiversity information resource. * * Copyright © 2011–2015 The Board of Trustees of the Royal Botanic Gardens, Kew and The University of Oxford * * eMonocot is free software: you can redistribute it and/or modify it under the terms of the * GNU Affero General Public License as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * eMonocot is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * The complete text of the GNU Affero General Public License is in the source repository as the file * ‘COPYING’. It is also available from <http://www.gnu.org/licenses/>. */ package org.emonocot.job.key; import java.util.HashMap; import java.util.Map; import javax.xml.transform.ErrorListener; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.core.io.Resource; /** * * @author ben * */ public class XmlTransformingTasklet implements Tasklet { private static Logger logger = LoggerFactory.getLogger(XmlTransformingTasklet.class); private Resource inputFile; private Resource xsltFile; private Resource outputFile; private ErrorListener errorListener; public void setErrorListener(ErrorListener errorListener) { this.errorListener = errorListener; } /** * @param newInputFile the inputFile to set */ public final void setInputFile(final Resource newInputFile) { this.inputFile = newInputFile; } /** * @param newXsltFile the xsltFile to set */ public final void setXsltFile(final Resource newXsltFile) { this.xsltFile = newXsltFile; } /** * @param newOutputFile the outputFile to set */ public final void setOutputFile(final Resource newOutputFile) { this.outputFile = newOutputFile; } /** * @param parameters the parameters to set */ public void setParameters(Map<String, String> parameters) { this.parameters = parameters; } /** * */ private Map<String, String> parameters = new HashMap<String, String>(); /** * @param contribution * Set the step contribution * @param chunkContext * Set the chunk context * @return the repeat status * @throws Exception * if there is a problem */ public final RepeatStatus execute(final StepContribution contribution, final ChunkContext chunkContext) throws Exception { // Set up input documents Source inputXML = new StreamSource(inputFile.getFile()); Source inputXSL = new StreamSource(xsltFile.getFile()); // Set up output sink Result outputXHTML = new StreamResult(outputFile.getFile()); // Setup a factory for transforms TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(inputXSL); for (String parameterName : parameters.keySet()) { transformer.setParameter(parameterName, parameters.get(parameterName)); } if(errorListener != null) { transformer.setErrorListener(errorListener); } transformer.transform(inputXML, outputXHTML); return RepeatStatus.FINISHED; } }