# Eclipse RCP Update



## KlaDi (27. März 2007)

Hallo,

ich möchte meine RCP-Anwendung gerne mit einer Updatefunktion versehen. Nun hab ich schon gelesen das Eclipse dafür Tools bietet und bin im Internet auf diesen Beitrag gestoßen: http://entwickler-forum.de/showthread.php?t=29509. Leider weiß ich nicht, wie ich das in meinem Programm verwenden soll.

Ich möchte eigentlich nur das auf dem Server in einen Ordner geguckt wird ob einen neue Version vorhanden ist, wenn ja dann soll diese auf den lokalen Rechner kopiert werden, wenn nein soll nichts passieren.

Vielleicht hat ja jemand schon von Euch damit gearbeitet.

Gruß KlaDi.


----------



## limago (9. Mai 2007)

Hi, 

das ist nicht in zwei Worten beschrieben.

Im Grunde geht es so.

Zunächst machst Du aus Deinem Plugin oder den Plugins ein Feature. Am besten als FeatureProjekt.

Mit diesem FeatureProjekt kannst Du ein UpdateSiteprojekt erstellen. Dieses Projekt erstellt ein Verzeichnis für den Webserver mit allem was Du brauchst. Wahlweise auch als Zipfile, oder als lokale Updatesite.

Details bei Bedarf, vielleicht hat sich das Problem ja schon gelöst.


EDIT: 

Habe gerade etwas Zeit:

1. Feature Projekt erstellen

New Project Wizard -> Plugin Development -> Feature Projekt

1.1.  Auf der ersten Seite im Wizard Projektname eingeben und Next drücken
1.2  Auf der folgenden Property Seite die Felder befüllen (ID is strictly required)
1.3  Als nächstes alle (eigenen) Plugins für das Feature auswählen
1.4 Auf die Dependencies wechseln und checken (vorsichtshalber)

1.5 Zurück zur Overview und Create an Updatesite-Projekt wählen

2.1 Name eingeben, Finish drücken
2.2 Feature wählen
2.3 Build drücken

Fertig!

Das Feature kann via Find and Install eingerichtet werden. Als Pfad den Pfad zum Update Site Projekt eingeben.



Gruß


----------



## limago (9. Mai 2007)

Auf der Clientseite muss eine Actionklasse geschrieben werden. Das ist notwendig, weil man den verschieden Herstellen das abklappern eigener Wizards ermöglichen will. Diese Klasse muss IAction implementieren. Diese Action hängt man am besten ins Help-Menü.


```
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.update.ui.UpdateJob;
import org.eclipse.update.ui.UpdateManagerUI;

public class UpdateAction extends Action implements IWorkbenchWindowActionDelegate {

	private IWorkbenchWindow window;

	public void dispose() {
		// TODO Auto-generated method stub

	}

	public void init(IWorkbenchWindow window) {
		this.window = window;
		setId("de.tutorials.meinRcp");
		setText("&Update....");
		// etc.

	}

	public void run(IAction action) {
		BusyIndicator.showWhile(window.getShell().getDisplay(), new Runnable(){

			public void run() {
				UpdateJob job = new UpdateJob("Suche updates", false, false);
				UpdateManagerUI.openInstaller(window.getShell(), job);
				
			}});
	}

	public void selectionChanged(IAction action, ISelection selection) {
		// TODO Auto-generated method stub

	}

}
```

Sicherstellen, das die Action im Menü registriert ist

in der ApplicationWorkbenchWindowAdvisor.preOpenWindow()

configurer.setShowProgressIndicator(true);

einfügen.

Dann sollte es gehen...

EDIT:

Habe ein kleines RCP-Projekt angehängt. Ist einfach mit den ActionSet Assistenten gemacht und Hallo Welt durch den Updatejob ersetzt. Es funktioniert und zeigt die Klasse, die Dependencies, sowie das Plugin XML-File


----------



## KlaDi (10. Mai 2007)

Hallo limago,

vielen Dank erstmal für Deine Hilfe. Leider habe ich noch ein paar Probleme und zwar bei der Update-Action-Klasse die du geschrieben hast bekomme ich bei diesen beiden Zeilen:

```
UpdateJob job = new UpdateJob("Suche updates", false, false); 
UpdateManagerUI.openInstaller(window.getShell(), job);
```
 den Fehler:
UpdateJob cannot be resolved to a Type, das gleiche gilt für UpdateManagerUI.

Und wenn ich das bei dem Feature das Build erstelle gibt es den Fehler, das Compilations error occured during the build, aber ich glaube das liegt an den beiden Fehlern oben.  

Hast Du vielleicht ne Idee, woran es liegen könnte?

Die beiden Exports:
	
	
	



```
import org.eclipse.update.ui.UpdateJob;
import org.eclipse.update.ui.UpdateManagerUI;
```
erkennt Eclipse bei mir auch als unnötig.

gruß Klaus.


----------



## KlaDi (10. Mai 2007)

Ok, also hab den Fehler gefunden in meiner Anwendung fehlte in der Manifest.MF unter dem Reiter Dependencies bei Requiered Plug-Ins noch org.eclipse.update.ui.

Jetzt habe ich in meinem Package Explorer folgendes:

Meine Anwendung -> Feature , das ich wie oben beschrieben erstellt habe
MeineAnwendung-RCP -> Meine Anwendung halt
MeineAnwendung-Update -> Durch den Buildprozess entstanden.

Wie kann ich jetzt dafür sorgen, das das Update auf dem Server liegt und ich mit meinen Clients dieses mir holen kann?

gruß Klaus.
[EDIT]Wenn ich meine Anwendung starte und die UpdateAction ausführe passiert nichts, es sollte sich doch eigentlich wenigenstens ein Fenster öffnen oder?
Außerdem habe ich in meinem Menü keinen Eintrag mehr Find and Install....Wie kann ich den wiederherstellen?


----------



## limago (10. Mai 2007)

Hallo KlaDi,

möglicherweise bist Du zu ungeduldig. Wie Du schon richtig erkannt hast sollte ein Dialog aufgehen ;-). Dieser Dialog zeigt Updatequellen aus dem Netz. Du must online sein, es darf keine Proxy, Firewall oä die Verbindung stören und (das hat mich auch erst verwirrt) es dauert einen Moment.

Bring doch erst mal das zum Laufen, oder lade mein Demoprojekt runter. Das sollte laufen. Ich habe leider wenig Zeit sonst würde ich Dir zeigen, wie Du einen dynamischen Update für Dein Feature bauen kannst.

Die Tage reiche ich das nach.

Grüße


----------



## limago (11. Mai 2007)

So! ich habe ein Worddokument erstellt, mit einer Step by Step Anleitung für ein komplettes Projekt mit Feature, Updatesite, Action code und allem. Es ist unter Eclipse 3.2 geschrieben und getestet. Leider ist das Dokument zu groß für einen Upload, deswegen dieser Link .

Den Code für die Actions nochmal hier zur besseren Lesbarkeit

```
package de.tutorials.rcp_update.actions;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.update.ui.UpdateJob;
import org.eclipse.update.ui.UpdateManagerUI;

public class UpdateAction implements IWorkbenchWindowActionDelegate {

	private IWorkbenchWindow window;

	public void dispose() {
		// TODO Auto-generated method stub

	}

	public void init(IWorkbenchWindow window) {
		this.window = window;
	}

	public void run(IAction action) {
		BusyIndicator.showWhile(window.getShell().getDisplay(), new Runnable(){

			public void run() {
				UpdateJob job = new UpdateJob("Suche updates", false, false);
				UpdateManagerUI.openInstaller(window.getShell(), job);
				
			}});

	}

	public void selectionChanged(IAction action, ISelection selection) {
		// TODO Auto-generated method stub

	}

}
```


```
package de.tutorials.rcp_update.actions;

import java.net.MalformedURLException;
import java.net.URL;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.update.search.BackLevelFilter;
import org.eclipse.update.search.EnvironmentFilter;
import org.eclipse.update.search.UpdateSearchRequest;
import org.eclipse.update.search.UpdateSearchScope;
import org.eclipse.update.ui.UpdateJob;
import org.eclipse.update.ui.UpdateManagerUI;

import com.sun.org.apache.bcel.internal.generic.GETSTATIC;

public class NewUpdatesAction implements IWorkbenchWindowActionDelegate {

	private IWorkbenchWindow window;

	public void dispose() {
		// TODO Auto-generated method stub

	}

	public void init(IWorkbenchWindow window) {
		this.window = window;

	}

	public void run(IAction action) {
		BusyIndicator.showWhile(window.getShell().getDisplay(), new Runnable(){

			public void run() {
				UpdateJob job = new UpdateJob("Suche neue Extensions", getSearchRequest());
				UpdateManagerUI.openInstaller(window.getShell(), job);
				
			}

			private UpdateSearchRequest getSearchRequest() {
				
				UpdateSearchRequest result = new UpdateSearchRequest(UpdateSearchRequest.createDefaultSiteSearchCategory(),new UpdateSearchScope() );
				result.addFilter(new BackLevelFilter());
				result.addFilter(new EnvironmentFilter());
				UpdateSearchScope scope = new UpdateSearchScope();
				try {
					URL url = new URL("http://localhost");// oder wo auch immer...
					scope.addSearchSite("rcpupdate_site", url, null);
					
				} catch (MalformedURLException e) {
					//Überstringe falsche URLs 
				} 
				result.setScope(scope);
				return result;
			}});

	}

	public void selectionChanged(IAction action, ISelection selection) {
		// TODO Auto-generated method stub

	}

}
```

Das dynamische Updaten für das eigene Projekt folgt bald.

Hier noch eine Action für das Managen von Extensions:


```
package de.tutorials.rcp_update.actions;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.update.ui.UpdateManagerUI;

public class ManageExtensionsAction implements IWorkbenchWindowActionDelegate {

	private IWorkbenchWindow window;

	public void dispose() {
		// TODO Auto-generated method stub

	}

	public void init(IWorkbenchWindow window) {
		this.window = window;

	}

	public void run(IAction action) {
		UpdateManagerUI.openConfigurationManager(window.getShell());

	}

	public void selectionChanged(IAction action, ISelection selection) {
		// TODO Auto-generated method stub

	}

}
```


----------

