# Plugins interagieren lassen



## simlei (19. Jan 2009)

Hallo!
Ich glaubte schon, die Lösung gefunden zu habn, aber dann..
also, ich habe 2 Plugins, die je eine View darstellen, geschrieben. Dort gibt der User Werte ein, also dynamischer Content, und diesen sollen die Views austauschen können. Nur wie geht das? feste Referenz geht ja nicht, es is ja non static. Mein Versuch war es (ich bin recht neu in Eclipse) das anze über einen Extension Point bei Plugin #1 zu machen. Plugin #2 stöpselt sich an, über ein Interface, was in #1 definiert ist. In Plugin #2 gibt es dann eine Funktion, etwa getInputs();, welche über das Interface aus #1 vorgeschriben ist.
Überschwänglich habe ich gleich ne Anleitung in eine Wiki gepostet (den nehm ich dann wieder raus Wink ) man sieht da immerhin ganz genau wie ich es versucht habe (ist nicht sehr lang, ist im Prinzip ne Zusammenfassung dessen was mein versuch war)

http://jcryptool.wiki.sourceforge.net/Plugin_Interaction

naja, auf jeden fall habe ich dann aus Plugin #1 heraus den folgenden Aufruf getätigt:


```
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(org.jcryptool.analysis.
                                                          friedman.FriedmanPlugin.PLUGIN_ID, "helper");
                        IExtension[] extensions = extensionPoint.getExtensions();
                        for (IExtension extension : extensions) {
                                IConfigurationElement[] configElements = extension.getConfigurationElements();
                                for (IConfigurationElement configElement : configElements) {
                                        try {
                                                HelperInterface di = (HelperInterface)configElement.
                                                                   createExecutableExtension("theplugin");
                                                di.setExtResult(org.jcryptool.analysis.friedman.
                                                                   FriedmanPlugin.PLUGIN_ID, cachedResult);
                                        } catch (CoreException e) {
                                                System.err.println("CE: " + e);
                                                e.printStackTrace();
                                        }                               
                                }
                        }
```

Der Fehler, welcher meine Hoffnungen zunichte machte, war eben bei der kritischen Zeile

```
HelperInterface di = (HelperInterface)configElement. createExecutableExtension("theplugin");
```
- Fehler:
org.eclipse.core.runtime.CoreException: Plug-in "org.jcryptool.analysis.vigenerehelper" was unable to instantiate class "org.jcryptool.analysis.vigenerehelper.ui.VigenereHelperUI".

So funktionierts also nicht - offensichtlich wird die Klasse aus Plugin #2 eh instanziert, und die Werte, die ich vom user bekommen habe, kann ich somit nicht erhalten.

Kannn mir jemand verraten, wie es gehen soll, dass man das Beschriebene zustande bringt? Also, dass zwei Plugins während ihrer Laufzeit interagieren können in Sachen Werte austauschen (und vielleicht sogar gegenseitig Funktionen ausführen? das wäre ja noch mächtiger)

Oder war ich auf dem richtigen Weg schon? naja, ich brauche dringen Hilfe, ich bin am Ende meines Lateins, schon weil ich für den Anlauf der oben beschrieben ist viel recherchiert habe :/
Danke!


----------



## Wildcard (19. Jan 2009)

Die Art der Interaktion ist entscheidend. Extension Points sind zur Erweiterung gedacht, nicht um Referenzen auszutauschen.
Beschreibe deinen Use-Case, dann lässt sich leichter klären was eine für dich geeignete Lösung ist.


----------



## simlei (19. Jan 2009)

Nun ja,
ich schreibe fürs JCrypTool Plugins, die der Veranschaulichung von kryptographischen Analyseverfahren dienen. Hier habe ich mehrere Verfahren zu der Vigenere-Verschlüsselung, und verschiedene Analyseverfahren je als einzelne Plugins. Jedes Plugin enthält dabei eine View. Plugin #1 und #2 sind die richtigen Analysen (#1: Schlüssellänge finden, #2: Schlüssel selbst finden). Plugin #3 ist so eine Art Hilfe dazu, welches Zwischenergebnisse aus #1 und #2 empfangen soll und weiterverwendbar machen soll, auch Hilfe anbieten, etc.
Ich suche einen Weg, Ergebnisse, die in #1 und #2 erzielt oder vom benutzer eingegeben werden, Plugin #3 mitzuteilen, zur Laufzeit, und dieses soll dann diese verarbeiten und wieder den anderen Plugins mitteilen können.

So. Umgebung zur Frage hinreichend erklärt?  Für Vorschläge bin ich sehr dankbar.


----------



## Wildcard (19. Jan 2009)

Wenn das abhängig von der Selektion ist, geht man üblicherweise über den Selection Provider.
Wenn nicht, gibt es zB auch den direkteren Weg sich eine referenz auf die View zu holen und mit ihr zu interagieren.
http://help.eclipse.org/help32/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/ui/IWorkbenchPage.html#findView(java.lang.String)

Es gibt natürlich auch komplexere Möglichkeiten, aber von aussen ist so etwas immer schwer zu analysieren.


----------



## simlei (20. Jan 2009)

danke, diese Stoßrichtung wollte ich. Kennst du noch nen Codeschnipsel, wie ich mit der Referenz umgehe? Dann bin ich aufm Weg


----------



## Wildcard (20. Jan 2009)

Casten auf deine View Klasse?


----------



## simlei (20. Jan 2009)

Uff, so einfach 
Danke dir!!!


----------

