/*
* $Id$
*
* Authors:
* Jeff Buchbinder <jeff@freemedsoftware.org>
*
* REMITT Electronic Medical Information Translation and Transmission
* Copyright (C) 1999-2014 FreeMED Software Foundation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.remitt.plugin.render;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FilenameFilter;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.log4j.Logger;
import org.remitt.datastore.DbPlugin;
import org.remitt.prototype.PluginInterface;
import org.remitt.server.Configuration;
public class XsltPlugin implements PluginInterface {
static final Logger log = Logger.getLogger(XsltPlugin.class);
protected String defaultUsername = "";
@Override
public String getInputFormat() {
return "remittxml";
}
@Override
public HashMap<String, String> getOptions() {
return null;
}
@Override
public String getOutputFormat() {
return "variable";
}
@Override
public String getPluginName() {
return "Xslt";
}
@Override
public Double getPluginVersion() {
return 0.1;
}
@Override
public byte[] render(Integer jobId, byte[] input, String option)
throws Exception {
log.info("Entered Render for job #" + jobId.toString());
TransformerFactory tFactory = TransformerFactory.newInstance();
String transformedOption = DbPlugin.resolvePluginOption(
"org.remitt.plugin.render.XsltPlugin", option);
log.info("Original plugin option = " + option + ", transformed to "
+ transformedOption);
String xsltPath = Configuration.getServletContext().getServletContext()
.getRealPath("/WEB-INF/xsl/" + transformedOption + ".xsl");
// Input data, load
Source xmlInput = new StreamSource(new StringReader(new String(input)));
// Create XSL Transformation
log.debug("Loading xsl into transformer");
Transformer transformer;
try {
transformer = tFactory.newTransformer(new StreamSource(xsltPath));
} catch (TransformerConfigurationException e) {
log.error(e);
throw new Exception(e);
}
log.debug("Passing parameters to transform");
transformer.setParameter("currentTime", new Long(System
.currentTimeMillis()).toString());
transformer.setParameter("jobId", jobId == 0 ? new Long(System
.currentTimeMillis()).toString() : jobId.toString());
StreamResult xmlOutput = new StreamResult(new ByteArrayOutputStream());
log.debug("Performing transformation");
transformer.transform(xmlInput, xmlOutput);
log.info("Leaving Render for job #" + jobId.toString());
// Push stream to output
return xmlOutput.getOutputStream().toString().getBytes("UTF-8");
}
@Override
public String[] getPluginConfigurationOptions() {
List<String> options = new ArrayList<String>();
File dir = new File(Configuration.getServletContext()
.getServletContext().getRealPath("/WEB-INF/xsl/"));
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return !name.startsWith(".") && name.endsWith(".xsl");
}
};
String[] xslFiles = dir.list(filter);
if (xslFiles == null) {
return null;
} else {
for (int i = 0; i < xslFiles.length; i++) {
// Get filename of file or directory
options.add(xslFiles[i].replaceAll("\\.xsl$", ""));
}
}
return (String[]) options.toArray(new String[0]);
}
@Override
public void setDefaultUsername(String username) {
defaultUsername = username;
}
}