tag:blogger.com,1999:blog-20559152390256751222024-03-12T19:08:04.412-07:00About Eclipse, Modeling and other stuffHere I'm blogging about various topics covering Eclipse, modeling, RCP development etc.Anonymoushttp://www.blogger.com/profile/10620229111885201439noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-2055915239025675122.post-33593105179299229332016-12-22T04:43:00.001-08:002016-12-22T04:43:23.768-08:00Eclipse: Catching NullPointerException everywhere but...Want to catch NullPointerExceptions but not keep stopping on <span style="font-family: "courier new" , "courier" , monospace;">java.net.URL</span>? Use <i>Breakpoint Properties</i> and <i>Restrict to Selected Locations</i> - see how its done in the following 2 screenshots:<br />
<br />
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBTsHC-7riFnnZNRppGZ7dDBUFlLdo0lGe-KQ3IL9clr1nCnWhoHnYVi4RWbKBD65ACE7ZdgkAXTsLR5rN0zUU5c9D3W8_SfRvTo33_qlp51J-nypEVdytIIGgeR3zOCcJXcVKZ6vL1xxo/s1600/NPE-breakpoint-step1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBTsHC-7riFnnZNRppGZ7dDBUFlLdo0lGe-KQ3IL9clr1nCnWhoHnYVi4RWbKBD65ACE7ZdgkAXTsLR5rN0zUU5c9D3W8_SfRvTo33_qlp51J-nypEVdytIIGgeR3zOCcJXcVKZ6vL1xxo/s640/NPE-breakpoint-step1.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7G5A0TncfUvJVW6fxDZ6fSFlPibRghoy3jNFwYO4NexmsZXQ4k_mb2SgyB4kF2nKfxq0JbY95mPDm8AS38lYHRfRQz0nmorPk1VeUVVdPCMR4gwJUecOrEjHWw7ePiByeqByG9BNt9ZpI/s1600/NPE-breakpoint-step2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="612" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7G5A0TncfUvJVW6fxDZ6fSFlPibRghoy3jNFwYO4NexmsZXQ4k_mb2SgyB4kF2nKfxq0JbY95mPDm8AS38lYHRfRQz0nmorPk1VeUVVdPCMR4gwJUecOrEjHWw7ePiByeqByG9BNt9ZpI/s640/NPE-breakpoint-step2.png" width="640" /></a></div>
<span id="goog_1670780840"></span><span id="goog_1670780841"></span><br /></div>
Anonymoushttp://www.blogger.com/profile/10620229111885201439noreply@blogger.com0tag:blogger.com,1999:blog-2055915239025675122.post-45440272819099850452016-05-18T04:02:00.001-07:002016-05-18T04:02:27.436-07:00Eclipse and progress monitors - the old and the new story<h2>
Eclipse Progress Monitors - the old and the new story</h2>
For a long time, there was an solid article about how to use progress monitors which was what you got when you googled for info about the topic. Now, the old article is replace by a new version. We can argue about whether one is better than the other, but IMHO the key issue is that they describe different approaches, in where the older article can actually help you where your maintaining older code. So, here's both (thanks to the web archive):<br />
<br />
Old article: <a href="http://web.archive.org/web/20110902020903/http://www.eclipse.org/articles/Article-Progress-Monitors/article.html">How to Correctly and Uniformly Use Progress Monitors</a><br />
<br />
New article: <a href="https://eclipse.org/articles/Article-Progress-Monitors/article.html">Using Progress Monitors</a><br />
<br />
Happy coding - keep up the progress - maybe there's someone monitoring it...<br />
<br />
--Fredrik<br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/10620229111885201439noreply@blogger.com0tag:blogger.com,1999:blog-2055915239025675122.post-10022900606630849042015-01-30T01:44:00.001-08:002015-10-06T00:39:12.952-07:00Xtext and SVN - recovering from missing files when Xtext regenerates the src-gen folder<div style="border: 0px; color: #383838; font-family: gotham, helvetica, arial, sans-serif; font-size: 14px; line-height: 1.571428em; margin: 0px; padding: 0px;">
During the last 6 months I've been involved in a prototyping project using Xtext to express a DSL. This has been a really great learning experience exploring the world of Xtext. But some things are not that great. The site I'm working at uses Subversion and Xtext doesn't play perfectly with it. The key problem is that when running the "Generate Xtext artifacts" from your Xtext grammar, this regenerates the src-gen folders, i.e. deletes them and then regenerates the content. So if you've changed your grammar by renaming or removing a rule, the classes corresponding to the old rules will not be generated, which makes SVN nuts. The reason is that SVN will <span style="line-height: 1.571428em;">treat the deleted and no longer regenerated files as "missing" and thus Subversive refuses to commit them as a "Deleted file".</span></div>
<div style="border: 0px; color: #383838; font-family: gotham, helvetica, arial, sans-serif; font-size: 14px; line-height: 1.571428em; margin: 0px; padding: 0px;">
<br /></div>
<div style="border: 0px; color: #383838; font-family: gotham, helvetica, arial, sans-serif; font-size: 14px; line-height: 1.571428em; margin: 0px; padding: 0px;">
To recover, we can do some "magic" on the command line:</div>
<ol style="border: 0px; color: #383838; font-size: 14px; line-height: 1.571428em; list-style-position: outside; margin: 0.2857em 0px 0.714285em 2em; padding: 0px;">
<li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-family: gotham, helvetica, arial, sans-serif; line-height: 1.571428em; margin: 0px; padding: 0px;">Open a (cygwin) terminal (on Linux/OSX just a terminal)</li>
<li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-family: gotham, helvetica, arial, sans-serif; line-height: 1.571428em; margin: 0px; padding: 0px;">cd to the checked out SVN repository folder (or Eclipse project)</li>
<li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-family: gotham, helvetica, arial, sans-serif; line-height: 1.571428em; margin: 0px; padding: 0px;">run "<span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.571428em;">svn status | grep '^! '</span> to list the "missing" files</li>
<li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-family: gotham, helvetica, arial, sans-serif; line-height: 1.571428em; margin: 0px; padding: 0px;">Now, we will revert all those files and then delete them using proper svn commands</li>
<li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-family: gotham, helvetica, arial, sans-serif; line-height: 1.571428em; margin: 0px; padding: 0px;"><span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.571428em;">svn status | grep '^! ' | awk '{print $2}' | sed 's-\\-/-g' > MISSING.txt</span></li>
<ul>
<li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; line-height: 1.571428em; margin: 0px; padding: 0px;"><span style="font-family: Arial, Helvetica, sans-serif;">The 'sed' expression is only necessary on Windows, since the "backslashing" will break the following commands</span></li>
</ul>
<li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-family: gotham, helvetica, arial, sans-serif; line-height: 1.571428em; margin: 0px; padding: 0px;"><span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.571428em;">cat MISSING.txt | xargs svn revert</span></li>
<li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-family: gotham, helvetica, arial, sans-serif; line-height: 1.571428em; margin: 0px; padding: 0px;"><span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.571428em;">cat MISSING.txt | xargs svn delete</span></li>
<li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-family: gotham, helvetica, arial, sans-serif; line-height: 1.571428em; margin: 0px; padding: 0px;">Try committing again - those "missing" files should now be marked as deleted</li>
<li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-family: gotham, helvetica, arial, sans-serif; line-height: 1.571428em; margin: 0px; padding: 0px;">Clean up -> <span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.571428em;">rm MISSING.txt</span></li>
<li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-family: gotham, helvetica, arial, sans-serif; line-height: 1.571428em; margin: 0px; padding: 0px;">Close the terminal and carry on :-)</li>
</ol>
<div>
<span style="color: #383838; font-family: gotham, helvetica, arial, sans-serif;"><span style="font-size: 14px; line-height: 21.9999923706055px;">Happy Xtext:ing!</span></span><br />
<span style="color: #383838; font-family: gotham, helvetica, arial, sans-serif;"><span style="font-size: 14px; line-height: 21.9999923706055px;"><br /></span></span>
<span style="color: #383838; font-family: gotham, helvetica, arial, sans-serif;"><span style="font-size: 14px; line-height: 21.9999923706055px;"><b>PS: </b>Update - created a script to automate this: </span><span style="font-size: 14px; line-height: 22px;"><a href="https://github.com/fredrikattebrant/shell-scripts/blob/master/svn_recover_from_missing_files.sh">https://github.com/fredrikattebrant/shell-scripts/blob/master/svn_recover_from_missing_files.sh</a></span></span></div>
Anonymoushttp://www.blogger.com/profile/10620229111885201439noreply@blogger.com0tag:blogger.com,1999:blog-2055915239025675122.post-26614100176297405642012-10-18T05:14:00.002-07:002015-01-23T06:17:57.239-08:00Enabling UUIDs in an EMF ECore model<h2>
Enabling UUIDs in an EMF ECore model</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.eclipse.org/modeling/emf/images/emf_logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://www.eclipse.org/modeling/emf/images/emf_logo.png" /></a></div>
<div>
A while back we ran into the need to start using UUIDs in our ECore models. Googling a bit led me to this nice <a href="http://serdom.eu/ser/2007/03/05/how-to-enable-uuid-in-emf-generated-model-to-get-copypaste-working">blog</a> on the topic. But still one little piece of the puzzle was missing, so here I go with the full recipe and example code as well.<br />
<br />
<b>Update:</b> The above link is broken, try <a href="http://eioki.eu/2007/03/05/how-to-enable-uuid-in-emf-generated-model-to-get-copypaste-working" target="_blank">this</a> instead!</div>
<h3>
Adding UUIDs to your favorite model</h3>
<div>
We start out using the classic Library example. </div>
<div>
<ol>
<li>Get started by cloning it from <a href="http://www.blogger.com/git@github.com:fredrikattebrant/emf.uuid.library.example.git" rel="nofollow" target="_blank">here</a> - checkout the "master" branch.</li>
<li>Open the /emf.uuid.library.example/model/emf.uuid.library.example.genmodel</li>
<li>Generate All code</li>
<li>Run the editor and create an example library model with some elements and save it</li>
<li>Open the save library with Text Editor and note how the references are stored:</li>
</ol>
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><?xml version="1.0" encoding="UTF-8"?></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><emf.uuid.library.example:Library xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:emf.uuid.library.example="https://github.com/fredrikattebrant/emf.uuid.library.example/1.0" name="The library"></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <writers books="<b>//@books.0"</b> name="Fredrik Attebrant"/></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <books author=<b>"//@writers.0"</b> title="Using UUIDs in ECore models"/></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></emf.uuid.library.example:Library></span></div>
<div>
<ol start="6">
<li>Now, to add support for using UUIDs instead, open the genmodel and select the Library element</li>
<li>Set the <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Model > Resource Type</span> property to <span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b>XMI</b></span> (btw, this was the missing piece in the recipe...)</li>
<li>Regenerate the Model code</li>
<li>Add <span class="s1"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">org.eclipse.emf.ecore.xm</span>i</span><span class="s2"> </span>to the plug-in dependencies</li>
<li>Follow the steps described in the blog:</li>
<ol>
<li>Create a LibraryResourceImpl class (Override the useUUIDs() method)</li>
<li>Create a LibraryResourceFactory</li>
<li><span class="s3">Hook into the </span><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">org.eclipse.emf.ecore.extension_parser</span><span class="s3"> extension point</span></li>
</ol>
<li>Generate All code</li>
<li>Run the Library Editor again</li>
<li>Open the previously save library model</li>
<li>Make a change and save the model</li>
<li>Open it with Text Editor again and note how all elements now have UUIDs</li>
<li>Note how references are now stored using the UUID of the referenced elements:</li>
</ol>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><?xml version="1.0" encoding="UTF-8"?></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><emf.uuid.library.example:Library xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:emf.uuid.library.example="https://github.com/fredrikattebrant/emf.uuid.library.example/1.0" xmi:id="_sQQSEBj-EeKqFILuf-WxiA" name="The UUID library"></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <writers xmi:id="_sQQSERj-EeKqFILuf-WxiA" books="<b>_sQQSEhj-EeKqFILuf-WxiA"</b> name="Fredrik Attebrant"/></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> <books xmi:id="_sQQSEhj-EeKqFILuf-WxiA" author=<b>"_sQQSERj-EeKqFILuf-WxiA"</b> title="Using UUIDs in ECore models"/></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"></emf.uuid.library.example:Library></span></div>
</div>
</div>
<div>
<br /></div>
<div>
You'll find the example library models in the "librarytests" project and in the <b>uuid</b> branch, you'll find the completed example with UUIDs enabled.</div>
<div>
<br /></div>
<div>
Happy UUID-based modeling!<br />
<br />
<h4>
References</h4>
</div>
<div>
<ol>
<li><a href="https://github.com/fredrikattebrant/emf.uuid.library.example">https://github.com/fredrikattebrant/emf.uuid.library.example</a></li>
<li><a href="http://serdom.eu/ser/2007/03/05/how-to-enable-uuid-in-emf-generated-model-to-get-copypaste-working">http://serdom.eu/ser/2007/03/05/how-to-enable-uuid-in-emf-generated-model-to-get-copypaste-working</a> (<b>Update: </b>link is broken - try #3 below instead)</li>
<li><a href="http://eioki.eu/2007/03/05/how-to-enable-uuid-in-emf-generated-model-to-get-copypaste-working">http://eioki.eu/2007/03/05/how-to-enable-uuid-in-emf-generated-model-to-get-copypaste-working</a></li>
</ol>
</div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/10620229111885201439noreply@blogger.com0tag:blogger.com,1999:blog-2055915239025675122.post-66494248002111331872012-04-02T04:30:00.000-07:002012-04-04T02:37:06.642-07:00EclipseCon 2012<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.flickr.com/photos/67054631@N00/6883361606/" style="margin-left: 1em; margin-right: 1em;" title="EclipseCon2012 Cover by fxo, on Flickr"><img alt="EclipseCon2012 Cover" src="http://farm8.staticflickr.com/7199/6883361606_c99e699cf9.jpg" title="" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
This year's EclipseCon was especially exciting because my colleague <a href="http://aforsell.blogspot.se/2012/04/eclipsecon-2012.html">Anders</a> and I had a talk accepted and was one of a few highlighted sessions.<br />
<br />
<div class="p1">
Our talk was about sharing <a href="http://www.eclipsecon.org/2012/sessions/experiences-porting-commercial-rcp-application-eclipse-4x" target="_blank">our experiences of migrating</a> one of FindOut's tools to the new Rich Client Platform "RCP 2.0" in Eclipse 4.2:</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/12182548" width="425"></iframe></div>
<div class="p1">
<br />
<br />
Here are the highlights from the conference:</div>
<br />
<div class="p1">
<h4>
<b>Monday:</b></h4>
<div class="p1">
The conference started out with an excellent tutorial on writing <a href="http://www.eclipsecon.org/2012/sessions/creating-rich-clients-eclipse-rcp-4x" target="_blank">rich client applications with Eclipse RCP 4.x by Kai Toedter</a>. He also showed that the default SWT rendering engine in the platform can be replaced with Swing. He used the <a href="http://www.toedter.com/blog/?p=709" target="_blank">Napkin theme</a> for his contacts demo. Very impressive!</div>
<div class="p1">
<h4>
<b><br /></b></h4>
<h4>
<b>Tuesday:</b></h4>
</div>
<div class="p1">
Tom Schindl <a href="http://www.eclipsecon.org/2012/sessions/eclipse-4-application-platform-explained" target="_blank">explained the new application platform</a> and showed how to easily pool resources and a locale support service that he connected to google translate. The audience was asked for a language to translate to, and without restarting the application "Hello World" was switched to "Hallo Verden" (Norwegian). Impressive!</div>
<div class="p2">
<br /></div>
<div class="p1">
Brian de Alwis showed <a href="http://www.eclipsecon.org/2012/sessions/using-and-extending-css-make-your-app-stylin" target="_blank">how to style your 4.x application with CSS</a>. He also demoed the nifty CSS Spy and editors. For us who had little knowledge of CSS this tool came in real handy.</div>
<div class="p2">
<br /></div>
<div class="p1">
Alexander Nyßen gave a comprehensive <a href="http://www.eclipsecon.org/2012/sessions/gef-past-present-and-future" target="_blank">overview and history of GEF.</a> He also explained GEF4 and the main priorities to introduce there. We were especially glad that one of the bullets was to migrate GEF to use the new 4.x application platform.</div>
<div class="p1">
<br />
<h4>
<b>Wednesday:</b></h4>
</div>
<div class="p1">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.flickr.com/photos/67054631@N00/6883361690/" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;" title="e4 compatibility layer sketch by fxo, on Flickr"><img alt="e4 compatibility layer sketch" height="149" src="http://farm8.staticflickr.com/7271/6883361690_8c8edcefa5.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figuring out the compat layer</td></tr>
</tbody></table>
Tom Schindl talked about <a href="http://www.eclipsecon.org/2012/sessions/efxclipse-eclipse-tooling-and-runtime-javafx" target="_blank">e(fx)clipse</a> which is a distribution of Eclipse for creating JavaFX applications. He also showed that the default SWT rendering engine in can be replaced with JavaFX.</div>
<div class="p2">
<br /></div>
<div class="p1">
After lunch it was time for us to <a href="http://www.eclipsecon.org/2012/sessions/experiences-porting-commercial-rcp-application-eclipse-4x" target="_blank">present</a>. We were happy to see that we had about 60-70 attendees in the room. The presentation and demo went very well and we had a very good discussion with the audience during the Q/A.</div>
<div class="p2">
<a href="http://www.flickr.com/photos/67054631@N00/7029462107/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" title="Eclipse 4 BOF signup by fxo, on Flickr"><img alt="Eclipse 4 BOF signup" height="200" src="http://farm7.staticflickr.com/6211/7029462107_23a186652a.jpg" style="cursor: move;" title="Eclipse 4 BOF signup" width="150" /></a></div>
<div class="p1">
In the evening we attended the e4 BOF which was well attended with all the key people from development and a number of users. One interesting topic was how the solve the problem of having multiple dependency injection frameworks. One example is that Xtext uses Guice. It was also noted that 4.2 is lacking a documented API, something that will be addressed in 4.3. Many of the common UI components such as the Properties view, the Project Explorer and the Preference dialog need to be migrated to the new platform services.</div>
<br />
<div class="p2">
<br />
<br /></div>
<div class="p1">
<h4>
<b><br /></b></h4>
<h4>
<b>Thursday:</b></h4>
</div>
<div class="p1">
<a href="http://www.eclipsecon.org/2012/sessions/eclipse-4-meets-cdo-now-you-see-it-and-so-do-they" target="_blank">Eclipse 4 meets CDO</a> - inspiring demo of what you can do with the modeled application. Since the application model is implemented using EMF, CDO can be used to share it between multiple users. Think instant content sharing and collaboration using the application model.</div>
<div class="p2">
<br /></div>
<a href="http://www.flickr.com/photos/67054631@N00/7029462247/" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;" title="Wrap-up session by fxo, on Flickr"><img alt="Wrap-up session" height="240" src="http://farm7.staticflickr.com/6212/7029462247_1eed1b4c47.jpg" width="320" /></a>
<br />
<div class="p1">
In the <a href="http://www.eclipsecon.org/2012/closing-session" target="_blank">closing session</a> it was revealed that the conference had 650 attendees with 360 of them first-timers. 36 countries and 41 US states were represented. There were 2972 complaints on the WiFi according to Mike Milinkovic. All of this was washed down with almost 7000 beers.</div>
<div class="p2">
<br /></div>
<div class="p1">
One valuable thing for us was meeting and mingling with everyone including other swedes from companies such as Ericsson, Sandvik, IAR and Oracle...</div>
<div class="p2">
<br /></div>
<div class="p1">
It was also great to meet the e4 team face to face. We would especially like to thank Remy Suen for fixing a bug that we ran into when migrating our application.</div>
<div class="p2">
<br /></div>
<div class="p1">
Finally, a special thanks to the Eclipse Foundation for yet another great Eclipse conference!<br />
<br />
<h4>
References</h4>
<div>
<ol>
<li>We've made some example code available on <a href="https://github.com/fredrikattebrant/Simple-4x-RCP-app" target="_blank">github</a>.</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=374597" target="_blank">Bug 374597 - [Compatibility] ClassCastException when adding pure 4.x view to 3.x perspective running in compatibility mode</a></li>
</ol>
</div>
</div>
<br /></div>Anonymoushttp://www.blogger.com/profile/10620229111885201439noreply@blogger.com01200 Presidents St, Reston Town Center, Reston, VA 20190, USA38.958340924837714 -77.35563755035438.955253924837713 -77.360573050354 38.961427924837714 -77.350702050354tag:blogger.com,1999:blog-2055915239025675122.post-40091987027030360442011-11-16T01:00:00.001-08:002012-02-14T06:14:40.746-08:00Model to model mapping transformations with RSA<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.greenbookblog.org/wp-content/uploads/2011/06/Change-next-exit.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="252" src="http://www.greenbookblog.org/wp-content/uploads/2011/06/Change-next-exit.png" width="320" /></a></div>
<br />
During the last year, I've been working on a project developing a transformation between UML models and custom XML. The platform of choice was IBM Rational Software Architect (RSA) which provides very good support for creating model to model transformations. Although there is a pretty a good tutorial in the RSA Help, there are quite a few things that are tricky. Thus I thought that sharing some of the experience I made might help others facing similar challenges. So let's get down to business, here's what I'll cover in the blog:<br />
<div>
<ol>
<li>Getting setup and getting help</li>
<li>Tips for structuring model-to-model mapping projects</li>
<li>How to write custom mapping rules</li>
<li>Pattern for managing the transformation execution lifecycle</li>
<li>Aborting an executing transformation</li>
<li>Pattern for reporting transformation problems</li>
<li>Model markers and decorators</li>
</ol>
<b>1. Getting setup and getting help</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.saintraymond.net/wp-content/uploads/2009/12/help.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="135" src="http://www.saintraymond.net/wp-content/uploads/2009/12/help.jpg" width="200" /></a></div>
<b><br /></b></div>
<div>
Before you get started on extending RSA, you should make sure to install the extensibility components. Tricky enough, this does not get installed by default, so fire up IBM Installation Manager, hit Modify and make sure to check the "Extensibility" feature. When this is done, you'll have access to "everything" you need to extend this already incredibly capable tool. One funny(?) quirk is that most of the RSA help is available online from IBM's InfoCenters for the various flavors of RSA. However, the help for the extensibility - including APIs, programmers reference etc is <b>only</b> available from the local installed help. I would suspect that this is due to the on-line help being generated from the features installed by default...<br />
<br />
No matter what, it is convenient to use the on-line help for everything else. So here's a couple of links:<br />
<br />
<a href="http://publib.boulder.ibm.com/infocenter/rsarthlp/v8/index.jsp">Rational Software Architect v8 on-line help</a><br />
<a href="http://publib.boulder.ibm.com/infocenter/rsarthlp/v8/index.jsp">Rational Software Architect RealTime Edition v8 on-line help</a><br />
<br />
Now that you have the help figured out, start out by working through the tutorial on model to model mapping transformations. This will save you a lot of time. Also, when working with the mapping model editor, make sure that you have the Outline view open - otherwise you'll have a tough time navigating through your mapping model...<br />
<br />
<b>2. Tips for structuring model-to-model mapping projects</b><br />
<b><br /></b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.steeltec-nr.com/about.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="237" src="http://www.steeltec-nr.com/about.jpg" width="320" /></a></div>
The source the for the model to model mapping project is the mapping model. Typically, this is kept in a "model" folder in your model-to-model mapping project. From it, you then generate the transformation source code. In addition to this, you will typically need to write custom code. Here's where the structuring comes in handy - using a simple but clever Java package scheme, you can easily separate custom (handwritten) code from the generated code. This will allow you to simply delete all generated code to ensure that it is completely regenerated. Typical cases when this is useful, is when you remove map levels in the mapping model. Here's an example of a package structure:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>
mymappingdemo - Core classes for the transformation plug-in
mymappingdemo.custom - Here's your handwritten custom code
mymappingdemo.conditions - You may want to keep your conditions separate
mymappingdemo.l10n - Generated message strings
mymappingdemo.transforms - Generated transformation source code
</code></pre>
<br />
In this example, you can safely delete all classes in the <span style="font-family: 'Courier New', Courier, monospace;">mymappingdemo.transforms</span> package, except... Yes there is an exception. If you have modified the generated code, you will need to be careful and make sure to preserve any modified classes. In this case, you must avoid deleting any classes containing "@generated NOT" tags.<br />
<br />
<br />
<b>3. How to write custom mapping rules</b><br />
There's two ways of writing custom rules for mapping a model element from the input model to the output model:<br />
<ol>
<li>Using the inline editor</li>
<li>Creating a custom rule in an external Java class</li>
</ol>
Use the second alternative. The inline editor is just no good. It is really worse than a regular text editor. Instead create an external Java class and you'll have access to everything you expect when coding and debugging Java with Eclipse.<br />
<br />
<b>4. Pattern for managing the transformation execution lifecycle</b><br />
In many cases it is useful to be able to perform operations before and after the actual transformation. In order to do this I came up with the following approach:<br />
<br />
In the generated transformation code, there's a class <span style="background-color: white; font-family: monospace; font-size: 13px; white-space: pre;">MainTransform</span> in which you can modify the constructor:<br />
<br />
<pre style="background-color: #eeeeee; border-bottom-color: rgb(153, 153, 153); border-bottom-style: dashed; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(153, 153, 153); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(153, 153, 153); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(153, 153, 153); border-top-style: dashed; border-top-width: 1px; color: black; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 100%;"><code>
public MainTransform() {
super(TRANSFORM, Umlrt2ifmMessages.mainTransform);
LifecycleManager.register();
...
}
</code></pre>
<br />
Here I've added a call to register my "LifeCycleManager", a class which allows operations for controlling the lifecycle of "things". "Things" can be various caches etc which needs to be cleared before invoking the transformation.<br />
<br />
The key reason for introducing this type of "life cycle management" was when I realized that the transformation is only instantiated once - it is a plugin! This if you depend on things being performed at invokation or at the end of a transformation, you need a way to trigger them.<br />
<br />
Here's how my LifeCycleManager looks like:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>package mymappingdemo.custom;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import com.ibm.xtools.transform.core.IRunTransformationListener;
import com.ibm.xtools.transform.core.ITransformContext;
import com.ibm.xtools.transform.core.RunTransformationEventManager;
import com.ibm.xtools.transform.core.extension.AbstractTransformExtensionHelper;
import com.ibm.xtools.transform.core.internal.engine.TransformRunHelper;
/**
* Implements lifecycle management for the transformation<br>
* The transformation is instantiated once per RSA session, thus classes that
* persist objects which should not be cached/reused between invocations of
* the transformation must be reset (cleared). This can be done by invoking
* reset code in the {@link #onTransformationStart(ITransformContext)} method.
*
*/
public class LifecycleManager extends AbstractTransformExtensionHelper implements IRunTransformationListener {
// singleton
private static LifecycleManager instance;
private ITransformContext transformContext;
private LifecycleManager() {
}
public static LifecycleManager getDefault() {
if (instance == null) {
instance = new LifecycleManager();
RunTransformationEventManager.getInstance().addListener(instance);
}
return instance;
}
@Override
public void onTransformationStart(ITransformContext itransformcontext) {
this.transformContext = itransformcontext;
//TODO: add things to perform at the start of a transformation here:
}
@Override
public void onTransformationEnd(ITransformContext itransformcontext, IStatus istatus) {
this.transformContext = null; // nothing to cancel, transf. done
//TODO: add things to perform at the end of a transformation here:
}
/**
* Invoke this method to register the manager as a listener
* with the transformation framework
*
*/
public static void register() {
getDefault();
}
}
</code></pre>
<br />
<br />
<b>5. Aborting an executing transformation</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.gtspirit.com/wp-content/uploads/2011/04/car_crash_20_year_old_driver_destroys_gumpert_apollo_01.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="145" src="http://www.gtspirit.com/wp-content/uploads/2011/04/car_crash_20_year_old_driver_destroys_gumpert_apollo_01.jpg" width="200" /></a></div>
If we for some reason wants to abort the execution of a transformation, we can add a method <span style="font-family: monospace; font-size: 13px; white-space: pre;">cancelTransform() </span>to the class <span style="font-family: monospace; font-size: 13px; white-space: pre;">LifecycleManager,</span> which has access to the transformation context and can cancel it. This can be very useful if you detect problems during the execution of a transformation. To implement this we need to modify the class <span style="font-family: monospace; font-size: 13px; white-space: pre;">LifecycleManager. </span>First we need to add a method to support cancellation:<br />
<br />
<pre style="background-color: #eeeeee; border-bottom-color: rgb(153, 153, 153); border-bottom-style: dashed; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(153, 153, 153); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(153, 153, 153); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(153, 153, 153); border-top-style: dashed; border-top-width: 1px; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 668px;"><code> /**
* Cancels the transformation execution
*
*/
public void cancelTransform() {
if (this.transformContext == null) {
return; // nothing to cancel
}
IProgressMonitor monitor =
TransformRunHelper.getProgressMonitor(this.transformContext);
monitor.setCanceled(true);
}
</code></pre>
<br />
Unfortunately this will warn you about access restrictions, so you may want to suppress them:<br />
<span style="font-family: monospace;"><span style="font-size: 13px; white-space: pre;"><br /></span></span><br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>@SuppressWarnings(&quot;restriction&quot;) // Necessary because of: {@link LifecycleManager#cancelTransform()}
public class LifecycleManager extends AbstractTransformExtensionHelper implements IRunTransformationListener {
...
</code></pre>
<br />
Now you are ready to cancel the execution when you've detected a problem with:<br />
<br />
<pre style="background-color: #eeeeee; border-bottom-color: rgb(153, 153, 153); border-bottom-style: dashed; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(153, 153, 153); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(153, 153, 153); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(153, 153, 153); border-top-style: dashed; border-top-width: 1px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 668px;"><code><span style="font-size: 13px;">LifecycleManager.getDefault().cancelTransform();</span></code></pre>
<br />
<b>6. Pattern for reporting transformation problems</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://arulchandrana.files.wordpress.com/2009/10/problem.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="196" src="http://arulchandrana.files.wordpress.com/2009/10/problem.jpg" width="200" /></a></div>
<b><br /></b><br />
Typically, you're transformation will detect various problems when processing the input and generating the output. This can be of the typical severities info, warning and error and thus it fits right into creating problem markers. More on that in the next sections.<br />
<br />
However, we need to deal with the fact that transformation may often be executed in headless mode and thus we do not have access to the marker framework. For this, we can use a trick described by <a href="http://aniszczyk.org/2007/07/24/am-i-headless/">Chris Aniszczyk (ref #1)</a>:<br />
<br />
<br />
<pre style="background-color: #eeeeee; border-bottom-color: rgb(153, 153, 153); border-bottom-style: dashed; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(153, 153, 153); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(153, 153, 153); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(153, 153, 153); border-top-style: dashed; border-top-width: 1px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 668px;">
/**
* Detects whether running headless or not
* @return
*/
private static boolean isHeadless() {
// source: http://aniszczyk.org/2007/07/24/am-i-headless/
boolean headless = false;
Bundle b = Platform.getBundle("org.eclipse.ui");
if (b==null || b.getState() != Bundle.ACTIVE) {
headless = true;
}
return headless;
}
</pre>
<div>
<code><span style="font-size: 13px;"><br /></span></code></div>
<br />
Next we wrap this up so that we can report problems without having to think about whether we're headless or not ;-)<br />
Here's a sniplet of code that just uses regular "syserr" to print out a message in headless mode, while it calls the problem marker utility when the UI is available:<br />
<br />
<br />
<br />
<pre style="background-color: #eeeeee; border-bottom-color: rgb(153, 153, 153); border-bottom-style: dashed; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(153, 153, 153); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(153, 153, 153); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(153, 153, 153); border-top-style: dashed; border-top-width: 1px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 668px;">public class ProblemReporter {
private static boolean isHeadless() {<span style="background-color: transparent;">}
</span><span style="background-color: transparent;"> ...</span>
return headless;
}<span style="background-color: transparent;">
/**
* Reports an error message for the given model element<br>
* Prints to stderr in headless mode, else logs to the platform log
*
* @param modelElement
* @param message
*/
public static void reportError(NamedElement modelElement, String message) {
String location = modelElement.getQualifiedName();
if (isHeadless()) {
System.err.println("ERROR: location=" + location + ", message=" + message);
} else {
TransformationMarkerHelper.getDefault()</span><span style="background-color: transparent;">
.createErrorMarker(modelElement, message);
}
}
</span></pre>
<div>
<span style="background-color: transparent;"><br /></span></div>
<span style="font-family: monospace;"><span style="white-space: pre;"><br /></span></span><br />
<div>
<div>
<code><span style="font-size: 13px; white-space: pre;"><br /></span></code></div>
</div>
<b>7. Model markers and decorators</b><br />
In order to give the user feedback on problems detected during the transformation, we can use the IMarker framework. There's a good starting point in the article on "<a href="http://www.eclipse.org/articles/Article-Mark%20My%20Words/mark-my-words.html">Mark My Words</a>" (ref #2). However, a short entry here will not give this justice, so I'll followup with a separate post on the topic.<br />
<br />
Happy transforming!<br />
<br />
<b><br /></b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.eclipsecon.org/2012/sessions/experiences-porting-commercial-rcp-application-eclipse-4x" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://www.eclipsecon.org/2012/sites/eclipsecon.org.2012/files/100x100_speaking.gif?1315860456" /></a></div>
<br /></div>
<div>
<b>References:</b></div>
<div>
<ol>
<li><a href="http://aniszczyk.org/2007/07/24/am-i-headless/">Am I headless?</a> [Blog by Chris Aniszczyk]</li>
<li><a href="http://www.eclipse.org/articles/Article-Mark%20My%20Words/mark-my-words.html">Mark my words</a></li>
<li><a href="http://www.ibm.com/developerworks/opensource/tutorials/os-eclipse-plugin-guide/">Using markers, annotations, and decorators</a></li>
</ol>
<br />
<div>
<br /></div>
<div>
<br /></div>
</div>Anonymoushttp://www.blogger.com/profile/10620229111885201439noreply@blogger.com0Torshamnsgatan 30A, 164 40 Kista, Sweden59.407660736280221 17.95277595520019559.403620236280219 17.942905455200194 59.411701236280223 17.962646455200197tag:blogger.com,1999:blog-2055915239025675122.post-54140616957610023152011-04-14T05:37:00.001-07:002011-04-14T06:01:36.337-07:00Hidden features in IBM Rational Software Architect (RSA)<a href="http://jazz.net/projects/images/logos/rsa-155.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 155px; height: 115px;" src="http://jazz.net/projects/images/logos/rsa-155.png" border="0" alt="" /></a><br /><span class="Apple-style-span" >Being a very large tool, there's also an enormous amount of "hidden features" in RSA. Here I'm going to list a few of my favorites. Starting out with:</span><div><span class="Apple-style-span" ><br /></span><div><h2><span class="Apple-style-span" ><br /></span></h2><h2><span class="Apple-style-span" >Controlling the order of model elements in Project Explorer (PE)</span></h2></div><div><span class="Apple-style-span">By default, model elements are listed alphabetically in PE. Often good, but sometimes you just want to be able to control the order they are listed in - but how?</span></div><div><span class="Apple-style-span"><br /></span></div><div><span class="Apple-style-span">Well, as with some many other things, bring up the Preferences dialog (Window > Preferences) and browse to Modeling > Views > Project Explorer.</span></div><div><span class="Apple-style-span">There you'll find a section on "Project Explorer settings" in which you can modify the "Sort by" settings. Setting it to "Storage Order" gives you full control over the order of elements in PE.</span></div><div><span class="Apple-style-span"><br /></span></div><div><span class="Apple-style-span">Next, you very likely will want to to reorder the elements. With "Storage Order" you'll notice that they appear in the order that they were added to the model. </span></div><div><span class="Apple-style-span"><br /></span></div><div><span class="Apple-style-span">Reording is done by one of the more hidden features. Here's some examples:</span></div><div><span class="Apple-style-span"><br /></span></div><div><span class="Apple-style-span">Reordering contents of a UML Package:</span></div><div><ol><li><span class="Apple-style-span">Right click on the package in PE and select "Properties"</span></li><li><span class="Apple-style-span">Switch from "General" to "Advanced"</span></li><li><span class="Apple-style-span">Click in the value part of the entry for "PackagedElement" and a button marked "..." appears</span></li><li><span class="Apple-style-span">Click this button</span></li><li><span class="Apple-style-span">A new Property dialog is opened - use this to move the elements up/down to suit your needs</span></li><li><span class="Apple-style-span">Close all dialogs and enjoy</span></li></ol><span class="Apple-style-span">If you need to rearrange attributes in a class, perform the same steps, but instead of locating "PackagedElement" locate "OwnedAttribute" and perform your reordining there.</span></div><div><span class="Apple-style-span"><br /></span></div><div><span class="Apple-style-span">As this is dependent on having the "Sort by" preference set, other users will need to set the same "Sort by" as you to enjoy your model order. You may want to consider <a href="http://fredrikattebrant.blogspot.com/2011/03/controlling-eclipse-preferences.html">sharing of preferences</a> to address this issue.</span></div><div><br /></div></div>Anonymoushttp://www.blogger.com/profile/10620229111885201439noreply@blogger.com4tag:blogger.com,1999:blog-2055915239025675122.post-84689270242454811332011-03-28T05:33:00.000-07:002011-03-28T07:59:33.227-07:00Controlling Eclipse Preferences<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://png-2.findicons.com/files/icons/356/comic_tiger/128/configuration_settings.png"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 128px; height: 128px;" src="http://png-2.findicons.com/files/icons/356/comic_tiger/128/configuration_settings.png" alt="" border="0" /></a><br />Ever struggled with preference settings in Eclipse?<br />A typical case is where you have to over and over again reapply the same preferences in to new workspaces and projects. Quite tiresome.<br /><br />This problem was addressed during this years <a href="http://eclipsecon.org/">EclipseCon</a> in the talk <a href="http://www.eclipsecon.org/2011/sessions/?page=sessions&id=2057">Getting Eclipse Preferences Under Control in Teams</a>. Here we learned of three parallel projects addressing in different ways the same issue:<br /><br /><ul><li><a href="http://kenai.com/projects/ete/pages/Home">Eclipse Team Etceteras</a></li><li><a href="http://google-opensource.blogspot.com/2010/05/introducing-workspace-mechanic-for.html">Workspace Mechanic</a></li><li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=334016">Bug 334016</a></li></ul>Full presentation is available <a href="http://www.contrails.ch/econ2011/econ2011-handout.pdf">here</a>.<br /><br />Shortly after the session, I also stumbled across a post on the e4-dev list announcing yet another initiative <a href="http://code.google.com/a/eclipselabs.org/p/e4preferences/">e4preferences</a>.<br /><br />Given that there is a fair number of attempts to address various aspects of the "preference problem", I now hope that we can work together to, if not once and for all solve, but at least improve the preference sharing support for end users.<br /><br />Except for Bug 334016, there's wikis describing what they do, so I'll have a go at explaining it.<br /><br />The name of this feature is "Common Preferences" and was developed for Ericsson in order to address the problem of sharing "common preferences" between users and teams in the larger enterprise.<br /><br />It has been deployed and successfully used for about 4 years now.<br />For the end user, the typical case could be that he/she never notices that Common Preferences is there to help out. This is accomplished by installing the feature along with everything else in the Eclipse based product and having it preconfigured to set key preferences (such as network proxies etc) upon creating a workspace.<br /><br />In addition to this, the users can then add their own preferences to the list of what is to be managed. There's a neat export wizard allowing the user to identify what preferences are modified (i.e. changed from their default values) and thus helping the user to compile a Eclipse preference file which later can be imported by others in the team (including the user him/herself). It also allows the comparison of applied preferences with those defined by the Common Preferences.<br /><br />As of writing, I'm waiting for this bug to progress further through the submission process. Ideally, it could result in an improved preference sharing support in the platform, possibly by merging the key features from the various initiatives addressing this gaping hole.<br /><br />Why don't you go ahead and vote on <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=334016">bug 334016</a> ...Anonymoushttp://www.blogger.com/profile/10620229111885201439noreply@blogger.com1