org.chromium.sdk/src/org/chromium/sdk/internal/HandleManager.java
changeset 2 e4420d2515f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.chromium.sdk/src/org/chromium/sdk/internal/HandleManager.java	Wed Dec 23 17:13:18 2009 -0800
@@ -0,0 +1,60 @@
+// 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 java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.chromium.sdk.internal.protocol.data.SomeHandle;
+import org.chromium.sdk.internal.protocolparser.JsonProtocolParseException;
+import org.chromium.sdk.internal.tools.v8.V8ProtocolUtil;
+import org.json.simple.JSONObject;
+
+/**
+ * A facility for storage and retrieval of handle objects using their "ref" IDs.
+ */
+public class HandleManager {
+
+  private final ConcurrentMap<Long, SomeHandle> refToHandle =
+      new ConcurrentHashMap<Long, SomeHandle>();
+
+  public void putAll(List<SomeHandle> list) {
+    for (SomeHandle handle : list) {
+      put(handle.handle(), handle);
+    }
+  }
+
+  SomeHandle put(Long ref, JSONObject object) {
+    SomeHandle smthWithHandle;
+    try {
+      smthWithHandle = V8ProtocolUtil.getV8Parser().parse(object, SomeHandle.class);
+    } catch (JsonProtocolParseException e) {
+      throw new RuntimeException(e);
+    }
+    put(ref, smthWithHandle);
+    return smthWithHandle;
+  }
+
+  private void put(Long ref, SomeHandle smthWithHandle) {
+    SomeHandle oldObject = refToHandle.putIfAbsent(ref, smthWithHandle);
+    if (oldObject != null) {
+      mergeValues(oldObject, smthWithHandle);
+    }
+  }
+
+  void put(SomeHandle someHandle) {
+    if (someHandle.handle() >= 0) {
+      put(someHandle.handle(), someHandle);
+    }
+  }
+
+  public SomeHandle getHandle(Long ref) {
+    return refToHandle.get(ref);
+  }
+
+  private static void mergeValues(SomeHandle oldObject, SomeHandle newObject) {
+  }
+}