390 likes | 553 Views
Davide Devescovi - 9 maggio 2006 Argomenti Avanzati di Ingegneria del Software - aa 2005/06. Sviluppo di tool basati su un metamodello editabile graficamente. Eclipse Modeling Framework (EMF) Graphical Editing Framework (GEF) Graphical Modeling Framework (GMF). Che cos’è Eclipse?.
E N D
Davide Devescovi - 9 maggio 2006 Argomenti Avanzati di Ingegneria del Software - aa 2005/06 Sviluppo di tool basati su un metamodello editabile graficamente Eclipse Modeling Framework (EMF) Graphical Editing Framework (GEF) Graphical Modeling Framework (GMF)
Che cos’è Eclipse? • Nome normalmente associato a Eclipse SDK: Java IDE (integrated development environment) • Eclipse SDK è un tool basato su Eclipse Platform: insieme di componenti per lo sviluppo di tool e applicazioni arbitrarie • Sottoinsiemi di componenti consentono lo sviluppo di applicazioni (esempio: RCP, Rich Client Platform) • EP sviluppata in Java, ma non è solo Java: diventa un Java IDE aggiungendo JDT (Java Development Tools), ma esiste CDT per programmare in C\C++…
Eclipse Platform Overview – 1 • Supporta la costruzione di una varietà di tools per lo sviluppo di applicazioni • Supporta un insieme non ristretto di sviluppatori di tools, inclusi ISV (independent software vendors) • Supporta tools per manipolare contenuti arbitrari (HTML, Java, C, JSP, EJB, XML, GIF…) • Integration Point: facilita l’integrazione di tools sia tra contenuti diversi, sia tra differenti fornitori di tools • Supporta ambienti di sviluppo basati o meno su GUI • Funziona su un’ampia gamma di OS, tra cui Windows, Linux, Mac OS X, Solaris AIX… • Sfrutta la popolarità di Java per la programmazione di tools • Naturalmente è open source!
Eclipse Platform Overview – 2 • Platform Runtime: kernel che fornisce funzionalità di base • Workbench: il cuore della UI, è “quello che si vede quando si lancia Eclipse”; presenta all’utente una UI estensibile • Workspace: spazio di lavoro dell’utente, costituito da risorse (progetti, dir, file…); ha sistemi di history e di notifica delle modifiche apportate alle risorse • Help e Team
Architettura a plug-in – 1 • Tutti i componenti di EP sono plugin (tranne Platform Runtime) • Plugin: la più piccola unità funzionale di EP sviluppabile e distribuibile separatamente • Plugin = codice Java (JAR) + risorse varie; può essere composto da più frammenti • Plugin manifest • manifest.mf = dipendenze runtime • plugin.xml = elenco di extension points ed extensions (interconnessioni con altri plugin)
Architettura a plug-in – 2 • All’avvio, Platform Runtime scopre i plugin, legge i loro manifesti e crea il Plugin Registry, reso disponibile tramite Platform API • I plugin possono essere aggiunti, sostituiti o rimossi anche dopo l’avvio • Un plugin viene attivato solo quando il suo codice deve essere eseguito: l’avvio è molto rapido • Una volta attivato, un plugin accede al Registry per scoprire le extensions collegate ai suoi extension points: non è necessario che i plugin che lo estendono vengano attivati • Quindi grazie al Registry i plugin hanno sempre a disposizione le informazioni rilevanti riguardanti il contesto di esecuzione
Esempi reali • Plugin per i più svariati linguaggi (C, C++, C#, Symbian per Nokia, LaTeX…) • IBM WebSphere: versione commerciale di Eclipse con ulteriori funzionalità • RCP di ogni genere, commerciali e non…
Eclipse Modeling Framework: che cos’è? • Framework open source per la generazione di tools e applicazioni basati su un modello strutturato • Modello = specifica di oggetti, attributi, operazioni, relazioni e vincoli di un’applicazione: in sostanza class diagram • EMF offre: • Generazione automatica di codice Java a partire dal modello • Possibilità di modifiche al codice generato • Reflective API e generazione dinamica del modello • Persistence API: supporto XMI/XML per (de)serializzazione • Supporto per la generazione di editor
Componenti di EMF • EMF Core • Metamodello ECore • Model Change Notification & Validation • Persistenza, serializzazione, Reflection • Supporto runtime per i modelli generati • EMF Edit • Usato per costruire editor e visualizzatori per il modello • EMF Codegen • Generatore di codice per componenti basati su Core ed Edit • Framework estensibile per l’importazione di modelli
Metamodello Ecore – 1 • EObject è l’equivalente di java.lang.Object: • eClass(), come Object.getClass(), dà informazioni sull’istanza, ad esempio la sua EClass • Reflective API: eGet(), eSet() per accedere ai dati. Equivalente a java.lang.reflect.Method.invoke() ma più efficiente • EObject estende Notifier, che consente di monitorare le modifiche dei dati dell’oggetto • ECore ha propri data type (EFloat, EChar, EBoolean), serializzabili
Metamodello Ecore – 2 • Metamodello ECore • Serializzazione XMI • Modello UML
Definire un modello EMF • Il code generator può importare modelli di vari tipi: • ECore model scritto direttamente in XMI • XML Schema • Diagramma UML (supporto per Rational Rose) • Annotated Java
Factory e Package • Package: dà accesso ai metadati del modello, sia sotto forma di costanti che di oggetti del metamodello ECore • Factory: fornisce metodi per la creazione di istanze delle varie classi, un metodo per accedere al Package del modello e un riferimento statico al singleton della Factory
Reflective API • Accesso generico a metodi e attributi • Usando dati reperiti dal Package • Meno efficiente rispetto a una chiamata diretta • Usato da EMF.Edit per creare comandi generici
Adapters • Esempio di implementazione di un adapter: • O tramite factory: • Abbiamo visto in precedenza la chiamata a eNotify: • Gli EObject hanno una lista di observers (adapters); eNotify scorre la lista e notifica gli adapters • Gli adapters si possono aggiungere direttamente:
Personalizzare le implementazioni • Metodi personalizzati possono essere aggiunti normalmente, non verranno modificati dalla rigenerazione del codice • I metodi generati sono contraddistinti dal tag @generated: modifiche a questi metodi saranno perse • Soluzione: rimuovere il tag. Ma se il modello cambia non ho aggiornamento automatico… • “Overload” dei metodi…
Varie ed eventuali • Validazione: l’utente deve specificare le condizioni che fanno fallire il check • Operazioni: EMF genera lo scheletro dei metodi dichiarati nelle interfacce, ma il comportamento non è modellizzato l’utente deve implementare il metodo • Bidirectional reference handshaking • Ereditarietà multipla: bisogna scegliere una classe come base per l’implementazione, le altre diventano interfacce le cui implementazioni vengono copiate nella classe figlia • Dynamic EMF: modelli ECore possono essere definiti dinamicamente in memoria, istanziando elementi tramite l’ECore API
Graphical Editing Framework: che cos’è? • Framework open source per lo sviluppo di rappresentazioni grafiche di modelli esistenti • Permette di costruire editor grafici per la modifica di modelli usando funzioni quali drag & drop, copy and paste… • Ad esempio editor UML, ma anche tool per creare pagine web, forms ecc… • Due componenti: • Draw2D, sistema grafico lightweight per la visualizzazione • GEF vero e proprio
Draw2D • Libreria autocontenuta, utilizzabile indipendentemente da GEF o Eclipse • Si appoggia su SWT: gli oggetti Draw2D sono hostati da un controllo heavyweight SWT • Feature principali: • LightweightSystem: classe responsabile del mappaggio tra SWT e Draw2D (eventi, repaint degli oggetti…) • Figure: non limitate alla forma rettangolare; predisposte per la notifica di listeners • Borders, layout, layers: grande flessibilità di visualizzazione • Connections, anchors, routers
GEF Framework • Basato sul pattern Model-View-Controller • Il modello in questo caso è codice Java già implementato • Le viste sono realizzate da Draw2D • I controller sono le EditParts: definiscono il mappaggio tra modello e viste • In genere bisogna creare un EditPart per ciascuna classe del modello: stessa gerarchia • Due tipi principali di EditPart: • GraphicalEditPart (associato a una figura/classe) • ConnectionEditPart (connessione tra GraphicalEditPart)
EditParts • Create tramite Factory • Un’EditPart va attivata per informare GEF della sua esistenza; viene disattivata quando non serve più • GraphicalEditPart: deve creare una figura (Draw2D), aggiornarla in base alle modifiche del modello ed eliminarla quando necessario • ConnectionEditPart: è in realtà una GraphicalEditPart con campi source e target
Usare EMF e GEF insieme • Vantaggio immediato: code generation di EMF… • La notifica delle modifiche al modello è già presente in EMF • Le implementazioni generate rimangono consistenti al variare del modello • La Reflective API di EMF consente di usare il nostro editor su modelli EMF generici • Problema: espandere EMF.Edit con GEF non è immediato, non sono stati pensati per cooperare • Proviamo allora a sviluppare un piccolo editor usando un modello EMF in GEF…
EMF + GEF – 1 • Partiamo da un modello semplice, importiamolo in EMF e generiamo le implementazioni
EMF + GEF – 3 • Creiamo una serie di Commands: operazioni che modificano effettivamente il modello • Creiamo EditParts per ogni classe (più o meno…) • Implementiamo i metodi createFigure per associare figure Draw2D agli EditParts • Ci mettiamo “in ascolto” (EMF adapters!) e definiamo il comportamento in caso di modifica del modello • Definiamo le EditPolicies: come si deve comportare una EditPart quando succede qualcosa alla vista • Meglio vedere “dal vivo” per capire meglio…
Graphical Modelling Framework: che cos’è? • Framework open source per lo sviluppo di editor grafici di modelli… dov’è la novità? • Si appoggia su EMF e GEF per creare editor in maniera molto più semplice • Cerca di sostituire la stesura di codice grazie a una serie di modelli intermedi e di mappaggi tra di essi assistiti da wizard • Due parti principali: • Tooling: serie di editor per creare modelli alla base dell’editor grafico + generatore per creare l’implementazione dell’editor • Runtime: classi su cui si appoggia l’editor generato • E’ un progetto ancora in fase di sviluppo
GMF Workflow • Domain model (informazioni non grafiche) • Diagram definition model (elementi grafici) • Mapping model (mappaggio tra i due modelli) • Generazione automatica editor grafico • Customizzazione del codice generato
I modelli di GMF • Domain model: modello ECore del dominio che ci interessa; non è necessario cominciare da qui, ma di norma lo si fa • Graphical definition: il modello che rappresenta gli oggetti grafici che verranno usati dall’editor • Tooling definition: rappresenta la palette di strumenti a disposizione dell’utente dell’editor • Mapping definition: esegue il mappaggio tra i tre modelli precedenti • Generator model: modello che consente la generazione del diagramma
Feature runtime • Compartimenti espandibili • Direct Editing • Diagram Assistants • Tool e comandi comuni • Anteprima di stampa • Supporto clipboard • Vediamo qualcosa in azione…
Linkografia • http://www.eclipse.org - Eclipse Plaftorm • http://www.eclipse.org/emf/docs.php - EMF • http://www.eclipse.org/gef/reference/articles.html - GEF • http://www.eclipse.org/gmf - GMF • http://wiki.eclipse.org/index.php/Graphical_Modeling_Framework • http://www.eclipse.org/vep - Visual Editor • IBM Redbook “Eclipse Development using the Graphical Editing Framework and the Eclipse Modeling Framework” http://www.redbooks.ibm.com/abstracts/sg246302.html