1 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 name) 21 { 22 super(name); 23 } 24 25 public static boolean booleanValue(Object value) 26 { 27 if (value instanceof Boolean ) 28 return ((Boolean ) value).booleanValue(); 29 if (value instanceof Number 30 && (value instanceof RealNum || ! (value instanceof Numeric))) 31 { 32 double d = ((Number ) value).doubleValue(); 33 return d != 0 && ! Double.isNaN(d); 34 } 35 if (value instanceof SeqPosition) 36 return true; 37 if (value instanceof String 38 39 || value instanceof java.net.URI 40 41 || value instanceof UntypedAtomic) 42 return value.toString().length() > 0; 43 if (value instanceof Values) 44 { 45 Values values = (Values) value; 46 Object 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 value) 59 { 60 return ! booleanValue(value); 61 } 62 63 public Object apply1(Object 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 value = ((QuoteExp) arg).getValue(); 82 try 83 { 84 return booleanValue(value) ? XQuery.trueExp : XQuery.falseExp; 85 } 86 catch (Throwable ex) 87 { 88 String 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 |