Einstellungen und Konfiguration
Ordner zur Ablage von Anwendungskonfiguration
Eclipse-Anwendungen haben zwei Ordner, in denen Dateien zur Laufzeit gespeichert werden:
-
WorkspaceDer
Workspaceist der zentraler Ordner für Benutzerdateien. Jede Anwendung wird mit einem Workspace-Ordner gestartet, der von der Eclipse Plattform verwaltet wird. Zur Laufzeit wird der Ordner über die Eigenschaftosgi.instance.areabzw. über das Kommandozeilenargument-datakonfiguriert. Standardmäßig liegt er unterworkspaceneben dem Launcher-Binary. Beim Start aus der IDE können Sie den Ordner in derRun Configurationkonfigurieren und beim Start der Anwendung zurücksetzen lassen:
-
Configuration AreaNeben dem
Workspacefür Benutzerdateien existiert für Plug-ins der Laufzeitumgebung und Eclipse Runtime noch dieConfiguration Area. Diese ist als interner Ordner der Eclipse Plattform zu betrachten. Hier werden vor allem Metadaten, Caches sowie interne Konfigurationsdateien (z.B. die Startkonfigurationconfig.ini) abgelegt. Der Ordner wird überosgi.configuration.areabzw.-configurationkonfiguriert und liegt standardmäßig im Anwendungsordner unterconfiguration. Beim Start aus der IDE können Sie den Ordner in derRun Configurationkonfigurieren und beim Start der Anwendung zurücksetzen lassen:
Zustand der Workbench speichern
Die Eclipse Workbench bietet die Möglichkeit, den Zustand der Workbench automatisch zu speichern. Dabei werden z.B. die Größe des Workbench-Fensters, das Layout aller geöffneten Perspektiven sowie die zuletzt aktive Perspektive gespeichert und beim nächsten Start wiederhergestellt. Um dieses Feature zu aktivieren, ergänzen Sie den WorkbenchAdvisor der Anwendung um die Konfigurationsoption saveAndRestore:
public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
public void initialize(IWorkbenchConfigurer config) {
config.setSaveAndRestore(true);
}
}
Diese Zustandsinformationen werden in sogenannten Memento-Objekten abgelegt. Ein Memento repräsentiert den Zustand eines Objektes in einer persistierbaren Hierarchie von Key-Value-Paaren. Dieses Memento kann um weitere Informationen ergänzen werden, indem die Methoden saveState und restoreState der WorkbenchAdvisor bzw. WorkbenchWindowAdvisor-Klasse implementiert werden. Zum Beispiel:
public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
@Override
public void initialize(IWorkbenchConfigurer configurer) {
configurer.setSaveAndRestore(true);
}
@Override
public IStatus saveState(IMemento memento) {
memento.createChild("myApp").putString(
"lastOpenedDate", DateFormat.getDateTimeInstance().format(new Date()));
return super.saveState(memento);
}
@Override
public IStatus restoreState(IMemento memento) {
if (memento != null) {
IMemento myAppMemento = memento.getChild("myApp");
if (myAppMemento != null)
System.out.println("Last opened on: " +
myAppMemento.getString("lastOpenedDate"));
}
return super.restoreState(memento);
}
}
Die Memento-Objekte werden im Anwendungs-Workspace unter .metadata/.plugins/org.eclipse.ui.workbench persistiert.
Nach der Aktivierung von saveAndRestore gilt es zu beachten, dass das Layout einer Perspektive gespeichert wird, sobald diese einmal geöffnet wurde. Änderungen an der PerspectiveFactory bzw. Contributions über perspectiveExtensions wirken daher erst nach einem Zurücksetzen der Perspektive. Dies kann direkt in der Anwendung mit dem Command “Perspektive zurücksetzen” (org.eclipse.ui.window.resetPerspective) oder über ein Zurücksetzen des gesamten Workspace in der Startkonfiguration geschehen.
Zustand von Views persistieren
Wird der saveAndRestore-Mechanismus der Workbench aktiviert, können auch Views durch Überschreiben der Methoden saveState und init Einstellungen in einem Memento-Objekt ablegen:
public class SomeViewPart extends ViewPart {
@Override
public void saveState(IMemento memento) {
memento.putString("someViewState", "42");
}
@Override
public void init(IViewSite site, IMemento memento) throws PartInitException {
super.init(site, memento);
if (memento != null) {
System.out.println("State is: " + child.getString("someViewState"));
}
}
}
Eigene Dateien je Plug-in ablegen
Zur Ablage von eigenen Dateien in einem Plug-in kann über den Activator ein State-Ordner erreicht werden. Dieser bietet sich insbesondere an, wenn ein Plug-in seinen Zustand in einem eigenen Datenformat persistieren möchte. Die Daten werden im workspace unter .metadata/.plugins/<bundle-id>/ abgelegt.
IPath stateLocation = Activator.getDefault().getStateLocation();
File stateFile = stateLocation.append("state.txt").toFile();
PrintWriter writer = new PrintWriter(stateFile);
writer.println("some state");
writer.close();
Einstellungen
Plug-in-spezifische Konfigurationsoptionen können über den Eclipse-eigenen Preference Store verwaltet werden. Diese Optionen werden im Workspace unter .metadata/.plugins/org.eclipse.core.runtime/.settings/<bundle-id>.prefs abgelegt. Diese Variante bietet sich für Konfigurationsoptionen an, die vom Benutzer über den Einstellungsdialog der Anwendung konfiguriert werden sollen.
Der Eclipse-Einstellungsdialog kann der Anwendung mit dem Standard-Command org.eclipse.ui.window.preferences hinzugefügt werden:
Über den Extension Point org.eclipse.ui.preferencePages können Plug-ins diesen Dialog um eigene Einstellungsseiten ergänzen:
<extension point="org.eclipse.ui.preferencePages">
<page
class="com.example.SomePreferencePage"
id="com.example.SomePreferencePage"
name="Some preferences">
</page>
</extension>
Neben eigenen Implementierungen des Interfaces IWorkbenchPreferencePage steht die Basisklasse FieldEditorPreferencePage zur Verfügung, die über FieldEditor-Objekte die Bearbeitung von Einstellungsoptionen abstrahiert, z.B.:
public class SomePreferencePage extends FieldEditorPreferencePage
implements IWorkbenchPreferencePage {
public final static String SOME_OPTION = "SomeOption";
@Override
protected void createFieldEditors() {
// Felder der Einstellungsseite hinzufügen
addField(new StringFieldEditor(SOME_OPTION, "Some Option", getFieldEditorParent()));
}
@Override
public void init(IWorkbench workbench) {
// Preference Store des eigenen Plug-ins setzen
setPreferenceStore(Activator.getDefault().getPreferenceStore());
}
}
Folgende Editor-Typen stehen dabei zur Verfügung: BooleanFieldEditor, IntegerFieldEditor, StringFieldEditor, RadioGroupFieldEditor, ColorFieldEditor, FontFieldEditor, DirectoryFieldEditor, FileFieldEditor und PathEditor
Der programmatische Zugriff auf diese Einstellungen erfolgt über den PreferenceStore des jeweiligen Plug-ins:
IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore();
String value = preferenceStore.getString(SomePreferencePage.SOME_OPTION);
Es ist empfehlenswert, Veränderungen an den Eigenschaften zu beobachten, um auf Änderungen an den Einstellungen zur Laufzeit reagieren zu können:
preferenceStore.addPropertyChangeListener(new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
if (SomePreferencePage.SOME_OPTION.equals(event.getProperty())) {
// handle change from event.getOldValue() to event.getNewValue()
}
}
});
Vordefinierte Preference Pages
Die Klasse org.eclipse.ui.ExtensionFactory definiert unter anderem fertige Einstellungsseiten, die in eigene Anwendungen eingebunden werden können, z.B.:
<extension point="org.eclipse.ui.preferencePages">
<page
class="org.eclipse.ui.ExtensionFactory:newKeysPreferencePage"
id="newKeysPreferencePage"
name="Keys"/>
</extension>



Ich finde diese Abhandlung gelungen. Was mir hier fehlt ist die genauere Betrachtung wenn Eclipse bzw. eine RCP-Anwendung von mehreren Anwendern verwendet wird (RCP-Anwendung liegt auf dem Server und Anwender greifen via Link darauf zu). Diese Problematik wird zu 90% erst gar nicht betrachtet. Es wird leider immer von einer 1-User-Anwendung ausgegangen.