home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 November / PCONLINE_11_99.ISO / filesbbs / OS2 / APCHSSL2.ZIP / OS2HTTPD / jserv / com / kav / xsl / XSLReader.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-05-16  |  10.6 KB  |  566 lines

  1. package com.kav.xsl;
  2.  
  3. import com.kav.xml.DOMReader;
  4. import com.kav.xml.Whitespace;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.PrintStream;
  10. import java.io.PrintWriter;
  11. import java.io.Writer;
  12. import java.util.Properties;
  13. import org.w3c.dom.Attr;
  14. import org.w3c.dom.CDATASection;
  15. import org.w3c.dom.Document;
  16. import org.w3c.dom.Element;
  17. import org.w3c.dom.Node;
  18. import org.w3c.dom.NodeList;
  19. import org.w3c.dom.ProcessingInstruction;
  20. import org.w3c.dom.Text;
  21.  
  22. public class XSLReader {
  23.    private PrintWriter errorWriter;
  24.    private DOMReader domReader;
  25.  
  26.    public XSLReader() throws Exception {
  27.       Properties var1 = new Properties();
  28.  
  29.       try {
  30.          Object var2 = null;
  31.          File var3 = new File("xslp.properties");
  32.          if (var3.exists()) {
  33.             var2 = new FileInputStream(var3);
  34.          } else {
  35.             var2 = this.getClass().getResourceAsStream("xslp.properties");
  36.          }
  37.  
  38.          if (var2 != null) {
  39.             var1.load((InputStream)var2);
  40.          }
  41.       } catch (IOException var4) {
  42.       }
  43.  
  44.       String var6 = var1.getProperty("dom-package");
  45.       if (var6 != null) {
  46.          this.domReader = new DOMReader(var1.getProperty(var6));
  47.       } else {
  48.          this.domReader = new DOMReader();
  49.       }
  50.  
  51.       this.errorWriter = new PrintWriter(System.out, true);
  52.    }
  53.  
  54.    public XSLReader(DOMReader var1) {
  55.       this.domReader = var1;
  56.       this.errorWriter = new PrintWriter(System.out, true);
  57.    }
  58.  
  59.    public XSLStylesheet readStylesheet(Document var1, String var2) throws XSLException {
  60.       XSLStylesheet var3 = new XSLStylesheet();
  61.       var3.setHref(var2);
  62.       var3.setDocumentBase(XSLImport.getDocumentBase(var2));
  63.       if (var1 == null) {
  64.          return var3;
  65.       } else {
  66.          NodeList var4 = var1.getChildNodes();
  67.  
  68.          for(int var6 = 0; var6 < var4.getLength(); ++var6) {
  69.             Node var5 = var4.item(var6);
  70.             if (var5.getNodeType() == 7) {
  71.                var3.addPI((ProcessingInstruction)var5);
  72.             }
  73.          }
  74.  
  75.          Element var7 = var1.getDocumentElement();
  76.          if (var7 != null && var7.getNodeName().equals("xsl:stylesheet")) {
  77.             ((XSLObject)var3).copyAttributes(var7);
  78.             this.parseStylesheetElement(var7, var3);
  79.             return var3;
  80.          } else {
  81.             throw new XSLException("Invalid stylesheet. Does not contain xsl:stylesheet as the document element.");
  82.          }
  83.       }
  84.    }
  85.  
  86.    public XSLStylesheet readStylesheet(String var1) throws XSLException {
  87.       Object var2 = null;
  88.       XSLStylesheet var6;
  89.       if (var1 != null) {
  90.          Object var3 = null;
  91.  
  92.          try {
  93.             var7 = XSLImport.getInputStream(var1, (String)null);
  94.          } catch (Exception var5) {
  95.             this.errorWriter.println(((Throwable)var5).getMessage());
  96.             return new XSLStylesheet();
  97.          }
  98.  
  99.          var6 = this.readStylesheet(var7, var1);
  100.       } else {
  101.          var6 = new XSLStylesheet();
  102.       }
  103.  
  104.       return var6;
  105.    }
  106.  
  107.    public XSLStylesheet readStylesheet(InputStream var1, String var2) throws XSLException {
  108.       XSLStylesheet var3 = null;
  109.       String var4 = var2;
  110.       if (var1 != null) {
  111.          if (var2 == null) {
  112.             var4 = "XSL InputStream";
  113.          }
  114.  
  115.          Document var5 = this.domReader.readDocument(var1, var4, false, this.errorWriter);
  116.          var3 = this.readStylesheet(var5, var2);
  117.       }
  118.  
  119.       return var3;
  120.    }
  121.  
  122.    public XSLObject createXSLObject(XSLStylesheet var1, Element var2) throws XSLException {
  123.       if (var2 == null) {
  124.          throw new XSLException("null element encountered");
  125.       } else {
  126.          String var3 = var2.getTagName();
  127.          if (var3 == null) {
  128.             var3 = var2.getNodeName();
  129.          }
  130.  
  131.          var3 = var3.intern();
  132.          XSLObject var4 = null;
  133.          boolean var5 = true;
  134.          if (var3 == "xsl:apply-templates") {
  135.             var4 = new Selection(var1, (short)1);
  136.          } else if (var3 == "xsl:apply-imports") {
  137.             var4 = new Selection(var1, (short)0);
  138.          } else if (var3 == "xsl:arg") {
  139.             var4 = new XSLArg(var1);
  140.          } else if (var3 == "xsl:attribute") {
  141.             var4 = new XSLObject(var1, (short)2);
  142.          } else if (var3 == "xsl:attribute-set") {
  143.             String var6 = var2.getAttribute("name");
  144.             var4 = new AttributeSet(var1, var6);
  145.             var5 = false;
  146.          } else if (var3 == "xsl:choose") {
  147.             var4 = new Selection(var1, (short)4);
  148.          } else if (var3 == "xsl:comment") {
  149.             var4 = new XSLObject(var1, (short)5);
  150.          } else {
  151.             if (var3 == "xsl:constant") {
  152.                String var10 = var2.getAttribute("name");
  153.                String var7 = var2.getAttribute("value");
  154.                var4 = new Constant(var1, var10, var7);
  155.                return var4;
  156.             }
  157.  
  158.             if (var3 == "xsl:contents") {
  159.                var4 = new EmptyXSLObject(var1, (short)7);
  160.             } else if (var3 == "xsl:copy") {
  161.                var4 = new XSLObject(var1, (short)8);
  162.             } else if (var3 == "xsl:counter") {
  163.                var4 = new XSLObject(var1, (short)9);
  164.             } else if (var3 == "xsl:counters") {
  165.                var4 = new XSLObject(var1, (short)10);
  166.             } else if (var3 == "xsl:counter-increment") {
  167.                var4 = new XSLObject(var1, (short)11);
  168.             } else if (var3 == "xsl:counter-reset") {
  169.                var4 = new XSLObject(var1, (short)12);
  170.             } else if (var3 == "xsl:counter-scope") {
  171.                var4 = new XSLObject(var1, (short)13);
  172.             } else if (var3 == "xsl:element") {
  173.                var4 = new XSLObject(var1, (short)14);
  174.             } else if (var3 == "xsl:for-each") {
  175.                var4 = new Selection(var1, (short)20);
  176.             } else if (var3 == "xsl:id") {
  177.                var4 = new Id(var1);
  178.             } else if (var3 == "xsl:if") {
  179.                var4 = new Selection(var1, (short)16);
  180.             } else if (var3 == "xsl:import") {
  181.                var4 = new XSLImport(var1);
  182.             } else if (var3 == "xsl:include") {
  183.                var4 = new EmptyXSLObject(var1, (short)18);
  184.             } else if (var3 == "xsl:invoke") {
  185.                var4 = new Invoke(var1);
  186.             } else if (var3 == "xsl:macro") {
  187.                var4 = new Macro(var1);
  188.             } else if (var3 == "xsl:macro-arg") {
  189.                var4 = new MacroArg(var1);
  190.             } else if (var3 == "xsl:number") {
  191.                var4 = new XSLNumber(var1);
  192.             } else if (var3 == "xsl:otherwise") {
  193.                var4 = new Selection(var1, (short)25);
  194.             } else if (var3 == "xsl:pi") {
  195.                var4 = new XSLObject(var1, (short)26);
  196.             } else if (var3 == "xsl:preserve-space") {
  197.                var4 = new EmptyXSLObject(var1, (short)27);
  198.             } else if (var3 == "xsl:sort") {
  199.                var4 = new XSLSort(var1);
  200.             } else if (var3 == "xsl:strip-space") {
  201.                var4 = new EmptyXSLObject(var1, (short)29);
  202.             } else if (var3 != "xsl:stylesheet") {
  203.                if (var3 == "xsl:template") {
  204.                   var4 = new TemplateRule(var1);
  205.                } else if (var3 == "xsl:text") {
  206.                   var4 = new XSLText(var1, "");
  207.                } else if (var3 == "xsl:use") {
  208.                   var4 = new XSLUse(var1);
  209.                } else if (var3 == "xsl:value-of") {
  210.                   var4 = new ValueOf(var1);
  211.                } else if (var3 == "xsl:when") {
  212.                   var4 = new Selection(var1, (short)35);
  213.                } else if (var3 == "xsl:entity-ref") {
  214.                   var4 = new XSLObject(var1, (short)38);
  215.                } else {
  216.                   if (var3 == "xsl:script") {
  217.                      return new XSLScript(var1, XSLObject.getText(var2));
  218.                   }
  219.  
  220.                   var4 = new XSLObject(var1, (short)21);
  221.                   var4.setTypeName(var3);
  222.                }
  223.             }
  224.          }
  225.  
  226.          if (var5) {
  227.             var4.copyAttributes(var2);
  228.          }
  229.  
  230.          this.handleXSLObject(var1, var2, var4);
  231.          return var4;
  232.       }
  233.    }
  234.  
  235.    public void setErrorStream(Writer var1) {
  236.       this.errorWriter = new PrintWriter(var1, true);
  237.    }
  238.  
  239.    public void setErrorStream(PrintStream var1) {
  240.       this.errorWriter = new PrintWriter(var1, true);
  241.    }
  242.  
  243.    private void importStylesheet(Document var1, XSLStylesheet var2, String var3) throws XSLException {
  244.       XSLStylesheet var4 = this.readStylesheet(var1, var3);
  245.       var2.importFrom(var4);
  246.    }
  247.  
  248.    private void importStylesheet(String var1, XSLStylesheet var2) throws XSLException {
  249.       if (var2 != null) {
  250.          Object var3 = null;
  251.          var1 = XSLImport.resolveHref(var1, var2.getDocumentBase());
  252.          if (!var2.isAllowableImport(var1)) {
  253.             this.errorWriter.println("error including stylesheet: '" + var1 + "'.");
  254.             this.errorWriter.println(" - Stylesheet already directly or indirectly included.");
  255.             this.errorWriter.println(" - continuing processing without the include.");
  256.          } else {
  257.             try {
  258.                var7 = XSLImport.getInputStream(var1, (String)null);
  259.             } catch (Exception var5) {
  260.                this.errorWriter.println("error importing stylesheet: '" + var1 + "'.");
  261.                this.errorWriter.println(" - " + ((Throwable)var5).getMessage());
  262.                this.errorWriter.println(" - continuing processing without the import.");
  263.                return;
  264.             }
  265.  
  266.             XSLStylesheet var4 = this.readStylesheet(var7, var1);
  267.             var2.importWithoutVerify(var4);
  268.          }
  269.       }
  270.    }
  271.  
  272.    private void include(String var1, XSLObject var2, XSLStylesheet var3) throws XSLException {
  273.       if (var3 != null) {
  274.          if (var1 != null) {
  275.             var1 = XSLImport.resolveHref(var1, var3.getDocumentBase());
  276.             Object var4 = null;
  277.  
  278.             try {
  279.                var9 = XSLImport.getInputStream(var1, (String)null);
  280.             } catch (Exception var7) {
  281.                this.errorWriter.println("error including stylesheet: '" + var1 + "'.");
  282.                this.errorWriter.println(" - " + ((Throwable)var7).getMessage());
  283.                this.errorWriter.println(" - continuing processing without the include.");
  284.                return;
  285.             }
  286.  
  287.             Document var5 = this.domReader.readDocument(var9, var1, false, this.errorWriter);
  288.             Element var6 = var5.getDocumentElement();
  289.             if (var6 != null && var6.getNodeName().equals("xsl:stylesheet")) {
  290.                if (var2 == var3) {
  291.                   this.parseStylesheetElement(var6, var3);
  292.                } else {
  293.                   this.parseElement(var3, var6, var2);
  294.                }
  295.             } else {
  296.                throw new XSLException("Invalid stylesheet. Does not contain xsl:stylesheet as the document element.");
  297.             }
  298.          }
  299.       }
  300.    }
  301.  
  302.    private void parseStylesheetElement(Element var1, XSLStylesheet var2) throws XSLException {
  303.       NodeList var3 = var1.getChildNodes();
  304.  
  305.       for(int var4 = 0; var4 < var3.getLength(); ++var4) {
  306.          Node var5 = var3.item(var4);
  307.          if (var5.getNodeType() == 1) {
  308.             Element var6 = (Element)var5;
  309.             var6.getNodeName();
  310.             XSLObject var7 = this.createXSLObject(var2, var6);
  311.             switch (var7.getType()) {
  312.                case 3:
  313.                   var2.addAttributeSet((AttributeSet)var7);
  314.                   break;
  315.                case 6:
  316.                   var2.addConstant((Constant)var7);
  317.                   break;
  318.                case 15:
  319.                   var2.addId((Id)var7);
  320.                   break;
  321.                case 17:
  322.                   XSLImport var8 = (XSLImport)var7;
  323.  
  324.                   try {
  325.                      this.importStylesheet(var8.getHref(), var2);
  326.                   } catch (XSLException var13) {
  327.                      this.errorWriter.println(var13.getMessage());
  328.                      this.errorWriter.println(" -- processing without import");
  329.                   }
  330.                   break;
  331.                case 18:
  332.                   String var9 = var6.getAttribute("href");
  333.  
  334.                   try {
  335.                      this.include(var9, var2, var2);
  336.                   } catch (XSLException var12) {
  337.                      this.errorWriter.println(var12);
  338.                      this.errorWriter.println(" -- processing without include");
  339.                   }
  340.                   break;
  341.                case 22:
  342.                   try {
  343.                      var2.addMacro((Macro)var7);
  344.                   } catch (XSLException var11) {
  345.                      this.errorWriter.println(var11.getMessage());
  346.                   }
  347.                   break;
  348.                case 27:
  349.                case 29:
  350.                   var2.appendAction(var7);
  351.                   break;
  352.                case 31:
  353.                   var2.addRule((TemplateRule)var7);
  354.                   break;
  355.                case 39:
  356.                   var2.addScript((XSLScript)var7);
  357.             }
  358.          }
  359.       }
  360.  
  361.    }
  362.  
  363.    private void parseElement(XSLStylesheet var1, Element var2, XSLObject var3) throws XSLException {
  364.       NodeList var5 = var2.getChildNodes();
  365.  
  366.       for(int var6 = 0; var6 < var5.getLength(); ++var6) {
  367.          Node var7 = var5.item(var6);
  368.          switch (var7.getNodeType()) {
  369.             case 1:
  370.                XSLObject var8 = this.createXSLObject(var1, (Element)var7);
  371.                if (var8.getType() == 18) {
  372.                   String var13 = var8.getAttribute("href");
  373.  
  374.                   try {
  375.                      this.include(var13, var3, var1);
  376.                   } catch (XSLException var11) {
  377.                      this.errorWriter.println(var11);
  378.                      this.errorWriter.println(" -- processing without include");
  379.                   }
  380.                } else if (!var3.appendAction(var8)) {
  381.                   this.errorWriter.print("warning: element '");
  382.                   this.errorWriter.print(var7.getNodeName());
  383.                   this.errorWriter.print("' is an invalid child of '");
  384.                   this.errorWriter.print(var3.getTypeName());
  385.                   this.errorWriter.println("'.");
  386.                   this.errorWriter.println("The invalid element will be ignored.");
  387.                }
  388.             case 2:
  389.             default:
  390.                break;
  391.             case 3:
  392.                String var12 = ((Text)var7).getData();
  393.                if (var3.getType() != 32) {
  394.                   boolean var9 = var7.getPreviousSibling() == null;
  395.                   boolean var10 = var7.getNextSibling() == null;
  396.                   var12 = Whitespace.stripSpace(var12, var9, var10);
  397.                }
  398.  
  399.                if (var12.length() > 0) {
  400.                   var3.appendAction(new XSLText(var1, var12));
  401.                }
  402.                break;
  403.             case 4:
  404.                String var4 = ((CDATASection)var7).getData();
  405.                var3.appendAction(new XSLCData(var1, var4));
  406.          }
  407.       }
  408.  
  409.    }
  410.  
  411.    private void handleXSLObject(XSLStylesheet var1, Element var2, XSLObject var3) throws XSLException {
  412.       Object var4 = null;
  413.       switch (var3.getType()) {
  414.          case 1:
  415.          case 4:
  416.          case 16:
  417.          case 20:
  418.          case 25:
  419.          case 35:
  420.             this.parseSelection(var1, var2, (Selection)var3);
  421.             return;
  422.          case 2:
  423.          case 3:
  424.          case 14:
  425.          case 22:
  426.          case 26:
  427.             this.parseElement(var1, var2, var3);
  428.             this.requiresAttr(var2, "name", false);
  429.             return;
  430.          case 5:
  431.          case 8:
  432.          case 13:
  433.          case 21:
  434.          case 39:
  435.             this.parseElement(var1, var2, var3);
  436.             return;
  437.          case 6:
  438.          case 7:
  439.          case 23:
  440.          case 24:
  441.          case 28:
  442.          case 30:
  443.          case 37:
  444.          default:
  445.             return;
  446.          case 9:
  447.          case 10:
  448.          case 11:
  449.          case 12:
  450.          case 38:
  451.             this.requiresAttr(var2, "name", false);
  452.             return;
  453.          case 15:
  454.             this.requiresAttr(var2, "attribute", false);
  455.             return;
  456.          case 17:
  457.          case 18:
  458.             this.requiresAttr(var2, "href", false);
  459.             return;
  460.          case 19:
  461.             this.requiresAttr(var2, "macro", false);
  462.             this.parseElement(var1, var2, var3);
  463.             return;
  464.          case 27:
  465.          case 29:
  466.             this.requiresAttr(var2, "element", false);
  467.             return;
  468.          case 31:
  469.             this.requiresAttr(var2, "match", false);
  470.             String var5 = var3.getAttribute("match");
  471.  
  472.             try {
  473.                ((TemplateRule)var3).setMatchExpr(var5);
  474.             } catch (InvalidExprException var7) {
  475.                StringBuffer var8 = new StringBuffer("the match expression \"");
  476.                var8.append(var5);
  477.                var8.append("' is not valid\n --");
  478.                var8.append(((Throwable)var7).getMessage());
  479.                throw new XSLException(var8.toString());
  480.             }
  481.  
  482.             this.parseElement(var1, var2, var3);
  483.             return;
  484.          case 32:
  485.             ((XSLText)var3).appendData(XSLObject.getText(var2));
  486.             return;
  487.          case 33:
  488.             this.requiresAttr(var2, "attribute-set", false);
  489.             return;
  490.          case 34:
  491.             this.requiresAttr(var2, "select", false);
  492.             return;
  493.          case 36:
  494.             ((XSLCData)var3).appendData(XSLObject.getText(var2));
  495.       }
  496.    }
  497.  
  498.    private void parseSelection(XSLStylesheet var1, Element var2, Selection var3) throws XSLException {
  499.       this.parseElement(var1, var2, var3);
  500.       String var4 = null;
  501.       Object var5 = null;
  502.       short var6 = ((XSLObject)var3).getType();
  503.       switch (var6) {
  504.          case 1:
  505.             Attr var12 = var2.getAttributeNode("select");
  506.             if (var12 == null) {
  507.                return;
  508.             }
  509.  
  510.             var4 = var12.getValue();
  511.             break;
  512.          case 4:
  513.             return;
  514.          case 16:
  515.             Attr var11 = var2.getAttributeNode("test");
  516.             if (var11 != null) {
  517.                var4 = var11.getValue();
  518.             }
  519.             break;
  520.          case 20:
  521.             Attr var10 = var2.getAttributeNode("select");
  522.             if (var10 != null) {
  523.                var4 = var10.getValue();
  524.             }
  525.             break;
  526.          case 25:
  527.             var4 = ".";
  528.             break;
  529.          case 35:
  530.             Attr var9 = var2.getAttributeNode("test");
  531.             if (var9 != null) {
  532.                var4 = var9.getValue();
  533.             }
  534.             break;
  535.          default:
  536.             return;
  537.       }
  538.  
  539.       try {
  540.          var3.setSelectExpr(ExpressionParser.createSelectExpr(var4));
  541.       } catch (InvalidExprException var8) {
  542.          this.errorWriter.print("error in SelectExpr for element ");
  543.          this.errorWriter.println(var2.getNodeName());
  544.          this.errorWriter.println(" -- " + ((Throwable)var8).getMessage());
  545.       }
  546.    }
  547.  
  548.    private void requiresAttr(Element var1, String var2, boolean var3) throws XSLException {
  549.       Attr var4 = var1.getAttributeNode(var2);
  550.       if (var4 == null || var4.getValue().length() == 0 && !var3) {
  551.          StringBuffer var5 = new StringBuffer("Required attribute '");
  552.          var5.append(var2);
  553.          var5.append("' missing for element: ");
  554.          var5.append(var1.getNodeName());
  555.          throw new XSLException(var5.toString());
  556.       }
  557.    }
  558.  
  559.    private void requiresAttrs(Element var1, String[] var2, boolean var3) throws XSLException {
  560.       for(int var4 = 0; var4 < var2.length; ++var4) {
  561.          this.requiresAttr(var1, var2[var4], var3);
  562.       }
  563.  
  564.    }
  565. }
  566.