--- /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) {
+ }
+}