On 2011-02-11, at 9:33 AM, Eugen Reiswich wrote:

> Hi Pascal, 
> 
> this is a good start. There could be one problem with the factory: 
        Do you really think this would be sufficient or do you think it is 
still too complex since they still have to call the jobs?
In order to continue the discussion I have opened bug 337016




>> ref = Activator.getContext().getServiceReferences(IProvisioningAgent.class, 
>> '(' + IProvisioningAgent.SERVICE_CURRENT + '=' + Boolean.TRUE.toString() + 
>> ')');
> 
> 
> Due to the OSGi concurrency this call can cause a NPE.


> The factory could look like:
> 
>> InstallOperation operation = new 
>> SimpleCaseFactory().createInstallOperation(versionedIdList, repoURIList, 
>> monitor);
>> UpdateOperation operation = new 
>> SimpleCaseFactory().createUpdateOperation(versionedIdList, repoURIList, 
>> monitor);
>> UninstallOperation operation = new 
>> SimpleCaseFactory().createUninstallOperation(versionedIdList, monitor);
>> List<IVersionedId>  features = new 
>> SimpleCaseFactory().getInstalledFeatures(monitor);

> 
> 
> Eugen
> 
> Am 11.02.2011 um 04:36 schrieb Pascal Rapicault:
> 
>> I have created the following helper class (see attachment). It is a factory 
>> that hides much of the boiler plate you showed.
>> I have not run the code itself but it would be used this way. I find it to 
>> be a good compromise since it allows one to create an operation quickly and 
>> use it, or tweak it some more and then use it. What do you think?
>> 
>> InstallOperation operation = new 
>> SimpleCaseFactory().createOperation(versionedIdList, repoURIList, monitor)
>> result = operation.resolveModal(monitor);
>> 
>> if (result.isOK()) {
>>      final ProvisioningJob installJob = 
>> operation.getProvisioningJob(monitor);
>>      result = installJob.runModal(monitor);
>> } 
>> <SimpleCaseFactory.java>
>> 
>> On 2011-02-10, at 9:55 AM, Eugen Reiswich wrote:
>> 
>>> I understand that you P2 developers have to deal with many different and 
>>> probably sometimes contrary requirements. And there is definitely no way to 
>>> meet all needs with one common API. But I just remember the legacy Eclipse 
>>> UpdateManager which has done his job for years, thus obviously covering a 
>>> lot of common scenarios. The API was very simple and easy to use:
>>> 
>>> UpdateCommand(String featureId, String version, String verifyOnly) 
>>> InstallCommand(String featureId, String version, String fromSite, String 
>>> toSite, String verifyOnly) 
>>> etc.
>>> 
>>> I am just of the opinion that if P2 could provide a comparable API this 
>>> would make the life of many developers much easier and encourage developers 
>>> to use P2. And in case this API does not meet a developers needs, he or she 
>>> can still fall back on the P2 concepts:
>>> 
>>> 
>>>     final IProgressMonitor monitor = new NullProgressMonitor();
>>>     ProvisioningSession session = new ProvisioningSession(agent);
>>>     ProvisioningContext context = new ProvisioningContext(agent);
>>> 
>>>     updateRepositories(context, updatedRepoLocation);
>>> 
>>>     Collection<IInstallableUnit> unitsToInstall = new 
>>> ArrayList<IInstallableUnit>();
>>> 
>>>     for (IVersionedId versionedId : featureIds) {
>>>             Version version = Version.create(versionedId.getVersion());
>>>             IQuery<IInstallableUnit> installableUnits = 
>>> QueryUtil.createIUQuery(versionedId.getId(), version);
>>>             IQueryResult<IInstallableUnit> ius = 
>>> context.getMetadata(monitor).query(installableUnits, monitor);
>>> 
>>>             unitsToInstall.addAll(ius.toSet());
>>>     }
>>> 
>>>     final InstallOperation operation = new InstallOperation(session, 
>>> unitsToInstall);
>>>     operation.setProvisioningContext(context);
>>>     
>>>     result = operation.resolveModal(monitor);
>>> 
>>>     if (result.isOK()) {
>>>             final ProvisioningJob installJob = 
>>> operation.getProvisioningJob(monitor);
>>>             result = installJob.runModal(monitor);
>>>     } 
>>> 
>>> Eugen
>>> 
>>> 
>>> Am 10.02.2011 um 05:25 schrieb Pascal Rapicault:
>>> 
>>>> To me the danger of adding yet another abstraction ends up being an issue 
>>>> of having more layers to keep aligned as things evolve in one or the 
>>>> other, and thus more code and API surface. To be clear, the actual 
>>>> functionality you want to add is very useful but the API you are using to 
>>>> represent it is limiting and goes against a lot of efforts that have been 
>>>> going on to run multiple instances of p2 in the same system. Therefore if 
>>>> we just go with the API as you propose it, next thing you will know, you 
>>>> will have request to offer the possibility to specify an agent, tweak the 
>>>> restart policy, then a this or a that... and we will end up with something 
>>>> that will be almost like, but not exactly like PCO which will result in 
>>>> even more confusion. And on top of that you will have to add the methods 
>>>> for cases like those from Eugen (true usecase as well there).
>>>> 
>>>> In the end I think we are trying to resolve two problems in one shot:
>>>> 1) Lack of functionality around sync'ing a p2 instance with a remote 
>>>> repository.
>>>> 2) Ease of use of the API
>>>> 
>>>> My proposal is to treat those separately:
>>>> - The missing functionality is interesting and should be added. If I was 
>>>> to add that functionality just by itself, I would likely add it directly 
>>>> to the operations because this is where we expose these sorts of high 
>>>> level functionalities, and I would try to add the same support in the 
>>>> director.app.
>>>> This would be a subclass of the InstallOperation that overrides the 
>>>> getProfileChangeRequest() to create a request that describes the expected 
>>>> final state.
>>>> 
>>>> - Then separately if someone was coming to talk about simplify the p2 API, 
>>>> I would first try to understand how far from the Operation API is the 
>>>> desired state and then see how we can pave the way. For example: What 
>>>> about providing a factory that returned an API where you had pretty much 
>>>> just one or two method calls to do? like new InstallOperation(URI[] repos, 
>>>> IVersionedId[]).getProvisioningJob().schedule?
>>>> For example, in one case there is an API to list the features to install, 
>>>> how would the caller of this new API get the elements to fill the list? I 
>>>> mean does he/she has to query the list of IUs from a repo?
>>>> 
>>>> 
>>>> On 2011-02-09, at 10:35 PM, David Orme wrote:
>>>> 
>>>>> Hi Susan,
>>>>> 
>>>>> I'm open to considering making this code part of the operations API, but 
>>>>> right now have a hard time imagining it there.  
>>>>> 
>>>>> Right now, the code is basically a 300 line script (that happens to be 
>>>>> written in Java) that utilizes several Operations to get its job done.  
>>>>> In other words, it really feels to me like a layer of abstraction above 
>>>>> operations.
>>>>> 
>>>>> I've looked at the code that Eugen and Scott wrote and their API is 
>>>>> almost exactly what we've proposed as well.  
>>>>> 
>>>>> Actually, theirs is probably a more proper abstraction layer on top of 
>>>>> Operations and ours takes their idea one step further and really 
>>>>> specifically enables some RCP use-cases.  (Theirs is designed as a 
>>>>> remote-management API for Equinox-based server containers.)
>>>>> 
>>>>> So my own thinking is that we should try to take into account our own 
>>>>> use-cases and  theirs as much as possible.
>>>>> 
>>>>> And to my thinking, that doesn't necessarily make sense as part of the 
>>>>> Operations API.  
>>>>> 
>>>>> However, I welcome attempts to convince me otherwise.  :-)  A code 
>>>>> snippet showing how one would use one of our APIs, but reimplemented 
>>>>> using Operations, to update an RCP application might be helpful to make 
>>>>> it easier to imagine what you're considering.
>>>>> 
>>>>> 
>>>>> Regards,
>>>>> 
>>>>> Dave Orme
>>>>> 
>>>>> 
>>>>> On Wed, Feb 9, 2011 at 11:10 AM, Susan Franklin McCourt 
>>>>> <[email protected]> wrote:
>>>>> I agree that being part of the ProfileChangeOperation hierarchy would be 
>>>>> a good thing. Whereas InstallOperation will only do the updates forced by 
>>>>> requirements, you are talking about wanting to do other selected updates. 
>>>>> I think this can easily be accommodated in that hierarchy.
>>>>> 
>>>>> As far as simplifying the number of concepts to use. It strikes me that 
>>>>> most of what you are talking about is simplified constructors that create 
>>>>> the operation by assuming an RCP setup (getting the agent and services 
>>>>> from the running profile.) So you could add those constructors for 
>>>>> simplicity and still retain the operation concept. 
>>>>> 
>>>>> This would have several advantages in my opinion:
>>>>> - a remote administrator would surely want to use this concept to update 
>>>>> a system other than "self" profile. The operation would let them do this, 
>>>>> otherwise you have to start adding those very same concepts into this new 
>>>>> API.
>>>>> - operations can feed into the UI, so if a more advanced use case 
>>>>> required the user confirming which updates/installs were needed, you 
>>>>> could just open a wizard (or make minimal change to existing wizards).
>>>>> 
>>>>> I realize the purpose of your proposal is to get away from the 
>>>>> variables/concepts that pollute the RCP mindset, but my experience is 
>>>>> that someone will say, "it's just like your simple API but I want to pass 
>>>>> an agent in." or whatever. The operation hierarchy's purpose was to 
>>>>> capture the "80/20" use cases and I agree that the "synch profile with a 
>>>>> controlled repo" is one that is definitely needed...
>>>>> I like the idea of SynchronizeProfileOperation or something like that. 
>>>>> 
>>>>> susan
>>>>> 
>>>>> <graycol.gif>David Orme ---02/09/2011 07:23:18 AM---On Tue, Feb 8, 2011 
>>>>> at 3:04 PM, Pascal Rapicault <[email protected]>wrote: > Think I got my 
>>>>> second
>>>>> 
>>>>> From:     David Orme <[email protected]>
>>>>> To:       P2 developer discussions <[email protected]>
>>>>> Date:     02/09/2011 07:23 AM
>>>>> Subject:  Re: [p2-dev] Proposal: Simplified installer/updater.
>>>>> Sent by:  [email protected]
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> On Tue, Feb 8, 2011 at 3:04 PM, Pascal Rapicault <[email protected]> 
>>>>> wrote:
>>>>> Think I got my second question answered :)
>>>>> The second install, I would call it "makeItSo" :)
>>>>> 
>>>>> :-)
>>>>>  
>>>>> The question I still have is, why would not those be cast in terms of 
>>>>> ProfileChangeOperation (in the sense, inherit from there), maybe with a 
>>>>> additional helpers?
>>>>> 
>>>>> Because what we actually do is an UpdateOperation followed by an 
>>>>> InstallOperation.  Our testing showed that this is what we needed to 
>>>>> perform a full synchronization.
>>>>> 
>>>>> But if inheriting from PCO is a better choice, we could consider that.
>>>>> 
>>>>> A question of my own:
>>>>> 
>>>>> I don't think we've tested yet how to make sure that a Feature that is no 
>>>>> longer used gets removed from the running platform.
>>>>> 
>>>>> In our first API, if a Feature or Bundle is removed from all of the 
>>>>> available repositories (and they are all reachable on the network), then 
>>>>> it should be removed from the running platform as well.
>>>>> 
>>>>> In our second API, the collection of IVersionedIds should completely 
>>>>> define the provisioned platform for the user.  
>>>>> 
>>>>> Do we need to do something special to disable all Features not referenced 
>>>>> by one of those IVersionedIds (either in the set of P2 repos, or in the 
>>>>> parameter list)?
>>>>> 
>>>>> 
>>>>> Dave
>>>>> _______________________________________________
>>>>> p2-dev mailing list
>>>>> [email protected]
>>>>> https://dev.eclipse.org/mailman/listinfo/p2-dev
>>>>> 
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> p2-dev mailing list
>>>>> [email protected]
>>>>> https://dev.eclipse.org/mailman/listinfo/p2-dev
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> p2-dev mailing list
>>>>> [email protected]
>>>>> https://dev.eclipse.org/mailman/listinfo/p2-dev
>>>> 
>>>> _______________________________________________
>>>> p2-dev mailing list
>>>> [email protected]
>>>> https://dev.eclipse.org/mailman/listinfo/p2-dev
>>> 
>>> _______________________________________________
>>> p2-dev mailing list
>>> [email protected]
>>> https://dev.eclipse.org/mailman/listinfo/p2-dev
>> 
>> _______________________________________________
>> p2-dev mailing list
>> [email protected]
>> https://dev.eclipse.org/mailman/listinfo/p2-dev
> 
> _______________________________________________
> p2-dev mailing list
> [email protected]
> https://dev.eclipse.org/mailman/listinfo/p2-dev

_______________________________________________
p2-dev mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/p2-dev

Reply via email to