1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 package org.jaxen.function;
64
65 import org.jaxen.Context;
66 import org.jaxen.Function;
67 import org.jaxen.FunctionCallException;
68 import org.jaxen.Navigator;
69 import org.jaxen.UnsupportedAxisException;
70 import org.jaxen.JaxenRuntimeException;
71
72 import java.util.List;
73 import java.util.Iterator;
74
75 /***
76 * <p><b>4.2</b> <code><i>string</i> string(<i>object</i>)</code>
77 *
78 * @author bob mcwhirter (bob @ werken.com)
79 */
80 public class StringFunction implements Function
81 {
82
83 public Object call(Context context,
84 List args) throws FunctionCallException
85 {
86 int size = args.size();
87
88 if ( size == 0 )
89 {
90 return evaluate( context.getNodeSet(),
91 context.getNavigator() );
92 }
93 else if ( size == 1 )
94 {
95 return evaluate( args.get(0),
96 context.getNavigator() );
97 }
98
99 throw new FunctionCallException( "string() requires one argument." );
100 }
101
102 public static String evaluate(Object obj,
103 Navigator nav)
104 {
105 try
106 {
107 if (obj == null) {
108 return "";
109 }
110
111
112
113 if (nav != null && nav.isText(obj))
114 {
115 return nav.getTextStringValue(obj);
116 }
117
118 if (obj instanceof List)
119 {
120 List list = (List) obj;
121 if (list.isEmpty())
122 {
123 return "";
124 }
125
126 obj = list.get(0);
127 }
128
129 if (nav != null && (nav.isElement(obj) || nav.isDocument(obj)))
130 {
131 Iterator descendantAxisIterator = nav.getDescendantAxisIterator(obj);
132 StringBuffer sb = new StringBuffer();
133 while (descendantAxisIterator.hasNext())
134 {
135 Object descendant = descendantAxisIterator.next();
136 if (nav.isText(descendant))
137 {
138 sb.append(nav.getTextStringValue(descendant));
139 }
140 }
141 return sb.toString();
142 }
143 else if (nav != null && nav.isAttribute(obj))
144 {
145 return nav.getAttributeStringValue(obj);
146 }
147 else if (nav != null && nav.isText(obj))
148 {
149 return nav.getTextStringValue(obj);
150 }
151 else if (nav != null && nav.isProcessingInstruction(obj))
152 {
153 return nav.getProcessingInstructionData(obj);
154 }
155 else if (nav != null && nav.isComment(obj))
156 {
157 return nav.getCommentStringValue(obj);
158 }
159 else if (nav != null && nav.isNamespace(obj))
160 {
161 return nav.getNamespaceStringValue(obj);
162 }
163 else if (obj instanceof String)
164 {
165 return (String) obj;
166 }
167 else if (obj instanceof Boolean)
168 {
169 return stringValue(((Boolean) obj).booleanValue());
170 }
171 else if (obj instanceof Number)
172 {
173 return stringValue(((Number) obj).doubleValue());
174 }
175 return "";
176 }
177 catch (UnsupportedAxisException e)
178 {
179 throw new JaxenRuntimeException(e);
180 }
181
182 }
183
184 public static String stringValue(double value)
185 {
186 if (Double.isNaN(value))
187 {
188 return "NaN";
189 }
190 if (-0.0 == value || 0.0 == value)
191 {
192 return "0";
193 }
194 if (Double.isInfinite(value) && value < 0)
195 {
196 return "-Infinity";
197 }
198 if (Double.isInfinite(value) && value > 0)
199 {
200 return "Infinity";
201 }
202 if (((long) value) == value)
203 {
204 return Long.toString((long) value);
205 }
206 return Double.toString(value);
207 }
208
209 public static String stringValue(boolean bool)
210 {
211 return bool ? "true" : "false";
212 }
213
214 }