<?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/"
	>

<channel>
	<title>Allan Lykke Christensen</title>
	<atom:link href="http://blogs.i2m.dk/allan/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.i2m.dk/allan</link>
	<description>On Software</description>
	<lastBuildDate>Sun, 30 Sep 2012 11:41:14 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Java API for sending content to Drupal via Services API released</title>
		<link>http://blogs.i2m.dk/allan/2012/09/30/java-api-for-sending-content-to-drupal-via-services-api-released/</link>
		<comments>http://blogs.i2m.dk/allan/2012/09/30/java-api-for-sending-content-to-drupal-via-services-api-released/#comments</comments>
		<pubDate>Sun, 30 Sep 2012 11:40:45 +0000</pubDate>
		<dc:creator>Allan Lykke Christensen</dc:creator>
				<category><![CDATA[Converge]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[converge]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://blogs.i2m.dk/allan/?p=360</guid>
		<description><![CDATA[Just a quick post. For Converge, Raymond Wanyoike of I2M developed a pretty good API for sending content to a Drupal 7 installation from Java. The API requires that the Services API is installed and configured on Drupal, but once that is done you can transfer content directly from Java into Drupal. You can use [...]]]></description>
			<content:encoded><![CDATA[<p>Just a quick post. For <a href="http://www.getconverge.com" title="Converge" target="_blank">Converge</a>, Raymond Wanyoike of I2M developed a pretty good API for sending content to a Drupal 7 installation from Java. The API requires that the Services API is installed and configured on Drupal, but once that is done you can transfer content directly from Java into Drupal. You can use the API by including the following Maven dependency in your code.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dependency<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>dk.i2m.drupal<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>services-api-client<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;scope<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>compile<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/scope<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dependency<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;repositories<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;repository<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>m2.i2m.dk<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>I2M Maven Repository<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://m2.i2m.dk<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/repository<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/repositories<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Information on how to use the API can be found on the Bitbucket repo where the project is hosted: <a href="http://scm.i2m.dk/drupal-services-api/" title="http://scm.i2m.dk/drupal-services-api/" target="_blank">http://scm.i2m.dk/drupal-services-api/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.i2m.dk/allan/2012/09/30/java-api-for-sending-content-to-drupal-via-services-api-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LDAP Group Authentication with SugarCRM</title>
		<link>http://blogs.i2m.dk/allan/2012/03/31/ldap-group-authentication-with-sugarcrm/</link>
		<comments>http://blogs.i2m.dk/allan/2012/03/31/ldap-group-authentication-with-sugarcrm/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 09:00:40 +0000</pubDate>
		<dc:creator>Allan Lykke Christensen</dc:creator>
				<category><![CDATA[SugarCRM]]></category>
		<category><![CDATA[System administration]]></category>
		<category><![CDATA[active directory]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[open ldap]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[sugarcrm]]></category>

		<guid isPermaLink="false">http://blogs.i2m.dk/allan/?p=350</guid>
		<description><![CDATA[For those of you who follow me on Twitter, you know that I&#8217;m not very pleased about the whole architecture and documentation of SugarCRM. Sugar is great out of the box, but if you try to do something slightly advanced it quickly becomes very troublesome. Anyway, this post is not to complain about SugarCRM, instead [...]]]></description>
			<content:encoded><![CDATA[<p>For those of you who follow me on Twitter, you know that I&#8217;m not very pleased about the whole architecture and documentation of SugarCRM. Sugar is great out of the box, but if you try to do something slightly advanced it quickly becomes very troublesome. Anyway, this post is not to complain about SugarCRM, instead I wanted to show how set-up Sugar to authenticate users based on an LDAP server containing user groups.</p>
<p><strong>Use Case</strong></p>
<p>One of my clients is a medium-size media house with about 500 employees. 100 of those work in sales and customer relations. I was asked by my client to configure SugarCRM so that new users accounts would not need to be set-up for the 100 sales staff. Also, it was necessary that the other 400 staff do not get access to system. The client is using Microsoft Active Directory to authenticate users on the network and would like to reuse it for SugarCRM.</p>
<p><strong>Implementation</strong></p>
<p>The Active Directory is structured in the following way:</p>
<ul>
<li>Users reside in the tree <code>DC=mediacompany,DC=com</code></li>
<li>Groups reside in the tree <code>OU=GROUPS,DC=mediacompany,DC=com</code></li>
</ul>
<p><span style="text-decoration: underline;">Step 1) Creating a CRM group on the LDAP server</span></p>
<p>Since access should be limited to a group of users, we&#8217;ll start by creating a group on the Active Directory called CRM where all the sales and customer relations staff are added. This group is called crm.</p>
<p><code>DN: CN=crm,OU=GROUPS,DC=mediacompany,DC=com</code></p>
<p><span style="text-decoration: underline;">Step 2) Enabling LDAP Authentication</span></p>
<p>In SugarCRM, go to Administration and click Password Management. Scroll down to the bottom of the page and click &#8220;Enable LDAP Authentication&#8221;</p>
<div id="attachment_351" class="wp-caption aligncenter" style="width: 310px"><a href="http://blogs.i2m.dk/allan/wp-content/ldap-authentication.png"><img class="size-medium wp-image-351" title="SugarCRM LDAP Authentication" src="http://blogs.i2m.dk/allan/wp-content/ldap-authentication-300x149.png" alt="" width="300" height="149" /></a><p class="wp-caption-text">The fields that must be filled out to enable LDAP Authentication</p></div>
<p>You can set-up Sugar&#8217;s LDAP authentication to allow any user residing on an LDAP server to be able to log-in, or you can set it up to only allow users in a particular group to log-in. In our use case I need it to check that the user is in a particular group (crm) before allowing them access.</p>
<p><span style="text-decoration: underline;">Step 3) Specifying the LDAP server details</span></p>
<p>In the field &#8220;Server&#8221; we specific the address of the LDAP server prefixed with <code>ldap://</code> (or <code>ldaps://</code> for secure access). E.g.   <code>ldap://172.16.20.1</code></p>
<p>In the field &#8220;Port&#8221; we specific the port that the LDAP server is bound to, E.g. <code>389</code></p>
<p>Tick the checkbox field &#8220;Authentication&#8221; at the bottom of the page. This is necessary for must Active Directory servers as you need an administrative user that can do the look ups in the directory. Enter the username (DN) of the user and the matching password. E.g. <code>CN=Administrator,DC=mediacompany,DC=com</code> as the username</p>
<p>Tick the checkbox field &#8220;Auto Create Users&#8221;. This will automatically create a SugarCRM for any user that has a valid account on Active Directory upon their first login. If you don&#8217;t tick this field you&#8217;ll have to still create the users one-by-one in Sugar.</p>
<p><span style="text-decoration: underline;">Step 4) Specifying how to retrieve users</span></p>
<p>In the field User DN we specific the tree containing the users. If you have users stored in different leafs you can specific the base DN of your directory. In our case we use <code>DC=mediacompany,DC=com</code> as our User DN</p>
<p>In the field User Filter, we can specific a filter that should be used to filter users based on an attribute on your LDAP profile. Since we will use groups we can leave the User Filter empty.</p>
<p>In the field Bind Attribute enter the field that should be used to bind with the directory. In the case of Active Directory this field is <code>userPrincipalName</code>.</p>
<p>In the field Login Attribute enter the field that should be used as the username for logging into Sugar. I prefer that the name is the same as the username used for logging into machines on the network. In the case of Active Directory this field is <code>sAMAccountName</code>.</p>
<p>If you don&#8217;t want to authenticate against a particular user group you can skip the next step and save your settings and start authenticating against active users.</p>
<p><span style="text-decoration: underline;">Step 5) Specifying how to retrieve groups and relate them to users</span></p>
<p>Tick the checkbox field &#8220;Group Membership&#8221;.</p>
<p>In the field Group DN you specify the tree containing all your groups. In our case this value is <code>OU=GROUPS,DC=mediacompany,DC=com</code>.</p>
<p>In the field Group Name you specific the name of the group that users must be a &#8220;member of&#8221; to be able to log-in. In our case this value is <code>CN=crm</code> (It&#8217;s important to remember the CN or whichever value you&#8217;ve chosen for the identifier of the group).</p>
<p>In the field User Attribute you specific the name of the attribute on the user record that will match with the member attribute on the Group record. In our case we store the complete distinguished name (DN) of the user in the record, and the value is therefore <code>dn</code> as this field contains the full distinguished name of a member.</p>
<p>In the field Group Attribute you specific the name of the field that contains the distinguished name of each member. In many LDAP servers the field <code>uniqueMember</code> is used, but on Active Directory the field <code>member</code> is used. Browse your LDAP directory to determine the field names to use.</p>
<p>That&#8217;s it!  Well, not exactly, cause there is a bug in the codebase of SugarCRM.  Actually it would all work up till when you specify the group membership. See the next step</p>
<p><span style="text-decoration: underline;">Step 6) Patching the LDAP Group Membership code</span></p>
<p>This example is based on SugarCRM 6.4.0. It should work on previous versions as well. I&#8217;m not sure when they will fix the bug in in the code base, so you might find that this patch works in newer versions as well.</p>
<p>The problem is in the file <code>LDAPAuthenticateUser.php</code> located in <code>modules/Users/authentication/LDAPAuthenticate</code> in line 149.</p>
<p>The line says:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user_uid</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #990000;">ldap_count_entries</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ldapconn</span><span style="color: #339933;">,</span> <span style="color: #990000;">ldap_search</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ldapconn</span><span style="color: #339933;">,</span><span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ldap_config'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">settings</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ldap_group_name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;,&quot;</span><span style="color: #339933;">.</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ldap_config'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">settings</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ldap_group_dn'</span><span style="color: #009900;">&#93;</span>  <span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;(<span style="color: #006699; font-weight: bold;">$group_attr</span>=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$user_uid</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span>  <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></pre></td></tr></table></div>

<p>Notice in the end of the line where it says</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #0000ff;">&quot;(<span style="color: #006699; font-weight: bold;">$group_attr</span>=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$user_uid</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;)</span></pre></td></tr></table></div>

<p>The problem is that <code>$user_uid[0]</code> is not an array, it is a string containing the distinguished name of a user, e.g.  <code>CN=Allan Lykke Christensen,DC=mediacompany,DC=com</code>. When you try to access a string as if it was an array, it will give you the character at the position, e.g.  <code>$user_uid[0]</code> would return <code>C</code> in the example above. The fix is to remove <code>[0]</code> from <code>$user_uid</code> like so:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user_uid</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #990000;">ldap_count_entries</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ldapconn</span><span style="color: #339933;">,</span> <span style="color: #990000;">ldap_search</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ldapconn</span><span style="color: #339933;">,</span><span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ldap_config'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">settings</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ldap_group_name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;,&quot;</span><span style="color: #339933;">.</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ldap_config'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">settings</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ldap_group_dn'</span><span style="color: #009900;">&#93;</span>  <span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;(<span style="color: #006699; font-weight: bold;">$group_attr</span>=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$user_uid</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span>  <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></pre></td></tr></table></div>

<p>That&#8217;s it! Hope it&#8217;s been helpful.</p>
<div id="attachment_352" class="wp-caption aligncenter" style="width: 310px"><a href="http://blogs.i2m.dk/allan/wp-content/ldap-complete.png"><img src="http://blogs.i2m.dk/allan/wp-content/ldap-complete-300x226.png" alt="" title="LDAP Settings for Active Directory" width="300" height="226" class="size-medium wp-image-352" /></a><p class="wp-caption-text">LDAP Settings for Active Directory</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blogs.i2m.dk/allan/2012/03/31/ldap-group-authentication-with-sugarcrm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating Composite Components in JSF2</title>
		<link>http://blogs.i2m.dk/allan/2012/03/26/creating-composite-components-in-jsf2/</link>
		<comments>http://blogs.i2m.dk/allan/2012/03/26/creating-composite-components-in-jsf2/#comments</comments>
		<pubDate>Sun, 25 Mar 2012 22:22:51 +0000</pubDate>
		<dc:creator>Allan Lykke Christensen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Open data]]></category>
		<category><![CDATA[fusion]]></category>
		<category><![CDATA[fusiontables]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[jsf2]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[opendata]]></category>

		<guid isPermaLink="false">http://blogs.i2m.dk/allan/?p=329</guid>
		<description><![CDATA[I&#8217;m in the early stages of upgrading Converge from JSF 1.2 to JSF 2. I&#8217;ve been holding back for too long but finally decided that now is the time to get it done. Initially I was waiting for component libraries to be released for JSF 2. In the current version of Converge we are using [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m in the early stages of upgrading <a href="http://www.getconverge.com" target="_blank">Converge</a> from JSF 1.2 to JSF 2. I&#8217;ve been holding back for too long but finally decided that now is the time to get it done. Initially I was waiting for component libraries to be released for JSF 2. In the current version of Converge we are using RichFaces 3, which we&#8217;ve been very happy with (We tried out other component libraries but non of them worked out very well for us). However, with JSF2 it is now possible to easily create your own components using the Composite Components setup. For people who are sharp with client-side technologies such as Ajax, you may actually end up creating all your owner components rather than using the available third party libraries such as RichFaces, IceFaces and PrimeFaces. It is not that the third party libraries are bad, but with custom components you&#8217;ve got 100% control of exactly how your components get rendered. To give a small demonstration of composite components I put together a small simple example. The purpose of the example is to demonstrate the ease of creating components.</p>
<p><strong>Open Data</strong></p>
<p>Anyone body who knows me, knows that <a href="opendefinition.org/guide/data/" target="_blank">I love Open Data</a>. I use a lot of datasets from <a href="http://www.google.com/fusiontables" target="_blank">Google Fusion Tables</a>, <a href="http://www.infochimps.com" target="_blank">Infochimps</a>, and the numerous Open Data Initiatives (such as <a href="http://data.worldbank.org">http://data.worldbank.org</a> and <a href="http://data.un.org">http://data.un.org</a>).  So, in my simple example, I&#8217;ll create a component that generates an HTML table based on an existing, public Google Fusion table.</p>
<p><strong>Step 1: Defining the tag</strong></p>
<p>The first step in creating a composite component is to define its interface (i.e. the attributes you allow developers to specify when using your tag). For our component we need the developer to specific which Google Fusion table to show data from. We&#8217;ll call this attribute <code>tableId</code>. We also need the developer to specific which fields of the table to display. We&#8217;ll call this attribute <code>fields</code>.</p>
<p>So our tag would look like this:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;my:fusionTable</span> <span style="color: #000066;">tableId</span>=<span style="color: #ff0000;">&quot;...&quot;</span> <span style="color: #000066;">fields</span>=<span style="color: #ff0000;">&quot;...&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></td></tr></table></div>

<p><strong>Step 2: Creating the composite tag file</strong></p>
<p>Composite component tag fields reside in the directory <code>/resources/</code> of your web-application. By adding another directory in this directory you create a namespace for your components. In our case we use the namespace <code>my</code> so you&#8217;d have a directory structure like this: <code>/resources/my/</code>. Create a file in this directory called <code>fusionTable.xhtml</code> with the following content:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">'1.0'</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">'UTF-8'</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span></span>
<span style="color: #009900;">      <span style="color: #000066;">xmlns:cc</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/jsf/composite&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
    <span style="color: #808080; font-style: italic;">&lt;!-- INTERFACE --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cc:interface<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/cc:interface<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #808080; font-style: italic;">&lt;!-- IMPLEMENTATION --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cc:implementation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/cc:implementation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>The section <code>&lt;cc:interface /&gt;</code> is for defining what the component accept of attributes and action sources. The <code>&lt;cc:implementation /&gt;</code> section is for implementing the actual output of the component.</p>
<p>Since we already defined the attributes of the component we can declare it in the <code>&lt;cc:interface /&gt;</code> section like so:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- INTERFACE --&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cc:interface<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cc:attribute</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;tableId&quot;</span> <span style="color: #000066;">required</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;java.lang.String&quot;</span>  <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cc:attribute</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;fields&quot;</span> <span style="color: #000066;">required</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;java.lang.String&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/cc:interface<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>The section above declares the <code>tableId</code> and <code>fields</code> attribute. It also specifies that the two attribute are plain strings and that they are required.</p>
<p><strong>Step 3: Implement the tag</strong></p>
<p>Now that the interface is in place we need to specify the output of the tag. If you use the tag as it is now, it will require you to specify the declared attributes, but the output will be a blank screen. To get the content of a Fusion Table we use the <a href="https://developers.google.com/fusiontables/docs/developers_guide" target="_blank">public SQL API provided by Google</a>. The API supports the JSON format which is convenient to work with in jQuery and JavaScript. To use jQuery in our component we must first <a href="http://docs.jquery.com/Downloading_jQuery" target="_blank">download a copy of the jQuery library</a> and place it in the <code>/resources/js</code> directory. Next we must indicate that the component needs this JavaScript to operate. We do that using the <code>outputScript</code> tag in <code>&lt;cc:implementation /&gt;</code> section:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- IMPLEMENTATION --&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cc:implementation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:outputScript</span> <span style="color: #000066;">library</span>=<span style="color: #ff0000;">&quot;js&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;jquery.js&quot;</span> <span style="color: #000066;">target</span>=<span style="color: #ff0000;">&quot;head&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/cc:implementation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Note: If the jQuery script has already been included by another component or page, it will not be included again.</p>
<p>Next we need to call the Fusion Tables API using the <a href="http://api.jquery.com/jQuery.getJSON/">getJSON jQuery function</a> and process the output returned. We do all of this in a JavaScript contained in the implementation of the component:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;">    <span style="color: #808080; font-style: italic;">&lt;!-- IMPLEMENTATION --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cc:implementation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:outputScript</span> <span style="color: #000066;">library</span>=<span style="color: #ff0000;">&quot;js&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;jquery.js&quot;</span> <span style="color: #000066;">target</span>=<span style="color: #ff0000;">&quot;head&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/javascript&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            // URL encode the fields
            var fields = &quot;&quot;;
            // Unique ID of the Fusion Table
            var tableId = &quot;&quot;;
&nbsp;
            // Construct the FusionTable service URL
            // Note: jsonCallback ensures that the call is jsonp
            var service = 'https://www.google.com/fusiontables/api/query?sql=SELECT%20' 
                + fields + '%20FROM%20#' + tableId + '<span style="color: #ddbb00;">&amp;amp;</span>jsonCallback=?';
&nbsp;
            // Call the service and generate HTML based on the response
            $.getJSON(service, 
            function(data) {
&nbsp;
                // Array used to collect HTML as the response is processed
                var items = [];
&nbsp;
                // Generate the table header (columns)
                items.push('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;thead<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>');
                items.push('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>');
                for (var key in data.table.cols) {
                    items.push('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;th<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>' + data.table.cols[key] + '<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/th<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>');
                }
                items.push('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>');
                items.push('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/thead<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>');
&nbsp;
                // Generate the table data rows
                items.push('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tbody<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>');
                // Read data rows into an array
                for (var key in data.table.rows) {
&nbsp;
                    items.push('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>');
                    for (var col in data.table.rows[key]) {
                        items.push('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>' + data.table.rows[key][col] + '<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>');
                    }
                    items.push('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>');
                }
                items.push('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tbody<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>');
&nbsp;
                // Output generated table
                $('<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;table</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>', { 
                    'class': '#{cc.attrs.styleClass}', 
                    'id': '#{cc.attrs.clientId}',  
                    html: items.join('')
                }).appendTo('body');
            });
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>The URL for retrieving a Fusion Table is:</p>
<p><code>https://www.google.com/fusiontables/api/query?sql=SELECT fields FROM table&#038;jsonCallback=?</code></p>
<p>The URL has two query parameters <code>sql</code> containing the SQL statement to execute and <code>jsonCallback=?</code> which allows the call to be turned into a JSONP call to avoid cross-domain query restrictions in the browser. Note that you must URL encode the query parameters to avoid problems submitting the query.</p>
<p>Once the query has been posted, the response is processed and the HTML of the component is generated by iterating over the content.</p>
<p>The last thing we need to do is to take the values entered by the developer and put them in the JavaScript. This is done by replacing the empty values in the beginning of the implementation section:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;">var fields = escape(&quot;#{cc.attrs.fields}&quot;);
var tableId= &quot;#{cc.attrs.tableId}&quot;;</pre></td></tr></table></div>

<p>This will take the value specified in the fields attribute, URL encoded it, and store it in the JavaScript variable <code>fields</code>. The tableId does not need to be URL encoded and is copied across to JavaScript verbatim.</p>
<p><strong>Step 4: Using the tag</strong></p>
<p>All that is remaining now is to use the tag. Before we can use the tag we must first identify a Google Fusion Table and its fields. For my example I found a public Fusion Table containing the <a href="https://www.google.com/fusiontables/DataSource?docid=1QWBy7LcULz6pN1SuHxm2HtSSd9jMg9IYbPDZRiM">Corruption Index for 2011 by Transparency International</a>. The field names are easy to see, e.g. <code>2011 rank</code> (containing the ranking of a given country on the corruption index), <code>Country / Territory</code> (containing the name of the country), <code>ISO</code> (containing the ISO code of the country), etc.  To find the TableId click File and select About. The TableID is the string specified as the Encrypted ID (in our case 1QWBy7LcULz6pN1SuHxm2HtSSd9jMg9IYbPDZRiM).</p>
<p>Using our component we want to show the ranking and name of the country. The component usage would therefore look something like this:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;">&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">'1.0'</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">'UTF-8'</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span></span>
<span style="color: #009900;">      <span style="color: #000066;">xmlns:h</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/jsf/html&quot;</span></span>
<span style="color: #009900;">      <span style="color: #000066;">xmlns:my</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/jsf/composite/my&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>FusionTable Component Test<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h:body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>  
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Corruption Index<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;my:fusionTable</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;tblCorruption&quot;</span> </span>
<span style="color: #009900;">                        <span style="color: #000066;">tableId</span>=<span style="color: #ff0000;">&quot;1QWBy7LcULz6pN1SuHxm2HtSSd9jMg9IYbPDZRiM&quot;</span> </span>
<span style="color: #009900;">                        <span style="color: #000066;">fields</span>=<span style="color: #ff0000;">&quot;'2011 rank','Country / Territory'&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h:body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><a href="http://blogs.i2m.dk/allan/wp-content/Screen-Shot-2012-03-26-at-01.18.37.png"><img src="http://blogs.i2m.dk/allan/wp-content/Screen-Shot-2012-03-26-at-01.18.37-185x300.png" alt="" title="Output of the composite component" width="185" height="300" class="alignleft size-medium wp-image-346" /></a></p>
<p>Notice that field names with spaces must be included in single quotes.</p>
<p>That&#8217;s all. As you can see, it is really easy to create your own components. The speed of creation comes down to your skills with the client-side technology (e.g. jQuery). If you are terrible with HTML, CSS, JavaScript and jQuery, I&#8217;d suggest you stick to the available third party component libraries. If you are fluent in the client technologies and want full control over what you are doing you should go ahead and experiment with custom composite components.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.i2m.dk/allan/2012/03/26/creating-composite-components-in-jsf2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Review: NetBeans IDE 7 Cookbook</title>
		<link>http://blogs.i2m.dk/allan/2011/09/06/review-netbeans-ide-7-cookbook/</link>
		<comments>http://blogs.i2m.dk/allan/2011/09/06/review-netbeans-ide-7-cookbook/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 10:31:02 +0000</pubDate>
		<dc:creator>Allan Lykke Christensen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Literature]]></category>
		<category><![CDATA[cookbook]]></category>
		<category><![CDATA[NetBeans]]></category>

		<guid isPermaLink="false">http://blogs.i2m.dk/allan/?p=324</guid>
		<description><![CDATA[I recently got a copy of the newly release NetBeans cookbook from Packt Publishing. Being a huge fan of NetBeans I was excited to see a cookbook on the subject. The book is split into 12 chapters focusing on the main types of applications you can develop in NetBeans. Being a cookbook you can easily [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://www.packtpub.com/sites/default/files/imagecache/productview/2503OS_NetBeans%20IDE%207%20Cookbook_9781849512503cov.jpg" alt="NetBeans IDE 7 Cookbook. Click to go to Packt Publishing" align="left" />I recently got a copy of the newly release NetBeans cookbook from Packt Publishing. Being a huge fan of NetBeans I was excited to see a cookbook on the subject. The book is split into 12 chapters focusing on the main types of applications you can develop in NetBeans. Being a cookbook you can easily jump between the recipes based on what you you&#8217;re cooking. This is a great advantage if you want to learn something new in NetBeans without having to trawl through a lot of basic information. There are more than 70 recipes ranging for basic tasks such as debugging classes to more advanced tasks such as profiling your applications. My favourite recipes fall into the category of refactoring. The refactoring recipes saves developers an enormous amount of time. There is something for developers at all levels. Even if you are a seasoned NetBeans developer you&#8217;ll find some recipes that you&#8217;ve never heard of. For NetBeans newcomers there are many gems that will make your life easier. If you are studying or considering to study for the NetBeans Certification, this book is a great companion. My only critic of the book is that it could contain a few more advanced recipes for the routined NetBeans developers,</p>
<p>You can check out a <a href="https://www.packtpub.com/netbeans-ide-7-cookbook/book" title="Go to Packt Publishing" target="_blank">sample of the book on the Packt Publishing website</a>.</p>
<p>The book is excellent for beginners and because of that I give it 3.5 stars of 5.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.i2m.dk/allan/2011/09/06/review-netbeans-ide-7-cookbook/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Demonstration of Workflows in CONVERGE</title>
		<link>http://blogs.i2m.dk/allan/2010/10/30/demonstration-of-workflows-in-converge/</link>
		<comments>http://blogs.i2m.dk/allan/2010/10/30/demonstration-of-workflows-in-converge/#comments</comments>
		<pubDate>Sat, 30 Oct 2010 10:29:11 +0000</pubDate>
		<dc:creator>Allan Lykke Christensen</dc:creator>
				<category><![CDATA[Converge]]></category>
		<category><![CDATA[converge]]></category>
		<category><![CDATA[demonstration]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blogs.i2m.dk/allan/?p=314</guid>
		<description><![CDATA[Demonstration of Workflows in CONVERGE]]></description>
			<content:encoded><![CDATA[<p>To get some of the early adapters going, I&#8217;ve created a demonstration of setting up an outlet with a simple workflow. The video is about 45 mins. Enjoy.</p>
<p><iframe src="http://player.vimeo.com/video/16187664?byline=0" width="400" height="265" frameborder="0"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.i2m.dk/allan/2010/10/30/demonstration-of-workflows-in-converge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Demonstration of the News Wire feature in Converge</title>
		<link>http://blogs.i2m.dk/allan/2010/10/07/demonstration-of-the-news-wire-feature-in-converge/</link>
		<comments>http://blogs.i2m.dk/allan/2010/10/07/demonstration-of-the-news-wire-feature-in-converge/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 23:53:45 +0000</pubDate>
		<dc:creator>Allan Lykke Christensen</dc:creator>
				<category><![CDATA[Converge]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[converge]]></category>
		<category><![CDATA[demonstration]]></category>
		<category><![CDATA[news wire]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blogs.i2m.dk/allan/?p=311</guid>
		<description><![CDATA[Video demonstration of the news wire service feature in Converge]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a small video demonstration of the news wire services feature in Converge. The video shows how to subscribe to news wires and how to search subscribed news wires.<br />
<iframe src="http://player.vimeo.com/video/15614147?byline=0" width="400" height="240" frameborder="0"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.i2m.dk/allan/2010/10/07/demonstration-of-the-news-wire-feature-in-converge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Preview of the Compare function in Converge</title>
		<link>http://blogs.i2m.dk/allan/2010/10/05/preview-of-the-compare-function-in-converge/</link>
		<comments>http://blogs.i2m.dk/allan/2010/10/05/preview-of-the-compare-function-in-converge/#comments</comments>
		<pubDate>Tue, 05 Oct 2010 09:02:38 +0000</pubDate>
		<dc:creator>Allan Lykke Christensen</dc:creator>
				<category><![CDATA[Converge]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[content]]></category>
		<category><![CDATA[content management]]></category>
		<category><![CDATA[content management system]]></category>
		<category><![CDATA[converge]]></category>
		<category><![CDATA[ecms]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[media houses]]></category>

		<guid isPermaLink="false">http://blogs.i2m.dk/allan/?p=307</guid>
		<description><![CDATA[Small screencast of the Compare function in Converge ]]></description>
			<content:encoded><![CDATA[<p>Oh man, time flies. Lately I&#8217;ve had absolutely no time to blog. In August my daughter Mackenzie was born and on top of that, every third week I am in Brussels working for <a href="http://www.proinvest-eu.org">PRO€INVEST</a> (an EU organisation). A few weeks ago I picked up my work on <a href="http://converge.googlecode.com">CONVERGE, an Open Source Editorial Content Management System</a> that I&#8217;m building for media houses. Last night I put a &#8220;Compare&#8221; function into the version view of a story. You can check it out here.<br />
<iframe src="http://player.vimeo.com/video/15545742?byline=0" width="400" height="265" frameborder="0"></iframe>
<p><a href="http://vimeo.com/15545742">Compare preview</a> from <a href="http://vimeo.com/user4301418">Allan Lykke Christensen</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>This video previews the compare function in Converge</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.i2m.dk/allan/2010/10/05/preview-of-the-compare-function-in-converge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Review: JBoss AS 5 Development</title>
		<link>http://blogs.i2m.dk/allan/2010/04/02/review-jboss-as-5-development/</link>
		<comments>http://blogs.i2m.dk/allan/2010/04/02/review-jboss-as-5-development/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 14:55:59 +0000</pubDate>
		<dc:creator>Allan Lykke Christensen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Literature]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[Review]]></category>

		<guid isPermaLink="false">http://blogs.i2m.dk/allan/?p=286</guid>
		<description><![CDATA[Review of JBoss AS 5 Development]]></description>
			<content:encoded><![CDATA[<p><img src="http://blogs.i2m.dk/allan/wp-content/6828_MockupCover.jpg" alt="JBoss AS 5 Development" title="JBoss AS 5 Development" width="125" height="152" class="size-full wp-image-287" style="float: left;" /></p>
<p>Back in January I was about to embark on a new Java enterprise project. For the past few years I’ve mainly been doing Glassfish-based projects, but being frustrated with some of its features I decided to look into the JBoss Application Server. Prior to JavaEE 5 I used JBoss (4.0) and was very happy with it. Its ability to configure every aspect of the application server using XML files is fantastic when exercising continuous integration/deployment. Anyway, I changed to Glassfish due to its support for JavaEE5. So to catch up on the latest development in JBoss I decided to get “JBoss AS 5 Development” by Francesco Marchioni from Packt Publishing. Wow, was I surprised. The book was really excellent. The book starts with instructions on how to setup JBoss and get started. This was followed with a chapter on the new features of JBoss 5. The remaining of the book focuses on developing JavaEE5 components and configuring JBoss to get the most out of your applications. One of the things I really liked about this book was how many of the advice could easily be applied to other application servers. The main reason why I think this book is awesome is because it is great for developers who want to tweak and understand their application server. Many developers are use to having other people setup their application in production environments, but with this book you’ll gain the confidence to configure your application and server for a production environment.</p>
<p>Every application server should have a book like this!</p>
<p>You can check out a <a href="https://www.packtpub.com/sites/default/files/sample_chapters/6828-jboss-as-5-development-sample-chapter-8-developing-applications-with-jboss-and-hibernate.pdf">free chapter of the book here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.i2m.dk/allan/2010/04/02/review-jboss-as-5-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LDAP Explorer 0.4 released</title>
		<link>http://blogs.i2m.dk/allan/2010/03/06/ldap-explorer-0-4-released/</link>
		<comments>http://blogs.i2m.dk/allan/2010/03/06/ldap-explorer-0-4-released/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 02:20:03 +0000</pubDate>
		<dc:creator>Allan Lykke Christensen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[LDAP Explorer]]></category>
		<category><![CDATA[NetBeans]]></category>

		<guid isPermaLink="false">http://blogs.i2m.dk/allan/?p=265</guid>
		<description><![CDATA[LDAP Explorer 0.4 for NetBeans was released]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.i2m.dk/allan/wp-content/filter_uid-0_4.png"><img src="http://blogs.i2m.dk/allan/wp-content/filter_uid-0_4-300x254.png" alt="" title="LDAP Explorer 0.4 - now with basic filtering, server labels, and support for self-signed SSL certificates" width="300" height="254" class="alignright size-medium wp-image-267" /></a>I managed to put the 0.4 release together before the original deadline of 13. March. In version 0.4 you&#8217;ll find:</p>
<ul>
<li>Attributes are now sortable by clicking the column headings</li>
<li>Possible to give each LDAP server connection a label</li>
<li>Fixed NamingException when having more than one server connection / window open</li>
<li>Added connection timeout setting to LDAP server connection</li>
<li>More friendly attribute names</li>
<li>Support for Lotus Notes object classes</li>
<li>Silently accepts self-signed SSL certificates</li>
<li>Basic filtering</li>
</ul>
<p>For the next release the UI will be changed slightly to accommodate query building and displaying of search results.</p>
<p><a href="http://blogs.i2m.dk/allan/wp-content/upgrade-0_4.png"><img src="http://blogs.i2m.dk/allan/wp-content/upgrade-0_4-300x190.png" alt="" title="Upgrading to 0.4" width="300" height="190" class="alignleft size-medium wp-image-266" /></a></p>
<p><em>Note: From version 0.3 an update center was automatically created upon installation. To upgrade simply go to Tools &#8211; Plugins &#8211; Updates and click &#8220;Reload Catalog&#8221; followed by selecting the new version and clicking &#8220;Upgrade&#8221;</em></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>You can find the project site on Google Code: <a href="http://code.google.com/p/nb-ldap-explorer/">http://code.google.com/p/nb-ldap-explorer/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.i2m.dk/allan/2010/03/06/ldap-explorer-0-4-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LDAP Explorer 0.3 and NetBeans Doxia Support</title>
		<link>http://blogs.i2m.dk/allan/2010/02/27/ldap-explorer-0-3-and-netbeans-doxia-support/</link>
		<comments>http://blogs.i2m.dk/allan/2010/02/27/ldap-explorer-0-3-and-netbeans-doxia-support/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 00:17:39 +0000</pubDate>
		<dc:creator>Allan Lykke Christensen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[APT]]></category>
		<category><![CDATA[Doxia]]></category>
		<category><![CDATA[LDAP Explorer]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[NetBeans]]></category>

		<guid isPermaLink="false">http://blogs.i2m.dk/allan/?p=255</guid>
		<description><![CDATA[LDAP Explorer 0.3 has been released and NetBeans Doxia Support has been picked up again.]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.i2m.dk/allan/wp-content/2010-02-27_at_00_38.png"><img src="http://blogs.i2m.dk/allan/wp-content/2010-02-27_at_00_38-300x200.png" alt="LDAP Explorer 0.3" title="LDAP Explorer 0.3" width="300" height="200" class="alignright size-medium wp-image-257" /></a><strong>LDAP Explorer</strong></p>
<p>This evening I released the third version of LDAP Explorer. The changes include:</p>
<ul>
<li>Scrolling in the LDAP tree (could only view very small trees in 0.2 due to missing scrollers)</li>
<li>Replaced Swing-code with NetBeans classes (mainly replacing JTree with NetBeans nodes)</li>
<li>Nicer-looking icons + different icons depending on the type of LDAP entry</li>
<li>Includes an update center for ease of upgrading to future versions</li>
</ul>
<p>You can grab a copy of the new version from the <a href="http://code.google.com/p/nb-ldap-explorer/">Google Code project page</a> or the <a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=25684">NetBeans Plugin Portal</a></p>
<p><strong>NetBeans Doxia Support</strong></p>
<p>In August 2009 I started a &#8220;<em>NetBeans Goodies</em>&#8221; project at Kenai.com where I intended to collect a bunch of NetBeans modules. The first <em>Goodie</em> would be support for APT files (Maven Doxia). If you&#8217;ve been reading my blog you&#8217;ll know that I got the basic code hacked together but then ran into some problems with defining the APT language in JavaCC. Anyway, This week I got prompted to continue the development of Doxia support by a keen user. I&#8217;ve therefore transfer the code from Kenai to Google Code and intent to pick up the coding in the upcoming weeks. You can find the project at <a href="http://code.google.com/p/nb-doxia-support/">Google Code</a>. I haven&#8217;t released any versions of Doxia support yet, so if you want to give it a go you&#8217;ll have to check out the code from the Mercurial repository.</p>
<p>Previous blog entries about Doxia support: </p>
<ul>
<li><a href="http://blogs.i2m.dk/allan/2009/08/18/doxia-apt-rendered-view-now-working/">Doxia APT Rendered View Now Working</a></li>
<li><a href="http://blogs.i2m.dk/allan/2009/08/16/doxia-apt-support-coming-closer/">Doxia APT Support Coming Closer</a></li>
<li><a href="http://blogs.i2m.dk/allan/2009/08/05/doxia-apt-language-support/">Doxia APT Language Support</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogs.i2m.dk/allan/2010/02/27/ldap-explorer-0-3-and-netbeans-doxia-support/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
