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

  1. package com.kav.xsl;
  2.  
  3. import com.kav.util.List;
  4. import java.util.Hashtable;
  5. import org.mitre.tjt.xsl.XslNumberFormat;
  6. import org.w3c.dom.Element;
  7. import org.w3c.dom.Node;
  8.  
  9. public class XSLNumber extends XSLObject {
  10.    public static final int SINGLE_LEVEL = 0;
  11.    public static final int MULTI_LEVEL = 1;
  12.    public static final int ANY_LEVEL = 2;
  13.    private MatchExpr countExpr;
  14.    private MatchExpr fromExpr;
  15.    private int level = 0;
  16.  
  17.    public XSLNumber(XSLStylesheet var1) {
  18.       super(var1, (short)24);
  19.    }
  20.  
  21.    public static int countSiblings(Element var0, boolean var1) {
  22.       int var2 = 0;
  23.       String var3 = var0.getNodeName();
  24.       Object var5 = var0;
  25.       if (var1) {
  26.          while((var5 = ((Node)var5).getPreviousSibling()) != null) {
  27.             if (((Node)var5).getNodeType() == 1) {
  28.                String var7 = ((Element)var5).getNodeName();
  29.                if (var3.equals(var7)) {
  30.                   ++var2;
  31.                }
  32.             }
  33.          }
  34.       } else {
  35.          while((var5 = ((Node)var5).getNextSibling()) != null) {
  36.             if (((Node)var5).getNodeType() == 1) {
  37.                String var4 = ((Element)var5).getNodeName();
  38.                if (var3.equals(var4)) {
  39.                   ++var2;
  40.                }
  41.             }
  42.          }
  43.       }
  44.  
  45.       ++var2;
  46.       return var2;
  47.    }
  48.  
  49.    public int[] doNumbering(Element var1) {
  50.       Object var2 = null;
  51.       int var5 = 0;
  52.       int[] var7;
  53.       switch (this.level) {
  54.          case 1:
  55.             List var10 = this.getAncestors(var1);
  56.             var7 = new int[var10.size()];
  57.             var5 = 0;
  58.  
  59.             for(int var13 = var10.size() - 1; var13 >= 0; --var13) {
  60.                Element var8 = (Element)var10.get(var13);
  61.                var7[var5++] = countSiblings(var8, true);
  62.             }
  63.             break;
  64.          case 2:
  65.             List var4 = this.getAnyPreviousNodes(var1);
  66.             var7 = new int[var4.size()];
  67.             var5 = 0;
  68.  
  69.             for(int var6 = var4.size() - 1; var6 >= 0; --var6) {
  70.                Element var3 = (Element)var4.get(var6);
  71.                var7[var5++] = countSiblings(var3, true);
  72.             }
  73.             break;
  74.          default:
  75.             var7 = new int[1];
  76.             Element var9 = this.getNearestAncestor(var1);
  77.             if (var9 != null) {
  78.                var7[0] = countSiblings(var9, true);
  79.             }
  80.       }
  81.  
  82.       return var7;
  83.    }
  84.  
  85.    public String getFormattedNumber(Element var1) {
  86.       int[] var2 = this.doNumbering(var1);
  87.       return XslNumberFormat.format(var2, this.getFormat());
  88.    }
  89.  
  90.    public MatchExpr getCountExpr() {
  91.       return this.countExpr;
  92.    }
  93.  
  94.    public String getFormat() {
  95.       return ((XSLObject)this).getAttribute("format");
  96.    }
  97.  
  98.    public MatchExpr getFromExpr() {
  99.       return this.fromExpr;
  100.    }
  101.  
  102.    public String getLevel() {
  103.       return ((XSLObject)this).getAttribute("level");
  104.    }
  105.  
  106.    public boolean hasCountExpr() {
  107.       return this.countExpr != null;
  108.    }
  109.  
  110.    public void setAttribute(String var1, String var2) throws XSLException {
  111.       if ("count".equals(var1)) {
  112.          if (var2 == null) {
  113.             this.countExpr = null;
  114.          } else {
  115.             try {
  116.                this.countExpr = ExpressionParser.createMatchExpr(var2);
  117.             } catch (InvalidExprException var5) {
  118.                throw new XSLException("invalid 'count' attribute of xsl:number - " + ((Throwable)var5).getMessage());
  119.             }
  120.          }
  121.       } else if ("from".equals(var1)) {
  122.          if (var2 == null) {
  123.             this.fromExpr = null;
  124.          } else {
  125.             try {
  126.                this.fromExpr = ExpressionParser.createMatchExpr(var2);
  127.             } catch (InvalidExprException var4) {
  128.                throw new XSLException("invalid 'from' attribute of xsl:number - " + ((Throwable)var4).getMessage());
  129.             }
  130.          }
  131.       } else if ("level".equals(var1)) {
  132.          if ("multi".equals(var2)) {
  133.             this.level = 1;
  134.          } else if (var2.equals("any")) {
  135.             this.level = 2;
  136.          } else {
  137.             this.level = 0;
  138.             var2 = "single";
  139.          }
  140.       }
  141.  
  142.       super.setAttribute(var1, var2);
  143.    }
  144.  
  145.    public void setCountExpr(MatchExpr var1) {
  146.       this.countExpr = var1;
  147.       if (var1 != null) {
  148.          try {
  149.             super.setAttribute("count", var1.toString());
  150.          } catch (XSLException var2) {
  151.          }
  152.       }
  153.    }
  154.  
  155.    public void setFormat(String var1) {
  156.       try {
  157.          this.setAttribute("format", var1);
  158.       } catch (XSLException var2) {
  159.       }
  160.    }
  161.  
  162.    public void setFromExpr(MatchExpr var1) {
  163.       this.fromExpr = var1;
  164.       if (var1 != null) {
  165.          try {
  166.             super.setAttribute("from", var1.toString());
  167.          } catch (XSLException var2) {
  168.          }
  169.       }
  170.    }
  171.  
  172.    public void setLevel(String var1) {
  173.       try {
  174.          this.setAttribute("level", var1);
  175.       } catch (XSLException var2) {
  176.       }
  177.    }
  178.  
  179.    protected List getAncestors(Element var1) {
  180.       List var2 = new List();
  181.  
  182.       for(Object var3 = var1; var3 != null && ((Node)var3).getNodeType() == 1 && (this.fromExpr == null || !this.fromExpr.matches((Element)var3, (Hashtable)null)); var3 = ((Node)var3).getParentNode()) {
  183.          if (this.matches((Element)var3, var1)) {
  184.             var2.add(var3);
  185.          }
  186.       }
  187.  
  188.       return var2;
  189.    }
  190.  
  191.    protected List getAnyPreviousNodes(Element var1) {
  192.       List var2 = new List();
  193.  
  194.       for(Object var3 = var1; var3 != null && ((Node)var3).getNodeType() == 1; var3 = ((Node)var3).getParentNode()) {
  195.          if (this.fromExpr != null && this.fromExpr.matches((Element)var3, (Hashtable)null)) {
  196.             return var2;
  197.          }
  198.  
  199.          if (this.matches((Element)var3, var1)) {
  200.             var2.add(var3);
  201.          }
  202.  
  203.          Object var4 = var3;
  204.  
  205.          while((var4 = ((Node)var4).getPreviousSibling()) != null) {
  206.             if (((Node)var4).getNodeType() == 1) {
  207.                if (this.fromExpr != null && this.fromExpr.matches((Element)var4, (Hashtable)null)) {
  208.                   return var2;
  209.                }
  210.  
  211.                if (this.matches((Element)var4, var1)) {
  212.                   var2.add(var4);
  213.                }
  214.             }
  215.          }
  216.       }
  217.  
  218.       return var2;
  219.    }
  220.  
  221.    protected Element getNearestAncestor(Element var1) {
  222.       for(Object var2 = var1; var2 != null && ((Node)var2).getNodeType() == 1 && (this.fromExpr == null || !this.fromExpr.matches((Element)var2, (Hashtable)null)); var2 = ((Node)var2).getParentNode()) {
  223.          if (this.matches((Element)var2, var1)) {
  224.             return (Element)var2;
  225.          }
  226.       }
  227.  
  228.       return null;
  229.    }
  230.  
  231.    private boolean matches(Element var1, Element var2) {
  232.       String var3 = var1.getNodeName();
  233.       return this.countExpr != null ? this.countExpr.matches(var1, (Hashtable)null) : var3.equals(var2.getNodeName());
  234.    }
  235. }
  236.