001: /*
002: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: *
023: * Free Software Foundation, Inc.
024: * 59 Temple Place, Suite 330
025: * Boston, MA 02111-1307 USA
026: *
027: * @author Scott Ferguson
028: */
029:
030: package com.caucho.quercus.env;
031:
032: import com.caucho.vfs.WriteStream;
033:
034: import java.io.IOException;
035: import java.io.PrintWriter;
036: import java.io.Serializable;
037: import java.math.BigDecimal;
038: import java.math.BigInteger;
039: import java.net.URL;
040: import java.util.IdentityHashMap;
041: import java.util.Calendar;
042: import java.util.Collection;
043: import java.util.Date;
044: import java.util.List;
045: import java.util.Map;
046:
047: /**
048: * Represents a PHP null value.
049: */
050: public class NullValue extends Value implements Serializable {
051: public static final NullValue NULL = new NullValue();
052:
053: protected NullValue() {
054: }
055:
056: /**
057: * Returns the null value singleton.
058: */
059: public static NullValue create() {
060: return NULL;
061: }
062:
063: /**
064: * Returns the type.
065: */
066: @Override
067: public String getType() {
068: return "NULL";
069: }
070:
071: /**
072: * Returns the ValueType.
073: */
074: @Override
075: public ValueType getValueType() {
076: return ValueType.NULL;
077: }
078:
079: /**
080: * Returns true for a set type.
081: */
082: @Override
083: public boolean isset() {
084: return false;
085: }
086:
087: /**
088: * Returns true if the value is empty
089: */
090: @Override
091: public boolean isEmpty() {
092: return true;
093: }
094:
095: /**
096: * Converts to a boolean.
097: */
098: @Override
099: public boolean toBoolean() {
100: return false;
101: }
102:
103: /**
104: * Returns true for a null.
105: */
106: @Override
107: public boolean isNull() {
108: return true;
109: }
110:
111: /**
112: * Converts to a long.
113: */
114: @Override
115: public long toLong() {
116: return 0;
117: }
118:
119: /**
120: * Converts to a double.
121: */
122: @Override
123: public double toDouble() {
124: return 0;
125: }
126:
127: /**
128: * Converts to a string.
129: * @param env
130: */
131: @Override
132: public String toString() {
133: return "";
134: }
135:
136: /**
137: * Converts to a string builder
138: */
139: @Override
140: public StringValue toStringBuilder(Env env) {
141: return env.createUnicodeBuilder();
142: }
143:
144: /**
145: * Converts to an object.
146: */
147: @Override
148: public Object toJavaObject() {
149: return null;
150: }
151:
152: /**
153: * Converts to a java object.
154: */
155: @Override
156: public Object toJavaObject(Env env, Class type) {
157: return null;
158: }
159:
160: /**
161: * Converts to a java object.
162: */
163: @Override
164: public Object toJavaObjectNotNull(Env env, Class type) {
165: env.warning(L.l(
166: "null is an unexpected argument; expected '{0}'", type
167: .getName()));
168:
169: return null;
170: }
171:
172: /**
173: * Converts to a java boolean object.
174: */
175: @Override
176: public Boolean toJavaBoolean() {
177: return null;
178: }
179:
180: /**
181: * Converts to a java Byte object.
182: */
183: @Override
184: public Byte toJavaByte() {
185: return null;
186: }
187:
188: /**
189: * Converts to a java Short object.
190: */
191: @Override
192: public Short toJavaShort() {
193: return null;
194: }
195:
196: /**
197: * Converts to a java Integer object.
198: */
199: @Override
200: public Integer toJavaInteger() {
201: return null;
202: }
203:
204: /**
205: * Converts to a java Long object.
206: */
207: @Override
208: public Long toJavaLong() {
209: return null;
210: }
211:
212: /**
213: * Converts to a java Float object.
214: */
215: @Override
216: public Float toJavaFloat() {
217: return null;
218: }
219:
220: /**
221: * Converts to a java Double object.
222: */
223: @Override
224: public Double toJavaDouble() {
225: return null;
226: }
227:
228: /**
229: * Converts to a java Character object.
230: */
231: @Override
232: public Character toJavaCharacter() {
233: return null;
234: }
235:
236: /**
237: * Converts to a java String object.
238: */
239: @Override
240: public String toJavaString() {
241: return null;
242: }
243:
244: /**
245: * Converts to a java object.
246: */
247: @Override
248: public Collection toJavaCollection(Env env, Class type) {
249: return null;
250: }
251:
252: /**
253: * Converts to a java object.
254: */
255: @Override
256: public List toJavaList(Env env, Class type) {
257: return null;
258: }
259:
260: /**
261: * Converts to a java object.
262: */
263: @Override
264: public Map toJavaMap(Env env, Class type) {
265: return null;
266: }
267:
268: /**
269: * Converts to a Java Calendar.
270: */
271: @Override
272: public Calendar toJavaCalendar() {
273: return null;
274: }
275:
276: /**
277: * Converts to a Java Date.
278: */
279: @Override
280: public Date toJavaDate() {
281: return null;
282: }
283:
284: /**
285: * Converts to a Java URL.
286: */
287: @Override
288: public URL toJavaURL(Env env) {
289: return null;
290: }
291:
292: /**
293: * Converts to a Java BigDecimal.
294: */
295: @Override
296: public BigDecimal toBigDecimal() {
297: return BigDecimal.ZERO;
298: }
299:
300: /**
301: * Converts to a Java BigInteger.
302: */
303: @Override
304: public BigInteger toBigInteger() {
305: return BigInteger.ZERO;
306: }
307:
308: /**
309: * Takes the values of this array, unmarshalls them to objects of type
310: * <i>elementType</i>, and puts them in a java array.
311: */
312: @Override
313: public Object valuesToArray(Env env, Class elementType) {
314: return null;
315: }
316:
317: /**
318: * Converts to an object.
319: */
320: @Override
321: public Value toObject(Env env) {
322: return NullValue.NULL;
323: }
324:
325: /**
326: * Converts to an array
327: */
328: @Override
329: public Value toArray() {
330: return new ArrayValueImpl();
331: }
332:
333: /**
334: * Converts to an array if null.
335: */
336: @Override
337: public Value toAutoArray() {
338: return new ArrayValueImpl();
339: }
340:
341: /**
342: * Casts to an array.
343: */
344: @Override
345: public ArrayValue toArrayValue(Env env) {
346: return null;
347: }
348:
349: /**
350: * Converts to a StringValue.
351: */
352: public StringValue toStringValue() {
353: Env env = Env.getInstance();
354:
355: if (env != null && env.isUnicodeSemantics())
356: return UnicodeBuilderValue.EMPTY;
357: else
358: return StringBuilderValue.EMPTY;
359: }
360:
361: @Override
362: public int getCount(Env env) {
363: return 0;
364: }
365:
366: /**
367: * Returns the array size.
368: */
369: @Override
370: public int getSize() {
371: return 0;
372: }
373:
374: /**
375: * Converts to an object if null.
376: */
377: @Override
378: public Value toAutoObject(Env env) {
379: return env.createObject();
380: }
381:
382: /**
383: * Converts to a key.
384: */
385: @Override
386: public Value toKey() {
387: return StringValue.EMPTY;
388: }
389:
390: /**
391: * Returns true for equality
392: */
393: @Override
394: public boolean eql(Value rValue) {
395: return rValue.isNull();
396: }
397:
398: /**
399: * Adds to the following value.
400: */
401: @Override
402: public Value add(long lLong) {
403: return LongValue.create(lLong);
404: }
405:
406: /**
407: * Subtracts the following value.
408: */
409: @Override
410: public Value sub(long rLong) {
411: return LongValue.create(-rLong);
412: }
413:
414: /**
415: * Returns true for equality
416: */
417: @Override
418: public boolean eq(Value rValue) {
419: if (rValue.isString())
420: return toString().equals(rValue.toString());
421: else
422: return toBoolean() == rValue.toBoolean();
423: }
424:
425: /**
426: * Returns true for equality
427: */
428: @Override
429: public int cmp(Value rValue) {
430: rValue = rValue.toValue();
431:
432: if (!(rValue instanceof StringValue)) {
433: int l = 0;
434: int r = rValue.toBoolean() ? 1 : 0;
435:
436: return l - r;
437: } else if (rValue.isNumberConvertible()) {
438: double l = 0;
439: double r = rValue.toDouble();
440:
441: if (l == r)
442: return 0;
443: else if (l < r)
444: return -1;
445: else
446: return 1;
447: } else
448: return "".compareTo(rValue.toString());
449: }
450:
451: /**
452: * Prints the value.
453: * @param env
454: */
455: @Override
456: public void print(Env env) {
457: }
458:
459: /**
460: * Serializes the value.
461: */
462: @Override
463: public void serialize(StringBuilder sb) {
464: sb.append("N;");
465: }
466:
467: /**
468: * Exports the value.
469: */
470: @Override
471: public void varExport(StringBuilder sb) {
472: sb.append("null");
473: }
474:
475: /**
476: * Returns a new array.
477: */
478: @Override
479: public Value getArray() {
480: return new ArrayValueImpl();
481: }
482:
483: /**
484: * Append to a binary builder.
485: */
486: @Override
487: public StringValue appendTo(BinaryBuilderValue sb) {
488: return sb;
489: }
490:
491: /**
492: * Append to a unicode builder.
493: */
494: @Override
495: public StringValue appendTo(UnicodeBuilderValue sb) {
496: return sb;
497: }
498:
499: /**
500: * Append to a string builder.
501: */
502: @Override
503: public StringValue appendTo(StringBuilderValue sb) {
504: return sb;
505: }
506:
507: /**
508: * Append to a string builder.
509: */
510: @Override
511: public StringValue appendTo(LargeStringBuilderValue sb) {
512: return sb;
513: }
514:
515: //
516: // Java generator code
517: //
518:
519: /**
520: * Generates code to recreate the expression.
521: *
522: * @param out the writer to the Java source code.
523: */
524: @Override
525: public void generate(PrintWriter out) throws IOException {
526: out.print("NullValue.NULL");
527: }
528:
529: /**
530: * Returns a new object.
531: */
532: @Override
533: public Value getObject(Env env) {
534: return env.createObject();
535: }
536:
537: @Override
538: public String toDebugString() {
539: return "null";
540: }
541:
542: @Override
543: public void varDumpImpl(Env env, WriteStream out, int depth,
544: IdentityHashMap<Value, String> valueSet) throws IOException {
545: out.print("NULL");
546: }
547:
548: //
549: // Java Serialization
550: //
551:
552: private Object readResolve() {
553: return NULL;
554: }
555: }
|