<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3658502096185788177</id><updated>2012-02-13T00:34:38.021-08:00</updated><title type='text'>Eclipse mde</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>26</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-4442862461630548242</id><published>2012-01-20T06:04:00.000-08:00</published><updated>2012-01-20T06:04:34.324-08:00</updated><title type='text'>Traceability test case : UML to Java generation</title><content type='html'>The next version of Acceleo will introduce a number of improvements of its existing features, one of its most important, the automatic builder, being entirely re-written in order to get rid of legacy code and improve the user experience. This also comes with a much better experience for users that need to build their Acceleo generators in standalone, through maven or tycho. More news on this are available on the &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=363651"&gt;bugzilla&lt;/a&gt; and &lt;a href="http://sbegaudeau.tumblr.com/post/16059815253/maven-integration-in-acceleo"&gt;Stephane's latest post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One of the least visible features, yet one I find among the most interesting aspects of the Acceleo code generator, is the traceability between the generated code, the model used as input of the generation, and the generator itself. Basically, you always know where that esoteric line of code came from : which part of the generation template generated it, and which model element triggered its generation.&lt;br /&gt;&lt;br /&gt;This feature has known a series of improvements as we used it intensively with the &lt;a href="http://marketplace.eclipse.org/content/uml-java-generator"&gt;UML to java generator&lt;/a&gt;. We are now confident that we can record and display accurate information even for some of the most complex use cases. This generator isn't the most complex generator we could write with Acceleo, but it is quite complete nonetheless. Here are some examples of what the Traceability can provide to architects developping their code generators :&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Determine which model element triggered the generation of a line of code&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;On the left-hand side, a file that has been generated. On the right-hand side, an editor opened as result of using the action "open input" : the model is opened and the exact element that was used to generate the part of code is selected.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-IYrF4PRCLAc/TxlAVE8vrvI/AAAAAAAAALQ/Yh642A2hZK8/s1600/OpenInput.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="http://2.bp.blogspot.com/-IYrF4PRCLAc/TxlAVE8vrvI/AAAAAAAAALQ/Yh642A2hZK8/s320/OpenInput.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Find the part of a generator that created a given part of the code&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;On the left-hand side, the same generated file as above. On the right-hand side, the result of using the "open generator" action : the Acceleo generator which generated that selected part of the code is opened, with the exact source expression selected.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-TNlVKzHTpi4/TxlHJ8BkfnI/AAAAAAAAALY/w_uUdkp3US4/s1600/OpenGenerator.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="http://4.bp.blogspot.com/-TNlVKzHTpi4/TxlHJ8BkfnI/AAAAAAAAALY/w_uUdkp3US4/s320/OpenGenerator.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Real-time Synchronization&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="480" src="https://www.youtube.com/embed/SZEPgrFPj-0?rel=0" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;These are but a few of the features that can be derived from the synchronization between code, model, and generators. Some more examples include : previewing the result of a re-generation, incremental generation, round-trip (updating the input model according to manual changes in the output generated code)...&lt;br /&gt;&lt;br /&gt;Most of these features are better seen in video to get an idea. If you want to see some of them in action, some more flash videos of what traceability can do for you are available on the &lt;a href="http://www.obeonetwork.com/page/obeo-traceability"&gt;Obeo network&lt;/a&gt; (though a free registration is required).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-4442862461630548242?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/4442862461630548242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2012/01/traceability-test-case-uml-to-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/4442862461630548242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/4442862461630548242'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2012/01/traceability-test-case-uml-to-java.html' title='Traceability test case : UML to Java generation'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-IYrF4PRCLAc/TxlAVE8vrvI/AAAAAAAAALQ/Yh642A2hZK8/s72-c/OpenInput.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-8462527939471808162</id><published>2011-10-27T09:40:00.000-07:00</published><updated>2011-10-27T09:40:28.196-07:00</updated><title type='text'>EMF Compare scalability</title><content type='html'>During the sponsored work on EMF Compare, we have taken some time to measure the performance of EMF Compare and think about possible improvement axis. We meant to profile both the time needed to compare two models and the overall memory footprint of a comparison, this has been achieved through the use of the &lt;a href="http://www.yourkit.com/download/index.jsp"&gt;Yourkit Java profiler&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The first measures we took highlighted such a huge kludge that we took the time to better the comparison algorithms before taking any further action. Through the use of google's &lt;a href="http://code.google.com/p/guava-libraries/"&gt;Guava&lt;/a&gt; and some rethinking, we improved the comparison time on big model comparison a great deal, dividing the total comparison time in half!&lt;br /&gt;&lt;br /&gt;Here is a sample of the time it takes now to compare your models with the latest builds of EMF Compare :&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Structure of the sample models&lt;/b&gt; used in these tests ("fragments" are the number of fragmented files, the rest are UML model elements contained by the samples) :&lt;br /&gt;&lt;table border="0" cellspacing="0" cols="5" frame="VOID" rules="NONE"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="LEFT" height="17" width="86"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td align="LEFT" width="104"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" width="86"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" width="86"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" width="86"&gt;&lt;br /&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000;"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;b&gt;Small&lt;/b&gt;&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;b&gt;Nominal&lt;/b&gt;&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;b&gt;Large&lt;/b&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;Fragments&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;99&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;399&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;947&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;Packages&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;97&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;389&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;880&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;Classes&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;140&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;578&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;2169&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;Primitive Types&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;581&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;5370&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;17152&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;Data Types&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;599&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;5781&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;18637&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;State Machines&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;55&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;209&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;1311&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;States&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;202&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;765&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;10156&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;Dependencies&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;235&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;2522&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;8681&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;Transitions&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;798&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;3106&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;49805&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;Operations&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;1183&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;5903&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;46029&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Time and memory&lt;/b&gt; used required to compare each of the model sizes (the model is copied, randomly modified, then the copy is compared with its original) :&lt;br /&gt;&lt;table border="0" cellspacing="0" cols="5" frame="VOID" rules="NONE"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="LEFT" height="17" width="86"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td align="LEFT" width="150"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" width="86"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" width="86"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" width="86"&gt;&lt;br /&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000;"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;b&gt;Small&lt;/b&gt;&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;b&gt;Nominal&lt;/b&gt;&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;&lt;b&gt;Large&lt;/b&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;Time (seconds)&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;6&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;22&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;125&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="17"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;maximum Heap (Mo)&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;555&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;1019&lt;/td&gt;   &lt;td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"&gt;2100&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;We initially thought that the time was mostly spent matching the elements together. It turns out that the real bottleneck of a comparison is the differencing phase (we know the two elements "match", now we need to know if, and how they differ). Just goes to show you that a profiler is mandatory in order to really &lt;i&gt;know&lt;/i&gt; why your product might be slow ;).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Future development&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;These profiling sessions made clear the problems of EMF Compare on large models. We can properly handle "medium" models : EMF Compare is fast and its GUI can react at reasonable speed. However we cannot scale this behavior to large models : memory management is somewhat inefficient (more than 2Go of heap space to compare two models that both "weigh" 50Mo on disk...), the GUI is sluggish... We did isolate a number of potential improvements though. Stay tuned!&lt;br /&gt;&lt;br /&gt;Note : the report is online and can be retrieved from &lt;a href="http://www.eclipse.org/emf/compare/doc/compare_scalability.pdf"&gt;here&lt;/a&gt; for those interested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-8462527939471808162?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/8462527939471808162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2011/10/emf-compare-scalability.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/8462527939471808162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/8462527939471808162'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2011/10/emf-compare-scalability.html' title='EMF Compare scalability'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-4352778179231604975</id><published>2011-09-28T06:10:00.000-07:00</published><updated>2011-09-28T06:14:54.020-07:00</updated><title type='text'>The dynamic interpreter, your code generation companion</title><content type='html'>The latest stable release of Acceleo, version 3.1.1 included in Indigo SR1, is fresh from the oven; but development on the next version is already well underway. The upcoming version 3.2 already includes major improvements of the tooling performance (compilation time, completion proposal computation, memory management...), making the everyday use of the Acceleo editor much more appealing; and some of the planned features for this version are already in their finalization stage.&lt;br /&gt;&lt;br /&gt;The one feature I'll linger on here is the dynamic interpreter for Acceleo and OCL expressions that we implemented for this version. Typically, you develop your code generators within the Acceleo editor, making use of the advanced edition features such as completion proposals, live compilation and syntax error reporting, syntax highlighting ...&lt;br /&gt;&lt;br /&gt;However the editor itself cannot help you determine what a given expression will return as its result. When you are in the middle of a complex OCL expression, it is sometimes difficult to say "this expression will output that classifier". And here is where the live interpreter comes into play!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-1lqdamv83cI/Tnx7OtnjR-I/AAAAAAAAAKQ/obWTvalbyIs/s1600/Class_supertypes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://1.bp.blogspot.com/-1lqdamv83cI/Tnx7OtnjR-I/AAAAAAAAAKQ/obWTvalbyIs/s320/Class_supertypes.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;The image above displays the "interpreter" view and the use we can make of it : We opened the UML metamodel and selected "Class" in it. This makes "Class" the context of any evaluation entered in the interpreter (that would work with anything that can be adapted to an EMF object : selection in a model editor, selection in a graphical editor (GMF, Obeo Designer... even the "variable" view when debugging Acceleo generations!). We entered an expression... and the view made the rest, evaluating that expression on-the fly and displaying its result (here, all of the super-types of the UML "Class").&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using the Interpreter during debug&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;The Interpreter can be used as is, defining your own variables as you need them and entering the expression manually... but it can also be used in conjunction with the debugger. For example, let's say I want to know what happens within the 'UML 2 Java' example that is provided with Acceleo.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I open the "classBody" module of that example, and set a breakpoint somewhere within the "generateClassBody" template :&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-O2uc3pdNhWM/ToMWg-spxEI/AAAAAAAAAKU/D_j0zcrdC4I/s1600/module_breakpoint.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="204" src="http://1.bp.blogspot.com/-O2uc3pdNhWM/ToMWg-spxEI/AAAAAAAAAKU/D_j0zcrdC4I/s320/module_breakpoint.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Then, run the example in debug mode until the breakpoint is hit :&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-WlaQbAEDpgw/ToMaRvW1D_I/AAAAAAAAAKo/fcUHABTvsQA/s1600/module_breakpoint_hit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="147" src="http://4.bp.blogspot.com/-WlaQbAEDpgw/ToMaRvW1D_I/AAAAAAAAAKo/fcUHABTvsQA/s320/module_breakpoint_hit.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;And from there, I can either copy/paste whole expressions in the interpreter :&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-UTMX0DEtngM/ToMaPuSXEgI/AAAAAAAAAKY/uwF6GacQKYA/s1600/interpreter_debug_copypaste.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="89" src="http://1.bp.blogspot.com/-UTMX0DEtngM/ToMaPuSXEgI/AAAAAAAAAKY/uwF6GacQKYA/s320/interpreter_debug_copypaste.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Or "link" the interpreter with the current module context...&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-cnz3S7aVYuc/ToMaQr8DjZI/AAAAAAAAAKg/BDpf_iRhInA/s1600/interpreter_debug_link_action.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="34" src="http://1.bp.blogspot.com/-cnz3S7aVYuc/ToMaQr8DjZI/AAAAAAAAAKg/BDpf_iRhInA/s320/interpreter_debug_link_action.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;And directly call its templates : &lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2CWb0SqhL2w/ToMaQFjkhMI/AAAAAAAAAKc/_RwlgkhqflE/s1600/interpreter_debug_link.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="89" src="http://2.bp.blogspot.com/-2CWb0SqhL2w/ToMaQFjkhMI/AAAAAAAAAKc/_RwlgkhqflE/s320/interpreter_debug_link.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Of course, the result of this last action is lengthier than a single line, double clicking the result will open a popup in which it will be more readable :&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-VH6EKJo8nd0/ToMaRMcj4XI/AAAAAAAAAKk/aY_fg7_1JKE/s1600/interpreter_debug_link_result.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="303" src="http://3.bp.blogspot.com/-VH6EKJo8nd0/ToMaRMcj4XI/AAAAAAAAAKk/aY_fg7_1JKE/s320/interpreter_debug_link_result.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The view features a number of possibilities, creating and assigning variables to be used in the expression, real-time evaluation, linking with an Acceleo editor's context, saving the expression as a new query or template in a given Acceleo module... The view itself can be used without Acceleo, and accepts any other languages through extension points. I can't detail all of its features and extension possibilities here, see the &lt;a href="http://wiki.eclipse.org/Acceleo/Interpreter"&gt;wiki page&lt;/a&gt; for more (still a work in progress, yet it does describe the view in little more details than here) :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-4352778179231604975?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/4352778179231604975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2011/09/dynamic-interperter-your-code.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/4352778179231604975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/4352778179231604975'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2011/09/dynamic-interperter-your-code.html' title='The dynamic interpreter, your code generation companion'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-1lqdamv83cI/Tnx7OtnjR-I/AAAAAAAAAKQ/obWTvalbyIs/s72-c/Class_supertypes.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-8013232131307646739</id><published>2011-08-09T04:55:00.000-07:00</published><updated>2011-08-09T05:30:25.452-07:00</updated><title type='text'>EMF Compare - giant steps towards a working merger</title><content type='html'>EMF Compare, or how to provide meaningful comparison algorithms and visualization for models. Comparing the models' XMI serializations as text is a chore that we should never have to go back to, and EMF Compare has always strived at doing the best possible job towards that end.&lt;br /&gt;&lt;br /&gt;Who would rather compare their models textually :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-uz9PK9xEHFU/TkEkyntwJLI/AAAAAAAAAJY/0ohhrusN6Dk/s1600/text_compare.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 85px;" src="http://2.bp.blogspot.com/-uz9PK9xEHFU/TkEkyntwJLI/AAAAAAAAAJY/0ohhrusN6Dk/s320/text_compare.png" alt="" id="BLOGGER_PHOTO_ID_5638828660517512370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Than compare them logically (yes, these are the same models as above) :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-dtquiEyglYM/TkEky3F5XfI/AAAAAAAAAJg/P2jHB8bU__A/s1600/model_compare.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 105px;" src="http://4.bp.blogspot.com/-dtquiEyglYM/TkEky3F5XfI/AAAAAAAAAJg/P2jHB8bU__A/s320/model_compare.png" alt="" id="BLOGGER_PHOTO_ID_5638828664645311986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;However, EMF Compare still had issues with most algorithm : small errors when matching elements together, differences that weren't detected ... and worst of all : merging all diffs from one side to the other rarely gave the expected result of "two identical models", i.e : if the comparison process in itself was working fairly well, we had a huge number of failures when merging.&lt;br /&gt;&lt;br /&gt;We've decided to tackle this problem the way we should have from the very start : list all potential differences that can be observed between two models ... and &lt;span style="font-weight: bold;"&gt;create the corresponding unit test&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;The results are already showing. True, we are still missing a number of unit tests in order to test all potential use cases we can list ... but we've already fixed an incredible number of bugs be they known (half of our opened bugs, forty-ish out of eighty or so) or bugs we had never detected before. The number of unit tests talks for itself :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-E1lhoOG0-KU/TkEmjdAh1-I/AAAAAAAAAJo/bUeSBGHppHw/s1600/test_result_trend.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 154px;" src="http://2.bp.blogspot.com/-E1lhoOG0-KU/TkEmjdAh1-I/AAAAAAAAAJo/bUeSBGHppHw/s320/test_result_trend.png" alt="" id="BLOGGER_PHOTO_ID_5638830598968694754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;That's 4000 unit tests and as many different combinations of differences added and fixed in the past weeks.&lt;br /&gt;&lt;br /&gt;I won't lie, some of these tests are redundant because of the way we decided to work : we are not trying to cover code, but rather cover use cases; which means some of these tests overlap with others. This does mean, however, that we are fairly sure we'll never have regressions on things that are tested :).&lt;br /&gt;&lt;br /&gt;And now, back to the last few tests we are still missing!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-8013232131307646739?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/8013232131307646739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2011/08/emf-compare-giant-steps-towards-working.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/8013232131307646739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/8013232131307646739'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2011/08/emf-compare-giant-steps-towards-working.html' title='EMF Compare - giant steps towards a working merger'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-uz9PK9xEHFU/TkEkyntwJLI/AAAAAAAAAJY/0ohhrusN6Dk/s72-c/text_compare.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-4013359968674230586</id><published>2011-06-16T02:10:00.000-07:00</published><updated>2011-06-26T00:47:46.412-07:00</updated><title type='text'>What's next in EMF Compare</title><content type='html'>&lt;a href="http://www.eclipse.org/indigo/"&gt;Indigo&lt;/a&gt; is now out and about; another great release shipped on time. I am always amazed that the Eclipse community manages to release each year on schedule. Congratulations to all that help make it happen!&lt;br /&gt;&lt;br /&gt;EMF Compare 1.2.0 was part of the train again this year, I recently blogged about the &lt;a href="http://eclipsemde.blogspot.com/2011/06/whats-new-in-emf-compare.html"&gt;new and noteworthy&lt;/a&gt; of that release. Now that the train has arrived, we can think of what to do next... and it looks like a busy year is coming EMF Compare! Further integration with the Team framework, graphical comparison...&lt;br /&gt;&lt;br /&gt;Here is a quick peek of what EMF Compare could look like for Eclipse Juno next year :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Logical Resources support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Up until now, we've considered that EMF models were tied to physical files, one EMF Resource being one File on the disk. That is true in some cases ... but in many others, a "model" is not really a "file". One file holding an EMF Resource (let's call it "library") can reference multiple other EMF Resources ("books" and "writers"), and it can even be split into multiple physical files itself.&lt;br /&gt;&lt;br /&gt;If we call EMF models "logical resources" and their files on disk "physical resources", we thus distinguish two cases for EMF Compare : 1) one logical resource mapped to one physical resource (no reference, no fragments) and 2) one logical resource mapped to multiple physical resources (an EMF model that references others, and/or is fragmented). Only the first of these two cases is properly handled for now; we've only scratched the surface of the second and handled the most common cases.&lt;br /&gt;&lt;br /&gt;Eclipse provides us with a framework to work on logical resources and resource mappings. We've decided to take advantage of these APIs for the case of collaborative work on EMF models. The idea is to make sure that the user never ends up with a corrupt logical model by preventing him from doing anything on a single part of the physical resources' set (or warning him when he does so).&lt;br /&gt;&lt;br /&gt;For example, if an EMF model "library.genmodel" references another EMF model "library.ecore", and there are changes in both (the name of an EClass changed, and so did the corresponding GenClass in order to react to that name change), it should never be allowed to the user to commit &lt;u&gt;only&lt;/u&gt; one of those two files : they are part of the same logical model, commiting only one of the two physical files may corrupt the logical model (which is the case in this example). The same applies to comparing either one of the physical files with the repository : as they are part of a set, the whole set should be used when comparing.&lt;br /&gt;&lt;br /&gt;This support is already implemented and functional with CVS; the EGit plugin does not yet use the necessary APIs, yet support is on its way and should be gradually implemented on the way to Juno.&lt;br /&gt;&lt;br /&gt;As a result, here is what you would get with the current EMF Compare when trying to commit such linked files to CVS HEAD :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-F4j1Bo3kIuE/TfoEvz3rvaI/AAAAAAAAAHs/xoetuJNw4LA/s1600/before_commit_action.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 63px;" src="http://3.bp.blogspot.com/-F4j1Bo3kIuE/TfoEvz3rvaI/AAAAAAAAAHs/xoetuJNw4LA/s320/before_commit_action.png" alt="" id="BLOGGER_PHOTO_ID_5618808704522239394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-qAewwKwiTm8/TfoEwLbImJI/AAAAAAAAAH0/vcP6xENXtcc/s1600/before_commit_dialog.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 276px; height: 320px;" src="http://1.bp.blogspot.com/-qAewwKwiTm8/TfoEwLbImJI/AAAAAAAAAH0/vcP6xENXtcc/s320/before_commit_dialog.png" alt="" id="BLOGGER_PHOTO_ID_5618808710844946578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;In other words, you are allowed to commit the genmodel file alone... which will prevent anyone retrieving that version from opening it from their side as it references a Class that does not exist without the change to "library.ecore". On the contrary, here is the same flow of action with the logical resources support :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-9UWIGJTosgQ/TfoHRtTtfYI/AAAAAAAAAH8/9QxGk2RJg4k/s1600/after_commit_action.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 63px;" src="http://4.bp.blogspot.com/-9UWIGJTosgQ/TfoHRtTtfYI/AAAAAAAAAH8/9QxGk2RJg4k/s320/after_commit_action.png" alt="" id="BLOGGER_PHOTO_ID_5618811485899554178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-sZ9OC00Ikx0/TfoHSBPXKTI/AAAAAAAAAIM/46sJEg7ARwE/s1600/after_commit_validate.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 290px;" src="http://4.bp.blogspot.com/-sZ9OC00Ikx0/TfoHSBPXKTI/AAAAAAAAAIM/46sJEg7ARwE/s320/after_commit_validate.png" alt="" id="BLOGGER_PHOTO_ID_5618811491250022706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-xfs6gZhnJ4E/TfoHRld-x7I/AAAAAAAAAIE/ByuEr26q30M/s1600/after_commit_dialog.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 276px; height: 320px;" src="http://1.bp.blogspot.com/-xfs6gZhnJ4E/TfoHRld-x7I/AAAAAAAAAIE/ByuEr26q30M/s320/after_commit_dialog.png" alt="" id="BLOGGER_PHOTO_ID_5618811483795146674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here, even though we tried to commit "library.genmodel", Eclipse forces us to commit "library.ecore" along with it in order not to corrupt the logical model underneath.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Diagram comparison&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;EMF Compare supports comparison and merging of any kind of EMF model. It then displays the differences in a the form of two trees side by side as illustrated below :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-8BylTRPY8kc/TfoOY7t0BAI/AAAAAAAAAIU/xWukT_fRtqo/s1600/emf_compare.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 208px;" src="http://4.bp.blogspot.com/-8BylTRPY8kc/TfoOY7t0BAI/AAAAAAAAAIU/xWukT_fRtqo/s320/emf_compare.png" alt="" id="BLOGGER_PHOTO_ID_5618819306607608834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The tree form, however, is not the most adapted representation for all models. When comparing GMF diagrams for example, it would be interesting to display the detected differences directly on the diagram itself :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-fkJ69oGTr_Y/TfoPZi0Zh3I/AAAAAAAAAIc/Xho-nBjijgk/s1600/Diag_comp_diff.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 236px;" src="http://4.bp.blogspot.com/-fkJ69oGTr_Y/TfoPZi0Zh3I/AAAAAAAAAIc/Xho-nBjijgk/s320/Diag_comp_diff.png" alt="" id="BLOGGER_PHOTO_ID_5618820416615843698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Support for this graphical representation of the differences is planned for the end of the year. More information regarding this feature (and specifications of what we intend to implement) can be found on the &lt;a href="http://wiki.eclipse.org/EMF_Compare/GMF_Compare_Markers"&gt;EMF Compare wiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UML Compare&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We have faced since the first version of EMF Compare a number of problems when comparing UML files; problems that just could not be properly handled by the generic approach we take for the comparison.&lt;br /&gt;&lt;br /&gt;Most of these problems come from the fact that a "semantic" change in UML is often reflected by a number of "physical" changes in the model. For example, adding an association between two classes results (with the Papyrus) in two actual changes in the model :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a new element is added (the Association)&lt;/li&gt;&lt;li&gt;a new Property is added to the target class&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;With the Indigo release, we integrated the first version of an UML-specific comparison engine in order to properly detect (and display) the semantic level differences instead of the previous 'physical level' differences.&lt;br /&gt;&lt;br /&gt;This first implementation will be greatly improved so as to handle the most common UML diagrams (class, package, use case, sequence... the full list can be found on &lt;a href="http://wiki.eclipse.org/EMF_Compare/UML_Compare"&gt;the wiki page&lt;/a&gt;), for all potential changes that can be applied in them.&lt;br /&gt;&lt;br /&gt;For example, the Indigo version of the UML comparison engine does not handle specifically message additions, which thus result in seven differences detected :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-dDJ2QwkNblU/TfoV7NhQVNI/AAAAAAAAAIk/qIgNW7GYYDs/s1600/Message-generic.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 242px;" src="http://1.bp.blogspot.com/-dDJ2QwkNblU/TfoV7NhQVNI/AAAAAAAAAIk/qIgNW7GYYDs/s320/Message-generic.png" alt="" id="BLOGGER_PHOTO_ID_5618827592083723474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;While the current implementation (which will be available for the Indigo SR1 release later this year) properly handles them and displays a single change :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-dN2ewQQNexE/TfoV7UV20MI/AAAAAAAAAIs/tbCaTzzgWxw/s1600/Message-uml2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 198px;" src="http://4.bp.blogspot.com/-dN2ewQQNexE/TfoV7UV20MI/AAAAAAAAAIs/tbCaTzzgWxw/s320/Message-uml2.png" alt="" id="BLOGGER_PHOTO_ID_5618827593914962114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Indigo is out, time to move on to these exciting new features... Well, almost :). For now, 'tis time to relax a little bit. Sun, beach and beer seem like a perfect combination to that end :).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://lh6.googleusercontent.com/-TXL6BsuoTI4/TgbjK_k8ufI/AAAAAAAAAJA/j5s7BAgwQHA/s640/Aleria.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 640px; height: 499px;" src="https://lh6.googleusercontent.com/-TXL6BsuoTI4/TgbjK_k8ufI/AAAAAAAAAJA/j5s7BAgwQHA/s640/Aleria.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-4013359968674230586?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/4013359968674230586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2011/06/whats-next-in-emf-compare.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/4013359968674230586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/4013359968674230586'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2011/06/whats-next-in-emf-compare.html' title='What&apos;s next in EMF Compare'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-F4j1Bo3kIuE/TfoEvz3rvaI/AAAAAAAAAHs/xoetuJNw4LA/s72-c/before_commit_action.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-649829064986491344</id><published>2011-06-16T00:43:00.000-07:00</published><updated>2011-06-16T02:47:13.189-07:00</updated><title type='text'>What's new in EMF Compare</title><content type='html'>Here we are again, it is almost time for the annual Eclipse release; this year for the sixth consecutive named simultaneous release. EMF Compare has been there since Callisto, the first of those six; and &lt;a href="http://www.eclipse.org/emf/compare/"&gt;EMF Compare&lt;/a&gt; 1.2.0 is now on its way out. So, what has been added to this new release?&lt;br /&gt;&lt;br /&gt;Among the usual bug fixes, we have added some noteworthy features :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Difference grouping&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;EMF Compare can detect a number of differences between models; additions, deletions, moves... It is now possible to "group" these changes by type in order to read the comparison with a little more ease.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-ZMIbAm8XIag/Tfm8GJgnwII/AAAAAAAAAG8/nv0PUvJhULM/s1600/Grouping_Default.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 67px;" src="http://3.bp.blogspot.com/-ZMIbAm8XIag/Tfm8GJgnwII/AAAAAAAAAG8/nv0PUvJhULM/s320/Grouping_Default.png" alt="" id="BLOGGER_PHOTO_ID_5618728823939383426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-EulIYBscjBE/Tfm8GVk_7YI/AAAAAAAAAHE/nCgMN_BtXXc/s1600/Grouping_Kind.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 66px;" src="http://4.bp.blogspot.com/-EulIYBscjBE/Tfm8GVk_7YI/AAAAAAAAAHE/nCgMN_BtXXc/s320/Grouping_Kind.png" alt="" id="BLOGGER_PHOTO_ID_5618728827178970498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;New Grouping strategies can also easily be contributed by client plugins; more information can be found on &lt;a href="http://wiki.eclipse.org/EMF_Compare/Grouping_facility"&gt;the dedicated wiki page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Difference filtering&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is now possible to filter out some of the differences from the EMF Compare UI. For example, here is the same comparison as above without the "added" elements :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-La90ufhYinY/Tfm9eAduuQI/AAAAAAAAAHM/P5d5gwboxkw/s1600/Filtering.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 71px;" src="http://2.bp.blogspot.com/-La90ufhYinY/Tfm9eAduuQI/AAAAAAAAAHM/P5d5gwboxkw/s320/Filtering.png" alt="" id="BLOGGER_PHOTO_ID_5618730333339826434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;As for grouping, new filtering strategies can be contributed by clients plugins. Detailled information on this feature can be found on &lt;a href="http://wiki.eclipse.org/EMF_Compare/Filtering_facility"&gt;the wiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Textual comparison of attribute values&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If a change in an attribute value has been detected by EMF Compare, it will display, by default, a message such as "attribute &lt;attributename&gt; : &lt;attributetype&gt; in class &lt;classname&gt; has changed from &lt;oldvalue&gt; to &lt;newvalue&gt;". This message is hardly readable for long "string" values of attributes. EMF Compare now allows you to get a dialog displaying the textual comparison of those values :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-7jaLgV1fmdo/TfnAUpTzT1I/AAAAAAAAAHU/WPPeI3ZW77s/s1600/2way-textcomp.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 222px;" src="http://1.bp.blogspot.com/-7jaLgV1fmdo/TfnAUpTzT1I/AAAAAAAAAHU/WPPeI3ZW77s/s320/2way-textcomp.png" alt="" id="BLOGGER_PHOTO_ID_5618733471040229202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;As usual, detailled information can be located on &lt;a href="http://wiki.eclipse.org/EMF_Compare/Textual_diff_in_model_diff"&gt;the corresponding wiki page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UML-specific comparison engine&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;EMF Compare provides a "generic" comparison engine that works on every EMF models you can find. The disadvantage of a generic engine, though, is that it cannot know of specific needs. UML models, for example, have a number of features that EMF Compare cannot properly handle in a generic manner.&lt;br /&gt;&lt;br /&gt;We now provide along with EMF Compare 1.2.0 an UML-specific comparison engine to take care of that metamodel. For example, here is what the generic engine detects when applying a stereotype to a Class :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-nB-l-zrW4rE/TfnGZFObMDI/AAAAAAAAAHc/s9HzpXvBJK0/s1600/stereotypeApplication-generic.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 208px;" src="http://3.bp.blogspot.com/-nB-l-zrW4rE/TfnGZFObMDI/AAAAAAAAAHc/s9HzpXvBJK0/s320/stereotypeApplication-generic.png" alt="" id="BLOGGER_PHOTO_ID_5618740144323113010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And here is what can will be detected and displayed by the UML specific engine :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-IWs1g8X_20I/TfnGZbLxu_I/AAAAAAAAAHk/oKLG0cdu80M/s1600/stereotypeApplication-uml2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 207px;" src="http://2.bp.blogspot.com/-IWs1g8X_20I/TfnGZbLxu_I/AAAAAAAAAHk/oKLG0cdu80M/s320/stereotypeApplication-uml2.png" alt="" id="BLOGGER_PHOTO_ID_5618740150217587698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This UML comparison engine is still in its early stages and will be improved in the months to come, but it is still provided for early adopters. Further technical information about this extension are described on &lt;a href="http://wiki.eclipse.org/EMF_Compare/UML_Compare#UML_Extensions"&gt;the Eclipse wiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Most of these features have been implemented as part of the &lt;a href="http://wiki.eclipse.org/ModelingPlatform"&gt;Modeling Platform working group&lt;/a&gt;.&lt;br /&gt;&lt;/newvalue&gt;&lt;/oldvalue&gt;&lt;/classname&gt;&lt;/attributetype&gt;&lt;/attributename&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-649829064986491344?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/649829064986491344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2011/06/whats-new-in-emf-compare.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/649829064986491344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/649829064986491344'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2011/06/whats-new-in-emf-compare.html' title='What&apos;s new in EMF Compare'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-ZMIbAm8XIag/Tfm8GJgnwII/AAAAAAAAAG8/nv0PUvJhULM/s72-c/Grouping_Default.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-6010848991601231118</id><published>2011-06-07T08:11:00.000-07:00</published><updated>2011-06-07T08:29:35.376-07:00</updated><title type='text'>Acceleo query cache</title><content type='html'>Some of our users have been bit by the fact that &lt;a href="http://www.eclipse.org/acceleo/"&gt;Acceleo&lt;/a&gt; caches the result of Query invocations, returning the very same result each time a given query is called. These users often came with the same two questions : "why?" and "Can this cache be disabled in my case?".&lt;br /&gt;&lt;br /&gt;The answer to the first has always been and will remain the same : Acceleo is an implementation of the OMG's &lt;a href="http://www.omg.org/spec/MOFM2T/1.0/"&gt;MOFM2T 1.0 specification&lt;/a&gt;, and this specification tells us that&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A &lt;span style="font-style: italic;"&gt;query&lt;/span&gt; is required to produce the same result each time it is invoked with the same arguments.&lt;/li&gt;&lt;/ul&gt;That is the reason we decided to cache the result : in order to return that same result each time the query is called, without re-evaluating it.&lt;br /&gt;&lt;br /&gt;The answer to the second, however, changes with the 3.1.0 release of Acceleo : even though we strive to be as close as possible to the specification, there are times where this caching of the query return values is not desirable : it can be really costly memory-wise, it could be a call to a Java method that has random results, it could be a query which return value changes according to variable states that are not passed as parameters... That was possible through programmatic calls in 3.0.2, but we've decided to make that preference available through the UI in 3.1.0 :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-iWXz-5EpV-4/Te5DrP6nv9I/AAAAAAAAAG0/ItQd5iffOrg/s1600/Acceleo_preferences.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 279px;" src="http://4.bp.blogspot.com/-iWXz-5EpV-4/Te5DrP6nv9I/AAAAAAAAAG0/ItQd5iffOrg/s320/Acceleo_preferences.png" alt="" id="BLOGGER_PHOTO_ID_5615500195663429586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The next step is to have the specification evolve in order to be able to disable the query cache "per-query" instead of globally but... that's another story :).&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);" class=" down" style="display: block;" id="formatbar_CreateLink" title="Link"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-6010848991601231118?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/6010848991601231118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2011/06/acceleo-query-cache.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6010848991601231118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6010848991601231118'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2011/06/acceleo-query-cache.html' title='Acceleo query cache'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-iWXz-5EpV-4/Te5DrP6nv9I/AAAAAAAAAG0/ItQd5iffOrg/s72-c/Acceleo_preferences.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-7839870733967313251</id><published>2011-04-22T05:09:00.000-07:00</published><updated>2011-04-22T07:05:34.796-07:00</updated><title type='text'>Acceleo syntax coloring</title><content type='html'>I announced in my &lt;a href="http://eclipsemde.blogspot.com/2011/03/acceleo-over-rainbow.html"&gt;latest message&lt;/a&gt; that the syntax highlighting colors of Acceleo would soon be configurable. Well, the preference page has now made its apparition and will definitely be available in the 3.1.0M7 build of Acceleo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-htyagNB6Y6g/TbGKkHk1XuI/AAAAAAAAAGM/Ts49LMDNayk/s1600/preferencePage.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 316px; height: 320px;" src="http://1.bp.blogspot.com/-htyagNB6Y6g/TbGKkHk1XuI/AAAAAAAAAGM/Ts49LMDNayk/s320/preferencePage.png" alt="" id="BLOGGER_PHOTO_ID_5598408164911701730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;If anyone would like to contribute, we're still missing import/export capabilities to make these color themes easier to share between Eclipses and colleagues; we'd gladly accept such contributions :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-7839870733967313251?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/7839870733967313251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2011/04/acceleo-syntax-coloring.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/7839870733967313251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/7839870733967313251'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2011/04/acceleo-syntax-coloring.html' title='Acceleo syntax coloring'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-htyagNB6Y6g/TbGKkHk1XuI/AAAAAAAAAGM/Ts49LMDNayk/s72-c/preferencePage.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-629134685766477986</id><published>2011-03-28T08:13:00.000-07:00</published><updated>2011-04-04T00:53:25.457-07:00</updated><title type='text'>Acceleo over the rainbow</title><content type='html'>We've often had complaints about the default choice of colors we made for the Acceleo template editor :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-bCjMDwNuIv4/TZHmSB-U-mI/AAAAAAAAAF0/qalOwM8g5Pk/s1600/default.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 250px;" src="http://4.bp.blogspot.com/-bCjMDwNuIv4/TZHmSB-U-mI/AAAAAAAAAF0/qalOwM8g5Pk/s320/default.png" alt="" id="BLOGGER_PHOTO_ID_5589501809985387106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;For example, people who like high contrast themes, or who'd rather develop with a white/green font on a black/gray background complained that this colors were unusable when using such backgrounds. And since we inherit the background color from the default "text editor background" color, this could give awful results :&lt;br /&gt;&lt;br /&gt;&lt;default_black_bg.png&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-pgpyqrZCwZE/TZHmS3cwbLI/AAAAAAAAAGE/wWiSHy8JI5A/s1600/default_black_bg.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 250px;" src="http://3.bp.blogspot.com/-pgpyqrZCwZE/TZHmS3cwbLI/AAAAAAAAAGE/wWiSHy8JI5A/s320/default_black_bg.png" alt="" id="BLOGGER_PHOTO_ID_5589501824340094130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;There were also those that simply didn't like to have "red" text in their code, since this color usually reflect an error of some kind :). As hinted from &lt;a href="http://sbegaudeau.tumblr.com/post/4254713128/a-new-direction-for-acceleo"&gt;Stéphane's recent post&lt;/a&gt;, we've decided to make these colors customizable in Acceleo 3.1. And even though his "rainbow" theme was a little extreme (just in time for april's fool), it did show a number of the areas that now get individually customizable.&lt;br /&gt;&lt;br /&gt;We hope to include import/export facilities for these color schemes, and the rainbow scheme will most likely be included along with the default :).&lt;br /&gt;&lt;br /&gt;I know my editor will more or less look like this (but I kind of find blue-ish themes easy on the eye) :&lt;br /&gt;&lt;br /&gt;&lt;ocean.png&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-k_cOR-sVVFQ/TZHmSY8WhPI/AAAAAAAAAF8/qRy3R9JXxT8/s1600/ocean.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 250px;" src="http://3.bp.blogspot.com/-k_cOR-sVVFQ/TZHmSY8WhPI/AAAAAAAAAF8/qRy3R9JXxT8/s320/ocean.png" alt="" id="BLOGGER_PHOTO_ID_5589501816151114994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;How will be yours? Look forward for the 3.1M7 build for these options :).&lt;br /&gt;&lt;/ocean.png&gt;&lt;/default_black_bg.png&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-629134685766477986?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/629134685766477986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2011/03/acceleo-over-rainbow.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/629134685766477986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/629134685766477986'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2011/03/acceleo-over-rainbow.html' title='Acceleo over the rainbow'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-bCjMDwNuIv4/TZHmSB-U-mI/AAAAAAAAAF0/qalOwM8g5Pk/s72-c/default.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-8332320968783091090</id><published>2010-12-21T01:50:00.000-08:00</published><updated>2010-12-21T05:01:47.989-08:00</updated><title type='text'>Acceleo vs Acceleo vs Xpand</title><content type='html'>We've recently had a good number of people asking for comparisons between &lt;a href="http://acceleo.org/pages/home/en"&gt;Acceleo 2&lt;/a&gt; and its new major version &lt;a href="http://www.eclipse.org/acceleo/"&gt;Acceleo 3&lt;/a&gt;. Some people also wondered how Acceleo ranked compared to the other trendy code generation tool, &lt;a href="http://www.eclipse.org/modeling/m2t/?project=xpand"&gt;Xpand&lt;/a&gt;. The three have the same goal : generating text from models, let's take a closer look at their respective performances.&lt;br /&gt;&lt;br /&gt;With the migration capabilities we have between Acceleo 2 and Acceleo 3, comparing those two has proven rather easy; comparing them with Xpand has been a little more trouble for me as I am not familiar to this tool. I still attained a result I believe to be interesting.&lt;br /&gt;&lt;br /&gt;I didn't make in-depth comparisons between the tooling of each of these three tools, focusing on the generation performance only. GUI comparison may come later, when I have the courage :).&lt;br /&gt;&lt;br /&gt;What I did compare was the generation performance for a given set of generation templates that I ported to all three of the technologies. The result is that all three tools (Acceleo 2, Acceleo 3 and Xpand 1.0.1) generate the very same java code, whitespaces excepted.&lt;br /&gt;&lt;br /&gt;Each of the times outlined below is the average of three runs on the same machine :&lt;br /&gt;- Intel Core 2 Duo 64 bits&lt;br /&gt;- Dual core, 2GHz by core&lt;br /&gt;- 4 Go RAM&lt;br /&gt;- Windows seven 64bits&lt;br /&gt;&lt;br /&gt;The version of Java installed on this machine was Java SE 1.5.0_22 64bits.&lt;br /&gt;&lt;br /&gt;The Eclipse platform version was Eclipse Helios 3.6.1 (64 bits still). Each tool was installed within its own Eclipse with only its dependencies and the dependencies of the tests.&lt;br /&gt;&lt;br /&gt;I've run two distinct use cases for this benchmarking :&lt;br /&gt;- "Small" corresponding to the generation with a small model as input. I used UML.genmodel for this, which in turn links to UML.ecore, Ecore.ecore and Ecore.genmodel. When counting the content of the two main models used by this transformation, UML.genmodel and UML.ecore (just a basic count of eAllContents), I get a total of 14 420 elements.&lt;br /&gt;- "Medium" corresponding to the generation of medium models as input. For this, I generated a metamodel with a fixed number of classes, enumerations and datatypes, then the corresponding genmodel. Like above, a basic count of the model content yields a total of 50 944 elements.&lt;br /&gt;&lt;br /&gt;As far as generated files go, the "small" use case generates 217 java classes for a total of 200 921 lines of code. The "medium" use case generates 1 206 java files for a total of 838 273 lines of code.&lt;br /&gt;&lt;br /&gt;All measures have been taken "at worst", launching the generation in a new Eclipse runtime (thus, nothing in cache, no plugin loaded yet). The times given here are in seconds, and they correspond to the average of three runs. One measure comprises the time to load the model, the time to evaluate the generation and the time to serialize the result.&lt;br /&gt;&lt;br /&gt;Without further ado, here are the figures :&lt;br /&gt;&lt;br /&gt;&lt;table frame="VOID" rules="NONE" border="0" cellspacing="0" cols="4"&gt;  &lt;colgroup&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;/colgroup&gt;  &lt;tbody&gt;   &lt;tr&gt;    &lt;td align="LEFT" height="17" width="86"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="CENTER" width="86"&gt;&lt;b&gt;&lt;span style="font-family:Times New Roman;"&gt;Acceleo 2&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="CENTER" width="86"&gt;&lt;b&gt;&lt;span style="font-family:Times New Roman;"&gt;Acceleo 3&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="CENTER" valign="MIDDLE" width="86"&gt;&lt;b&gt;&lt;span style="font-family:Times New Roman;"&gt;Xpand&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" height="17"&gt;&lt;span style="font-family:Times New Roman;"&gt;Small&lt;/span&gt;&lt;/td&gt;    &lt;td style="border-bottom: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0);" align="CENTER"&gt;&lt;span style="font-family:Times New Roman;"&gt;50 s&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;    &lt;td style="border-bottom: 1px solid rgb(0, 0, 0); border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0);" align="CENTER"&gt;&lt;span style="font-family:Times New Roman;"&gt;10 s&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;    &lt;td style="border-bottom: 1px solid rgb(0, 0, 0); border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0);" align="CENTER"&gt;&lt;span style="font-family:Times New Roman;"&gt;25 s&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="LEFT" height="18"&gt;&lt;span style="font-family:Times New Roman;"&gt;Medium&lt;/span&gt;&lt;/td&gt;    &lt;td style="border-top: 1px solid rgb(0, 0, 0); border-bottom: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0);" align="CENTER"&gt;&lt;span style="font-family:Times New Roman;"&gt;215 s&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="CENTER"&gt;&lt;span style="font-family:Times New Roman;"&gt;25 s&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;    &lt;td style="border: 1px solid rgb(0, 0, 0);" align="CENTER"&gt;&lt;span style="font-family:Times New Roman;"&gt;212 s&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;   &lt;/tr&gt;  &lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;Being an Acceleo developper myself, I can only be pleased by these results ... Even though the test might be seend as biased as a result :p. All of the files needed to replay these can be downloaded from &lt;a href="http://www.eclipse.org/modeling/m2t/acceleo/ecore2unittests.bench.zip"&gt;here&lt;/a&gt;. On that matter, as I am not familiar with Xpand, please don't hesitate to optimize the templates if at all possible (though the Acceleo 3 templates themselves don't use the latest evolutions of Acceleo 3.1).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-8332320968783091090?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/8332320968783091090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2010/12/acceleo-vs-acceleo-vs-xpand.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/8332320968783091090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/8332320968783091090'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2010/12/acceleo-vs-acceleo-vs-xpand.html' title='Acceleo vs Acceleo vs Xpand'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-2914775898051275337</id><published>2010-10-12T02:03:00.000-07:00</published><updated>2010-10-12T02:33:33.318-07:00</updated><title type='text'>Open World Forum Demo cup award 2010</title><content type='html'>The &lt;a href="http://www.openworldforum.org/"&gt;Open World Forum&lt;/a&gt; took place in Paris on September 30 and October 1. This was a great opportunity to discover open source tools and technologies, as well as getting to know great people of this field. The 2010 edition has attracted over 1500 participants from 40 countries!&lt;br /&gt;&lt;br /&gt;Obeo was present and demonstrated the use of Acceleo 3 to generate android applications, this demo earned us the &lt;a href="http://www.openworldforum.org/connect/awards"&gt;Demo Cup 2010 award&lt;/a&gt;! This award is given to recognize the most innovative and game-changer open source solution in its    marketplace.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.eclipse.org/acceleo/images/openInnovationAward.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 155px; height: 101px;" src="http://www.eclipse.org/acceleo/images/openInnovationAward.png" alt="" border="0" /&gt;&lt;/a&gt;Acceleo, selected from 13 top nominees, received one of five prestigious trophies at the closing ceremony     of the Open World Forum, awarded by a jury consisting of leading international experts in the open source world. &lt;a href="http://www.openworldforum.org/connect/awards"&gt;&lt;/a&gt;&lt;p&gt;     &lt;/p&gt;&lt;p&gt;     After the &lt;a href="http://www.eclipse.org/org/press-release/20090323_AwardsWinners.php"&gt;Eclipse Community Award in 2009&lt;/a&gt;, this prize recognizes the  constant efforts of the Acceleo team &amp;amp; community to provide a powerful tool of the highest quality.       &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-2914775898051275337?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/2914775898051275337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2010/10/open-world-forum-took-place-in-paris-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/2914775898051275337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/2914775898051275337'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2010/10/open-world-forum-took-place-in-paris-on.html' title='Open World Forum Demo cup award 2010'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-7299127739830727493</id><published>2010-08-16T01:10:00.000-07:00</published><updated>2010-08-16T01:51:19.589-07:00</updated><title type='text'>User interface improvements in Acceleo 3.1</title><content type='html'>Acceleo 3.1.0 is due June, 22 2011 along with Eclipse Indigo ... seems far, but not as far away as we sometimes hope for  with all the features we'd like to add in our products.&lt;br /&gt;&lt;br /&gt;Because of this, we've already started implementing some of the (many) improvements we'd like to make in the Acceleo editor : support for template, query and module documentation, support for more markers to display feedback to the user (information, warning, "overriding" link...), support for tasks in the template (TODO, FIXME, ...), improvement of the oultine, feedback on the non-printable characters that will be generated ...&lt;br /&gt;&lt;br /&gt;Stephane Begaudeau is reponsible for most of these first additions, you can find a list, detailed explanations and screenshots in &lt;a href="http://sbegaudeau.tumblr.com/post/961722949/user-interface-improvements-in-acceleo-3-1"&gt;this great post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Most of these improvements have already found their way in the source code and will be available in the 3.1M1 release of Acceleo tomorrow, care to test? Or are there features &lt;u&gt;you&lt;/u&gt; would like to see in the Acceleo module editor? Don't hesitate to take part in the discussions, raise bugs or provide feedback on either &lt;a href="https://bugs.eclipse.org/bugs/enter_bug.cgi?product=M2T&amp;amp;component=Acceleo"&gt;bugzilla&lt;/a&gt; or &lt;a href="http://www.eclipse.org/forums/index.php?t=thread&amp;amp;frm_id=24&amp;amp;S=18c8db06f221c1e188c27f145258820b"&gt;forum&lt;/a&gt; :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-7299127739830727493?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/7299127739830727493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2010/08/user-interface-improvements-in-acceleo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/7299127739830727493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/7299127739830727493'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2010/08/user-interface-improvements-in-acceleo.html' title='User interface improvements in Acceleo 3.1'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-5697397948671768585</id><published>2010-06-30T01:25:00.000-07:00</published><updated>2010-06-30T04:40:38.609-07:00</updated><title type='text'>Using code generation under ClearCase</title><content type='html'>Those of you that know ClearCase also know that it requires the user to check out the file he wishes to edit before any editing can be done; kind of trying to edit a read-only file : you need to remove the read-only flag before anything else. Of course, this doesn't fit well with code generation tools such as Acceleo since the aim of such tools is to edit (or create) a number of files at once.&lt;br /&gt;&lt;br /&gt;Until now that is :). Acceleo can now be used in conjunction with ClearCase or other pessimist-locking Version Control Systems (VCS). How does it work?&lt;br /&gt;&lt;br /&gt;You might have noticed the "&lt;span style="font-family:courier new;"&gt;getGenerationStrategy()&lt;/span&gt;" method of the Java class we generate for your main mtl files; this is the method that matters for us. You simply need to change it from its default "&lt;span style="font-family:courier new;"&gt;return super.getGenerationStrategy()&lt;/span&gt;" to "&lt;span style="font-family:courier new;"&gt;return new WorkspaceAwareStrategy()&lt;/span&gt;" and you're done! Acceleo will now prompt the users of your generators to check out the files before attempting to modify them.&lt;br /&gt;&lt;br /&gt;Two things to note :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You must change the javadoc of "&lt;span style="font-family:courier new;"&gt;getGenerationStrategy()&lt;/span&gt;" so that it doesn't contain "&lt;span style="font-family:courier new;"&gt;@generated&lt;/span&gt;" anymore : delete this tag, change it to "&lt;span style="font-family:courier new;"&gt;@not-generated&lt;/span&gt;", change it to "&lt;span style="font-family:courier new;"&gt;@generated NOT&lt;/span&gt;"... just don't leave this tag as-is or the Acceleo builder will override your change.&lt;/li&gt;&lt;li&gt;You cannot use this strategy in standalone mode, its goal is to integrate with the Eclipse workspace and its team providers.&lt;/li&gt;&lt;/ul&gt;The use case with ClearCase or pessimist locking VCSs is obvious, but you might realize that there is more to it that just these. You could be trying to regenerate a file that you set as read only, a file under SVN that requires a lock...&lt;br /&gt;&lt;br /&gt;For example, with SVN you can set the property "svn:needs-lock" on a file to prevent any edition without prior locking. If you attempt to regenerate a file with such a property set with Acceleo, here is what you will get :&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-family:courier new;"&gt;java.io.FileNotFoundException: [...]&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;\Library.java (Access denied)&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Pretty mean, huh? If you make use of the &lt;span style="font-family:courier new;"&gt;WorskpaceAwareStrategy&lt;/span&gt; though, you will get this instead :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gUYgFSXWFEc/TCsrZmzMH4I/AAAAAAAAAE4/dEwttwr4nvY/s1600/SVN_Lock.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 286px;" src="http://4.bp.blogspot.com/_gUYgFSXWFEc/TCsrZmzMH4I/AAAAAAAAAE4/dEwttwr4nvY/s320/SVN_Lock.png" alt="" id="BLOGGER_PHOTO_ID_5488528289793056642" border="0" /&gt;&lt;/a&gt;All you have to do is to tick off the files for which you wish to take the lock. Files you do not check will not be locked for edition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-5697397948671768585?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/5697397948671768585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2010/06/using-code-generation-under-clearcase.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/5697397948671768585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/5697397948671768585'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2010/06/using-code-generation-under-clearcase.html' title='Using code generation under ClearCase'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gUYgFSXWFEc/TCsrZmzMH4I/AAAAAAAAAE4/dEwttwr4nvY/s72-c/SVN_Lock.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-983949095149551936</id><published>2010-06-11T02:08:00.000-07:00</published><updated>2010-06-11T02:57:52.346-07:00</updated><title type='text'>Package with URI '*' not found</title><content type='html'>I believe most of the users of EMF (developers or adopters alike) have seen this message at least once; and most probably wondered what was going on :).&lt;br /&gt;&lt;br /&gt;This error message indicates that the package which NsURI is '*' hasn't been registered in the Package registry. Most of the time, that means you either a) launched your program standalone and didn't register the package correctly or b) you haven't installed the plug-in that provides that metamodel.&lt;br /&gt;&lt;br /&gt;With &lt;a href="http://www.eclipse.org/acceleo/"&gt;Acceleo&lt;/a&gt;, encountering this exception is even more likely than normal, as the launch configuration for our generations allow for both &lt;span style="font-style: italic;"&gt;standalone&lt;/span&gt; or &lt;span style="font-style: italic;"&gt;plug-in&lt;/span&gt; generations. Selecting &lt;span style="font-style: italic;"&gt;standalone&lt;/span&gt; without registering the needed package will inevitably lead to this error.&lt;br /&gt;&lt;br /&gt;Solving it is easy : it is a matter of registering the needed packages (and, optionally, resource factories).  How is it done? Here is the most classic example with UML :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Package with uri 'http://www.eclipse.org/uml2/2.1.0/UML' not found.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What do I need to do for my UML model to be loadable :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;EPackage.Registry.INSTANCE.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Resource.Factory.Registry.INSTANCE&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The same goes for every metamodel you might need, simply change &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;UMLPackage&lt;/span&gt;&lt;/span&gt; by &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;XxxPackage &lt;/span&gt;&lt;/span&gt;according to your metamodel. The Resource Factory is mandatory for UML, but your metamodel might not need one; simply ignore this line if you don't have a custom factory.&lt;br /&gt;&lt;br /&gt;You need these two lines to be &lt;u&gt;before&lt;/u&gt; the point where your model is loaded. For Acceleo, this is done in the generated Java launcher : simply change the implementation of the &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;registerPackages&lt;/span&gt;&lt;/span&gt; and &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;registerResourceFactories&lt;/span&gt;&lt;/span&gt; method to add these needed lines.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-983949095149551936?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/983949095149551936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2010/06/package-with-uri-not-found.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/983949095149551936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/983949095149551936'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2010/06/package-with-uri-not-found.html' title='Package with URI &apos;*&apos; not found'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-8803695957198477947</id><published>2010-06-08T07:21:00.000-07:00</published><updated>2010-06-08T07:56:12.211-07:00</updated><title type='text'>New Acceleo homepage</title><content type='html'>The &lt;a href="http://www.eclipse.org/acceleo/"&gt;Acceleo homepage&lt;/a&gt; now  makes use of the template &lt;a href="http://www.heikobehrens.net/2010/01/07/recent-updates-of-the-xtext-website/"&gt;provided  by Heiko Behrens&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You've seen it with MoDisco, you've seen it with Xtext, it's now our turn to change skin :).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gUYgFSXWFEc/TA5ZURa4lYI/AAAAAAAAAEw/cuRwb20Qc3A/s1600/Acceleo_website.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 277px;" src="http://2.bp.blogspot.com/_gUYgFSXWFEc/TA5ZURa4lYI/AAAAAAAAAEw/cuRwb20Qc3A/s320/Acceleo_website.png" alt="" id="BLOGGER_PHOTO_ID_5480416001364891010" border="0" /&gt;&lt;/a&gt;This also makes use of the changes brought to the CSS by &lt;a href="http://fmadiot.blogspot.com/2010/06/new-modisco-homepage.html"&gt;Fred Madiot&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thanks to both of them !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-8803695957198477947?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/8803695957198477947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2010/06/new-acceleo-homepage.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/8803695957198477947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/8803695957198477947'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2010/06/new-acceleo-homepage.html' title='New Acceleo homepage'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gUYgFSXWFEc/TA5ZURa4lYI/AAAAAAAAAEw/cuRwb20Qc3A/s72-c/Acceleo_website.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-6074304675787198277</id><published>2010-06-01T07:15:00.001-07:00</published><updated>2010-06-01T07:15:48.826-07:00</updated><title type='text'>What's new in Acceleo 3.0?</title><content type='html'>&lt;a href="http://wiki.eclipse.org/Acceleo"&gt;Acceleo&lt;/a&gt; 3.0 is on its way out. It is &lt;a href="http://www.eclipse.org/modeling/m2t/downloads/?project=acceleo"&gt;currently accessible in its third Release Candidate (RC3)&lt;/a&gt; version. The complete list of improvements and bug fixes that have been implemented in this version since the last stable release (version 0.8.1, see my previous post for &lt;a href="http://eclipsemde.blogspot.com/2010/03/acceleo-graduation-version-jumping-and.html"&gt;explanation on this branch's version numbering&lt;/a&gt;) is humongous; following is the list of the most important ones. I may be succinct on the description of some of these, but you can get a full explanation of all of them in the Acceleo documentation, namely the &lt;span style="font-weight: bold;"&gt;User Guide&lt;/span&gt;. Be warned though, this will be a huge post :).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Compatibility and upgrading&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Acceleo 3.0 is compatible with the three latest releases of Eclipse; Eclipse 3.4 (Ganymede), Eclipse 3.5 (Galileo) and Eclipse 3.6 (Helios). However, there are some limitations to this compatibility we maintain due to the changes that were implemented in OCL since then. For one, Acceleo modules that compile in Helios may or may not compile in Galileo and Ganymede (this will depend on the OCL features you make use of). However, Acceleo modules that compile in a given version will always compile in the subsequent Eclipse releases. Likewise, a module that has been compiled in Helios may be launched in Ganymede regardless of whether it would compile or not in that version, as our runtime shouldn't suffer from OCL breakages and improvements. All information about the compatibility will be maintained on the &lt;a href="http://wiki.eclipse.org/Acceleo#Compatibility"&gt;wiki&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;We provide migration facilities for those of you that own Acceleo 2 templates. Specifically, we allow for the automatic migration of Acceleo 2 generation projects to Acceleo 3 projects. The automatic migration takes care of everything that could possibly be automated, leaving for you to fix no more than the Acceleo 2 features that don't have an identified mapping to Acceleo 3, or those few features that require a human hand to convert intelligently. The team is at your disposal for help if there still remains things you don't know how to convert to Acceleo 3 on the usual communication channels : the M2T newsgroup, mails, comments on this blog...&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Tooling improvements&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;New views have been introduced to help you on several aspects of the generation cycles : module definition, launching, debugging. I'll detail each of these views one after the other.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First of all, the &lt;span style="font-style: italic;"&gt;Result&lt;/span&gt; view allows you to get feedback on the traceability information we could retrieve during the evaluation of your modules. As long as this view has been opened, Acceleo will record every bit of information it can to synchronize your generated text with the generation module and source model. Ever wondered why such or such portion of text has been generated one way or another? What part of your generation module has generated the name of such or such method? From which element of your model has been generated such or such import? This is the view you can use to retrieve these pieces of information.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gUYgFSXWFEc/S_55MefRgcI/AAAAAAAAADo/UuSVrNLkdyg/s1600/acceleo_result_view1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 138px;" src="http://3.bp.blogspot.com/_gUYgFSXWFEc/S_55MefRgcI/AAAAAAAAADo/UuSVrNLkdyg/s320/acceleo_result_view1.png" alt="" id="BLOGGER_PHOTO_ID_5475947452178727362" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Next comes the &lt;span style="font-style: italic;"&gt;Overrides&lt;/span&gt; view, which can be used to easily create templates or modules overriding other that are present in your instance of Eclipse. It will display every single module located either in your installed plug-ins or your workspace. All of these can be browsed down to the template level and a check box allows you to select those you wish to override. Once selected, you simply have to use the content assistant in the Acceleo Editor (&lt;span style="font-style: italic;"&gt;CTRL+SPACE&lt;/span&gt; by default) and validate &lt;span style="font-style: italic;"&gt;selected ov&lt;/span&gt;&lt;span style="font-style: italic;"&gt;errides&lt;/span&gt; for all of the overriding templates to be added to your module.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gUYgFSXWFEc/S_56Ai63omI/AAAAAAAAADw/hoW9lvIXqhA/s1600/acceleo_overrides_view2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 105px;" src="http://2.bp.blogspot.com/_gUYgFSXWFEc/S_56Ai63omI/AAAAAAAAADw/hoW9lvIXqhA/s320/acceleo_overrides_view2.png" alt="" id="BLOGGER_PHOTO_ID_5475948346721411682" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Last but not least, the &lt;span style="font-style: italic;"&gt;Generation Patterns&lt;/span&gt; view has been introduced to help you implement behavior for an interface/class and all (or a subset of) its subtypes. For example, let's say you wish to implement a template named &lt;span style="font-family:courier new;"&gt;javaName&lt;/span&gt; which will generate the name of any classifier. This template will need some default behavior for interfaces and specific behavior for some classifiers. Open the Generation Patterns view, tick &lt;span style="font-style: italic;"&gt;[template] for all selected types&lt;/span&gt; in its top part, and all of the types you wish to generate a template for in its bottom part. Once done, the content assist in the Acceleo editor will give you the choice &lt;span style="font-style: italic;"&gt;[template] for all selected types&lt;/span&gt; which you just have to choose in order to generate all of the templates you asked for. Now that you no longer risk forgetting one or more subtypes, it is left to your discretion to implement the behavior for each of them.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gUYgFSXWFEc/S_6EsgV5NYI/AAAAAAAAAD4/chQF0eYeT7Y/s1600/acceleo_generation_patterns1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 190px;" src="http://4.bp.blogspot.com/_gUYgFSXWFEc/S_6EsgV5NYI/AAAAAAAAAD4/chQF0eYeT7Y/s320/acceleo_generation_patterns1.png" alt="" id="BLOGGER_PHOTO_ID_5475960097059976578" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Acceleo now provides a built-in profiler that can be used to keep track of evaluations and identify (and, hopefully, fix) bottlenecks in your generation process. The profiler is accessible through a right click on the module which execution you need to profile and the menu item &lt;span style="font-style: italic;"&gt;Profile As =&gt; Acceleo Application&lt;/span&gt;.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gUYgFSXWFEc/S_6NxNxwyBI/AAAAAAAAAEA/JktQ1Hu_edo/s1600/acceleo_profiling_file2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 166px;" src="http://1.bp.blogspot.com/_gUYgFSXWFEc/S_6NxNxwyBI/AAAAAAAAAEA/JktQ1Hu_edo/s320/acceleo_profiling_file2.png" alt="" id="BLOGGER_PHOTO_ID_5475970073580587026" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The Acceleo debugger now provides you with the list of available variables at a given point in the evaluation process, along with the values of these variables for a given stack frame. Moreover, the displayed stack frames now represent Acceleo module element corresponding to your current expression stack. As for the previous release, debugging templates only requires you to set breakpoints in the Acceleo modules as you would usually with Eclipse : open an editor, double click in the left margin on the line you wish the breakpoint to be set, and launch the generation through the menu &lt;span style="font-style: italic;"&gt;Debug As =&gt; Launch Acceleo Application&lt;/span&gt;.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gUYgFSXWFEc/S_9-PmydoOI/AAAAAAAAAEI/HnmUc1gCsIc/s1600/acceleo_debug.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 195px;" src="http://1.bp.blogspot.com/_gUYgFSXWFEc/S_9-PmydoOI/AAAAAAAAAEI/HnmUc1gCsIc/s320/acceleo_debug.png" alt="" id="BLOGGER_PHOTO_ID_5476234478481154274" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Whenever possible, the warnings and errors Acceleo logs when an evaluation fails now sport the expression stack (with the lines they're at in the module files) instead of a stack trace corresponding to the Java code that was being executed at the time. This will allow for way easier debugging that ever before.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Editor Improvements&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;Apart from the performance improvements and minor bug fixes, the Acceleo module editor now provides refactoring actions and quick fixes.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First of all, you can now use the “usual” shortcut &lt;span style="font-style: italic;"&gt;ALT+SHIFT+R&lt;/span&gt; to rename either modules, templates, queries, variables, ... in a coherent manner. This very same action can be accessed from right-clicking and selecting &lt;span style="font-style: italic;"&gt;Refactor =&gt; Rename&lt;/span&gt;. The interface will allow you to preview the changes before validating them.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gUYgFSXWFEc/S_9_q_5YhHI/AAAAAAAAAEQ/d41-jw-cB4Q/s1600/acceleo_rename_preview.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 215px;" src="http://1.bp.blogspot.com/_gUYgFSXWFEc/S_9_q_5YhHI/AAAAAAAAAEQ/d41-jw-cB4Q/s320/acceleo_rename_preview.png" alt="" id="BLOGGER_PHOTO_ID_5476236048589161586" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Portions of the module elements can be extracted as new templates through right-clicking and selecting &lt;span style="font-style: italic;"&gt;Refactor =&gt; Extract Template&lt;/span&gt; (or simply using the shortcut &lt;span style="font-style: italic;"&gt;ALT+SHIFT+T&lt;/span&gt;). Do note, however, that the selected text needs to be consistent. You cannot randomly select text that spans blocks of code and expect an adequate result.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The module editor now highlights all occurrences of the selected element when you click on it. For exemple if you place the cursor on the name of a template, all invocations of this template will be highlighted and markers will appear on the right ruler of the editor to indicate them.&lt;/li&gt;&lt;li&gt;Acceleo now provide quick fixes for some of the syntax errors detected in the editor, notably the possibility to create template or queries of a corresponding name.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gUYgFSXWFEc/S_-CcbnqdQI/AAAAAAAAAEY/kyXqUvN-CX4/s1600/acceleo_quick_fixes.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 152px;" src="http://1.bp.blogspot.com/_gUYgFSXWFEc/S_-CcbnqdQI/AAAAAAAAAEY/kyXqUvN-CX4/s320/acceleo_quick_fixes.png" alt="" id="BLOGGER_PHOTO_ID_5476239096867878146" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;It is recommended to use a bottom-up approach when developing generators ; Acceleo now eases this process by allowing you to initialize the content of a generation module with an example, and offering specific actions to transform these examples (static text) in dynamic OCL expressions. For example, changing all occurrences of &lt;span style="font-family:courier new;"&gt;MyClass&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;to &lt;span style="font-family:courier new;"&gt;[c.name.toUpperFirst()/]&lt;/span&gt; in a single click.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Improvements and simplifications of the language&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;The MTL specification defines a &lt;span style="font-style: italic;"&gt;standard library&lt;/span&gt; that offers a set of utility operations; in addition, Acceleo provides a &lt;span style="font-style: italic;"&gt;non standard library&lt;/span&gt; to provide operations that greatly simplify the language and allow you to write more concise expressions, but are not part of the specification. This library has seen many additions since the 0.8 version, with things like &lt;span style="font-family:courier new;"&gt;Collections::sep(String)&lt;/span&gt; to insert a separator in-between every element contained by a collection, &lt;span style="font-family:courier new;"&gt;String::matches(String)&lt;/span&gt; to check whether a given String matches a regular expression, &lt;span style="font-family:courier new;"&gt;Collection::filter(Type)&lt;/span&gt; that can be used to filter out of a collection all elements that are not instances of a given type, &lt;span style="font-family:courier new;"&gt;Collection::reverse()&lt;/span&gt; to reverse the content of a given Collection... Take a look at the Acceleo documentation for a full reference of both standard and non standard library, along with the reference of the OCL standard library.&lt;/li&gt;&lt;li&gt;Acceleo allows you to alter the build mode, either Strict or Lax MTL compliance. Strict compliance meaning you'll get a warning for each use of a “non standard” operation.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gUYgFSXWFEc/S_-FAx7afaI/AAAAAAAAAEg/Fa2ZfeX9zPY/s1600/acceleo_compiler_compliance.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 222px;" src="http://3.bp.blogspot.com/_gUYgFSXWFEc/S_-FAx7afaI/AAAAAAAAAEg/Fa2ZfeX9zPY/s320/acceleo_compiler_compliance.png" alt="" id="BLOGGER_PHOTO_ID_5476241920354844066" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Those of you that are familiar with the 2.x stream of Acceleo will be pleased to know that Acceleo 3 now provides the same post-processing facilities as its ancestor through the addition of a &lt;span style="font-family:courier new;"&gt;post&lt;/span&gt; directive on templates. Which allows for the modification of the text generated by a template “after generation”. For example, &lt;span style="font-family:courier new;"&gt;post(trim())&lt;/span&gt; allows you to properly indent the content of the template while still leaving you the possibility to trim all unnecessary white spaces from the generated text.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gUYgFSXWFEc/S_-FkRZnU2I/AAAAAAAAAEo/todDIwlCItM/s1600/acceleo_template_posttreatment.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 38px;" src="http://2.bp.blogspot.com/_gUYgFSXWFEc/S_-FkRZnU2I/AAAAAAAAAEo/todDIwlCItM/s320/acceleo_template_posttreatment.png" alt="" id="BLOGGER_PHOTO_ID_5476242530098434914" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The “+” operator can now be used whenever one of the operands is a String for concatenation, in order to avoid the verbose &lt;span style="font-family:courier new;"&gt;concat(String)&lt;/span&gt; OCL offers.&lt;/li&gt;&lt;li&gt;You can now use properties files to customize your generations through the addition of 4 variants of a &lt;span style="font-family:courier new;"&gt;getProperty&lt;/span&gt; operation in Acceleo 3. Once again, the operation reference can be looked at for the description of those services.&lt;/li&gt;&lt;li&gt;We made use of the facilities OCL provides in order to further simplify the navigation language : iterators of our &lt;span style="font-family:courier new;"&gt;[for]&lt;/span&gt; blocks are no longer mandatory (they'll be implicitly declared if needed and &lt;span style="font-family:courier new;"&gt;self&lt;/span&gt; can be used in their stead), you no longer need qualified names for your types when the metamodel is declared on the module header (or if it can be inferred from another of the declared metamodels), casting through &lt;span style="font-family:courier new;"&gt;oclAsType&lt;/span&gt; for all redundant expressions is no longer necessary...&lt;/li&gt;&lt;li&gt;For those expressions where OCL doesn't allow us to simplify the language, we added &lt;span style="font-style: italic;"&gt;non standard&lt;/span&gt; operations. For example, &lt;span style="font-family:courier new;"&gt;sequence-&gt;select(oclIsKindOf(Type)).oclAsType(Type)&lt;/span&gt; is obviously redundant, but OCL doesn't allow for this expression not to define the explicit cast. In Acceleo, you can now write &lt;span style="font-family:courier new;"&gt;sequence-&gt;filter(Type)&lt;/span&gt; instead (see also &lt;a href="http://eclipsemde.blogspot.com/2010/05/acceleo-ocl-made-simple.html"&gt;my post on this specific issue&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Acceleo now allows for control characters (&lt;span style="font-style: italic;"&gt;\n&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;\t&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;\'&lt;/span&gt;...) in OCL expressions.&lt;/li&gt;&lt;li&gt;Acceleo &lt;span style="font-family:courier new;"&gt;[for]&lt;/span&gt; blocks now declare an implicit “i” variable that can be used to retrieve the iteration count. For example, &lt;span style="font-family:courier new;"&gt;[for (Sequence{4, 5, 6})][i/], [/for]&lt;/span&gt; will generate &lt;span style="font-style: italic;"&gt;1, 2, 3&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Documentation&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;As advertised by Jonathan in one of &lt;a href="http://jomd.blogspot.com/2010/05/acceleo-documentations-are-available.html"&gt;his latest posts&lt;/a&gt;, the Acceleo documentation is complete and can be accessed from the integrated Eclipse Help through &lt;span style="font-style: italic;"&gt;Help =&gt; Help Contents&lt;/span&gt;, in the &lt;span style="font-style: italic;"&gt;Acceleo Model To Text&lt;/span&gt; category. We provide everything you need in order to get started with Acceleo; &lt;span style="font-style: italic;"&gt;quick start&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;tutorial&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;user guide&lt;/span&gt;... and the full reference of OCL standard library and Acceleo standard and non standard libraries complete with explanations of the operations and examples.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-6074304675787198277?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/6074304675787198277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2010/06/whats-new-in-acceleo-30.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6074304675787198277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6074304675787198277'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2010/06/whats-new-in-acceleo-30.html' title='What&apos;s new in Acceleo 3.0?'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gUYgFSXWFEc/S_55MefRgcI/AAAAAAAAADo/UuSVrNLkdyg/s72-c/acceleo_result_view1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-6777444018180057708</id><published>2010-05-27T04:44:00.000-07:00</published><updated>2010-05-27T05:02:33.807-07:00</updated><title type='text'>Acceleo : OCL made simple</title><content type='html'>It was recently asked on a mailing list how one would order the elements they iterate over in an Acceleo for loop. The elements were UML ControlFlows as in :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;- Package&lt;br /&gt;|-- Activity&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;|-- ControlFlow1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;|-- ControlFlow2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;|-- ControlFlow3&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The first answer that came to mind, using standard OCL, was :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[for (cf:ControlFlow |c.ownedElement-&gt;select(a|a.oclIsKindOf(ControlFlow))-&gt;sortedBy(e: Element | e.oclAsType(ControlFlow).name))]&lt;br /&gt;...&lt;br /&gt;[/for]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pretty verbose ... If we instead make use of the implicit iterators Acceleo offers, the expression can be simplified to &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[for (c.ownedElement-&gt;select(oclIsKindOf(ControlFlow))-&gt;sortedBy(oclAsType(ControlFlow).name))] &lt;br /&gt;...&lt;br /&gt;[/for]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;But this still sports the redundancy of filtering from a list only the elements of a given type (&lt;span style="font-style:italic;"&gt;select&lt;/span&gt;) and then casting the elements to ... that very same type (&lt;span style="font-style:italic;"&gt;oclAsType&lt;/span&gt;). This is due to OCL not allowing Acceleo to infer the return type of the select operation. Starting from Acceleo 3.0, this expression can also be written&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;[for (c.ownedElement-&gt;filter(ControlFlow)-&gt;sortedBy(name))]&lt;br /&gt;...&lt;br /&gt;[/for]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now that's better!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-6777444018180057708?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/6777444018180057708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2010/05/acceleo-ocl-made-simple.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6777444018180057708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6777444018180057708'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2010/05/acceleo-ocl-made-simple.html' title='Acceleo : OCL made simple'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-6540681517776665211</id><published>2010-04-28T05:32:00.000-07:00</published><updated>2010-04-29T11:56:28.775-07:00</updated><title type='text'>Acceleo API and properties files</title><content type='html'>This post is aimed at anyone that depends on or make use of the Acceleo versions built and provided within the Helios release train, namely 0.9M1-0.9M5 and 3.0M6. If you are not concerned, feel free to ignore it altogether ^^.&lt;br /&gt;&lt;br /&gt;We added support for ".properties" files in Acceleo in the latest development version (this support appeared for 3.0M1, at the time named 0.9M1). However we realized that this first version of the properties handling left no place for customization/overriding of properties ; no place for internationalization ; and deployment of generation modules as plugins would most likely cause issues with properties lookup. &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=311045"&gt;Bug 311045&lt;/a&gt; and &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=311068"&gt;bug 311068&lt;/a&gt; have been opened to track these issues.&lt;br /&gt;&lt;br /&gt;If you are one of the early adopters that made use of the property support, you'll need to cope with a little change for the M7 build : in the generated class was an "addProperties" method which allowed you to registered the full path to the properties file that was to be loaded. For example if you had a file named "messages.properties" in package "sample" of plugin "org.eclipse.acceleo.sample", you had to register the path "platform://plugin/org.eclipse.acceleo.sample/sample/messages.properties".&lt;br /&gt;&lt;br /&gt;You will now have to return a list through the method "getProperties" (well, "addProperties" is still there yet deprecated), and this list will have to contain "sample.messages" (that is, &lt;package name&gt;.&lt;file name without extension&gt;) ; and properties file need to be located in source folders.&lt;br /&gt;&lt;br /&gt;Likewise, if you had set anything as "generated NOT" in the generated launcher, you will have to manually go through some minor API changes as we ended up creating a common superclass for all launchers. Specifically, launchers now "extends AbstractAcceleoLauncher", and what was once private or protected is now mostly public. This means previously generated launchers that had set any method as "generated NOT" might have to enhance the visibility from private to public. Take note that previously generated launchers that have been built and deployed will not fail and can still be used as is, though enabling re-use of your generator can only be done by letting Acceleo regenerate it (or simply code yourself to take these changes into account).&lt;br /&gt;&lt;br /&gt;Sorry about these changes (especially past M6), but we really thought best to remove the bug-prone behavior instead of trying to maintain it since it had never been released in a stable build. The new API should allow for a real use of property files and enhance the re-usability of any generation module.&lt;br /&gt;&lt;br /&gt;If you wish to have a look at these changes and cope with them before M7 goes live, they are all accessible in the integration build I201004291415 that went live today (see the &lt;a href="http://www.eclipse.org/modeling/m2t/downloads/?project=acceleo"&gt;download page&lt;/a&gt; for the &lt;a href="http://www.eclipse.org/modeling/download.php?file=/modeling/m2t/acceleo/downloads/drops/3.0.0/I201004291415/m2t-acceleo-SDK-incubation-I201004291415.zip"&gt;zip&lt;/a&gt; or &lt;a href="http://www.eclipse.org/modeling/download.php?file=/modeling/m2t/acceleo/downloads/drops/3.0.0/I201004291415/m2t-acceleo-Update-incubation-I201004291415.zip"&gt;all-in-one update site&lt;/a&gt; downloads).&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you have any doubt or questions about these issues, feel free to answer the m2t &lt;a href="http://www.eclipse.org/forums/index.php?t=msg&amp;th=167305&amp;start=0&amp;"&gt;newsgroup thread&lt;/a&gt; I started with a copy of this post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-6540681517776665211?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/6540681517776665211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2010/04/acceleo-api-and-properties-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6540681517776665211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6540681517776665211'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2010/04/acceleo-api-and-properties-files.html' title='Acceleo API and properties files'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-7192410425106877991</id><published>2010-04-13T06:45:00.001-07:00</published><updated>2010-04-13T08:46:33.128-07:00</updated><title type='text'>OCL tips and tricks</title><content type='html'>&lt;a href="http://wiki.eclipse.org/Acceleo"&gt;Acceleo&lt;/a&gt; is entirely based on &lt;a href="http://wiki.eclipse.org/MDT/OCL"&gt;OCL (Object Constraint Language)&lt;/a&gt; for all of its model navigation syntax. Though we did simplify it as much as possible for Acceleo (getting rid of redundant casts, increasing the standard library, overriding operators, ...), there are still some things that might cause problems to any beginning user.&lt;br /&gt;&lt;br /&gt;Here are a few of the most unsettling language particularities :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Operations or features conflicting with reserved OCL keywords (UML anyone?). For example, if your model has a class "Operation" with a feature named "body", then writing "myClass.body" in OCL will result in a somewhat cryptic error : "invalid token 'body'".&lt;/p&gt;&lt;p&gt;The trick to access such features in OCL is to prefix the feature name with an underscore. For this example, you should have written "myClass._body".&lt;/p&gt;&lt;p&gt;For the record, the full list of OCL reserved keywords as per the last available OCL version, 3.0, is as follows :&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;and&lt;/li&gt;&lt;li&gt;body&lt;br /&gt;&lt;/li&gt;&lt;li&gt;context&lt;/li&gt;&lt;li&gt;def&lt;/li&gt;&lt;li&gt;derive&lt;br /&gt;&lt;/li&gt;&lt;li&gt;else&lt;/li&gt;&lt;li&gt;endif&lt;/li&gt;&lt;li&gt;endpackage&lt;/li&gt;&lt;li&gt;if&lt;/li&gt;&lt;li&gt;implies&lt;/li&gt;&lt;li&gt;in&lt;/li&gt;&lt;li&gt;init&lt;br /&gt;&lt;/li&gt;&lt;li&gt;inv&lt;/li&gt;&lt;li&gt;let&lt;/li&gt;&lt;li&gt;not&lt;/li&gt;&lt;li&gt;or&lt;/li&gt;&lt;li&gt;package&lt;/li&gt;&lt;li&gt;post&lt;/li&gt;&lt;li&gt;pre&lt;/li&gt;&lt;li&gt;static&lt;br /&gt;&lt;/li&gt;&lt;li&gt;then&lt;/li&gt;&lt;li&gt;xor&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;Accessing enumeration values. This might sound obvious to OCL experts, but how would one compare feature values to set enumerated values? The trick here is to qualify the access. For example if you wish to check that an UML operation's visibility is "public", here is what you would do in Java : "if (operation.getVisibility() == VisibilityKind.PUBLIC".&lt;/p&gt;&lt;p&gt;The OCL equivalent is "if (operation.visibility = VisibilityKind::public)".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;There is no "elseif" in OCL ; remember to close each individual if properly with endifs : "if (...) then ... else if (...) then ... else ... endif endif"&lt;/li&gt;&lt;/ul&gt;I believe these are the most annoying (as in "the most subject to cause weird compilation errors") OCL features ; don't hesitate to add yours :p.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-7192410425106877991?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/7192410425106877991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2010/04/ocl-tips-and-tricks.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/7192410425106877991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/7192410425106877991'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2010/04/ocl-tips-and-tricks.html' title='OCL tips and tricks'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-3717786957144644951</id><published>2010-03-17T09:37:00.000-07:00</published><updated>2010-03-19T07:03:55.642-07:00</updated><title type='text'>Acceleo graduation, version jumping and maintenance</title><content type='html'>Quite a few monthes ago I talked about the &lt;a href="http://eclipsemde.blogspot.com/2009/07/acceleo-08-is-out.html"&gt;history of Acceleo and why its version number were regressing&lt;/a&gt;. Well let's talk about version jumping now :p.&lt;br /&gt;&lt;br /&gt;Acceleo is a code generator with its own history and user community ; over the years, it grew from its first stable release to its &lt;a href="http://acceleo.org/pages/download-acceleo-2-6-0/en"&gt;current 2.6 version&lt;/a&gt;. Yet, we (the Acceleo dev team) thought that the future of code generation lied in the OMG standard "MOF Model To Text Language" (MTL) based  on OCL.&lt;br /&gt;&lt;br /&gt;An important change with this version is its switch from a self-hosted project to an eclipse foundation project. Following Eclipse rules, the project "Acceleo" was required to have an incubation phase, and this incubation called for version numbers 0.*. Started a little more than two years ago, this incubation phase is almost ready for its end.&lt;br /&gt;&lt;br /&gt;We plan to have Acceleo graduate along with the Helios (Eclipse 3.6) release which is due to be out on June 2010. This usually means the  plugin grows from version 0.9 to version 1.0. However, in order not to unsettle the existing adopter community and stay coherent with Acceleo version history, we plan to have Acceleo jump from  version 0.9 (its last incubation version within Eclipse) to version 3.0  (as the last stable release of Acceleo out of Eclipse was 2.6).&lt;br /&gt;&lt;br /&gt;At first, we planned to implement the version jump after the official  release review in June 2010 ; yet to avoid unneeded unstability and after  double-checking with the Eclipse management organization, we did this  change before the last "pre-release candidate" milestone. With this latest build, Acceleo then jumps from '0.9.0M5' to '&lt;a href="http://www.eclipse.org/modeling/m2t/downloads/?project=acceleo"&gt;3.0.0M6&lt;/a&gt;'.&lt;br /&gt;&lt;br /&gt;Take good note that this version jam is for those of you who plan to give (or were already giving) the new Acceleo a try. Acceleo 3.0 already sports awesome stability and a level  of functionality close to if not equal to its 2.x stream to which you might be accustomed. As for this maintenance stream, we have a corrective version  incoming and a 2.7 version will be out any week now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-3717786957144644951?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/3717786957144644951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2010/03/acceleo-graduation-version-jumping-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/3717786957144644951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/3717786957144644951'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2010/03/acceleo-graduation-version-jumping-and.html' title='Acceleo graduation, version jumping and maintenance'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-1947709894737324870</id><published>2009-10-26T02:21:00.000-07:00</published><updated>2009-10-26T07:06:19.636-07:00</updated><title type='text'>Acceleo template editor latest improvements</title><content type='html'>We try and constantly improve the Acceleo template editor as much as we can so as to make it as intuitive as possible. I haven't posted anything here about the template editing, here is a brief recapitulation of the features we're supporting (apart from the basic functions inherited from the text editor such as search, incremental search, ...). Including the latests and in no particular order :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;font style="font-weight: bold;"&gt;Syntax highlighting&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;font&gt;A classic for any self-respecting code editor&lt;/font&gt;&lt;font&gt;, Accele&lt;/font&gt;&lt;font&gt;o p&lt;/font&gt;&lt;font&gt;rovides highlighting for all module elements, though highlighting is minimal for OCL ele&lt;/font&gt;&lt;font&gt;ments.&lt;/font&gt;&lt;font style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/font&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gUYgFSXWFEc/SuWh1jsEsMI/AAAAAAAAACw/oNHrfDYnE4I/s1600-h/Syntax_Highlight.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 277px; height: 320px;" src="http://2.bp.blogspot.com/_gUYgFSXWFEc/SuWh1jsEsMI/AAAAAAAAACw/oNHrfDYnE4I/s320/Syntax_Highlight.png" alt="" id="BLOGGER_PHOTO_ID_5396897669958643906" border="0"&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;font style="font-weight: bold;"&gt;Error detection&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;font&gt;&lt;font&gt;Once again, a classic for any editor which contents are compiled, interpreted, or in any way error-prone.&lt;/font&gt;&lt;/font&gt;&lt;font style="font-weight: bold;"&gt;&lt;font style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gUYgFSXWFEc/SuWissGPW_I/AAAAAAAAADI/eiV5wmcVDe0/s1600-h/Error_Detection.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 58px;" src="http://1.bp.blogspot.com/_gUYgFSXWFEc/SuWissGPW_I/AAAAAAAAADI/eiV5wmcVDe0/s320/Error_Detection.png" alt="" id="BLOGGER_PHOTO_ID_5396898617108683762" border="0"&gt;&lt;/a&gt;&lt;font style="font-weight: bold;"&gt;Quick fix (ctrl+shift+1)&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;Not much accessible in terms of quick fixes yet, Acceleo only provides the possibility to create templates or queries corresponding to "not found" compilation errors.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gUYgFSXWFEc/SuWis5za6II/AAAAAAAAADQ/WbYznqum8Po/s1600-h/Quick_Fix.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 102px;" src="http://1.bp.blogspot.com/_gUYgFSXWFEc/SuWis5za6II/AAAAAAAAADQ/WbYznqum8Po/s320/Quick_Fix.png" alt="" id="BLOGGER_PHOTO_ID_5396898620787845250" border="0"&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;font style="font-weight: bold;"&gt;Completion (ctrl+space)&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: left;"&gt;&lt;font&gt;We provide code completion for templates, queries, operations and OCL standard elements.&lt;/font&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gUYgFSXWFEc/SuWisR8UUjI/AAAAAAAAADA/Jgvq5DCqsBc/s1600-h/Completion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 179px;" src="http://1.bp.blogspot.com/_gUYgFSXWFEc/SuWisR8UUjI/AAAAAAAAADA/Jgvq5DCqsBc/s320/Completion.png" alt="" id="BLOGGER_PHOTO_ID_5396898610087744050" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;font style="font-weight: bold;"&gt;Open declaration (ctrl+click ; F3)&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;font&gt;Sorry, no fancy screenshot on this one, as I don't know how to make a meaningful one :p. Anyone familiar with Eclispe's Java editor knows this one; it basically allows you to find the declaration of any variable, type, operation, ... by a single click on its usage within the code. This allows navigation to and from other Acceleo templates, and to the metamodel when callin&lt;/font&gt;&lt;font&gt;g it&lt;/font&gt;&lt;font&gt; on a metatype.&lt;/font&gt;&lt;font style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font style="font-weight: bold;"&gt;Quick outline (ctrl+o)&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;This allows users to quickly assess the size of a given module, find a query or template defined in it and navigate to it through a few clicks. Note that this doesn't show as much information as the regular outline view, since it is only designed to outline the module's architecture.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gUYgFSXWFEc/SuWis27GTgI/AAAAAAAAADY/oLKc7E8UynE/s1600-h/Quick_Outline.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 254px; height: 320px;" src="http://1.bp.blogspot.com/_gUYgFSXWFEc/SuWis27GTgI/AAAAAAAAADY/oLKc7E8UynE/s320/Quick_Outline.png" alt="" id="BLOGGER_PHOTO_ID_5396898620014743042" border="0"&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;font style="font-weight: bold;"&gt;Search references (ctrl+shift+g)&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;font&gt;Still needs some polishing to only find references in the accurate scope, yet this already allows users to find references to the selected variable or template.&lt;/font&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gUYgFSXWFEc/SuWolFBPeCI/AAAAAAAAADg/QuXiHllNKjY/s1600-h/References_Search.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 173px;" src="http://3.bp.blogspot.com/_gUYgFSXWFEc/SuWolFBPeCI/AAAAAAAAADg/QuXiHllNKjY/s320/References_Search.png" alt="" id="BLOGGER_PHOTO_ID_5396905083429419042" border="0"&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;font style="font-weight: bold;"&gt;Code folding&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;Granted, a screenshot is somewhat cryptic for this feature if you do not already know what code folding is. Basically, blocks of code (in Acceleo, comments, templates and queries) can be folded so that they only take two lines. If you look carefully at the screenshot below, you'll notice the "+" on the left edge right to the line numbers "4" and "8" ... as well as the fact we're missing lines 5 and 9; well, those two templates are folded :p.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gUYgFSXWFEc/SuWisaxsU2I/AAAAAAAAAC4/h06bFf4jkgQ/s1600-h/Code_Folding.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 104px;" src="http://1.bp.blogspot.com/_gUYgFSXWFEc/SuWisaxsU2I/AAAAAAAAAC4/h06bFf4jkgQ/s320/Code_Folding.png" alt="" id="BLOGGER_PHOTO_ID_5396898612459098978" border="0"&gt;&lt;/a&gt;&lt;br /&gt;More features will be included in the editor as there's a bunch of cool features that can be added to simplify template editing; next are the refactoring facilities \o/.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-1947709894737324870?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/1947709894737324870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2009/10/acceleo-template-editor-latest.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/1947709894737324870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/1947709894737324870'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2009/10/acceleo-template-editor-latest.html' title='Acceleo template editor latest improvements'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gUYgFSXWFEc/SuWh1jsEsMI/AAAAAAAAACw/oNHrfDYnE4I/s72-c/Syntax_Highlight.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-6702866351739271766</id><published>2009-10-01T01:47:00.000-07:00</published><updated>2009-10-02T05:41:31.653-07:00</updated><title type='text'>Generate code with the right encoding</title><content type='html'>Up until now, Acceleo allowed you to define the encoding in which the module itself should be read in the form of a comment at the very beginning of the module :&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gUYgFSXWFEc/SsX0NDJ3eXI/AAAAAAAAACg/180G3ehQhl4/s1600-h/EncodingComment.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 18px;" src="http://3.bp.blogspot.com/_gUYgFSXWFEc/SsX0NDJ3eXI/AAAAAAAAACg/180G3ehQhl4/s400/EncodingComment.png" alt="" id="BLOGGER_PHOTO_ID_5387981034240833906" border="0" /&gt;&lt;/a&gt;However, this only affects how Acceleo &lt;span style="font-weight: bold;"&gt;reads&lt;/span&gt; your template file; it will not affect how Acceleo &lt;span style="font-weight: bold;"&gt;generates&lt;/span&gt; files from this module. So if you want to generate an XML file, and this XML file needs be encoded in a specific encoding which is not you system's default, you're stuck :p. Or at least that was true until M2.&lt;br /&gt;&lt;br /&gt;Let's take this basic module as an example :&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gUYgFSXWFEc/SsX0NexWJFI/AAAAAAAAACo/aRUeqpg-HZA/s1600-h/ModuleNoEncoding.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 210px;" src="http://3.bp.blogspot.com/_gUYgFSXWFEc/SsX0NexWJFI/AAAAAAAAACo/aRUeqpg-HZA/s400/ModuleNoEncoding.png" alt="" id="BLOGGER_PHOTO_ID_5387981041654178898" border="0" /&gt;&lt;/a&gt;This simple module is entirely composed of static text; its only purpose is to generate an ant file that creates a zip from a directory in a directory named "échantillons"... yes, that's an "é". If This file is generated under windows, no problem : the default windows encoding is the same as ISO-8859-1 as far as the "é" is concerned. What if this file is generated by one of your coworker who happens to be working under linux? Here's what would be generated :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gUYgFSXWFEc/SsR7cMkbynI/AAAAAAAAABo/P_-W2N1bs1I/s1600-h/WrongEncoding.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 44px;" src="http://2.bp.blogspot.com/_gUYgFSXWFEc/SsR7cMkbynI/AAAAAAAAABo/P_-W2N1bs1I/s400/WrongEncoding.png" alt="" id="BLOGGER_PHOTO_ID_5387566778582551154" border="0" /&gt;&lt;/a&gt;And that'd could be a tragedy if the error isn't seen before someone tries and run this ant build... and sees that you generated under something else that windows! Imagine all the &lt;a href="http://model-driven-blogging.blogspot.com/2008/01/chocolate-commit.html"&gt;chocolate needed to atone for that blasphemy&lt;/a&gt;! Acceleo now proposes a way to define once and for all the encoding that must be used to generate a given file, and all you need is a single parameter for the file block :&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gUYgFSXWFEc/SsSAfECK-rI/AAAAAAAAACY/qKHN833j3KY/s1600-h/FileBlockEncoding.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 333px; height: 19px;" src="http://1.bp.blogspot.com/_gUYgFSXWFEc/SsSAfECK-rI/AAAAAAAAACY/qKHN833j3KY/s400/FileBlockEncoding.png" alt="" id="BLOGGER_PHOTO_ID_5387572325389105842" border="0" /&gt;&lt;/a&gt;Take note that this is not a behaviour described by the OMG MOFM2T specification (that sadly left all encoding issues aside). As suche this feature might change form in the future, monitor the &lt;a href="http://www.omg.org/issues/mtt-rtf.open.html#Issue14437"&gt;related OMG issue&lt;/a&gt; if you're interested by this field.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-6702866351739271766?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/6702866351739271766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2009/10/generate-code-with-right-encoding.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6702866351739271766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6702866351739271766'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2009/10/generate-code-with-right-encoding.html' title='Generate code with the right encoding'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gUYgFSXWFEc/SsX0NDJ3eXI/AAAAAAAAACg/180G3ehQhl4/s72-c/EncodingComment.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-6875067780517908893</id><published>2009-07-01T03:17:00.000-07:00</published><updated>2009-07-01T06:25:07.253-07:00</updated><title type='text'>Acceleo 0.8 is out</title><content type='html'>You might already know &lt;a href="http://www.acceleo.org/pages/home/en"&gt;Acceleo 2.6&lt;/a&gt;, the open source model-to-text generator, and wonder how version 2.6 could come down to 0.8. The reason is quite simple : after four years of development outside of Eclipse, Acceleo is now taking a turn (for the better we hope :)) since we began rewriting it within Eclipse as the implementation of the OMG &lt;a href="http://www.omg.org/spec/MOFM2T/1.0/"&gt;MOF Model to text Transformation Language (MOFM2T)&lt;/a&gt; specification. This change and our becoming an &lt;a href="http://wiki.eclipse.org/M2T/MTL_Relaunch_Plan"&gt;Eclipse-hosted project&lt;/a&gt; calls for a mandatory incubation period, thus version numbers "0.x".&lt;br /&gt;&lt;br /&gt;Acceleo 0.8 already offers basic solutions to &lt;span style="font-weight: bold;"&gt;migrate existing Acceleo 2.x templates to the new syntax&lt;/span&gt;. This migration is still a draft and we are working on improving it so that most "old" templates can be migrated to the new syntax automatically, or with the least amount of manual editing needed. Compatibility with Eclipse itself is detailed on &lt;a href="http://wiki.eclipse.org/Acceleo#Compatibility"&gt;Acceleo wiki page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This first release of Acceleo as the implementation of the MOFM2T specification already provides most of the tooling that can be expected from an M2T generator. A succinct list can be found on the &lt;a href="http://wiki.eclipse.org/Acceleo/New_And_Noteworthy"&gt;New and noteworthy wiki page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-6875067780517908893?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/6875067780517908893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2009/07/acceleo-08-is-out.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6875067780517908893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/6875067780517908893'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2009/07/acceleo-08-is-out.html' title='Acceleo 0.8 is out'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-558309606571631958</id><published>2009-06-30T00:45:00.000-07:00</published><updated>2009-06-30T01:08:43.737-07:00</updated><title type='text'>EMF Compare graduated!</title><content type='html'>Galileo is out ... and with it came the graduation of EMF Compare to 1.0 at last!&lt;br /&gt;&lt;br /&gt;A great deal of improvement has been made in EMF Compare so as to improve user experience and effectiveness. This release sees the usual &lt;span style="font-weight: bold;"&gt;new differences EMF Compare detects&lt;/span&gt; (reference order changes, resource dependencies, ...), and an improved support for the various VCSs (CVS, SVN, ...).&lt;br /&gt;&lt;br /&gt;The most outstanding improvement is the ability to &lt;span style="font-weight: bold;"&gt;compare whole ResourceSets instead of a single model&lt;/span&gt;; allowing users to compare fragmented models as well as linked models (UML models referring to profiles, Genmodels referring to ecore models, ...) and thus detecting changes made in the selected models along with changes that can have taken place in their dependencies.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wiki.eclipse.org/images/4/4f/CompareResourceSet.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 658px; height: 410px;" src="http://wiki.eclipse.org/images/4/4f/CompareResourceSet.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Thanks to a &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=262928"&gt;contribution from Moritz Eysholdt&lt;/a&gt;, EMF Compare now provides a &lt;span style="font-weight: bold;"&gt;patch format for model merging&lt;/span&gt;. This EPatch format is associated with a textual syntax thanks to XText, allowing for easier editing and improved readability of these patches.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wiki.eclipse.org/images/d/d8/EPatch.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 574px; height: 431px;" src="http://wiki.eclipse.org/images/d/d8/EPatch.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The full list is available on &lt;a href="http://wiki.eclipse.org/EMF_Compare_1.0.0_New_And_Noteworthy"&gt;EMF Compare 1.0 new and noteworthy&lt;/a&gt; wiki page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-558309606571631958?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/558309606571631958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2009/06/emf-compare-graduated.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/558309606571631958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/558309606571631958'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2009/06/emf-compare-graduated.html' title='EMF Compare graduated!'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-5112940055726250371</id><published>2009-02-20T02:43:00.000-08:00</published><updated>2009-02-20T02:49:57.619-08:00</updated><title type='text'>Negative search</title><content type='html'>Dimitrios Kolovos posted &lt;a href="http://epsilonblog.wordpress.com/2008/08/05/negative-text-search-engine/"&gt;a while ago&lt;/a&gt; a plugin to allow negative searches within Eclipse (how to find a file that &lt;span style="font-style: italic;"&gt;does not contain &lt;/span&gt;a given String). I didn't want to install yet another plugin in my Eclipse and thought that regexes should allow for this.&lt;br /&gt;&lt;br /&gt;Well they do :) here's a regex that will match any file if it does not contain "Copyright" (can be quite useful, that :p).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold; color: rgb(102, 102, 204);"&gt;(?s)\A((?!Copyright).)*\Z&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-5112940055726250371?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/5112940055726250371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2009/02/negative-search.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/5112940055726250371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/5112940055726250371'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2009/02/negative-search.html' title='Negative search'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3658502096185788177.post-5565724030420979256</id><published>2009-02-09T11:16:00.000-08:00</published><updated>2009-02-09T11:47:11.010-08:00</updated><title type='text'>no more unresolvable EMF Compare failures</title><content type='html'>Ever tried using EMF Compare to compare your models only to see it fail somehow? Metamodels often evolve, making the old models unusable. Sometimes the models themselves aren't valid and cannot be loaded through EMF. On such occasion, trying to compare the files through EMF Compare simply failed, opening a blank editor and logging an exception.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gUYgFSXWFEc/SZCD0yfECyI/AAAAAAAAAAM/qKLB09xERSA/s1600-h/blankEditor.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_gUYgFSXWFEc/SZCD0yfECyI/AAAAAAAAAAM/qKLB09xERSA/s320/blankEditor.png" alt="" id="BLOGGER_PHOTO_ID_5300881704343571234" border="0" /&gt;&lt;/a&gt;That left you with no way to compare your files, save for renaming them to another extension. Well fear no more! As of 0.9M3, EMF Compare now displays a pretty error message when something goes wrong while loading the models.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gUYgFSXWFEc/SZCESu56xQI/AAAAAAAAAAU/dO21SFXtVlM/s1600-h/comparisonFailed.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 141px;" src="http://3.bp.blogspot.com/_gUYgFSXWFEc/SZCESu56xQI/AAAAAAAAAAU/dO21SFXtVlM/s320/comparisonFailed.png" alt="" id="BLOGGER_PHOTO_ID_5300882218778543362" border="0" /&gt;&lt;/a&gt;Apart from frustrating you with this all too often seen red icon, this dialog provides you with the option to compare the files as text. Oh goodie!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gUYgFSXWFEc/SZCFsVWXRYI/AAAAAAAAAAc/oA5p8CGsDJg/s1600-h/textCompare.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 162px;" src="http://3.bp.blogspot.com/_gUYgFSXWFEc/SZCFsVWXRYI/AAAAAAAAAAc/oA5p8CGsDJg/s320/textCompare.png" alt="" id="BLOGGER_PHOTO_ID_5300883758106756482" border="0" /&gt;&lt;/a&gt;Well of course, xmi isn't really a human-friendly language ... but at least this is way better than nothing to spot that stupid typo and make the model useable again :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3658502096185788177-5565724030420979256?l=eclipsemde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eclipsemde.blogspot.com/feeds/5565724030420979256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eclipsemde.blogspot.com/2009/02/no-more-unresolvable-emf-compare.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/5565724030420979256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3658502096185788177/posts/default/5565724030420979256'/><link rel='alternate' type='text/html' href='http://eclipsemde.blogspot.com/2009/02/no-more-unresolvable-emf-compare.html' title='no more unresolvable EMF Compare failures'/><author><name>Laurent Goubet</name><uri>http://www.blogger.com/profile/05605492202750997843</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_gUYgFSXWFEc/Sa-O_z0_Z2I/AAAAAAAAAAw/Ogvet6jK-7A/S220/dsc00522_crop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gUYgFSXWFEc/SZCD0yfECyI/AAAAAAAAAAM/qKLB09xERSA/s72-c/blankEditor.png' height='72' width='72'/><thr:total>3</thr:total></entry></feed>
