org.chromium.sdk/src/org/chromium/sdk/internal/ValueMirror.java
changeset 2 e4420d2515f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.chromium.sdk/src/org/chromium/sdk/internal/ValueMirror.java	Wed Dec 23 17:13:18 2009 -0800
@@ -0,0 +1,151 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.sdk.internal;
+
+import org.chromium.sdk.JsValue.Type;
+
+/**
+ * A representation of a datum (value) in the remote JavaScript VM. Must contain all the
+ * data immutable, except for properties. Reference to properties is optional and may be set later.
+ */
+public class ValueMirror {
+
+  public static PropertyHoldingValueMirror createScalar(String value, Type type, String className) {
+    return new ValueMirror(value, type, className).getProperties();
+  }
+
+  public static PropertyHoldingValueMirror createObject(int refID,
+      SubpropertiesMirror subpropertiesMirror, Type type, String className) {
+    if (subpropertiesMirror == null) {
+      throw new NullPointerException();
+    }
+    return new ValueMirror(refID, subpropertiesMirror, type, className).getProperties();
+  }
+
+  public static ValueMirror createObjectUnknownProperties(int refID, Type type, String className) {
+    return new ValueMirror(refID, null, type, className);
+  }
+
+  private final int ref;
+
+  private final Type type;
+
+  private final String value;
+
+  private final String className;
+
+  private volatile PropertyHoldingValueMirror properties = null;
+
+  private ValueMirror(String value, Type type, String className) {
+    this.type = type;
+    this.value = value;
+    this.ref = -1;
+    this.className = className;
+    this.properties = new PropertyHoldingValueMirror(this);
+  }
+
+  private ValueMirror(int refID, SubpropertiesMirror subpropertiesMirror, Type type,
+      String className) {
+    this.type = type;
+    this.className = className;
+    this.ref = refID;
+    PropertyHoldingValueMirror propertiesMirror;
+    if (subpropertiesMirror == null) {
+      propertiesMirror = null;
+    } else {
+      propertiesMirror = new PropertyHoldingValueMirror(this, subpropertiesMirror);
+    }
+    this.properties = propertiesMirror;
+    this.value = null;
+  }
+
+  public Type getType() {
+    return type;
+  }
+
+  public PropertyHoldingValueMirror getProperties() {
+    return properties;
+  }
+
+  public int getRef() {
+    return ref;
+  }
+
+  /**
+   * @return the type representation as a String
+   */
+  public String getTypeAsString() {
+    switch (type) {
+      case TYPE_NUMBER:
+      case TYPE_OBJECT:
+      case TYPE_ARRAY:
+      case TYPE_FUNCTION:
+      case TYPE_DATE:
+        return JsDataTypeUtil.getJsonString(type);
+      case TYPE_STRING:
+      default:
+        return "text";
+    }
+  }
+
+  @Override
+  public String toString() {
+    switch (type) {
+      case TYPE_UNDEFINED:
+      case TYPE_NULL:
+      case TYPE_DATE:
+      case TYPE_STRING:
+      case TYPE_NUMBER:
+      case TYPE_BOOLEAN:
+      case TYPE_REGEXP:
+        return value == null
+            ? ""
+            : value;
+      case TYPE_OBJECT:
+      case TYPE_ARRAY:
+        return "[" + className + "]";
+      case TYPE_FUNCTION:
+        return "[Function]";
+      default:
+        return "";
+    }
+  }
+
+  public String getClassName() {
+    return className;
+  }
+
+  private static Type getObjectJsType(String className) {
+    return JsDataTypeUtil.fromJsonTypeAndClassName("object", className);
+  }
+
+  void mergeFrom(ValueMirror alternative) {
+    synchronized (MERGE_VALUE_MIRROR_MONITOR) {
+      if (alternative.properties != null) {
+        if (this.properties == null) {
+          this.properties =
+              new PropertyHoldingValueMirror(this, alternative.properties.getSubpropertiesMirror());
+        } else {
+          mergeProperties(this.properties, alternative.properties);
+        }
+      }
+    }
+  }
+
+  private static final Object MERGE_VALUE_MIRROR_MONITOR = new Object();
+
+  /**
+   * Merge a record from data base with a new record just received. Theoretically
+   * the new record may have something that base version lacks.
+   * However,this method is more of symbolic use right now.
+   *
+   * @param baseProperties record version which is kept in database
+   * @param altProperties record version that just has come from outside and may
+   *        contain additional data
+   */
+  private static void mergeProperties(PropertyHoldingValueMirror baseProperties,
+      PropertyHoldingValueMirror altProperties) {
+  }
+}