home *** CD-ROM | disk | FTP | other *** search
- package com.kav.xsl;
-
- import com.kav.xml.DOMReader;
- import com.kav.xml.Whitespace;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.PrintStream;
- import java.io.PrintWriter;
- import java.io.Writer;
- import java.util.Properties;
- import org.w3c.dom.Attr;
- import org.w3c.dom.CDATASection;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- import org.w3c.dom.ProcessingInstruction;
- import org.w3c.dom.Text;
-
- public class XSLReader {
- private PrintWriter errorWriter;
- private DOMReader domReader;
-
- public XSLReader() throws Exception {
- Properties var1 = new Properties();
-
- try {
- Object var2 = null;
- File var3 = new File("xslp.properties");
- if (var3.exists()) {
- var2 = new FileInputStream(var3);
- } else {
- var2 = this.getClass().getResourceAsStream("xslp.properties");
- }
-
- if (var2 != null) {
- var1.load((InputStream)var2);
- }
- } catch (IOException var4) {
- }
-
- String var6 = var1.getProperty("dom-package");
- if (var6 != null) {
- this.domReader = new DOMReader(var1.getProperty(var6));
- } else {
- this.domReader = new DOMReader();
- }
-
- this.errorWriter = new PrintWriter(System.out, true);
- }
-
- public XSLReader(DOMReader var1) {
- this.domReader = var1;
- this.errorWriter = new PrintWriter(System.out, true);
- }
-
- public XSLStylesheet readStylesheet(Document var1, String var2) throws XSLException {
- XSLStylesheet var3 = new XSLStylesheet();
- var3.setHref(var2);
- var3.setDocumentBase(XSLImport.getDocumentBase(var2));
- if (var1 == null) {
- return var3;
- } else {
- NodeList var4 = var1.getChildNodes();
-
- for(int var6 = 0; var6 < var4.getLength(); ++var6) {
- Node var5 = var4.item(var6);
- if (var5.getNodeType() == 7) {
- var3.addPI((ProcessingInstruction)var5);
- }
- }
-
- Element var7 = var1.getDocumentElement();
- if (var7 != null && var7.getNodeName().equals("xsl:stylesheet")) {
- ((XSLObject)var3).copyAttributes(var7);
- this.parseStylesheetElement(var7, var3);
- return var3;
- } else {
- throw new XSLException("Invalid stylesheet. Does not contain xsl:stylesheet as the document element.");
- }
- }
- }
-
- public XSLStylesheet readStylesheet(String var1) throws XSLException {
- Object var2 = null;
- XSLStylesheet var6;
- if (var1 != null) {
- Object var3 = null;
-
- try {
- var7 = XSLImport.getInputStream(var1, (String)null);
- } catch (Exception var5) {
- this.errorWriter.println(((Throwable)var5).getMessage());
- return new XSLStylesheet();
- }
-
- var6 = this.readStylesheet(var7, var1);
- } else {
- var6 = new XSLStylesheet();
- }
-
- return var6;
- }
-
- public XSLStylesheet readStylesheet(InputStream var1, String var2) throws XSLException {
- XSLStylesheet var3 = null;
- String var4 = var2;
- if (var1 != null) {
- if (var2 == null) {
- var4 = "XSL InputStream";
- }
-
- Document var5 = this.domReader.readDocument(var1, var4, false, this.errorWriter);
- var3 = this.readStylesheet(var5, var2);
- }
-
- return var3;
- }
-
- public XSLObject createXSLObject(XSLStylesheet var1, Element var2) throws XSLException {
- if (var2 == null) {
- throw new XSLException("null element encountered");
- } else {
- String var3 = var2.getTagName();
- if (var3 == null) {
- var3 = var2.getNodeName();
- }
-
- var3 = var3.intern();
- XSLObject var4 = null;
- boolean var5 = true;
- if (var3 == "xsl:apply-templates") {
- var4 = new Selection(var1, (short)1);
- } else if (var3 == "xsl:apply-imports") {
- var4 = new Selection(var1, (short)0);
- } else if (var3 == "xsl:arg") {
- var4 = new XSLArg(var1);
- } else if (var3 == "xsl:attribute") {
- var4 = new XSLObject(var1, (short)2);
- } else if (var3 == "xsl:attribute-set") {
- String var6 = var2.getAttribute("name");
- var4 = new AttributeSet(var1, var6);
- var5 = false;
- } else if (var3 == "xsl:choose") {
- var4 = new Selection(var1, (short)4);
- } else if (var3 == "xsl:comment") {
- var4 = new XSLObject(var1, (short)5);
- } else {
- if (var3 == "xsl:constant") {
- String var10 = var2.getAttribute("name");
- String var7 = var2.getAttribute("value");
- var4 = new Constant(var1, var10, var7);
- return var4;
- }
-
- if (var3 == "xsl:contents") {
- var4 = new EmptyXSLObject(var1, (short)7);
- } else if (var3 == "xsl:copy") {
- var4 = new XSLObject(var1, (short)8);
- } else if (var3 == "xsl:counter") {
- var4 = new XSLObject(var1, (short)9);
- } else if (var3 == "xsl:counters") {
- var4 = new XSLObject(var1, (short)10);
- } else if (var3 == "xsl:counter-increment") {
- var4 = new XSLObject(var1, (short)11);
- } else if (var3 == "xsl:counter-reset") {
- var4 = new XSLObject(var1, (short)12);
- } else if (var3 == "xsl:counter-scope") {
- var4 = new XSLObject(var1, (short)13);
- } else if (var3 == "xsl:element") {
- var4 = new XSLObject(var1, (short)14);
- } else if (var3 == "xsl:for-each") {
- var4 = new Selection(var1, (short)20);
- } else if (var3 == "xsl:id") {
- var4 = new Id(var1);
- } else if (var3 == "xsl:if") {
- var4 = new Selection(var1, (short)16);
- } else if (var3 == "xsl:import") {
- var4 = new XSLImport(var1);
- } else if (var3 == "xsl:include") {
- var4 = new EmptyXSLObject(var1, (short)18);
- } else if (var3 == "xsl:invoke") {
- var4 = new Invoke(var1);
- } else if (var3 == "xsl:macro") {
- var4 = new Macro(var1);
- } else if (var3 == "xsl:macro-arg") {
- var4 = new MacroArg(var1);
- } else if (var3 == "xsl:number") {
- var4 = new XSLNumber(var1);
- } else if (var3 == "xsl:otherwise") {
- var4 = new Selection(var1, (short)25);
- } else if (var3 == "xsl:pi") {
- var4 = new XSLObject(var1, (short)26);
- } else if (var3 == "xsl:preserve-space") {
- var4 = new EmptyXSLObject(var1, (short)27);
- } else if (var3 == "xsl:sort") {
- var4 = new XSLSort(var1);
- } else if (var3 == "xsl:strip-space") {
- var4 = new EmptyXSLObject(var1, (short)29);
- } else if (var3 != "xsl:stylesheet") {
- if (var3 == "xsl:template") {
- var4 = new TemplateRule(var1);
- } else if (var3 == "xsl:text") {
- var4 = new XSLText(var1, "");
- } else if (var3 == "xsl:use") {
- var4 = new XSLUse(var1);
- } else if (var3 == "xsl:value-of") {
- var4 = new ValueOf(var1);
- } else if (var3 == "xsl:when") {
- var4 = new Selection(var1, (short)35);
- } else if (var3 == "xsl:entity-ref") {
- var4 = new XSLObject(var1, (short)38);
- } else {
- if (var3 == "xsl:script") {
- return new XSLScript(var1, XSLObject.getText(var2));
- }
-
- var4 = new XSLObject(var1, (short)21);
- var4.setTypeName(var3);
- }
- }
- }
-
- if (var5) {
- var4.copyAttributes(var2);
- }
-
- this.handleXSLObject(var1, var2, var4);
- return var4;
- }
- }
-
- public void setErrorStream(Writer var1) {
- this.errorWriter = new PrintWriter(var1, true);
- }
-
- public void setErrorStream(PrintStream var1) {
- this.errorWriter = new PrintWriter(var1, true);
- }
-
- private void importStylesheet(Document var1, XSLStylesheet var2, String var3) throws XSLException {
- XSLStylesheet var4 = this.readStylesheet(var1, var3);
- var2.importFrom(var4);
- }
-
- private void importStylesheet(String var1, XSLStylesheet var2) throws XSLException {
- if (var2 != null) {
- Object var3 = null;
- var1 = XSLImport.resolveHref(var1, var2.getDocumentBase());
- if (!var2.isAllowableImport(var1)) {
- this.errorWriter.println("error including stylesheet: '" + var1 + "'.");
- this.errorWriter.println(" - Stylesheet already directly or indirectly included.");
- this.errorWriter.println(" - continuing processing without the include.");
- } else {
- try {
- var7 = XSLImport.getInputStream(var1, (String)null);
- } catch (Exception var5) {
- this.errorWriter.println("error importing stylesheet: '" + var1 + "'.");
- this.errorWriter.println(" - " + ((Throwable)var5).getMessage());
- this.errorWriter.println(" - continuing processing without the import.");
- return;
- }
-
- XSLStylesheet var4 = this.readStylesheet(var7, var1);
- var2.importWithoutVerify(var4);
- }
- }
- }
-
- private void include(String var1, XSLObject var2, XSLStylesheet var3) throws XSLException {
- if (var3 != null) {
- if (var1 != null) {
- var1 = XSLImport.resolveHref(var1, var3.getDocumentBase());
- Object var4 = null;
-
- try {
- var9 = XSLImport.getInputStream(var1, (String)null);
- } catch (Exception var7) {
- this.errorWriter.println("error including stylesheet: '" + var1 + "'.");
- this.errorWriter.println(" - " + ((Throwable)var7).getMessage());
- this.errorWriter.println(" - continuing processing without the include.");
- return;
- }
-
- Document var5 = this.domReader.readDocument(var9, var1, false, this.errorWriter);
- Element var6 = var5.getDocumentElement();
- if (var6 != null && var6.getNodeName().equals("xsl:stylesheet")) {
- if (var2 == var3) {
- this.parseStylesheetElement(var6, var3);
- } else {
- this.parseElement(var3, var6, var2);
- }
- } else {
- throw new XSLException("Invalid stylesheet. Does not contain xsl:stylesheet as the document element.");
- }
- }
- }
- }
-
- private void parseStylesheetElement(Element var1, XSLStylesheet var2) throws XSLException {
- NodeList var3 = var1.getChildNodes();
-
- for(int var4 = 0; var4 < var3.getLength(); ++var4) {
- Node var5 = var3.item(var4);
- if (var5.getNodeType() == 1) {
- Element var6 = (Element)var5;
- var6.getNodeName();
- XSLObject var7 = this.createXSLObject(var2, var6);
- switch (var7.getType()) {
- case 3:
- var2.addAttributeSet((AttributeSet)var7);
- break;
- case 6:
- var2.addConstant((Constant)var7);
- break;
- case 15:
- var2.addId((Id)var7);
- break;
- case 17:
- XSLImport var8 = (XSLImport)var7;
-
- try {
- this.importStylesheet(var8.getHref(), var2);
- } catch (XSLException var13) {
- this.errorWriter.println(var13.getMessage());
- this.errorWriter.println(" -- processing without import");
- }
- break;
- case 18:
- String var9 = var6.getAttribute("href");
-
- try {
- this.include(var9, var2, var2);
- } catch (XSLException var12) {
- this.errorWriter.println(var12);
- this.errorWriter.println(" -- processing without include");
- }
- break;
- case 22:
- try {
- var2.addMacro((Macro)var7);
- } catch (XSLException var11) {
- this.errorWriter.println(var11.getMessage());
- }
- break;
- case 27:
- case 29:
- var2.appendAction(var7);
- break;
- case 31:
- var2.addRule((TemplateRule)var7);
- break;
- case 39:
- var2.addScript((XSLScript)var7);
- }
- }
- }
-
- }
-
- private void parseElement(XSLStylesheet var1, Element var2, XSLObject var3) throws XSLException {
- NodeList var5 = var2.getChildNodes();
-
- for(int var6 = 0; var6 < var5.getLength(); ++var6) {
- Node var7 = var5.item(var6);
- switch (var7.getNodeType()) {
- case 1:
- XSLObject var8 = this.createXSLObject(var1, (Element)var7);
- if (var8.getType() == 18) {
- String var13 = var8.getAttribute("href");
-
- try {
- this.include(var13, var3, var1);
- } catch (XSLException var11) {
- this.errorWriter.println(var11);
- this.errorWriter.println(" -- processing without include");
- }
- } else if (!var3.appendAction(var8)) {
- this.errorWriter.print("warning: element '");
- this.errorWriter.print(var7.getNodeName());
- this.errorWriter.print("' is an invalid child of '");
- this.errorWriter.print(var3.getTypeName());
- this.errorWriter.println("'.");
- this.errorWriter.println("The invalid element will be ignored.");
- }
- case 2:
- default:
- break;
- case 3:
- String var12 = ((Text)var7).getData();
- if (var3.getType() != 32) {
- boolean var9 = var7.getPreviousSibling() == null;
- boolean var10 = var7.getNextSibling() == null;
- var12 = Whitespace.stripSpace(var12, var9, var10);
- }
-
- if (var12.length() > 0) {
- var3.appendAction(new XSLText(var1, var12));
- }
- break;
- case 4:
- String var4 = ((CDATASection)var7).getData();
- var3.appendAction(new XSLCData(var1, var4));
- }
- }
-
- }
-
- private void handleXSLObject(XSLStylesheet var1, Element var2, XSLObject var3) throws XSLException {
- Object var4 = null;
- switch (var3.getType()) {
- case 1:
- case 4:
- case 16:
- case 20:
- case 25:
- case 35:
- this.parseSelection(var1, var2, (Selection)var3);
- return;
- case 2:
- case 3:
- case 14:
- case 22:
- case 26:
- this.parseElement(var1, var2, var3);
- this.requiresAttr(var2, "name", false);
- return;
- case 5:
- case 8:
- case 13:
- case 21:
- case 39:
- this.parseElement(var1, var2, var3);
- return;
- case 6:
- case 7:
- case 23:
- case 24:
- case 28:
- case 30:
- case 37:
- default:
- return;
- case 9:
- case 10:
- case 11:
- case 12:
- case 38:
- this.requiresAttr(var2, "name", false);
- return;
- case 15:
- this.requiresAttr(var2, "attribute", false);
- return;
- case 17:
- case 18:
- this.requiresAttr(var2, "href", false);
- return;
- case 19:
- this.requiresAttr(var2, "macro", false);
- this.parseElement(var1, var2, var3);
- return;
- case 27:
- case 29:
- this.requiresAttr(var2, "element", false);
- return;
- case 31:
- this.requiresAttr(var2, "match", false);
- String var5 = var3.getAttribute("match");
-
- try {
- ((TemplateRule)var3).setMatchExpr(var5);
- } catch (InvalidExprException var7) {
- StringBuffer var8 = new StringBuffer("the match expression \"");
- var8.append(var5);
- var8.append("' is not valid\n --");
- var8.append(((Throwable)var7).getMessage());
- throw new XSLException(var8.toString());
- }
-
- this.parseElement(var1, var2, var3);
- return;
- case 32:
- ((XSLText)var3).appendData(XSLObject.getText(var2));
- return;
- case 33:
- this.requiresAttr(var2, "attribute-set", false);
- return;
- case 34:
- this.requiresAttr(var2, "select", false);
- return;
- case 36:
- ((XSLCData)var3).appendData(XSLObject.getText(var2));
- }
- }
-
- private void parseSelection(XSLStylesheet var1, Element var2, Selection var3) throws XSLException {
- this.parseElement(var1, var2, var3);
- String var4 = null;
- Object var5 = null;
- short var6 = ((XSLObject)var3).getType();
- switch (var6) {
- case 1:
- Attr var12 = var2.getAttributeNode("select");
- if (var12 == null) {
- return;
- }
-
- var4 = var12.getValue();
- break;
- case 4:
- return;
- case 16:
- Attr var11 = var2.getAttributeNode("test");
- if (var11 != null) {
- var4 = var11.getValue();
- }
- break;
- case 20:
- Attr var10 = var2.getAttributeNode("select");
- if (var10 != null) {
- var4 = var10.getValue();
- }
- break;
- case 25:
- var4 = ".";
- break;
- case 35:
- Attr var9 = var2.getAttributeNode("test");
- if (var9 != null) {
- var4 = var9.getValue();
- }
- break;
- default:
- return;
- }
-
- try {
- var3.setSelectExpr(ExpressionParser.createSelectExpr(var4));
- } catch (InvalidExprException var8) {
- this.errorWriter.print("error in SelectExpr for element ");
- this.errorWriter.println(var2.getNodeName());
- this.errorWriter.println(" -- " + ((Throwable)var8).getMessage());
- }
- }
-
- private void requiresAttr(Element var1, String var2, boolean var3) throws XSLException {
- Attr var4 = var1.getAttributeNode(var2);
- if (var4 == null || var4.getValue().length() == 0 && !var3) {
- StringBuffer var5 = new StringBuffer("Required attribute '");
- var5.append(var2);
- var5.append("' missing for element: ");
- var5.append(var1.getNodeName());
- throw new XSLException(var5.toString());
- }
- }
-
- private void requiresAttrs(Element var1, String[] var2, boolean var3) throws XSLException {
- for(int var4 = 0; var4 < var2.length; ++var4) {
- this.requiresAttr(var1, var2[var4], var3);
- }
-
- }
- }
-