# P2 UninstallHandler / Touchpoint



## thomet (1. Feb 2010)

Hallo,
ich habe eine RCP-Anwendung mit p2 Integration. Meine Projekt-Daten werden in einer Datenbank gespeichert. Die Anwendung kann mehrere Module beinhalten. Wenn jetzt eins der Module deinstalliert wird, sollen auch die dazugehörigen Projekte gelöscht werden. (Uninstall über "InstalledSoftwarePage")

Wie kann ich in den p2 Deinstallationsprozess eingreifen um dort eine abfrage zu platzieren, die zum löschen der Projekte auffordert?


----------



## thomet (1. Feb 2010)

ok hab schonma soweit mitbekommen das es wo mithilfe sogenanter touchpoints wo möglich ist.. leider hab ich damit keinerlei erfahrungen


----------



## Wildcard (1. Feb 2010)

Ich würde in der Newsgroup fragen. Für die advanced Features von p2 liegt meiner Erfahrung nach kaum Doku vor...


----------



## thomet (3. Feb 2010)

hy danke erstma für die antwort.

ich bin nun selbst durch vieles lesen und probieren auf eine lösung gekommen. der punkt mit den touchpoints war sogar ein richtiger ansatz 

hier meine lösung:

in meiner grundanwendung hab ich folgenden extensionpoint hinzugefügt um eine ProvisioningAction zu erstellen (können mithilfe der touchpoints genutzt werden): org.eclipse.equinox.p2.engine.actions

diesen ep hab ich nun um eine extension erweitert:

```
name: removeOldProjects
version: 1.0.0
class: com.myrcp.p2.actions.RemoveOldProjects
touchpointType: org.eclipse.equinox.p2.osgi
touchpointType: 1.0.0
```

meine action hat einen parameter über den ein projectType übergeben wird

com.myrcp.p2.actions.RemoveOldProjects:

```
import java.util.Map;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.provisional.p2.engine.ProvisioningAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;

@SuppressWarnings("restriction")
public class RemoveOldProjects extends ProvisioningAction {
	
	private static String		PARAMETER_PROJECT_TYPE	= "projectType";
	private boolean			uninsall				= false;
	private Display			display				= null;
	private Shell			shell					= null;
	
	@SuppressWarnings("unchecked")
	@Override
	public IStatus execute(Map parameters) {
		final Object projectType = parameters.get(PARAMETER_PROJECT_TYPE);
		
		display = PlatformUI.getWorkbench().getDisplay();
		display.asyncExec(new Runnable() {
			
			public void run() {
				shell = new Shell(display, SWT.APPLICATION_MODAL);
				uninsall = MessageDialog.openConfirm(shell, "Remove Projects", "Remove Projects: " + projectType);
				if(!uninsall)
					MessageDialog.openWarning(shell, "Uninstallation Aborted ", "Uninstallation Aborted");
			}
		});
		
		if(uninsall)
			return Status.OK_STATUS;
		return Status.CANCEL_STATUS;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public IStatus undo(Map parameters) {
		return Status.OK_STATUS;
	}
	
}
```

in dem plugin wo die extension definiert wurde muss noch eine p2.inf bei der MANIFEST.MF erstellt werden, bzw wenn schon vorhanden um folgendes erweitert werden:


```
provides.0.namespace=org.eclipse.equinox.p2.engine.actions
provides.0.name=com.myrcp.p2.actions.removeOldProjects
provides.0.version=1.0.0
```

somit ist die action ersteinma fertig definiert. um diese nun anzuwenden muss folgendes gemacht werden:

beispiel um bei der deinstallation von com.myapp.module1 diese action aus zu führen:

in dem pulgin com.myapp.module1 bei der MANIFEST.MF eine p2.inf erstellen (falls noch nicht vorhanden) und folgendes eintragen:

```
metaRequirements.0.namespace=org.eclipse.equinox.p2.engine.actions
metaRequirements.0.name=com.myrcp.p2.actions.removeOldProjects
metaRequirements.0.range=1.0.0
instructions.uninstall=com.myrcp.p2.actions.removeOldProjects(projectType:myProjectType);
```

nochma zur erklärung der letzten zeile.. mit projectType:myProjectType wird in der map eine eintrag angelegt mit dem inhalt myProjectType

ich hoffe das ich damit vielleicht anderen auch weiterhelfen kann


----------

