org.chromium.sdk/src/org/chromium/sdk/internal/protocolparser/dynamicimpl/BaseHandlersLibrary.java
changeset 2 e4420d2515f1
equal deleted inserted replaced
1:ef76fc2ac88c 2:e4420d2515f1
       
     1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
       
     2 // Use of this source code is governed by a BSD-style license that can be
       
     3 // found in the LICENSE file.
       
     4 
       
     5 package org.chromium.sdk.internal.protocolparser.dynamicimpl;
       
     6 
       
     7 import java.lang.reflect.InvocationTargetException;
       
     8 import java.lang.reflect.Method;
       
     9 import java.util.HashMap;
       
    10 import java.util.Map;
       
    11 
       
    12 import org.chromium.sdk.internal.protocolparser.AnyObjectBased;
       
    13 import org.chromium.sdk.internal.protocolparser.JsonObjectBased;
       
    14 import org.chromium.sdk.internal.protocolparser.JsonSubtype;
       
    15 import org.json.simple.JSONObject;
       
    16 
       
    17 /**
       
    18  * Contains dynamic proxy method handlers for several well-known methods.
       
    19  */
       
    20 class BaseHandlersLibrary {
       
    21   public static BaseHandlersLibrary INSTANCE;
       
    22 
       
    23   public Map<Method, ? extends MethodHandler> getAllHandlers() {
       
    24     return method2Handler;
       
    25   }
       
    26 
       
    27   private final Map<Method, MethodHandler> method2Handler;
       
    28 
       
    29   private BaseHandlersLibrary() throws NoSuchMethodException {
       
    30     method2Handler = new HashMap<Method, MethodHandler>();
       
    31     Method[] objectMethods = {
       
    32         Object.class.getMethod("equals", Object.class),
       
    33         Object.class.getMethod("hashCode"),
       
    34         Object.class.getMethod("toString")
       
    35     };
       
    36     for (Method m : objectMethods) {
       
    37       method2Handler.put(m, new SelfCallMethodHanlder(m));
       
    38     }
       
    39     fill(method2Handler, new GetJsonObjectMethodHaldler(), new GetAnyObjectMethodHaldler(),
       
    40         new GetSuperMethodHaldler());
       
    41   }
       
    42 
       
    43   private static void fill(Map<Method, MethodHandler> map, MethodHandlerBase ... handlers) {
       
    44     for (MethodHandlerBase handler : handlers) {
       
    45       map.put(handler.getMethod(), handler);
       
    46     }
       
    47   }
       
    48 
       
    49   private static abstract class MethodHandlerBase extends MethodHandler {
       
    50     private final Method method;
       
    51     MethodHandlerBase(Method method) {
       
    52       this.method = method;
       
    53     }
       
    54     Method getMethod() {
       
    55       return method;
       
    56     }
       
    57   }
       
    58 
       
    59   private static class SelfCallMethodHanlder extends MethodHandlerBase {
       
    60     SelfCallMethodHanlder(Method method) {
       
    61       super(method);
       
    62     }
       
    63 
       
    64     @Override
       
    65     Object handle(Object myself, ObjectData objectData, Object[] args)
       
    66         throws IllegalAccessException, InvocationTargetException {
       
    67       return getMethod().invoke(myself, args);
       
    68     }
       
    69   }
       
    70 
       
    71   private static class GetJsonObjectMethodHaldler extends MethodHandlerBase {
       
    72     GetJsonObjectMethodHaldler() throws NoSuchMethodException {
       
    73       super(JsonObjectBased.class.getMethod("getUnderlyingObject"));
       
    74     }
       
    75 
       
    76     @Override
       
    77     JSONObject handle(Object myself, ObjectData objectData, Object[] args) {
       
    78       return (JSONObject) objectData.getUnderlyingObject();
       
    79     }
       
    80   }
       
    81 
       
    82   private static class GetAnyObjectMethodHaldler extends MethodHandlerBase {
       
    83     GetAnyObjectMethodHaldler() throws NoSuchMethodException {
       
    84       super(AnyObjectBased.class.getMethod("getUnderlyingObject"));
       
    85     }
       
    86 
       
    87     @Override
       
    88     Object handle(Object myself, ObjectData objectData, Object[] args) {
       
    89       return objectData.getUnderlyingObject();
       
    90     }
       
    91   }
       
    92 
       
    93   private static class GetSuperMethodHaldler extends MethodHandlerBase {
       
    94     GetSuperMethodHaldler() throws NoSuchMethodException {
       
    95       super(JsonSubtype.class.getMethod("getSuper"));
       
    96     }
       
    97 
       
    98     @Override
       
    99     Object handle(Object myself, ObjectData objectData, Object[] args) {
       
   100       return objectData.getSuperObjectData().getProxy();
       
   101     }
       
   102   }
       
   103 
       
   104   static {
       
   105     try {
       
   106       INSTANCE = new BaseHandlersLibrary();
       
   107     } catch (NoSuchMethodException e) {
       
   108       throw new RuntimeException(e);
       
   109     }
       
   110   }
       
   111 }