objectvalue.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 486 行

JAVA
486
字号
/* * Copyright (c) 1998-2008 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.Location;import com.caucho.quercus.lib.ArrayModule;import com.caucho.vfs.WriteStream;import java.io.IOException;import java.util.IdentityHashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeSet;/** * Represents a Quercus object value. */abstract public class ObjectValue extends Value {  transient protected QuercusClass _quercusClass;  protected String _className;    protected ObjectValue(QuercusClass quercusClass)  {    _quercusClass = quercusClass;    _className = quercusClass.getName();  }  protected void setQuercusClass(QuercusClass cl)  {    _quercusClass = cl;    _className = cl.getName();  }  public QuercusClass getQuercusClass()  {    return _quercusClass;  }  /**   * Returns the value's class name.   */  public String getClassName()  {    return _className;  }  /**   * Returns a Set of entries.   */  // XXX: remove entrySet() and use getIterator() instead  abstract public Set<? extends Map.Entry<Value,Value>> entrySet();  /**   * Returns the class name.   */  public String getName()  {    return _className;  }  /**   * Returns the parent class   */  public String getParentClassName()  {    return _quercusClass.getParentName();  }  /**   * Returns true for an object.   */  @Override  public boolean isObject()  {    return true;  }  /**   * Returns the type.   */  @Override  public String getType()  {    return "object";  }  /**   * Converts to a boolean.   */  @Override  public boolean toBoolean()  {    return true;  }  /**   * Returns true for an implementation of a class   */  @Override  public boolean isA(String name)  {    return _quercusClass.isA(name);  }  /**   * Converts to a long.   */  @Override  public long toLong()  {    return 1;  }  /**   * Converts to a double.   */  @Override  public double toDouble()  {    return toLong();  }  //  // array delegate methods  //  /**   * Returns the array value with the given key.   */  @Override  public Value get(Value key)  {    ArrayDelegate delegate = _quercusClass.getArrayDelegate();          // php/066q vs. php/0906    //return getField(null, key.toString());    if (delegate != null)      return delegate.get(this, key);    else      return super.get(key);      //return Env.getInstance().error(L.l("Can't use object '{0}' as array",      //                                   getName()));  }  /**   * Sets the array value with the given key.   */  @Override  public Value put(Value key, Value value)  {    ArrayDelegate delegate = _quercusClass.getArrayDelegate();        // php/0d94    if (delegate != null)      return delegate.put(this, key, value);    else      return super.put(key, value);  }  /**   * Appends a new array value   */  @Override  public Value put(Value value)  {    ArrayDelegate delegate = _quercusClass.getArrayDelegate();        // php/0d94    if (delegate != null)      return delegate.put(this, value);    else      return super.put(value);  }  /**   * Return true if set   */  @Override  public boolean isset(Value key)  {    ArrayDelegate delegate = _quercusClass.getArrayDelegate();    if (delegate != null)      return delegate.isset(this, key);    else      return super.isset(key);  }  /**   * Unsets the array value   */  @Override  public Value remove(Value key)  {    ArrayDelegate delegate = _quercusClass.getArrayDelegate();    if (delegate != null)      return delegate.unset(this, key);    else      return super.remove(key);  }  //  // Foreach/Traversable functions  //  /**   * Returns an iterator for the key => value pairs.   */  @Override  public Iterator<Map.Entry<Value, Value>> getIterator(Env env)  {    TraversableDelegate delegate = _quercusClass.getTraversableDelegate();    if (delegate != null)      return delegate.getIterator(env, this);    else      return super.getIterator(env);  }  /**   * Returns an iterator for the keys.   */  @Override  public Iterator<Value> getKeyIterator(Env env)  {    TraversableDelegate delegate = _quercusClass.getTraversableDelegate();    if (delegate != null)      return delegate.getKeyIterator(env, this);    else      return super.getKeyIterator(env);  }  /**   * Returns an iterator for the values.   */  @Override  public Iterator<Value> getValueIterator(Env env)  {    TraversableDelegate delegate = _quercusClass.getTraversableDelegate();    if (delegate != null)      return delegate.getValueIterator(env, this);    else      return super.getValueIterator(env);  }  //  // count delegate methods  //  /**   * Returns the count value with the given key.   */  @Override  public int getCount(Env env)  {    CountDelegate delegate = _quercusClass.getCountDelegate();          // php/066q vs. php/0906    //return getField(null, key.toString());    if (delegate != null)      return delegate.count(this);    else      return super.getSize();  }  //  // Convenience field methods  //  /**   * Adds a new value.   * @Deprecated   */  public Value putField(String key, String value)  {    Env env = Env.getInstance();        return putThisField(env, env.createString(key), env.createString(value));  }  /**   * Adds a new value.   */  public Value putField(Env env, String key, String value)  {    return putThisField(env, env.createString(key), env.createString(value));  }  /**   * Adds a new value.   * @Deprecated   */  public Value putField(String key, long value)  {    Env env = Env.getInstance();        return putThisField(env, env.createString(key), LongValue.create(value));  }  /**   * Adds a new value.   */  public Value putField(Env env, String key, long value)  {    return putThisField(env, env.createString(key), LongValue.create(value));  }  /**   * Adds a new value.   */  public Value putField(Env env, String key, Value value)  {    return putThisField(env, env.createString(key), value);  }  /**   * Initializes a new field, does not call __set if it is defined.   */  public void initField(StringValue key, Value value)  {    putThisField(null, key, value);  }  /**   * Adds a new value.   * @Deprecated   */  public Value putField(String key, double value)  {    Env env = Env.getInstance();        return putThisField(env, env.createString(key), DoubleValue.create(value));  }  /**   * Returns true for equality   */  @Override  public boolean eq(Value rValue)  {    rValue = rValue.toValue();        if (rValue instanceof ObjectValue)      return cmpObject((ObjectValue) rValue) == 0;    else      return super.eq(rValue);  }    /**   * Compare two objects   */  public int cmpObject(ObjectValue rValue)  {    if (rValue == this)      return 0;    // if objects are not equal, then which object is greater is undefined    int result = getName().compareTo(rValue.getName());        if (result != 0)      return result;        Set<? extends Map.Entry<Value,Value>> aSet = entrySet();    Set<? extends Map.Entry<Value,Value>> bSet = rValue.entrySet();        if (aSet.equals(bSet))      return 0;    else if (aSet.size() > bSet.size())      return 1;    else if (aSet.size() < bSet.size())      return -1;    else {      TreeSet<Map.Entry<Value,Value>> aTree	= new TreeSet<Map.Entry<Value,Value>>(aSet);      TreeSet<Map.Entry<Value,Value>> bTree	= new TreeSet<Map.Entry<Value,Value>>(bSet);      Iterator<Map.Entry<Value,Value>> iterA = aTree.iterator();      Iterator<Map.Entry<Value,Value>> iterB = bTree.iterator();      while (iterA.hasNext()) {        Map.Entry<Value,Value> a = iterA.next();        Map.Entry<Value,Value> b = iterB.next();        result = a.getKey().cmp(b.getKey());        if (result != 0)          return result;                result = a.getValue().cmp(b.getValue());        if (result != 0)          return result;      }      // should never reach this      return 0;    }  }  public void varDumpObject(Env env,                            WriteStream out,                            int depth,                            IdentityHashMap<Value, String> valueSet)    throws IOException  {    out.println("object(" + getName() + ") (" + getSize() + ") {");    ArrayValue sortedEntries = new ArrayValueImpl();    Iterator<Map.Entry<Value,Value>> iter = getIterator(env);    while (iter.hasNext()) {      Map.Entry<Value,Value> entry = iter.next();      sortedEntries.put(entry.getKey(), entry.getValue());    }    ArrayModule.ksort(env, sortedEntries, ArrayModule.SORT_STRING);    iter = sortedEntries.getIterator(env);    while (iter.hasNext()) {      Map.Entry<Value,Value> entry = iter.next();      Value key = entry.getKey();      Value value = entry.getValue();      printDepth(out, 2 * depth);      out.println("[\"" + key + "\"]=>");      depth++;      printDepth(out, 2 * depth);      value.varDump(env, out, depth, valueSet);      out.println();            depth--;    }    printDepth(out, 2 * depth);    out.print("}");  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?