RCP Anwendungen aktualisieren
Immer wieder ärger ich mich über Eclipse RCP, dass so wenig dokumentiert ist. Es ist
wirklich schwer für dieses Thema vernünftige Dokumentationen zu bekommen. Auch die
am Markt erhältlichen Bücher lassen zu Wünschen übrig. Ich hab vor kurzem sehr lange
nach einer Dokumentation gesucht, um RCP Anwendungen über eine Update-Site
zu aktualisieren.
Vorab, das Buch “Rich-Client Entwicklung mit Eclipse 3.3″ von Berthold Daum ist riesiger
Mist und keinen Cent Wert. Der dort beschrieben Weg, um Anwendungen zu aktualisieren
funktioniert nicht und ist nur sehr oberflächlich beschrieben.
Nachdem ich gesehen habe, dass Eclipse 3.4 einen neuen Update Mechanismus verwendet, p2,
dachte ich mir, dann bauen wir den gleich ein. Aber auch hier ist wieder kaum eine
anständige Dokumentation zu finden. Ok, die Plug-Ins lassen sich ja problemlos einbinden,
allerdings muss die Anwendung noch in einen p2-Anwendungen umgewandelt werden, was irgendwie
nicht funktioniert hat und ich entnervt aufgegeben habe…ich hab ja auch nicht ewig Zeit
forensisch herauszufinden wie etwas funktioniert. Wenn mir jemand evtl. einen Hinweis
geben kann, wie dass alles stressfrei funktioniert bin ich dankbar
Am Ende habe ich doch den “alten” Update-Manager verwendet. Herausgekommen ist folgende
Klasse. Möge sie anderen genervten Entwicklern helfen…;-)
package foo.bar;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.update.configuration.IConfiguredSite;
import org.eclipse.update.configuration.ILocalSite;
import org.eclipse.update.core.IFeature;
import org.eclipse.update.core.IFeatureReference;
import org.eclipse.update.core.ISite;
import org.eclipse.update.core.SiteManager;
import org.eclipse.update.core.VersionedIdentifier;
import org.eclipse.update.operations.IInstallFeatureOperation;
import org.eclipse.update.operations.IUnconfigFeatureOperation;
import org.eclipse.update.operations.IUninstallFeatureOperation;
import org.eclipse.update.operations.OperationsManager;
public class UpdateAction implements IWorkbenchWindowActionDelegate {
private Shell shell;
private Display display;
private IWorkbenchWindow window;
private boolean restart;
public void dispose() {
if (window == null) {
shell.close();
display.dispose();
}
}
public void init(IWorkbenchWindow window) {
this.window = window;
shell = window.getShell();
display = shell.getDisplay();
}
public void run(IAction action) {
if (shell == null) {
display = Display.getCurrent();
shell = new Shell(display, SWT.NONE);
}
try {
System.out.println("Update running...");
IProgressMonitor monitor = new NullProgressMonitor();
ISite rs = SiteManager.getSite(new URL(
"http://localhost:8080/update"), monitor);
IFeatureReference[] frs = rs.getFeatureReferences();
ILocalSite ls = SiteManager.getLocalSite();
IConfiguredSite ics = ls.getCurrentConfiguration()
.getConfiguredSites()[0];
IFeatureReference[] lfrs = ics.getConfiguredFeatures();
List<IInstallFeatureOperation> installOps = new ArrayList<IInstallFeatureOperation>();
System.out.println("Method initialized, ServerCount: " + frs.length
+ " LocalCount: " + lfrs.length);
for (int i = 0; i < frs.length; i++) {
System.out.println("Found Feature on Server: "
+ frs[i].getVersionedIdentifier().toString());
for (int j = 0; j < lfrs.length; j++) {
VersionedIdentifier frsVi = frs[i].getVersionedIdentifier();
VersionedIdentifier lfrsVi = lfrs[j] .getVersionedIdentifier();
System.out.println("Local feature: " + lfrsVi.toString());
if (frsVi.getIdentifier().equals(lfrsVi.getIdentifier())) {
String v = frsVi.getVersion().toString();
String lv = lfrsVi.getVersion().toString();
System.out.println("Checking feature: "
+ lfrsVi.getIdentifier() + " Local: " + lv
+ " Server: " + v);
if (frsVi.getVersion().isGreaterThan(lfrsVi.getVersion())) {
System.out.println(lfrsVi.getIdentifier()
+ " needs to be updated");
installOps.add(OperationsManager
.getOperationFactory()
.createInstallOperation(ics,
frs[i].getFeature(monitor), null,
null, null));
} else {
System.out.println(lfrsVi.getIdentifier()
+ " is up to date");
}
}
}
}
System.out.println("Feature verification completed.");
if (installOps.size() > 0) {
for (Iterator iter = installOps.iterator(); iter.hasNext();) {
IInstallFeatureOperation op = (IInstallFeatureOperation) iter.next();
System.out.println("Updating: " + op.getFeature().getLabel()
+ ", Size: " + op.getFeature().getDownloadSize()
+ "kb");
boolean succes = op.execute(monitor, null);
if (succes) {
restart=true;
System.out.println("Update succesfull");
uninstallFeature(ics,op.getOldFeature(),monitor);
} else {
System.out.println("Update failed");
}
}
ls.save();
} else {
System.out.println("There are no new updates.");
}
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (CoreException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
private void uninstallFeature(IConfiguredSite ics, IFeature oldFeature, IProgressMonitor monitor) {
System.out.println("Uninstall Feature: " + oldFeature.getLabel());
try {
IUnconfigFeatureOperation uo = OperationsManager
.getOperationFactory().createUnconfigOperation(ics, oldFeature);
boolean isUnconfiged=uo.execute(monitor,null);
System.out.println("Unconfigured: " + isUnconfiged);
IUninstallFeatureOperation uninsto=OperationsManager.getOperationFactory()
.createUninstallOperation(ics, oldFeature);
boolean isUnstalled=uninsto.execute(monitor,null);
System.out.println("Uninstalled: " + isUnstalled);
} catch (Exception e) {
e.printStackTrace();
}
}
public void selectionChanged(IAction action, ISelection selection) { }
public boolean isRestart() {
return restart;
}
}
|
Ein Kommentar zu “RCP Anwendungen aktualisieren”
Hallo,
ich kämpfe auch mit dem UpdateMechanismus. Zwar werden die alten Features gelöscht, aber die Plugins werden nicht von der Platte gelöscht, weil die Anwendung diese noch im Zugriff hat. Hast Du vielleicht einen Tipp dazu? Gibt es einen Punkt im RCP Lebenszyklus wo die Plugins noch nicht geladen sind und ich es dann löschen kann?
Danke und vg,
Simone
Kommentar hinzufügen