Viimeksi päivitetty: 23. kesäkuuta 2005
Tässä artikkelissa esitellään yleiskuvaus EMF-tarkistuskehyksen perusominaisuuksista ja esitetään muutama koodiesimerkki helpottamaan toteutusta. Voit lukea tarkemman kuvauksen kaikista EMF:n ominaisuuksista julkaisusta EMF: Eclipse Modeling Framework, Second Edition (Addison-Wesley Professional, 2008) tai katsoa lisätietoja itse kehyksen luokkien Javadoc-asiakirjoista.
Haluatko varmistaa, että mallin tiedot vastaavat tiedoille asetettuja rajoitteita? Tästä yleiskuvauksesta saat käsityksen siitä, miten voit EMF-tarkistuskehyksen avulla tehdä juuri niin kolmessa nopeassa vaiheessa.
Muuttumaton - Toteutettu luokkametodina, määritetty mallilla. Pidetään vahvempana ilmaisuna kelpoisuudesta kuin rajoitetta. Esimerkiksi hasUSState() |
![]() |
![]() |
![]() |
Nimetty rajoite - toteutettu menetelmänä ulkoisella tarkistusluokalla, ei mallilla itsellään. Pidetään heikompana ilmaisuna kelpoisuudesta kuin muuttumatonta. Esimerkiksi NonNegativeQuantity, ValidShipDate |
![]() |
![]() |
![]() |
Skeemaperustainen rajoite - kuten nimetyn rajoitteen kanssa, mutta määritetty skeeman sisällä. Esimerkiksi 'määrän on oltava int arvon 0 ja 100 välillä'. Tämänlajisilla rajoitteilla ei ole tunnettuja toimintatapoja, joten lisätyötä ei tarvita niiden toteuttamiseen: koodin luontitoiminto toteuttaa automaattisesti kaikki yksinkertaisen lajiset rajoitteet. <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> |
Vaihe 1: | Luo rajoitteet mallissa |
Vaihe 2: | Määritä rajoitteet |
Vaihe 3: | Luo & aja |
Liite: | Lisäaiheet |
Samoin kuin kaikessa EMF-kehyksessä voit aloittaa kommentein varustetusta Javasta, XML-skeemasta tai Rose-malleista. Rajoitteiden määritysmetodi vaihtelee mallin lähteen mukaan.
Rose-mallissa <<inv>>-stereotyyppi toiminnon käytössä vastaa muuttumatonta. Katso tästä esimerkki alla olevassa kuvassa 1.
Voit lisätä rajoitteen Rose 98 -työkalun avulla avaamalla mallin ja valitsemalla sitten luokan (esimerkiksi "Item" tässä käsitellyssä esimerkissä). Napsauta hiiren kakkospainikkeella ja valitse "Open Specification" (tai kaksoisnapsauta "Item"). Valitse sen jälkeen Ecore-välilehti ja napsauta rajoitteiden kenttää niiden lisäämiseksi edellä olevassa kuvassa 2 esitetyllä tavalla.
Voit määrittää skeemaa varten <xsd:rajoituksen/> (kuten yllä) tai nimetyn rajoitteen:
<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>
Kommentein varustettua Javaa varten voit määrittää muuttumattomat ja rajoitteet tältä näyttävällä tavalla:
Muuttumaton /** * @model */ public interface USAddress { ... /** * @model */ boolean hasUSState( DiagnosticChain diagnostics, Map context); ... } |
![]() |
![]() |
![]() |
Rajoite /** * @model annotation="http://www.eclipse.org/emf/2002/Ecore constraints='NonNegativeQuantity ValidShipDate'" */ public interface Item { ... } |
Tuo malli EMF-kehykseen ja luo sitten koodi samoin kuin vaiheessa 2 ja 3 opetusohjelmassa EMF-mallin luomisesta
Luotu koodi näyttää jokseenkin tältä:
Muuttumaton, com.example.ppo.impl.USAddressImpl public boolean hasUSState( DiagnosticChain diagnostics, Map context) { // TEHTÄVÄÄ: toteuta tämä metodi // -> määritä ehto, joka rikkoo // muuttumattoman // -> tarkista vianmääritystiedot, // mukaan lukien vakavuus ja sanoma // Varmista, että poistat @-generoidun tai // merkitset sen @-generoitu EI 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; } |
![]() |
![]() |
![]() |
Rajoite, com.example.ppo.util.PPOValidator public boolean validateItem_ValidShipDate( Item item, DiagnosticChain diagnostics, Map context) { // TEHTÄVÄ toteuta rajoite // -> määritä ehto, joka rikkoo // rajoitteen // -> tarkista vianmääritystiedot, // kuten vakavuus, koodi ja sanoma // Varmista, että poistat @-generoidun tai // merkitse se @-generoitu EI 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; } |
Koodi luodaan myös tarkistustoiminnossa, esimerkiksi com.example.ppo.util.PPOValidator-tarkistustoiminnossa, kaikille määritetyille muuttumattomille, mutta nämä metodit yksinkertaisesti delegoivat muuttumattoman metodeille objekteilla itsellään. Esimerkki:
public boolean validateUSAddress_hasUSState(USAddress usAddress, DiagnosticChain diagnostics, Map context) { return usAddress.hasUSState(diagnostics, context); }
Kummassakin tapauksessa luotu koodi on muokattava käsin selitteeksi EMF-kehykselle siitä, miten muuttumaton tai rajoite toteutetaan. Muuta ensimmäisessä tapauksessa ensimmäinen rivi seuraavasta muodosta:
if (false)
muotoon
if ("US".equals(getCountry()) && getState() == null).
Kun olet määrittänyt rajoitteet, aloita uusi työtila. Lisätietoja on EMF-mallin luomisesta kertovan opetusohjelman 4. vaihetta käsittelevässä kohdassa.
Mallissasi ei ole Validate-kohdetta muokkausohjelman valikossa.
Kuva 3. Aloita tarkistus UI:stä
Jos mallissa on virheellisiä tietoja, tarkistus epäonnistuu ja näkyviin tulee kuvassa 4. esitetyn näköinen valintaikkuna.
Kuva 4. Tarkistusongelmat-valintaikkuna
Vianmääritysken valinta valintaikkunassa ennen OK-painikkeen napsauttamista aiheuttaa sen, että poikkeuksen aiheuttanut objekti valitaan muokkausohjelmassa. Näiden vianmääritysten merkit tulevat näkyviin Eclipsen ongelmien näkymässä.
Voit toteuttaa tarkistuksen muulla tavalla, kuten tiedoston tallennuksen tai avaamisen yhteydessä, tekemällä jotakin seuraavalta näyttävää:
public static boolean validateObject(EObject eObject) { Diagnostic diagnostic = Diagnostician.INSTANCE.validate(eObject); return diagnostic.getSeverity() == Diagnostic.OK; }
Arvionnin tulos lasketaan Diagnostician-luokkaa käyttämällä vianmäärityksen perusteella, ei yksinkertaisena boolean-palautuksena. Voit sen perusteella päättää häiriön vakavuuden ja paljastaa tiedot rajoitteista ja muuttumattomista, joiden vaatimukset eivät täyttyneet. Jos olisit kiinnostunut vain virheistä ja varoituksista, voisit esimerkiksi tehdä jotakin tältä näyttävää:
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; }
Huomaa, että luokan Diagnostician.INSTANCE.validate() käytön varjolla saat joitakin Ecore-kehyksen rajoitteiden ominaistarkistustoimintoja. Tähän on syynä EObjectValidator-luokka, kaikkien luotujen paketin tarkistusluokkien perusluokka. Näihin sisältyvät seuraavat: