Hi Pascal,
this is a good start. There could be one problem with the factory:
> 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