# Plugin - Properties ohne PropertyPage speichern



## dragon_ (7. Sep 2011)

Guten Tag,
ich arbeite gerade an einem Plugin, dass mithilfe eines Wizards Daten (erstemal Strings) vom Benutzer einliest. Dabei sollen diese Daten gespeichert werden, da sie für den weiteren Verlauf wichtig sind.

Die Frage ist wie speichere ich diese Daten(properties) ab?



Ich habe nun zum einen den Begriff persistent properties gefunden, der die properties über den einer Eclispe Session hinaus hällt. Jedoch werden diese properties an eine Resource gebunden, an die ich nur in der PropertyPage mit der Methode 
	
	
	
	





```
getElement().getAdapter(IResource.class)
```
 komme. Diese Methode ist aber keine statische Methode sodass eine Instanz vorhanden sein muss. Diese Instanz wiederrum wird aber nur beim Öffnen der PropertyPage erzeugt 



Zum anderne gibt es den Begriff project properties. Hierbei werden die properties für das Projekt gespeichert (eigentlich wie oben auch?!). Hierbei wird über den ProjectScope alles geregelt und die properties als Nodes eingebunden:

```
IScopeContext context = new ProjectScope(project);
IEclipsePreferences prefs = context.getNode(Activator.PLUGIN_ID);
prefs.put(key,value );
prefs.flush();//speichert alles
```

Jedoch besteht hier wiederrum das Problem dass ich nicht weiss wie man an das aktuelle Projekt kommt, ohne zu wissen, wie es heisst. Das heisst die Variable project ist vom Typ IProject. (Es gibt ja keine Selection womit ich das Projekt identifizieren kann) 



Als dritten Begriff gibts noch den PreferenceStore. Jedoch wenn ich es richtig verstanden habe wird dieser benutzt, um Plugin Preferences zu speichern. D.h. nicht projektbezogene, sondern Plugin- bezoge Einstellungen zu handlen.

Wiess jemand vielleicht Rat bei dem Speichern von Properties, oder gehe ich vielleicht in eine falsche Richtung?

Vielen Dank im Vorraus für jede Antwort.


----------



## Wildcard (7. Sep 2011)

Erstmal eine Frage:


> Dabei sollen diese Daten gespeichert werden, da sie für den weiteren Verlauf wichtig sind.


Sind diese Daten nur für den Wizard wichtig, oder auch relevant nachdem der Wizard beendet wurde? Wenn Ersteres, sind Preferences der falsche Weg.

Wenn letzteres:
Es gibt per Default 4 verschiedene Scopes:
Default - Default Werte
Projekt - bezieht sich auf ein Projekt
Instance - bezieht sich auf einen Workspace
Installation - bezieht sich auf eine Eclipse Installation

Welcher dieser Scopes ist der richtige für dich?


----------



## dragon_ (7. Sep 2011)

Ja also es sind Projektinformationen. Also wie, wenn ich bei einem JavaProjekt auf den ContextMenüeintrag "Properties " gehe und auf Resource.

Es sind Informationen, die ich für einen späteren Ablauf im Plugin benötige.

Somit ist Frage zwei auch beantwortet. Ich brauche ProjectScope. Also sie sollen für das Projekt gespeichert werden. Wenn ich ein anderes Projekt habe sollen nur dessen Properties angezeigt werden.


----------



## Wildcard (8. Sep 2011)

Genau, der ProjectScope ist dann das richtige. Das bedeutet du brauchst eine Referenz auf das Projekt. Wenn dein Wizard ein WorkbenchWizard ist, bekommt er eine selection übergeben. Dort kannst du dann dein Projekt abholen sofern die Action auf einem Projekt aufgerufen wurde.


----------



## dragon_ (8. Sep 2011)

Ok das habe ich so noch nicht ganz verstanden.

Also ich habe einen Wizard zum Erstellen eines Java Projektes. Ich habe als Extension "org.eclipse.ui.newWizards" einen Wizard, der von Wizard ableitet und das Interface INewWizard implementiert, eingefügt. Hierbei entstehen nun verschiedene Eingaben vom Benutzer und am Ende gibt es die JavaProjectWizardPages.

Diese Eingaben sollten nun irgendwo gepeichert werden. Hierbei habe ich nicht den Namen des Projektes. Das Projekt wird erst nach dem performFinish() erstellt, daher gibt es dieses vorher nicht.

D.h. das problem ist dass ich keien Selection habe. Weder zum Speichern noch zum Abrufen der Properties. Das Speichern sollte eben intern und nicht von einer Benutzeraktion ausgeführt werden.

Es stellt sich also die Frage wie bekomme ich mein Projekt zur Laufzeit des Plugins.


----------



## Wildcard (8. Sep 2011)

> Diese Eingaben sollten nun irgendwo gepeichert werden. Hierbei habe ich nicht den Namen des Projektes. Das Projekt wird erst nach dem performFinish() erstellt, daher gibt es dieses vorher nicht.


Den Namen musst du haben. Wie willst du das Projekt erstellen, wenn du den Namen nicht kennst?


----------



## dragon_ (8. Sep 2011)

Wildcard hat gesagt.:


> Den Namen musst du haben. Wie willst du das Projekt erstellen, wenn du den Namen nicht kennst?



Nein ja also in performFinish() habe ich den Projektnamen. Durch die Methode NewJavaProjectPage.getProjectName() bekommt man diesen. Aber den Namen irgendwo zu speichern ist schlecht. Und zwar aus dem Grund, dass der Benutzer sein Projekt umbenennen kann und dann hat man ein Problem wenn man mit diesen Namen, den man bei der Erstellung angegeben hat, benutzt. Deshalb war die Frage wie kommt man an den Namen des Projektes zur Laufzeit ohne Selection??


----------



## Wildcard (8. Sep 2011)

Wer redet denn davon den Namen des Projekts irgendwo zu speichern? Du brauchst den Namen nur zum performFinish Zeitpunkt um den richtigen Projekt Scope zu erstellen und dort deine Settings zu hinterlegen.


----------



## dragon_ (8. Sep 2011)

Jop ok danke , genau soviel habe ich auch verstanden. Sorry ich bin schon ein Schritt weiter gegangen. 
Ok also die Einstellungen kann ich nun speichern.


Die nächste Frage wäre nun, wie ich auf die Einstellungen zugreife? Man wird hierfür ja auch den ProjectScope benötigen. 


> ```
> IScopeContext context = new ProjectScope(project);
> IEclipsePreferences prefs = context.getNode(Activator.PLUGIN_ID);
> prefs.put(key,value );
> ```



Der einzige Unterschied wird sein, dass man anstelle von put, ein get benutzt.
D.h. wie kommt man nun dazu, auf die properties zuzugreifen?


----------



## Wildcard (8. Sep 2011)

Ja, statt put ein get. Verstehe das Problem nicht wirklich.


----------



## dragon_ (9. Sep 2011)

OK, vielleicht habe ich auch nur gerade einen Gedankenfehler. Also Szenario:


Ich baue als erstes mir mit Hilfe des Wizards ein neues Java Projekt. Bei dem Klick auf Finish (performFinish Methode) speichere ich mir meine Einstellungen ab. Hierbei ist alles klasse.

Ich beende Eclipse und starte es neu. Ich gehe nun auf das Projekt und rufe die propertiesPage auf um die Properties dort auszulesen und anzuzeigen. Ok hierbei werde ich wohl mit Hilfe der getElement().getAdapter(IProject.class) auf das Projekt kommen. 

 Nun will ich z.B eine Funktion anstoßen, bei der diese properties gebraucht werden. Dabei muss ich auch wiederrum über das Contextmenü das Projekt auswählen, wodurch ich eine ISelection habe. Damit würde ich auch an das Projekt glaube ich kommen. 

Ok ich habe nun meinen Gedankenfehler gemerkt  Sorry. Ich habs nur nochmal für andere Leser zusammengefasst, was ich machen wollte.

Ich werde es gleich oder morgen früh einmal so ausprobieren und schaun ob ich noch Fragen habe oder das Thema als erledigt markieren kann.

Schon einmal einen rießen Dank an Wildcard. :applaus:


----------



## Wildcard (9. Sep 2011)

Ich glaube jetzt hast du's 
Noch zur Info: die Einstellungen liegen dann auch tatsächlich *im* Projekt. Genauer im versteckten Verzeichnis .setings. Der angenehme Seiteneffekt: damit können die Projektspezifischen Eigenschaften ins Repository committed werden und sind damit allen Team Mitgliedern zugänglich.


----------

