# EMF -> Leere Elemente sollen in Property View nicht angezeigt werden



## greeni (7. Sep 2010)

Hallo Zusammen,

ich kämpfe gerade mit folgendem Problem. Ich habe mir aus einer xsd Datei ein Model samt Editor erstellt. Soweit hatt auch alles funktioniert. Es gibt nur ein Problem!!
In der Property View werden mir auch für die Attribute und Elemente, für die es in meiner xsd KEINE default oder fixed Werte gibt, default werte angezeigt. Die aber zum glück beim speichern wenigstens nicht serialisiert werden. Ist aber trotzdem sehr verwirrend...

Ein Beispiel:
[XML]
<xs:simpleType name="MyType">
<xs:restriction base="xs:unsignedByte">
<xs:minInclusive value="1" />
<xs:maxInclusive value="8" />
</xs:restriction>
</xs:simpleType>
[/XML]

Für das gerade angegebene Beispiel darf ich in der Property View nur Werte von 1 bis 8 angeben. Das funktioniert auch... allerdings wird mir wenn ich nichts eingebe 0 angezeigt. Das verwirrt... 

Ich möchte das so lange nichts in der propertyview angezeigt wird, bis ich etwas eintrage. Es sei denn ich habe default oder fixed werte in der xsd deklariert. 

Wie kann ich dieses Problem lösen??


----------



## Wildcard (7. Sep 2010)

Intern wird das wohl auf einen int abgebildet und ein int hat immer einen Wert. Du musst vermutlich den generierten Edit Code anpassen das für den Wert 0 ein leerer String zurückgegeben wird.


----------



## greeni (8. Sep 2010)

Bei der Lösung gibt es aber 2 Probleme...

1. Problem: ich habe ca. 900 generierte Klassen, diese von hand zu ändern ist einfach zu viel Arbeit. Vorallem, weil ich die zurzeit immer wieder neu generieren muss da sich die xsd ständig ändert.

2. Problen:
Ich habe das Problem nicht nur bei Zahlen sondern auch bei allen anderen Typen.
Zum Beispiel wenn ich für einen Wert verschiedene enum Werte vorgebe, wird mir immer ein Wert (der 1.) in der PropertyView angezeigt. So das der Benutzer denkt, da währe schon was ausgewählt. Was aber nicht der Fall ist.

Kann man da nicht auf Seiten der ProperrtyView was machen? Vieleicht irgendeine Methode Überschreiben?
Oder auf Seoiten von EMF? Irgendeine Einstellung die ich nicht kenne?


----------



## Wildcard (10. Sep 2010)

> 1. Problem: ich habe ca. 900 generierte Klassen, diese von hand zu ändern ist einfach zu viel Arbeit. Vorallem, weil ich die zurzeit immer wieder neu generieren muss da sich die xsd ständig ändert.


Ist keine Vererbungshierarchie vorhanden? Du müsstest ja nur  für die Basisklassen anpassen. Das neu generieren ist kein Problem, da EMF händische Änderungen nicht überschreibt.


> Ich habe das Problem nicht nur bei Zahlen sondern auch bei allen anderen Typen.
> Zum Beispiel wenn ich für einen Wert verschiedene enum Werte vorgebe, wird mir immer ein Wert (der 1.) in der PropertyView angezeigt. So das der Benutzer denkt, da währe schon was ausgewählt. Was aber nicht der Fall ist.


Du wirst aber nicht abstreiten können das es Sinn macht, denn wenn kein Wert eingegeben wurde ist der Default aktiv. 




> Kann man da nicht auf Seiten der ProperrtyView was machen? Vieleicht irgendeine Methode Überschreiben?
> Oder auf Seoiten von EMF? Irgendeine Einstellung die ich nicht kenne?


Du kannst die Properties View (bzgw. die EMF Adapter für die View) natürlich schon anpassen. Mit eIsSet solltest du erkennen können ob ein vom Default abweichender Wert gesetzt ist, oder nicht und dann entsprechend ausblenden, bzgw einen leeren String anzeigen.


----------



## greeni (15. Sep 2010)

Hallo Wildcard, erstmals Danke für deine bisherigen Antworten.
Ich hätte da diesbezüglich noch ein Problem. Das vorhin beschriebene Problem bezieht sich leider nicht nur auf Attribute sondern auch auf Elemente (hab ich nur gerade eben entdeckt). D.h. ich habe Elemente die eigentlich nicht leer sein dürfen. Der Benutzer soll irgendwie gezwungen werden, in diese Elemente etwas rein zu schreiben. Die Validierung schlägt hier leider nicht an, da es meines Wissens bei Elementen nicht so etwas wie required in xsd gibt... wobei, so ganz richtig ist das nicht... ich bekomme zwar keine Valiederungsfehler aber wenn ich die xml Datei neu öffnen bekomme ich IllegalValue Exceptions... Dieses Verhalten kann ich mir leider noch nicht erklären.... 

Kennst du vieleicht eine Möglichkeit, wie man es Trotzdem relisieren kann, daß der Editor einen dazu zwingt, dass Elementwete eingetragen werden müssen?


Ach ja, noch etwas wie meinst du das mit dem EMF-Adapter für die PropertyView überschreiben? Wo finde ich diesesn und wie kann ich darin den Valuewert der in der Proprtyview ausblenden?

Ich weiß ich habe viele Fragen...


----------



## Wildcard (15. Sep 2010)

In XSD schreibst du minOccurs="1", EMF wird dieses Constraint dann auch validieren.


> Ach ja, noch etwas wie meinst du das mit dem EMF-Adapter für die PropertyView überschreiben? Wo finde ich diesesn und wie kann ich darin den Valuewert der in der Proprtyview ausblenden?


Ich habe die Implementierungsdetails der EMF IPropertySource auch nicht im Kopf. Du kannst entweder den Editor so ändern das er deine eigene Property Page zurückliefert, oder dich in den EMF Mechanismus einklinken. Wie man sich am besten in die EMF Provider für die Properties View einklinkt kann ich dir wie gesagt nicht ohne Nachforschung beantworten, daher würde ich dir empfehlen einfach selbst mal danach zu googlen, oder im EMF Buch nachzuschauen.


----------



## greeni (16. Sep 2010)

minOccurs ist defaultmäßig schon auf 1. Das Problem ist nicht das, dass Element fehlt... sondern dass es keinen Inhalt hat. Also folgendes möchte ich verbieten <myElement/>. Die Validierung soll sich hier melden, so das der Benutzer gezwungen wird etwas in das Element hinein zu schreiben. Das es nachher so aussieht <myElement>text</myElement>. 

So etwas wie minlength = 1 funktioniert leider nicht, da sich dies nur dann auswirkt, wenn ich etwas in das Element reinschreiben möchte, es kann aber sein dass der Benutzer ganz vergisst etwas in das Element zu schreiben und das will ich verhindern.

Sehr kompliziert... ich weiß... es wundert mich das bisher anscheinend noch nie jemand so ein Problem hatte. Ich finde das gar nicht so außergewöhnlich.... aber man findet dazu gar nichts im Netz. Oder es ist vieleicht ganz einfach und ich sehe gerade den Wald vor lauter Bäumen nicht.


----------



## Wildcard (17. Sep 2010)

> Also folgendes möchte ich verbieten <myElement/>. Die Validierung soll sich hier melden, so das der Benutzer gezwungen wird etwas in das Element hinein zu schreiben. Das es nachher so aussieht <myElement>text</myElement>.


Und das sollte auch so funktionieren. Was passiert denn wenn du einen Rechtsklick auf das leere Element machst und dort Validate auswählst?


----------



## greeni (18. Sep 2010)

Leider funktioniert genau das nicht... wenn ich auf Valdiate klicke, passsiert gar nichts. 

Die Validierung sagt, das alles in Ordnung sei. Wenn ich in der xml Datei von Hand etwas falsches Eintrage, also einen Wert der gegen meine restriktion verstöst (<myElement>falscherText</myElement>) und diese Datei in meinen Editor lade... so schlägt die Validierung an und bringt die Meldung, das Der Wert in dem Element nicht den Bedingungen genügt.

Also die restrictions wirken sich nur aus, wenn ich was falsches Eintrage. Sie Prüfen nicht, ob überhaupt etwas eingetragen ist.


----------



## Wildcard (18. Sep 2010)

Wundert mich zwar das eine zero length Restriction nicht automatisch umgesetzt wird, aber falls dem wirklich so ist, dann versuch es mal mit EMF Validation:
Eclipse Modeling - EMF - Home


----------

