/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.quercus.env;
import com.caucho.quercus.marshal.Marshal;
import com.caucho.vfs.WriteStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.IdentityHashMap;
/**
* Represents a PHP boolean value.
*/
@SuppressWarnings("serial")
public class BooleanValue extends Value
implements Serializable
{
public static final BooleanValue TRUE = new BooleanValue(true);
public static final BooleanValue FALSE = new BooleanValue(false);
private final boolean _value;
private BooleanValue(boolean value)
{
_value = value;
}
public static BooleanValue create(boolean value)
{
return value ? TRUE : FALSE;
}
public static Value create(Boolean value)
{
if (value == null) {
// php/3c23
return NullValue.NULL;
}
else if (Boolean.TRUE.equals(value))
return TRUE;
else
return FALSE;
}
/**
* Returns the type.
*/
@Override
public String getType()
{
return "boolean";
}
/**
* Returns the ValueType.
*/
@Override
public ValueType getValueType()
{
return ValueType.BOOLEAN;
}
/**
* Returns true for a BooleanValue
*/
@Override
public boolean isBoolean()
{
return true;
}
/**
* Returns true for a scalar
*/
public boolean isScalar()
{
return true;
}
/**
* Converts to a boolean.
*/
@Override
public final boolean toBoolean()
{
return this == TRUE;
}
/**
* Returns true if the value is empty
*/
@Override
public boolean isEmpty()
{
return ! _value;
}
//
// marshal costs
//
/**
* Cost to convert to a boolean
*/
@Override
public int toBooleanMarshalCost()
{
return Marshal.COST_EQUAL;
}
//
// conversions
//
/**
* Converts to a long.
*/
@Override
public long toLong()
{
return _value ? 1 : 0;
}
/**
* Converts to a double.
*/
@Override
public double toDouble()
{
return _value ? 1 : 0;
}
/**
* Converts to a string.
*/
@Override
public String toString()
{
return _value ? "1" : "";
}
/**
* Converts to a string builder
*/
@Override
public StringValue toStringBuilder(Env env)
{
StringValue sb = env.createUnicodeBuilder();
if (_value)
sb.append("1");
return sb;
}
/**
* Converts to an object.
*/
public Object toObject()
{
return _value ? Boolean.TRUE : Boolean.FALSE;
}
/**
* Converts to a java object.
*/
@Override
public Object toJavaObject()
{
return _value ? Boolean.TRUE : Boolean.FALSE;
}
/**
* Converts to an array if null.
*/
@Override
public Value toAutoArray()
{
if (! _value)
return new ArrayValueImpl();
else
return super.toAutoArray();
}
/**
* Converts to an object if null.
*/
@Override
public Value toAutoObject(Env env)
{
if (! _value)
return env.createObject();
else
return super.toAutoObject(env);
}
/**
* Sets the array value, returning the new array, e.g. to handle
* string update ($a[0] = 'A'). Creates an array automatically if
* necessary.
*/
@Override
public Value append(Value index, Value value)
{
if (_value)
return super.append(index, value);
else
return new ArrayValueImpl().append(index, value);
}
/**
* Converts to a key.
*/
@Override
public Value toKey()
{
return _value ? LongValue.ONE : LongValue.ZERO;
}
/**
* Returns true for equality
*/
@Override
public boolean eq(Value rValue)
{
return _value == rValue.toBoolean();
}
/**
* Returns true for equality
*/
@Override
public int cmp(Value rValue)
{
boolean rBool = rValue.toBoolean();
if (! _value && rBool)
return -1;
if (_value && ! rBool)
return 1;
return 0;
}
/**
* Return the length as a string.
*/
@Override
public int length()
{
return _value ? 1 : 0;
}
/**
* Prints the value.
* @param env
*/
@Override
public void print(Env env)
{
env.print(_value ? "1" : "");
}
//
// Java generator code
//
/**
* Generates code to recreate the expression.
*
* @param out the writer to the Java source code.
*/
@Override
public void generate(PrintWriter out)
throws IOException
{
if (_value)
out.print("com.caucho.quercus.env.BooleanValue.TRUE");
else
out.print("com.caucho.quercus.env.BooleanValue.FALSE");
}
/**
* Generates code to recreate the expression.
*
* @param out the writer to the Java source code.
*/
public void generateBoolean(PrintWriter out)
throws IOException
{
if (_value)
out.print("true");
else
out.print("false");
}
/**
* Serializes the value.
*/
@Override
public void serialize(Env env, StringBuilder sb)
{
sb.append("b:");
sb.append(_value ? 1 : 0);
sb.append(';');
}
/**
* Encodes the value in JSON.
*/
@Override
public void jsonEncode(Env env, StringValue sb)
{
if (_value)
sb.append("true");
else
sb.append("false");
}
/**
* Exports the value.
*/
@Override
public void varExport(StringBuilder sb)
{
sb.append(_value ? "true" : "false");
}
/**
* Returns the hash code
*/
@Override
public int hashCode()
{
return _value ? 17 : 37;
}
/**
* Compare for equality.
*/
@Override
public boolean equals(Object o)
{
if (this == o)
return true;
else if (o.getClass() != getClass())
return false;
BooleanValue value = (BooleanValue) o;
return _value == value._value;
}
@Override
public String toDebugString()
{
if (toBoolean())
return "true";
else
return "false";
}
@Override
public void varDumpImpl(Env env,
WriteStream out,
int depth,
IdentityHashMap<Value,String> valueSet)
throws IOException
{
if (toBoolean())
out.print("bool(true)");
else
out.print("bool(false)");
}
//
// Java Serialization
//
private Object readResolve()
{
if (_value == true)
return TRUE;
else
return FALSE;
}
}