SlideShare a Scribd company logo
Christian W. Damus, Kenn Hussey, Ed Merks and Dave Steinberg IBM Rational Software Ottawa and Toronto, Canada EMF, EMFT, and MDT Projects Effective Use of the Eclipse Modeling Framework https://w3-03.ibm.com/legal/ipl/iplsite.nsf/pages/wtts-trademarks+home
Part 1: Introduction to the Eclipse Modeling Framework
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
EMF Demo ,[object Object]
What is EMF? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
What does EMF Provide? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Why EMF? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
EMF History ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Who is Using EMF Today? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
EMF at IBM ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
What Have People Said About EMF? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Creating the Ecore Model ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Model Importers Available in EMF ,[object Object],public interface  PurchaseOrder { String  getShipTo (); void setShipTo(String value); String  getBillTo (); void setBillTo(String value); List<Item>  getItems (); } public interface  Item { String  getProductName (); void setProductName(String value); int  getQuantity (); void setQuantity(int value) float  getPrice (); void setPrice(float value); }
Model Importers Available in EMF ,[object Object]
Model Importers Available in EMF ,[object Object],<?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> <xsd:schema xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; targetNamespace=&quot;http://www.example.com/SimplePO&quot; xmlns:PO=&quot;http://www.example.com/SimplePO&quot;> <xsd:complexType name=&quot; PurchaseOrder &quot;> <xsd:sequence> <xsd:element name=&quot; shipTo &quot; type=&quot;xsd:string&quot;/> <xsd:element name=&quot; billTo &quot; type=&quot;xsd:string&quot;/> <xsd:element name=&quot; items &quot;  type=&quot;PO:Item&quot;  minOccurs=&quot;0&quot; maxOccurs=&quot;unbounded&quot;/> </xsd:sequence> </xsd:complexType> <xsd:complexType name=&quot;Item&quot;> <xsd:sequence> <xsd:element name=&quot; productName &quot; type=&quot;xsd:string&quot;/> <xsd:element name=&quot; quantity &quot; type=&quot;xsd:int&quot;/> <xsd:element name=&quot; price &quot; type=&quot;xsd:float&quot;/> </xsd:sequence> </xsd:complexType> </xsd:schema>
Unifying Java, XML and UML Technologies ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Typical EMF Usage Scenario ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
EMF and Java 5.0 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
EMF and Java 5.0 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
EMF Architecture EMF Runtime EMF Tools Core Edit Codegen Model Editor Application Generates Eclipse Platform
EMF Components ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
EMF Tools: Model Import and Generation ,[object Object],[object Object],[object Object],[object Object],I M P O R T GENERATE Ecore Model UML XML Schema Java model Java model Java edit Java editor* * Eclipse IDE-integrated or RCP-based
EMF Model Importers ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ecore Model Creation ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ecore Model Editor ,[object Object],[object Object],[object Object]
Ecore Model Editor ,[object Object],[object Object],[object Object]
EMF Generator ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
The Ecore (Meta) Model ,[object Object],[object Object],[object Object]
The Ecore Metamodel
Partial List of Ecore Data Types ,[object Object],java.lang.Float EFloatObject java.lang.Object EJavaObject java.lang.Boolean EBooleanObject byte[ ] EByteArray java.lang.String EString float EFloat char EChar boolean EBoolean Java Primitive Type or Class Ecore Data Type
Ecore Model for Purchase Orders is represented in Ecore as
Purchase Order Ecore XMI ,[object Object],[object Object],<eClassifiers xsi:type=&quot;ecore:EClass&quot; name=&quot; PurchaseOrder &quot;> <eReferences name=&quot; items &quot; eType=&quot;#//Item&quot;  upperBound=&quot;-1&quot; containment=&quot;true&quot;/> <eAttributes name=&quot; shipTo &quot;  eType=&quot;ecore:EDataType http:...Ecore#//EString&quot;/> <eAttributes name=&quot; billTo &quot;  eType=&quot;ecore:EDataType http:...Ecore#//EString&quot;/> </eClassifiers>
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Code Generation ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Generated Model Code ,[object Object],[object Object],[object Object],public interface  PurchaseOrder  extends EObject { String  getShipTo (); void  setShipTo (String value); String  getBillTo (); void  setBillTo (String value); EList<Item>  getItems (); } order .getItems().add( item );
Generated Model Code ,[object Object],[object Object],[object Object],POFactory factory =  POFactory.eINSTANCE ; PurchaseOrder order =  factory .createPurchaseOrder(); POPackage poPackage =  POPackage.eINSTANCE ; EClass itemClass = poPackage. getItem (); //or POPackage.Literals.ITEM EAttribute priceAttr = poPackage. getItem_Price (); //or itemClass.getEStructuralFeature( POPackage.ITEM__PRICE ) //or POPackage.Literals.ITEM__PRICE
Generated Edit/Editor Code ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Java 5.0 Constructs ,[object Object],[object Object]
Summary of Generated Artifacts ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Regeneration and Merge ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Regeneration and Merge ,[object Object],[object Object],/** * <!-- begin-user-doc --> * <!-- end-user-doc --> *  @generated */ public String getName Gen () { return name; } public String  getName () { return format(getNameGen()); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> *  @generated */ public String  getName () { return name; }
The Code Generation Process Java Code Model Importer JET Simplified version UML Java Model ? XML Schema GenModel Ecore
The Code Generation Process Java Code Merged Java Code Model Importer JET JMerge Generated Java Code Full version UML Java Model ? XML Schema GenModel Ecore
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
EMF Runtime ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Persistence and Serialization ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Resource Set ,[object Object],[object Object],[object Object],[object Object],ResourceSet  rs = new  ResourceSetImpl (); URI uri = URI.createFileURI(&quot;C:/data/po.xml&quot;); Resource resource = rs. createResource (uri);
Resource Factory Registry ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Resource.Factory.Registry  reg = rs. getResourceFactoryRegistry (); reg. getExtensionToFactoryMap ().put(&quot; xml &quot;, new  XMLResourceFactoryImpl ());
Package Registry ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],EPackage.Registry  registry = rs. getPackageRegistry (); registry.put( POPackage.eNS_URI ,  POPackage.eINSTANCE ); POPackage   poPackage =  POPackage.eINSTANCE;
Resource ,[object Object],[object Object],[object Object],[object Object],[object Object],URI uri = URI.createFileURI(&quot;C:/data/po.xml&quot;); Resource resource = rs.createResource(uri); resource. getContents ().add(p1); resource. save (null); <PurchaseOrder> <shipTo>John Doe</shipTo> <next>p2.xml#p2</next> </PurchaseOrder>
Proxy Resolution and Demand Load PurchaseOrder p2 =   p1. getNext (); p1 p1.xml next p2 p2.xml proxyURI=“ p2.xml #p2” next proxyURI=“p2.xml#p2” next <PurchaseOrder> <shipTo>John Doe</shipTo> <next> p2.xml#p2 </next> </PurchaseOrder> p1.xml
Model Change Notification ,[object Object],[object Object],[object Object],Adapter  poObserver = ... purchaseOrder. eAdapters ().add(poObserver);
Model Change Notification ,[object Object],[object Object],[object Object],PurchaseOrder purchaseOrder = ... AdapterFactory  somePOAdapterFactory = ... Object poExtensionType = ... if (somePOAdapterFactory. isFactoryForType (poExtensiontype)) { Adapter  poAdapter = somePOAdapterFactory. adapt (purchaseOrder, poExtensionType); ... }
Model Change Notification ,[object Object],[object Object],public String getShipTo() { return shipTo; } public void setShipTo(String newShipTo) { String oldShipTo = shipTo; shipTo = newShipTo; if (eNotificationRequired()) eNotify(new ENotificationImpl(this, ... ); }
Bidirectional Reference Handshaking public interface  PurchaseOrder { PurchaseOrder  getNext (); void  setNext (PurchaseOrder value); PurchaseOrder  getPrevious (); void  setPrevious (PurchaseOrder value); } Invariant imposed by the bidirectional reference:  po.getNext().getPrevious() == po
Bidirectional Reference Handshaking p1. setNext (p3); p2 p1 p2 p3 previous next next previous next previous next previous change notification
Bidirectional Reference Handshaking ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Reflection ,[object Object],[object Object],[object Object],[object Object],public interface  EObject { EClass  eClass (); Object  eGet (EStructuralFeature sf); void  eSet (EStructuralFeature sf, Object val); ... }
Reflection Example ,[object Object],[object Object],PurchaseOrder po = ... po. setBillTo (&quot;123 Elm St.&quot;); EObject po = ... EClass poClass = po.eClass(); po. eSet (poClass.getEStructuralFeature(&quot;billTo&quot;), &quot;123 Elm St.&quot;);
Reflective Performance ,[object Object],public Object  eGet (int featureID, ...) { switch  (featureID) { case POPackage.PURCHASE_ORDER__SHIP_TO: return  getShipTo (); case POPackage.PURCHASE_ORDER__BILL_TO: return  getBillTo (); ... } }
Reflection Benefits ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Dynamic EMF ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Dynamic EMF Example ,[object Object],EPackage poPackage = EcoreFactory.eINSTANCE. createEPackage (); poPackage. setName (&quot;po&quot;); poPackage. setNsURI (&quot;http://www.example.com/PurchaseOrder&quot;);     EClass poClass = EcoreFactory.eINSTANCE. createEClass (); poClass. setName (&quot;PurchaseOrder&quot;); poPackage. getEClassifiers ().add(poClass);    EAttribute billTo = EcoreFactory.eINSTANCE. createEAttribute (); billTo. setName (&quot;billTo&quot;); billTo. setEType (EcorePackage.eINSTANCE. getEString ()); poClass. getEStructuralFeatures ().add(billTo); ... EObject po = EcoreUtil.create(poClass); po.eSet(billTo,&quot;123 Elm St.&quot;);
XML Processor ,[object Object],[object Object],[object Object],[object Object],[object Object],URI schemaURI = ... String instanceFileName = ... XMLProcessor processor =  new XMLProcessor (schemaURI); Resource resource = processor. load (instanceFileName, null); EObject documentRoot = resource.getContents.get(0);
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Recording Changes ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Change Model
Change Recorder ,[object Object],[object Object],[object Object],[object Object],PurchaseOrder order = ... order.setBillTo(&quot;123 Elm St.&quot;); ChangeRecorder recorder = new ChangeRecorder(); recorder. beginRecording (Collections.singleton(order)); order.setBillTo(&quot;456 Cherry St.&quot;); ChangeDescription change = recorder. endRecording ();
Applying Changes ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Example: Transaction Capability ,[object Object],ChangeRecorder changeRecorder = new ChangeRecorder(resourceSet); try { // modifications within resource set } catch (Exception e) { changeRecorder. endRecording (). apply (); }
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Validation Framework ,[object Object],[object Object],[object Object],[object Object],public interface  Evalidator { boolean  validate (EObject eObject, DiagnosticChain diagnostics, Map Context); boolean  validate (EClass eClass, EOjbect eObject, DiagnosticChain, diagnostics, Map context); boolean  validate (EDataType eDataType, Object value, DiagnosticChain diagnostics, Map context); ... }
Invariants and Constraints ,[object Object],[object Object],[object Object],[object Object],[object Object]
Generated EValidator Implementations ,[object Object],[object Object],[object Object],[object Object]
Schema-Based Constraints ,[object Object],[object Object],[object Object],<xsd:annotation> <xsd:appinfo source=&quot;http://www.eclipse.org/emf/2002/Ecore&quot;  ecore:key=&quot;constraints&quot;>VolumeDiscount</xsd:appinfo> </xsd:annotation> <xsd:simpleType name=&quot;SKU&quot;> <xsd:restriction base=&quot;xsd:string&quot;> <xsd:pattern value=&quot;{3}-[A-Z]{2}&quot;/> </xsd:restriction> </xsd:simpleType>
Framework EValidator Implementations ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Framework EValidator Implementations ,[object Object],[object Object],[object Object],Diagnostician   validator =  Diagnostician.INSTANCE ; Diagnostic diagnostic = validator. validate (order); if (diagnostic.getSeverity() == Diagnostic.ERROR) { // handle error } for (Diagnostic child : diagnostic.getChildren()) { // handle child diagnostic }
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Summary ,[object Object],[object Object],[object Object]
Summary ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Summary ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Part 2: Advanced Features of the Eclipse Modeling Framework
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Working with Resources and ResourceSets ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Persistence and Serialization Review ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Identifying Proxies ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Going Deeper: EcoreUtil’s CrossReferencers ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Going Deeper: EStructuralFeature.Setting ,[object Object],[object Object],[object Object]
Going Deeper: Types of Reference ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
EcoreUtil.ProxyCrossReferencer public static void printProxiesDetails(ResourceSet  resourceSet ) { int counter = 0; Map<EObject, Collection<EStructuralFeature.Setting>> map = ProxyCrossReferencer .find(resourceSet); for (Map.Entry<EObject, Collection<EStructuralFeature.Setting>> entry : map.entrySet()) { EObject  proxyEObject  = entry. getKey (); System.out.println (&quot;&quot; + ++counter + &quot;. &quot; + EcoreUtil.getURI(proxyEObject)); System.out.println (&quot;Is Proxy: &quot; + proxyEObject.eIsProxy()); for (EStructuralFeature.Setting  setting  : entry. getValue ()) { System.out.println (&quot;Feature: &quot; + setting. getEStructuralFeature ().getName()); EObject eObject = setting. getEObject (); EStructuralFeature nameFeature = eObject.eClass().getEStructuralFeature(&quot;name&quot;); if (nameFeature != null) { System.out.println (&quot;EObject.getName(): &quot; + eObject.eGet(nameFeature)); } } }  } 1. uri3.xmi#/0 Is Proxy: true Feature: home EObject.getName(): john
Validating Proxies ,[object Object],[object Object],[object Object],[object Object]
Validating Proxies public static void validateProxies(EObject eObject) { Diagnostic  diagnostic  =  Diagnostician .INSTANCE. validate (eObject); if (diagnostic.getSeverity() == Diagnostic.ERROR) { if ( hasEveryProxyResolvesCode (diagnostic)) { System.out.println (&quot;Broken proxies found!&quot;); return; } } System.out.println (&quot;Proxies are fine.&quot;); } public static boolean  hasEveryProxyResolvesCode (Diagnostic diagnostic) { if (diagnostic. getCode () == EObjectValidator. EOBJECT__EVERY_PROXY_RESOLVES ) return true; for (Diagnostic childDiagnostic : diagnostic.getChildren()) { return  hasEveryProxyResolvesCode (childDiagnostic); } return false; }
Handling Broken Proxies ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Stepping Back: Uniform Resource Identifier (URI) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Fragment Queries ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Fragment Query URI Fragment
Saving Fragment Queries ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Going Deeper: org.eclipse.emf.ecore.xmi.XMLHelper ,[object Object],[object Object],[object Object],[object Object]
Using Fragment Queries ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Cross-Resource Containment ,[object Object],[object Object],[object Object],[object Object],[object Object]
Enabling Cross-Resource Containment EReference houses = EcoreFactory.eINSTANCE.createEReference(); houses.setName(&quot;houses&quot;); houses.setEType(house); houses.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY); houses.setContainment(true); houses. setResolveProxies ( true ); person.getEStructuralFeatures().add(houses); Dynamic Model Generated Model
Cross-Resource Containment { Library library = LibFactory.eINSTANCE.createLibrary(); Book book = LibFactory.eINSTANCE.createBook(); library .getBooks().add(book); System.out.println (library.eResource() + &quot; - &quot; + book.eResource()); Resource  libraryResource  = new ResourceImpl(URI.createURI(&quot; lib &quot;)); libraryResource .getContents().add( library ); System.out.println (library.eResource().getURI() + &quot; - “ +  book.eResource().getURI()); Resource  bookResource  = new ResourceImpl(URI.createURI(&quot; book &quot;)); bookResource .getContents().add( book ); System.out.println (library.eResource().getURI() + &quot; - &quot; +  book.eResource().getURI()); bookResource .getContents().remove( book ); System.out.println (library.eResource().getURI() + &quot; - &quot; +  book.eResource().getURI());  } null - null lib - lib lib - book lib - lib
EcoreUtil Methods for Cross-Resource Containment ,[object Object],[object Object],All children Local children
Inverse References ,[object Object],[object Object],[object Object],[object Object],[object Object]
Going Deeper: Associations and References ,[object Object],[object Object],[object Object],Associations References
Using a CrossReferencer ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Using a CrossReferencer { Library  library  = LibFactory.eINSTANCE.createLibrary(); Book  book  = LibFactory.eINSTANCE.createBook(); book.setTitle(&quot;EMF&quot;); Person  dave  = LibFactory.eINSTANCE.createPerson(); library .getBooks().add( book ); library .getWriters().add( dave ); book .getWriters().add( dave ); Map<EObject, Collection<EStructuralFeature.Setting>> map = EcoreUtil.CrossReferencer .find(Collections.singleton( library )); Collection<EStructuralFeature.Setting> settings = map.get(dave); if (settings != null) { for (EStructuralFeature.Setting setting : settings) { if (setting. getEObject () ==  book  &&  setting. getEStructuralFeature () == LibPackage.Literals. BOOK__WRITERS ) { System.out.println (&quot;Found it.  The book is amp;quot;&quot; + book.getTitle() + &quot;amp;quot;&quot;); } }  } } Found it.  The book is &quot;EMF&quot;
Using the ECrossReferenceAdapter ,[object Object],[object Object],[object Object],[object Object],[object Object]
Using the ECrossReferenceAdapter { Library  library  = LibFactory.eINSTANCE.createLibrary(); ECrossReferenceAdapter  adapter  = new  ECrossReferenceAdapter (); library.eAdapters().add( adapter ); Book  book  = LibFactory.eINSTANCE.createBook(); book.setTitle(&quot;EMF&quot;); Person  dave  = LibFactory.eINSTANCE.createPerson(); library .getBooks().add( book ); library .getWriters().add( dave ); book .getWriters().add( dave ); Collection<EStructuralFeature.Setting> settings = adapter. getNonNavigableInverseReferences (dave); for (EStructuralFeature.Setting setting : settings) { if (setting. getEObject () ==  book  &&  setting. getEStructuralFeature () == LibPackage.Literals. BOOK__WRITERS ) { System.out.println (&quot;Found it.  The book is amp;quot;&quot; + book.getTitle() + &quot;amp;quot;&quot;); } }  } Found it.  The book is &quot;EMF&quot;
Resource Tips & Tricks ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Resource Tips & Tricks ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Resource Tips & Tricks ,[object Object],[object Object],[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Generating Customized Code ,[object Object],[object Object],[object Object],[object Object],[object Object]
Generator Options ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Generator Options ,[object Object]
Suppress Interfaces /** * A representation of the model object * 'Library'. * @model * @generated */ public  interface Library  extends EObject { /** * Returns the value of the ‘Name' attribute. * @model * @generated */ String getName(); ... } /** * A representation of the model object * 'Library'. * @model * @generated */ public  class Library  extends EObjectImpl implements EObject { /** * The default value of the 'Name' attribute. * @model * @generated */ protected static final NAME_EDEFAULT = null; ... }
Suppress Interfaces ,[object Object],[object Object],[object Object]
Suppress EMF Metadata ,[object Object],/** * The Package for the model. * @model kind=&quot;package&quot; * @generated */ public  interface LibraryPackage  extends EPackage { /** * The package name. * @generated */ String eNAME = &quot;library&quot;; ... /** * The meta object id for the 'Book' class. * @generated */ int BOOK = 0; ... } /** * The Package for the model. * @model kind=&quot;package&quot; * @generated */ public  class LibraryPackageImpl extends EPackageImpl  { /** * The package name. * @generated */ String eNAME = &quot;library&quot;; ... }
Root Extends Interface ,[object Object],[object Object],/** * A representation of the model object * 'Library'. * @model * @generated */ public interface Library { ... } /** * A representation of the model object * 'Library'. * @model * @generated */ public interface Library  extends EObject { ... }
Suppress EMF Model Tags ,[object Object],/** * A representation of the model object * 'Library'. * @generated */ public interface Library extends EObject { ... /** * Returns the value of the Writers containment * reference list. * @generated */ EList<Writer> getWriters(); ... } /** * A representation of the model object * 'Library'. *  @model * @generated */ public interface Library extends EObject { ... /** * Returns the value of the Writers containment * reference list. *  @model containment=&quot;true&quot; *  type=&quot;org.eclipse.example.library.Writer&quot; * @generated */ EList<Writer> getWriters(); ... }
Suppress EMF Types ,[object Object],[object Object],[object Object],/** * Returns the value of the Writers containment * reference list. * @model containment=&quot;true“ *  type=&quot;org.eclipse.exasmple.library.Writer&quot; * @generated */ List <Writer> getWriters(); /** * Returns the value of the Writers containment * reference list. * @model containment=&quot;true&quot; *  type=&quot;org.eclipse.example.library.Writer&quot; * @generated */ EList <Writer> getWriters();
Dynamic Templates ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Template Replacement ,[object Object],[object Object],[object Object]
Template Insertions ,[object Object],[object Object],[object Object],[object Object]
Template Overrides ,[object Object],[object Object],[object Object],[object Object]
Template Insertions and Overrides ,[object Object],<%@  include  file=&quot;Class/genOperation.override.javajetinc&quot;  fail=&quot;alternative&quot;  %> <%@  start  %> public <%=genOperation.getImportedType()%> <%=genOperation.getName()%>(...) { <%if (genOperation.hasBody()) {%> <%=genOperation.getBody(genModel.getIndentation(stringBuffer))%> ... <%} else {%> <%@  include  file=&quot;Class/genOperation.TODO.override.javajetinc&quot;  fail=&quot;alternative&quot;  %> <%@  start  %> // TODO: implement this method throw new UnsupportedOperationException(); <%@  end  %> <%}%> } <%@  include  file=&quot;Class/genOperation.insert.javajetinc&quot;  fail=&quot;silent&quot;  %> <%@  end  %>
Generator Extension ,[object Object],[object Object],[object Object],[object Object]
Generator Extension ,[object Object],[object Object],[object Object],<extension point=&quot; org.eclipse.emf.codegen.ecore.generatorAdapters &quot;> < adapterFactory  class=&quot;com.example.generator.MyGeneratorAdapterFactory&quot;/> < adapter  modelClass=&quot;GenModel&quot; class=&quot;com.example.generator.MyGenModelGeneratorAdapter&quot;/> </extension>
Generator Model Extension ,[object Object],[object Object],[object Object],[object Object],[object Object]
Going Deeper: GenAnnotations ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Going Deeper: GenAnnotations ,[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Performance/Memory Overhead ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Boolean Flags ,[object Object],[object Object],[object Object],[object Object]
Virtual Feature Delegation ,[object Object],[object Object],[object Object]
Minimal Reflective Methods ,[object Object],[object Object],[object Object],[object Object]
XMLResource Options ,[object Object],[object Object],[object Object],[object Object]
XMLResource Load Options ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
XMLResource Load Options ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
XMLResource Save Options ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
XMLResource Save Options ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Importers and Exporters Java model Annotated Java Model Importer EMF Model Exporter Java model UML Java model XML Schema Java model Ecore Java model ? Java model ? Java model XML Schema Java model XML Schema for XMI
Model Importers ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Model Exporters ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Going Deeper: Why is the Generator Model so important? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Using Importers and Exporters ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Contributing an Importer via an Extension Point ,[object Object],[object Object],<extension point=&quot; org.eclipse.emf.importer.modelImporterDescriptors &quot;> <modelImporterDescriptor id =&quot;com.mycompany.ModelImporterDescriptor.XYZ&quot;  name=&quot;XYZ class model&quot; extensions=&quot;xyz&quot; wizard =&quot;com.mycompany.ImportWizard&quot;/> </extension>
Contributing an Exporter via an Extension Point ,[object Object],[object Object],<extension point=&quot; org.eclipse.emf.importer.modelExporterDescriptors &quot;> <modelExporterDescriptor id =&quot;com.mycompany.ModelExporterDescriptor.XYZ&quot;  name=&quot;XYZ class model&quot; wizard =&quot;com.mycompany.ExportWizard&quot;/> </extension>
Contributing Importers and Exporters via Global Registries ,[object Object],[object Object],[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Backward/Forward Compatibility ,[object Object],[object Object],[object Object],[object Object],[object Object]
Ecore2Ecore Mappings ,[object Object],[object Object],[object Object],[object Object],[object Object]
Ecore2XML Mappings ,[object Object],[object Object],[object Object],[object Object]
Ecore2XMLExtendedMetaData ,[object Object],[object Object],my.y my.x x_2_y.ecore2xml
OPTION_RECORD_UNKNOWN_FEATURE ,[object Object],[object Object],[object Object],my.x my.y y => x
Resource Handlers ,[object Object],[object Object],[object Object],[object Object]
Enabling Data Migration ,[object Object],[object Object],[object Object]
Enabling Data Migration ,[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Summary ,[object Object],[object Object]
Part 3: Eclipse Modeling Framework Technologies – Query, Transaction, Validation
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
What is EMFT? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
What was EMFT? ,[object Object],[object Object],[object Object],[object Object],[object Object]
What does the Validation Framework Provide? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
What does the Validation Framework Provide? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
What does the Query Framework Provide? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
What does the Transaction API Provide? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
What does the Transaction API Provide? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
What does the Transaction API Provide? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Constraint Providers ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Static Constraint Provider <extension point=&quot; org.eclipse.emf.validation.constraintProviders &quot;> < category name =&quot;Library Constraints&quot;   id =&quot;com.example.library&quot;> <constraintProvider> < package namespaceUri =&quot;http:///www.eclipse.org/Library/1.0.0&quot;/> <constraints   categories =&quot;com.example.library&quot;> <constraint lang =&quot;Java&quot; class =&quot;com.example.constraints.UniqueLibraryName&quot; severity =&quot;WARNING&quot; mode =&quot;Batch&quot; name=&quot;Library Must have a Unique Name&quot; id=&quot;com.example.library.LibraryNameIsUnique&quot; statusCode=&quot;1&quot;> <description>Libraries have unique names.</description> <message>{0} has the same name as another library.</message> < target class =&quot;Library&quot;/> </constraint> </constraints> </constraintProvider> </extension>
Dynamic Constraint Provider ,[object Object],[object Object],[object Object],[object Object],<extension point=&quot; org.eclipse.emf.validation.constraintProviders &quot;> < category name =&quot;Library Constraints&quot;   id =&quot;com.example.library&quot;> <constraintProvider   class =&quot;com.example.MyConstraintProvider&quot;   cache =&quot;false&quot;> < package namespaceUri =&quot;http:///www.eclipse.org/Library/1.0.0&quot;/> </constraintProvider> </extension>
Dynamic Constraint Provider ,[object Object],[object Object],[object Object]
Constraints ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Evaluation Modes ,[object Object],[object Object],[object Object],<constraint mode =&quot;Live&quot; …  > <description>Libraries have unique names.</description> <message>{0} has the same name as: {1}.</message> <target class=&quot;Library&quot;> < event name =&quot;Set&quot;>   < feature name =&quot;name&quot;/>   </ event > </target> </constraint>
Validation Service ,[object Object],[object Object],[object Object]
Validation Service ,[object Object],List objects = myResource.getContents();   // objects to validate // create a validator IValidator   validator  = ModelValidationService.getInstance()   . newValidator (EvaluationMode. BATCH ); // use it! IStatus  results  = validator. validate (objects); if (!results.isOK()) { ErrorDialog.openError(null, &quot;Validation&quot;, &quot;Validation Failed&quot;,   results); }
Validation Service ,[object Object],List< Notification > notifications = … ;   // some changes that we observed // create a validator IValidator validator = ModelValidationService.getInstance()   .newValidator(EvaluationMode. LIVE ); // use it! IStatus results = validator.validate( notifications ); if (!results.isOK()) { ErrorDialog.openError(null, &quot;Validation&quot;, &quot;Validation Failed&quot;,   results); }
Creating Constraints ,[object Object],[object Object],<constraint lang=&quot; OCL &quot; mode=&quot;Batch&quot; …  > <description>Libraries have unique names.</description> <message>{0} has the same name as: {1}.</message> <target class=&quot;Library&quot;/> <![CDATA[ Library.allInstances()->forAll(l |   l <> self implies l.name <> self.name) ]]> </constraint>
Creating Constraints ,[object Object],[object Object],[object Object]
Validation Context ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Creating Constraints public class LibraryNameIsUnique extends  AbstractConstraint  { public IStatus  validate (IValidationContext ctx) { Library target = (Library) ctx. getTarget ();  // object to validate // does this library have a unique name? Set<Library> libs = findLibrariesWithName(target.getName()); if (libs.size() > 1) { // report this problem against all like-named libraries   ctx. addResults (libs);   // don’t need to validate these other libraries libs.remove(target); ctx. skipCurrentConstraintFor (libs);   return ctx.createFailureStatus(new Object[] {   target, libs}); } return ctx. createSuccessStatus (); }  }
Listening for Validation Events ,[object Object],[object Object],[object Object],<extension point=&quot; org.eclipse.emf.validation.validationListeners &quot;> < listener class =&quot;com.example.validation.ProblemsReporter&quot;> < clientContext id =&quot;com.example.MyClientContext&quot;/> </listener> </extension>
Reporting Problems ,[object Object],[object Object],[object Object],[object Object],[object Object]
Reporting Problems public class ProblemsReporter implements  IValidationListener  { public void   validationOccurred (ValidationEvent event) { if (event. matches (IStatus.WARNING | IStatus.ERROR)) { // fabricate a multi-status for the MarkerUtil to consume List results = event. getValidationResults ();  IConstraintStatus multi = new MultiStatus( &quot;com.example.MyPlugin&quot;, 1, (IStatus[])results.toArray(new IStatus[results.size()]), &quot;Problems were found by validation&quot;, null); try { // create problem markers on the appropriate resources MarkerUtil.createMarkers (multi);   } catch ( CoreException e ) { // creation of problem markers failed for some reason MyPlugin.getLog().log(e.getStatus()); } } }  }
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Query Statements ,[object Object],[object Object],[object Object]
The FROM Clause ,[object Object],[object Object],[object Object],[object Object]
The WHERE Clause ,[object Object],[object Object],[object Object]
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework
EclipseCon 2007: Effective Use of the Eclipse Modeling Framework

More Related Content

What's hot

Oracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System AdministrationOracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System Administration
Mozammel Hoque
 
OpenJDKは使い物になるか?OpenJDKの実際と今後 (NTTデータ オープンソースDAY 2015 Autumn 講演資料)
OpenJDKは使い物になるか?OpenJDKの実際と今後 (NTTデータ オープンソースDAY 2015 Autumn 講演資料)OpenJDKは使い物になるか?OpenJDKの実際と今後 (NTTデータ オープンソースDAY 2015 Autumn 講演資料)
OpenJDKは使い物になるか?OpenJDKの実際と今後 (NTTデータ オープンソースDAY 2015 Autumn 講演資料)
NTT DATA OSS Professional Services
 
OOW16 - Advanced Architectures for Oracle E-Business Suite [CON6705]
OOW16 - Advanced Architectures for Oracle E-Business Suite [CON6705]OOW16 - Advanced Architectures for Oracle E-Business Suite [CON6705]
OOW16 - Advanced Architectures for Oracle E-Business Suite [CON6705]
vasuballa
 
GraalVM
GraalVMGraalVM
Visual studio2013からGithubへPushする方法
Visual studio2013からGithubへPushする方法Visual studio2013からGithubへPushする方法
Visual studio2013からGithubへPushする方法
Takuya Kawabe
 
Module 1: Overview of Rational Team Concert
Module 1: Overview of Rational Team ConcertModule 1: Overview of Rational Team Concert
Module 1: Overview of Rational Team Concert
IBM Rational software
 
OpenModelica tutorials_3 Model customization1 (超初級チュートリアル3.モデルのカスタマイズ1)
OpenModelica tutorials_3 Model customization1 (超初級チュートリアル3.モデルのカスタマイズ1)OpenModelica tutorials_3 Model customization1 (超初級チュートリアル3.モデルのカスタマイズ1)
OpenModelica tutorials_3 Model customization1 (超初級チュートリアル3.モデルのカスタマイズ1)
Shigenori Ueda
 
Oracle Data Minerハンズオンセミナー170927:②Oracle data minerハンズオン資料
Oracle Data Minerハンズオンセミナー170927:②Oracle data minerハンズオン資料Oracle Data Minerハンズオンセミナー170927:②Oracle data minerハンズオン資料
Oracle Data Minerハンズオンセミナー170927:②Oracle data minerハンズオン資料
オラクルエンジニア通信
 
【旧版】Oracle Database Cloud Service:サービス概要のご紹介 [2021年7月版]
【旧版】Oracle Database Cloud Service:サービス概要のご紹介 [2021年7月版]【旧版】Oracle Database Cloud Service:サービス概要のご紹介 [2021年7月版]
【旧版】Oracle Database Cloud Service:サービス概要のご紹介 [2021年7月版]
オラクルエンジニア通信
 
Looming Marvelous - Virtual Threads in Java Javaland.pdf
Looming Marvelous - Virtual Threads in Java Javaland.pdfLooming Marvelous - Virtual Threads in Java Javaland.pdf
Looming Marvelous - Virtual Threads in Java Javaland.pdf
jexp
 
Oracle GoldenGate導入Tips
Oracle GoldenGate導入TipsOracle GoldenGate導入Tips
Oracle GoldenGate導入Tips
オラクルエンジニア通信
 
All of the Performance Tuning Features in Oracle SQL Developer
All of the Performance Tuning Features in Oracle SQL DeveloperAll of the Performance Tuning Features in Oracle SQL Developer
All of the Performance Tuning Features in Oracle SQL Developer
Jeff Smith
 
Developing Java EE Applications on IntelliJ IDEA with Oracle WebLogic 12c
Developing Java EE Applications on IntelliJ IDEA with Oracle WebLogic 12cDeveloping Java EE Applications on IntelliJ IDEA with Oracle WebLogic 12c
Developing Java EE Applications on IntelliJ IDEA with Oracle WebLogic 12c
Bruno Borges
 
Take a load off! Load testing your Oracle APEX or JDeveloper web applications
Take a load off! Load testing your Oracle APEX or JDeveloper web applicationsTake a load off! Load testing your Oracle APEX or JDeveloper web applications
Take a load off! Load testing your Oracle APEX or JDeveloper web applications
Sage Computing Services
 
Automate the operation of your Oracle Cloud infrastructure v2.0
Automate the operation of your Oracle Cloud infrastructure v2.0Automate the operation of your Oracle Cloud infrastructure v2.0
Automate the operation of your Oracle Cloud infrastructure v2.0
Nelson Calero
 
Rational team concert (RTC) tips
Rational team concert (RTC) tipsRational team concert (RTC) tips
Rational team concert (RTC) tips
Raghunath (Gautam) Soman
 
Expose your data as an api is with oracle rest data services -spoug Madrid
Expose your data as an api is with oracle rest data services -spoug MadridExpose your data as an api is with oracle rest data services -spoug Madrid
Expose your data as an api is with oracle rest data services -spoug Madrid
Vinay Kumar
 
Abstraction java
Abstraction javaAbstraction java
Abstraction java
MahinImran
 
Oracle Database Vaultのご紹介
Oracle Database Vaultのご紹介Oracle Database Vaultのご紹介
Oracle Database Vaultのご紹介
オラクルエンジニア通信
 
Composite pattern
Composite patternComposite pattern
Composite pattern
Shakil Ahmed
 

What's hot (20)

Oracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System AdministrationOracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System Administration
 
OpenJDKは使い物になるか?OpenJDKの実際と今後 (NTTデータ オープンソースDAY 2015 Autumn 講演資料)
OpenJDKは使い物になるか?OpenJDKの実際と今後 (NTTデータ オープンソースDAY 2015 Autumn 講演資料)OpenJDKは使い物になるか?OpenJDKの実際と今後 (NTTデータ オープンソースDAY 2015 Autumn 講演資料)
OpenJDKは使い物になるか?OpenJDKの実際と今後 (NTTデータ オープンソースDAY 2015 Autumn 講演資料)
 
OOW16 - Advanced Architectures for Oracle E-Business Suite [CON6705]
OOW16 - Advanced Architectures for Oracle E-Business Suite [CON6705]OOW16 - Advanced Architectures for Oracle E-Business Suite [CON6705]
OOW16 - Advanced Architectures for Oracle E-Business Suite [CON6705]
 
GraalVM
GraalVMGraalVM
GraalVM
 
Visual studio2013からGithubへPushする方法
Visual studio2013からGithubへPushする方法Visual studio2013からGithubへPushする方法
Visual studio2013からGithubへPushする方法
 
Module 1: Overview of Rational Team Concert
Module 1: Overview of Rational Team ConcertModule 1: Overview of Rational Team Concert
Module 1: Overview of Rational Team Concert
 
OpenModelica tutorials_3 Model customization1 (超初級チュートリアル3.モデルのカスタマイズ1)
OpenModelica tutorials_3 Model customization1 (超初級チュートリアル3.モデルのカスタマイズ1)OpenModelica tutorials_3 Model customization1 (超初級チュートリアル3.モデルのカスタマイズ1)
OpenModelica tutorials_3 Model customization1 (超初級チュートリアル3.モデルのカスタマイズ1)
 
Oracle Data Minerハンズオンセミナー170927:②Oracle data minerハンズオン資料
Oracle Data Minerハンズオンセミナー170927:②Oracle data minerハンズオン資料Oracle Data Minerハンズオンセミナー170927:②Oracle data minerハンズオン資料
Oracle Data Minerハンズオンセミナー170927:②Oracle data minerハンズオン資料
 
【旧版】Oracle Database Cloud Service:サービス概要のご紹介 [2021年7月版]
【旧版】Oracle Database Cloud Service:サービス概要のご紹介 [2021年7月版]【旧版】Oracle Database Cloud Service:サービス概要のご紹介 [2021年7月版]
【旧版】Oracle Database Cloud Service:サービス概要のご紹介 [2021年7月版]
 
Looming Marvelous - Virtual Threads in Java Javaland.pdf
Looming Marvelous - Virtual Threads in Java Javaland.pdfLooming Marvelous - Virtual Threads in Java Javaland.pdf
Looming Marvelous - Virtual Threads in Java Javaland.pdf
 
Oracle GoldenGate導入Tips
Oracle GoldenGate導入TipsOracle GoldenGate導入Tips
Oracle GoldenGate導入Tips
 
All of the Performance Tuning Features in Oracle SQL Developer
All of the Performance Tuning Features in Oracle SQL DeveloperAll of the Performance Tuning Features in Oracle SQL Developer
All of the Performance Tuning Features in Oracle SQL Developer
 
Developing Java EE Applications on IntelliJ IDEA with Oracle WebLogic 12c
Developing Java EE Applications on IntelliJ IDEA with Oracle WebLogic 12cDeveloping Java EE Applications on IntelliJ IDEA with Oracle WebLogic 12c
Developing Java EE Applications on IntelliJ IDEA with Oracle WebLogic 12c
 
Take a load off! Load testing your Oracle APEX or JDeveloper web applications
Take a load off! Load testing your Oracle APEX or JDeveloper web applicationsTake a load off! Load testing your Oracle APEX or JDeveloper web applications
Take a load off! Load testing your Oracle APEX or JDeveloper web applications
 
Automate the operation of your Oracle Cloud infrastructure v2.0
Automate the operation of your Oracle Cloud infrastructure v2.0Automate the operation of your Oracle Cloud infrastructure v2.0
Automate the operation of your Oracle Cloud infrastructure v2.0
 
Rational team concert (RTC) tips
Rational team concert (RTC) tipsRational team concert (RTC) tips
Rational team concert (RTC) tips
 
Expose your data as an api is with oracle rest data services -spoug Madrid
Expose your data as an api is with oracle rest data services -spoug MadridExpose your data as an api is with oracle rest data services -spoug Madrid
Expose your data as an api is with oracle rest data services -spoug Madrid
 
Abstraction java
Abstraction javaAbstraction java
Abstraction java
 
Oracle Database Vaultのご紹介
Oracle Database Vaultのご紹介Oracle Database Vaultのご紹介
Oracle Database Vaultのご紹介
 
Composite pattern
Composite patternComposite pattern
Composite pattern
 

Viewers also liked

Epf composer overviewpart2
Epf composer overviewpart2Epf composer overviewpart2
Epf composer overviewpart2
Abdelkader Larbi
 
EclipseCon 2006: Introduction to the Eclipse Modeling Framework
EclipseCon 2006: Introduction to the Eclipse Modeling FrameworkEclipseCon 2006: Introduction to the Eclipse Modeling Framework
EclipseCon 2006: Introduction to the Eclipse Modeling Framework
Dave Steinberg
 
Eclipse Modeling Framework
Eclipse Modeling FrameworkEclipse Modeling Framework
Eclipse Modeling FrameworkAjay K
 
What every Eclipse developer should know about EMF
What every Eclipse developer should know about EMFWhat every Eclipse developer should know about EMF
What every Eclipse developer should know about EMFPhilip Langer
 
BTS SITE VISIT
BTS SITE VISITBTS SITE VISIT
BTS SITE VISIT
bhargav_shankhalpara
 
Presentation Rf Optimization And Planning
Presentation  Rf Optimization And PlanningPresentation  Rf Optimization And Planning
Presentation Rf Optimization And Planning
Ummaarraa Raa
 
Construction of telecommunication towers
Construction of telecommunication towersConstruction of telecommunication towers
Construction of telecommunication towers
snookala
 
Bts installation & commisioning.ppt
Bts installation & commisioning.pptBts installation & commisioning.ppt
Bts installation & commisioning.ppt
AIRTEL
 

Viewers also liked (9)

Epf composer overviewpart2
Epf composer overviewpart2Epf composer overviewpart2
Epf composer overviewpart2
 
3 g ngp228
3 g ngp2283 g ngp228
3 g ngp228
 
EclipseCon 2006: Introduction to the Eclipse Modeling Framework
EclipseCon 2006: Introduction to the Eclipse Modeling FrameworkEclipseCon 2006: Introduction to the Eclipse Modeling Framework
EclipseCon 2006: Introduction to the Eclipse Modeling Framework
 
Eclipse Modeling Framework
Eclipse Modeling FrameworkEclipse Modeling Framework
Eclipse Modeling Framework
 
What every Eclipse developer should know about EMF
What every Eclipse developer should know about EMFWhat every Eclipse developer should know about EMF
What every Eclipse developer should know about EMF
 
BTS SITE VISIT
BTS SITE VISITBTS SITE VISIT
BTS SITE VISIT
 
Presentation Rf Optimization And Planning
Presentation  Rf Optimization And PlanningPresentation  Rf Optimization And Planning
Presentation Rf Optimization And Planning
 
Construction of telecommunication towers
Construction of telecommunication towersConstruction of telecommunication towers
Construction of telecommunication towers
 
Bts installation & commisioning.ppt
Bts installation & commisioning.pptBts installation & commisioning.ppt
Bts installation & commisioning.ppt
 

Similar to EclipseCon 2007: Effective Use of the Eclipse Modeling Framework

Eclipse World 2007: Fundamentals of the Eclipse Modeling Framework
Eclipse World 2007: Fundamentals of the Eclipse Modeling FrameworkEclipse World 2007: Fundamentals of the Eclipse Modeling Framework
Eclipse World 2007: Fundamentals of the Eclipse Modeling Framework
Dave Steinberg
 
EclipseCon 2008: Fundamentals of the Eclipse Modeling Framework
EclipseCon 2008: Fundamentals of the Eclipse Modeling FrameworkEclipseCon 2008: Fundamentals of the Eclipse Modeling Framework
EclipseCon 2008: Fundamentals of the Eclipse Modeling Framework
Dave Steinberg
 
Modeling With Eclipse @SoftShake 2011
Modeling With Eclipse @SoftShake 2011Modeling With Eclipse @SoftShake 2011
Modeling With Eclipse @SoftShake 2011
Mickael Istria
 
EMF - The off beat path
EMF - The off beat pathEMF - The off beat path
EMF - The off beat path
17thcamel
 
MDD and modeling tools research
MDD and modeling tools researchMDD and modeling tools research
MDD and modeling tools research
Roger Xia
 
Model Driven Development With Emf And Eclipse Link
Model Driven Development With Emf And Eclipse LinkModel Driven Development With Emf And Eclipse Link
Model Driven Development With Emf And Eclipse Link
Suresh Krishna Madhuvarsu
 
What the heck is Eclipse Modeling and why should you care !
What the heck is Eclipse Modeling and why should you care !What the heck is Eclipse Modeling and why should you care !
What the heck is Eclipse Modeling and why should you care !
Cédric Brun
 
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the Future
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the FutureEclipse Demo Camp 2010 - Eclipse e4 – The Status and the Future
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the Future
Tonny Madsen
 
JCR Mangement - Eclipse Summit 2008
JCR Mangement - Eclipse Summit 2008JCR Mangement - Eclipse Summit 2008
JCR Mangement - Eclipse Summit 2008inovex GmbH
 
Eclipse Summit 2008 Jcrm Demo V1.4
Eclipse Summit 2008 Jcrm Demo V1.4Eclipse Summit 2008 Jcrm Demo V1.4
Eclipse Summit 2008 Jcrm Demo V1.4
guestc06d27
 
EMF Facet 0.1.0 - Nantes DemoCamp 2011
EMF Facet 0.1.0 - Nantes DemoCamp 2011EMF Facet 0.1.0 - Nantes DemoCamp 2011
EMF Facet 0.1.0 - Nantes DemoCamp 2011
Grégoire Dupé
 
Development of forms editors based on Ecore metamodels
Development of forms editors based on Ecore metamodelsDevelopment of forms editors based on Ecore metamodels
Development of forms editors based on Ecore metamodelsMario Cervera
 
Pragmatic Model Driven Development using openArchitectureWare
Pragmatic Model Driven Development using openArchitectureWarePragmatic Model Driven Development using openArchitectureWare
Pragmatic Model Driven Development using openArchitectureWare
Michael Vorburger
 
MODEL DRIVEN ARCHITECTURE, CONTROL SYSTEMS AND ECLIPSE
MODEL DRIVEN ARCHITECTURE, CONTROL SYSTEMS AND ECLIPSEMODEL DRIVEN ARCHITECTURE, CONTROL SYSTEMS AND ECLIPSE
MODEL DRIVEN ARCHITECTURE, CONTROL SYSTEMS AND ECLIPSE
Anže Vodovnik
 
What every Eclipse developer should know about EMF - Tutorial at EclipseCon
What every Eclipse developer should know about EMF - Tutorial at EclipseConWhat every Eclipse developer should know about EMF - Tutorial at EclipseCon
What every Eclipse developer should know about EMF - Tutorial at EclipseConJonasHelming
 
What's New in MDT?
What's New in MDT?What's New in MDT?
What's New in MDT?
Kenn Hussey
 
Model-driven development and Code generation
Model-driven development and Code generationModel-driven development and Code generation
Model-driven development and Code generation
Pavel Vlasov
 
ITU - MDD - EMF
ITU - MDD - EMFITU - MDD - EMF
ITU - MDD - EMF
Tonny Madsen
 
Reusing FEFEM in form-based model editor generation.
Reusing FEFEM in form-based model editor generation.Reusing FEFEM in form-based model editor generation.
Reusing FEFEM in form-based model editor generation.University of York
 

Similar to EclipseCon 2007: Effective Use of the Eclipse Modeling Framework (20)

Eclipse World 2007: Fundamentals of the Eclipse Modeling Framework
Eclipse World 2007: Fundamentals of the Eclipse Modeling FrameworkEclipse World 2007: Fundamentals of the Eclipse Modeling Framework
Eclipse World 2007: Fundamentals of the Eclipse Modeling Framework
 
EclipseCon 2008: Fundamentals of the Eclipse Modeling Framework
EclipseCon 2008: Fundamentals of the Eclipse Modeling FrameworkEclipseCon 2008: Fundamentals of the Eclipse Modeling Framework
EclipseCon 2008: Fundamentals of the Eclipse Modeling Framework
 
Modeling With Eclipse @SoftShake 2011
Modeling With Eclipse @SoftShake 2011Modeling With Eclipse @SoftShake 2011
Modeling With Eclipse @SoftShake 2011
 
EMF - The off beat path
EMF - The off beat pathEMF - The off beat path
EMF - The off beat path
 
MDD and modeling tools research
MDD and modeling tools researchMDD and modeling tools research
MDD and modeling tools research
 
Model Driven Development With Emf And Eclipse Link
Model Driven Development With Emf And Eclipse LinkModel Driven Development With Emf And Eclipse Link
Model Driven Development With Emf And Eclipse Link
 
ALT
ALTALT
ALT
 
What the heck is Eclipse Modeling and why should you care !
What the heck is Eclipse Modeling and why should you care !What the heck is Eclipse Modeling and why should you care !
What the heck is Eclipse Modeling and why should you care !
 
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the Future
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the FutureEclipse Demo Camp 2010 - Eclipse e4 – The Status and the Future
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the Future
 
JCR Mangement - Eclipse Summit 2008
JCR Mangement - Eclipse Summit 2008JCR Mangement - Eclipse Summit 2008
JCR Mangement - Eclipse Summit 2008
 
Eclipse Summit 2008 Jcrm Demo V1.4
Eclipse Summit 2008 Jcrm Demo V1.4Eclipse Summit 2008 Jcrm Demo V1.4
Eclipse Summit 2008 Jcrm Demo V1.4
 
EMF Facet 0.1.0 - Nantes DemoCamp 2011
EMF Facet 0.1.0 - Nantes DemoCamp 2011EMF Facet 0.1.0 - Nantes DemoCamp 2011
EMF Facet 0.1.0 - Nantes DemoCamp 2011
 
Development of forms editors based on Ecore metamodels
Development of forms editors based on Ecore metamodelsDevelopment of forms editors based on Ecore metamodels
Development of forms editors based on Ecore metamodels
 
Pragmatic Model Driven Development using openArchitectureWare
Pragmatic Model Driven Development using openArchitectureWarePragmatic Model Driven Development using openArchitectureWare
Pragmatic Model Driven Development using openArchitectureWare
 
MODEL DRIVEN ARCHITECTURE, CONTROL SYSTEMS AND ECLIPSE
MODEL DRIVEN ARCHITECTURE, CONTROL SYSTEMS AND ECLIPSEMODEL DRIVEN ARCHITECTURE, CONTROL SYSTEMS AND ECLIPSE
MODEL DRIVEN ARCHITECTURE, CONTROL SYSTEMS AND ECLIPSE
 
What every Eclipse developer should know about EMF - Tutorial at EclipseCon
What every Eclipse developer should know about EMF - Tutorial at EclipseConWhat every Eclipse developer should know about EMF - Tutorial at EclipseCon
What every Eclipse developer should know about EMF - Tutorial at EclipseCon
 
What's New in MDT?
What's New in MDT?What's New in MDT?
What's New in MDT?
 
Model-driven development and Code generation
Model-driven development and Code generationModel-driven development and Code generation
Model-driven development and Code generation
 
ITU - MDD - EMF
ITU - MDD - EMFITU - MDD - EMF
ITU - MDD - EMF
 
Reusing FEFEM in form-based model editor generation.
Reusing FEFEM in form-based model editor generation.Reusing FEFEM in form-based model editor generation.
Reusing FEFEM in form-based model editor generation.
 

Recently uploaded

Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
Bhaskar Mitra
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Ramesh Iyer
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
Paul Groth
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
Product School
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 

Recently uploaded (20)

Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 

EclipseCon 2007: Effective Use of the Eclipse Modeling Framework

  • 1. Christian W. Damus, Kenn Hussey, Ed Merks and Dave Steinberg IBM Rational Software Ottawa and Toronto, Canada EMF, EMFT, and MDT Projects Effective Use of the Eclipse Modeling Framework https://w3-03.ibm.com/legal/ipl/iplsite.nsf/pages/wtts-trademarks+home
  • 2. Part 1: Introduction to the Eclipse Modeling Framework
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21. EMF Architecture EMF Runtime EMF Tools Core Edit Codegen Model Editor Application Generates Eclipse Platform
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 32.
  • 33. Ecore Model for Purchase Orders is represented in Ecore as
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44. The Code Generation Process Java Code Model Importer JET Simplified version UML Java Model ? XML Schema GenModel Ecore
  • 45. The Code Generation Process Java Code Merged Java Code Model Importer JET JMerge Generated Java Code Full version UML Java Model ? XML Schema GenModel Ecore
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53. Proxy Resolution and Demand Load PurchaseOrder p2 = p1. getNext (); p1 p1.xml next p2 p2.xml proxyURI=“ p2.xml #p2” next proxyURI=“p2.xml#p2” next <PurchaseOrder> <shipTo>John Doe</shipTo> <next> p2.xml#p2 </next> </PurchaseOrder> p1.xml
  • 54.
  • 55.
  • 56.
  • 57. Bidirectional Reference Handshaking public interface PurchaseOrder { PurchaseOrder getNext (); void setNext (PurchaseOrder value); PurchaseOrder getPrevious (); void setPrevious (PurchaseOrder value); } Invariant imposed by the bidirectional reference: po.getNext().getPrevious() == po
  • 58. Bidirectional Reference Handshaking p1. setNext (p3); p2 p1 p2 p3 previous next next previous next previous next previous change notification
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84. Part 2: Advanced Features of the Eclipse Modeling Framework
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92. EcoreUtil.ProxyCrossReferencer public static void printProxiesDetails(ResourceSet resourceSet ) { int counter = 0; Map<EObject, Collection<EStructuralFeature.Setting>> map = ProxyCrossReferencer .find(resourceSet); for (Map.Entry<EObject, Collection<EStructuralFeature.Setting>> entry : map.entrySet()) { EObject proxyEObject = entry. getKey (); System.out.println (&quot;&quot; + ++counter + &quot;. &quot; + EcoreUtil.getURI(proxyEObject)); System.out.println (&quot;Is Proxy: &quot; + proxyEObject.eIsProxy()); for (EStructuralFeature.Setting setting : entry. getValue ()) { System.out.println (&quot;Feature: &quot; + setting. getEStructuralFeature ().getName()); EObject eObject = setting. getEObject (); EStructuralFeature nameFeature = eObject.eClass().getEStructuralFeature(&quot;name&quot;); if (nameFeature != null) { System.out.println (&quot;EObject.getName(): &quot; + eObject.eGet(nameFeature)); } } } } 1. uri3.xmi#/0 Is Proxy: true Feature: home EObject.getName(): john
  • 93.
  • 94. Validating Proxies public static void validateProxies(EObject eObject) { Diagnostic diagnostic = Diagnostician .INSTANCE. validate (eObject); if (diagnostic.getSeverity() == Diagnostic.ERROR) { if ( hasEveryProxyResolvesCode (diagnostic)) { System.out.println (&quot;Broken proxies found!&quot;); return; } } System.out.println (&quot;Proxies are fine.&quot;); } public static boolean hasEveryProxyResolvesCode (Diagnostic diagnostic) { if (diagnostic. getCode () == EObjectValidator. EOBJECT__EVERY_PROXY_RESOLVES ) return true; for (Diagnostic childDiagnostic : diagnostic.getChildren()) { return hasEveryProxyResolvesCode (childDiagnostic); } return false; }
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102. Enabling Cross-Resource Containment EReference houses = EcoreFactory.eINSTANCE.createEReference(); houses.setName(&quot;houses&quot;); houses.setEType(house); houses.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY); houses.setContainment(true); houses. setResolveProxies ( true ); person.getEStructuralFeatures().add(houses); Dynamic Model Generated Model
  • 103. Cross-Resource Containment { Library library = LibFactory.eINSTANCE.createLibrary(); Book book = LibFactory.eINSTANCE.createBook(); library .getBooks().add(book); System.out.println (library.eResource() + &quot; - &quot; + book.eResource()); Resource libraryResource = new ResourceImpl(URI.createURI(&quot; lib &quot;)); libraryResource .getContents().add( library ); System.out.println (library.eResource().getURI() + &quot; - “ + book.eResource().getURI()); Resource bookResource = new ResourceImpl(URI.createURI(&quot; book &quot;)); bookResource .getContents().add( book ); System.out.println (library.eResource().getURI() + &quot; - &quot; + book.eResource().getURI()); bookResource .getContents().remove( book ); System.out.println (library.eResource().getURI() + &quot; - &quot; + book.eResource().getURI()); } null - null lib - lib lib - book lib - lib
  • 104.
  • 105.
  • 106.
  • 107.
  • 108. Using a CrossReferencer { Library library = LibFactory.eINSTANCE.createLibrary(); Book book = LibFactory.eINSTANCE.createBook(); book.setTitle(&quot;EMF&quot;); Person dave = LibFactory.eINSTANCE.createPerson(); library .getBooks().add( book ); library .getWriters().add( dave ); book .getWriters().add( dave ); Map<EObject, Collection<EStructuralFeature.Setting>> map = EcoreUtil.CrossReferencer .find(Collections.singleton( library )); Collection<EStructuralFeature.Setting> settings = map.get(dave); if (settings != null) { for (EStructuralFeature.Setting setting : settings) { if (setting. getEObject () == book && setting. getEStructuralFeature () == LibPackage.Literals. BOOK__WRITERS ) { System.out.println (&quot;Found it. The book is amp;quot;&quot; + book.getTitle() + &quot;amp;quot;&quot;); } } } } Found it. The book is &quot;EMF&quot;
  • 109.
  • 110. Using the ECrossReferenceAdapter { Library library = LibFactory.eINSTANCE.createLibrary(); ECrossReferenceAdapter adapter = new ECrossReferenceAdapter (); library.eAdapters().add( adapter ); Book book = LibFactory.eINSTANCE.createBook(); book.setTitle(&quot;EMF&quot;); Person dave = LibFactory.eINSTANCE.createPerson(); library .getBooks().add( book ); library .getWriters().add( dave ); book .getWriters().add( dave ); Collection<EStructuralFeature.Setting> settings = adapter. getNonNavigableInverseReferences (dave); for (EStructuralFeature.Setting setting : settings) { if (setting. getEObject () == book && setting. getEStructuralFeature () == LibPackage.Literals. BOOK__WRITERS ) { System.out.println (&quot;Found it. The book is amp;quot;&quot; + book.getTitle() + &quot;amp;quot;&quot;); } } } Found it. The book is &quot;EMF&quot;
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118. Suppress Interfaces /** * A representation of the model object * 'Library'. * @model * @generated */ public interface Library extends EObject { /** * Returns the value of the ‘Name' attribute. * @model * @generated */ String getName(); ... } /** * A representation of the model object * 'Library'. * @model * @generated */ public class Library extends EObjectImpl implements EObject { /** * The default value of the 'Name' attribute. * @model * @generated */ protected static final NAME_EDEFAULT = null; ... }
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145. Importers and Exporters Java model Annotated Java Model Importer EMF Model Exporter Java model UML Java model XML Schema Java model Ecore Java model ? Java model ? Java model XML Schema Java model XML Schema for XMI
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164. Part 3: Eclipse Modeling Framework Technologies – Query, Transaction, Validation
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176. Static Constraint Provider <extension point=&quot; org.eclipse.emf.validation.constraintProviders &quot;> < category name =&quot;Library Constraints&quot; id =&quot;com.example.library&quot;> <constraintProvider> < package namespaceUri =&quot;http:///www.eclipse.org/Library/1.0.0&quot;/> <constraints categories =&quot;com.example.library&quot;> <constraint lang =&quot;Java&quot; class =&quot;com.example.constraints.UniqueLibraryName&quot; severity =&quot;WARNING&quot; mode =&quot;Batch&quot; name=&quot;Library Must have a Unique Name&quot; id=&quot;com.example.library.LibraryNameIsUnique&quot; statusCode=&quot;1&quot;> <description>Libraries have unique names.</description> <message>{0} has the same name as another library.</message> < target class =&quot;Library&quot;/> </constraint> </constraints> </constraintProvider> </extension>
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187. Creating Constraints public class LibraryNameIsUnique extends AbstractConstraint { public IStatus validate (IValidationContext ctx) { Library target = (Library) ctx. getTarget (); // object to validate // does this library have a unique name? Set<Library> libs = findLibrariesWithName(target.getName()); if (libs.size() > 1) { // report this problem against all like-named libraries ctx. addResults (libs); // don’t need to validate these other libraries libs.remove(target); ctx. skipCurrentConstraintFor (libs); return ctx.createFailureStatus(new Object[] { target, libs}); } return ctx. createSuccessStatus (); } }
  • 188.
  • 189.
  • 190. Reporting Problems public class ProblemsReporter implements IValidationListener { public void validationOccurred (ValidationEvent event) { if (event. matches (IStatus.WARNING | IStatus.ERROR)) { // fabricate a multi-status for the MarkerUtil to consume List results = event. getValidationResults (); IConstraintStatus multi = new MultiStatus( &quot;com.example.MyPlugin&quot;, 1, (IStatus[])results.toArray(new IStatus[results.size()]), &quot;Problems were found by validation&quot;, null); try { // create problem markers on the appropriate resources MarkerUtil.createMarkers (multi); } catch ( CoreException e ) { // creation of problem markers failed for some reason MyPlugin.getLog().log(e.getStatus()); } } } }
  • 191.
  • 192.
  • 193.
  • 194.

Editor's Notes

  1. You will also need to: - manually change the JDK compliance level in the Java Compiler project properties or workspace preferences - Update the JRE container in the project’s classpath (use the Plug-in Manifest Editor: on the overview page, select “Update the classpath settings”)
  2. Inverse References - Finding the opposite of a unidirectional association
  3. Initially the arrows are proxies and when the references in Resource1 are resolved, they are replaced by the actual object from Resource2. The 2 nd proxy will be a proxy until it is accessed. When the 1 st proxy is resolved Resource2 is loaded into the ResourceSet but that doesn’t resolve all the proxies.
  4. The cross referencers check the containment tree of an EObject. Make it clear that a proxy is not “referenced” – this is a “transient” state.
  5. ECoreUtil.CrossReferencer is a convenient utility class for locating cross-references (that is, non-containment references) in the containment tree, or trees, rooted at a specified EMF object, resource, or resource set, or arbitrary collection of all three. The result of the search is stored in the cross-referencer’s base HashMap. Entries are keyed by reference targets, and their values are the collections of EStructuralFeature.Settings that identify all the source object-feature pairs referencing the keyed target. ECoreUtil.ExternalCrossReferencer is a convenient utility class for locating external cross-references in the containment tree, or trees, rooted at a specified EMF object, resource, or resource set, or arbitrary collection of all three. An external cross-reference is one that has a target that is not within the containment structure rooted at the object(s) being searched. ECoreUtil.ProxyCrossReferencer is a convenient utility class for locating proxies in the containment tree, or trees, rooted at a specified EMF object, resource, or resource set, or arbitrary collection of all three. ECoreUtil.UnresolvedProxyCrossReferencer is a convenient utility class for locating unresolvable (broken) proxies in the containment tree, or trees, rooted at a specified EMF object, resource, or resource set, or arbitrary collection of all three. ECoreUtil.UsageCrossReferencer is a convenient utility class for locating cross-references in the containment tree, or trees, rooted at a specified EMF object, resource, or resource set, or arbitrary collection of all three, with targets that are specific objects of interest. One or more objects of interest can be passed to the static find() or findAll() methods, respectively, which in turn construct an instance, with the search root(s), and then call their corresponding findUsage() or findAllUsage() instance methods.
  6. Is exposed on InternalEObject
  7. Explains why the name “CrossReferencer”. This is an informal qualification.
  8. As explained in the “Introduction to EMF” tutorial, the EObjectValidator is used as base of generated validators and directly for packages without additional constraints defined.
  9. Not always can we choose the “proxy handling” option we would like to…
  10. Formatted string: /, encoded, … Encoding is done by Converting the character string into a sequence of bytes using UTF-8 Convert each character that is not an ASCII letter or digit into %HH, where HH is the hexadecimal value of the byte URL: Resources that can be accessed with existing protocols URN: “Intended to serve as persistent, location-independent, resource identifiers” oasis urn: http://rfc3121.x42.com/
  11. URI.encodeFragment(String) can be used to produce a valid fragment.
  12. The default value of the “Resolve Proxies” attribute in an Ecore model is true.
  13. We could also call book.eContainer().eResource.getURI() instead of just library.eResource().getURI(), to illustrate that the book hasn&apos;t been removed from its container (although, that&apos;s kind of obvious from the fact that it ends up back in the same resource as the library)…
  14. Should also mention generated editor support for containment proxies (Control / Uncontrol menu items)…
  15. The question we want to answer is: what books were written by Dave? We could also use the UsageCrossReferencer…
  16. Why are we not defining what an ECrossReferenceAdapter is? Because we (should) know what a CrossReferencer and an Adapter are…
  17. The question we want to answer is: what books were written by Dave?
  18. This is not used by the generated UI to decided whether an editor is dirty or not - EMF.Edit monitors the state of the command stack of the EditingDomain…
  19. Resource.Internal, like InternalEObject and EStructuralFeature.Internal, is not really an “internal” API – it’s an API of less commonly used implementation oriented methods… all resources are assumed to implement this interface, and do so by virtue of extending ResourceImpl.
  20. Generates implementation classes without separate interface declarations Set the value of the ‘Suppress Interfaces’ generator model property to ‘true’
  21. Generates code without a package interface declaring metadata accessors and constants - these are generated into the package implementation, instead - Factory doesn’t extend EFactory Set the value of the ‘Suppress EMF Meta Data’ generator model property to ‘true’
  22. Generates code where interfaces for modeled root classes extend a specified interface, or nothing at all Clear or set the value of the ‘Root Extends Interface’ generator model property - Qualified name of interface, which need not extend EObject
  23. Generates code without @model tags in the Javadoc Set the value of the ‘Suppress EMF Model Tags’ generator model property to ‘true’
  24. Generates methods for features and operations which use standard Java collection and object types instead of those from EMF (e.g. EList, EMap, EObject) Set the value of the ‘Suppress EMF Types’ generator model property to ‘true’
  25. Header.javajetinc is an example of a template that should perhaps always be replaced – to contain your copyright.
  26. Dynamic “placeholder” template can also add required imports for compiling the template (in case the insertions reference new types). Need to reference default template “container” in JET project settings – i.e. templates;@/org.eclipse.emf.codegen.ecore/templates.
  27. Dynamic “placeholder” template can also add required imports for compiling the template (in case the overrides reference new types). Need to reference default template “container” in JET project settings – i.e. templates;@/org.eclipse.emf.codegen.ecore/templates.
  28. Of course, there is always a trade-off between time and space concerns…
  29. Of course, virtual feature delegation has a (significant) performance cost. We are also working on a VirtualEObjectImpl which will use virtual slots instead of a properties holder…
  30. OPTION_DEFER_IDREF_RESOLUTION Option value: Boolean This option can be enabled to defer resolving references within a resource until the whole document has been parsed. The default strategy is to try to resolve each reference as it is encountered and then, at the end, resolve any ones that failed. This wastes time looking up forward references that do not exist yet, which, if you&apos;re using intrinsic IDs, can involve iterating over every object in the resource. OPTION_USE_PARSER_POOL Option value: org.eclipse.emf.ecore.xmi.XMLParserPool We strongly encourage to set this option for EMF load operation. This option is used to provide a parser pool, from which SAXParser instances are created and reused. XMLParserPool defines a simple interface for obtaining and releasing parsers based on their features and properties. Specifying a parser pool, such as an instance of the default implementation, XMLParserPoolImpl, can improve performance dramatically when a resource performs repeated loads. A single parser pool can also be shared among multiple resources. Default implementation is also thread-safe. OPTION_USE_XML_NAME_TO_FEATURE_MAP Option value: java.util.Map This option can be used to share the cache of mappings between qualified XML names (namespace + local name) and corresponding Ecore features across invocations of load(), or even among resources. It can take some time to determine these associations, since they can be affected by ExtendedMetaData or an XMLMap, so they are cached during a load. If you use this option to specify the same map for several loads, that instance will be used as the cache, improving the performance for all but the first. You can share a single map among multiple resources, unless they load different models with conflicting qualified names.
  31. OPTION_USE_CACHED_LOOKUP_TABLE Option value: java.util.List Specify a list as a place holder for caching information during the subsequent saving of XML documents. This option can improve performance for serialization (saving) of multiple XML resources. This option is similar to the OPTION_USE_XML_NAME_TO_FEATURE_MAP which is used for deserialization (loading). OPTION_USE_DEPRECATED_METHODS Option value: Boolean Use methods that were deprecated in EMF. The default value is true. To improve deserialization performance turn this option to false. The methods affected are: XMLHelper#createObject(org.eclipse.emf.ecore.EFactory, EClassifier) XMLHander#handleNamespaceAttribs() XMLHandler#createObjectFromFactory(EFactory factory, String typeName) XMLLoadImpl#getEncoding() Note: if you use this option the SAX parser used for parsing documents must be namespace-aware parser, i.e. the namespaces should be turned on for the parser used. The default parser implementation is not namespace-aware. To turn on namespaces, either use OPTION_USE_PARSER_POOL or overwrite XMLLoadImpl#makeParser()
  32. OPTION_FLUSH_THRESHOLD Option value: Integer This option can be used to specify a maximum number of characters to allow in the output stream before flushing it. This reduces the memory used in serializing a large file, but it is slower than the default behavior. OPTION_USE_CACHED_LOOKUP_TABLE Option value: java.util.List This option provides a placeholder to cache information about structure of the model. (using qualified XML names as a key for caching information). When possible, the same placeholder list should be shared among resources, unless you intent to serialize instances of different models. OPTION_CONFIGURATION_CACHE Option value: Boolean This option can be enabled to cache and reuse generic data in repeated save operations, avoiding the cost of reinitializing the data. This option is save to use when serializing instances of the same model.
  33. OPTION_FORMATTED Option value: Boolean This option is used to disable formatting of documents, omitting whitespaces and line brakes, to improve the performance of saving and, subsequently, loading the resulting document. This means fewer bytes have to be written and read, but the serialization will be less human-readable. OPTION_USE_FILE_BUFFER Option value: Boolean This option can be enabled to accumulate output during serialization in a temporary file, rather than an in-memory buffer. This reduces the memory used in serializing a large file, but it is slower than the default behavior.
  34. Every solid box in this picture represents a way to describe a modeled domain.
  35. The HTML exporter even understands generics in models, highlighting things like type parameters
  36. When exporting a model as a schema, we would need the qualified name of the package if we were adding an Ecore package annotation.
  37. Before the Importer and Exporter hooks, we used to see all types of approaches to, for example, convert a proprietary format to Ecore: menu items, separate application, tool bar buttons, import wizard, …
  38. That’s all one needs to know to provide an importer or an exporter. The rest of this section will address the “non-mandatory” framework we’ve created to make it easier to write converters.
  39. Ideally, XML references would be based on identifiers, e.g. UUIDs.
  40. The Ecore2Ecore mapping editor is much like the XSD2Ecore mapping editor.
  41. The Ecore2XML editor is just a standard EMF-generated editor.
  42. These steps cab be done in a customized resource factory implementation to set the default load/save options for all resources managed by the factory…
  43. Could also be done by a customized editor or programmatically when calling the load()/save() methods.