View Javadoc

1   // (c) Astrogrid 2004
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      // Logger object for logging in this class
34      private static Logger mLog =
35          Logger.getLogger(XSLTransform.class.getName());
36  
37      // Index of inputs 
38      private static final int XML_INPUT_INDEX = 0;
39      private static final int XSLT_INPUT_INDEX = 1;
40      // Index of archived output.
41      private static final int XSL_OUTPUT_INDEX = 0;
42      // Input name
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          // Tell base class of inputs and outputs
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 }