View Javadoc

1   /*
2    * Copyright 1999-2004 The Apache Software Foundation
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.apache.commons.jxpath.ri;
17  
18  import org.apache.commons.jxpath.Pointer;
19  import org.apache.commons.jxpath.ri.model.NodePointer;
20  import org.apache.commons.jxpath.ri.model.VariablePointer;
21  
22  /***
23   * Type conversions, XPath style.
24   *
25   * @author Dmitri Plotnikov
26   * @version $Revision: 1.11 $ $Date: 2004/07/16 22:49:33 $
27   */
28  public class InfoSetUtil {
29  
30      private static final Double ZERO = new Double(0);
31      private static final Double ONE = new Double(1);
32      private static final Double NOT_A_NUMBER = new Double(Double.NaN);
33  
34  
35      /***
36       * Converts the supplied object to String
37       */
38      public static String stringValue(Object object) {
39          if (object instanceof String) {
40              return (String) object;
41          }
42          else if (object instanceof Number) {
43              double d = ((Number) object).doubleValue();
44              long l = ((Number) object).longValue();
45              if (d == l) {
46                  return String.valueOf(l);
47              }
48              return String.valueOf(d);
49          }
50          else if (object instanceof Boolean) {
51              return ((Boolean) object).booleanValue() ? "true" : "false";
52          }
53          else if (object == null) {
54              return "";
55          }
56          else if (object instanceof NodePointer) {
57              return stringValue(((NodePointer) object).getValue());
58          }
59          else if (object instanceof EvalContext) {
60              EvalContext ctx = (EvalContext) object;
61              Pointer ptr = ctx.getSingleNodePointer();
62              if (ptr != null) {
63                  return stringValue(ptr);
64              }
65              return "";
66          }
67          return String.valueOf(object);
68      }
69  
70      /***
71       * Converts the supplied object to Number
72       */
73      public static Number number(Object object) {
74          if (object instanceof Number) {
75              return (Number) object;
76          }
77          else if (object instanceof Boolean) {
78              return ((Boolean) object).booleanValue() ? ONE : ZERO;
79          }
80          else if (object instanceof String) {
81              Double value;
82              try {
83                  value = new Double((String) object);
84              }
85              catch (NumberFormatException ex) {
86                  value = NOT_A_NUMBER;
87              }
88              return value;
89          }
90          else if (object instanceof EvalContext) {
91              EvalContext ctx = (EvalContext) object;
92              Pointer ptr = ctx.getSingleNodePointer();
93              if (ptr != null) {
94                  return number(ptr);
95              }
96              return NOT_A_NUMBER;
97          }
98          else if (object instanceof NodePointer) {
99              return number(((NodePointer) object).getValue());
100         }
101         return number(stringValue(object));
102     }
103 
104     /***
105      * Converts the supplied object to double
106      */
107     public static double doubleValue(Object object) {
108         if (object instanceof Number) {
109             return ((Number) object).doubleValue();
110         }
111         else if (object instanceof Boolean) {
112             return ((Boolean) object).booleanValue() ? 0.0 : 1.0;
113         }
114         else if (object instanceof String) {
115             if (object.equals("")) {
116                 return 0.0;
117             }
118 
119             double value;
120             try {
121                 value = Double.parseDouble((String) object);
122             }
123             catch (NumberFormatException ex) {
124                 value = Double.NaN;
125             }
126             return value;
127         }
128         else if (object instanceof NodePointer) {
129             return doubleValue(((NodePointer) object).getValue());
130         }
131         else if (object instanceof EvalContext) {
132             EvalContext ctx = (EvalContext) object;
133             Pointer ptr = ctx.getSingleNodePointer();
134             if (ptr != null) {
135                 return doubleValue(ptr);
136             }
137             return Double.NaN;
138         }
139         return doubleValue(stringValue(object));
140     }
141 
142     /***
143      * Converts the supplied object to boolean
144      */
145     public static boolean booleanValue(Object object) {
146         if (object instanceof Number) {
147             double value = ((Number) object).doubleValue();
148             return value != 0 && value != -0 && !Double.isNaN(value);
149         }
150         else if (object instanceof Boolean) {
151             return ((Boolean) object).booleanValue();
152         }
153         else if (object instanceof EvalContext) {
154             EvalContext ctx = (EvalContext) object;
155             Pointer ptr = ctx.getSingleNodePointer();
156             if (ptr == null) {
157                 return false;
158             }
159             return booleanValue(ptr);
160         }
161         else if (object instanceof String) {
162             return ((String) object).length() != 0;
163         }
164         else if (object instanceof NodePointer) {
165             NodePointer pointer = (NodePointer) object;
166             if (pointer instanceof VariablePointer) {
167                 return booleanValue(pointer.getNode());
168             }
169             pointer = pointer.getValuePointer();
170             return pointer.isActual();
171         }
172         else if (object == null) {
173             return false;
174         }
175         return true;
176     }
177 }