package com.ibm.devworks.sample;
/**
* This class provides methods for building an in-memory representation of the
* Ecore-based model dynamically.
*
* @author Nidhi Singh, Rohit Babbar
*/
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
public class DynamicModelingEngine {
EcoreFactory _coreFactory;
EcorePackage _corePackage;
EPackage _bookStoreEPackage;
EClass _bookStoreEClass, _bookEClass;
EAttribute _bookStoreOwner, _bookStoreLocation;
EAttribute _bookName, _bookISBN;
EReference _bookStore_Books;
EObject _bookEObject, _bookStoreEObject;
public DynamicModelingEngine() {
// Instantiate EcoreFactory and EcorePackage
_coreFactory = EcoreFactory.eINSTANCE;
_corePackage = EcorePackage.eINSTANCE;
}
public void buildBookStoreModel() {
createDynamicEClass();
createDynamicEPackage();
createDynamicEAttributes();
// Place BookStore class and Book class in BookStorePackage
_bookStoreEPackage.getEClassifiers().add(_bookStoreEClass);
_bookStoreEPackage.getEClassifiers().add(_bookEClass);
createDynamicInstances();
setDynamicInstanceAttr();
getDynamicInstanceAttr();
}
public void createDynamicEClass() {
// Create EClass instance to model BookShop class
_bookStoreEClass = _coreFactory.createEClass();
_bookStoreEClass.setName("BookStore");
// Create EClass instance to model Book class
_bookEClass = _coreFactory.createEClass();
_bookEClass.setName("Book");
}
public void createDynamicEAttributes() {
// Create attributes for BookStore class
_bookStoreOwner = _coreFactory.createEAttribute();
_bookStoreOwner.setName("owner");
_bookStoreOwner.setEType(_corePackage.getEString());
_bookStoreLocation = _coreFactory.createEAttribute();
_bookStoreLocation.setName("location");
_bookStoreLocation.setEType(_corePackage.getEString());
_bookStore_Books = _coreFactory.createEReference();
_bookStore_Books.setName("books");
_bookStore_Books.setEType(_bookEClass);
_bookStore_Books.setUpperBound(EStructuralFeature.UNBOUNDED_MULTIPLICITY);
_bookStore_Books.setContainment(true);
// Create attributes for Book class as defined in the model
_bookName = _coreFactory.createEAttribute();
_bookName.setName("name");
_bookName.setEType(_corePackage.getEString());
_bookISBN = _coreFactory.createEAttribute();
_bookISBN.setName("isbn");
_bookISBN.setEType(_corePackage.getEInt());
// Associate owner, location and books attributes/references
// with BookStore class
_bookStoreEClass.getEStructuralFeatures().add(_bookStoreOwner);
_bookStoreEClass.getEStructuralFeatures().add(_bookStoreLocation);
_bookStoreEClass.getEStructuralFeatures().add(_bookStore_Books);
// Associate name and isbn attributes with Book class
_bookEClass.getEStructuralFeatures().add(_bookName);
_bookEClass.getEStructuralFeatures().add(_bookISBN);
}
public void createDynamicEPackage() {
// Instantiate EPackage and provide unique URI to identify the package
// instance
_bookStoreEPackage = _coreFactory.createEPackage();
_bookStoreEPackage.setName("BookStorePackage");
_bookStoreEPackage.setNsPrefix("bookStore");
_bookStoreEPackage.setNsURI("http:///com.ibm.dynamic.example.bookStore.ecore");
}
public void createDynamicInstances() {
// Obtain factory instance from BookStorePackage
EFactory bookFactoryInstance = _bookStoreEPackage.getEFactoryInstance();
// Create dynamic instances of BookStore/Book class
_bookEObject = bookFactoryInstance.create(_bookEClass);
_bookStoreEObject = bookFactoryInstance.create(_bookStoreEClass);
}
public void setDynamicInstanceAttr() {
// Set the values of BookStore instance attributes
_bookStoreEObject.eSet(_bookStoreOwner, "David Brown");
_bookStoreEObject.eSet(_bookStoreLocation, "Street#12, Top Town, NY");
((List) _bookStoreEObject.eGet(_bookStore_Books)).add(_bookEObject);
// Set the values of Book instance attributes
_bookEObject.eSet(_bookName, "Harry Potter and the Deathly Hallows");
_bookEObject.eSet(_bookISBN, 157221);
}
public void getDynamicInstanceAttr() {
// Get the values of BookStore instance attributes
String strOwner = (String) _bookStoreEObject.eGet(_bookStoreOwner);
String strLocation = (String) _bookStoreEObject.eGet(_bookStoreLocation);
// Get the values of Book instance attributes
String strName = (String) _bookEObject.eGet(_bookName);
Object iISBN = _bookEObject.eGet(_bookISBN);
}
public void loadModelInstance() {
EList lstBookEObjects = null;
EObject read_bookEObject = null;
ResourceSet load_resourceSet = new ResourceSetImpl();
// Register XML Factory implementation to handle .xml files
load_resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap()
.put("xml", new XMLResourceFactoryImpl());
// Add booksEPackage to package registry
load_resourceSet.getPackageRegistry()
.put("http:///com.ibm.dynamic.example.bookStore.ecore", _bookStoreEPackage);
// Load the resource using the URI
Resource load_resource = load_resourceSet.getResource(URI.createURI("./target/bookStore.xml"), true);
// Read back the serialized instances of dynamic classes stored in the
// resource
EObject read_bookStoreEObject = (EObject) load_resource.getContents().get(0);
System.out.println("*******The BookStore Model********");
System.out.println("Owner: " + read_bookStoreEObject.eGet(_bookStoreOwner) + "\nLocation: "
+ read_bookStoreEObject.eGet(_bookStoreLocation) + "\nBook:");
lstBookEObjects = (EList) (read_bookStoreEObject.eGet(_bookStore_Books));
for (int iBookObj = 0; iBookObj < lstBookEObjects.size(); iBookObj++) {
read_bookEObject = (EObject) lstBookEObjects.get(iBookObj);
System.out.println(" name: " + read_bookEObject.eGet(_bookName) + "\n isbn: "
+ read_bookEObject.eGet(_bookISBN));
}
System.out.println("*********************************");
}
public static void main(String[] args) {
DynamicModelingEngine theModelingEngine = new DynamicModelingEngine();
DynamicModelSerializer theModelSerializer = new DynamicModelSerializer();
boolean isSchemaLocationPresent;
theModelingEngine.buildBookStoreModel();
/*
* If serialize and deserialize operations to be performed within this program, then invoke
* the following methods
*/
isSchemaLocationPresent = false;
theModelSerializer.serializeModelInstance(theModelingEngine._bookStoreEObject, isSchemaLocationPresent);
theModelingEngine.loadModelInstance();
/*
* If serialize and deserialize operations to be performed in different program, then invoke
* the following methods
*/
isSchemaLocationPresent = true;
theModelSerializer.serializeMetaModel(theModelingEngine._bookStoreEPackage);
theModelSerializer.serializeModelInstance(theModelingEngine._bookStoreEObject, isSchemaLocationPresent);
DynamicModelLoader theModelLoader = new DynamicModelLoader();
theModelLoader.loadModelInstance();
}
}