The mentioned configuration on demand problem seems affect everything even
Android projects. Even worse: The following exception is thrown for me:
"org.gradle.tooling.provider.model.UnknownModelException: No builders are
available to build a model of type 'org.gradle.tooling.model.GradleBuild'."
This means that calling `getBuildModel` is impossible.


2013/9/1 Kelemen Attila <attila.keleme...@gmail.com>

> I couldn't determine why Alex can load IdeaModule and why I can't.
> However, I won't need it because I have successfully implemented arbitrary,
> dynamically added model loading (I can workaround the problem even if not
> using this).
>
> Also, there is a *lot* bigger issue: When using configuration on demand,
> `ToolingModelBuilder.buildAll` is called with an unevaluated project
> instance. This is a blocking issue for me.
>
>
> 2013/8/31 Kelemen Attila <attila.keleme...@gmail.com>
>
>> Thank you, I have tested loading AndroidProject and it is loaded fine.
>> That is, it was loaded with a different ClassLoader than the BuildAction
>> and was transferred to me successfully.
>>
>> However findModel still returns null for me when calling it with
>> IdeaModule.class, however IdeaProject.class works despite that Adam said it
>> shouldn't. I will investigate it further.
>>
>>
>> 2013/8/31 alex.ruiz.05 [via Gradle] <
>> ml-node+s1045684n5711783...@n5.nabble.com>
>>
>>  Attila, I just sent you the files via a separate e-mail.
>>>
>>>
>>> On Fri, Aug 30, 2013 at 10:10 PM, Alex Ruiz <[hidden 
>>> email]<http://user/SendEmail.jtp?type=node&node=5711783&i=0>
>>> > wrote:
>>>
>>>> Attila, I am able to use IdeaModule as parameter. Here is the code for
>>>> my BuildAction. It works perfectly within Studio (I haven't measured
>>>> performance yet though.) Also note that I don't make another call to Gradle
>>>> to find an AndroidProject, I just check for task names, it is cheap.
>>>>
>>>> Yes, the Android Gradle plug-in will complain that it does not support
>>>> Gradle 1.8. I grabbed the source, removed that check and publish it in my
>>>> local repo. I'll send you the zip with the files directly to you using my
>>>> personal GMail account.
>>>>
>>>> public class ProjectImportAction implements
>>>> BuildAction<ProjectImportAction.AllModels>, Serializable {
>>>>   @NonNls private static final String ANDROID_TASK_NAME_PREFIX =
>>>> "android";
>>>>
>>>>   @Nullable
>>>>   @Override
>>>>   public AllModels execute(BuildController controller) {
>>>>     IdeaProject ideaProject = controller.getModel(IdeaProject.class);
>>>>     if (ideaProject == null || ideaProject.getModules().isEmpty()) {
>>>>       return null;
>>>>     }
>>>>
>>>>     AllModels allModels = new AllModels(ideaProject);
>>>>
>>>>     for (IdeaModule module : ideaProject.getModules()) {
>>>>       if (isAndroidProject(module)) {
>>>>         AndroidProject androidProject = controller.getModel(module,
>>>> AndroidProject.class);
>>>>         allModels.addAndroidProject(module, androidProject);
>>>>       }
>>>>     }
>>>>
>>>>     return allModels.hasAndroidProjects() ? allModels : null;
>>>>   }
>>>>
>>>>   public static boolean isAndroidProject(@NotNull IdeaModule module) {
>>>>     // A Gradle project is an Android project is if has at least one
>>>> task with name starting with 'android'.
>>>>     for (GradleTask task : module.getGradleProject().getTasks()) {
>>>>       String taskName = task.getName();
>>>>       if (taskName != null &&
>>>> taskName.startsWith(ANDROID_TASK_NAME_PREFIX)) {
>>>>         return true;
>>>>       }
>>>>     }
>>>>     return false;
>>>>   }
>>>>
>>>>   public static class AllModels implements Serializable {
>>>>     @NotNull private final Map<String, AndroidProject>
>>>> androidProjectsByPath = Maps.newHashMap();
>>>>     @NotNull private final IdeaProject myIdeaProject;
>>>>
>>>>     public AllModels(@NotNull IdeaProject project) {
>>>>       myIdeaProject = project;
>>>>     }
>>>>
>>>>     @NotNull
>>>>     public IdeaProject getIdeaProject() {
>>>>       return myIdeaProject;
>>>>     }
>>>>
>>>>     public void addAndroidProject(@NotNull IdeaModule module, @NotNull
>>>> AndroidProject project) {
>>>>       androidProjectsByPath.put(extractMapKey(module), project);
>>>>     }
>>>>
>>>>     @Nullable
>>>>     public AndroidProject getAndroidProject(@NotNull IdeaModule module)
>>>> {
>>>>       return androidProjectsByPath.get(extractMapKey(module));
>>>>     }
>>>>
>>>>     @NotNull
>>>>     private static String extractMapKey(@NotNull IdeaModule module) {
>>>>       return module.getGradleProject().getPath();
>>>>     }
>>>>
>>>>      public boolean hasAndroidProjects() {
>>>>       return !androidProjectsByPath.isEmpty();
>>>>     }
>>>>   }
>>>> }
>>>>
>>>>
>>>> On Fri, Aug 30, 2013 at 7:41 PM, kelemen <[hidden 
>>>> email]<http://user/SendEmail.jtp?type=node&node=5711783&i=1>
>>>> > wrote:
>>>>
>>>>> Hi Alex, Adam,
>>>>>
>>>>> Alex: I can't test with NBAndroid because the Gradle Android plugin
>>>>> complains about the Gradle version. Is there anything I can do to disable
>>>>> this version checking?
>>>>>
>>>>> Adam: I can query `EclipseProject`, `GradleProject` and `IdeaProject`
>>>>> but not `IdeaModule`. Another problem is that if daemon is alive and I
>>>>> change the jars (rebuild) then weird exceptions are thrown telling me that
>>>>> a valid jar url cannot be opened.
>>>>>
>>>>> Also, can I ask you to adjust the current implementation of
>>>>> `GradleBuild` to have `getProjects` and `getRootProject` a more meaningful
>>>>> return value. For example: A type through which it is possible to query
>>>>> some of the basic properties of the project (project dir, path, build
>>>>> script). While at it, the API would be slightly more self explaining if 
>>>>> you
>>>>> could call `getRootProject().findModel` (and the same for other projects)
>>>>> instead of having the two arguments `findModel` methods.
>>>>>
>>>>> Other problem: gradle-1.8-XXX-all.zip contains the same files multiple
>>>>> times.
>>>>>
>>>>>
>>>>> 2013/8/30 alex.ruiz.05 [via Gradle] <[hidden 
>>>>> email]<http://user/SendEmail.jtp?type=node&node=5711781&i=0>
>>>>> >
>>>>>
>>>>>> Awesome!! Thanks a lot, Adam!!
>>>>>>
>>>>>>
>>>>>> On Thu, Aug 29, 2013 at 9:03 PM, Adam Murdoch <[hidden 
>>>>>> email]<http://user/SendEmail.jtp?type=node&node=5711779&i=0>
>>>>>> > wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> This is in the release branch now. You can use
>>>>>>> `BuildController.findModel()` instead of `getModel()`, and it will 
>>>>>>> return
>>>>>>> null if the requested model is not available.
>>>>>>>
>>>>>>>
>>>>>>> On 26/08/2013, at 5:22 AM, kelemen <[hidden 
>>>>>>> email]<http://user/SendEmail.jtp?type=node&node=5711779&i=1>>
>>>>>>> wrote:
>>>>>>>
>>>>>>> A small request for change before release: This is nothing big but
>>>>>>> can you add `org.gradle.tooling.BuildController.tryGetModel` instead of
>>>>>>> `org.gradle.tooling.BuildController.getModel` where `tryGetModel` 
>>>>>>> returns
>>>>>>> null when the model is not found? This is because a model not being
>>>>>>> available can be totally expected. For example, I can only determine 
>>>>>>> that a
>>>>>>> project is an Android project by querying `AndroidProject`.
>>>>>>>
>>>>>>>
>>>>>>> 2013/8/23 Kelemen Attila <[hidden email]>
>>>>>>>
>>>>>>>> The reasons are listed as benefits. I would like to highlight that
>>>>>>>> model queries cannot have an argument. Not having an argument has 
>>>>>>>> obvious
>>>>>>>> limitations. Another very important reason: Currently, if I want to 
>>>>>>>> add a
>>>>>>>> new model, it incurs a lot of overhead because I have to convience 
>>>>>>>> others
>>>>>>>> (for example, you) that the new model is something worth to add. This 
>>>>>>>> - of
>>>>>>>> course - helps with the quality of the model but slows down 
>>>>>>>> development. If
>>>>>>>> I was able to add models dynamically, then there is no reason to worry 
>>>>>>>> too
>>>>>>>> much about quality because even if I create a not so good model, I can 
>>>>>>>> just
>>>>>>>> create a new, discard the old one and forget about it. This is 
>>>>>>>> currently
>>>>>>>> not the case, if I screw up a model then we have to live with the 
>>>>>>>> mistake
>>>>>>>> forever (even though review, assuming that the model is perfect is just
>>>>>>>> unreasonable). In this case, you can even consider the IDE as an 
>>>>>>>> incubator
>>>>>>>> of new models where the model can show its worth.
>>>>>>>>
>>>>>>>> Also, I find the comparison with private fields a little unfair.
>>>>>>>> There isn't anything unspecified, undocument thing I want to access. 
>>>>>>>> That
>>>>>>>> is, I just want to rely on API, you already have to keep compatible 
>>>>>>>> due to
>>>>>>>> the build scripts out there. There is no strong coupling here. I admit 
>>>>>>>> that
>>>>>>>> this changes the original meaning of the model but this shouldn't
>>>>>>>> necessarily be bad. As for comparison: Gradle currently allows to 
>>>>>>>> download
>>>>>>>> a plugin from an external Maven repository (like the Android plugin) 
>>>>>>>> which
>>>>>>>> then can add a model builder. It does not allow to download this from 
>>>>>>>> the
>>>>>>>> IDE. This feels as saying that the IDE is less trustworthy than an
>>>>>>>> arbitrary Maven repository.
>>>>>>>>
>>>>>>>> If this feature does not get added, I will need an awkward
>>>>>>>> workaround where I will have to solve problems you already solve
>>>>>>>> (discovering jars, although it is easier for me to do). This is the
>>>>>>>> workaround, I'm planning:
>>>>>>>>
>>>>>>>> 1. Serialize the instance of `ToolingModelBuilder` and save it to a
>>>>>>>> temporary location.
>>>>>>>> 2. Create a gradle script which adds
>>>>>>>> a `ToolingModelBuilderRegistry` which will rely on the
>>>>>>>> saved `ToolingModelBuilder`.
>>>>>>>> 3. Adjust the build script to put some jars on its classpath.
>>>>>>>> 4. Specify the script as an init script before querying the models
>>>>>>>> through the new API.
>>>>>>>> 5. Query the model provided by the serialized `ToolingModelBuilder`.
>>>>>>>> 6. Delete the serialized instance of `ToolingModelBuilder`.
>>>>>>>>
>>>>>>>> As you can see, it is technically possible to solve the same thing
>>>>>>>> through legal calls. This means, that what you consider "coupling" is
>>>>>>>> already there, only it is awkward to do. If the new API will not 
>>>>>>>> directly
>>>>>>>> allow me to do this now, then I will have to support the above way 
>>>>>>>> forever
>>>>>>>> (to avoid regression for 1.8). That is, I will have to resort doing 
>>>>>>>> this
>>>>>>>> because I (currently) don't agree with the academical reason, 
>>>>>>>> therefore I
>>>>>>>> need at least a single example of what problem this can cause in the 
>>>>>>>> future
>>>>>>>> (still, it can be measured agains the benefits). The gain in the IDE
>>>>>>>> support just feels too much to be ignored for reasons I don't 
>>>>>>>> understand.
>>>>>>>>
>>>>>>>>
>>>>>>>> 2013/8/23 Adam Murdoch [via Gradle] <[hidden email]>
>>>>>>>>
>>>>>>>>  Hi,
>>>>>>>>>
>>>>>>>>> Thanks for the offer, but I'm pretty reluctant to make this
>>>>>>>>> change. I really don't want to couple the tools and the build model
>>>>>>>>> together. To me, this is similar to, for example, using reflection to 
>>>>>>>>> mess
>>>>>>>>> with the private fields of an object rather than using its interface.
>>>>>>>>> Usually a bad idea, particularly when either party can change at 
>>>>>>>>> arbitrary
>>>>>>>>> points in time.
>>>>>>>>>
>>>>>>>>> So, let's step back. What's the actual problem you're trying to
>>>>>>>>> solve here? That is, what would you use such a builder for? Let's see 
>>>>>>>>> if
>>>>>>>>> there's another way to solve this.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 22/08/2013, at 6:39 AM, kelemen <[hidden 
>>>>>>>>> email]<http://user/SendEmail.jtp?type=node&node=5711750&i=0>>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>> Hi Adam,
>>>>>>>>>
>>>>>>>>> It would be a very benefical to allow providing a (serializable)
>>>>>>>>> implementation of `ToolingModelBuilder` through
>>>>>>>>> `BuildActionExecuter` for
>>>>>>>>> future evolution of the Tooling API. Adding it now would be a lot
>>>>>>>>> more
>>>>>>>>> convenient than adding it after 1.8 was released (less backward
>>>>>>>>> compatibility issue). If you allow me to do so, I will implement
>>>>>>>>> it myself
>>>>>>>>> and send a pull request (or a patch).
>>>>>>>>>
>>>>>>>>> Benefits of dynamically added `ToolingModelBuilder`
>>>>>>>>> ---------------------------------------------------
>>>>>>>>>
>>>>>>>>> - Allows to develop models and release new models independently of
>>>>>>>>> Gradle
>>>>>>>>> release schedule. This simply allows creating a jar containing
>>>>>>>>> ToolingModelBuilder implementations on which all IDE can rely on,
>>>>>>>>> so anyone
>>>>>>>>> can use them.
>>>>>>>>> - It is possible to more easily effectively deprecate models by
>>>>>>>>> releasing
>>>>>>>>> another jar. Although such deprected models still need to be
>>>>>>>>> supported but
>>>>>>>>> new clients of the Tooling API does not have to know about the
>>>>>>>>> deprecated
>>>>>>>>> models (less conceptual overhead).
>>>>>>>>> - You can specify arguments when requesting models. Currently with
>>>>>>>>> ToolingModelBuilder you can only have a fixed set of models. For
>>>>>>>>> example,
>>>>>>>>> one might want to allow the users to resolve (and get the resolved
>>>>>>>>> artifacts) a particular configuration by name. Or someone might
>>>>>>>>> not want to
>>>>>>>>> resolve the sources or javadoc (note that each boolean argument
>>>>>>>>> would
>>>>>>>>> increase the required number of models exponentially).
>>>>>>>>> - It is easier to prototype new models this way when developing IDE
>>>>>>>>> integration.
>>>>>>>>> - Unused ToolingModelBuilder instances do not cause needless
>>>>>>>>> overhead.
>>>>>>>>> - The ToolingModelBuilder interface allows for implementations
>>>>>>>>> scaling
>>>>>>>>> quadratically with the number of model builders. Adding
>>>>>>>>> ToolingModelBuilder
>>>>>>>>> dynamically, it would be relatively simple to design an API on the
>>>>>>>>> top of it
>>>>>>>>> which scales well. This new API can be released in later versions
>>>>>>>>> of Gradle.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Disadvantages
>>>>>>>>> -------------
>>>>>>>>>
>>>>>>>>> - Additional work to implement.
>>>>>>>>> - Might need some additional maintainence cost.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I hope you also find this new addition to be useful.
>>>>>>>>>
>>>>>>>>> bye,
>>>>>>>>> Attila Kelemen
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> View this message in context:
>>>>>>>>> http://gradle.1045684.n5.nabble.com/Proposal-for-retrieving-multiple-types-of-models-from-a-project-in-a-single-pass-using-the-Tooling-AI-tp5711516p5711744.html
>>>>>>>>>
>>>>>>>>> Sent from the gradle-dev mailing list archive at 
>>>>>>>>> Nabble.com<http://nabble.com/>
>>>>>>>>> .
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>> To unsubscribe from this list, please visit:
>>>>>>>>>
>>>>>>>>>    http://xircles.codehaus.org/manage_email
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Adam Murdoch
>>>>>>>>> Gradle Co-founder
>>>>>>>>> http://www.gradle.org
>>>>>>>>> VP of Engineering, Gradleware Inc. - Gradle Training,
>>>>>>>>> Support, Consulting
>>>>>>>>> http://www.gradleware.com
>>>>>>>>>
>>>>>>>>> Join us at the Gradle eXchange 2013, Oct 28th in London, UK:
>>>>>>>>> http://skillsmatter.com/event/java-jee/gradle-exchange-2013
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ------------------------------
>>>>>>>>>  If you reply to this email, your message will be added to the
>>>>>>>>> discussion below:
>>>>>>>>>
>>>>>>>>> http://gradle.1045684.n5.nabble.com/Proposal-for-retrieving-multiple-types-of-models-from-a-project-in-a-single-pass-using-the-Tooling-AI-tp5711516p5711750.html
>>>>>>>>>  To unsubscribe from Proposal for retrieving multiple types of
>>>>>>>>> models from a project in a single pass, using the Tooling API, click
>>>>>>>>> here.
>>>>>>>>> NAML<http://gradle.1045684.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> ------------------------------
>>>>>>> View this message in context: Re: Proposal for retrieving multiple
>>>>>>> types of models from a project in a single pass, using the Tooling 
>>>>>>> API<http://gradle.1045684.n5.nabble.com/Proposal-for-retrieving-multiple-types-of-models-from-a-project-in-a-single-pass-using-the-Tooling-AI-tp5711516p5711754.html>
>>>>>>> Sent from the gradle-dev mailing list 
>>>>>>> archive<http://gradle.1045684.n5.nabble.com/gradle-dev-f1436218.html>at
>>>>>>> Nabble.com.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Adam Murdoch
>>>>>>> Gradle Co-founder
>>>>>>> http://www.gradle.org
>>>>>>> VP of Engineering, Gradleware Inc. - Gradle Training,
>>>>>>> Support, Consulting
>>>>>>> http://www.gradleware.com
>>>>>>>
>>>>>>> Join us at the Gradle eXchange 2013, Oct 28th in London, UK:
>>>>>>> http://skillsmatter.com/event/java-jee/gradle-exchange-2013
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> ------------------------------
>>>>>>  If you reply to this email, your message will be added to the
>>>>>> discussion below:
>>>>>>
>>>>>> http://gradle.1045684.n5.nabble.com/Proposal-for-retrieving-multiple-types-of-models-from-a-project-in-a-single-pass-using-the-Tooling-AI-tp5711516p5711779.html
>>>>>>  To unsubscribe from Proposal for retrieving multiple types of models
>>>>>> from a project in a single pass, using the Tooling API, click here.
>>>>>> NAML<http://gradle.1045684.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>>>>>>
>>>>>
>>>>>
>>>>> ------------------------------
>>>>> View this message in context: Re: Proposal for retrieving multiple
>>>>> types of models from a project in a single pass, using the Tooling 
>>>>> API<http://gradle.1045684.n5.nabble.com/Proposal-for-retrieving-multiple-types-of-models-from-a-project-in-a-single-pass-using-the-Tooling-AI-tp5711516p5711781.html>
>>>>> Sent from the gradle-dev mailing list 
>>>>> archive<http://gradle.1045684.n5.nabble.com/gradle-dev-f1436218.html>at 
>>>>> Nabble.com.
>>>>>
>>>>
>>>>
>>>
>>>
>>> ------------------------------
>>>  If you reply to this email, your message will be added to the
>>> discussion below:
>>>
>>> http://gradle.1045684.n5.nabble.com/Proposal-for-retrieving-multiple-types-of-models-from-a-project-in-a-single-pass-using-the-Tooling-AI-tp5711516p5711783.html
>>>  To unsubscribe from Proposal for retrieving multiple types of models
>>> from a project in a single pass, using the Tooling API, click 
>>> here<http://gradle.1045684.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=5711516&code=YXR0aWxhLmtlbGVtZW44NUBnbWFpbC5jb218NTcxMTUxNnwtMTMxMjM2NTcwMA==>
>>> .
>>> NAML<http://gradle.1045684.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>>>
>>
>>
>




--
View this message in context: 
http://gradle.1045684.n5.nabble.com/Proposal-for-retrieving-multiple-types-of-models-from-a-project-in-a-single-pass-using-the-Tooling-AI-tp5711516p5711786.html
Sent from the gradle-dev mailing list archive at Nabble.com.

Reply via email to