diff --git a/src/main/java/de/thetaphi/forbiddenapis/Checker.java b/src/main/java/de/thetaphi/forbiddenapis/Checker.java index aac8dbb0..a88d1c4b 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/Checker.java +++ b/src/main/java/de/thetaphi/forbiddenapis/Checker.java @@ -405,6 +405,11 @@ public final void parseSignaturesFile(InputStream in) throws IOException,ParseEx parseSignaturesFile(in, false); } + /** Reads a list of API signatures from the given URL. */ + public final void parseSignaturesFile(URL url) throws IOException,ParseException { + parseSignaturesFile(url.openStream()); + } + /** Reads a list of API signatures from the given file. */ public final void parseSignaturesFile(File f) throws IOException,ParseException { parseSignaturesFile(new FileInputStream(f)); diff --git a/src/main/java/de/thetaphi/forbiddenapis/gradle/CheckForbiddenApis.java b/src/main/java/de/thetaphi/forbiddenapis/gradle/CheckForbiddenApis.java index 4f0cff4d..0c4cb5ca 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/gradle/CheckForbiddenApis.java +++ b/src/main/java/de/thetaphi/forbiddenapis/gradle/CheckForbiddenApis.java @@ -34,6 +34,7 @@ import org.gradle.api.DefaultTask; import org.gradle.api.GradleException; +import org.gradle.api.Incubating; import org.gradle.api.InvalidUserDataException; import org.gradle.api.file.FileCollection; import org.gradle.api.file.FileTree; @@ -163,6 +164,26 @@ public void setSignaturesFiles(FileCollection signaturesFiles) { data.signaturesFiles = signaturesFiles; } + /** + * A list of references to URLs, which contain signatures and comments for forbidden API calls. + * The signatures are resolved against {@link #getClasspath()}. + *

+ * This property is useful to refer to resources in plugin classpath, e.g., using + * {@link Class#getResource(String)}. It is not useful for general gradle builds. Especially, + * don't use it to refer to resources on foreign servers! + */ + @Input + @Optional + @Incubating + public List getSignaturesURLs() { + return data.signaturesURLs; + } + + /** @see #getSignaturesURLs */ + public void setSignaturesURLs(List signaturesURLs) { + data.signaturesURLs = signaturesURLs; + } + /** * Gives multiple API signatures that are joined with newlines and * parsed like a single {@link #getSignaturesFiles()}. @@ -505,6 +526,11 @@ public void info(String msg) { log.info("Reading API signatures: " + f); checker.parseSignaturesFile(f); } + final List signaturesURLs = getSignaturesURLs(); + if (signaturesURLs != null) for (final URL url : signaturesURLs) { + log.info("Reading API signatures: " + url); + checker.parseSignaturesFile(url); + } } catch (IOException ioe) { throw new ResourceException("IO problem while reading files with API signatures.", ioe); } catch (ParseException pe) { diff --git a/src/main/java/de/thetaphi/forbiddenapis/gradle/CheckForbiddenApisExtension.java b/src/main/java/de/thetaphi/forbiddenapis/gradle/CheckForbiddenApisExtension.java index 1049f5ad..a08d79ed 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/gradle/CheckForbiddenApisExtension.java +++ b/src/main/java/de/thetaphi/forbiddenapis/gradle/CheckForbiddenApisExtension.java @@ -16,6 +16,7 @@ * limitations under the License. */ +import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -33,6 +34,7 @@ public class CheckForbiddenApisExtension { /** Fields used for the convention mapping, keep up-to-date with class members! */ static final List PROPS = Arrays.asList( "signaturesFiles", + "signaturesURLs", "signatures", "bundledSignatures", "suppressAnnotations", @@ -44,6 +46,7 @@ public class CheckForbiddenApisExtension { ); public FileCollection signaturesFiles; + public List signaturesURLs = new ArrayList(); public List signatures = new ArrayList(), bundledSignatures = new ArrayList(), suppressAnnotations = new ArrayList();