SlideShare uma empresa Scribd logo
1 de 40
Introduzione a




Ing. ANDREA SALICETTI

 Software Engineer
Obiettivo
Agenda
Modellazione & MDA
Definizione di modelli con EMF
Architettura EMF
Generazione di codice
Sviluppare con EMF
Conclusioni
Agenda
➔
    Modellazione & MDA
Definizione di modelli con EMF
Architettura EMF
Generazione di codice
Sviluppare con EMF
Conclusioni
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
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
Agenda
✔   Modellazione & MDA
➔
    Definizione di modelli con EMF
Architettura EMF
Generazione di codice
Sviluppare con EMF
Conclusioni
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
Modello EMF (Come?)




             Ecore



    XSD
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
Agenda
✔   Modellazione & MDA
✔   Definizione di modelli con EMF
➔
    Architettura EMF
Generazione di codice
Sviluppare con EMF
Conclusioni
Architettura EMF

Modello      Editor        genera
                                    Applicazione



 Core         Edit           Codegen

  EMF Runtime                EMF Tools
                      EMF Framework

          Eclipse Platform
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
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
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
Architettura EMF - Ecore
Ecore = metamodello
Architettura EMF - Ecore
I modelli applicativi sono istanze di classi
Ecore EAttribute
       (name=“name“)
                                EClass
                                                              EClass
                                (name=“HierarchyNode“)        (name=“Detail“)
            EAttribute                           eReferenceType
            (name=“type“)                       (upperBound = -1)




EClass                   EClass
(name=“HierarchyRoot“)   (name=“Master“)
              eReferenceType
             (upperBound = 1)
Architettura EMF - Ecore
Formato persistente: XMI (.ecore / .emof)
<eClassifiers xsi:type="ecore:EClass" name="HierarchyRoot">
 <eStructuralFeatures xsi:type="ecore:EReference" name="master" eType="#//Master" />
 <eClassifiers xsi:type="ecore:EClass" name="HierarchyNode" abstract="true">
    <eStructuralFeatures xsi:type="ecore:EReference" name="details" upperBound="­1"
        eType="#//Detail" containment="true"/>
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" lowerBound="1"
        eType="#//NodeType"/>
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" 
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" iD="true"/>
  </eClassifiers>
  <eClassifiers xsi:type="ecore:EClass" name="Master" eSuperTypes="#//HierarchyNode"/>
  <eClassifiers xsi:type="ecore:EClass" name="Detail" eSuperTypes="#//HierarchyNode"/>
  <eClassifiers xsi:type="ecore:EEnum" name="NodeType">
    <eLiterals name="JDOQL" literal="JDOQL"/>
    <eLiterals name="SQL" value="1" literal="SQL"/>
  </eClassifiers>
</eClassifiers>
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
Agenda
✔   Modellazione & MDA
✔   Definizione di modelli con EMF
✔   Architettura EMF
➔
    Generazione di codice
Sviluppare con EMF
Conclusioni
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 {
      ...
 }
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);
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));
 }
Riferimenti bidirezionali
                                                   Invariante:
                                                   (HierarchyNode hN)

                                                   hN.getTieProperty().getBackProperty() == hN




public interface HierarchyNode extends EObject {
   …
                                                           HierarchyNode.java
   Detail getTieProperty();
   void setTieProperty(Detail value);
}



public interface Detail extends EObject {
   HierarchyNode getBackProperty();
                                                                        Detail.java
   void setBackProperty(HierarchyNode value);
}
Riferimenti bidirezionali
 Invariante garantita da protocollo di handshaking realizzato
  dai metodi
eInverseRemove()
EinverseAdd()
richiamati nel setter
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) {
      ...
    }
    ...
}
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)
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);
  ...
}
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, ...);
}
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
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.
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;
}
Agenda
✔   Modellazione & MDA
✔   Definizione di modelli con EMF
✔   Architettura EMF
✔   Generazione di codice
➔
    Sviluppare con EMF
Conclusioni
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
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
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
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, ...)
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
Agenda
✔   Modellazione & MDA
✔   Definizione di modelli con EMF
✔   Architettura EMF
✔   Generazione di codice
✔   Sviluppare con EMF
➔
    Conclusioni
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

Mais conteúdo relacionado

Mais procurados

Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)lukebonham
 
MS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partIMS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partIMobileSchool
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#Marco Parenzan
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2Majong DevJfu
 
03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++Majong DevJfu
 
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Bruno Interlandi
 
Corso pratico di C# - 2013
Corso pratico di C# - 2013Corso pratico di C# - 2013
Corso pratico di C# - 2013Matteo Valoriani
 
12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatoriMajong DevJfu
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java BaseK-Tech Formazione
 
Object Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseObject Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseFelice Pescatore
 

Mais procurados (16)

Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)
 
MS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partIMS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partI
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2
 
03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++
 
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
 
Corso pratico di C# - 2013
Corso pratico di C# - 2013Corso pratico di C# - 2013
Corso pratico di C# - 2013
 
C# Language Evolution
C# Language EvolutionC# Language Evolution
C# Language Evolution
 
Vb.Net
Vb.NetVb.Net
Vb.Net
 
12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java Base
 
Corso Java
Corso JavaCorso Java
Corso Java
 
Object Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseObject Oriented with Java Programmazione Base
Object Oriented with Java Programmazione Base
 
Design Pattern
Design PatternDesign Pattern
Design Pattern
 
What's new in C# 7
What's new in C# 7What's new in C# 7
What's new in C# 7
 
Java lezione 4
Java lezione 4Java lezione 4
Java lezione 4
 

Semelhante a Eclipse emf

What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018Marco Parenzan
 
Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Martino Bordin
 
Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Marco Loregian
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)STELITANO
 
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08Alessandro Del Sole
 
Sviluppare app native per iOS
Sviluppare app native per iOSSviluppare app native per iOS
Sviluppare app native per iOSGaspare Novara
 
Sviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto DigitaleSviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto Digitalelostrettodigitale
 
corso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascriptcorso web developer - Introduzione a Javascript
corso web developer - Introduzione a JavascriptRiccardo Piccioni
 
ZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFXZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFXTiziano Lattisi
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con ScalaFranco Lombardo
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.jsMichele Capra
 
KDE Plasma widgets
KDE Plasma widgetsKDE Plasma widgets
KDE Plasma widgetsPietro Lerro
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5Matteo Baccan
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented ProgrammingAndrea Bozzoni
 
Seam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoSeam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoJava User Group Roma
 
April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5JBug Italy
 

Semelhante a Eclipse emf (20)

What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018
 
Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3
 
Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3
 
Many Designs Elements
Many Designs ElementsMany Designs Elements
Many Designs Elements
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)
 
introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08
 
Sviluppare app native per iOS
Sviluppare app native per iOSSviluppare app native per iOS
Sviluppare app native per iOS
 
Sviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto DigitaleSviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto Digitale
 
corso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascriptcorso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascript
 
ZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFXZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFX
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
KDE Plasma widgets
KDE Plasma widgetsKDE Plasma widgets
KDE Plasma widgets
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5
 
Jug 30 10 04 Jdo
Jug 30 10 04 JdoJug 30 10 04 Jdo
Jug 30 10 04 Jdo
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
Seam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoSeam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano Ciccazzo
 
April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5
 

Eclipse emf

  • 1. Introduzione a Ing. ANDREA SALICETTI Software Engineer
  • 3. Agenda Modellazione & MDA Definizione di modelli con EMF Architettura EMF Generazione di codice Sviluppare con EMF Conclusioni
  • 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
  • 16. Architettura EMF - Ecore Ecore = metamodello
  • 17. Architettura EMF - Ecore I modelli applicativi sono istanze di classi Ecore EAttribute (name=“name“) EClass EClass (name=“HierarchyNode“) (name=“Detail“) EAttribute eReferenceType (name=“type“) (upperBound = -1) EClass EClass (name=“HierarchyRoot“) (name=“Master“) eReferenceType (upperBound = 1)
  • 18. Architettura EMF - Ecore Formato persistente: XMI (.ecore / .emof) <eClassifiers xsi:type="ecore:EClass" name="HierarchyRoot">  <eStructuralFeatures xsi:type="ecore:EReference" name="master" eType="#//Master" />  <eClassifiers xsi:type="ecore:EClass" name="HierarchyNode" abstract="true">     <eStructuralFeatures xsi:type="ecore:EReference" name="details" upperBound="­1"         eType="#//Detail" containment="true"/>     <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" lowerBound="1"    eType="#//NodeType"/>     <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"  eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" iD="true"/>   </eClassifiers>   <eClassifiers xsi:type="ecore:EClass" name="Master" eSuperTypes="#//HierarchyNode"/>   <eClassifiers xsi:type="ecore:EClass" name="Detail" eSuperTypes="#//HierarchyNode"/>   <eClassifiers xsi:type="ecore:EEnum" name="NodeType">     <eLiterals name="JDOQL" literal="JDOQL"/>     <eLiterals name="SQL" value="1" literal="SQL"/>   </eClassifiers> </eClassifiers>
  • 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)); }
  • 24. Riferimenti bidirezionali Invariante: (HierarchyNode hN) hN.getTieProperty().getBackProperty() == hN public interface HierarchyNode extends EObject { … HierarchyNode.java Detail getTieProperty(); void setTieProperty(Detail value); } public interface Detail extends EObject { HierarchyNode getBackProperty(); Detail.java void setBackProperty(HierarchyNode value); }
  • 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

  1. 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).
  2. - OMG: standard - PIM --&gt; Applicazione definita ad alto livello. ... Ci sono dubbi sull&apos;abilità di MDA di realizzare le promesse prefissate: - Visione ambiziosa - Espressività vs Complessità del modello - Disponibilità di implementazioni (“vaporware”)
  3. - OMG: standard - PIM --&gt; 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&apos;implementazione. Può portare un sostanziale vantaggio in termini di produttività.