<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>holistic tendencies</title>
	<atom:link href="http://holistictendencies.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://holistictendencies.wordpress.com</link>
	<description>keeping an eye on the bigger picture</description>
	<lastBuildDate>Thu, 19 Jan 2012 20:10:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='holistictendencies.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/523abc6bedd6893ec4c40489590879f4?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>holistic tendencies</title>
		<link>http://holistictendencies.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://holistictendencies.wordpress.com/osd.xml" title="holistic tendencies" />
	<atom:link rel='hub' href='http://holistictendencies.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Truly headless AWT operation on MacOS X</title>
		<link>http://holistictendencies.wordpress.com/2011/10/13/truly-headless-awt-operation-on-macos-x/</link>
		<comments>http://holistictendencies.wordpress.com/2011/10/13/truly-headless-awt-operation-on-macos-x/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 03:41:26 +0000</pubDate>
		<dc:creator>Brian de Alwis</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[swdev]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[macosx]]></category>
		<category><![CDATA[swt]]></category>

		<guid isPermaLink="false">http://holistictendencies.wordpress.com/?p=205</guid>
		<description><![CDATA[I&#8217;ve been trying to debug some Java code called from within a BIRT web service on MacOS&#160;X.  But the requests would hang as the BIRT report viewer would attempt to query the system&#8217;s printers with javax.print.PrintServiceLookup, which in turn loaded AWT and then hangs calling out to apple.awt.CToolkit#runningInHiDPI(), a native method on Apple&#8217;s native Toolkit [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=205&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been trying to debug some Java code called from within a BIRT web service on MacOS&nbsp;X.  But the requests would hang as the BIRT report viewer would attempt to query the system&#8217;s printers with <tt>javax.print.PrintServiceLookup</tt>, which in turn loaded AWT and then hangs calling out to <tt>apple.awt.CToolkit#runningInHiDPI()</tt>, a native method on Apple&#8217;s native Toolkit implementation.</p>
<p>Unfortunately specifying the property <tt>java.awt.headless=true</tt> wasn&#8217;t quite sufficient: this setting still results in Apple&#8217;s <tt>CToolkit</tt> being loaded (in <tt>java.awt.Toolkit#getDefaultToolkit()</tt>), but it would then be wrapped in a <tt>HeadlessToolkit</tt>.  So my process would still hang.</p>
<p>After poking around a bit further, I discovered that the JRE includes a different headless toolkit implementation called <tt>sun.awt.HToolkit</tt>.  This headless toolkit can be configured using the <tt>awt.toolkit</tt> property as follows:</p>
<blockquote>
<pre>-Djava.awt.headless=true
-Dawt.toolkit=sun.awt.HToolkit</pre>
</blockquote>
<p>With these settings, my debugging is now hang free.  I&#8217;m not sure why this toolkit implementation is not used on <tt>java.awt.headless=true</tt>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/holistictendencies.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/holistictendencies.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/holistictendencies.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/holistictendencies.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/holistictendencies.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/holistictendencies.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/holistictendencies.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/holistictendencies.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/holistictendencies.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/holistictendencies.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/holistictendencies.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/holistictendencies.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/holistictendencies.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/holistictendencies.wordpress.com/205/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=205&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://holistictendencies.wordpress.com/2011/10/13/truly-headless-awt-operation-on-macos-x/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/314e900bfc8465298237ce04be8b1355?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bsd</media:title>
		</media:content>
	</item>
		<item>
		<title>Remote debugging of Java apps from behind firewalls</title>
		<link>http://holistictendencies.wordpress.com/2011/07/27/remote-debugging-of-java-apps-from-behind-firewalls/</link>
		<comments>http://holistictendencies.wordpress.com/2011/07/27/remote-debugging-of-java-apps-from-behind-firewalls/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 14:31:26 +0000</pubDate>
		<dc:creator>Brian de Alwis</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[swdev]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://holistictendencies.wordpress.com/?p=199</guid>
		<description><![CDATA[I was recently in a situation where I had a client experiencing a problem in a Java app that I couldn’t recreate on my machine. The only solution was to do some remote debugging. Unfortunately both he and I were behind NAT firewalls, circumstances that neither one of us could change. Fortunately SSH provides a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=199&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was recently in a situation where I had a client experiencing a problem in a Java app that I couldn’t recreate on my machine. The only solution was to do some remote debugging. Unfortunately both he and I were behind NAT firewalls, circumstances that neither one of us could change.</p>
<p>Fortunately SSH provides a solution through port forwarding, providing you have some publicly accessible host to serve as an intermediate. The process is made a bit more complicated as my intermediate host only allows incoming connections on particular ports. So I needed to set up a two sets of port-forwarding. As I always end up confusing myself with the meanings of SSH’s “-L” and “-R”, I thought I’d write up the recipe (mostly for my own benefit).</p>
<p>In the following I’ll use “C” to refer to the client’s remote machine, “L” to refer to my own machine, and “I” for the publicly-accessible host. Basically I needed to forward a port (C) from the remote machine to the intermediate (I<sub>p</sub>), and then a port from the intermediate (I<sub>p</sub>) to my local machine (L<sub>p</sub>). The client’s app was configured to connect to C<sub>p</sub>, and my debugger configured to wait for an incoming connection on port L<sub>p</sub>. In my case I used L<sub>p</sub> = C<sub>p</sub> = 8000 and I<sub>p</sub> = 6789 to avoid as much confusion as possible!</p>
<ol>
<li>On L (my dev machine): start a debugging session listening on port C<sub>p</sub> (8000). In Eclipse, this means setting the Connection Type to “Standard (Socket Listen)”.</li>
<li>On C (client’s machine): cause connections to the port C<sub>p</sub> (8000) on the client’s machine to be forwarded to I<sub>p</sub>on the intermediate:
<pre>$ ssh -L 8000:localhost:6789 account@intermediate sleep 3000</pre>
</li>
<li>On L (my dev machine): cause connections to port I<sub>p</sub> (6789) on the intermediate to be forwarded to L<sub>p</sub>(8000) on my local dev machine:
<pre>$ ssh -R 6789:localhost:8000 account@intermediate sleep 3000</pre>
</li>
<li>On C (client’s machine): start the app; if you want it to suspend immediately on start, change the “<code>suspend=n</code>” to “<code>suspend=y</code>”:
<pre>$ java -Xdebug -Xnoagent \
  -Xrunjdwp:transport=dt_socket,address=8000,server=n,suspend=n \
  <em>…appargs…</em></pre>
<p>or for Eclipse deployed apps:</p>
<pre>$ rcplauncher <em>…appargs…</em> \
  -vmargs -Xdebug -Xnoagent \
    -Xrunjdwp:transport=dt_socket,address=8000,server=n,suspend=n</pre>
</li>
</ol>
<p><a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">Plink</a> from the PuTTY distribution is a great SSH implementation for Windows machines.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/holistictendencies.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/holistictendencies.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/holistictendencies.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/holistictendencies.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/holistictendencies.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/holistictendencies.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/holistictendencies.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/holistictendencies.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/holistictendencies.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/holistictendencies.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/holistictendencies.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/holistictendencies.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/holistictendencies.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/holistictendencies.wordpress.com/199/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=199&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://holistictendencies.wordpress.com/2011/07/27/remote-debugging-of-java-apps-from-behind-firewalls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/314e900bfc8465298237ce04be8b1355?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bsd</media:title>
		</media:content>
	</item>
		<item>
		<title>Debugging BIRT</title>
		<link>http://holistictendencies.wordpress.com/2011/07/06/debugging-birt/</link>
		<comments>http://holistictendencies.wordpress.com/2011/07/06/debugging-birt/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 18:19:22 +0000</pubDate>
		<dc:creator>Brian de Alwis</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[swdev]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[birt]]></category>
		<category><![CDATA[debugging]]></category>

		<guid isPermaLink="false">http://holistictendencies.wordpress.com/?p=188</guid>
		<description><![CDATA[I&#8217;ve recently been doing some client work with BIRT reports. Although BIRT is a surprisingly powerful reporting framework with support for embedding JavaScript, debugging a failing report is a bear. Unfortunately I have yet to find a nice compendium of debugging advice. So without further ado, here are some tips and tricks I&#8217;ve stumbled across. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=188&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently been doing some client work with BIRT reports.  Although BIRT is a surprisingly powerful reporting framework with support for embedding JavaScript, debugging a failing report is a bear.  Unfortunately I have yet to find a nice compendium of debugging advice.  </p>
<p>So without further ado, here are some tips and tricks I&#8217;ve stumbled across.  I&#8217;ll amend this post with updates.  Feel free to contribute your own in the comments!</p>
<p>[Updated 2011/07/21: add note about EngineException]</p>
<h2>Debugging Problems in JavaScript Code</h2>
<p>BIRT uses the Mozilla Rhino execution engine to process its JavaScript.  To trap various JavaScript errors, place breakpoints on the following exceptions:</p>
<ul>
<li><tt>org.mozilla.javascript.RhinoError</tt></li>
<li><tt>org.mozilla.javascript.EcmaError</tt>: thrown on missing methods</li>
<li><tt>org.mozilla.javascript.EvaluatorException</tt></li>
<li><tt>org.mozilla.javascript.JavaScriptException</tt></li>
<li><tt>org.mozilla.javascript.RhinoException</tt></li>
</ul>
<p>I&#8217;ve found that it&#8217;s also useful to put a breakpoint on <tt>org.eclipse.birt.report.engine.api.EngineException</tt> as this seems to be thrown when there is a calculation error of some kind within the report.  If you&#8217;re getting an error displayed like:</p>
<blockquote><p>
Errors occurred when generating the report document for the report element with 2906
</p></blockquote>
<p>then you&#8217;re likely encountering an NPE or division-by-zero error in your JavaScript code.</p>
<p><tt>org.eclipse.birt.report.engine.api.ViewerException</tt> is thrown when there&#8217;s some deeper issue affecting report generation.</p>
<h2>ViewerException: The viewing session is not available or has expired</h2>
<p>The system that I&#8217;m developing uses a web interface to view BIRT reports.  I found that during development that the report generation would fail, complaining that &#8220;The viewing session is not available or has expired&#8221;.  It turns out that although I was accessing the web interface through &#8220;localhost&#8221;, internally the system would redirect to the machine&#8217;s alternative name &#8220;dev.mt.ca&#8221;.  As my browser was configured to ignore cookies from other domains, the BIRT session cookies were tossed.  </p>
<p>All was well when I accessed the web interface using the alternative machine name.</p>
<h2>EngineException: Can not load the report query</h2>
<p>I&#8217;ve usually seen this exception in a few circumstances:</p>
<ul>
<li> When binding a table to a dataset and specifying a column that no longer exists.  &#8220;Refreshing&#8221; a table&#8217;s bindings only adds missing columns; there&#8217;s no warnings of bad references.  (I wonder if there&#8217;s a way to trap references to non-existant columns?)</li>
<li> Having changed a table grouping&#8217;s name, but forgetting to update any aggregations defined by that grouping name.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/holistictendencies.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/holistictendencies.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/holistictendencies.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/holistictendencies.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/holistictendencies.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/holistictendencies.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/holistictendencies.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/holistictendencies.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/holistictendencies.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/holistictendencies.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/holistictendencies.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/holistictendencies.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/holistictendencies.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/holistictendencies.wordpress.com/188/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=188&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://holistictendencies.wordpress.com/2011/07/06/debugging-birt/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/314e900bfc8465298237ce04be8b1355?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bsd</media:title>
		</media:content>
	</item>
		<item>
		<title>Being a good neighbour by curing strange Google popups</title>
		<link>http://holistictendencies.wordpress.com/2011/05/12/helping-neighbours-by-curing-strange-google-popups/</link>
		<comments>http://holistictendencies.wordpress.com/2011/05/12/helping-neighbours-by-curing-strange-google-popups/#comments</comments>
		<pubDate>Thu, 12 May 2011 14:33:57 +0000</pubDate>
		<dc:creator>Brian de Alwis</dc:creator>
				<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://holistictendencies.wordpress.com/?p=182</guid>
		<description><![CDATA[[I haven't come across any other reports of similar problems, so I thought I'd write this up quickly for anybody else encountering this same issue.] I normally do my utmost to avoid doing computer support, but my neighbours had been suffering from ad popups for several months now and were at their wits&#8217; end. As [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=182&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>[I haven't come across any other reports of similar problems, so I thought I'd write this up quickly for anybody else encountering this same issue.]</p>
<p>I normally do my utmost to avoid doing computer support, but my neighbours had been suffering from ad popups for several months now and were at their wits&#8217; end.  As the issues seemed to have disappeared after having had a laptop re-installed, I figured it was malware and recommended they do some scans and repair.  Since they hadn&#8217;t mentioned it since, I figured the problem was solved.  But they were instead suffering in silence.  They had tried everything — even contacting their ISP&#8217;s tech support.  </p>
<p>The symptoms were that clicking on Google search results caused the link target to popup in a new tab.  I find this kind of behaviour pretty handy (it&#8217;s generally how I do search), and I was prepared to write it off as some browser bar feature from their provider, Rogers.  But my warning bells were triggered when clicking on Google search result would occasionally spawn a popup ad (many of which were broken) or redirect to &#8220;search312.com&#8221;.  Hooking up tcpdump showed that a number of machines were being connected to, including www.find-quick-results.com, 20614.172.hit.tadasearch.com, ltdomains.com, 21677.172.filter.blendernetworks.com, rev.ineting.net.</p>
<p>After some digging, I finally discovered that their router DNS settings had been changed to some Russian-based redirection servers (213.109.69.40, 213.109.69.43).  These servers redirect Google and other sites to a server that rewrites links to be opened in new tabs.  If the miscreants had been more subtle in their ad popups, my neighbours would likely never have complained.  Imagine the data that these miscreants have been harvesting!</p>
<p>Unfortunately in this case the breach was introduced by the neighbours.  They had a popup claiming that Mozilla Firefox had detected unusual network activity and asked that they change some settings to check whether it was a malfunctioning computer.  This warning happened at the time that they started to notice these issues.</p>
<p>If you stumble upon this page as you&#8217;re having similar symptoms, check that your DNS settings are valid.  If you&#8217;re uncertain, do a <a href="http://whois.domaintools.com/">reverse-lookup of the DNS addresses</a> and ensure that they match an organization you trust (e.g., your ISP).  If you&#8217;re at all worried, then I&#8217;d highly recommend using Google&#8217;s Public DNS (8.8.8.8 and 8.8.4.4).  And then do a round of malware and virus checking, and I&#8217;d also suggest change your banking passwords too.</p>
<p>[How are ordinary people supposed to figure this out?]</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/holistictendencies.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/holistictendencies.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/holistictendencies.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/holistictendencies.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/holistictendencies.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/holistictendencies.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/holistictendencies.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/holistictendencies.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/holistictendencies.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/holistictendencies.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/holistictendencies.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/holistictendencies.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/holistictendencies.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/holistictendencies.wordpress.com/182/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=182&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://holistictendencies.wordpress.com/2011/05/12/helping-neighbours-by-curing-strange-google-popups/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/314e900bfc8465298237ce04be8b1355?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bsd</media:title>
		</media:content>
	</item>
		<item>
		<title>Bundle-NativeCode: Using platform-specific DLLs from OSGi</title>
		<link>http://holistictendencies.wordpress.com/2011/03/28/bundle-nativecode-using-platform-specific-dlls-from-osgi/</link>
		<comments>http://holistictendencies.wordpress.com/2011/03/28/bundle-nativecode-using-platform-specific-dlls-from-osgi/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 19:31:43 +0000</pubDate>
		<dc:creator>Brian de Alwis</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[swdev]]></category>
		<category><![CDATA[bundle-nativecode]]></category>
		<category><![CDATA[dll]]></category>

		<guid isPermaLink="false">http://holistictendencies.wordpress.com/?p=164</guid>
		<description><![CDATA[I&#8217;m currently doing some development on a large RCP application. One recent task required using a Windows DLL to open an email message through MAPI, which is made pretty easy with OSGi. But I encountered a few issues that I&#8217;m sure will bite other people. Bundle-NativeCode OSGi now provides some support for resolving and loading [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=164&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently doing some development on a large RCP application.  One recent task required using a Windows DLL <a href="http://holistictendencies.wordpress.com/2011/03/28/jmapi-compose-email-messages-with-attachments-from-java/">to open an email message through MAPI</a>, which is made pretty easy with OSGi.  But I encountered a few issues that I&#8217;m sure will bite other people.</p>
<h2>Bundle-NativeCode</h2>
<p>OSGi <del>now</del> provides some support for resolving and loading shared libraries/DLLs in Java applications.  A bundle declaratively specifies its DLLs and associated platform requirements in their bundle manifest using the <tt>Bundle-NativeCode</tt> header.  This header value is then used when loading a DLL through <tt>System.loadLibrary()</tt>.  </p>
<p>The<tt>Bundle-NativeCode</tt> header specifies a number of comma-delimited clauses.  For example:</p>
<pre>
Bundle-NativeCode: lib/win32/x86/http.dll; lib/win/zlib.dll;
    processor=x86; osname=win32,
  lib/macosx/libhttp.dylib; lib/macosx/libzlib.jnilib;
    osname=macosx; processor=x86; processor=x86_64,
  *
</pre>
<p>A clause specifies one or more DLLs.  A clause is matched to the current platform using a set of parameters (e.g., <tt>processor</tt> and <tt>osname</tt>, but also <tt>osversion</tt>, <tt>language</tt>, or a selection-filter). Parameters of different types are ANDd together; parameters of the same type are ORd together, which can be tricky.  Only a single clause is matched for the current platform, so multiple libraries must be specified within the same clause.</p>
<p>The trailing &#8220;<tt>*</tt>&#8221; indicates that the DLLs are optional.  It means that the bundle will still resolve <em>even if there are no other matching clauses</em>.  If this optional specifier is used, it must come last.</p>
<p>The power of <tt>Bundle-NativeHeader</tt> is two fold.  First, a bundle won&#8217;t resolve if there is no matching clause for the current platform. If you don&#8217;t include the optional specifier (the trailing asterisk), your code is pretty much guaranteed to never throw an <tt>UnsatisfiedLinkError</tt>.  Second, OSGi will resolve library name (e.g., &#8220;http&#8221;) to the appropriate DLLs for the platform, and will manage the DLL loading and unloading.</p>
<h2>Gotchas</h2>
<p>I&#8217;ve been bitten by a couple of &#8220;gotchas&#8221; with the <tt>Bundle-NativeCode</tt> header.</p>
<h3>Gotcha #1: System.loadLibrary() must still be called</h3>
<p>I incorrectly thought that OSGi would load the specified DLLs automatically.  Unfortunately your Java code must still explicitly load the libraries using <tt>System.libraryLoad()</tt>.  Happily you needn&#8217;t specify the path location or the platform-specific prefixes or extensions.  So using the example above, the code could just call:</p>
<pre>
System.loadLibrary("http");
</pre>
<p>[In hindsight, this makes sense: you wouldn't want DLLs loaded unnecessarily.]</p>
<h3>Gotcha #2: Dependencies aren&#8217;t traced</h3>
<p>OSGi doesn&#8217;t resolve DLL dependencies through the bundle&#8217;s dependencies.  This hasn&#8217;t bitten me personally, but I have come across a few reports online.</p>
<h3>Gotcha #3: &#8220;Missing host Bundle-NativeCode_0.0.0&#8243;: not as hazardous as may appear</h3>
<p>The lonely asterisk (&#8220;*&#8221;) is not actually considered as a clause.  It&#8217;s simply a configuration parameter that causes the bundle to continue to be resolved even if there are no matching clauses. </p>
<p>When there are no matching clauses, Equinox displays a message like:</p>
<pre>
!SUBENTRY 2 jmapi 2 0 2011-03-28 10:23:27.633
!MESSAGE Missing host Bundle-NativeCode_0.0.0.
</pre>
<p><em>This is an error message <b>only if the asterisk has not been specified!</b></em>  If the asterisk has been specified, then it&#8217;s merely an informational message; the bundle may still be successfully resolved.</p>
<p>This differentiation has caused me grief on several occasions now as I assumed such a message was an error and the cause of subsequent errors.</p>
<h2>References</h2>
<p>The <a href="http://www.osgi.org/Specifications/HomePage">OSGi Core Specification</a> describes the interpretation of the <tt>Bundle-NativeCode</tt> header.  In OSGi 4.2, it&#8217;s specifically in §3.7 and §3.10.</p>
<p>There are a few <a href="http://robertvarttinen.blogspot.com/2008/12/bundle-nativecode-in-osgi-manifest.html">blog</a> <a href="http://litrik.blogspot.com/2007/08/secrets-of-bundle-nativecode.html">posts</a> describing how to use this facility.  They were very helpful!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/holistictendencies.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/holistictendencies.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/holistictendencies.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/holistictendencies.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/holistictendencies.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/holistictendencies.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/holistictendencies.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/holistictendencies.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/holistictendencies.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/holistictendencies.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/holistictendencies.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/holistictendencies.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/holistictendencies.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/holistictendencies.wordpress.com/164/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=164&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://holistictendencies.wordpress.com/2011/03/28/bundle-nativecode-using-platform-specific-dlls-from-osgi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/314e900bfc8465298237ce04be8b1355?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bsd</media:title>
		</media:content>
	</item>
		<item>
		<title>JMAPI: Compose email messages with attachments from Java</title>
		<link>http://holistictendencies.wordpress.com/2011/03/28/jmapi-compose-email-messages-with-attachments-from-java/</link>
		<comments>http://holistictendencies.wordpress.com/2011/03/28/jmapi-compose-email-messages-with-attachments-from-java/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 18:25:46 +0000</pubDate>
		<dc:creator>Brian de Alwis</dc:creator>
				<category><![CDATA[swdev]]></category>

		<guid isPermaLink="false">http://holistictendencies.wordpress.com/?p=166</guid>
		<description><![CDATA[I recently created a small bundle, JMAPI, to provide support for programmatically opening an email message on Windows platforms using MAPI. Although the bundle&#8217;s functionality is restricted to Windows, the bundle is cross-platform. The API is through a single class, jmapi.JMAPI, which supports three methods, one of which queries whether MAPI support is available. JMAPI [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=166&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently created a small bundle, <a href="http://github.com/briandealwis/jmapi">JMAPI</a>, to provide support for programmatically opening an email message on Windows platforms using MAPI.  Although the bundle&#8217;s functionality is restricted to Windows, the bundle is cross-platform.  The API is through a single class, <tt>jmapi.JMAPI</tt>, which supports three methods, one of which queries whether MAPI support is available.</p>
<p>JMAPI was carved from the ruins of the old <a href="http://java.net/projects/jdic/">Java Desktop Interface Components (JDIC)</a> project.  With most of JDIC&#8217;s functionality has was absorbed into Java 6&#8242;s <tt>java.awt.Desktop</tt> class, JDIC seems to have died.  Not to mention that its binary distributions were wiped out with <a href="http://blogs.sun.com/projectkenai/entry/the_future_of_kenai_com">Oracle&#8217;s transfer of java.net to Kenai</a>.</p>
<p>The one useful component from JDIC that wasn&#8217;t absorbed was its attempt to provide cross-platform support for opening mail messages in the user&#8217;s mail client.  Java 6 only supports the <a href="http://en.wikipedia.org/wiki/Mailto"><tt>mailto:</tt></a> URL scheme.  Although <tt>mailto:</tt> is useful, it is length-limited and, more importantly, doesn&#8217;t provide for specifying message attachments; some clients provide for an &#8220;<tt>attachment</tt>&#8221; field, but its support is uneven.</p>
<p>Unfortunately JDIC&#8217;s binary distribution is not OSGi-friendly.  As my immediate needs were for a way to programmatically open a message using MAPI, I simply ripped out the support from JDIC, and did the minimum to make it work as an OSGi bundle.  I didn&#8217;t have the time to figure out how to rebuild the JNI support libraries (it has references to MFC and ATL), so I simply copied in the Windows DLL from JDIC 0.9.5; unfortunately this is 32-bit only.  It <a href="http://stackoverflow.com/questions/71659/how-to-add-wtl-and-atl-to-visual-studio-c-express-2008">may be possible to build using VisualStudio Express 2010</a> by someone with more Microsoft mojo than me.</p>
<p>Be aware that non-Outlook clients, such as <a href="http://www.mozillamessaging.com/thunderbird/">Thunderbird</a>, may need to perform <a href="http://kb.mozillazine.org/Default_mail_client">a few extra steps</a> to ensure that they are properly registered as the default email client.</p>
<p>Source is available up on <a href="http://github.com/briandealwis/jmapi">github</a> and is licensed under the same terms as JDIC with the LGPL.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/holistictendencies.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/holistictendencies.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/holistictendencies.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/holistictendencies.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/holistictendencies.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/holistictendencies.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/holistictendencies.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/holistictendencies.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/holistictendencies.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/holistictendencies.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/holistictendencies.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/holistictendencies.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/holistictendencies.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/holistictendencies.wordpress.com/166/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=166&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://holistictendencies.wordpress.com/2011/03/28/jmapi-compose-email-messages-with-attachments-from-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/314e900bfc8465298237ce04be8b1355?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bsd</media:title>
		</media:content>
	</item>
		<item>
		<title>Building an Eclipse product with Maven and Tycho</title>
		<link>http://holistictendencies.wordpress.com/2011/03/18/building-an-eclipse-product-with-maven-and-tycho/</link>
		<comments>http://holistictendencies.wordpress.com/2011/03/18/building-an-eclipse-product-with-maven-and-tycho/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 18:45:55 +0000</pubDate>
		<dc:creator>Brian de Alwis</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[swdev]]></category>

		<guid isPermaLink="false">http://holistictendencies.wordpress.com/?p=78</guid>
		<description><![CDATA[Tycho is actually a set of extensions for Maven to build Eclipse/OSGi-based technologies. But the existing Tycho docs assume prior knowledge of Maven, of which I had none.  This entry summarizes what you need to know to get started.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=78&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><em>This article is part of a <a href="http://holistictendencies.wordpress.com/2011/01/21/about-kizby/">small series</a> describing the use of several new open source components in my company&#8217;s new product, <a href="http://kizby.com">Kizby</a>.</em></p>
<p><a href="http://kizby.com">Kizby</a> is built using <a href="http://eclipse.org/tycho">Tycho</a>.  There has been quite a bit of buzz about Tycho recently, with several recent <a href="http://aniszczyk.org/2011/03/04/maven-tycho-hudson-jenkins-and-eclipse/">blog</a> <a href="http://www.zeroturnaround.com/blog/building-eclipse-plug-ins-with-maven-3-and-tycho/">posts</a> providing worked (and hopefully maintained) examples of using Tycho.  And it&#8217;s well deserved: our experiences with Tycho have been very positive: the community is responsive, Tycho&#8217;s functionality is very capable, and (more importantly) diagnosing build issues is straightforward.</p>
<p>But getting started was a bit bewildering due to having to learn Maven coupled with the vagaries of building Eclipse-based products.  And from the questions from newcomers to the Tycho mailing lists, I can see that I was not the only bewildered newcomer.  Hence this post.</p>
<p>[For those at EclipseCon, I recommend you attend <a href="http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;id=2049">Monday's tutorial on building with Tycho</a>.]</p>
<h2>Background</h2>
<p>When we began work in earnest on <a href="http://kizby.com">Kizby</a>, we quickly reached the point where we needed to have a build and deployment process.  As <a href="http://help.eclipse.org/helios/nav/4_2_0">PDE/Build</a>, the granddaddy of the various Eclipse build systems, is highlighted in many  Eclipse reference books, it seemed a logical choice.  The experience of coaxing forth a build from PDE/Build is perhaps the closest that I will ever get to understanding the pain and joy of giving birth.</p>
<p>But after a month or so, we hit a wall with PDE/Build: we wanted to build a set of four related products, whereas PDE/Build was designed to produce a single product.  Although I could have jerry-rigged something with <tt>make(1)</tt> and PDE/Build to repeatedly invoke the build for each of the products, I knew there must be a better way.</p>
<p>And so I surveyed the field and discovered a bewildering set of technologies bearing bewildering acronyms or names.  Even restricting consideration to just those tools for building Eclipse-based products still left a headache.  <a href="http://wiki.eclipse.org/Equinox_p2">p2</a>, I learned, is not a build system.  <a href="http://wiki.eclipse.org/Common_Build_Infrastructure">Athena Dash</a> is a set of scripts built around PDE/Build, but is no longer a recommended approach.  <a href="http://www.eclipse.org/buckminster/">Buckminister</a> has a whack of documentation but seems oriented towards build-from-the-IDE, whereas I wanted a headless build technology to future-proof myself for continuous integration [aside: Buckminster, I discovered later, can be used headless].  <a href="http://www.eclipse.org/modeling/emft/b3/">b3</a> is under development, and currently seems more geared towards manipulating p2 repositories.  And there was a (then) newer contender, the Maven-based <a href="http://tycho.sonatype.org">Tycho</a>.</p>
<p>I had actually come across Tycho before I first embarked on PDE/Build.  But my few exposures to Maven (shortly after the new millenium) had left me scarred. Maven projects had strange directory schemes, the seemingly essential <tt>pom.xml</tt> had little content, and the documentation was opaque (I think you had to understand Maven to understand the documentation).  For a tool that was positioned as a do-everything solution that would build, test, assemble, and deploy a system, I couldn&#8217;t even figure out how to get started.  After some desperate web searches, I figured out the minimum to make a project usable within Eclipse (with the magical <tt>mvn eclipse:eclipse</tt>), I ran away.</p>
<p>But I was now smarter — and desperate.  And fortunately Maven has matured, and there are now some great tutorials and free e-books available.  Building using Tycho turned out to be a bit simpler than I expected.  And Maven actually does build, test, assemble, and deploy too.</p>
<h2>Maven and Tycho</h2>
<p>Tycho is actually a set of extensions (unfortunately called &#8220;plugins&#8221; too)  for Maven to build Eclipse/OSGi-based components.  Key to using Tycho is to understand Maven.  And hence the reason for this blog entry: the existing Tycho docs (which are admittedly a bit minimal) assume prior knowledge of Maven, of which I had little.</p>
<h3>A Little Bit About Maven</h3>
<p>Maven is often described as being opinionated.  You provide a declarative specification of what you want built, and Maven decides how it will happen.  For those used to procedural build systems, it requires a bit of an adjustment.</p>
<p>The declarative specification is placed in a file named <tt>pom.xml</tt>, called the <em>Project Object Model</em> or <em>POM</em>. In Maven, a directory with a <tt>pom.xml</tt> is called a <em>project</em>.   The <tt>pom.xml</tt> describes the purpose of the project, called the <em>packaging</em> type (e.g., to produce a jar file, or a war file, or a bundle), and includes other information such as the project&#8217;s dependencies, etc.</p>
<p>What&#8217;s nifty is that a project inherits information, both from its <em>parent</em> project (usually in the parent directory, in which case this project is a <em>subproject</em>), and from Maven&#8217;s own <em>super POM</em>.  So providing your project conforms to Maven&#8217;s opinionated directory layouts, you rarely have to actually write anything beyond some minimal XML boilerplate: the <tt>pom.xml</tt> only serves to inform Maven of <em>changes from the defaults</em>.</p>
<p>For a project with a <tt>jar</tt> packaging, Maven <em>automatically</em> knows how to (1) generate any necessary resources, (2) compile the java files in <tt>src/main/java</tt>, (3) test using the unit tests in <tt>src/test/java</tt>, (4) jar up the class files, etc.  Maven only needs to know a few details such as the project&#8217;s name and any dependencies.  And hence my confusion from years ago upon seeing a seemingly near-empty <tt>pom.xml</tt> file.</p>
<h3>More on Projects</h3>
<p>With Maven, each project builds some artifact.  A project may have many subprojects, typically organized as subdirectories, and each of which contributes to the creation of the project&#8217;s artefact. The type of the artifact is described by the POM&#8217;s <tt>packaging</tt> directive (e.g., a Java project is generally a <tt>jar</tt> or <tt>war</tt>; an Eclipse plugin with Tycho is <tt>eclipse-plugin</tt>).</p>
<p>An artifact is identified by a <tt>::</tt> tuple, called the <em>coordinates</em>, which are provided in the <tt>pom.xml</tt>.  The <tt>artifactId</tt> is typically taken to correspond to the directory name, and the <tt>groupId</tt> the logical purpose.  In building Kizby, most projects have <tt>groupId=ca.mt.kizby</tt> and the <tt>artifactId</tt> is the bundle symbolic id like <tt>ca.mt.kizby.core</tt>.   (Note: there&#8217;s actually 2 other coordinates, the packaging and classifier, but they don&#8217;t seem to be talked about much.)</p>
<p>Maven actually doesn&#8217;t do much on its own, but instead delegates to various plugins (similar in concept, but different from Eclipse plug-ins).  These plugins actually do the stuff that you would stick in a <tt>make(1)</tt> directive or a sequence of Ant tasks.  Maven uses the packaging type to determine a set of phases, called a <em>lifecycle</em>, for building and deploying a project of that type, and then calls out to various plugins as it progresses through the different phases.  The lifecycle is similar to typical <span style="font-family:monospace;">all</span> target found in most <tt>Makefile</tt>s.</p>
<blockquote><p>
<tt>all: clean build zip deploy</tt>
</p></blockquote>
<p>And in Maven/Tycho, a <tt>make all</tt> corresponds to:</p>
<blockquote><p>
<tt>$ mvn clean deploy</tt>
</p></blockquote>
<p>The compilation and zipping is done as part of the <tt>deploy</tt>.</p>
<p>For more information on Maven, I highly recommend you look at Sonatype&#8217;s free book, <em><a href="http://www.sonatype.com/maven-by-example-book.html">Maven By Example</a></em>.</p>
<h3>Back to Tycho</h3>
<p>Tycho is actually a set of Maven plugins for compiling, resolving, and provisioning using OSGi.  It provides a different set of packaging types for building bundles, features, and tests (e.g., <tt>eclipse-plugin</tt>, <tt>eclipse-feature</tt>, <tt>eclipse-test-plugin</tt>).  Whereas the traditional Maven Java plugins pull configuration settings such as dependencies, compiler versions, etc. from the <tt>pom.xml</tt>, Tycho&#8217;s plugins use the information encoded in the OSGi/Eclipse manifests (e.g., <tt>META-INF/MANIFEST.MF</tt>); the traditional approach is often called <em>pom-first</em> vs Tycho&#8217;s <em>manifest-first</em> approach.</p>
<p>Tycho also provides a bridge between Maven coordinates and OSGi identifiers.  Tycho usually assumes that the <tt>artifactId</tt> should be the bundle&#8217;s symbolic name.  The <tt>groupId</tt> doesn&#8217;t really have an analogue in the OSGi world, so I use it as a logical grouping.  The <tt>version</tt> should match the bundle or feature version, though Maven uses a <tt>-SNAPSHOT</tt> suffix instead of <tt>.qualifier</tt>.</p>
<p>So a complete bundle&#8217;s <tt>pom.xml</tt> looks like:</p>
<blockquote>
<pre>

    ca.mt.kizby
    kizby-plugins
    1.0.10

  ca.mt.kizby.core
  1.0.10
  eclipse-plugin
</pre>
</blockquote>
<p>That&#8217;s it!  Seriously!  Remember that a project inherits from its parent, so this bundle will have the same <tt>groupId</tt>.  Features are very similar.  Of course you need to provide the parent&#8217;s definition, which has some other stuff to define the Tycho plugin versions to be used and repository definitions for resolving bundles (e.g., the p2 repository at <tt>http://download.eclipse.org/releases/helios</tt>).  But that&#8217;s pretty straight forward and covered in <a href="http://aniszczyk.org/2011/03/04/maven-tycho-hudson-jenkins-and-eclipse/">other tutorials</a>.</p>
<h2>Go Forth and Build</h2>
<p>At this point, you should hopefully have a very general overview of Maven and should be ready to read a bit from <a href=""><em>Maven by Example</em></a> and work through Chris Aniszczyk&#8217;s <a href="http://aniszczyk.org/2011/03/04/maven-tycho-hudson-jenkins-and-eclipse/">example</a>.</p>
<h3>Tricks or Gotchas</h3>
<p>There are many questions that come up on the <a href="http://software.2206966.n2.nabble.com/Tycho-Users-f3053503.html">Tycho mailing list</a>, but most are PDE- or p2-related rather than Tycho-related.  Unfortunately getting to the position where you know the difference <a href="http://software.2206966.n2.nabble.com/Errors-when-bundles-depend-on-bundles-using-Tycho-tp5920578p5922264.html">is</a> <a href="http://software.2206966.n2.nabble.com/tycho-generated-config-ini-does-not-start-runtime-tp6077893p6078723.html">painful</a>.  Here are the things I&#8217;ve found out the hard way:</p>
<ul>
<li><em>The OSGi resolver and p2 resolver are not the same.</em><br />
You may receive resolution errors in building that do not occur when running in Eclipse.</li>
<li><em>Startups are different.</em><br />
When run from the debugger, plugins are automatically started.  They aren&#8217;t in a product.</li>
<li><em>Creating .product.</em><br />
There are some bugs with the p2 publisher that prevent publishing products on different platforms.  There are workarounds.</li>
<li><em>Deployment.</em><br />
I don&#8217;t yet use Maven to control deployment to servers, and instead use some shell scripts.  But there are some <a href="http://maven.apache.org/plugins/maven-deploy-plugin/examples/deploy-ssh-external.html">nice</a> <a href="http://dev.eclipse.org/viewsvn/viewvc.cgi/jetty-wtp/trunk/org.eclipse.jst.server.jetty.site/pom.xml?view=markup&amp;root=RT_JETTY">examples</a> out there though.</li>
</ul>
<p>I&#8217;ve started documenting these issues on the <a href="http://wiki.eclipse.org/PDE/FAQ#Build_and_Deployment_Errors">PDE FAQ</a> and the <a href="http://wiki.eclipse.org/Tycho/FAQ">Tycho FAQ</a>; feel free to add your own.</p>
<h2>References</h2>
<ul>
<li> <a href="http://www.eclipse.org/tycho/"><em>The Eclipse Tycho Project</em></a>: Tycho is now an Eclipse.org project</li>
<li> <a href="http://www.sonatype.com/maven-by-example-book.html"><em>Maven by Example</em></a> and <a href="http://www.sonatype.com/maven-the-complete-reference-book.html"><em>Maven: The Complete Reference</em></a> are two recommended (and free!) e-books from Sonatype.</li>
<li> <a href="http://wiki.eclipse.org/PDE/FAQ">The PDE FAQ</a> and the <a href="http://wiki.eclipse.org/Tycho/FAQ">Tycho FAQ</a>.</li>
<li> Chris Aniszczyk has put together <a href="http://aniszczyk.org/2011/03/04/maven-tycho-hudson-jenkins-and-eclipse/">a great working project</a> of Tycho in action, called the <a href="http://wiki.eclipse.org/Minerva">Minerva Project</a>.</li>
<li> Erkki Lindpere has put up <a href="http://www.zeroturnaround.com/blog/building-eclipse-plug-ins-with-maven-3-and-tycho/">another worked example</a>.</li>
<li> <a href="https://docs.sonatype.org/display/TYCHO/Tycho+reference+card"><em>Tycho Reference Card</em></a>: presents standard <tt>pom.xml</tt> clauses for building various OSGi artefacts with Tycho.</li>
<li> The <a href="https://github.com/sonatype/sonatype-tycho/tree/master/tycho-demo"><em>Tycho demo projects</em></a> also serve as good examples of configuring Tycho.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/holistictendencies.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/holistictendencies.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/holistictendencies.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/holistictendencies.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/holistictendencies.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/holistictendencies.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/holistictendencies.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/holistictendencies.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/holistictendencies.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/holistictendencies.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/holistictendencies.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/holistictendencies.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/holistictendencies.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/holistictendencies.wordpress.com/78/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=78&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://holistictendencies.wordpress.com/2011/03/18/building-an-eclipse-product-with-maven-and-tycho/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/314e900bfc8465298237ce04be8b1355?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bsd</media:title>
		</media:content>
	</item>
		<item>
		<title>On the perils of creating plugins from jars</title>
		<link>http://holistictendencies.wordpress.com/2011/03/10/on-the-perils-of-creating-plugins-from-jars/</link>
		<comments>http://holistictendencies.wordpress.com/2011/03/10/on-the-perils-of-creating-plugins-from-jars/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 21:00:25 +0000</pubDate>
		<dc:creator>Brian de Alwis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[pde]]></category>

		<guid isPermaLink="false">http://holistictendencies.wordpress.com/?p=32</guid>
		<description><![CDATA[Eclipse JDT/PDE has a handy feature where you can make a plugin/bundle from an existing JAR. (File -&#62; New -&#62; PDE -&#62; Create plugin from Jar). This might seem to be a brilliant feature, but it has a downside in that Eclipse JDT doesn&#8217;t check dependencies of the resulting class files. This bit me recently [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=32&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Eclipse JDT/PDE has a handy feature where you can make a plugin/bundle from an existing JAR. (<em>File -&gt; New -&gt; PDE -&gt; Create plugin from Jar</em>).  This might seem to be a brilliant feature, but it has a downside in that Eclipse JDT doesn&#8217;t check dependencies of the resulting class files.</p>
<p>This bit me recently when making a bundle from the <a href="http://jung.sourceforge.net">JUNG</a> libraries.  Fortunately Peter Krien&#8217;s <a href="http://www.aqute.biz/Bnd/Download">bnd</a> does a great job (<a href="http://blog.springsource.com/2008/02/18/creating-osgi-bundles/">instructions</a>), and there&#8217;s now some <a href="http://njbartlett.name/bndtools.html">nice-looking tooling</a> too.</p>
<pre>
BundleLoader[edu.uci.lcs.jung.algorithms_2.0.0].loadBundleClass(edu.uci.ics.jung.graph.Hypergraph)
BundleLoader[edu.uci.lcs.jung.algorithms_2.0.0].findLocalClass(edu.uci.ics.jung.graph.Hypergraph)
BundleClassLoader[/usr/local/installs/eclipse-R3.5.1/plugins/edu.uci.lcs.jung.algorithms_2.0.0.jar].findClass(edu.uci.ics.jung.graph.Hypergraph)
BundleClassLoader[edu.uci.lcs.jung.algorithms_2.0.0].loadClass(edu.uci.ics.jung.graph.Hypergraph) failed.
java.lang.ClassNotFoundException: edu.uci.ics.jung.graph.Hypergraph
</pre>
<p>Ouch.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/holistictendencies.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/holistictendencies.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/holistictendencies.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/holistictendencies.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/holistictendencies.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/holistictendencies.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/holistictendencies.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/holistictendencies.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/holistictendencies.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/holistictendencies.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/holistictendencies.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/holistictendencies.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/holistictendencies.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/holistictendencies.wordpress.com/32/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=32&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://holistictendencies.wordpress.com/2011/03/10/on-the-perils-of-creating-plugins-from-jars/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/314e900bfc8465298237ce04be8b1355?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bsd</media:title>
		</media:content>
	</item>
		<item>
		<title>Expert vs n00b: Effective Java searches in Eclipse</title>
		<link>http://holistictendencies.wordpress.com/2011/03/08/expert-vs-n00b-effective-java-searches-in-eclipse/</link>
		<comments>http://holistictendencies.wordpress.com/2011/03/08/expert-vs-n00b-effective-java-searches-in-eclipse/#comments</comments>
		<pubDate>Tue, 08 Mar 2011 19:39:02 +0000</pubDate>
		<dc:creator>Brian de Alwis</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[research]]></category>
		<category><![CDATA[swdev]]></category>

		<guid isPermaLink="false">http://holistictendencies.wordpress.com/?p=9</guid>
		<description><![CDATA[I reviewed a paper a while back that described how a set of Java developers used the search tools in Eclipse to explore a code base.  Having performed a number of studies involving very smart developers in addition to being a proficient Eclipse developer myself, I surmised that the developers were not very proficient users [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=9&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I reviewed a paper a while back that described how a set of Java developers used the search tools in Eclipse to explore a code base.  Having performed a number of studies involving very smart developers in addition to being a proficient Eclipse developer myself, I surmised that the developers were not very proficient users of Eclipse.  What made them ineffective — and more important, how can a developer become more proficient?</p>
<p>In this study, the developers were asked answer questions that required finding elements within the source code for a system that corresponded to domain concepts.</p>
<p>The biggest clue for me as to their inexperience was that all the developers used the File Search and Java Search dialogs <em>exclusively</em>.  Some apparently used only the File Search!  I was so surprised that I contacted the paper authors to confirm (i) that it was not an imposed restriction, and (ii) that their traces hadn&#8217;t lumped the use of the search dialogs with other search mechanisms (they were separate).  Although these dialogs are useful for grep-style searches, such as for finding a message property, they are nowhere near as quick to use as the shortcut-driven searches like <em>Open Declaration</em> (<kbd>F3</kbd>) and <em>References &gt; Workspace</em> (<kbd>Ctrl</kbd><kbd>Shift</kbd><kbd>G</kbd>).  And no expert developer would only use the File Search dialog!</p>
<p>Further confirmation came from a breakdown of what the developers were searching for.  Many of the searches involved searches to map domain concepts to classes and interfaces.  No proficient developer would use the Java Search dialog to find a class; they would instead use the <em>Open Type</em> dialog.  The Open Type dialog is reactive, providing immediate feedback; the Java Search would take at least 10 ten times as long.</p>
<p>Understanding the expertise of participants is essential for drawing conclusions and making recommendations.  In this case, I suggested that the authors make recommendations about improving instruction for new or inexperienced developers.</p>
<p>So what indicators correlate with expertise?</p>
<p>From my observations, one mark of expertise is inversely correlated to mouse use: the more mouse usage, the more a n00b.  Experts seek out the functions that can be performed at the speed of thought.  Dialogs and mouse pointing are interruptions.</p>
<p>Another sign of expertise is knowing and tailoring advanced options.  One of the first actions I take with a new Eclipse installation is to disable the &#8220;Show Approximate Matches&#8221; search option: when I do a references search, I want to see <em>exactly</em> the callers to that method.  Why would I want <em>thousands</em> of potential matches cluttering the view?  If I wanted ineactness, then I would use the Java Search dialog!  </p>
<p>[In fact, I never use the JDT searches any more: I use my own tool, <a href="http://www.cs.ubc.ca/~bsd/research/ferret/">Ferret</a>, that provides far more focussed queries.  I've let it slide though, and its PDE searches are a bit broken in 3.7.  I'll try to fix those.]</p>
<p><a href="http://webfoot.com">Ducky Sherwood</a> had some <a href="http://blog.webfoot.com/2008/07/24/my-ms-thesis-is-done/">interesting findings</a> finding that experienced developers exhibit more breadth-first-search behaviours when navigating in code vs the depth-first-searches seen in novices.</p>
<p>What signs can you think of that distinguish novice from expert?</p>
<p>[<b>Update:</b> the paper in question is: J Starke, C Luce, J Sillito (2009). <a href="http://www.jamiestarke.com/2009/06/29/searching-and-skimming-an-exploratory-study/">Searching and Skimming: An Exploratory Study</a>. In Proc Intl Conf Software Maintenance (ICSM).]</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/holistictendencies.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/holistictendencies.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/holistictendencies.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/holistictendencies.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/holistictendencies.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/holistictendencies.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/holistictendencies.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/holistictendencies.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/holistictendencies.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/holistictendencies.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/holistictendencies.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/holistictendencies.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/holistictendencies.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/holistictendencies.wordpress.com/9/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=9&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://holistictendencies.wordpress.com/2011/03/08/expert-vs-n00b-effective-java-searches-in-eclipse/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/314e900bfc8465298237ce04be8b1355?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bsd</media:title>
		</media:content>
	</item>
		<item>
		<title>ClassNotFoundException with OSGi/Eclipse bundles</title>
		<link>http://holistictendencies.wordpress.com/2011/02/14/classnotfoundexception-with-osgieclipse-bundles/</link>
		<comments>http://holistictendencies.wordpress.com/2011/02/14/classnotfoundexception-with-osgieclipse-bundles/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 17:24:30 +0000</pubDate>
		<dc:creator>Brian de Alwis</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[swdev]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://holistictendencies.wordpress.com/?p=128</guid>
		<description><![CDATA[Today my JUnit Plugin tests decided to go on strike and throw ClassNotFoundException exceptions rather than run my master test suite. Although I was fairly confident in the small changes I had made couldn&#8217;t have ruined anything, I preferred confirmation from JUnit&#8217;s green bar. After an hour of cursing, enabling all manner of debugging and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=128&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Today my JUnit Plugin tests decided to go on strike and throw <tt>ClassNotFoundException</tt> exceptions rather than run my master test suite.  Although I was fairly confident in the small changes I had made couldn&#8217;t have ruined anything, I preferred confirmation from JUnit&#8217;s green bar.</p>
<p>After an hour of cursing, enabling all manner of debugging and tracing options on <tt>org.eclipse.osgi</tt>, and finally stepping through the classloader (not fun at all), I discovered that the test bundle&#8217;s <tt>BundleData</tt> had an empty classpath.  Bingo!  Adding the following single line to the <tt>MANIFEST.MF</tt> solved the issue:</p>
<pre>
  Bundle-ClassPath: .
</pre>
<p>Although I understand the necessity of this line, I&#8217;m at a loss to explain why my tests have been running perfectly well for the last several months.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/holistictendencies.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/holistictendencies.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/holistictendencies.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/holistictendencies.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/holistictendencies.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/holistictendencies.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/holistictendencies.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/holistictendencies.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/holistictendencies.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/holistictendencies.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/holistictendencies.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/holistictendencies.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/holistictendencies.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/holistictendencies.wordpress.com/128/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=holistictendencies.wordpress.com&amp;blog=7698207&amp;post=128&amp;subd=holistictendencies&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://holistictendencies.wordpress.com/2011/02/14/classnotfoundexception-with-osgieclipse-bundles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/314e900bfc8465298237ce04be8b1355?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bsd</media:title>
		</media:content>
	</item>
	</channel>
</rss>
