org.chromium.sdk/src/org/chromium/sdk/internal/protocolparser/dynamicimpl/BaseHandlersLibrary.java
changeset 2 e4420d2515f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.chromium.sdk/src/org/chromium/sdk/internal/protocolparser/dynamicimpl/BaseHandlersLibrary.java	Wed Dec 23 17:13:18 2009 -0800
@@ -0,0 +1,111 @@
+// 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.protocolparser.dynamicimpl;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.chromium.sdk.internal.protocolparser.AnyObjectBased;
+import org.chromium.sdk.internal.protocolparser.JsonObjectBased;
+import org.chromium.sdk.internal.protocolparser.JsonSubtype;
+import org.json.simple.JSONObject;
+
+/**
+ * Contains dynamic proxy method handlers for several well-known methods.
+ */
+class BaseHandlersLibrary {
+  public static BaseHandlersLibrary INSTANCE;
+
+  public Map<Method, ? extends MethodHandler> getAllHandlers() {
+    return method2Handler;
+  }
+
+  private final Map<Method, MethodHandler> method2Handler;
+
+  private BaseHandlersLibrary() throws NoSuchMethodException {
+    method2Handler = new HashMap<Method, MethodHandler>();
+    Method[] objectMethods = {
+        Object.class.getMethod("equals", Object.class),
+        Object.class.getMethod("hashCode"),
+        Object.class.getMethod("toString")
+    };
+    for (Method m : objectMethods) {
+      method2Handler.put(m, new SelfCallMethodHanlder(m));
+    }
+    fill(method2Handler, new GetJsonObjectMethodHaldler(), new GetAnyObjectMethodHaldler(),
+        new GetSuperMethodHaldler());
+  }
+
+  private static void fill(Map<Method, MethodHandler> map, MethodHandlerBase ... handlers) {
+    for (MethodHandlerBase handler : handlers) {
+      map.put(handler.getMethod(), handler);
+    }
+  }
+
+  private static abstract class MethodHandlerBase extends MethodHandler {
+    private final Method method;
+    MethodHandlerBase(Method method) {
+      this.method = method;
+    }
+    Method getMethod() {
+      return method;
+    }
+  }
+
+  private static class SelfCallMethodHanlder extends MethodHandlerBase {
+    SelfCallMethodHanlder(Method method) {
+      super(method);
+    }
+
+    @Override
+    Object handle(Object myself, ObjectData objectData, Object[] args)
+        throws IllegalAccessException, InvocationTargetException {
+      return getMethod().invoke(myself, args);
+    }
+  }
+
+  private static class GetJsonObjectMethodHaldler extends MethodHandlerBase {
+    GetJsonObjectMethodHaldler() throws NoSuchMethodException {
+      super(JsonObjectBased.class.getMethod("getUnderlyingObject"));
+    }
+
+    @Override
+    JSONObject handle(Object myself, ObjectData objectData, Object[] args) {
+      return (JSONObject) objectData.getUnderlyingObject();
+    }
+  }
+
+  private static class GetAnyObjectMethodHaldler extends MethodHandlerBase {
+    GetAnyObjectMethodHaldler() throws NoSuchMethodException {
+      super(AnyObjectBased.class.getMethod("getUnderlyingObject"));
+    }
+
+    @Override
+    Object handle(Object myself, ObjectData objectData, Object[] args) {
+      return objectData.getUnderlyingObject();
+    }
+  }
+
+  private static class GetSuperMethodHaldler extends MethodHandlerBase {
+    GetSuperMethodHaldler() throws NoSuchMethodException {
+      super(JsonSubtype.class.getMethod("getSuper"));
+    }
+
+    @Override
+    Object handle(Object myself, ObjectData objectData, Object[] args) {
+      return objectData.getSuperObjectData().getProxy();
+    }
+  }
+
+  static {
+    try {
+      INSTANCE = new BaseHandlersLibrary();
+    } catch (NoSuchMethodException e) {
+      throw new RuntimeException(e);
+    }
+  }
+}