// 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;

import java.net.SocketAddress;
import java.util.logging.Logger;

import org.chromium.sdk.internal.BrowserFactoryImpl;

/**
 * A factory for Browser instances.
 */
public abstract class BrowserFactory {

  private static BrowserFactory instance;

  /**
   * Gets a {@link BrowserFactory} instance. This method should be overridden by
   * implementations that want to construct other implementations of
   * {@link Browser}.
   *
   * @return a BrowserFactory singleton instance
   */
  public static BrowserFactory getInstance() {
    if (instance == null) {
      instance = new BrowserFactoryImpl();
    }
    return instance;
  }

  /**
   * Returns a Browser implementor instance that talks to a browser listening at
   * {@code socketAddress}. Note that you shouldn't try to create several instances
   * of Browser connecting to the same {@code socketAddress}.
   *
   * @param socketAddress the browser is listening on
   * @param connectionLoggerFactory provides facility for listening to network
   *        traffic; may be null
   * @return a Browser instance for the {@code socketAddress}
   */
  public abstract Browser create(SocketAddress socketAddress,
      ConnectionLogger.Factory connectionLoggerFactory);

  /**
   * Constructs StandaloneVm instance that talks to a V8 JavaScript VM via
   * DebuggerAgent opened at {@code socketAddress}.
   * @param socketAddress V8 DebuggerAgent is listening on
   * @param connectionLogger provides facility for listening to network
   *        traffic; may be null
   */
  public abstract StandaloneVm createStandalone(SocketAddress socketAddress,
      ConnectionLogger connectionLogger);

  /**
   * @return SDK root logger that can be used to add handlers or to adjust log level
   */
  public static Logger getRootLogger() {
    return LOGGER;
  }

  private static final Logger LOGGER = Logger.getLogger("org.chromium.sdk");
}
