Integration von EMF in den Eclipse Workspace

Das Plugin com.ibm.wtp.emf.workbench enthält Klassen die ein ResourceSet, welches für das Erstellen, Laden und Speichern von Resourcen verantwortlich ist, mit einem Projekt im Eclipse Workspace verbinden. Dieses Plugin definiert vier Extension Points (ResourceHandlerExtension, globalPluginResourceLoad, nature_registration und internalWorkbenchContextFactory). Mit Hilfe der Klasse EMFNature wird das ResourceSet in den Workspace integriert. Dazu muss eine eigene Klasse von dieser abgeleitet werden und die vier abstrakten Methoden überschrieben werden. Die Methode primaryContributeToContext(EMFWorkbenchContextBase aNature) wird aufgerufen, sobald eine Resource von der Nature zum ersten mal angefordert wird. In dieser Methode muss der sogenannte WorkbenchContext der Nature bekanntgegeben werden.

public void primaryContributeToContext(EMFWorkbenchContextBase aNature) {
  if (emfContext != aNature) {
    emfContext = aNature;
  }
}

Die einfachste Implementierung, bei der die Nature eine Referenz auf den WorkbenchContext erhält, sieht wie im obigen Codeabschnitt aus. Mit Hilfe dieser Referenz können dann Resourcen über diese Nature geladen werden.

Ein beispielhafter Modell-Explorer kann jetzt die im Navigator ausgewählte Resource über die EMFNature laden. Die EMFNature lädt nicht nur die Resource, sondern cached diese auch gleichzeitig für spätere Zugriffe. Damit werden weitere Aufrufe der selben Resource stark beschleunigt.

 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
  IFile file = null;
  // ignore our own selection or null selection
  if (part == this || selection == null) { return; }
  if (selection instanceof IStructuredSelection) {
    IStructuredSelection ssel = (IStructuredSelection) selection;
    Object obj = ssel.getFirstElement();
    if (obj instanceof IFile) {
      file = (IFile) obj;
    } else if (obj instanceof IAdaptable) {
      file = (IFile) ((IAdaptable) obj).getAdapter(IFile.class);
    } else {
      file = null;
    }
  }
  if (file != null && file.exists()) {
    IProject project = file.getProject();
    if (MyEMFNature.hasNature(project)) {
      MyEMFNature nature = MyEMFNature.getNature(project);
      URI fileURI = URI.createPlatformResourceURI(file.getFullPath().toString());
      try {
        resource = nature.getResource(fileURI);
      } catch (WrappedException e) {
        resource = null;
      }
      updateViewer();
    }
  }
}

In diesem Codeabschnitt wird eine Auswahl im Navigator ausgewertet und versucht die ausgewählte Datei zu laden. Danach wird die Ansicht aktualisiert.

Schlagwörter: , , ,

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: