1 /*
2  * reserved comment block
3  * DO NOT REMOVE OR ALTER!
4  */
5 /*
6  * Licensed to the Apache Software Foundation (ASF) under one or more
7  * contributor license agreements.  See the NOTICE file distributed with
8  * this work for additional information regarding copyright ownership.
9  * The ASF licenses this file to You under the Apache License, Version 2.0
10  * (the "License"); you may not use this file except in compliance with
11  * the License.  You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21 
22 package com.sun.org.apache.xalan.internal.xsltc.dom;
23 
24 import com.sun.org.apache.xalan.internal.xsltc.DOM;
25 import com.sun.org.apache.xalan.internal.xsltc.Translet;
26 import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
27 
28 /**
29  * @author Jacek Ambroziak
30  * @author Santiago Pericas-Geertsen
31  */
32 public abstract class AnyNodeCounter extends NodeCounter {
AnyNodeCounter(Translet translet, DOM document, DTMAxisIterator iterator)33     public AnyNodeCounter(Translet translet,
34                           DOM document, DTMAxisIterator iterator) {
35         super(translet, document, iterator);
36     }
37 
AnyNodeCounter(Translet translet, DOM document, DTMAxisIterator iterator, boolean hasFrom)38     public AnyNodeCounter(Translet translet,
39                           DOM document,
40                           DTMAxisIterator iterator,
41                           boolean hasFrom) {
42         super(translet, document, iterator, hasFrom);
43     }
44 
setStartNode(int node)45     public NodeCounter setStartNode(int node) {
46         _node = node;
47         _nodeType = _document.getExpandedTypeID(node);
48         return this;
49     }
50 
getCounter()51     public String getCounter() {
52         int result;
53         if (_value != Integer.MIN_VALUE) {
54             //See Errata E24
55             if (_value == 0) return "0";
56             else if (Double.isNaN(_value)) return "NaN";
57             else if (_value < 0 && Double.isInfinite(_value)) return "-Infinity";
58             else if (Double.isInfinite(_value)) return "Infinity";
59             else return formatNumbers((int)_value);
60         }
61         else {
62             int next = _node;
63             final int root = _document.getDocument();
64             result = 0;
65             while (next >= root && !matchesFrom(next)) {
66                 if (matchesCount(next)) {
67                     ++result;
68                 }
69                 next--;
70 //%HZ%:  Is this the best way of finding the root?  Is it better to check
71 //%HZ%:  parent(next)?
72                 /*
73                 if (next == root) {
74                     break;
75                 }
76                 else {
77                     --next;
78                 }
79                 */
80             }
81         }
82         return formatNumbers(result);
83     }
84 
getDefaultNodeCounter(Translet translet, DOM document, DTMAxisIterator iterator)85     public static NodeCounter getDefaultNodeCounter(Translet translet,
86                                                     DOM document,
87                                                     DTMAxisIterator iterator) {
88         return new DefaultAnyNodeCounter(translet, document, iterator);
89     }
90 
91     static class DefaultAnyNodeCounter extends AnyNodeCounter {
DefaultAnyNodeCounter(Translet translet, DOM document, DTMAxisIterator iterator)92         public DefaultAnyNodeCounter(Translet translet,
93                                      DOM document, DTMAxisIterator iterator) {
94             super(translet, document, iterator);
95         }
96 
getCounter()97         public String getCounter() {
98             int result;
99             if (_value != Integer.MIN_VALUE) {
100                     //See Errata E24
101                     if (_value == 0) return "0";
102                     else if (Double.isNaN(_value)) return "NaN";
103                     else if (_value < 0 && Double.isInfinite(_value)) return "-Infinity";
104                     else if (Double.isInfinite(_value)) return "Infinity";
105                     else result = (int) _value;
106             }
107             else {
108                 int next = _node;
109                 result = 0;
110                 final int ntype = _document.getExpandedTypeID(_node);
111                 final int root = _document.getDocument();
112                 while (next >= 0) {
113                     if (ntype == _document.getExpandedTypeID(next)) {
114                         result++;
115                     }
116 //%HZ%:  Is this the best way of finding the root?  Is it better to check
117 //%HZ%:  parent(next)?
118                     if (next == root) {
119                         break;
120                     }
121                     else {
122                         --next;
123                     }
124                 }
125             }
126             return formatNumbers(result);
127         }
128     }
129 }
130