| // 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; |
| |
| /** |
| * A {@link LibrarySource} backed by a URL. |
| */ |
| public class UrlLibrarySource extends UrlSource implements LibrarySource { |
| |
| public UrlLibrarySource(URI uri, PackageLibraryManager slm) { |
| super(uri, slm); |
| } |
| |
| public UrlLibrarySource(URI uri) { |
| this(uri, null); |
| } |
| |
| public UrlLibrarySource(File file) { |
| super(file); |
| } |
| |
| @Override |
| public String getName() { |
| return getUri().toString(); |
| } |
| |
| @Override |
| public LibrarySource getImportFor(String relPath) { |
| if (relPath == null || relPath.isEmpty()) { |
| return null; |
| } |
| try { |
| // Force the creation of an escaped relative URI to deal with spaces, etc. |
| URI uri = getUri().resolve(new URI(null, null, relPath, null, null)).normalize(); |
| String path = uri.getPath(); |
| // Resolve relative reference out of one system library into another |
| if (PackageLibraryManager.isDartUri(uri)) { |
| if (path != null && path.startsWith("/..")) { |
| URI fileUri = packageLibraryManager.resolveDartUri(uri); |
| URI shortUri = packageLibraryManager.getShortUri(fileUri); |
| if (shortUri != null) { |
| uri = shortUri; |
| } |
| } |
| } else if (PackageLibraryManager.isPackageUri(uri)) { |
| URI fileUri = packageLibraryManager.resolveDartUri(uri); |
| if (fileUri != null) { |
| uri = fileUri; |
| } |
| } else if (!resourceExists(uri)) { |
| // resolve against package root directories to find file |
| uri = packageLibraryManager.findExistingFileInPackages(uri); |
| } |
| |
| return createLibrarySource(uri, packageLibraryManager); |
| } catch (Throwable e) { |
| return null; |
| } |
| } |
| |
| @Override |
| public DartSource getSourceFor(final String relPath) { |
| if (relPath == null || relPath.isEmpty()) { |
| return null; |
| } |
| try { |
| // Force the creation of an escaped relative URI to deal with spaces, etc. |
| URI uri = getUri().resolve(new URI(null, null, relPath, null, null)).normalize(); |
| if (PackageLibraryManager.isPackageUri(uri)) { |
| URI fileUri = packageLibraryManager.resolveDartUri(uri); |
| if (fileUri != null) { |
| uri = fileUri; |
| } |
| } |
| return createDartSource(uri, relPath, this, packageLibraryManager); |
| } catch (Throwable e) { |
| return null; |
| } |
| } |
| |
| /** |
| * Create a URL library source. |
| * |
| * (Clients can override.) |
| * |
| * @param uri the URI of the library |
| * @param relPath relative path to the dart source |
| * @param libSource the library source |
| * @param packageManager the package library manager |
| * @return the resulting dart source |
| */ |
| protected UrlDartSource createDartSource(URI uri, String relPath, UrlLibrarySource libSource, PackageLibraryManager packageManager) { |
| return new UrlDartSource(uri, relPath, libSource, packageManager); |
| } |
| |
| /** |
| * Create a URL library source. |
| * |
| * (Clients can override.) |
| * |
| * @param uri the URI of the library |
| * @return the resulting library source |
| */ |
| protected UrlLibrarySource createLibrarySource(URI uri, PackageLibraryManager packageManager) { |
| return new UrlLibrarySource(uri, packageManager); |
| } |
| |
| /** |
| * Check if a resource exists at this URI. |
| * |
| * (Clients can override.) |
| * |
| * @param uri the URI to test |
| * @return <code>true</code> if a resource exists at this URI, <code>false</code> otherwise |
| */ |
| protected boolean resourceExists(URI uri) { |
| String path = uri.getPath(); |
| return path == null || new File(path).exists(); |
| } |
| } |