// Copyright (c) 2012, 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.File;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * A {@link DartSource} backed by a URL.
 */
public class UrlDartSource extends UrlSource implements DartSource {

  private final LibrarySource lib;
  private final String relPath;

  protected UrlDartSource(URI uri, String relPath, LibrarySource lib, PackageLibraryManager slm) {
    super(uri,slm);
    this.relPath = relPath;
    this.lib = lib;
  }

  protected UrlDartSource(URI uri, String relPath, LibrarySource lib) {
    this(uri, relPath, lib, null);
  }

  public UrlDartSource(File file, LibrarySource lib) {
    super(file);
    this.relPath = file.getPath();
    this.lib = lib;
  }

  @Override
  public LibrarySource getLibrary() {
    return lib;
  }

  @Override
  public String getName() {
    try {
      String uriSafeName = new URI(null, null, relPath, null).toString();
      return lib.getName() + "/" + uriSafeName;
    } catch (URISyntaxException e) {
      throw new AssertionError(e);
    }
  }

  @Override
  public String getRelativePath() {
    return relPath;
  }
}
