// 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.v8native.value;

import java.util.List;

import org.chromium.sdk.RemoteValueMapping;
import org.chromium.sdk.internal.v8native.InternalContext;
import org.chromium.sdk.util.MethodIsBlockingException;

/**
 * The elaborate factory and storage for {@link ValueMirror}'s, that loads values from remote and
 * caches them. The data may come from server with more
 * or less fields, so it creates {@link ValueMirror} accordingly.
 * {@link ValueMirror} is an immutable wrapper around JSON data. Several data instances
 * may occur, the map should always hold the fullest (and the less expired) version.
 */
public abstract class ValueLoader implements RemoteValueMapping {

  /**
   * @return internal cache state variable value
   */
  abstract int getCurrentCacheState();

  /**
   * Looks up {@link ValueMirror} in map, loads them if needed or reloads them
   * if property data is unavailable (or expired).
   */
  public abstract SubpropertiesMirror getOrLoadSubproperties(Long ref)
      throws MethodIsBlockingException;

  /**
   * For each PropertyReference from propertyRefs tries to either:
   * 1. read it from PropertyReference (possibly cached value) or
   * 2. lookup value by refId from remote
   */
  public abstract List<ValueMirror> getOrLoadValueFromRefs(
      List<? extends PropertyReference> propertyRefs) throws MethodIsBlockingException;

  public abstract InternalContext getInternalContext();
}
