/* * 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.math.BigDecimal; import java.math.BigInteger; import java.net.URL; import java.util.IdentityHashMap; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; /** * Represents a PHP null value. */ public class NullValue extends Value implements Serializable { public static final NullValue NULL = new NullValue(); protected NullValue() { } /** * Returns the null value singleton. */ public static NullValue create() { return NULL; } /** * Returns the type. */ @Override public String getType() { return "NULL"; } /** * Returns the ValueType. */ @Override public ValueType getValueType() { return ValueType.NULL; } /** * Returns true for a set type. */ @Override public boolean isset() { return false; } /** * Returns true if the value is empty */ @Override public boolean isEmpty() { return true; } // // marshal cost // /** * Cost to convert to a double */ @Override public int toDoubleMarshalCost() { return Marshal.COST_FROM_NULL; } /** * Cost to convert to a long */ @Override public int toLongMarshalCost() { return Marshal.COST_FROM_NULL; } /** * Cost to convert to an integer */ @Override public int toIntegerMarshalCost() { return Marshal.COST_FROM_NULL; } /** * Cost to convert to a short */ @Override public int toShortMarshalCost() { return Marshal.COST_FROM_NULL; } /** * Cost to convert to a byte */ @Override public int toByteMarshalCost() { return Marshal.COST_FROM_NULL; } /** * Cost to convert to a boolean */ @Override public int toBooleanMarshalCost() { return Marshal.COST_FROM_NULL; } /** * Converts to a boolean. */ @Override public boolean toBoolean() { return false; } /** * Returns true for a null. */ @Override public boolean isNull() { return true; } /** * Converts to a long. */ @Override public long toLong() { return 0; } /** * Converts to a double. */ @Override public double toDouble() { return 0; } /** * Converts to a string. * @param env */ @Override public String toString() { return ""; } /** * Converts to a string builder */ @Override public StringValue toStringBuilder(Env env) { return env.createUnicodeBuilder(); } /** * Converts to an object. */ @Override public Object toJavaObject() { return null; } /** * Converts to a java object. */ @Override public Object toJavaObject(Env env, Class type) { return null; } /** * Converts to a java object. */ @Override public Object toJavaObjectNotNull(Env env, Class type) { env.warning(L.l("null is an unexpected argument; expected '{0}'", type.getName())); return null; } /** * Converts to a java boolean object. */ @Override public Boolean toJavaBoolean() { return null; } /** * Converts to a java Byte object. */ @Override public Byte toJavaByte() { return null; } /** * Converts to a java Short object. */ @Override public Short toJavaShort() { return null; } /** * Converts to a java Integer object. */ @Override public Integer toJavaInteger() { return null; } /** * Converts to a java Long object. */ @Override public Long toJavaLong() { return null; } /** * Converts to a java Float object. */ @Override public Float toJavaFloat() { return null; } /** * Converts to a java Double object. */ @Override public Double toJavaDouble() { return null; } /** * Converts to a java Character object. */ @Override public Character toJavaCharacter() { return null; } /** * Converts to a java String object. */ @Override public String toJavaString() { return null; } /** * Converts to a java object. */ @Override public Collection toJavaCollection(Env env, Class type) { return null; } /** * Converts to a java object. */ @Override public List toJavaList(Env env, Class type) { return null; } /** * Converts to a java object. */ @Override public Map toJavaMap(Env env, Class type) { return null; } /** * Converts to a Java Calendar. */ @Override public Calendar toJavaCalendar() { return null; } /** * Converts to a Java Date. */ @Override public Date toJavaDate() { return null; } /** * Converts to a Java URL. */ @Override public URL toJavaURL(Env env) { return null; } /** * Converts to a Java BigDecimal. */ @Override public BigDecimal toBigDecimal() { return BigDecimal.ZERO; } /** * Converts to a Java BigInteger. */ @Override public BigInteger toBigInteger() { return BigInteger.ZERO; } /** * Takes the values of this array, unmarshalls them to objects of type * <i>elementType</i>, and puts them in a java array. */ @Override public Object valuesToArray(Env env, Class elementType) { return null; } /** * Converts to an object. */ @Override public Value toObject(Env env) { return NullValue.NULL; } /** * Converts to an array */ @Override public Value toArray() { return new ArrayValueImpl(); } /** * Converts to an array if null. */ @Override public Value toAutoArray() { return new ArrayValueImpl(); } /** * Sets the array value, returning the new array, e.g. to handle * string update ($a[0] = 'A'). Creates an array automatically if * necessary. */ public Value append(Value index, Value value) { return new ArrayValueImpl().append(index, value); } /** * Casts to an array. */ @Override public ArrayValue toArrayValue(Env env) { return null; } /** * Converts to a StringValue. */ public StringValue toStringValue() { Env env = Env.getInstance(); if (env != null && env.isUnicodeSemantics()) return UnicodeBuilderValue.EMPTY; else return StringBuilderValue.EMPTY; } @Override public int getCount(Env env) { return 0; } /** * Returns the array size. */ @Override public int getSize() { return 0; } /** * Converts to an object if null. */ @Override public Value toAutoObject(Env env) { return env.createObject(); } /** * Converts to a reference variable */ @Override public Value toArgRef() { return this; } /** * Converts to a key. */ @Override public Value toKey() { return StringValue.EMPTY; } /** * Returns true for equality */ @Override public boolean eql(Value rValue) { return rValue.isNull(); } /** * Adds to the following value. */ @Override public Value add(long lLong) { return LongValue.create(lLong); } /** * Subtracts the following value. */ @Override public Value sub(long rLong) { return LongValue.create(-rLong); } /** * Returns true for equality */ @Override public boolean eq(Value rValue) { if (rValue.isString()) return toString().equals(rValue.toString()); else return toBoolean() == rValue.toBoolean(); } /** * Returns true for equality */ @Override public int cmp(Value rValue) { rValue = rValue.toValue(); if (! (rValue instanceof StringValue)) { int l = 0; int r = rValue.toBoolean() ? 1 : 0; return l - r; } else if (rValue.isNumberConvertible()) { double l = 0; double r = rValue.toDouble(); if (l == r) return 0; else if (l < r) return -1; else return 1; } else return "".compareTo(rValue.toString()); } /** * Prints the value. * @param env */ @Override public void print(Env env) { } /** * Serializes the value. */ @Override public void serialize(Env env, StringBuilder sb) { sb.append("N;"); } /** * Exports the value. */ @Override public void varExport(StringBuilder sb) { sb.append("NULL"); } /** * Encodes the value in JSON. */ @Override public void jsonEncode(Env env, StringValue sb) { sb.append("null"); } /** * Returns a new array. */ @Override public Value getArray() { return new ArrayValueImpl(); } /** * Append to a binary builder. */ @Override public StringValue appendTo(BinaryBuilderValue sb) { return sb; } /** * Append to a unicode builder. */ @Override public StringValue appendTo(UnicodeBuilderValue sb) { return sb; } /** * Append to a string builder. */ @Override public StringValue appendTo(StringBuilderValue sb) { return sb; } /** * Append to a string builder. */ @Override public StringValue appendTo(LargeStringBuilderValue sb) { return sb; } // // 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 { out.print("NullValue.NULL"); } /** * Returns a new object. */ @Override public Value getObject(Env env) { return env.createObject(); } @Override public String toDebugString() { return "null"; } @Override public void varDumpImpl(Env env, WriteStream out, int depth, IdentityHashMap<Value, String> valueSet) throws IOException { out.print("NULL"); } // // Java Serialization // private Object readResolve() { return NULL; } @Override public int hashCode() { return 17; } }