KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > xquery > util > BooleanValue


1 // Copyright (c) 2002, 2003, 2006 Per M.A. Bothner.
2
// This is free software; for terms and warranty disclaimer see ./COPYING.
3

4 package gnu.xquery.util;
5 import gnu.mapping.*;
6 import gnu.lists.*;
7 import gnu.math.Numeric;
8 import gnu.math.RealNum;
9 import gnu.kawa.xml.UntypedAtomic;
10 import gnu.expr.*;
11 import gnu.bytecode.Type;
12 import gnu.kawa.xml.XDataType;
13 import gnu.xquery.lang.XQuery;
14
15 public class BooleanValue extends Procedure1 implements CanInline
16 {
17   public static final BooleanValue booleanValue =
18     new BooleanValue("boolean-value");
19
20   public BooleanValue (String JavaDoc name)
21   {
22     super(name);
23   }
24
25   public static boolean booleanValue(Object JavaDoc value)
26   {
27     if (value instanceof Boolean JavaDoc)
28       return ((Boolean JavaDoc) value).booleanValue();
29     if (value instanceof Number JavaDoc
30         && (value instanceof RealNum || ! (value instanceof Numeric)))
31       {
32         double d = ((Number JavaDoc) value).doubleValue();
33         return d != 0 && ! Double.isNaN(d);
34       }
35     if (value instanceof SeqPosition)
36       return true;
37     if (value instanceof String JavaDoc
38         /* #ifdef use:java.net.URI */
39         || value instanceof java.net.URI JavaDoc
40         /* #endif */
41         || value instanceof UntypedAtomic)
42       return value.toString().length() > 0;
43     if (value instanceof Values)
44       {
45     Values values = (Values) value;
46     Object JavaDoc value1 = values.getPosNext(0);
47     if (value1 == Sequence.eofValue)
48       return false;
49     int next = values.nextDataIndex(0);
50     if (next < 0)
51       return booleanValue(value1);
52         if (value1 instanceof SeqPosition)
53           return true;
54       }
55     throw new WrongType("fn:boolean", 1, value, "boolean-convertible-value");
56   }
57
58   public static boolean not(Object JavaDoc value)
59   {
60     return ! booleanValue(value);
61   }
62
63   public Object JavaDoc apply1(Object JavaDoc arg)
64   {
65     return booleanValue(arg) ? Boolean.TRUE : Boolean.FALSE;
66   }
67
68   public Expression inline (ApplyExp exp, ExpWalker walker)
69   {
70     Expression[] args = exp.getArgs();
71     if (args.length == 1)
72       {
73         Expression arg = args[0];
74         Type type = arg.getType();
75         if (type == XDataType.booleanType)
76           return arg;
77         if (type == null)
78           exp.setType(XDataType.booleanType);
79         if (arg instanceof QuoteExp)
80           {
81             Object JavaDoc value = ((QuoteExp) arg).getValue();
82             try
83               {
84                 return booleanValue(value) ? XQuery.trueExp : XQuery.falseExp;
85               }
86             catch (Throwable JavaDoc ex)
87               {
88                 String JavaDoc message = "cannot convert to a boolean";
89                 walker.getMessages().error('e', message);
90                 return new ErrorExp(message);
91               }
92           }
93       }
94     return exp;
95   }
96 }
97
Popular Tags