Τελευταία ενημέρωση: 23 Ιουνίου 2005
Αυτό το έγγραφο παρουσιάζει μια βασική επισκόπηση του πλαισίου επικύρωσης του EMF και παρέχει μερικά παραδείγματα κώδικα που διευκολύνουν την υλοποίησή του. Για μια πιο λεπτομερή περιγραφή όλων των λειτουργιών του EMF, ανατρέξτε στο έγγραφο EMF: Eclipse Modeling Framework, Second Edition (Addison-Wesley Professional, 2008) ή στο Javadoc για τις κλάσεις του πλαισίου.
Θέλετε να διασφαλίσετε ότι τα δεδομένα του μοντέλου σας συμμορφώνονται με τους υφιστάμενους περιορισμούς; Διαβάστε παρακάτω για να δείτε πώς το πλαίσιο επικύρωσης του EMF μπορεί να σας βοηθήσει να το κάνετε.
Αμετάβλητη συνθήκη - Υλοποιείται ως μέθοδος κλάσης που ορίζεται στο μοντέλο. Στο πλαίσιο επικύρωσης, θεωρείται ισχυρότερη πρόταση σε σχέση με έναν περιορισμό. Για παράδειγμα, hasUSState(). |
![]() |
![]() |
![]() |
Ονομασμένος περιορισμός - Υλοποιείται ως μέθοδος σε μια εξωτερική κλάση λειτουργίας επικύρωσης και όχι στο ίδιο το μοντέλο. Στο πλαίσιο επικύρωσης, θεωρείται πιο αδύναμη πρόταση σε σχέση με μια αμετάβλητη συνθήκη. Για παράδειγμα, NonNegativeQuantity, ValidShipDate. |
![]() |
![]() |
![]() |
Περιορισμός βασιζόμενος σε σχήμα - Είναι παρόμοιος με τον ονομασμένο περιορισμό, με τη διαφορά ότι ορίζεται σε ένα σχήμα. Για παράδειγμα, 'quantity πρέπει να είναι μια τιμή int μεταξύ 0 και 100'. Επειδή η συμπεριφορά αυτών των περιορισμών είναι γνωστή, δεν απαιτείται κάποια πρόσθετη ενέργεια για την υλοποίησή τους. Όλοι οι περιορισμοί απλού είδους θα εφαρμόζονται αυτόματα από τη γεννήτρια κώδικα. <xsd:element name="quantity"> <xsd:simpleType> <xsd:restriction base="xsd:int"> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="100"/> </xsd:restriction> </xsd:simpleType> </xsd:element> |
Βήμα 1: | Δημιουργία περιορισμών στο μοντέλο |
Βήμα 2: | Ορισμός περιορισμών |
Βήμα 3: | Δημιουργία και εκτέλεση |
Παράρτημα: | Ειδικά θέματα |
Όπως με τον ορισμό των μοντέλων στο EMF, μπορείτε να δημιουργήσετε περιορισμούς επισημειώνοντας μια διεπαφή Java, ορίζοντας τους περιορισμούς σε ένα σχήμα XML ή προσθέτοντάς τους σε ένα μοντέλο του Rose. Η μέθοδος που θα χρησιμοποιήσετε εξαρτάται από την προέλευση του μοντέλου σας.
Για ένα μοντέλο του Rose, το στερεότυπο <<inv>> σε μια πράξη αντιπροσωπεύει μια αμετάβλητη συνθήκη. Μπορείτε να δείτε ένα σχετικό παράδειγμα στην Εικόνα 1 παραπάνω.
Για να προσθέσετε έναν περιορισμό χρησιμοποιώντας το Rose 98, ανοίξτε το μοντέλο και επιλέξτε μια κλάση (π.χ. "Item" στο παραπάνω παράδειγμα). Πατήστε με το δεξί κουμπί του ποντικιού και επιλέξτε Open Specification (Άνοιγμα προδιαγραφής). Στη συνέχεια, μεταβείτε στην καρτέλα Ecore και πατήστε στο πεδίο περιορισμών για να προσθέσετε τον περιορισμό (βλ. Εικόνα 2).
Για ένα οριζόμενο σε σχήμα μοντέλο, μπορείτε να ορίσετε ένα στοιχείο <xsd:restriction/> (όπως παραπάνω) ή έναν ονομασμένο περιορισμό:
<xsd:complexType name="Item"> <xsd:annotation> <xsd:appinfo source="http://www.eclipse.org/emf/2002/Ecore" ecore:key="constraints"> NonNegativeQuantity ValidShipDate </xsd:appinfo> </xsd:annotation> ... </xsd:complexType>
Για ένα οριζόμενο μέσω σημειώσεων Java μοντέλο, μπορείτε να ορίσετε αμετάβλητες συνθήκες και περιορισμούς ως εξής:
Αμετάβλητη συνθήκη /** * @model */ public interface USAddress { ... /** * @model */ boolean hasUSState( DiagnosticChain diagnostics, Map context); ... } |
![]() |
![]() |
![]() |
Περιορισμός /** * @model annotation="http://www.eclipse.org/emf/2002/Ecore constraints='NonNegativeQuantity ValidShipDate'" */ public interface Item { ... } |
Εισαγάγετε το μοντέλο σας στο EMF και δημιουργήστε τον αντίστοιχο κώδικα, όπως περιγράφεται στα βήματα 2 και 3 του προγράμματος εκμάθησης Δημιουργία μοντέλου EMF.
Ο κώδικας που θα δημιουργηθεί θα έχει την ακόλουθη μορφή:
Αμετάβλητη συνθήκη, com.example.ppo.impl.USAddressImpl public boolean hasUSState( DiagnosticChain diagnostics, Map context) { // TODO: implement this method // -> specify the condition that violates // the invariant // -> verify the details of the diagnostic, // including severity and message // Ensure that you remove @generated or // mark it @generated NOT if (false) { if (diagnostics != null) { diagnostics.add( new BasicDiagnostic( Diagnostic.ERROR, PPOValidator.DIAGNOSTIC_SOURCE, PPOValidator.US_ADDRESS__HAS_US_STATE, EcorePlugin.INSTANCE.getString( "_UI_GenericInvariant_diagnostic", new Object[] { "hasUSState", EObjectValidator.getObjectLabel(this, context)}), new Object [] { this })); } return false; } return true; } |
![]() |
![]() |
![]() |
Περιορισμός, com.example.ppo.util.PPOValidator public boolean validateItem_ValidShipDate( Item item, DiagnosticChain diagnostics, Map context) { // TODO implement the constraint // -> specify the condition that violates // the constraint // -> verify the diagnostic details, // including severity, code, and message // Ensure that you remove @generated or // mark it @generated NOT if (false) { if (diagnostics != null) { diagnostics.add( new BasicDiagnostic( Diagnostic.ERROR, DIAGNOSTIC_SOURCE, 0, EcorePlugin.INSTANCE.getString( "_UI_GenericConstraint_diagnostic", new Object[] { "ValidShipDate", getObjectLabel(item, context) }), new Object[] { item })); } return false; } return true; } |
Κώδικας δημιουργείται επίσης στη λειτουργία επικύρωσης (π.χ. στο com.example.ppo.util.PPOValidator) για κάθε καθορισμένη αμετάβλητη συνθήκη, αλλά αυτές οι μέθοδοι μεταβιβάζονται στις μεθόδους αμετάβλητων συνθηκών στα ίδια τα αντικείμενα. Για παράδειγμα:
public boolean validateUSAddress_hasUSState(USAddress usAddress, DiagnosticChain diagnostics, Map context) { return usAddress.hasUSState(diagnostics, context); }
Και στις δύο περιπτώσεις, πρέπει να τροποποιήσετε τον δημιουργούμενο κώδικα για να εξηγήσετε στο EMF πώς να υλοποιήσει την αμετάβλητη συνθήκη ή τον περιορισμό. Στην πρώτη περίπτωση, πρέπει να αλλάξετε την πρώτη γραμμή από:
if (false)
Σε:
if ("US".equals(getCountry()) && getState() == null).
Όταν ολοκληρώσετε τον ορισμό των περιορισμών, ανοίξτε έναν νέο χώρο εργασίας. Για λεπτομέρειες, ανατρέξτε στο βήμα 4 του προγράμματος εκμάθησης Δημιουργία μοντέλου EMF.
Το μοντέλο σας θα έχει πλέον ένα στοιχείο 'Validate' στο μενού της λειτουργίας επεξεργασίας.
Εικόνα 3. Εκκίνηση της επικύρωσης από το περιβάλλον χρήστη
Αν υπάρχουν μη έγκυρα δεδομένα στο μοντέλο, η επικύρωση θα αποτύχει και θα εμφανιστεί ένα πλαίσιο διαλόγου όπως αυτό στην Εικόνα 4.
Εικόνα 4. Πλαίσιο διαλόγου προβλημάτων επικύρωσης
Αν επιλέξετε ένα διαγνωστικό στοιχείο στο πλαίσιο διαλόγου πριν πατήσετε το κουμπί OK, το αντικείμενο που προκάλεσε τη σχετική παραβίαση θα επιλεγεί στη λειτουργία επεξεργασίας. Δείκτες για αυτά τα διαγνωστικά στοιχεία εμφανίζονται επίσης στην προβολή Προβλήματα του Eclipse.
Για να υλοποιήσετε την επικύρωση με άλλο τρόπο, όπως για παράδειγμα κατά την αποθήκευση ή το άνοιγμα ενός αρχείου, αρκεί απλά να κάνετε το εξής:
public static boolean validateObject(EObject eObject) { Diagnostic diagnostic = Diagnostician.INSTANCE.validate(eObject); return diagnostic.getSeverity() == Diagnostic.OK; }
Όταν χρησιμοποιείτε μια μέθοδο Diagnostician, το αποτέλεσμα της αποτίμησης υπολογίζεται με βάση ένα στοιχείο Diagnostic και όχι απλά με την επιστροφή μιας λογικής τιμής. Αυτό επιτρέπει τον προσδιορισμό της σοβαρότητας μιας κατάστασης και την έκθεση των περιορισμών και των αμετάβλητων συνθηκών που παραβιάστηκαν. Για παράδειγμα, αν θέλετε να εστιάσετε μόνο στα σφάλματα και στις προειδοποιήσεις, μπορείτε να κάνετε το εξής:
public static boolean validateObject(EObject eObject) { Diagnostic diagnostic = Diagnostician.INSTANCE.validate(eObject); if (diagnostic.getSeverity() == Diagnostic.ERROR || diagnostic.getSeverity() == Diagnostic.WARNING) { System.err.println(diagnostic.getMessage()); for (Iterator i=diagnostic.getChildren().iterator(); i.hasNext();) { Diagnostic childDiagnostic = (Diagnostic)i.next(); switch (childDiagnostic.getSeverity()) { case Diagnostic.ERROR: case Diagnostic.WARNING: System.err.println("\t" + childDiagnostic.getMessage()); } } return false; } return true; }
Όταν χρησιμοποιείτε τη μέθοδο Diagnostician.INSTANCE.validate(), επιστρέφεται μια εσωτερική επικύρωση των περιορισμών Ecore χάρη στο EObjectValidator που αποτελεί τη βάση όλων των κλάσεων επικύρωσης των δημιουργούμενων πακέτων. Στους περιορισμούς αυτούς περιλαμβάνονται τα εξής: