package gr.ntua.ivml.mint.xml.transform;
import gr.ntua.ivml.mint.actions.XMLPreview;
import gr.ntua.ivml.mint.mapping.MappingManager;
import gr.ntua.ivml.mint.persistent.XmlSchema;
import gr.ntua.ivml.mint.util.Config;
import gr.ntua.ivml.mint.util.StringUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.log4j.Logger;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
public class ChainTransform {
protected static final Logger log = Logger.getLogger( MappingManager.class);
protected static final String TRANSFORM_CUSTOM = "custom";
protected static final String TRANSFORM_XSL = "xsl";
protected static final String TRANSFORM_HTML = "html";
protected static final String TRANSFORM_JSP = "jsp";
protected static final String TRANSFORM_RDF = "rdf";
protected static final String TRANSFORM_TEXT = "text";
public ChainTransform()
{
}
public ArrayList<XMLPreview.PreviewTab> transform(String input, XmlSchema schema) throws Exception{
JSONObject configuration = (JSONObject) JSONSerializer.toJSON(schema.getJsonConfig());
if(configuration.has("preview")) {
return this.transform(input, configuration.getJSONArray("preview"));
}
return new ArrayList<XMLPreview.PreviewTab>();
}
public ArrayList<XMLPreview.PreviewTab> transform(String input, JSONArray previews) {
ArrayList<XMLPreview.PreviewTab> result = new ArrayList<XMLPreview.PreviewTab>();
Iterator i = previews.iterator();
while(i.hasNext()) {
JSONObject preview = (JSONObject) i.next();
log.debug("getting preview for : " + preview);
// default preview tab values;
String type = TRANSFORM_CUSTOM;
String output_type = XMLPreview.PreviewTab.TYPE_TEXT;
String url = null;
String output = null;
String label = "Preview";
ItemTransform transform = null;
XMLPreview.PreviewTab tab = null;
// load preview tab values
if(preview.has("type")) {
type = preview.getString("type");
}
if(preview.has("label")) {
label = preview.getString("label");
}
if(preview.has("output")) {
output_type = preview.getString("output");
}
// initialise preview transform
if(preview.has("xsl")) {
String xsl = preview.getString("xsl");
XSLTransform xslt = new XSLTransform();
File file = new File(Config.getXSLPath(xsl));
try {
xsl = StringUtils.fileContents(file).toString();
xslt.setXSL(xsl);
transform = xslt;
} catch (Exception e) {
e.printStackTrace();
}
} else if(preview.has("jsp")) {
String jsp = preview.getString("jsp");
tab = new XMLPreview.PreviewTab(label, input, XMLPreview.PreviewTab.TYPE_JSP, jsp);
} else if(preview.has("transform")) {
String cname = preview.getString("transform");
try {
Class c = ChainTransform.class.getClassLoader().loadClass(cname);
transform = (ItemTransform) c.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
// if valid transform then generate tab
if(transform != null) {
output = transform.transform(input);
tab = new XMLPreview.PreviewTab(label, output, output_type, url);
}
// if valid tab then add and check for next transformation.
if(tab != null) {
result.add(tab);
if(preview.has("preview")) {
JSONArray p = preview.getJSONArray("preview");
ArrayList<XMLPreview.PreviewTab> more = this.transform(output, p);
result.addAll(more);
}
}
}
return result;
}
}