diff options
8 files changed, 92 insertions, 37 deletions
diff --git a/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java b/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java index dd81936..7f8a360 100644 --- a/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java +++ b/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java @@ -20,13 +20,13 @@ import com.android.jack.JackAbortException; import com.android.jack.JackUserException; import com.android.jack.Main; import com.android.jack.backend.jayce.JayceFileImporter; -import com.android.jack.frontend.FrontendCompilationException; import com.android.jack.library.LibraryIOException; import com.android.jack.library.LibraryReadingException; -import com.android.jack.load.JackLoadingException; import com.android.jack.test.helper.ErrorTestHelper; import com.android.jack.test.toolchain.AbstractTestTools; import com.android.jack.test.toolchain.JackApiToolchain; +import com.android.sched.util.codec.ListParsingException; +import com.android.sched.util.codec.ParsingException; import com.android.sched.util.config.PropertyIdException; import com.android.sched.util.file.WrongPermissionException; @@ -114,12 +114,13 @@ public class FileAccessErrorTest { .srcToExe( helper.getOutputDexFolder(), /* zipFile = */ false, helper.getSourceFolder()); Assert.fail(); - } catch (JackAbortException e) { + } catch (PropertyIdException e) { // Failure is ok since Jack file could not be imported since folder is not readable - Assert.assertTrue(e.getCause() instanceof LibraryReadingException); - Assert.assertTrue(e.getCause().getCause() instanceof WrongPermissionException); + Assert.assertTrue(e.getCause() instanceof ListParsingException); + Assert.assertTrue(e.getCause().getCause() instanceof ParsingException); + Assert.assertTrue(e.getCause().getCause().getCause() instanceof WrongPermissionException); } finally { - Assert.assertTrue("", errOut.toString().contains("is not readable")); + Assert.assertTrue(errOut.toString().isEmpty()); if (!helper.getJackFolder().setReadable(true)) { Assert.fail("Fails to change file permissions of " + helper.getJackFolder().getAbsolutePath()); } diff --git a/jack/src/com/android/jack/Options.java b/jack/src/com/android/jack/Options.java index 0b403cb..ca561e4 100644 --- a/jack/src/com/android/jack/Options.java +++ b/jack/src/com/android/jack/Options.java @@ -16,6 +16,7 @@ package com.android.jack; +import com.google.common.base.Joiner; import com.google.common.io.Files; import com.android.jack.backend.dex.DexFileWriter; @@ -27,6 +28,8 @@ import com.android.jack.config.id.JavaVersionPropertyId; import com.android.jack.config.id.Private; import com.android.jack.incremental.InputFilter; import com.android.jack.ir.ast.JMethod; +import com.android.jack.library.InputJackLibrary; +import com.android.jack.library.InputJackLibraryCodec; import com.android.jack.shrob.obfuscation.MappingPrinter; import com.android.jack.shrob.obfuscation.NameProviderFactory; import com.android.jack.shrob.obfuscation.Renamer; @@ -51,6 +54,7 @@ import com.android.sched.util.config.HasKeyId; import com.android.sched.util.config.id.BooleanPropertyId; import com.android.sched.util.config.id.EnumPropertyId; import com.android.sched.util.config.id.ImplementationPropertyId; +import com.android.sched.util.config.id.ListPropertyId; import com.android.sched.util.config.id.ObjectId; import com.android.sched.util.config.id.PropertyId; import com.android.sched.util.config.id.ReflectFactoryPropertyId; @@ -173,6 +177,10 @@ public class Options { DEX_OUTPUT_CONTAINER_TYPE.is(Container.ZIP)); @Nonnull + public static final ListPropertyId<InputJackLibrary> IMPORTED_LIBRARIES = ListPropertyId.create( + "jack.library.import", "Libraries to import", "jacklib", new InputJackLibraryCodec()); + + @Nonnull public static final BooleanPropertyId ENABLE_COMPILED_FILES_STATISTICS = BooleanPropertyId.create( "jack.statistic.source", "Enable compiled files statistics").addDefaultValue( Boolean.FALSE); @@ -619,6 +627,10 @@ public class Options { configBuilder.set( CodeItemBuilder.EMIT_SYNTHETIC_LOCAL_DEBUG_INFO, emitSyntheticDebugInfo); + if (importedLibraries != null) { + configBuilder.setString(IMPORTED_LIBRARIES, Joiner.on(',').join(importedLibraries)); + } + if (libraryOutZip != null) { configBuilder.setString(LIBRARY_OUTPUT_ZIP, libraryOutZip.getPath()); configBuilder.set(LIBRARY_OUTPUT_CONTAINER_TYPE, Container.ZIP); @@ -873,11 +885,6 @@ public class Options { this.sanityChecks = sanityChecks; } - @Nonnull - public List<File> getImportedLibraries() { - return importedLibraries; - } - @CheckForNull public File getIncrementalFolder() { return incrementalFolder; diff --git a/jack/src/com/android/jack/analysis/dependency/library/LibraryDependencies.java b/jack/src/com/android/jack/analysis/dependency/library/LibraryDependencies.java index a5ebbe2..1e9f9a2 100644 --- a/jack/src/com/android/jack/analysis/dependency/library/LibraryDependencies.java +++ b/jack/src/com/android/jack/analysis/dependency/library/LibraryDependencies.java @@ -47,13 +47,13 @@ public class LibraryDependencies extends Dependency { @Nonnull private List<String> librariesOnClasspathDexDigest = new ArrayList<String>(); - public void addImportedLibraries(@Nonnull List<InputLibrary> importedLibraries) { + public void addImportedLibraries(@Nonnull List<? extends InputLibrary> importedLibraries) { for (InputLibrary inputLibrary : importedLibraries) { importedLibrariesDexDigest.add(inputLibrary.getDigest()); } } - public void addLibrariesOnClasspath(@Nonnull List<InputLibrary> librariesOnClasspath) { + public void addLibrariesOnClasspath(@Nonnull List<? extends InputLibrary> librariesOnClasspath) { for (InputLibrary inputLibrary : librariesOnClasspath) { librariesOnClasspathDexDigest.add(inputLibrary.getDigest()); } diff --git a/jack/src/com/android/jack/incremental/IncrementalInputFilter.java b/jack/src/com/android/jack/incremental/IncrementalInputFilter.java index 764830c..8d3345f 100644 --- a/jack/src/com/android/jack/incremental/IncrementalInputFilter.java +++ b/jack/src/com/android/jack/incremental/IncrementalInputFilter.java @@ -143,10 +143,10 @@ public class IncrementalInputFilter extends CommonFilter implements InputFilter private final Set<String> filesToRecompile; @Nonnull - private final List<InputLibrary> importedLibrariesFromCommandLine; + private final List<? extends InputLibrary> importedLibrariesFromCommandLine; @Nonnull - private final List<InputLibrary> librariesOnClasspathFromCommandLine; + private final List<? extends InputLibrary> librariesOnClasspathFromCommandLine; public IncrementalInputFilter(@Nonnull Options options, @Nonnull RunnableHooks hooks) { super(hooks); @@ -180,8 +180,7 @@ public class IncrementalInputFilter extends CommonFilter implements InputFilter fillDeletedFileNames(deletedFileNames); } - importedLibrariesFromCommandLine = - getInputLibrariesFromFiles(options.getImportedLibraries(), true); + importedLibrariesFromCommandLine = ThreadConfig.get(Options.IMPORTED_LIBRARIES); librariesOnClasspathFromCommandLine = getInputLibrariesFromFiles(options.getClasspath(), ThreadConfig.get(Jack.STRICT_CLASSPATH).booleanValue()); session.getLibraryDependencies().addImportedLibraries(importedLibrariesFromCommandLine); @@ -200,7 +199,7 @@ public class IncrementalInputFilter extends CommonFilter implements InputFilter session.getLibraryDependencies()) ? "identical" : "modified") + ")", session.getLibraryDependencies().getDigestOfLibrariesOnClasspath()); - incLog.writeFiles("import", options.getImportedLibraries()); + incLog.writeLibraryDescriptions("import", importedLibrariesFromCommandLine); incLog.writeStrings("import digests (" + (libraryDependencies.hasSameImportedLibrary( session.getLibraryDependencies()) ? "identical" : "modified") + ")", @@ -220,7 +219,7 @@ public class IncrementalInputFilter extends CommonFilter implements InputFilter @Override @Nonnull - public List<InputLibrary> getClasspath() { + public List<? extends InputLibrary> getClasspath() { return librariesOnClasspathFromCommandLine; } diff --git a/jack/src/com/android/jack/incremental/IncrementalLogWriter.java b/jack/src/com/android/jack/incremental/IncrementalLogWriter.java index 1b16af3..643da6c 100644 --- a/jack/src/com/android/jack/incremental/IncrementalLogWriter.java +++ b/jack/src/com/android/jack/incremental/IncrementalLogWriter.java @@ -22,6 +22,7 @@ import com.google.common.collect.Collections2; import com.android.jack.library.FileType; import com.android.jack.library.FileTypeDoesNotExistException; +import com.android.jack.library.InputLibrary; import com.android.jack.library.LibraryIOException; import com.android.jack.library.OutputJackLibrary; import com.android.sched.util.file.CannotCreateFileException; @@ -101,4 +102,14 @@ class IncrementalLogWriter { ps.print(str); ps.println(); } + + void writeLibraryDescriptions(@Nonnull String prefixStr, + @Nonnull Collection<? extends InputLibrary> libraries) { + writeStrings(prefixStr, Collections2.transform(libraries, new Function<InputLibrary, String>() { + @Override + public String apply(InputLibrary library) { + return library.getLocation().getDescription(); + } + })); + } } diff --git a/jack/src/com/android/jack/incremental/InputFilter.java b/jack/src/com/android/jack/incremental/InputFilter.java index 78b0d25..8f0e700 100644 --- a/jack/src/com/android/jack/incremental/InputFilter.java +++ b/jack/src/com/android/jack/incremental/InputFilter.java @@ -33,11 +33,11 @@ public interface InputFilter { public Set<String> getFileNamesToCompile(); @Nonnull - public List<InputLibrary> getClasspath(); + public List<? extends InputLibrary> getClasspath(); @Nonnull public OutputJackLibrary getOutputJackLibrary(); @Nonnull - public List<InputLibrary> getImportedLibrary(); + public List<? extends InputLibrary> getImportedLibrary(); } diff --git a/jack/src/com/android/jack/incremental/NoInputFilter.java b/jack/src/com/android/jack/incremental/NoInputFilter.java index 2556dd4..1608903 100644 --- a/jack/src/com/android/jack/incremental/NoInputFilter.java +++ b/jack/src/com/android/jack/incremental/NoInputFilter.java @@ -46,10 +46,10 @@ public class NoInputFilter extends CommonFilter implements InputFilter { private final Options options; @Nonnull - private final List<InputLibrary> importedLibrariesFromCommandLine; + private final List<? extends InputLibrary> importedLibrariesFromCommandLine; @Nonnull - private final List<InputLibrary> librariesOnClasspathFromCommandLine; + private final List<? extends InputLibrary> librariesOnClasspathFromCommandLine; public NoInputFilter(@Nonnull Options options, @Nonnull RunnableHooks hooks) { super(hooks); @@ -58,8 +58,7 @@ public class NoInputFilter extends CommonFilter implements InputFilter { JSession session = Jack.getSession(); session.setFileDependencies(new FileDependencies()); session.setTypeDependencies(new TypeDependencies()); - importedLibrariesFromCommandLine = - getInputLibrariesFromFiles(options.getImportedLibraries(), true); + importedLibrariesFromCommandLine = ThreadConfig.get(Options.IMPORTED_LIBRARIES); librariesOnClasspathFromCommandLine = getInputLibrariesFromFiles(options.getClasspath(), ThreadConfig.get(Jack.STRICT_CLASSPATH).booleanValue()); LibraryDependencies libraryDependencies = session.getLibraryDependencies(); @@ -75,13 +74,13 @@ public class NoInputFilter extends CommonFilter implements InputFilter { @Override @Nonnull - public List<InputLibrary> getClasspath() { + public List<? extends InputLibrary> getClasspath() { return librariesOnClasspathFromCommandLine; } @Override @Nonnull - public List<InputLibrary> getImportedLibrary() { + public List<? extends InputLibrary> getImportedLibrary() { return importedLibrariesFromCommandLine; } diff --git a/jack/src/com/android/jack/library/InputJackLibraryCodec.java b/jack/src/com/android/jack/library/InputJackLibraryCodec.java index 04ddfc0..62c6fb5 100644 --- a/jack/src/com/android/jack/library/InputJackLibraryCodec.java +++ b/jack/src/com/android/jack/library/InputJackLibraryCodec.java @@ -17,15 +17,30 @@ package com.android.jack.library; import com.android.jack.LibraryException; +import com.android.sched.util.RunnableHooks; import com.android.sched.util.codec.CodecContext; -import com.android.sched.util.codec.DirectFSCodec; import com.android.sched.util.codec.ParsingException; import com.android.sched.util.codec.StringCodec; import com.android.sched.util.config.ConfigurationError; +import com.android.sched.util.file.CannotCreateFileException; +import com.android.sched.util.file.CannotSetPermissionException; +import com.android.sched.util.file.Directory; +import com.android.sched.util.file.FileAlreadyExistsException; +import com.android.sched.util.file.FileOrDirectory.ChangePermission; +import com.android.sched.util.file.FileOrDirectory.Existence; +import com.android.sched.util.file.FileOrDirectory.Permission; +import com.android.sched.util.file.InputZipFile; +import com.android.sched.util.file.NoSuchFileException; +import com.android.sched.util.file.NotFileOrDirectoryException; +import com.android.sched.util.file.WrongPermissionException; +import com.android.sched.vfs.DirectFS; +import com.android.sched.vfs.ReadZipFS; import com.android.sched.vfs.VFS; +import java.io.File; import java.util.Collections; import java.util.List; +import java.util.zip.ZipException; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -34,12 +49,6 @@ import javax.annotation.Nonnull; * This {@link StringCodec} is used to create an instance of {@link InputJackLibrary}. */ public class InputJackLibraryCodec implements StringCodec<InputJackLibrary> { - @Nonnull - private final DirectFSCodec codec; - - public InputJackLibraryCodec() { - codec = new DirectFSCodec(); - } @Override @Nonnull @@ -55,19 +64,48 @@ public class InputJackLibraryCodec implements StringCodec<InputJackLibrary> { @CheckForNull public InputJackLibrary checkString(@Nonnull CodecContext context, @Nonnull String string) throws ParsingException { - VFS vfs = codec.checkString(context, string); - try { + VFS vfs; + File dirOrZip = new File(string); + if (dirOrZip.isDirectory()) { + vfs = new DirectFS(new Directory(string, context.getRunnableHooks(), Existence.MUST_EXIST, + Permission.READ | Permission.WRITE, ChangePermission.NOCHANGE), + Permission.READ | Permission.WRITE); + } else { + RunnableHooks hooks = context.getRunnableHooks(); + assert hooks != null; + vfs = new ReadZipFS( + new InputZipFile(string, hooks, Existence.MUST_EXIST, ChangePermission.NOCHANGE)); + } + return JackLibraryFactory.getInputLibrary(vfs); } catch (LibraryException e) { throw new ParsingException(e.getMessage(), e); + } catch (NotFileOrDirectoryException e) { + // we already checked it this was a dir or a file + throw new AssertionError(e); + } catch (FileAlreadyExistsException e) { + // the file or dir already exists + throw new AssertionError(e); + } catch (CannotCreateFileException e) { + // the file or dir already exists + throw new AssertionError(e); + } catch (CannotSetPermissionException e) { + // we're not changing the permissions + throw new AssertionError(e); + } catch (WrongPermissionException e) { + throw new ParsingException(e.getMessage(), e); + } catch (NoSuchFileException e) { + throw new ParsingException(e.getMessage(), e); + } catch (ZipException e) { + throw new ParsingException(e.getMessage(), e); } } @Override @Nonnull public String getUsage() { - return "a path to a jack library (" + codec.getUsageDetails() + ")"; + return "a path to a jack library"; } @Override |