// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package com.google.dart.compiler;

import java.io.IOException;
import java.io.Reader;
import java.net.URI;
import java.util.Date;

/**
 * Abstract interface to a source file.
 */
public interface Source {

  /**
   * Determines whether the given source exists.
   */
  boolean exists();

  /**
   * Returns the last-modified timestamp for this source, using the same units as
   * {@link Date#getTime()}.
   */
  long getLastModified();

  /**
   * Gets the name of this source.
   */
  String getName();

  /**
   * Gets a reader for the dart file's source code. The caller is responsible for closing the
   * returned reader.
   */
  Reader getSourceReader() throws IOException;

  /**
   * Return an identifier that will uniquely identify this source.
   *
   * @return the unique identifier for this source.
   */
  String getUniqueIdentifier();

  /**
   * Gets the identifier for this source. This is used to uniquely identify the
   * source, but should not be used to obtain the source content. Use
   * {@link #getSourceReader()} to obtain the source content.
   */
  URI getUri();
}
