Using Teneo, EMF and Hibernate to update and query your data
Last week I showed you how to use Teneo, EMF and Hibernate to store your data in a database.
This week, we're going to have a look at how to update the data, add more records and how to query the database for information using HQL, the Hibernate Query Language.
If you haven't done so, you might consider taking last week's tutorial in order to get your environment set up and understand the basic concepts. If you're lazy, you can as well download the code of the tutorial to get started more quickly. It is available here.
As it turns out, in order to change anything in the library database, we must first fetch the to-be-changed data, so we need to have a look at querying first.
Retrieving and updating data
Let's assume we'd want to the update the number of pages in a book, because the new edition has an additional chapter.
- So, first of all we need to open a session and begin a transaction:
{ Session session = sessionFactory.openSession(); session.beginTransaction(); - Next, let's create an HQL query. We want to find any books that are written by an author by the name "A. K. Dewdney" that contain "Omnibus" in their title.
Query query = session.createQuery( "SELECT book from " + " Book book, " + " Writer writer " + "WHERE " + " book.title like '%Turing Omnibus%' " + "AND " + " writer.name = 'A. K. Dewdney'"); - We can now execute the query and display the results:
Listbooks = query.list(); Book book = books.get(0); System.out.println(book.getTitle()); - Updating the page count is pretty obvious:
book.setPages(520); - Finally, don't forget to commit the transaction and close the session:
session.getTransaction().commit(); session.close(); }
Adding data
Let's now assume we want to add more books (and authors) to the library.
- By now, you should be pretty familiar with the pattern of opening a new session:
{ Session session = sessionFactory.openSession(); session.beginTransaction(); - As we want to add new items to the library, we need to retrieve the library instance first of all:
Query query = session.createQuery("from Library"); Listlibraries = query.list(); Library library = libraries.get(0); - Creating a new book and its author is easy, as we just have to use the API EMF so kindly generated for us:
Writer writer = LibraryFactory.eINSTANCE.createWriter(); writer.setName("J.R.R. Tolkien"); Book book = LibraryFactory.eINSTANCE.createBook(); book.setTitle("The Hobbit"); book.setPages(320); book.setAuthor(writer); book.setCategory(BookCategory.MYSTERY); library.getBooks().add(book); library.getWriters().add(writer); - Finally, commit the transaction and close the session:
session.getTransaction().commit(); session.close(); }
Using Teneo and EMF to store your data
Most of you know that I am working as a committer for various Eclipse-related projects (such as Xtext, Xpand and the Modeling Workflow Engine). You might not know, however, that I also work as a consultant for itemis. On one of my recent consulting assignments in Ottawa, Canada, I was asked "How can we use EMF to store our data in a database?"
Well, it turns out EMF can help a long way to store data in a database. Here is how.
Prepare your development environment
- Get Eclipse 3.5 M5 (click here to download)
- Unpack and start Eclipse
- Bring up the "Install New Software" dialog (Help -> Install New Software)
- Select Teneo EMF Hibernate Runtime and Teneo EMF Hibernate SDK, version 1.0.3
- Cick Finish
- You most probably will be asked to restart Eclipse.
Create a target definition that includes Hibernate and HSQLDB
In order to keep things simple, we will store the data in an HSQLDB database. We will use the Hibernate OR Mapper to perform the mapping between your data objects and the database. As you might guess, quite a number of libraries will be involved to get the task accomplished. Instead of creating a bunch of plug-in projects containing the respective libraries, or - even worse - copying all libraries into our project, we'll set up a target definition. Target definitions help to maintain a common set of dependencies for all developers on a team, which is a Good Thing.
- Create a new project library.target (File -> New -> Project... -> General -> Project)
- Create three folders in this project: hibernate, dependencies, hsqldb
- Go to the SpringSource Bundle Repository and download the following OSGi bundles:
file save in folder com.springsource.org.hibernate-3.2.6.ga.jar library.target/hibernate com.springsource.org.apache.commons.logging-1.1.1.jar library.target/dependencies com.springsource.org.dom4j-1.6.1.jar library.target/dependencies com.springsource.org.apache.commons.collections-3.2.0.jar library.target/dependencies com.springsource.javax.transaction-1.1.0.jar library.target/dependencies com.springsource.antlr-2.7.7.jar library.target/dependencies com.springsource.org.hsqldb-1.8.0.9.jar library.target/hsqldb - Create a new target definition library.target in this project (File -> New -> Other... -> Plug-in Development -> Target Definition)
- Open the target definition and add the three directories to it's contents. As the GUI does not allow you to work with relative paths, you might consider to use a text editor to paste the following text:
<?xml version="1.0" encoding="UTF-8"?> <?pde version="3.5"?> <target description="Teneo-related stuff, mostly Hibernate" name="Library Target Definition"> <locations> <location path="${eclipse_home}" type="Profile"/> <location path="${workspace_loc}/library.target/hibernate" type="Directory"/> <location path="${workspace_loc}/library.target/dependencies" type="Directory"/> <location path="${workspace_loc}/library.target/hsqldb" type="Directory"/> </locations> </target> - Open the target definition in the Target Definition Editor and click on the Set as Target Platform hyperlink in the upper right area. This will activate the target definition. All contained bundles are now available and can be referenced as dependencies.
Create a model for your data
The data model will be based on the well-known library tutorial that ships with EMF. If you are interested in a more in-depth look, I recommend taking this tutorial. However, to shortcut things, here is the ultra-slim version of the EMF-Tutorial:
- Download the Rose class model and save it on your computer
- Create a new EMF project (File -> New -> Other... -> Eclipse Modeling Framework -> EMF Project)
- Project name: library
- Model importer: Rose class model
- Browse to the Rose class model library.mdl mentioned before
- Click on Load to load the model
- Click Next, then Finish
- In the library.genmodel editor, right-click on the Library node and select Generate Model Code
Create the library main application
In order to demonstrate how to use the data model and how to perform CRUD operations with your data, we will create a simple Java class. In the good spirit of encapsulation and components, we will create a new plug-in project to host this class:
- Create a new Plug-in project library.main (File -> New -> Project... -> Plug-in Project)
- Open the manifest and add the following dependencies:
- library (this is the bundle which contains our data model)
- org.eclipse.emf.teneo.hibernate
- org.eclipse.emf.ecore.xmi
- com.springsource.org.hibernate
- com.springsource.org.apache.commons.logging
- com.springsource.org.dom4j
- com.springsource.org.apache.commons.collections
- com.springsource.javax.transaction
- com.springsource.antlr
- com.springsource.org.hsqldb
- Create a new Hibernate configuration file hibernate.properties in library.main/src and paste the following lines:
hibernate.connection.driver_class=org.hsqldb.jdbcDriver # use the following line to run the embedded db: # hibernate.connection.url=jdbc:hsqldb:file:/some/path/on/your/computer/dbname # the following line will connect to a standalone (local) DB server: hibernate.connection.url=jdbc:hsqldb:hsql://127.0.0.1/library hibernate.connection.username=sa hibernate.connection.password= hibernate.dialect=org.hibernate.dialect.HSQLDialect hibernate.hbm2ddl.auto=true
Implement the library main application
With all the boilerplate in place, we're finally ready to write some code. We will create a new class and add some code to create an author and his book and store both in a library.
- Create a new class LibraryDemo, making sure it has a main method
- In order to use Teneo to persist our data, we first need to create a datastore and register our model package with it:
// create the data store String dataStoreName = "LibraryDataStore"; HbDataStore dataStore = HbHelper.INSTANCE.createRegisterDataStore(dataStoreName); // register the model package with the data store dataStore.setEPackages(new EPackage[] { LibraryPackage.eINSTANCE }); // initialize the data store, which creates the tables dataStore.initialize(); - Next, we need to get hold of a session factory and request a new session form it:
SessionFactory sessionFactory = dataStore.getSessionFactory(); { Session session = sessionFactory.openSession(); session.beginTransaction(); - Now, let's create a new library and save it to the session:
// create a library Library library = LibraryFactory.eINSTANCE.createLibrary(); library.setName("Developer's bookshelf"); // store the library session.save(library); - In the following part, we will create an author and his book, link them to each other and add them to the library. There is no specific Teneo aspect to this part of the code, it is just straightforward usage of the API EMF generated for your datamodel:
// create an author Writer writer = LibraryFactory.eINSTANCE.createWriter(); writer.setName("A. K. Dewdney"); // create a book Book book = LibraryFactory.eINSTANCE.createBook(); book.setTitle("The New Turing Omnibus"); book.setPages(480); book.setCategory(BookCategory.MYSTERY); // oh well, let's hope it's not mystery to most readers! book.setAuthor(writer); // add book and writer to library library.getBooks().add(book); library.getWriters().add(writer); - Finally, we need to commit our changes to the database and close the session:
// commit changes to the database and close the session session.getTransaction().commit(); session.close(); }
Start the DB server and run the application
- Open a command line and navigate to the directory that contains hsqldb.jar
- Start the HSQLDB server using this command line:
java -cp com.springsource.org.hsqldb-1.8.0.9.jar org.hsqldb.Server -database.0 file:library -dbname.0 library
- Finally (!) go back to Eclipse and start LibraryDemo. You should get an output similar to this one:
Mar 6, 2009 1:50:26 PM org.eclipse.emf.teneo.hibernate.HbHelper createRegisterDataStore INFO: Creating emf data store and registering it under name: LibraryDataStore ... Mar 6, 2009 1:50:28 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: schema update complete
- To actually see the data stored in the database, navigate to the directory containing the database and open library.log:
CREATE USER SA PASSWORD "" ADMIN /*C1*/SET SCHEMA PUBLIC CONNECT USER SA ... INSERT INTO "library" VALUES(1,'Library',0,'Developer''s bookshelf') INSERT INTO "writer" VALUES(1,'Writer',0,'A. K. Dewdney',NULL,NULL,'Library','1',-2) INSERT INTO "book" VALUES(1,'Book',0,'The New Turing Omnibus',480,'Mystery',1,NULL,NULL,'Library','1',-3) DELETE FROM "writer" WHERE E_ID=1 INSERT INTO "writer" VALUES(1,'Writer',0,'A. K. Dewdney',1,0,'Library','1',-2) DELETE FROM "book" WHERE E_ID=1 INSERT INTO "book" VALUES(1,'Book',0,'The New Turing Omnibus',480,'Mystery',1,1,0,'Library','1',-3) INSERT INTO "writer_books" VALUES(1,1,0) COMMIT DISCONNECT
In the next installment, I will show you how to retrieve objects from the database and query the database using Hibernate Query Language (HQL).
Download the source
If you are interested in the source for the solution so far, you can download it here: (click to download).
CVS on a Mac
In order to be able to work on some of our Xtext / Eclipse related build scripts, I needed to install a CVS command line client on my Mac. Now if you google for "cvs mac", you'll get a large list of result, basically telling you to get the Apple Xcode SDK. While the Xcode SDK is for free, and usually you don't even need to download it from the Apple Developer Connection's website (as you already have it on your Mac install disks as Lullabot points out), it occurred to me that installing a 1+GB space hog seems to be a bit of an overkill for getting a tiny application.
So I decided to give Fink a try. Here is what you need to do to get a CVS commandline client on your Mac:
- Download Fink
- Install Fink
- Copy FinkCommander to your Applications folder
- Start FinkCommander
- In the search box, type "cvs"

- Click on the "install binary package" button (it's the leftmost, with the blue plus sign)
- In the lower pane, you can now watch Fink downloading and installing the CVS package.

- Let's see if it works. Open a command line window and type "cvs":

Perfect!
Using Safari to view the Eclipse Help System (when Safari is not your system default browser)
I belong to the minority of people who love the Opera Browser. You've got to try it, it has got all sorts of nice features - e.g. you can easily create keyword-driven search shortcuts or browse the web using mouse gestures. But I digress...
Of course, I configured Opera to be the default browser on my Mac. Which is nice for surfing the web. However, I do not want the Eclipse Help system to appear in Opera - mostly because I tend to have way too many tabs open anyway. So, I'd like to open Eclipse Help in Safari. Here's what you need to do to achieve this:
- In Eclipse, open the preference dialog
- Select General -> Web Browser
- Click New... to add a new external web browser
- In the dialog box Edit External Web Browser, fill in the following details:

- Click Ok, then Finish
Obviously, this only works on Mac OS.
Software Engineering Radio: Eelco Visser on Parsing
In the current SE-Radio episode, Laurence Tratt interviews Eelco Visser on Parsing.
If you're interested in Domain Specific Languages (DSLs), you should take some time to listen to this episode. Especially the part on scanner-less parsing is very interesting, as it allows to mingle code from different languages in one single file.
Using Xpand in your Eclipse Wizards
At ESE, I had a nice chat with Chris (actually, I had a lot of nice chats with a lot of nice people - it was quite a challenge to attend any of the sessions), who told me that he was looking into template engines. I leave it up to you to make any assumptions on why he's interested in template engines. I happen to know at least three template engines: Velocity (which I had the joy of using in my active days at AndroMDA.org), the template, erhm, ... mechanism being used in PDE (I once fixed a bug which had been caused by this engine) and - you might have guessed it - Xpand (which I am a committer on).
So, I gave a short demo of Xtext and Xpand to show Chris how easy it is to create (model-aware) code generation templates. Xpand comes with a nice editor which makes template editing a joy - it features code highlighting, hyperlink navigation, model-awareness and other editor goodness.
Instead of letting only Chris know how that works, here's a short guide on how to write your own Xpand template and use it in a wizard. To make the example more realistic, I chose to implement a wizard that creates an Ant build.xml file for a simple project (something which is missing in Eclipse, AFAIK). So, here we go.
Prerequisites:
- Eclipse 3.5M3 (3.4 might also do)
- EMF 2.5.0M3
- EMF Compare 0.8.1
- MWE 0.7.0M3
- Xpand 0.7.0M3
How to do it
- Download and install the prerequisites.
- Create a new plug-in project named "de.peterfriese.antwizard"
- Add a New File Wizard to the project. I used the Custom plug-in Wizard to get me started.
- Brush up the wizard page and add some fields for project name, source folder and binary folder.
- We want to transfer the values entered in this wizard into our template, so we need to create an Ecore model that describes our data model.

- Add org.eclipse.emf and org.eclipse.emf.edit to the dependencies of you plug-in.
- Create a genmodel and let EMF generate the model code for you.
- Add code to your wizard that transfers the values from the input fields to your model. One might consider using databinding for doing this, I used a straight forward read'n'write approach for the time being:
public boolean performFinish() { final String containerName = page.getContainerName(); final String srcDirName = page.getSrcDirName(); final String binDirName = page.getBinDirName(); // ... } private BuildSpecification createModel(IProject project, String srcDirName, String binDirName) { BuildSpecification buildSpecification = BuildspecificationFactory.eINSTANCE.createBuildSpecification(); Project projectSpecification = BuildspecificationFactory.eINSTANCE.createProject(); projectSpecification.setName(project.getName()); projectSpecification.setBinaryFolder(binDirName); projectSpecification.setSourceFolder(srcDirName); buildSpecification.setProject(projectSpecification); return buildSpecification; } - Create an Xpand template de.peterfriese.antwizard/src/template/BuildTemplate.xpt:

In case you wonder how to get those funky characters: make sure us create this file using the Xpand editor - it has code assist (CTRL + space) for those characters. - Create an Xtend file de.peterfriese.antwizard/src/template/GeneratorExtensions.ext:

- Add org.eclipse.xpand, org.eclipse.xtend and org.eclipse.xtend.typesystem.emf to the depencies of your plug-in.
- Finally, we need to provide some code to invoke the generator:
private void generate(BuildSpecification buildSpec, IProgressMonitor monitor) throws CoreException { // get project root folder as absolute file system path IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IResource resource = root.findMember(new Path(buildSpec.getProject().getName())); String containerName = resource.getLocation().toPortableString(); // configure outlets OutputImpl output = new OutputImpl(); Outlet outlet = new Outlet(containerName); outlet.setOverwrite(true); output.addOutlet(outlet); // create execution context Map globalVarsMap = new HashMap(); XpandExecutionContextImpl execCtx = new XpandExecutionContextImpl(output, null, globalVarsMap, null, null); EmfRegistryMetaModel metamodel = new EmfRegistryMetaModel() { @Override protected EPackage[] allPackages() { return new EPackage[] { BuildspecificationPackage.eINSTANCE, EcorePackage.eINSTANCE }; } }; execCtx.registerMetaModel(metamodel); // generate XpandFacade facade = XpandFacade.create(execCtx); String templatePath = "template::BuildTemplate::main"; facade.evaluate(templatePath, buildSpec); // refresh the project to get external updates: resource.refreshLocal(IResource.DEPTH_INFINITE, monitor); }
That's it!
Taking it for a spin
- Launch a runtime workbench by selecting de.peterfriese.antwizard/META-INF/MANIFEST.MF and invoking Run As -> Eclipse Application
- Create a new Java project in the runtime workspace.
- Invoke your wizard by selecting File -> New -> Other... -> Ant -> Ant build file from existing project
- Enter the required information (project name, source folder, binariy folder)
- After clicking on finish, you should get a fresh Ant file for your project:

- Enjoy!
You can download the project here. Feedback and comments are welcome!
ESE: Building Refactoring Tools with LTK and Ludwig
Jeffrey Overbey talked about building refactoring tools using the LTK and his research work "Ludwig".
I guess you all agree with me that refactoring support is crucial for any programing language, as you need to restructure your code rom time to time.
Although Eclipse LTK offers a decent API and UI to realize refactoring tools, all the heavy lifting (parsing the text in question, analyzing the AST, creating rewrite rules) is left to you.
Jeff's research tool Ludwig can help to derive refactoring support from a BNF-style grammar very easily. Ludwig essentially derives a lexer/parser from the grammar and provides an interface to the AST which gets constructed by the parser. Which gives you the chance to walk / visit the AST and (partially) rewrite the AST.
I really enjoyed Jeff's presentation style. He used a set of slides and pre-recorded screenvideos to drive his talk. I think this is great idea, as it basically eliminates any problems you might run into if you do a live demo. Plus, it gives the presenter the chance to face the audience while demoing, instead of mumbling into the screen
Maps, Services, Relations and Reuse: Eclipse DemoCamp Hamburg
On November 10th, the Hamburg Eclipse DemoCamp took place in the stylish EAST Hotel.

We had 45 reservations and almost all of them made it to the Camp. I always get a little bit nervous 15 minutes before the event starts if no more than 10 people have shown up so far, but I guess that's alright.
Martin and I welcomed the crowd on behalf of our sponsors (Eclipse Foundation, froglogic, it-agile and itemis):

After that, Harald Wellmann of Harman Becker told us that the world is a disc. Well, at least he and his company try to make it a disc again - Harald leads a team that develops a so called "map compiler". A map compiler takes map source data and condenses that data by extracting only the relevant parts of it. As you may guess this is a long-running process which can hugely benefit from parallelization. Harald and his team use OSGi to modularize their software and make sure they use computing resources efficiently. One thing worth noting is that OSGi is even being used in car entertainment systems: Harald told us about one entertainment system which makes use of OSGi to act as an intermediate / glue layer between the UI (written in Java) and the core (written in C++).

Gerd Wütherich (Independent) continued where Harald stopped and showed us how to use Spring Dynamic Modules and OSGi in his excellent talk - interspersed with some neat demos:

Together with Nils Hartmann, Mathias Lübken and Bernd Kolb, he wrote the first German book on OSGi, so he really knows what he is talking about.
After those talks, we took a break to grab some refreshments and take the chance to get in touch with the other attending Eclipse enthusiasts. I had the impression that everybody had a good time discussing all things Eclipse - in fact Martin and I had to interrupt a lot of lively discussions for the second run of talks.
In the first talk after the break, Miguel Garcia and Rakesh Prithiviraj (both Technical University of Hamburg-Harburg) gave us an update of their research on how to integrate LINQ (Language Integrated Queries) in Java:


The final demo was deliverd by Stephan Herrmann who showed us Object Teams / Equinox, an amazing piece of software that can be used to re-use existing Eclipse plug-ins in an aspect-oriented way. To get an idea of how powerful this approach is, have a look at the following screenshot - this is the JDT, but enhanced by Object Teams in order to support their very own syntax extensions for Java:

To learn more about Object Teams, browse to their web site at http://trac.objectteams.org/ot/wiki/OtEquinox.

Everyone in the room was quite impressed with what is possible with Object Teams / Equinox, so you should check it out (it's available for free). If you can manage to go the DemoCamp in Berlin, you'll have the chance to see it live.
The feedback we received from the attendees was great - some people even sent emails thanking us for organizing the event, so I guess the DemoCamp can be considered a success!
Eclipse DemoCamps
It's that time of year again - demo time!
Being run for the third time, demo camps can be considered an integral part of the Eclipse calender of events. Attending a DemoCamp is great. If you haven't yet been to any Eclipse DemoCamp, let me briefly summarize why I think you should consider going to one:
- see cool technology in action (well, that's the whole point of a DemoCamp, isn't it)
- get to know Eclipse-minded people from your area
- have some frosty beverages and fingerfood (well, that actually depends on how the camp is organized)
- see some exciting buildings from inside (again, depends on how the camp is organized)
Oh, did I mention that Eclipse DemoCamps are free? Thanks to the Eclipse Foundation and many sponsoring member companies, you get to enjoy all those nice things for absolutely free.
Here are some of my favorite demos:
- Jingwen Owen Ou on WikiText for Mylyn
- Jochen Krause on Eclipse 4.0
- Harald Wellmann on Geodata Processing for Car Navigation Systems
- Florian Fieber and Max Bureck on From Model to Code - A Comparison of M2M and M2T Technologies in Eclipse Modeling
- Dave Savage on Newton - a distributed OSGi application runtime
- Jens von Pilgrim on GEF goes 3D: GEF3D
- Eike Steppe on CDO Model Repository
- Boris Bokowski and Eric Moffatt on the e4 Programming Model and e4 Modeled UI, respectively
- Martin Taal on EMF/Teneo
By the way, if we were to award the price of the most indefatigable DemoCamp presenter, it'd go to Wassim Melhem. You can meet him at no less than three locations: Iasi (Romania), Warszawa (Poland), Poznan (Poland).
Hope I could convince you to attend one of the many DemoCamps. I'll be at the DemoCamps in Hamburg and Leipzig, so see you there!
MDSD Today 2008 Recap
From October 15 to October 17, MDSD Today 2008 took place at the Nordakademie in Elmshorn near Hamburg, Germany. The conference, which had been organized by Frank Zimmermann (Nordakademie), Simon Zambrovski and yours truly, was intended to bring together practioners, researchers and people from both industry and business.
We were fortunate enough to aquire a number of well-known speakers, most notably Axel Uhl (SAP) and Ed Merks (of EMF fame).
On the first day, Axel and Ed delivered their excellent keynotes on the current state of affairs in modeling.
Ed commented on a number of misconceptions he has been confronted with during the last few years such as "modeling is too complicated", "modeling will just get into my way" or "modeling will limit my creativity". The bottom line of his talk was that although you might not realize it, models drive most software (just think of all the data models you're dealing with in business applications). However, using source code as a representation for your models might not always be the best solution - to gain both a better overview of your software and be more efficient with respect to software development, you should think about raising the level of abstraction, e.g. by using domain specific modeling tools that let you focus on the structure of your model instead of having to deal with (basically irrelevant) syntactical details of the target language. If working at a higher level of abstraction makes things more complicated for you, you're doing something wrong.
Axel picked up this idea in his keynote on "Current Challenges for Industrial Software Development Tools and Languages" stating that any computer program can be conceived as a model. Since models are independent of their visual representation, they can be represented in various different forms, the most common being text, trees and diagrams of any kind. The question, however, whether to choose text or the abstract model as the primary artifact for storing. A textual representation clearly has advantages with respect to diffing and merging and can be handled with commonly used tools such as CVS nd plain text editors. Using the abstract model as the primary artifact allows for overlapping partial views. Since this model can persisted in some kind of repository, access to the model very much feels like working with a database. In particular, there's no need to parse any text back and forth between the model and an editor. The decision whether to store models as text or in a repository largely depends on boundary decisions, like the availability of the repository technology, the robustness of the mapping between the textual representation and the model, language characteristics, the number of developers who need to work on the model in parallel, the size of the software system built with the model and the life cycle of the software. Axel concluded that on one hand, modeling is not that much different from coding and that, on the other hand, DSLs are becoming increasingly important due to the complexity of UML.
One of the nice thing about conferences is you get to talk to people who are interested in the same topics as you are. MDSD Today has been no different - during the breaks you could see people involved in all kinds of discussions.
Later that day, Stefan Reichert and Birger Garbe of Lufthansa Systems shared their experiences regarding model driven software projects with us. The topic of their talk was "Model Driven Software Development in Business Projects: Chance or Risk?" Their anwser to this question was that if've got the right tools, MDSD is a chance and can help you to build better software.
Thomas Stahl of b+m concluded the day with his talk on how MDSD, BMP and SOA fit together:
The second and third day of the conference were crammed with hands-on tutorials on MDSD tools like EMF, Xtext, Xpand and GMF. Quite a lot of people attended the tutorials as you can see from the pictures.
Arno had to overcome the hardship of a broken beamer, so he had to use arms and legs to explain:
Overall, the conference was a real success and I am looking forward to seeing you all again at MDSD Today 2009!













