P2 UninstallHandler / Touchpoint

thomet

Aktives Mitglied
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?
 
Zuletzt bearbeitet:

thomet

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

thomet

Aktives Mitglied
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:
Code:
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:
Java:
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:

Code:
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:
Code:
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 :)
 

Neue Themen


Oben