Hi Xav,

I've been able to track down the exact problem. It's a confluence of Groovy 
quirks/bugs and a mistake on our side. I'm still working through how we want to 
fix it and will post the JIRA issue explaining the situation when I'm done.

In the meantime, the workaround is to make sure all your arguments have the 
correct runtime type when calling this method. That is, ensure all the 
variables you are passing to downloadFile() are declared with types. Also if 
you are passing Groovy Strings (e.g. "$foo bar") you have to call toString() on 
it when passing.

This workaround won't be necessary in 1.8.

On 07/08/2013, at 4:28 PM, Xavier Ducrohet <x...@google.com> wrote:

> Hey Luke,
> 
> the method signature is
> 
>     private File downloadFile(String, String, String, File, boolean, boolean) 
> throws IOException;
> 
> 
> 
> 
> On Wed, Aug 7, 2013 at 5:25 AM, Luke Daley <luke.da...@gradleware.com> wrote:
> 
> On 07/08/2013, at 8:57 AM, Luke Daley <l...@ldaley.com> wrote:
> 
> >
> >
> > On 07/08/2013, at 8:04, Luke Daley <l...@ldaley.com> wrote:
> >
> >> Are you able to share the exact code?
> >>
> >> I think I know what this is but need to see the code.
> >
> > Nevermind, I have enough.
> 
> Actually… I do need to see the param types and values :)
> 
> I've tracked the issue down, and it's very dependent on the types used. I 
> want to make sure it's the same thing, and need this info to confirm.
> 
> >
> >> On 07/08/2013, at 1:51, Xavier Ducrohet <x...@google.com> wrote:
> >>
> >>> I just encountered something very very strange in 1.7.
> >>>
> >>> I rarely run this code, but I ran it on 1.6 with no issue. I'm trying to 
> >>> run it with 1.7 (to update some of our local prebuilts to update to 1.7) 
> >>> and it's failing with something that makes no sense.
> >>>
> >>> I have a Groovy class that extends DefaultTask and looks something like 
> >>> this:
> >>>
> >>> class DownloadArtifactsTask extends DefaultTask {
> >>>   @TaskAction
> >>>   void something() {
> >>>     pullArtifact(...);
> >>>   }
> >>>
> >>>   private void pullArtifact(...) {
> >>>     try {
> >>>       downloadFile(...)
> >>>     } catch (IOException e2) {
> >>>       // ignore
> >>>     }
> >>>   }
> >>>
> >>>   private File downloadFile(...) throws IOException {
> >>>     if (...) {
> >>>       throw new IOException(...);
> >>>     }
> >>>   }
> >>> }
> >>>
> >>>
> >>> What happens is that when downloadFile throws an IOException, it's not 
> >>> caught in pullArtifact. I was really confused at first. So I put a catch 
> >>> on Throwable, and noticed that my original exception was encapsulated in 
> >>> a GradleException.
> >>>
> >>> Nothing in my code does this obviously. The stack trace looks like this:
> >>>
> >>> org.gradle.api.GradleException: Could not call 
> >>> DownloadArtifactsTask.downloadFile() on task ':downloadArtifacts'
> >>>     at org.gradle.util.JavaMethod.invoke(JavaMethod.java:69)
> >>>     at 
> >>> org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:295)
> >>>     at 
> >>> org.gradle.api.internal.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:136)
> >>>     at 
> >>> org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:147)
> >>>     at 
> >>> com.android.build.gradle.buildsrc.DownloadArtifactsTask_Decorated.invokeMethod(Unknown
> >>>  Source)
> >>>     at 
> >>> org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.call(PogoInterceptableSite.java:45)
> >>>     at 
> >>> org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.callCurrent(PogoInterceptableSite.java:55)
> >>>     at 
> >>> com.android.build.gradle.buildsrc.DownloadArtifactsTask.pullArtifact(DownloadArtifactsTask.groovy:204)
> >>>         ....
> >>> Caused by: java.io.FileNotFoundException: http://xxx
> >>>     at 
> >>> sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1434)
> >>>     at java.net.URL.openStream(URL.java:1010)
> >>>     at org.apache.commons.io.FileUtils.copyURLToFile(FileUtils.java:844)
> >>>     at org.apache.commons.io.FileUtils$copyURLToFile.call(Unknown Source)
> >>>     at 
> >>> com.android.build.gradle.buildsrc.DownloadArtifactsTask.downloadFile(DownloadArtifactsTask.groovy:256)
> >>>
> >>>
> >>> DownloadArtifactsTask.groovy:204 is where downloadFile() is called.
> >>>
> >>> Anyone has a clue?
> 
> --
> Luke Daley
> Principal Engineer, Gradleware
> http://gradleware.com
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
> 
>     http://xircles.codehaus.org/manage_email
> 
> 
> 

-- 
Luke Daley
Principal Engineer, Gradleware 
http://gradleware.com


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to