org.chromium.sdk/src/org/chromium/sdk/internal/tools/v8/DefaultResponseHandler.java
changeset 2 e4420d2515f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.chromium.sdk/src/org/chromium/sdk/internal/tools/v8/DefaultResponseHandler.java	Wed Dec 23 17:13:18 2009 -0800
@@ -0,0 +1,86 @@
+package org.chromium.sdk.internal.tools.v8;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.chromium.sdk.internal.DebugSession;
+import org.chromium.sdk.internal.protocol.EventNotification;
+import org.chromium.sdk.internal.protocol.IncomingMessage;
+import org.chromium.sdk.internal.tools.v8.processor.AfterCompileProcessor;
+import org.chromium.sdk.internal.tools.v8.processor.BreakpointProcessor;
+import org.chromium.sdk.internal.tools.v8.processor.V8EventProcessor;
+
+public class DefaultResponseHandler {
+
+  /** The class logger. */
+  private static final Logger LOGGER = Logger.getLogger(DefaultResponseHandler.class.getName());
+
+  /** The breakpoint processor. */
+  private final BreakpointProcessor bpp;
+
+  /** The "afterCompile" event processor. */
+  private final AfterCompileProcessor afterCompileProcessor;
+
+  public DefaultResponseHandler(DebugSession debugSession) {
+    this.bpp = new BreakpointProcessor(debugSession);
+    this.afterCompileProcessor = new AfterCompileProcessor(debugSession);
+  }
+
+  public BreakpointProcessor getBreakpointProcessor() {
+    return bpp;
+  }
+
+  /**
+   * @param type response type ("response" or "event")
+   * @param response from the V8 VM debugger
+   */
+  public void handleResponseWithHandler(IncomingMessage response) {
+    EventNotification eventResponse = response.asEventNotification();
+    if (eventResponse == null) {
+      // Currently only events are supported.
+      return;
+    }
+    String commandString = eventResponse.getEvent();
+    DebuggerCommand command = DebuggerCommand.forString(commandString);
+    if (command == null) {
+      LOGGER.log(Level.WARNING,
+          "Unknown command in V8 debugger reply JSON: {0}", commandString);
+      return;
+    }
+    final ProcessorGetter handlerGetter = command2EventProcessorGetter.get(command);
+    if (handlerGetter == null) {
+      return;
+    }
+    handlerGetter.get(this).messageReceived(eventResponse);
+  }
+
+  private static abstract class ProcessorGetter {
+    abstract V8EventProcessor get(DefaultResponseHandler instance);
+  }
+
+  /**
+   * The handlers that should be invoked when certain command responses arrive.
+   */
+  private static final Map<DebuggerCommand, ProcessorGetter> command2EventProcessorGetter;
+  static {
+    command2EventProcessorGetter = new HashMap<DebuggerCommand, ProcessorGetter>();
+    ProcessorGetter bppGetter = new ProcessorGetter() {
+      @Override
+      BreakpointProcessor get(DefaultResponseHandler instance) {
+        return instance.bpp;
+      }
+    };
+    command2EventProcessorGetter.put(DebuggerCommand.BREAK /* event */, bppGetter);
+    command2EventProcessorGetter.put(DebuggerCommand.EXCEPTION /* event */, bppGetter);
+
+    command2EventProcessorGetter.put(DebuggerCommand.AFTER_COMPILE /* event */,
+        new ProcessorGetter() {
+      @Override
+      AfterCompileProcessor get(DefaultResponseHandler instance) {
+        return instance.afterCompileProcessor;
+      }
+    });
+  }
+}