summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYohann Roussel <yroussel@google.com>2014-11-20 11:47:03 +0100
committerYohann Roussel <yroussel@google.com>2014-11-21 16:56:08 +0000
commit06e3d7bd48713308e9a742dfae7080b7112ef654 (patch)
treeffaa52f445bd2eb5e752c33c4ed2d5aaf2cb7a49
parentc9be1c224cdbd52aa34aab203199d62fca16f296 (diff)
downloadtoolchain_jack-06e3d7bd48713308e9a742dfae7080b7112ef654.zip
toolchain_jack-06e3d7bd48713308e9a742dfae7080b7112ef654.tar.gz
toolchain_jack-06e3d7bd48713308e9a742dfae7080b7112ef654.tar.bz2
Do not fail because of bad classpath entry
Just warn unless option for strict classpath is set. Bug: 18369562 Change-Id: I82abef63b78a9291fd6a68081b033a25c9d23e2f
-rw-r--r--jack-tests/tests/com/android/jack/classpath/test004/jack/Classpath004.java21
-rw-r--r--jack-tests/tests/com/android/jack/classpath/test004/jack/invalid.jackbin0 -> 283 bytes
-rw-r--r--jack-tests/tests/com/android/jack/classpath/test004/jack/notjack.zipbin0 -> 618 bytes
-rw-r--r--jack/src/com/android/jack/Jack.java45
-rw-r--r--jack/tests/com/android/jack/ClasspathTest.java54
5 files changed, 117 insertions, 3 deletions
diff --git a/jack-tests/tests/com/android/jack/classpath/test004/jack/Classpath004.java b/jack-tests/tests/com/android/jack/classpath/test004/jack/Classpath004.java
new file mode 100644
index 0000000..075af20
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/classpath/test004/jack/Classpath004.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.classpath.test004.jack;
+
+public class Classpath004 {
+
+}
diff --git a/jack-tests/tests/com/android/jack/classpath/test004/jack/invalid.jack b/jack-tests/tests/com/android/jack/classpath/test004/jack/invalid.jack
new file mode 100644
index 0000000..3a1084c
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/classpath/test004/jack/invalid.jack
Binary files differ
diff --git a/jack-tests/tests/com/android/jack/classpath/test004/jack/notjack.zip b/jack-tests/tests/com/android/jack/classpath/test004/jack/notjack.zip
new file mode 100644
index 0000000..2b145d3
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/classpath/test004/jack/notjack.zip
Binary files differ
diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java
index be369ab..cb06b20 100644
--- a/jack/src/com/android/jack/Jack.java
+++ b/jack/src/com/android/jack/Jack.java
@@ -104,6 +104,7 @@ import com.android.jack.optimizations.UnusedDefinitionRemover;
import com.android.jack.optimizations.UseDefsChainsSimplifier;
import com.android.jack.preprocessor.PreProcessor;
import com.android.jack.preprocessor.PreProcessorApplier;
+import com.android.jack.reporting.Reportable;
import com.android.jack.reporting.Reporter.Severity;
import com.android.jack.resource.LibraryResourceWriter;
import com.android.jack.resource.ResourceImporter;
@@ -265,6 +266,7 @@ import com.android.sched.util.config.ConfigurationException;
import com.android.sched.util.config.HasKeyId;
import com.android.sched.util.config.ReflectFactory;
import com.android.sched.util.config.ThreadConfig;
+import com.android.sched.util.config.id.BooleanPropertyId;
import com.android.sched.util.config.id.ObjectId;
import com.android.sched.util.config.id.ReflectFactoryPropertyId;
import com.android.sched.util.file.Directory;
@@ -302,6 +304,27 @@ import javax.annotation.Nonnull;
*/
@HasKeyId
public abstract class Jack {
+ private static final class ClasspathEntryIgnoredReportable implements Reportable {
+ @Nonnull
+ private final Exception cause;
+
+ private ClasspathEntryIgnoredReportable(@Nonnull Exception cause) {
+ this.cause = cause;
+ }
+
+ @Override
+ @Nonnull
+ public String getMessage() {
+ return "Bad classpath entry ignored: " + cause.getMessage();
+ }
+
+ @Override
+ @Nonnull
+ public ProblemLevel getDefaultProblemLevel() {
+ return ProblemLevel.WARNING;
+ }
+ }
+
static {
LoggerFactory.loadLoggerConfiguration(Jack.class, "/initial.logging.properties");
}
@@ -348,6 +371,11 @@ public abstract class Jack {
.addDefaultValue("full");
@Nonnull
+ public static final BooleanPropertyId STRICT_CLASSPATH = BooleanPropertyId.create(
+ "jack.classpath.strict", "Do not ignore missing or malformed class path entries")
+ .addDefaultValue(Boolean.FALSE);
+
+ @Nonnull
public static JSession getSession() {
return ThreadConfig.get(Jack.SESSION);
}
@@ -811,10 +839,21 @@ public abstract class Jack {
session.getTopLevelPackage().addLoader(rootPLoader);
session.addLibraryOnClasspath(inputJackLibrary);
} catch (IOException ioException) {
- // Ignore bad entry
- logger.log(Level.WARNING, "Bad classpath entry ignored: {0}", ioException.getMessage());
+ if (ThreadConfig.get(STRICT_CLASSPATH).booleanValue()) {
+ throw new LibraryReadingException(ioException);
+ } else {
+ // Ignore bad entry
+ session.getReporter().report(Severity.NON_FATAL,
+ new ClasspathEntryIgnoredReportable(ioException));
+ }
} catch (LibraryException e) {
- throw new LibraryReadingException(e);
+ if (ThreadConfig.get(STRICT_CLASSPATH).booleanValue()) {
+ throw new LibraryReadingException(e);
+ } else {
+ // Ignore bad entry
+ session.getReporter().report(Severity.NON_FATAL,
+ new ClasspathEntryIgnoredReportable(e));
+ }
}
}
}
diff --git a/jack/tests/com/android/jack/ClasspathTest.java b/jack/tests/com/android/jack/ClasspathTest.java
index 3870062..021c81e 100644
--- a/jack/tests/com/android/jack/ClasspathTest.java
+++ b/jack/tests/com/android/jack/ClasspathTest.java
@@ -17,6 +17,7 @@
package com.android.jack;
import com.android.jack.library.FileType;
+import com.android.jack.library.LibraryReadingException;
import junit.framework.Assert;
@@ -24,6 +25,7 @@ import org.junit.BeforeClass;
import org.junit.Test;
import java.io.File;
+import java.io.IOException;
public class ClasspathTest {
@@ -153,4 +155,56 @@ public class ClasspathTest {
TestTools.compileSourceToJack(
new Options(), sourceDir3, classpath, mainOut, true);
}
+
+ @Test
+ public void testMissingClasspathEntry() throws Exception {
+ String defaultClasspath = TestTools.getDefaultBootclasspathString();
+ File srcDir = TestTools.getJackTestsWithJackFolder("classpath/test004");
+ String classpathWithMissingEntry = defaultClasspath + File.pathSeparator +
+ new File(srcDir, "missing.jack").getAbsolutePath();
+
+ File testOut = TestTools.createTempFile("ClasspathTest", "missing");
+ TestTools.compileSourceToJack(new Options(), srcDir, classpathWithMissingEntry,
+ testOut, true);
+
+ Options strict = new Options();
+ strict.addProperty(Jack.STRICT_CLASSPATH.getName(), "true");
+ try {
+ TestTools.compileSourceToJack(strict, srcDir, classpathWithMissingEntry,
+ testOut, true);
+ Assert.fail();
+ } catch (JackAbortException e) {
+ Assert.assertTrue(e.getCause() instanceof LibraryReadingException);
+ }
+ }
+
+ @Test
+ public void testInvalidClasspathEntry() throws Exception {
+ File srcDir = TestTools.getJackTestsWithJackFolder("classpath/test004");
+ compileWithInvalidClasspathEntry(srcDir, new File(srcDir, "Classpath004.java"));
+ compileWithInvalidClasspathEntry(srcDir, new File(srcDir, "invalid.jack"));
+ compileWithInvalidClasspathEntry(srcDir, new File(srcDir, "notjack.zip"));
+ }
+
+ private void compileWithInvalidClasspathEntry(File srcDir, File invalidJack) throws IOException,
+ Exception {
+ Assert.assertTrue(invalidJack.isFile());
+ String classpathWithInvalidEntry = TestTools.getDefaultBootclasspathString() +
+ File.pathSeparator + invalidJack.getAbsolutePath();
+
+ File testOut = TestTools.createTempFile("ClasspathTest", "invalid");
+ TestTools.compileSourceToJack(new Options(), srcDir, classpathWithInvalidEntry,
+ testOut, true);
+
+ Options strict = new Options();
+ strict.addProperty(Jack.STRICT_CLASSPATH.getName(), "true");
+ try {
+ TestTools.compileSourceToJack(strict, srcDir, classpathWithInvalidEntry,
+ testOut, true);
+ Assert.fail();
+ } catch (JackAbortException e) {
+ Assert.assertTrue(e.getCause() instanceof LibraryReadingException);
+ }
+ }
+
}