1
2
3 package org.astrogrid.warehouse.ogsadai;
4
5 import org.w3c.dom.Document;
6 import org.w3c.dom.Element;
7
8 import org.apache.log4j.Logger;
9
10 import uk.org.ogsadai.common.UserException;
11 import uk.org.ogsadai.common.XMLUtilities;
12 import uk.org.ogsadai.porttype.gds.activity.transform.Constants;
13
14 import uk.org.ogsadai.client.toolkit.Activity;
15 import uk.org.ogsadai.client.toolkit.ActivityOutput;
16 import uk.org.ogsadai.client.toolkit.ActivityOutputException;
17 import uk.org.ogsadai.client.toolkit.DataFormatException;
18
19 /***
20 * This is an OGSA-DAI activity to convert OGSA-DAI XML Rowset output from
21 * other activities using an XSLT stylesheet.
22 * <P>
23 * I'm not sure why this activity wasn't provided as part of the OGSA-DAI
24 * client toolkit? Maybe it will be in the next release?
25 * <P>
26 * It has two inputs (the XML to be transformed, and the XSL stylesheet)
27 * and one output (the transformed XML).
28 *
29 * @author K.E.Andrews
30 */
31 public class XSLTransform extends Activity {
32
33
34 private static Logger mLog =
35 Logger.getLogger(XSLTransform.class.getName());
36
37
38 private static final int XML_INPUT_INDEX = 0;
39 private static final int XSLT_INPUT_INDEX = 1;
40
41 private static final int XSL_OUTPUT_INDEX = 0;
42
43 private static final String XML_INPUT_NAME = "xmlInput";
44 private static final String XSLT_INPUT_NAME = "xsltInput";
45 private static final String XSL_OUTPUT_NAME = "xslOutput";
46
47 /***
48 * Constructs a request to transform data produced by another activity
49 * using an XSLT stylesheet delivered by another activity.
50 *
51 * @param xmlInput input XML to be transformed, from another activity.
52 * @param xsltInput input XSL stylesheet to be used, delivered by another
53 * activity.
54 */
55 public XSLTransform(ActivityOutput xmlInput, ActivityOutput xsltInput) {
56
57 if ((xmlInput == null) || (xsltInput == null)) {
58 throw new IllegalArgumentException("ActivityOutput must not be null");
59 }
60 addInput(XML_INPUT_NAME);
61 super.setInput(XML_INPUT_INDEX, xmlInput.getName());
62 addInput(XSLT_INPUT_NAME);
63 super.setInput(XSLT_INPUT_INDEX, xsltInput.getName());
64 addOutput(XSL_OUTPUT_NAME);
65 }
66
67 /***
68 * Gets the activity's XSLT data output.
69 *
70 * @return the XSLT data output.
71 */
72 public ActivityOutput getOutput() {
73 return getOutputs()[XSL_OUTPUT_INDEX];
74 }
75
76 /***
77 * Internal method to produce OGSA-DAI XML Perform document.
78 * @see uk.org.ogsadai.client.toolkit.Activity#generateXML()
79 *
80 * @return String containing XML perform document for this activity.
81 */
82 protected String generateXML() {
83
84 StringBuffer sb = new StringBuffer();
85 sb.append("<xslTransform name=\"");
86 sb.append(getName());
87 sb.append("\">\n");
88 sb.append("<inputXSLT from=\"");
89 sb.append(getInputParameters()[XSLT_INPUT_INDEX].getOutputName());
90 sb.append("\"/>\n");
91 sb.append("<inputXML from=\"");
92 sb.append(getInputParameters()[XML_INPUT_INDEX].getOutputName());
93 sb.append("\"/>\n");
94
95 sb.append("<output name=\"");
96 sb.append(getOutputs()[XSL_OUTPUT_INDEX].getName());
97 sb.append("\"/>\n");
98 sb.append("</xslTransform>");
99 return sb.toString();
100 }
101 }