<?xml version="1.0" encoding="utf-8"?>
<!-- generator="FeedCreator 1.7.2-ppt DokuWiki" -->
<?xml-stylesheet href="http://www.coconut-palm-software.com/the_new_visual_editor/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="http://www.coconut-palm-software.com/the_new_visual_editor/feed.php">
        <title>The Visual Editor blog</title>
        <description></description>
        <link>http://www.coconut-palm-software.com/the_new_visual_editor/</link>
        <image rdf:resource="http://www.coconut-palm-software.com/the_new_visual_editor/lib/images/favicon.ico" />
       <dc:date>2012-03-25T20:24:42-04:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:emf-prevayler"/>
                <rdf:li rdf:resource="http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:eclipse_10_year_retrospective_and_challenge"/>
                <rdf:li rdf:resource="http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:a_seamless_installer_updater_for_p2_applications"/>
                <rdf:li rdf:resource="http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:the_osgi_and_rcp_impedance_mismatch"/>
                <rdf:li rdf:resource="http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:new_xscalawt_feature-_assign_to_properties"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="http://www.coconut-palm-software.com/the_new_visual_editor/lib/images/favicon.ico">
        <title>The Visual Editor</title>
        <link>http://www.coconut-palm-software.com/the_new_visual_editor/</link>
        <url>http://www.coconut-palm-software.com/the_new_visual_editor/lib/images/favicon.ico</url>
    </image>
    <item rdf:about="http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:emf-prevayler">
        <dc:format>text/html</dc:format>
        <dc:date>2011-11-28T23:04:27-04:00</dc:date>
        <dc:creator>djo</dc:creator>
        <title>EMF-Prevayler, or PreMF</title>
        <link>http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:emf-prevayler</link>
        <description>


&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;

Have you ever wanted 100% transparent persistence for your memory-based EMF models?  
&lt;/p&gt;

&lt;p&gt;
As-in, after issuing one line to connect a Resource to a directory in your file system, you don&amp;#039;t have to think about persistence any longer; you just manipulate your model using regular EMF and Java code.  And all changes are automatically persisted to disk.
&lt;/p&gt;

&lt;p&gt;
If so, maybe you would like something like the following:
&lt;/p&gt;
&lt;pre class=&quot;code java&quot;&gt;&lt;span class=&quot;co1&quot;&gt;// Given the following helper method:&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;kw2&quot;&gt;private&lt;/span&gt; Resource makePersistentSystem&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AString+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;String&lt;/span&gt;&lt;/a&gt; tempDirPath&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
	Resource newSystem = &lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; XMIResourceImpl&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
	EmfPersister persister = &lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; EmfPersister&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;newSystem, tempDirPath, &lt;span class=&quot;nu0&quot;&gt;-1&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
	Resource persistentSystem = persister.&lt;span class=&quot;me1&quot;&gt;getPersistentSystemRoot&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;co1&quot;&gt;// Get the persistent decorator&lt;/span&gt;
	&lt;span class=&quot;kw2&quot;&gt;return&lt;/span&gt; persistentSystem&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co1&quot;&gt;// We can write:&lt;/span&gt;
&amp;nbsp;
&lt;a href=&quot;http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AString+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;String&lt;/span&gt;&lt;/a&gt; tempDirPath = tempDir&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;getAbsolutePath&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co1&quot;&gt;// Create a Resource and make it persistent&lt;/span&gt;
Resource persistentSystem = makePersistentSystem&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;tempDirPath&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co1&quot;&gt;// Add a Person to the persistent resource&lt;/span&gt;
Person person = factory.&lt;span class=&quot;me1&quot;&gt;createPerson&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
person.&lt;span class=&quot;me1&quot;&gt;setFirstName&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;Dave&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
persistentSystem.&lt;span class=&quot;me1&quot;&gt;getContents&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;person&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co1&quot;&gt;// Create a second (empty) Resource&lt;/span&gt;
Resource secondSystem = &lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; XMIResourceImpl&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co1&quot;&gt;// Attach it to the persistent system's directory, which will restore the &lt;/span&gt;
&lt;span class=&quot;co1&quot;&gt;// first system's contents into the second one&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; EmfPersister&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;secondSystem, tempDirPath, &lt;span class=&quot;nu0&quot;&gt;-1&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co1&quot;&gt;// Now the second system should have a *copy* of the Person above&lt;/span&gt;
assertEquals&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;, secondSystem.&lt;span class=&quot;me1&quot;&gt;getContents&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
Person restoredPerson = &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Person&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; secondSystem.&lt;span class=&quot;me1&quot;&gt;getContents&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
assertTrue&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;Structurally equal&amp;quot;&lt;/span&gt;, EcoreUtil.&lt;span class=&quot;me1&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;person, restoredPerson&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
assertFalse&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;Not the same object&amp;quot;&lt;/span&gt;, restoredPerson.&lt;span class=&quot;me1&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;person&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
What&amp;#039;s happening here is that whenever an object inside the Resource is mutated, Prevayler transparently notes this fact in a transaction journal in the specified directory.  You don&amp;#039;t have to do anything to make it happen.
&lt;/p&gt;

&lt;p&gt;
The current implementation puts a decorator around every EMF object that intercepts method calls and if they mutate state, runs them through Prevayler.  
&lt;/p&gt;

&lt;p&gt;
So far there are only two catches.
&lt;/p&gt;

&lt;p&gt;
1) When you create a new object, after adding it to a PreMF-managed object graph, you have to remember to either manually call the &lt;acronym title=&quot;Application Programming Interface&quot;&gt;API&lt;/acronym&gt; that makes the object reference itself persistent, or just get it back out of the object graph (which will give you a persistent version).
&lt;/p&gt;

&lt;p&gt;
2) #equals behaves slightly differently with persistent and non-persistent objects.  If you ask a persistent object if it is equal to a non-persistent object, it will do the right thing.  But a non-persistent object won&amp;#039;t know how to compare itself with a persistent object.  This only matters if you forget to make a new object reference persistent after adding it to the persistent object graph (as described in #1).
&lt;/p&gt;

&lt;p&gt;
The current experimental implementation just makes the contents of XMLResource#getContents() persistent.  Work is underway to make the rest of the EMF &lt;acronym title=&quot;Application Programming Interface&quot;&gt;API&lt;/acronym&gt; persistent the same way.
&lt;/p&gt;

&lt;p&gt;
Does this sound interesting/exciting?
&lt;/p&gt;

&lt;p&gt;
I&amp;#039;m still an EMF newbie.  Details of the approach/design are in the README.md on GitHub:
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/pieceoftheloaf/emf-prevayler&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/pieceoftheloaf/emf-prevayler&quot;  rel=&quot;nofollow&quot;&gt;https://github.com/pieceoftheloaf/emf-prevayler&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
I&amp;#039;d love to hear what people think of this and/or if there&amp;#039;s a better way to accomplish the same thing.
&lt;/p&gt;

&lt;/div&gt;
&lt;span class=&quot;plugin_feedmod_comments&quot;&gt;
  &lt;a href=&quot;http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:emf-prevayler#discussion__section&quot; title=&quot;Read or add comments to this article&quot;&gt;Read or add comments to this article&lt;/a&gt;
&lt;/span&gt;
</description>
    </item>
    <item rdf:about="http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:eclipse_10_year_retrospective_and_challenge">
        <dc:format>text/html</dc:format>
        <dc:date>2011-10-06T13:30:11-04:00</dc:date>
        <dc:creator>djo</dc:creator>
        <title>Eclipse 10 year Retrospective and Challenge</title>
        <link>http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:eclipse_10_year_retrospective_and_challenge</link>
        <description>


&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;

On his blog, &lt;a href=&quot;http://ianskerrett.wordpress.com/2011/10/04/when-did-you-join-the-eclipse-community/&quot; class=&quot;urlextern&quot; title=&quot;http://ianskerrett.wordpress.com/2011/10/04/when-did-you-join-the-eclipse-community/&quot;  rel=&quot;nofollow&quot;&gt;Ian Skerrett invites people to comment on when/how they joined Eclipse&lt;/a&gt;.  As I responded, I found I was sort of writing an Agile Retrospective.  Since those thoughts felt like they might be valuable on a larger scale, I am repeating them here.
&lt;/p&gt;

&lt;p&gt;
I became a member of the Eclipse Consortium during the year that we were creating the Foundation. I will never forget the Consortium’s last meeting held at the American Airlines conference facility in Dallas where the mood was festive because we had done what we set out to do–we had created the Eclipse Foundation and we were officially handing the keys to Eclipse over to them.
&lt;/p&gt;

&lt;p&gt;
My official job was to represent a small software development company that made a good living adding value to IBM’s iSeries tooling built on top of Eclipse. Unofficially, I became a voice for many small companies and especially for the community of open source developers.
&lt;/p&gt;

&lt;p&gt;
This led to interesting opportunities: One was the opportunity to negotiate on a conference call with the big company lawyers about how the patent retaliation clause in the EPL would work out in practice for software developers. Many software developers have a very negative view of corporate lawyers, but these were clearly on our side, had a clue, and were a joy to work with. On the other hand, I had a very engaging conversation with Richard Stallman about the relationship between Free Software and Open Source (and Eclipse in particular) when the Free Software community urged us to make the EPL compatible with the &lt;acronym title=&quot;GNU General Public License&quot;&gt;GPL&lt;/acronym&gt;.
&lt;/p&gt;

&lt;p&gt;
(Over the years, Eclipse has truly attracted some of the best of the best minds I have ever worked with.)
&lt;/p&gt;

&lt;p&gt;
In the end, the EPL and &lt;acronym title=&quot;GNU General Public License&quot;&gt;GPL&lt;/acronym&gt; have managed to coexist inside Linux distributions, and I personally appreciate both the passion of the hard-core Linux community and the powerful pragmatism the Eclipse community had when it created a truly symbiotic relationship between big corporations and open-source.
&lt;/p&gt;

&lt;p&gt;
In my own view, it is this powerful pragmatism combined with open-source symbiotic coopetition that has made, and continues to make the Eclipse community great.
&lt;/p&gt;

&lt;p&gt;
Looking forward, I believe that the biggest challenge Eclipse (and, indeed all of Java) faces is that we are hitting the complexity wall of what can be done with the Java language. OSGi goes a long way toward helping on one front. EMF helps a lot on another.
&lt;/p&gt;

&lt;p&gt;
The challenge I would put before the community today is to embrace and incorporate the emerging agile/functional languages like Scala, Groovy, JRuby fully into the Eclipse, Modeling, and OSGi ecosystems.
&lt;/p&gt;

&lt;p&gt;
This will continue to ensure that the small developer with the New, Cool idea has a powerful enough lever that we will continue to see awesome ideas like Mylyn and many of the EMF ideas sprout, take hold, and grow up within the Eclipse ecosystem.
&lt;/p&gt;

&lt;/div&gt;
&lt;span class=&quot;plugin_feedmod_comments&quot;&gt;
  &lt;a href=&quot;http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:eclipse_10_year_retrospective_and_challenge#discussion__section&quot; title=&quot;Read or add comments to this article&quot;&gt;Read or add comments to this article&lt;/a&gt;
&lt;/span&gt;
</description>
    </item>
    <item rdf:about="http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:a_seamless_installer_updater_for_p2_applications">
        <dc:format>text/html</dc:format>
        <dc:date>2011-10-06T13:25:26-04:00</dc:date>
        <dc:creator>djo</dc:creator>
        <title>A seamless installer/updater for P2 applications</title>
        <link>http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:a_seamless_installer_updater_for_p2_applications</link>
        <description>


&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;

As promised, I&amp;#039;ve &lt;a href=&quot;https://github.com/pieceoftheloaf/SynchronizeOperation&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/pieceoftheloaf/SynchronizeOperation&quot;  rel=&quot;nofollow&quot;&gt;updated the P2 updater/installer example&lt;/a&gt; that Patrick Paulin and I presented at EclipseCon to demonstrate how to use this code in a production manner.
&lt;/p&gt;

&lt;p&gt;
Here&amp;#039;s the &lt;a href=&quot;http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2329&quot; class=&quot;urlextern&quot; title=&quot;http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2329&quot;  rel=&quot;nofollow&quot;&gt;original EclipseCon session announcement&lt;/a&gt;.  And the &lt;a href=&quot;https://github.com/pieceoftheloaf/osgi-arch-patterns&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/pieceoftheloaf/osgi-arch-patterns&quot;  rel=&quot;nofollow&quot;&gt;original EclipseCon presentation and code examples we used back at the conference&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Enjoy!
&lt;/p&gt;

&lt;/div&gt;
&lt;span class=&quot;plugin_feedmod_comments&quot;&gt;
  &lt;a href=&quot;http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:a_seamless_installer_updater_for_p2_applications#discussion__section&quot; title=&quot;Read or add comments to this article&quot;&gt;Read or add comments to this article&lt;/a&gt;
&lt;/span&gt;
</description>
    </item>
    <item rdf:about="http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:the_osgi_and_rcp_impedance_mismatch">
        <dc:format>text/html</dc:format>
        <dc:date>2011-03-14T23:15:45-04:00</dc:date>
        <dc:creator>djo</dc:creator>
        <title>The OSGi Building Block Pattern: An Invitation</title>
        <link>http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:the_osgi_and_rcp_impedance_mismatch</link>
        <description>


&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;

Have you ever wondered why it seems so hard to come up the OSGi or RCP learning curve?  Or, if you&amp;#039;re already an OSGi expert, why beginners seem to have so much trouble “getting it”?
&lt;/p&gt;

&lt;p&gt;
I believe one reason is that &lt;strong&gt;there is an impedance mismatch between the way OSGi applications are built and the way the Eclipse IDE works.&lt;/strong&gt;  More importantly, I believe that understanding this impedance mismatch illuminates a very fundamental architectural pattern in OSGi development that I call the &lt;strong&gt;&lt;em&gt;OSGi Building Block&lt;/em&gt;&lt;/strong&gt; pattern.
&lt;/p&gt;

&lt;p&gt;
In this blog article, I will discuss the &lt;em&gt;OSGi Building Block&lt;/em&gt; pattern in the abstract.  
&lt;/p&gt;

&lt;p&gt;
Next week at EclipseCon, Patrick Paulin and I will &lt;strong&gt;deliver real code&lt;/strong&gt; showing how to leverage this pattern to make Eclipse RCP and server-side OSGi application development much easier (&lt;a href=&quot;http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2329&quot; class=&quot;urlextern&quot; title=&quot;http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2329&quot;  rel=&quot;nofollow&quot;&gt;Architecture Patterns and Code Templates for Enterprise RCP Applications&lt;/a&gt;).
&lt;/p&gt;

&lt;/div&gt;
&lt;h2&gt;&lt;a name=&quot;what_is_the_osgi_eclipse_impedance_mismatch&quot; id=&quot;what_is_the_osgi_eclipse_impedance_mismatch&quot;&gt;What is the OSGi/Eclipse Impedance Mismatch?&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Consider this thought: 
&lt;/p&gt;

&lt;p&gt;
Eclipse works in terms of projects and dependencies.  &lt;strong&gt;But no single project can fully define a production-quality OSGi application.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
Why?
&lt;/p&gt;

&lt;p&gt;
Let&amp;#039;s use Eclipse RCP as an example:
&lt;/p&gt;

&lt;p&gt;
An RCP developer might first use the “RCP Application with a View” wizard to create her initial RCP application.  This wizard generates a &lt;strong&gt;single project&lt;/strong&gt; defining a &lt;strong&gt;single OSGi Bundle.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
Then the average beginner clicks the “Run” button to launch the platform and to see the wizard&amp;#039;s result.
&lt;/p&gt;

&lt;p&gt;
But in order to deploy the application, an RCP developer must create at least the following extra artifact(s):

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; A Product configuration&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

and normally for an enterprise-class project:

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; A Feature definition (for her bundle)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; A releng project to drive either Maven/Tycho or PDEBuild.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

And there is nowhere that I am aware that documents all of these steps in one place.  So a beginning RCP developer may flounder for months before he realizes what the minimal ingredients are in a production-ready Eclipse RCP application.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;What is the OSGi/Eclipse Impedance Mismatch?&quot; [1013-2110] --&gt;
&lt;h3&gt;&lt;a name=&quot;what_are_the_minimal_osgi_rcp_ingredients&quot; id=&quot;what_are_the_minimal_osgi_rcp_ingredients&quot;&gt;What are the minimal OSGi/RCP ingredients?&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

For a Feature-based RCP product, the minimal building-block for a production-quality application can be represented by the following quad:
&lt;/p&gt;
&lt;pre class=&quot;code xml&quot;&gt;(Bundle+, Feature+, Product, Releng)&lt;/pre&gt;
&lt;p&gt;
[The trailing plus sign signifies “one or more”, just like in a grammar.]
&lt;/p&gt;

&lt;p&gt;
In other words, for production purposes, the *minimal* RCP application is:

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; One or more Bundles&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Contained in one or more Features&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; In a Product configuration&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Built by some sort of release engineering project (e.g.: Maven/Tycho or PDEBuild)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

But Eclipse provides no wizards to create all of these things at once.  Eclipse provides no refactorings to keep all of these things in sync as they change over time.
&lt;/p&gt;

&lt;p&gt;
The Eclipse RCP wizard and the Eclipse IDE want us to think in projects.  But OSGi wants us to think in terms of deployable bundles.  Eclipse requires the OSGi (RCP, server-side) developer to keep this entire model in his head, and to manage it manually.
&lt;/p&gt;

&lt;p&gt;
(I think I mentioned that we will &lt;a href=&quot;http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2329&quot; class=&quot;urlextern&quot; title=&quot;http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2329&quot;  rel=&quot;nofollow&quot;&gt;deliver simple code&lt;/a&gt; illustrating all of this next week? &lt;img src=&quot;http://www.coconut-palm-software.com/the_new_visual_editor/lib/images/smileys/icon_wink.gif&quot; class=&quot;middle&quot; alt=&quot;;-)&quot; /&gt; )
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;What are the minimal OSGi/RCP ingredients?&quot; [2111-3284] --&gt;
&lt;h2&gt;&lt;a name=&quot;what_about_other_osgi_uses&quot; id=&quot;what_about_other_osgi_uses&quot;&gt;What about other OSGi uses?&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Wait!  There&amp;#039;s more!
&lt;/p&gt;

&lt;p&gt;
The same principle applies for server-side OSGi, just with different names for the parts!  For example, Virgo has the following minimal building-block:
&lt;/p&gt;
&lt;pre class=&quot;code xml&quot;&gt;(Bundle+, Plan+, ContainerConfig, Releng)&lt;/pre&gt;
&lt;p&gt;
(Okay, I know you can deploy bundles to a WAR, but my understanding is that Plan files are the “new and approved” way to work with Virgo.)
&lt;/p&gt;

&lt;p&gt;
And an OSGi bundle, deployed via P2 is the following minimal set of things:
&lt;/p&gt;
&lt;pre class=&quot;code xml&quot;&gt;(Bundle+, Feature+, P2RepoProject, Releng)&lt;/pre&gt;
&lt;p&gt;
Viewing OSGi this way has helped me think about RCP applications much more clearly, because the number of distinct concepts I have to keep track of suddenly just went to 4.
&lt;/p&gt;

&lt;p&gt;
It has also helped me understand how to design my builds in a modular way, because &lt;a href=&quot;http://divby0.blogspot.com/2011/01/simplifying-p2-process-part-1-p2.html&quot; class=&quot;urlextern&quot; title=&quot;http://divby0.blogspot.com/2011/01/simplifying-p2-process-part-1-p2.html&quot;  rel=&quot;nofollow&quot;&gt;as Nick Boldt blogged&lt;/a&gt;, a build&amp;#039;s target platform can be composed of multiple P2 repositories, which can be the result of prior builds.  In other words, my build can consume its own output.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;What about other OSGi uses?&quot; [3285-4366] --&gt;
&lt;h2&gt;&lt;a name=&quot;general_form_of_the_osgi_building_block_pattern&quot; id=&quot;general_form_of_the_osgi_building_block_pattern&quot;&gt;General form of the OSGi Building Block Pattern&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

I call this &lt;strong&gt;OSGi quad&lt;/strong&gt; the &lt;em&gt;“OSGi Building Block”&lt;/em&gt; pattern because it comes up frequently in one form or another in nearly all flavors of OSGi software development.  The general form can be described as:
&lt;/p&gt;
&lt;pre class=&quot;code xml&quot;&gt;(Bundle+, Packaging+, Deployment, Release engineering)&lt;/pre&gt;
&lt;p&gt;
I believe there are two powerful ramifications to this:

&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Having standard names for things helps us to talk and reason about them.  Understanding the &lt;em&gt;OSGi Building Block&lt;/em&gt; pattern is the key to making OSGi (in all its forms) simple and easy.  &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Direct tool support for the &lt;em&gt;OSGi Building Block&lt;/em&gt; pattern:  Maven archetypes, IDE wizards, and IDE refactorings would all be beneficial.  Ultimately, these things will help to drive OSGi&amp;#039;s TCO down and drive OSGi as an enterprise standard.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;General form of the OSGi Building Block Pattern&quot; [4367-5208] --&gt;
&lt;h2&gt;&lt;a name=&quot;invitation_to_the_community&quot; id=&quot;invitation_to_the_community&quot;&gt;Invitation to the community&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;

Following this second point, I would like to issue the following challenge and invitation to the OSGi community:

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; When things represent the same idea, let&amp;#039;s try to standardize the terms we use to describe them.  For example, I propose that we use the term &lt;em&gt;“Packaging”&lt;/em&gt; to describe the singular concept represented by both a Plan and a Feature.  But as the experts, does that make sense to you?&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Since developers deal with OSGi applications in terms of repeating instances of this minimal quad, let&amp;#039;s give them IDE tooling to let them deal with each instance of this quad as a discrete unit.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Invitation to the community&quot; [5209-5851] --&gt;
&lt;h3&gt;&lt;a name=&quot;invitation_to_bof&quot; id=&quot;invitation_to_bof&quot;&gt;Invitation to BoF&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;

To facilitate these discussions, I would like to invite all of the OSGi stakeholders to a BoF session this coming week at EclipseCon.
&lt;/p&gt;

&lt;p&gt;
I think that OSGi&amp;#039;s future is bright, and I think that by driving concrete plans to improve developers&amp;#039; lives using the &lt;em&gt;OSGi Building Block&lt;/em&gt; pattern, we can help.
&lt;/p&gt;

&lt;p&gt;

(And one final plug for Patrick and my session next week:)
&lt;/p&gt;

&lt;p&gt;
If you&amp;#039;re wondering why and how this makes OSGi development simple, come to our tutorial next week at EclipseCon: &lt;a href=&quot;http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2329&quot; class=&quot;urlextern&quot; title=&quot;http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2329&quot;  rel=&quot;nofollow&quot;&gt;Architecture Patterns and Code Templates for Enterprise RCP Applications&lt;/a&gt;.  Next week Patrick Paulin and I will make all of these abstract ideas concrete with real code you can take with you and use as the basis for your next project.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- SECTION &quot;Invitation to BoF&quot; [5852-] --&gt;&lt;span class=&quot;plugin_feedmod_comments&quot;&gt;
  &lt;a href=&quot;http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:the_osgi_and_rcp_impedance_mismatch#discussion__section&quot; title=&quot;Read or add comments to this article&quot;&gt;Read or add comments to this article&lt;/a&gt;
&lt;/span&gt;
</description>
    </item>
    <item rdf:about="http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:new_xscalawt_feature-_assign_to_properties">
        <dc:format>text/html</dc:format>
        <dc:date>2011-02-11T22:06:39-04:00</dc:date>
        <dc:creator>djo</dc:creator>
        <title>New XScalaWT feature- Assign to properties</title>
        <link>http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:new_xscalawt_feature-_assign_to_properties</link>
        <description>


&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;

In XScalaWT, to set a layout, you previously would write (same as Java):
&lt;/p&gt;
&lt;pre class=&quot;code java&quot;&gt;setLayout&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; FillLayout&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Now, you can write:
&lt;/p&gt;
&lt;pre class=&quot;code java&quot;&gt;layout = &lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; FillLayout&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Most SWT properties now work this way.  So for example instead of using setters everywhere you can now write code like:
&lt;/p&gt;
&lt;pre class=&quot;code java&quot;&gt;progressBar&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;
   minimum = &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;,
   maximum = &lt;span class=&quot;nu0&quot;&gt;50&lt;/span&gt;,
   selection = &lt;span class=&quot;nu0&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Which is much cleaner and easier to follow.
&lt;/p&gt;

&lt;p&gt;
Thanks much to Jean-Philippe Pellet for the idea and implementation of this feature!
&lt;/p&gt;

&lt;p&gt;
XScalawt can be found on GitHub at: &lt;a href=&quot;https://github.com/pieceoftheloaf/XScalaWT/tree/gh-pages&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/pieceoftheloaf/XScalaWT/tree/gh-pages&quot;  rel=&quot;nofollow&quot;&gt;https://github.com/pieceoftheloaf/XScalaWT/tree/gh-pages&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;span class=&quot;plugin_feedmod_comments&quot;&gt;
  &lt;a href=&quot;http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:new_xscalawt_feature-_assign_to_properties#discussion__section&quot; title=&quot;Read or add comments to this article&quot;&gt;Read or add comments to this article&lt;/a&gt;
&lt;/span&gt;
</description>
    </item>
</rdf:RDF>

