summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java13
-rw-r--r--jack/src/com/android/jack/Options.java17
-rw-r--r--jack/src/com/android/jack/analysis/dependency/library/LibraryDependencies.java4
-rw-r--r--jack/src/com/android/jack/incremental/IncrementalInputFilter.java11
-rw-r--r--jack/src/com/android/jack/incremental/IncrementalLogWriter.java11
-rw-r--r--jack/src/com/android/jack/incremental/InputFilter.java4
-rw-r--r--jack/src/com/android/jack/incremental/NoInputFilter.java11
-rw-r--r--jack/src/com/android/jack/library/InputJackLibraryCodec.java58
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