| Index: compiler/java/com/google/dart/compiler/SystemLibraryManager.java
|
| diff --git a/compiler/java/com/google/dart/compiler/SystemLibraryManager.java b/compiler/java/com/google/dart/compiler/SystemLibraryManager.java
|
| index bab8b97444cda97da66d418f07705f9e0991a8b3..be9029a5ec8ac4f2d1b21c24588ae37c05945e91 100644
|
| --- a/compiler/java/com/google/dart/compiler/SystemLibraryManager.java
|
| +++ b/compiler/java/com/google/dart/compiler/SystemLibraryManager.java
|
| @@ -5,56 +5,72 @@
|
| package com.google.dart.compiler;
|
|
|
| import java.io.File;
|
| -import java.io.IOException;
|
| -import java.net.MalformedURLException;
|
| import java.net.URI;
|
| import java.net.URISyntaxException;
|
| -import java.net.URL;
|
| import java.util.ArrayList;
|
| import java.util.HashMap;
|
| +import java.util.List;
|
| import java.util.Map;
|
| -import java.util.jar.JarFile;
|
|
|
| /**
|
| * Manages the collection of {@link SystemLibrary}s.
|
| */
|
| public class SystemLibraryManager {
|
| - private enum SystemLibraryPath {
|
| - CORE("core", "core", "com/google/dart/corelib/", "corelib.dart", "corelib.jar", true),
|
| - COREIMPL("core", "coreimpl", "com/google/dart/corelib/", "corelib_impl.dart", "corelib.jar",
|
| - CORE, true),
|
| - DOM("dom", "dom", "dom/", "dom.dart", "domlib.jar"),
|
| - HTML("html", "html", "html/", "html.dart", "htmllib.jar"),
|
| - JSON("json", "json", "json/", "json.dart", "jsonlib.jar"),
|
| - ISOLATE("isolate", "isolate", "isolate/", "isolate_compiler.dart", "isolatelib.jar");
|
| -
|
| - final String hostName;
|
| - final SystemLibraryPath base;
|
| - final String shortName;
|
| - final String jar;
|
| - final String lib;
|
| - final boolean failIfMissing;
|
| -
|
| - SystemLibraryPath(String hostName, String shortName, String path, String file, String jar,
|
| - boolean failIfMissing) {
|
| - this(hostName, shortName, path, file, jar, null, failIfMissing);
|
| - }
|
| -
|
| - SystemLibraryPath(String hostName, String shortName, String path, String file, String jar) {
|
| - this(hostName, shortName, path, file, jar, null, false);
|
| - }
|
| -
|
| - SystemLibraryPath(String hostName, String shortName, String path, String file, String jar,
|
| - SystemLibraryPath base, boolean failIfMissing) {
|
| - this.hostName = hostName;
|
| +
|
| + private static class SystemLibraryPath {
|
| + String shortName;
|
| + String dartSourceFile;
|
| +
|
| + SystemLibraryPath(String shortName, String dartSourceFile) {
|
| this.shortName = shortName;
|
| - this.jar = jar;
|
| - this.lib = path + file;
|
| - this.base = base;
|
| - this.failIfMissing = failIfMissing;
|
| + this.dartSourceFile = dartSourceFile;
|
| }
|
| }
|
| -
|
| +
|
| + static final SystemLibraryPath[] frogImplementation = {
|
| + new SystemLibraryPath("core", "core/core_frog.dart"),
|
| + new SystemLibraryPath("coreimpl", "coreimpl/coreimpl_frog.dart"),
|
| + new SystemLibraryPath("dom", "dom/dom_frog.dart"),
|
| + new SystemLibraryPath("html", "html/html_frog.dart"),
|
| + new SystemLibraryPath("isolate", "isolate/isolate_frog.dart"),
|
| + new SystemLibraryPath("uri", "uri/uri.dart"),
|
| + new SystemLibraryPath("json", "json/json_frog.dart"),
|
| + new SystemLibraryPath("utf", "utf/utf.dart"),
|
| + };
|
| +
|
| + static final SystemLibraryPath[] dart2JsImplentation = {
|
| + new SystemLibraryPath("core", "core/core_frog.dart"),
|
| + new SystemLibraryPath("coreimpl", "coreimpl/coreimpl_frog.dart"),
|
| + new SystemLibraryPath("dom", "dom/dom_frog.dart"),
|
| + new SystemLibraryPath("html", "html/html_frog.dart"),
|
| + new SystemLibraryPath("isolate", "isolate/isolate_leg.dart"),
|
| + new SystemLibraryPath("uri", "uri/uri.dart"),
|
| + new SystemLibraryPath("json", "json/json_frog.dart"),
|
| + new SystemLibraryPath("utf", "utf/utf.dart"),
|
| + };
|
| +
|
| + static final SystemLibraryPath[] vmImplementation = {
|
| + new SystemLibraryPath("core", "core/core_runtime.dart"),
|
| + new SystemLibraryPath("coreimpl", "coreimpl/coreimpl_runtime.dart"),
|
| + new SystemLibraryPath("isolate", "isolate/isolate_runtime.dart"),
|
| + new SystemLibraryPath("uri", "uri/uri.dart"),
|
| + new SystemLibraryPath("json", "json/json.dart"),
|
| + new SystemLibraryPath("utf", "utf/utf_vm.dart"),
|
| + new SystemLibraryPath("utf", "io/io_runtime.dart"),
|
| + };
|
| +
|
| + static final SystemLibraryPath[] dartiumImplementation = {
|
| + new SystemLibraryPath("core", "core/core_runtime.dart"),
|
| + new SystemLibraryPath("coreimpl", "coreimpl/coreimpl_runtime.dart"),
|
| + new SystemLibraryPath("isolate", "isolate/isolate_runtime.dart"),
|
| + // TODO(zundel): get real dartium bindings or interfaces for dom
|
| + new SystemLibraryPath("dom", "dom/dom_frog.dart"),
|
| + new SystemLibraryPath("html", "html/html_dartium.dart"),
|
| + new SystemLibraryPath("uri", "uri/uri.dart"),
|
| + new SystemLibraryPath("json", "json/json.dart"),
|
| + new SystemLibraryPath("utf", "utf/utf_vm.dart"),
|
| + };
|
| +
|
| private static final String DART_SCHEME = "dart";
|
| private static final String DART_SCHEME_SPEC = "dart:";
|
|
|
| @@ -63,20 +79,43 @@ public class SystemLibraryManager {
|
| private static final File executionFile = new File(SystemLibraryManager.class
|
| .getProtectionDomain().getCodeSource().getLocation().getPath());
|
|
|
| + public static final String DEFAULT_IMPLEMENTATION = "dartium";
|
| + public static final String DEFAULT_SDK_PATH = System.getProperty("com.google.dart.sdk", "../");
|
| +
|
| private HashMap<String, String> expansionMap;
|
| private Map<String, SystemLibrary> hostMap;
|
| + private final String sdkLibPath;
|
|
|
| private SystemLibrary[] libraries;
|
|
|
| public SystemLibraryManager() {
|
| - setLibraries(getDefaultLibraries());
|
| + this(DEFAULT_SDK_PATH, DEFAULT_IMPLEMENTATION);
|
| + }
|
| +
|
| + public SystemLibraryManager(String dartSdkPath, String implementationName) {
|
| + this.sdkLibPath = dartSdkPath + "/lib";
|
| + SystemLibraryPath[] implementationPaths = null;
|
| + if (implementationName.equals("vm")) {
|
| + implementationPaths = vmImplementation;
|
| + } else if (implementationName.equals("frog")) {
|
| + implementationPaths = frogImplementation;
|
| + } else if (implementationName.equals("dart2js")) {
|
| + implementationPaths = dart2JsImplentation;
|
| + } else if (implementationName.equals("dartium")) {
|
| + implementationPaths = dartiumImplementation;
|
| + } else {
|
| + throw new RuntimeException("Invalid implentation name '" + implementationName +
|
| + "', expected one of vm, dart2js, frog, dartium");
|
| + }
|
| +
|
| + setLibraries(getDefaultLibraries(implementationPaths));
|
| }
|
|
|
| /**
|
| * Expand a relative or short URI (e.g. "dart:dom") which is implementation independent to its
|
| * full URI (e.g. "dart://dom/com/google/dart/domlib/dom.dart") and then translate that URI to
|
| - * either a "file:" or "jar:" URI (e.g.
|
| - * "jar:file:/some/install/director/dom.jar!/com/google/dart/domlib/dom.dart").
|
| + * a "file:" URI (e.g.
|
| + * "file:/some/install/path/com/google/dart/domlib/dom.dart").
|
| *
|
| * @param uri the original URI
|
| * @return the expanded and translated URI, which may be <code>null</code> and may not exist
|
| @@ -84,12 +123,15 @@ public class SystemLibraryManager {
|
| * library
|
| */
|
| public URI resolveDartUri(URI uri) {
|
| + if (uri.isAbsolute()) {
|
| + return URI.create("file://" + uri.getPath());
|
| + }
|
| return translateDartUri(expandRelativeDartUri(uri));
|
| }
|
|
|
| /**
|
| * Translate the URI from dart://[host]/[pathToLib] (e.g. dart://dom/dom.dart)
|
| - * to either a "file:" or "jar:" URI (e.g. "jar:file:/some/install/director/dom.jar!/dom.dart")
|
| + * to a "file:" URI (e.g. "file:/some/install/path/dom.dart")
|
| *
|
| * @param uri the original URI
|
| * @return the translated URI, which may be <code>null</code> and may not exist
|
| @@ -112,10 +154,10 @@ public class SystemLibraryManager {
|
| /**
|
| * Expand a relative or short URI (e.g. "dart:dom") which is implementation independent to its
|
| * full URI (e.g. "dart://dom/com/google/dart/domlib/dom.dart").
|
| - *
|
| + *
|
| * @param uri the relative URI
|
| - * @return the expanded URI
|
| - * or the original URI if it could not be expanded
|
| + * @return the expanded URI
|
| + * or the original URI if it could not be expanded
|
| * or null if the uri is of the form "dart:<libname>" but does not correspond to a system library
|
| */
|
| public URI expandRelativeDartUri(URI uri) throws AssertionError {
|
| @@ -168,148 +210,28 @@ public class SystemLibraryManager {
|
| }
|
| }
|
|
|
| - private File getResource(String name, boolean failOnMissing) {
|
| - URL baseUrl = SystemLibraryManager.class.getClassLoader().getResource(name);
|
| - if (baseUrl == null) {
|
| - if (!failOnMissing) {
|
| - return null;
|
| - }
|
| - throw new RuntimeException("Failed to find the system library: " + name);
|
| - }
|
| - return resolveResource(baseUrl, name);
|
| - }
|
| -
|
| - static private File resolveResource(URL baseUrl, String name) {
|
| - if (baseUrl == null) {
|
| - return null;
|
| - }
|
| - File coreDirOrZip = null;
|
| - String protocol = baseUrl.getProtocol();
|
| - String path = baseUrl.getPath();
|
| - if ("file".equals(protocol)) {
|
| - coreDirOrZip = new File(path.substring(0, path.lastIndexOf(name)));
|
| - } else if ("jar".equals(protocol)) {
|
| - // jar:file://www.foo.com/bar/baz.jar!/com/google/some.class
|
| - if (path.startsWith("file:")) {
|
| - int index = path.indexOf('!');
|
| - coreDirOrZip = new File(path.substring(5, index > 0 ? index : path.length()));
|
| - }
|
| - }
|
| - if (coreDirOrZip == null) {
|
| - throw new RuntimeException("Failed to find system library in " + baseUrl);
|
| - }
|
| - if (!coreDirOrZip.exists()) {
|
| - throw new RuntimeException("System library container does not exist " + coreDirOrZip
|
| - + "\n from " + baseUrl);
|
| - }
|
| - return coreDirOrZip;
|
| - }
|
| -
|
| - private File searchForResource(String searchPath, String libraryName, boolean failOnMissing) {
|
| - URL urlPath = null;
|
| - File sourcePath = new File(searchPath);
|
| -
|
| - /* The source can be a directory or a jar file. Search both for our library. */
|
| - if (sourcePath.isDirectory()) {
|
| - File foundLibrary = new File(sourcePath.getPath() + File.separator + libraryName);
|
| - if (!foundLibrary.exists()) {
|
| - if (failOnMissing) {
|
| - throw new RuntimeException("Failed to find system library " + libraryName + " with "
|
| - + sourcePath.toString());
|
| - }
|
| - return null;
|
| - }
|
| - try {
|
| - urlPath = foundLibrary.toURI().toURL();
|
| - } catch (MalformedURLException e) {
|
| - throw new RuntimeException(e);
|
| - }
|
| - } else if (sourcePath.isFile() && sourcePath.toString().endsWith(".jar")) {
|
| - // Support for jar only right now...
|
| - JarFile jarFile = null;
|
| - try {
|
| - jarFile = new JarFile(sourcePath);
|
| - } catch (IOException e) {
|
| - throw new RuntimeException(e);
|
| - }
|
| - if (null != jarFile.getJarEntry(libraryName)) {
|
| - String path = "jar:file:" + sourcePath.getPath() + "!/" + libraryName;
|
| - try {
|
| - urlPath = new URL(path);
|
| - } catch (MalformedURLException e) {
|
| - throw new RuntimeException(e);
|
| - }
|
| - } else {
|
| - if (failOnMissing) {
|
| - throw new RuntimeException("Failed to find system library " + libraryName + " with "
|
| - + sourcePath.getPath());
|
| - }
|
| - return null;
|
| - }
|
| - }
|
| -
|
| - File foundLibrary = resolveResource(urlPath, libraryName);
|
| - if (foundLibrary == null && failOnMissing) {
|
| - throw new RuntimeException("Failed to find system library " + libraryName + " with "
|
| - + sourcePath.getPath());
|
| - }
|
| - return foundLibrary;
|
| - }
|
| -
|
| protected SystemLibrary locateSystemLibrary(SystemLibraryPath path) {
|
| - // First, check for jars on the class path
|
| - File libraryDirOrZip = getResource(path.lib, path.failIfMissing);
|
| -
|
| - // TODO(codefu): This is a hack. To keep Eclipse happy and to find the
|
| - // sources, we hard code this path. In the future, when the libraries are
|
| - // all gathered into a common "lib/" path, we can search from there.
|
| - if (libraryDirOrZip == null) {
|
| - // Eclipse's executionPath should be a directory, unless a jar file was included.
|
| - String executionPath;
|
| - if (executionFile.isDirectory()) {
|
| - // Universal location of eclipse workspace to the dart source tree is
|
| - // 'dart/compiler/eclipse.workspace/dartc/output'
|
| - // and we need 'dart/client'
|
| - executionPath =
|
| - executionFile.getParent() + File.separator + ".." + File.separator + ".."
|
| - + File.separator + ".." + File.separator + "client";
|
| - } else {
|
| - executionPath = executionFile.getParent() + File.separator + path.jar;
|
| - }
|
| - libraryDirOrZip = searchForResource(executionPath, path.lib, false);
|
| - if (libraryDirOrZip == null && executionFile.isFile()) {
|
| - // Last ditch; are the artifacts just in a flat file...
|
| - libraryDirOrZip = searchForResource(executionFile.getParent(), path.lib, false);
|
| - }
|
| - }
|
| - if (libraryDirOrZip != null) {
|
| - return new SystemLibrary(path.shortName, path.hostName, path.lib,
|
| - libraryDirOrZip);
|
| + File lib = new File(sdkLibPath, path.dartSourceFile);
|
| + if (!lib.exists()) {
|
| + throw new RuntimeException("Failed to find system library dart:" + path.shortName + " in "
|
| + + lib);
|
| }
|
| - return null;
|
| + // TODO(zundel): why pass shortName twice?
|
| + return new SystemLibrary(path.shortName, path.shortName, lib.getAbsolutePath());
|
| }
|
| -
|
| +
|
| /**
|
| - * Answer the libraries that are built into the compiler jar
|
| + * Answer the libraries that are built into the system
|
| */
|
| - protected SystemLibrary[] getDefaultLibraries() {
|
| - ArrayList<SystemLibrary> defaultLibraries = new ArrayList<SystemLibrary>();
|
| - File[] baseFiles = new File[SystemLibraryPath.values().length];
|
| + protected SystemLibrary[] getDefaultLibraries(SystemLibraryPath[] paths) {
|
| + List<SystemLibrary> defaultLibraries = new ArrayList<SystemLibrary>();
|
|
|
| - for (SystemLibraryPath path : SystemLibraryPath.values()) {
|
| - if (path.base != null) {
|
| - defaultLibraries.add(new SystemLibrary(path.shortName, path.hostName, path.lib,
|
| - baseFiles[path.base.ordinal()]));
|
| - baseFiles[path.ordinal()] = baseFiles[path.base.ordinal()];
|
| - } else {
|
| - SystemLibrary library = locateSystemLibrary(path);
|
| - if (library != null) {
|
| - defaultLibraries.add(library);
|
| - baseFiles[path.ordinal()] = library.getFile();
|
| - }
|
| + for (SystemLibraryPath path : paths) {
|
| + SystemLibrary library = locateSystemLibrary(path);
|
| + if (library != null) {
|
| + defaultLibraries.add(library);
|
| }
|
| }
|
| -
|
| return defaultLibraries.toArray(new SystemLibrary[defaultLibraries.size()]);
|
| }
|
| }
|
|
|