/*
* Copyright (c) 1998-2010 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;
}
}
}