org.chromium.sdk/src/org/chromium/sdk/internal/protocolparser/dynamicimpl/EnumParser.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/EnumParser.java	Wed Dec 23 17:13:18 2009 -0800
@@ -0,0 +1,59 @@
+// 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 org.chromium.sdk.internal.protocolparser.JsonProtocolModelParseException;
+import org.chromium.sdk.internal.protocolparser.JsonProtocolParseException;
+
+class EnumParser<T extends Enum<T>> extends QuickParser<T> {
+  public static <T extends Enum<T>> EnumParser<T> create(Class<T> enumTypeClass,
+      boolean isNullable) throws JsonProtocolModelParseException {
+    return new EnumParser<T>(enumTypeClass, isNullable);
+  }
+
+  private final Method methodValueOf;
+  private final boolean isNullable;
+  private final Class<T> enumClass;
+
+  private EnumParser(Class<T> enumClass, boolean isNullable)
+      throws JsonProtocolModelParseException {
+    this.enumClass = enumClass;
+    this.isNullable = isNullable;
+    try {
+      this.methodValueOf = enumClass.getMethod("valueOf", String.class);
+    } catch (NoSuchMethodException e) {
+      throw new JsonProtocolModelParseException(
+          "Failed to find valueOf method for parsing strings", e);
+    }
+  }
+
+  @Override
+  public T parseValueQuick(Object value) throws JsonProtocolParseException {
+    if (isNullable && value == null) {
+      return null;
+    }
+    if (value instanceof String == false) {
+      throw new JsonProtocolParseException("String value expected");
+    }
+    String stringValue = (String) value;
+    T result;
+    try {
+      result = enumClass.cast(methodValueOf.invoke(null, stringValue));
+    } catch (IllegalArgumentException e) {
+      throw new JsonProtocolParseException("Failed to parse enum constant " + stringValue, e);
+    } catch (IllegalAccessException e) {
+      throw new JsonProtocolParseException("Failed to call valueOf method", e);
+    } catch (InvocationTargetException e) {
+      throw new JsonProtocolParseException("Failed to call valueOf method", e);
+    }
+    if (result == null) {
+      throw new JsonProtocolParseException("Failed to parse value " + value + " as enum");
+    }
+    return result;
+  }
+}