4. Agenda
➔
Modellazione & MDA
Definizione di modelli con EMF
Architettura EMF
Generazione di codice
Sviluppare con EMF
Conclusioni
5. Modellazione & MDA
OMG
Platform Independent Model
MR A
O
DR
C Tecnologie PIM to PSM
D I
H
E V Comprende diversi standard aperti:
L E I
N T UML (Unified Modeling Language)
E
C MOF (Meta-Object Facility)
T XMI (XML Metadata Interchange)
U
R
CWM (Common Warehouse Mode
E
6. Modellazione & MDA
Si può fare?
Visione troppo ambiziosa?
MR A
O
DR Espressività VS Complessità del
C modello
D I
H
E V
E I Vaporware
L
N T ? EMF !
E Permette di generare automaticamente parte del
C codice, spianando la strada allo sviluppo di sistemi più
T complessi!
Modelli semplici da accoppiare a codice di
U
business!
R Realtà dal 2002!
E
7. Agenda
✔ Modellazione & MDA
➔
Definizione di modelli con EMF
Architettura EMF
Generazione di codice
Sviluppare con EMF
Conclusioni
8. Modello EMF (Cosa?)
Descrizione di un dato applicativo
Attributi dell'oggetto
Relazioni (associazioni) fra oggetti
Operazioni disponibili su ogni oggetto
Vincoli (es. cardinalità) su oggetti e relazioni
UML
UML Class Diagram
EMF
10. Modello EMF (Perché?)
UML, XML, Java: 3 forme - 1 modello
Non solo queste..
Dal modello, EMF può generare:
Codice Java (modello + UI)
XML Schema
Componenti (plug-in) eclipse
11. Agenda
✔ Modellazione & MDA
✔ Definizione di modelli con EMF
➔
Architettura EMF
Generazione di codice
Sviluppare con EMF
Conclusioni
12. Architettura EMF
Modello Editor genera
Applicazione
Core Edit Codegen
EMF Runtime EMF Tools
EMF Framework
Eclipse Platform
13. Architettura EMF - Componenti
Core Edit Codegen
EMF Runtime EMF Tools
EMF Framework
EMF Core Runtime
Framework di notifica (pattern observer)
Metamodello Ecore
Persistenza (XML/XMI)
Validazione
Riflette i cambiamenti sul modello
14. Architettura EMF
Core Edit Codegen
EMF Runtime EMF Tools
EMF Framework
EMF.Edit
Supporto agli editor e alle viste associate / basate sul modello
Editor di default introspettivo
15. Architettura EMF - Componenti
Core Edit Codegen
EMF Runtime EMF Tools
EMF Framework
Codegen
Gerenatore di codice per modelli ed editor applicativi
Framework di importazione / esportazione del modello estendibile
19. Modello – Importazione e
Generazione
Edit
Ecore
XSD
Generatore Editor
Personalizzabile (template, JET)
Integrato con JDT / Ant Modellazione grafica Ecore
Supporta la rigenerazione e il merge
20. Agenda
✔ Modellazione & MDA
✔ Definizione di modelli con EMF
✔ Architettura EMF
➔
Generazione di codice
Sviluppare con EMF
Conclusioni
21. Codice di modello generato
Interfacce e implementazioni di ogni modello
Includono gli accessor per ogni attributo/riferimento
public interface HierarchyNode extends EObject {
EList<Detail> getDetails();
NodeType getType();
void setType(NodeType value);
String getName();
void setName(String value);
Object getPersistentClass();
void setPersistentClass(Object value);
}
public abstract class HierarchyNodeImpl extends EObjectImpl implements HierarchyNode {
...
}
22. Notifiche di cambio stato
Ogni EObject è anche un notificatore
Adapter
Manda notifiche al cambio di un
attributo / riferimento del modello
Gli observer possono aggiornare viste
o oggetti dipendenti adapter.notifyChanged()
Gli observer sono anche Adapter
setName(...)
Master
Adapter adapter= ...
master.eAdapters().add(adapter);
23. Notifiche di cambio stato
Notifica efficiente dal setter
public String getName() { HierarchyNodeImpl.java
return name;
}
public void setName(String newName) {
String oldName = name;
name = newName;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, ..., oldName, name));
}
25. Riferimenti bidirezionali
Invariante garantita da protocollo di handshaking realizzato
dai metodi
eInverseRemove()
EinverseAdd()
richiamati nel setter
26. Typesafe Enum
● Metamodelli ENUM implementati secondo il pattern Java
typesafe enum
public enum NodeType implements Enumerator
{
JDOQL(0, "JDOQL", "JDOQL"),
SQL(1, "SQL", "SQL");
public static final int JDOQL_VALUE = 0;
public static final int SQL_VALUE = 1;
private final int value;
private final String name;
private final String literal;
private NodeType(int value, String name, String literal) {
...
}
...
}
27. Factory & Package
● Factory per la creazione di classi di modello
MDDHierarchyFactory factory = MDDHierarchyFactory.eINSTANCE;
Master master = factory.createMaster();
● Package per l'accesso ai metadati
MDDHierarchyPackage mddPackage = MDDHierarchyPackage.eINSTANCE;
EClass masterClass = MDDHierarchyPackage.Literals.MASTER;
// oppure mddPackage.getMaster();
Eattribute typeAtt = MDDHierarchyPackage.Literals.HIERARCHY_NODE__TYPE;
// oppure mddPackage.getHierarchyNode_Type()
// oppure (EAttribute) masterClass.getEStructuralFeature(
MDDHierarchyPackage.HIERARCHY_NODE__TYPE)
28. Reflective API (EObject)
● EObject è implementata da TUTTE le classi EMF
● Fornisce API efficienti per la manipolazione introspettiva
degli oggetti
● Utilizzato dal framework (presistenza, utility di copia,
● comandi di editing)
Chiave per integrare componenti basati su EMF con altre
applicazioni
public interface EObject
{
EClass eClass();
Object eGet(EStructuralFeature sf);
void eSet(EStructuralFeature sf, Object val);
...
}
29. Reflective API (EObject)
● Implementazione generata di metodi introspettivi basata su
switch
public Object eGet(int featureID, ...) { HierarchyNodeImpl.java
switch (featureID) {
case MDDHierarchyPackage.HIERARCHY_NODE__TIE_PROPERTY:
return getTieProperty();
case MDDHierarchyPackage.HIERARCHY_NODE__TYPE:
return getType();
case MDDHierarchyPackage.HIERARCHY_NODE__NAME:
return getName();
case MDDHierarchyPackage.HIERARCHY_NODE__PERSISTENT_CLASS:
return getPersistentClass();
}
return super.eGet(featureID, ...);
}
30. Sinossi degli artefatti generati
Modello
Modello
Edit ((UIIndependent))
Edit UI Independent
Interfacce eeclassi
Interfacce classi
Item providers
Item providers
Enum type-safe Item provider adapter factory
Enum type-safe Item provider adapter factory
Package (metadati)
Package (metadati)
Factory
Factory
Switch utility
Switch utility
Editor ((UIdependent))
Editor UI dependent
Adapter factory base
Adapter factory base
Model wizard
Model wizard
Validatori Editor
Validatori Editor
Risorse custom Contributor all'action bar
Risorse custom Contributor all'action bar
XML Processor Advisor (RCP)
XML Processor Advisor (RCP)
Component artifacts
Component artifacts Test
Test
Manfest, classi plug-in,
Manfest, classi plug-in,
Test cases
Test cases
properties, icone, ...
properties, icone, ...
Test suite
Test suite
Esempio stand-alone
Esempio stand-alone
31. Rigenerazione & Merge
● Il generatore EMF è un merging generator:
/** HierarchyNodeImpl.java
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public String getName() {
return name;
}
● Gli elementi annotati come @generated possono essere
rigenerati / rimossi dal generatore EMF.
32. Rigenerazione & Merge
● I metodi generati possono essere estesi con codice custom
mediante r idir ezione
public String getName() { HierarchyNodeImpl.java
return format(getNameGen());
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public String getNameGen() {
return name;
}
33. Agenda
✔ Modellazione & MDA
✔ Definizione di modelli con EMF
✔ Architettura EMF
✔ Generazione di codice
➔
Sviluppare con EMF
Conclusioni
34. Persistenza
● Un dato persistente è associato a una
risorsa
● Gli oggetti possono essere suddivisi fra
diverse risorse all'interno di un insieme ben
definito (ResourceSet)
● I Proxy rappresentano gli oggetti referenziati
in altre risorse
35. Resource Set
● Contesto per più risorse che hanno fra loro
riferimenti
● Tipicamente è un'istanza di ResourceSetImpl
● Fornisce metodi factory per la creazione di
nuove risorse nell'insieme
ResourceSet rs = new ResourceSetImpl();
URI uri = URI.createFileURI("C:/data/po.xml");
Resource resource = rs.createResource(uri);
● Fornisce anche l'accesso ai registri, un
convertitore di URI e optioni di default per il
36. Registries
● Resource Factory Registry
● Restituisce una factory per il tipo di risorsa dato
● Basato su schema URI, estensione file o content type
● Determina il formato per il salvataggio / caricamento
● Se non si trova una factory locale, delega al registry
globale
● Resource.Factory.Registry.INSTANCE
● Package Registry
● Restituisce il package identificato dal namespace URI
dato
● Usato nel caricamento per accedere alle factory per
istanziare le classi
37. Resource
● Container per oggetti da rendersi persistenti
insieme
● Converte a e da formato persistente mediante save() e
load()
URI uri = URI.createFileURI("C:/data/po.xml");
Accesso al contenuto mediante getContents()
Resource resource = rs.createResource(uri);
●
resource.getContents().add(p1);
resource.save(null);
● EMF fornisce l'implementazione generica
<PurchaseOrder>
XMLResource
<shipTo>John Doe</shipTo> Proxy resolution /
<next>p2.xml#p2</next> demand load
</PurchaseOrder> altre, volendo
● ... ma anche (XMI, EMOF, ...)
38. Reflection
● Set di un attributo mediante API generate
Master master = ...
master.setName(“radice“);
● ... oppure usando le reflective API !
EObject master = ...
EClass masterClass = master.eClass();
master.eSet(masterClass.getEStructuralFeature("name"),
"radice");
Dynamic EMF
39. Agenda
✔ Modellazione & MDA
✔ Definizione di modelli con EMF
✔ Architettura EMF
✔ Generazione di codice
✔ Sviluppare con EMF
➔
Conclusioni
40. Conclusioni
●EMF è un tool di modellazione a basso costo per
Java
●Promuove il valore del modello intrinseco
dell'applicazione per guidare le scelte di sviluppo
● Non c'è bisogno di tool CAD di alto livello
●Unisce modellazione e programmazione per trarre il
massimo dei benefici da entrambi
● Aumenta la produttività e l'integrabilità
● Pone le basi per lo sviluppo model-driven e per
l'integrazione dati in Eclipse
Notas do Editor
Imparare concetti di modellazione e capire come EMF può aiutarci a scrivere applicazioni in maniera drasticamente più veloce, semplicemente sfruttando il modello che il più delle volte è già definito. CDO è un progetto per la distribuzzione di modelli EMF condivisi e insieme una soluzione per un rapido server-based mapping O/R. SDO è un framework che semplifica e unifica lo sviluppo delle data application in architetture SOA (Service Oriented Architecture). Support ae integra il formato xml e incorpora i patterns J2EE e le best practices. EMF include un implementazione EMF-based di Service Data Objects. Teneo è una soluzione per la persistenza su database per EMF, che utilizza Hibernate o EclipseLink. Supporta automaticamente la creazione di mapping tra EMF e basi dati relazionali. Gli oggetti EMF possono essere immagazzinati e recuperati utilizzando sistemi di query avanzati (HQL or EJB-QL). Model Query fornisce strumenti per costruire ed eseguire query su modelli EMF. Validation Framework fornisce la possiilità di definire costraints sul modello e sulla sua definizione, algoritmi per le strategie custom e model traversal e listener di validazione. EMF sarà parte integrante del prossimo rilascio di Eclipse previsto a Giugno 2009 (Galileo).
- OMG: standard - PIM --> Applicazione definita ad alto livello. ... Ci sono dubbi sull'abilità di MDA di realizzare le promesse prefissate: - Visione ambiziosa - Espressività vs Complessità del modello - Disponibilità di implementazioni (“vaporware”)
- OMG: standard - PIM --> Applicazione definita ad alto livello. ... Contrariamente a quanto pensino molti programmatori, la modellazione è utile ancor più della documentazione. • Quasi tutti i programmi gestiscono un qualche genere di modello, definito usando UML, XML Schema, qualche altro genere di linguaggio o implicitamente in Java • EMF si propone di estrarre questo modello „intrinseco“ e di generare parte dell'implementazione. Può portare un sostanziale vantaggio in termini di produttività.