Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[platform-vcm-dev] RepositoryProviders: notes on converting natures

This document describes the changes in Team core which repository providers
should be aware of for 2.0, wrt our use of persistent properties vs.
natures.

Team Core

- There's a new extension point where you can register your provider.  This
extension point is very similar to the Core nature extension point you are
using at present.

Old way using natures:

<extension point="org.eclipse.core.resources.natures"
      id="YoYoRepoNature" name="My Repo Nature">
      <runtime>
            <run class="com.yoyodyne.Provider"/>
      </runtime>
      <one-of-nature id="org.eclipse.team.repository-provider"/>
</extension>

*New way using Team Core, you would add the following.  You may want to
change the ID to not use the word 'nature', but keeping it the same is the
simplest/most direct conversion (also, if you keep them the same you can
use RepositoryProvider.convertNatureToProperty()):

<extension point="org.eclipse.team.resources.repository">
      <repository
            id="com.yoyodyne.yoyoRepoNature"
            class="com.yoyodyne.Provider">
      </repository>
</extension>

The ID for your provider can be the same as your nature ID if you want to
cheat.  You can keep the nature extension in without harm -- nobody else
will attempt to associate it with the project as a nature.  Actually, its
the provider who always associated it with the project in their "Share"
wizard page, which you will change to use the new API.

Changes in your plugin.xml

In addition to the above extension point, you will need to change the
filtering rules for your object contributions (menus), property page, etc.
The change is trivial. Anywhere where you filtered:
         <filter
               name="projectNature"
               value="com.yoyodyne.yoyoRepoNature">
         </filter>

you will change to filter as follows:
         <filter
               name="projectPersistentProperty"
               value=
"org.eclipse.team.core.repository=com.yoyodyne.yoyoRepoNature">
         </filter>

FYI, the left side "org.eclipse.team.core.repository" matches against the
key we use for the persistent property, the right side value"
com.yoyodyne.yoyoRepoNature" matches against the value of the persistent
property, in our case your provider ID used in the argument to
IRepositoryProvider.map(IProject project, String providerID), described
below.

class RepositoryProvider methods

public abstract class RepositoryProvider implements IProjectNature
   - class signature remains the same.  This ensures you can be still be a
   nature, or not a nature, as you decide.
   - we will maintain a persistent property
   (IResource.setPersistentProperty()) on the project to track the provider
   ID. This is equivalent to core remembering the nature ID on the project.
   - the provider ID is a string, just like the nature ID, and could/should
   be the same string
   - we will maintain a session property (IResource.setSessionProperty())
   on the project to remember the RepositoryProvider instance.  This is
   equivalent to core instantiating the nature and remembering it during a
   workspace session.

public static String[] getAllProviderTypeIds()
   - will return a list combining those ID's registered via our new
   extension point, and those registered via core nature (old code)

public static RepositoryProvider getProvider(IProject project)
   - will first look for a provider by persistent property/session
   property, instantiating the provider if required
   - if it can't find one that way, will fall back to old code which looks
   for a team nature

public static RepositoryProvider getProvider(IProject project, String id)
   - will first look for a provider by that id via persistent
   property/session property, instantiating the provider if required
   - if it can't find provider that way, will fall back to old code which
   looks for a nature with that id


*New* class RepositoryProvider methods

public static void map(IProject project, String id)
   - this is the new "in" way to associate your provider instance with a
   project
   - where you used to call Team.addNatureToProject() (e.g your "Share"
   wizard page) you should call this
   - It will instantiate your provider (via the extension point), set your
   ID in our persistent property, and set your provider instance in the
   session property
   - Will touch() the project to generate deltas on the IProjectDescription
   to notify that the project is being mapped.

public static void unmap(IProject project)
   - this is the new "in" way to disassociate your provider instance from a
   project
   - where you used to call Team.removeNatureFromProject() you should call
   this
   - we will clear the persistent and session properties
   - Will touch() the project to generate deltas on the IProjectDescription
   to notify that the project is being unmapped.

public static void convertNatureToProperty(IProject project, boolean
removeNature)
   - convenience method that checks if the project has a team nature, and
   if it does creates a corresponding persistent property by the same ID as
   the nature ID
   - if 'removeNature == true', also removes the nature from the project,
   indirectly updating the .project

class Team methods

public static void addNatureToProject(IProject proj, String natureId,
IProgressMonitor monitor)
   - will remain "as is" so existing callers will continue working until
   they are converted over
   - will continue to put the nature in the .project

public static void removeNatureFromProject(IProject proj, String natureID,
IProgressMonitor monitor)
   - will remain "as is" so existing callers will continue working until
   they are converted over


Things to Watch For
==============================

You should look for the following when converting:

1. References to IProjectDescription.  For example, senders of hasNature(),
getNature(), setNatureIds(), etc.

2. Senders of IProject.getDescription(), IProject.SetDescription().

3. References to any kind of MyProvider.getId() method that returns your
provider ID (you probably have one of these for convenience.  This should
correspond to #1 above.

4. Nature lifecycle:  We believe we've reproduce it with the new
RepositoryProvider API.  For example, we call configureProject() and
deconfigure() in the same cases.

5. Listening for deltas on ProjectDescriptions:   You may be listening to
these as a way of being notified when the project is shared/disconnected
(if you support the latter).  We generate them now in map()/unmap() by
touching the project.


Convenience - Conversion Menu
==============================

The following will get you a project menu to convert natures to persistent
properties.  The underlying menu, RepositoryProvider.
convertNatureToProperty(), assumes you're using the same ID for both our
new provider extension and the nature.

The action is in team.ui so you can use it just by adding this to your
plugin.xml, modulo the id's of course (this is from our cvs.ui plugin):

      <objectContribution
            objectClass="org.eclipse.core.resources.IProject"
            adaptable="true"
            id="org.eclipse.team.ccvs.ui.IProjectContributions">
         <filter
               name="projectNature"
               value="org.eclipse.team.cvs.core.cvsnature">
         </filter>
         <action
               label="%ConvertNature.label"
               tooltip="%ConvertNature.tooltip"
               class="org.eclipse.team.internal.ui.NatureToPropertyAction"
               menubarPath="team.main/projectGroup"
               id="org.eclipse.team.ccvs.ui.convertNature">
         </action>
      </objectContribution>


The action code itself is trivial, so reuse or not as you need.



Back to the top