<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>
	<title>Planet Hippo</title>
	<link>http://planet.hippocms.org/</link>
	<language>en</language>
	<description>Planet Hippo - http://planet.hippocms.org/</description>

<item>
	<title>Bas van Leeuwen (Hippo): Inspiring: Hippo GetTogether</title>
	<guid>tag:blogger.com,1999:blog-6364779749127996620.post-362457633482657666</guid>
	<link>http://hippobas.blogspot.com/2010/08/inspiring-hippo-gettogether.html</link>
	<description>&lt;a href=&quot;http://photos1.meetupstatic.com/photos/event/1/9/e/600_17460414.jpeg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://photos1.meetupstatic.com/photos/event/1/9/e/600_17460414.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So yes, last Friday we had the Hippo GetTogether, our gathering of clients, developers,&amp;nbsp; partners, managers and interested individuals all clad in identical cutesy Hippo shirts. Let me give you an (incomplete) glimpse into the day’s events.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://photos3.meetupstatic.com/photos/event/1/e/9/600_17460489.jpeg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://photos3.meetupstatic.com/photos/event/1/e/9/600_17460489.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The summer day beckoned, yet everyone decided to stay inside in the magnificent Felix Meritis to listen to an exciting day filled with knowledge sharing. People freely came in and left when they desired, according to &lt;a href=&quot;http://twitter.com/Geebee&quot;&gt;Gerrit&lt;/a&gt; there was a “good informal vibe” which in my opinion helped to foster an environment for open discussion later on.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://photos1.meetupstatic.com/photos/event/4/0/9/1/600_17476529.jpeg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://photos1.meetupstatic.com/photos/event/4/0/9/1/600_17476529.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hippo’s very own CTO opened the day with a hearty welcome and after he had&lt;a href=&quot;http://www.slideshare.net/arjecahn/hippo-gettogether-opening-talk&quot;&gt; shown us&lt;/a&gt; what the future of Hippo CMS holds in store it was time for client cases. In this speed-dating for professionals each participant had 4 minutes to show everyone a short glimpse of their Hippo implementations.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_rzmLVGhlHvE/THe-uWQgjAI/AAAAAAAAABE/9fE5fCika9A/s1600/highres_17328006.jpeg&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/_rzmLVGhlHvE/THe-uWQgjAI/AAAAAAAAABE/9fE5fCika9A/s320/highres_17328006.jpeg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;TDC Lighthouse&lt;a href=&quot;http://www.vimeo.com/14360960&quot;&gt; used Spring&lt;/a&gt; to implement the website of the &lt;a href=&quot;http://www.nierstichting.nl/&quot;&gt;dutch kidney foundation&lt;/a&gt; Not only did we see the big, high-traffic sites for which Hippo is known and loved, but there was also a presentation by Indivirtual about their implementation of &lt;a href=&quot;http://www.landg.nl/&quot;&gt;http://www.landg.nl&lt;/a&gt; in 10 days of work.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://photos2.meetupstatic.com/photos/event/1/a/1/600_17460417.jpeg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://photos2.meetupstatic.com/photos/event/1/a/1/600_17460417.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The program flowed from these non-technical client cases, through technical cool vs. hot talks ending in an overheated hackathon.&amp;nbsp; Some chose to attend the Usability Sidetrack, in which our User Interface Guru shared some insights into “how we create the friendliest CMS around”. An inspiring workshop in which participants were actively involved in creating ideas for a better &lt;a href=&quot;http://www.onehippo.com/try&quot;&gt;product&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_rzmLVGhlHvE/THe--ilCKkI/AAAAAAAAABM/hh5yz1uBYnU/s1600/highres_17460477.jpeg&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/_rzmLVGhlHvE/THe--ilCKkI/AAAAAAAAABM/hh5yz1uBYnU/s320/highres_17460477.jpeg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cool vs. Hot focused on using Hippo CMS in new and exciting ways, examples are using Hippo in an “In Memory Data Grid”, integrating Hippo with SAP, &lt;a href=&quot;http://info.jteam.nl/August2010HippoGetTogetherContentRequest.html&quot;&gt;SOLR&lt;/a&gt;, using REST interfaces, &lt;a href=&quot;http://www.slideshare.net/m.pillitu/10-hippo-cmis-plugin-get-together-august-2010&quot;&gt;using CMIS&lt;/a&gt;, SOAP &amp;amp; Spring, or tips &amp;amp; tricks for running Hippo in a high-performance way.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_rzmLVGhlHvE/THe_EhKm32I/AAAAAAAAABU/TzqyIRa9o5E/s1600/highres_17460473.jpeg&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/_rzmLVGhlHvE/THe_EhKm32I/AAAAAAAAABU/TzqyIRa9o5E/s320/highres_17460473.jpeg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Afterwards Hippo’s HST expert “Ardcore” gave an introduction into linking with the HST and how to make sure your visitors (and Google!) get where they should be.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://photos1.meetupstatic.com/photos/event/1/a/5/600_17460421.jpeg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://photos1.meetupstatic.com/photos/event/1/a/5/600_17460421.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We have it all on &lt;a href=&quot;http://www.vimeo.com/tag:hippogt&quot;&gt;film&lt;/a&gt;, so please have a look at some of the talks, either because you missed them or to review the ideas presented. For example the &lt;a href=&quot;http://www.vimeo.com/14361157&quot;&gt;Liferay-Hippo integration&lt;/a&gt; for PvdA.nl  &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://photos3.meetupstatic.com/photos/event/1/f/7/600_17460503.jpeg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://photos3.meetupstatic.com/photos/event/1/f/7/600_17460503.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The day ended with a hackathon, complemented with refreshments and pizza. Guys being guys there was no way that the &lt;a href=&quot;http://www.google.com/images?um=1&amp;amp;hl=en&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla%3Aen-US%3Aofficial&amp;amp;biw=1200&amp;amp;bih=1447&amp;amp;tbs=isch%3A1&amp;amp;sa=1&amp;amp;q=baywatch+-hasselhoff&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq=&amp;amp;gs_rfai=&quot;&gt;Baywatch-plugin&lt;/a&gt; could not have won…&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://photos3.meetupstatic.com/photos/event/1/a/e/600_17460430.jpeg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://photos3.meetupstatic.com/photos/event/1/a/e/600_17460430.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The day ended with a lot of happy faces, see you all next time!&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://photos1.meetupstatic.com/photos/event/1/e/e/600_17460494.jpeg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://photos1.meetupstatic.com/photos/event/1/e/e/600_17460494.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://photos1.meetupstatic.com/photos/event/2/0/0/600_17460512.jpeg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://photos1.meetupstatic.com/photos/event/2/0/0/600_17460512.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6364779749127996620-362457633482657666?l=hippobas.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 27 Aug 2010 13:44:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Bas van Leeuwen (Hippo))</dc:creator>
</item>
<item>
	<title>Rolf van der Steen (Hippo): Usability test: Tab Management</title>
	<guid>tag:blogger.com,1999:blog-8488651744833642317.post-1199076462983600722</guid>
	<link>http://rolfvandersteen.blogspot.com/2010/08/usability-test-tab-management.html</link>
	<description>&lt;div&gt;&lt;span&gt;A call to Hippo CMS7 authors, editors and admins! Please join in on the next usability test.  This one is about &lt;i&gt;Tab management&lt;/i&gt;. Use the following URL to start the test:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://usabilla.com/rate/8190903884c76&quot;&gt;http://usabilla.com/rate/8190903884c76&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please don't hesitate to join in and speak up. Your opinion is much appreciated!&lt;br /&gt;&lt;br /&gt;Note on Usabilla (the tool I'm using for these tests): Participating is anonymous; It is not possible for me to see who has participated. If you like to get in touch personally, please state your email in a note in the test.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8488651744833642317-1199076462983600722?l=rolfvandersteen.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 27 Aug 2010 10:09:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Rolf van der Steen)</dc:creator>
</item>
<item>
	<title>Rolf van der Steen (Hippo): Results Hippo GetTogether Usability Sidetrack</title>
	<guid>tag:blogger.com,1999:blog-8488651744833642317.post-8646243963363484350</guid>
	<link>http://rolfvandersteen.blogspot.com/2010/08/results-hippo-gettogether-usability.html</link>
	<description>&lt;div&gt;&lt;span&gt;Last friday (20 aug 2010) was Hippo GetTogether. Right after lunch, while the Cool vs. Hot tech-talks were being held in the Zuilenzaal, I ran the Usability sidetrack in the Teekenzaal. About 15 people attended and gave me really valuable feedback on Hippo CMS 7.&lt;br /&gt;&lt;br /&gt;The sidetrack consisted of two parts. First I presented a brief introduction on usability. Most of the sidetrack however was a practical workshop. In this workshop participants gave me feedback on Hippo CMS 7. For those interested; you can find the entire presentation on http://www.slideshare.net/rolfvandersteen/hippo-get-togehterusabilitysidetrack (yes, I know, it contains a typo).&lt;br /&gt;&lt;br /&gt;Check out the presentation if you'd like to know a bit more on usability. Here I like to go into more detail on the workshop and the results from it. For the workshop I had prepared three exercises; “Top 10 Improvements”, “Personas” and “Today's Design”, so that I had at least enough to fill the planned time (13:30 - 15:30). But in the end I used all the planned time and about an hour extra on the first exercise only; creating a decent most-wanted improvements list.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Top 8 Improvements&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I used focus group methods to create the improvements list. First I asked all participants to write down their most-wanted improvements on post-its. This could be things like frustrating interaction, bad graphical design or missing features. Then we went through these improvements one-by-one; the 'owner' explained what he/she meant, and we put all the post-its on a flip-over functionally grouping them as we went along. This resulted in approximately 20 improvements. Next we prioritized the improvements. Everyone got to make two votes by placing stickers on the flip-over: one big sticker&amp;nbsp; for the most-wanted improvement (2 points) and one small sticker for the second-most-wanted improvement (1 point).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_xXtS8nTPUSE/THZp_z2FHQI/AAAAAAAAAB0/LkUxGEhXqCk/s1600/top-improvements.JPG&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://1.bp.blogspot.com/_xXtS8nTPUSE/THZp_z2FHQI/AAAAAAAAAB0/LkUxGEhXqCk/s320/top-improvements.JPG&quot; width=&quot;239&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;This resulted in the following top 8 improvements*:&lt;/span&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;Rich text editor (Xinha): frustrating to work with, doesn't give users true text-editing functionality they expect from Office applications they normally use like MS Word.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Performance: Bad performance influences the user experience, users get frustrated, start clicking more than needed, thus creating more errors.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Document presentation: bad typography, unusable alternating color coding, 'technical' design.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Template creation: current way of creating document type templates is too rigid / clunky.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Workflow: communication possibilities between users in the workflow are missing / too little.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Dashboard: perceived as useless because presented information is not relevant to users.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Tab behavior: frustrating interaction.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Drag &amp;amp; drop: missing functionality.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;* The top listing is composed of voted improvements and improvements that are mentioned more than once. All other improvements are left out of the top listing.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Hackathon input&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After creating the top listing we came to the conclusion there was too little time left to pick up one of the other exercises. We then had a short brainstorm on input for the hackathon, using the top listing as a reference. We decided improvements for the Dashboard nicely fitted the hackathon goals and could be feasible within a couple of hours.&lt;br /&gt;&lt;br /&gt;From this brainstorm the following improvements for the Dashboard arose:&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;History improvements: make the history list more relevant, show publication, show take offline show requests and their comments, don't dhow login/logout actions, allow user to hide (some) actions, and group actions per user (within a certain time frame).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Chat functionality in CMS: allow logged in users to chat with each other, on dashboard, but eventually across entire CMS, one-on-one chats, but optionally also one-to-many.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;ToDo improvements: Group per action.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Change order of history and todo; to do is more important, so should be on the left.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span&gt;&lt;b&gt;Structured feedback&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Another very interesting point which became clear from the usability sidetrack was a clear need for more frequent and better structured ways for Hippo clients/users to provide input/feedback like in this sidetrack. I pointed out that we're running usability tests and that I would like as many participants as possible to join in. I also mentioned that I'm very much interested in additional feedback and like to enable structured ways of exchanging this. Participants responded enthusiastically to that.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's next?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I've discussed results from the Usability sidetrack at Hippo internally and these are the steps we're going to take:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;The upcoming release (7.5) is already fully planned and there are little resources available to pick up additional design and development. However we can fit Tab behavior improvement within this release.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;For the next releases we have appointed key usability improvements: Dashboard,&amp;nbsp; Rich text editor, Performance and Document presentation.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Also we're going to create a 'UX channel'. We want to satisfy the need of sharing thoughts and ideas on user experience (and separate these from technical discussions). We have to give it some thought on how we are going to do this, but most likely we'll be opening up a UX forum.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span&gt;Well, that’s it in a nutshell. I'll keep you updated and hope to see you at the next GetTogether!&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8488651744833642317-8646243963363484350?l=rolfvandersteen.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 26 Aug 2010 13:21:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Rolf van der Steen)</dc:creator>
</item>
<item>
	<title>Rolf van der Steen (Hippo): Hippo GetTogether Usability Sidetrack</title>
	<guid>tag:blogger.com,1999:blog-8488651744833642317.post-6535089963308338108</guid>
	<link>http://rolfvandersteen.blogspot.com/2010/08/hippo-gettogether-usability-sidetrack.html</link>
	<description>&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span&gt;This Friday is &lt;a href=&quot;http://gettogether.onehippo.org/calendar/13459921/&quot;&gt;Hippo GetTogether&lt;/a&gt;. Parallel to the &lt;i&gt;Cool vs. Hot&lt;/i&gt; tech-talks I will be running the &lt;i&gt;Usability sidetrack&lt;/i&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;The Usability sidetrack is  scheduled for form 13:30 until 15:30*. In this time I will  give a glimpse into how we create the friendliest CMS around.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;First there will be a brief introduction on usability; what is it, what is our vision on it and how do we apply it at Hippo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Most  of the sidetrack however will be a practical workshop. In this workshop  you can give us your feedback, directly to me! The feedback will be used right there and then to collectively  design and evaluate new and better solutions.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Your  input is valuable here!&lt;/span&gt;&lt;span&gt; Since the workshop is based on your feedback, please bring your issues, examples, comments, etc.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span&gt;* There is room and time to continue an extra hour if desired.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8488651744833642317-6535089963308338108?l=rolfvandersteen.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 18 Aug 2010 06:47:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Rolf van der Steen)</dc:creator>
</item>
<item>
	<title>Mathijs Brand (Hippo): The little secret about Search Engine Optimization</title>
	<guid>tag:blogger.com,1999:blog-862413798174121061.post-8634485584873037704</guid>
	<link>http://mathijsbrand.blogspot.com/2010/08/little-secret-about-search-engine.html</link>
	<description>&lt;p&gt;Your average Hippo customer isn't stupid. She's smart. Let's call her Paula. I like that name. &lt;b&gt;Paula&lt;/b&gt;. Now let's say Paula is a web analyst and works for a large non profit organization. And because she's smart, she's migrating to Hippo CMS 7. Before she did this, she read some extensive reports on SEO. Her company even hired an SEO consultant to verify her website. But she also noticed a lot of Hippo websites got the highest rankings. &lt;/p&gt;&lt;p&gt;She asked me why. Did I know a little secret perhaps? My answer is &lt;b&gt;yes&lt;/b&gt;. I do have a little secret for Paula...&lt;/p&gt;&lt;p&gt;But first I will tell you exactly what Paula knows. So here it goes.&lt;/p&gt;&lt;h2&gt;Paula knows&lt;/h2&gt;&lt;p&gt;&lt;b&gt;Human Readable URL's&lt;/b&gt; are important. Luckily she got it out of the box in Hippo CMS.&lt;/p&gt;&lt;p&gt;Paula knows where the &lt;b&gt;description&lt;/b&gt; text in her Google search results comes from. See picture below. Better yet, she knows how she can easily manipulate it in her own Hippo CMS. &lt;/p&gt;&lt;p&gt;A friend of Paula told her about a thing called a sitemap.  Although search engines won't promise you they will use it, it is pretty nice if they do: giving visitors an overview of your website in search results. See picture below. The Hippo forge has a nice &lt;a href=&quot;http://sitemap.forge.onehippo.org/&quot; target=&quot;sitemap plugin documentation&quot;&gt;sitemap plugin&lt;/a&gt; using the &lt;a href=&quot;http://www.sitemaps.org&quot; title=&quot;what are sitemaps?&quot; target=&quot;_blank&quot;&gt;sitemap standard&lt;/a&gt;. The installation is easy. That's why Paula has it now.&lt;a href=&quot;http://farm5.static.flickr.com/4118/4884375437_b2954d4249_z.jpg&quot; title=&quot;large thumbnail of search results image&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4118/4884375437_b2954d4249_z.jpg&quot; alt=&quot;search results in google with sitemap feature&quot; width=&quot;380px&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Keywords&lt;/h2&gt;&lt;p&gt;Things started to get a bit messier with a discussion about keywords. Paula knows it can be a lot of work to add well chosen meta keywords to your pages. She used to give the editors guidelines to try and match all the important search queries in Google; adding keywords for higher search rankings. The editors had entered them extensively in their old CMS and I didn't want to migrate them, for they weren't very helpful at all. Even worse, they were always the same. &lt;/p&gt;&lt;p&gt;&lt;i&gt;Why don't you migrate them?&lt;/i&gt; She asked. &lt;i&gt;Google likes them, I read it in my report by the SEO consultants.&lt;/i&gt; &lt;/p&gt;&lt;p&gt;So I explained her what a nice job it must be, being an SEO consultant. It seems you can basically write whatever you want. Why? The search ranking algorithm isn't public. So a bit of the mystery remains. I'm not saying meta keywords will hurt your search results. But they won't help you either.&lt;br /&gt;Don't believe me? Check this guy's video:&lt;br /&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=jK7IPbnmvVU&quot; title=&quot;Google does not use keywords&quot;&gt;Google does not use the keywords meta tag in web ranking&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;So don't spend your time on keyword optimization for external search engines. Rather spend it on keywords for use within your own website. For example in your own search engine. Try making sure the list of keywords in your article is short and relevant. Then people will find what they are looking for faster and you can influence your website's search results. But searching within your own website is a different topic altogether. I might write about that another time.&lt;/p&gt;&lt;h2&gt;Link farms&lt;/h2&gt;&lt;p&gt;Very important is the amount of linking between you and other websites. If you link to a normal relevant website and they link back, it's pretty good news for your search results. However &lt;a href=&quot;http://en.wikipedia.org/wiki/Link_farm&quot; title=&quot;wikipedia about link farms&quot;&gt;a link farming&lt;/a&gt; doesn't work. That is bad news for your ranking. Broken links on your website don't help you either, so luckily Hippo CMS has a lot of tooling for that. &lt;/p&gt;&lt;h2&gt;Performance matters&lt;/h2&gt;&lt;p&gt;Paula didn't know performance mattered for search engines. It does. &lt;a href=&quot;http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html&quot; title=&quot;Using site speed in search ranking&quot; target=&quot;_blank&quot;&gt;Check this page by Google about it&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;I'm glad speed matters. I like fast websites. And others do too! It will get give your visitors a better feeling of usability. Higher performance leads to more page views. People return more often to fast website.  &lt;a href=&quot;http://www.youtube.com/watch?v=MStKwEff_kY&quot; title=&quot;Velocity 2010: Urs Holzle &quot;&gt;Some people argue it's the most important feature of your website&lt;/a&gt;. Anyhow. I'm glad Hippo can provide you with lightning speed. &lt;/p&gt;&lt;h2&gt;Nice, nice, nice, but now I want the secret&lt;/h2&gt;&lt;p&gt;So you're wondering why Hippo websites rank as high as they do? What is the secret? Is it about all the rules applied above? Partly. &lt;/p&gt;&lt;p&gt;The real secret is your &lt;b&gt;content&lt;/b&gt;. There's no smart technical feature giving you high rankings without having relevant &lt;b&gt;content&lt;/b&gt; people like. So the amount of pages with nice relevant articles is the little secret I'll give away. And that's exactly what editors in Hippo CMS can focus on. A search term in the title or introduction is more important then a search term in the body. But you don't have to tell people that. They do that already. &lt;/p&gt;&lt;p&gt;And by the way. Paula is very happy and is getting high search results. Are you next?&lt;/p&gt;&lt;p&gt;&lt;i&gt;All characters and events in this blog — even those based on real people — are entirely fictional.&lt;/i&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/862413798174121061-8634485584873037704?l=mathijsbrand.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 12 Aug 2010 16:01:13 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Mathijs Brand)</dc:creator>
</item>
<item>
	<title>Rolf van der Steen (Hippo): Hippo GetTogether T-shirt poll</title>
	<guid>tag:blogger.com,1999:blog-8488651744833642317.post-4190899187749385907</guid>
	<link>http://rolfvandersteen.blogspot.com/2010/08/hippo-gettogether-t-shirt-poll.html</link>
	<description>&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span&gt;To all Hippo GetTogether attendees; now is your chance to determine the looks of us hippotizers. We want you to choose your favorite T-shirt for the Hippo GetTogether (majority rules).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Vote on: &lt;a href=&quot;http://usabilla.com/rate/19475236134c5&quot;&gt;http://usabilla.com/rate/19475236134c5&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_xXtS8nTPUSE/TFlRJbUs2kI/AAAAAAAAABE/-OMypu08hxQ/s1600/tshirt_poll.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://1.bp.blogspot.com/_xXtS8nTPUSE/TFlRJbUs2kI/AAAAAAAAABE/-OMypu08hxQ/s320/tshirt_poll.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8488651744833642317-4190899187749385907?l=rolfvandersteen.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 04 Aug 2010 11:38:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Rolf van der Steen)</dc:creator>
</item>
<item>
	<title>Ard Schrijvers (Hippo): Relevance scoring your search results with the HST Query</title>
	<guid>http://blogs.onehippo.org/ard/2010/07/relevance_scoring_your_search.html</guid>
	<link>http://blogs.onehippo.org/ard/2010/07/relevance_scoring_your_search.html</link>
	<description>&lt;p&gt;Typically, customers like it when a title matches some query, that this item gets scored higher than a match for the query only in the documents body.&lt;/p&gt;

&lt;p&gt;Now, without going into the subtle details of Lucene scoring, by default all text in a Hippo Document is indexed with equal weight (assumi</description>
	<pubDate>Wed, 28 Jul 2010 16:17:32 +0000</pubDate>
</item>
<item>
	<title>Jasha Joachimsthal (Hippo): Reusing content with Hippo CMS</title>
	<guid>http://www.jasha.eu/blogposts/2010/07/Reusing-content-with-Hippo-CMS.html</guid>
	<link>http://www.jasha.eu/blogposts/2010/07/Reusing-content-with-Hippo-CMS.html</link>
	<description>&lt;div&gt;&lt;p&gt;It may sound very simple, but it&amp;apos;s something we have to keep telling: in Hippo CMS you&amp;apos;re managing content, not webpages. Even for a simple site as mine, a document can appear in multiple forms. There&amp;apos;s the detail page of a blog post which you may see now. You may have seen the title, date, introduction and tags in the overview or the faceted navigation. It&amp;apos;s also very well possible that you read this blog post in Google Reader and you have never seen my website at. Now that&amp;apos;s already 3 different ways of showing content of the same document.&lt;/p&gt;&lt;p&gt;To be honest, the RSS feed may be a default feature for most systems now, but
you can do more with the content. One of the projects I have worked on recently
was for a company with several rental locations spread over the country. For
each rental location it maintains a document in the CMS with the address data
including GPS coordinates. If a rental location is temporarily closed, there's a
special field for it in the document. In the front end there are multiple views
on that document.&lt;/p&gt;

&lt;p&gt;The most obvious is a webpage with the full details of the rental location
like the address (and a link to a Google Map), directions, opening hours and
optionally the message that the location is temporarily closed.&lt;/p&gt;

&lt;p&gt;To get to this view, there's a search box on the homepage with autocomplete
for all the locations. This autocomplete list is created dynamically by a query
over all rental location documents, the editors don't have to maintain a
separate list.&lt;/p&gt;

&lt;p&gt;If a visitor of the site ignores the autocomplete list and only enters the
city name, he or she will get a list of all rental locations in that city plus a
Google Map showing the locations. The pointers on this Google Map are generated
on the fly based on the search term the visitor entered.&lt;/p&gt;

&lt;p&gt;On the homepage the visitor can click on a link to see which rental locations
are temporarily closes. This is to inform customers who use the rental product
frequently, that their location is temporarily closed but will be available
again. The list, which is hopefully empty, is a result of a query on all rental
locations with the special field enabled for &quot;temporarily closed&quot;.&lt;/p&gt;

&lt;p&gt;Now this is only the content reuse within the site itself. We have also
created an &lt;a href=&quot;http://www.onehippo.org/site-toolkit&quot;&gt;HST&lt;/a&gt; component that
produces a list of all rental locations in
&lt;a href=&quot;http://en.wikipedia.org/wiki/Keyhole_Markup_Language&quot;&gt;KML format&lt;/a&gt;.
This XML output can be used to import into Google Maps to display a map of all
rental locations on an external site. There are also plans to create mobile
phone applications to find a rental location near you or a dynamically generated
PDF that lists all the rental locations.&lt;/p&gt;

&lt;p&gt;All these views are using the same datasource: the documents that represent
the rental locations. Every view is generated at request which means that
updates are immediately visible.&lt;/p&gt;

&lt;p&gt;Are you still maintaining a webpage?&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 27 Jul 2010 06:01:13 +0000</pubDate>
	<dc:creator>Jasha Joachimsthal</dc:creator>
</item>
<item>
	<title>Tjeerd D. Brenninkmeijer (Hippo): Performance does matter..</title>
	<guid>http://blogs.onehippo.org/tjeerd/2010/07/performance_does_matter_1.html</guid>
	<link>http://blogs.onehippo.org/tjeerd/2010/07/performance_does_matter_1.html</link>
	<description>&lt;a href=&quot;http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html &quot;&gt;Google&lt;/a&gt; will be using site speed in web search ranking. 

A quick website is no longer just a nice-to-have as Google is using a new signal in their search ranking algorithms: site speed. Site</description>
	<pubDate>Wed, 21 Jul 2010 13:54:16 +0000</pubDate>
</item>
<item>
	<title>Jasha Joachimsthal (Hippo): Show Tweets with HST and Twitter4J</title>
	<guid>http://www.jasha.eu/blogposts/2010/07/show-tweets-with-hst-and-twitter4j.html</guid>
	<link>http://www.jasha.eu/blogposts/2010/07/show-tweets-with-hst-and-twitter4j.html</link>
	<description>&lt;div&gt;&lt;p&gt;As you may have noticed, my five latest Tweets show up on my site. In this blog I&amp;apos;ll explain how you can easily add such a block to your HST site.&lt;/p&gt;&lt;p&gt;For the Twitter component I've used
&lt;a href=&quot;http://twitter4j.org&quot;&gt;Twitter4J&lt;/a&gt; to retrieve my latest tweets. The
first step is to add its dependency to your CMS pom:&lt;/p&gt;

&lt;pre class=&quot;brush: xml&quot;&gt;  &amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.twitter4j&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;twitter4j-core&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;[2.1,)&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/pre&gt;

&lt;p&gt;Then create your TwitterComponent that extends
org.hippoecm.hst.component.support.bean.BaseHstComponent. In your
TwitterComponent add a doBeforeRender method that will fetch your latest
updates. The quick (and a bit dirty) way is to authenticate using a Twitter
username and password. Twitter4J also supports using
&lt;a href=&quot;http://oauth.net/&quot;&gt;oAuth&lt;/a&gt; which you may prefer over storing your
Twitter credentials.&lt;/p&gt;

&lt;p&gt;First get a Twitter instance with your credentials (wil be deprecated see
update at the end of this article):&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;Twitter twitter = new TwitterFactory().getInstance([username], [password]);&lt;/pre&gt;

&lt;p&gt;Then get your Tweets and ReTweets. Twitter does not return a combined list of
Tweets and ReTweets because of backwards compatibility so you'll have to combine
them yourself. You probably want to show the newest first so you'll have to use
a descending sort order based on the ID of the Status.&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;     try {
            List&amp;lt;Status&amp;gt; statuses = twitter.getUserTimeline();
            List&amp;lt;Status&amp;gt; retweets = twitter.getRetweetedByMe();
            statuses.addAll(retweets);
            Set&amp;lt;Status&amp;gt; allStatuses = new TreeSet&amp;lt;Status&amp;gt;(Collections.reverseOrder());
            allStatuses.addAll(statuses);
            allStatuses.addAll(retweets);
            if (!allStatuses.isEmpty()) {
                request.setAttribute(&quot;statuses&quot;, allStatuses);
            }
        } catch (TwitterException e) {
            log.warn(&quot;Error getting Twitter status updates&quot;, e);
        }

&lt;/pre&gt;

&lt;p&gt;To display the 5 newest (Re)Tweets, use this in your JSP (don't forget to add
the taglibs):&lt;/p&gt;

&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;ul&amp;gt;
      &amp;lt;c:forEach items=&quot;${statuses}&quot; var=&quot;status&quot; begin=&quot;0&quot; end=&quot;4&quot;&amp;gt;
        &amp;lt;li&amp;gt;
          &amp;lt;c:choose&amp;gt;
            &amp;lt;c:when test=&quot;${status.retweet}&quot;&amp;gt;
              RT ${status.retweetedStatus.user.screenName}: ${status.retweetedStatus.text}&amp;lt;br /&amp;gt;
              Retweeted at
              &amp;lt;a href=&quot;http://twitter.com/${status.retweetedStatus.user.screenName}/status/${status.retweetedStatus.id}&quot; rel=&quot;external&quot;&amp;gt;
              &amp;lt;fmt:formatDate value=&quot;${status.createdAt}&quot; pattern=&quot;d MMM H:mm&quot;/&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;/c:when&amp;gt;
            &amp;lt;c:otherwise&amp;gt;
              ${status.text}&amp;lt;br /&amp;gt;
              &amp;lt;a href=&quot;http://twitter.com/${status.user.screenName}/status/${status.id}&quot; rel=&quot;external&quot;&amp;gt;
              &amp;lt;fmt:formatDate value=&quot;${status.createdAt}&quot; pattern=&quot;d MMM H:mm&quot;/&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;/c:otherwise&amp;gt;
          &amp;lt;/c:choose&amp;gt;
        &amp;lt;/li&amp;gt;
      &amp;lt;/c:forEach&amp;gt;
    &amp;lt;/ul&amp;gt;&lt;/pre&gt;

&lt;p&gt;Note: Twitter4J does not have a caching mechanism
&lt;a href=&quot;http://yusuke.homeip.net/jira/browse/TFJ-185&quot;&gt;yet&lt;/a&gt;. Twitter allows
you to do 150 API calls per hour (excluding posting updates). If you exceed that
limit, it will return a 400 (bad request) instead of your latest (Re)Tweets.
&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;Update about authentication (22-07-2010) &lt;/h2&gt;
&lt;p&gt;I totally overlooked the warning by Twitter that the basic authentication is
going to be shut down from August 16 in favour of oAuth. If you need a quick
&amp;amp; dirty way to generate your Autorization secrets,
&lt;a href=&quot;http://twitter.com/apps/new&quot;&gt;register&lt;/a&gt; your application (choose for
Application Type client) and read
&lt;a href=&quot;http://consultingblogs.emc.com/nileeshabojjawar/archive/2010/03/18/twitter4j-oauth-generating-the-access-token.aspx&quot;&gt;this
blog&lt;/a&gt; to generate your AccesToken. Then you can get a Twitter instance with:
&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;AccessToken accessToken = new AccessToken([token],[tokenSecret]);
Twitter twitter= new TwitterFactory().getOAuthAuthorizedInstance([consumerKey], [consumerSecret], accessToken);
&lt;/pre&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 20 Jul 2010 21:01:17 +0000</pubDate>
	<dc:creator>Jasha Joachimsthal</dc:creator>
</item>
<item>
	<title>Rolf van der Steen (Hippo): Usability test: Insert / Modify Image</title>
	<guid>tag:blogger.com,1999:blog-8488651744833642317.post-7206270579772203601</guid>
	<link>http://rolfvandersteen.blogspot.com/2010/07/usability-test-insert-modify-image.html</link>
	<description>&lt;div&gt;&lt;span&gt;A call to Hippo CMS7 authors, editors and admins! Please join in on the next usability test.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;This test is about inserting and editing images while editing a document. Please use the following URL to start the test: &lt;a href=&quot;http://usabilla.com/rate/5077836124c35&quot;&gt;http://usabilla.com/rate/5077836124c35&lt;/a&gt; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;Please don't hesitate to join in and speak up. Your opinion is much appreciated!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;Note on Usabilla (the tool I'm  using for these tests): Participating is anonymous; It is not possible  for me to see who has participated. If you like to get in touch  personally, please state your email in a note in the test.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8488651744833642317-7206270579772203601?l=rolfvandersteen.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 08 Jul 2010 13:57:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Rolf van der Steen)</dc:creator>
</item>
<item>
	<title>Rolf van der Steen (Hippo): Results usability test: Done vs. Save and Close</title>
	<guid>tag:blogger.com,1999:blog-8488651744833642317.post-5357028575455866232</guid>
	<link>http://rolfvandersteen.blogspot.com/2010/06/results-usability-test-done-vs-save.html</link>
	<description>&lt;div&gt;&lt;span&gt;To all participants: thank you!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;After just 2 days I've already got a really good amount of feedback.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_xXtS8nTPUSE/TBnN1Sec1QI/AAAAAAAAAA0/O6avO-Rexag/s1600/testresultssaveandclose.png&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/_xXtS8nTPUSE/TBnN1Sec1QI/AAAAAAAAAA0/O6avO-Rexag/s320/testresultssaveandclose.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;As can be seen in the results above there is a very strong preference for the &quot;Save &amp;amp; Close&quot; button, as opposed to the &quot;Done&quot; button. We'll be changing this soon.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;I also received some suggestions for a &quot;Close without save&quot; button, which would discard changes since last opening a document. We are looking into that.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8488651744833642317-5357028575455866232?l=rolfvandersteen.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 17 Jun 2010 07:12:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Rolf van der Steen)</dc:creator>
</item>
<item>
	<title>Jasha Joachimsthal (Hippo): Web development tools I use at Hippo</title>
	<guid>http://www.jasha.eu/blogposts/2010/06/Web-development-tools-I-use-at-Hippo.html</guid>
	<link>http://www.jasha.eu/blogposts/2010/06/Web-development-tools-I-use-at-Hippo.html</link>
	<description>&lt;div&gt;&lt;p&gt;Earlier this week a customer with its own development department asked us which tools we use for measuring quality and performance of websites. In this blogpost I&amp;apos;ll describe some of the tools I use to check the HTML and CSS. I know there are more tools available and it&amp;apos;s not a complete list of the tools I use, but I&amp;apos;ll cover my most frequently used.&lt;/p&gt;&lt;p&gt;The quality of the HTML and CSS starts at the design phase. Most of the HTML
and CSS I see have already been designed, my task is to make the static designs
dynamic with content from a Hippo Repository. This doesn't mean I have no
opinion at all about the quality of the design. As more people of my age I
started making websites as a teenager when frames had just been introduced,
Netscape was a faster alternative for Mosaic, tables were necessary for markup
and the font tag was accepted. Later CSS was introduced but browsers (IE) had no
problem making a webpage out of the tagsoup from Frontpage or Geocities, the
horror. Modern professional designers make a clear distinction between HTML and
CSS, use HTML elements what they are meant for and think of performance. Some of
the tools will guide you towards correct and efficient usage of HTML and CSS.
&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;Web developer toolbar &lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;http://chrispederick.com/work/web-developer/&quot;&gt;web developer
toolbar&lt;/a&gt; is one of the first Firefox extensions I add. It offers quick access
to options you can also find in the preferences of the browser like clearing the
browser cache, disable CSS or scripts. Disabling CSS and scripts are sometimes
necessary to check if the site is still usable for someone who uses a text
browser, read speaker or a (mobile) browser with less features, requirements for
Dutch governmental websites. One example are the related dropdowns I made for
the &lt;a href=&quot;http://www.rijksbegroting.nl/algemeen/zoeken_op_thema&quot;&gt;thematic
search&lt;/a&gt; in the website for the national budget. If Javascript is enabled you
see the sub category after choosing the main category. Without Javascript you
see one dropdown with &amp;lt;optgroup/&amp;gt; to (visually) separate the categories.
&lt;/p&gt;

&lt;p&gt;Other handy features are shortcuts to validate the current page for
correctness of HTML, CSS or even feeds.  &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;Firebug &lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://getfirebug.com/&quot;&gt;Firebug&lt;/a&gt; is a very handy tool to see the
interpreted source of the webpage. This may be different from the HTML response
from the server due to DOM manipulation by scripts or the use of tagsoup instead
of valid (X)HTML. It also allows you to manipulate the HTML or CSS to quickly
see the effect of changing the styling. It can also show you the requests the
browser did for the current page, how long they took, and if they were
successful.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;Yslow &lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://developer.yahoo.com/yslow/&quot;&gt;Yslow&lt;/a&gt; on top of Firebus gives
you performance tips of the page you're working on like &quot;CSS first, then
scripts&quot;, &quot;Minimize CSS and scripts&quot;, &quot;Use a Content Delivery Network&quot; or &quot;Use
expires headers&quot;. You may start with a Javascript framework (JQuery, Prototype)
and one or two scripts. After a few months you discover that there are more than
10 different uncompressed script files on one page. Each of those files need a
request, optional check if they can be cached and a response. Yslow will warn
you about these things.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;YUI compressor &lt;/h2&gt;
&lt;p&gt;If you end up writing large CSS and script files, it's better to compress or
minimize them. For you as developer they're easier to read when you use
indentation and variables have sensible names like postalCode,
addressAndHouseNumer. For the browser all the whitespace is a waste of bandwith
and the variables in scripts may also be called a and b. The
&lt;a href=&quot;http://developer.yahoo.com/yui/compressor/&quot;&gt;YUI compressor&lt;/a&gt; can
minimize CSS and scripts. If you want it can also &quot;obfuscate&quot; the variables
which saves bandwith and as side effect make them harder to reuse (not something
you'd want as open source developer).&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;WAVE &lt;/h2&gt;
&lt;p&gt;With WAVE I don't mean the chaotic, IRC style collaboration tool of a company
that makes money with online advertisements.
&lt;a href=&quot;http://wave.webaim.org/&quot;&gt;WAVE&lt;/a&gt; is a Firefox extension for checking
accessibility of your HTML. It shows you if there are missing labels for form
fields, empty or missing alt attributes for images, if there are not too many
similar alt texts and if the headers are correct.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;Different Internet Explorer versions &lt;/h2&gt;
&lt;p&gt;Like most of my colleagues I use Mozilla Firefox as default browser. The many
useful extensions make it a pleasure to use, despite the occasional memory leak.
Most visitors of our customers' website use different browsers, mainly Microsoft
Internet Explorer. For me it's a very important reason to keep using Windows
instead of switching to Ubuntu on my company laptop. If something works or looks
good in modern browsers like Firefox or Chrome it doesn't mean MSIE will behave
in the same way. IE8 is a big improvement by supporting more standards than IE7
and by offering development tools that contain functionality I know from the
Firefox web developer toolbar and Firebug. With IE8 you can also switch to IE7
rendering but there's still a minor browser we have to support, the antique IE6.
For a quick view of how it may render I use
&lt;a href=&quot;http://tredosoft.com/Multiple_IE&quot;&gt;MultipleIEs&lt;/a&gt;, but if I really want
to see native IE6, I have a virtual machine installed. Microsoft offers
&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=21eabb90-958f-4b64-b5f1-73d0a413c8ef&amp;amp;displaylang=en&quot;&gt;virtual
machines&lt;/a&gt; with different Internet Explorers and Windows versions. &lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 16 Jun 2010 21:01:25 +0000</pubDate>
	<dc:creator>Jasha Joachimsthal</dc:creator>
</item>
<item>
	<title>Rolf van der Steen (Hippo): Usability test: Done vs. Save and Close</title>
	<guid>tag:blogger.com,1999:blog-8488651744833642317.post-6579965568227288878</guid>
	<link>http://rolfvandersteen.blogspot.com/2010/06/usability-test-done-vs-save-close.html</link>
	<description>&lt;div&gt;&lt;span&gt;For those of you who don't know me; I'm Rolf van der Steen, User Experience designer at Hippo. It is my responsibility to ensure our products are easy to use and understand, and users will have a  excellent experience when using them.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;To achieve this I would like to ask for your help. From now on I'll be regularly posting usability tests. These are quick tests focussing on (small) parts of the user interface. The tests will take no longer than a couple of minutes to complete.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;I gladly like to invite you to participate in these tests. At this moment the tests will be focussing on Hippo CMS7. Also I'm primarily interested in the opinion of actual end users.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;So, are you using Hippo CMS7 as an author, editor or admin? Please don't hesitate to join in and speak up. Your opinion is much appreciated!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;And to start of right away; here's the first usability test already. It is a fairly simple test asking wether you prefer a 'Done' or 'Save &amp;amp; Close' button for closing your document. To start the test, please use the following URL:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;http://usabilla.com/rate/13889265014c1&quot;&gt;http://usabilla.com/rate/13889265014c1&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Note on Usabilla (the tool I'm using for these tests): Participating is anonymous; It is not possible for me to see who has participated. If you like to get in touch personally, please state your email in a note in the test.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8488651744833642317-6579965568227288878?l=rolfvandersteen.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 15 Jun 2010 08:08:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Rolf van der Steen)</dc:creator>
</item>
<item>
	<title>Jeroen Reijn (Hippo): An introduction to Hippo CMS 7 updater modules</title>
	<guid>tag:blogger.com,1999:blog-2962867622850517744.post-6097047555291621858</guid>
	<link>http://blog.jeroenreijn.com/2010/06/introduction-to-hippo-cms-7-updater.html</link>
	<description>Once your &lt;a href=&quot;http://www.onehippo.org/&quot;&gt;Hippo CMS&lt;/a&gt; project is in production, there is always the case that you or your customer wants to add extra features to the website or portal. This might mean that the data model has to change.&lt;br /&gt;The data model for a piece of content in Hippo CMS is stored based on a JCR nodetype defintion.&lt;br /&gt;As you might know the editor templates, which are related to the data model, can be edited live in the CMS. When you're done editing the editor templates, you can use the 'Update all content' button to persist the changes in your existing content model. &lt;br /&gt;This might be a nice way of doing things during development, but performing such an operation on a live clustered environment can be quite tricky and you might want to do it in a more controlled and tested way. &lt;br /&gt;As of Hippo CMS 7.2 it's possible to perform these changes by writing updater modules in plain Java. In this post I will try to explain the concept of updater modules and will show you how to write these updater modules and use them for updating your data model.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Writing an Updater module&lt;/h2&gt;&lt;br /&gt;When you start writing an updater module you can start out with the following simple class file:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:java&quot;&gt;import org.hippoecm.repository.ext.UpdaterModule;&lt;br /&gt;import org.hippoecm.repository.ext.UpdaterContext;&lt;br /&gt;&lt;br /&gt;public class MyProjectUpdater implements UpdaterModule {&lt;br /&gt;&lt;br /&gt;    public void register(final UpdaterContext context) {&lt;br /&gt;       .....&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see in the above code snippet our updater module extend the UpdaterModule interface, which requires you to implement the register() method. In your IDE you will need the hippo-ecm-api library, which comes with the Hippo CMS 7 war package or you can get it from the maven 2 repository.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Updaters and versioning&lt;/h2&gt;&lt;br /&gt;Performing such an update on your data model is most of the time specific for the current release of your project. The engine behind the updater modules can be instructed to only trigger certain updater modules if certain requirements (like the version of your project) are met. You can instruct the updater engine to trigger a specific updater module by registering a start tag on the UpdaterContext. In the following example we will:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;register a unique name for our updater module&lt;/li&gt;&lt;li&gt;register a start tag for which this updater module should be triggered&lt;/li&gt;&lt;li&gt;register an end tag to which this version should change once the update was successful&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;pre class=&quot;brush:java&quot;&gt;import org.hippoecm.repository.ext.UpdaterModule;&lt;br /&gt;import org.hippoecm.repository.ext.UpdaterContext;&lt;br /&gt;&lt;br /&gt;public class MyProjectUpdater implements UpdaterModule {&lt;br /&gt;&lt;br /&gt;    public void register(final UpdaterContext context) {&lt;br /&gt;        context.registerName(&quot;myproject-updater-v1-to-v1_1&quot;);&lt;br /&gt;        context.registerStartTag(&quot;myproject-v1&quot;);&lt;br /&gt;        context.registerEndTag(&quot;myproject-v1_1&quot;);&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In the above updater module we will update our project from version 1 to version 1.1.&lt;br /&gt;Our updater module does not do any radical changes so far. It will only change the start version in the repository for our project. You can find the current registered version(s) inside the Hippo repository with the Hippo CMS Console view on the path:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/hippo:configuration/hippo:initialize/@hippo:version.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you don't have a project specific version yet, I would recommend creating one, because it will help you with using these updater modules.&lt;br /&gt;&lt;br /&gt;Now let's continue with some more interesting stuff.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Visitors&lt;/h2&gt;&lt;br /&gt;You might want to change the data model with some simple operations like: adding a field, removing a field or introducing some new nodetypes. The hippo repository provides several visitors for doing changes inside the repository while performing an update. By default Hippo CMS 7.3 comes with 4 types of visitors. The following diagram shows you the class hierarchy for the ItemVisitor interface.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_hd6Y7yyFK7E/TA-hx6QkNXI/AAAAAAAAAY4/MpeeqjGgZMc/s1600/visitor-diagram.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;196&quot; src=&quot;http://1.bp.blogspot.com/_hd6Y7yyFK7E/TA-hx6QkNXI/AAAAAAAAAY4/MpeeqjGgZMc/s640/visitor-diagram.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As you can see the following visitors are available:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;NodeTypeVisitor - visits nodes of a specific primary type&lt;/li&gt;&lt;li&gt;PathVisitor - visits nodes based on their path in the repository&lt;/li&gt;&lt;li&gt;QueryVisitor - visits nodes found based on a JCR query&lt;/li&gt;&lt;li&gt;NamespaceVisitor - visits specified namespaces&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Of course you can also write your own visitor if you want, but I guess the provided visitors are the most commonly used.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;How to use a visitor in your module&lt;/h2&gt;Now that we've seen the available visitors, let's see how we can use them. I think the most common use for updaters is when you need to update your data model without any extra processing involved. Let's say our current datamodel (cnd) version 1.0 looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:plain&quot;&gt;&amp;lt;hippo='http://www.onehippo.org/jcr/hippo/nt/2.0'&amp;gt;&lt;br /&gt;&amp;lt;hippostd='http://www.onehippo.org/jcr/hippostd/nt/2.0'&amp;gt;&lt;br /&gt;&amp;lt;hippostdpubwf='http://www.onehippo.org/jcr/hippostdpubwf/nt/1.0'&amp;gt;&lt;br /&gt;&amp;lt;myproject='http://www.myproject.org/jcr/nt/1.0'&amp;gt;&lt;br /&gt;&lt;br /&gt;[myproject:basedocument] &amp;gt; hippo:document, hippostdpubwf:document, hippostd:publishableSummary&lt;br /&gt;&lt;br /&gt;[myproject:news] &amp;gt; myproject:basedocument&lt;br /&gt;- myproject:title (string)&lt;br /&gt;+ myproject:text (hippostd:html)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We want to move to version 1.1, where we added a new subtitle field. The new nodetype defintion now looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:plain&quot;&gt;&amp;lt;hippo='http://www.onehippo.org/jcr/hippo/nt/2.0'&amp;gt;&lt;br /&gt;&amp;lt;hippostd='http://www.onehippo.org/jcr/hippostd/nt/2.0'&amp;gt;&lt;br /&gt;&amp;lt;hippostdpubwf='http://www.onehippo.org/jcr/hippostdpubwf/nt/1.0'&amp;gt;&lt;br /&gt;&amp;lt;myproject='http://www.myproject.org/jcr/nt/1.1'&amp;gt;&lt;br /&gt;&lt;br /&gt;[myproject:basedocument] &amp;gt; hippo:document, hippostdpubwf:document, hippostd:publishableSummary&lt;br /&gt;&lt;br /&gt;[myproject:news] &amp;gt; myproject:basedocument&lt;br /&gt;- myproject:title (string)&lt;br /&gt;- myproject:subtitle (string)&lt;br /&gt;+ myproject:text (hippostd:html)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now if we want to update our namespace with an updater module our actual code will look like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:java&quot;&gt;import java.io.InputStreamReader;&lt;br /&gt;&lt;br /&gt;import org.hippoecm.repository.ext.UpdaterItemVisitor;&lt;br /&gt;import org.hippoecm.repository.ext.UpdaterModule;&lt;br /&gt;import org.hippoecm.repository.ext.UpdaterContext;&lt;br /&gt;&lt;br /&gt;public class MyProjectUpdater implements UpdaterModule {&lt;br /&gt;&lt;br /&gt;    public void register(final UpdaterContext context) {&lt;br /&gt;        context.registerName(&quot;myproject-updater-v1-to-v1_1&quot;);&lt;br /&gt;        context.registerStartTag(&quot;myproject-v1&quot;);&lt;br /&gt;        context.registerEndTag(&quot;myproject-v1_1&quot;);&lt;br /&gt;        &lt;br /&gt;        context.registerVisitor(new UpdaterItemVisitor.NamespaceVisitor(context, &quot;myproject&quot;, &quot;-&quot;,&lt;br /&gt;        new InputStreamReader(getClass().getClassLoader().getResourceAsStream(&quot;myproject.cnd&quot;))));&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The updater module above registers a namespace visitor on the UpdaterContext and the visitor reloads the content nodetype definition (cnd in short) from the classpath and updates the namespace to the new version. This is all you have to do to just bump a namespace from version 1.0 to 1.1.&lt;br /&gt;&lt;br /&gt;Now if you actually want to change something during the update we can make use of one of the other visitors like the NodeTypeVisitor. Let's say we want to change a certain property of all documents of type 'myproject:news', then this is what the updater might look like:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:java&quot;&gt;import java.io.InputStreamReader;&lt;br /&gt;&lt;br /&gt;import javax.jcr.Node;&lt;br /&gt;import javax.jcr.RepositoryException;&lt;br /&gt;import javax.jcr.Value;&lt;br /&gt;&lt;br /&gt;import org.hippoecm.repository.ext.UpdaterItemVisitor;&lt;br /&gt;import org.hippoecm.repository.ext.UpdaterModule;&lt;br /&gt;import org.hippoecm.repository.ext.UpdaterContext;&lt;br /&gt;&lt;br /&gt;public class MyProjectUpdater implements UpdaterModule {&lt;br /&gt;&lt;br /&gt;    public void register(final UpdaterContext context) {&lt;br /&gt;        context.registerName(&quot;myproject-updater-v1-to-v1_1&quot;);&lt;br /&gt;        context.registerStartTag(&quot;myproject-v1&quot;);&lt;br /&gt;        context.registerEndTag(&quot;myproject-v1_1&quot;);&lt;br /&gt;        &lt;br /&gt;        context.registerVisitor(new UpdaterItemVisitor.NodeTypeVisitor(&quot;myproject:news&quot;) {&lt;br /&gt;            @Override&lt;br /&gt;            protected void leaving(Node node, int level) throws RepositoryException {&lt;br /&gt;               if (node.hasProperty(&quot;myproject:property&quot;)) {&lt;br /&gt;                   node.setProperty(&quot;myproject:property&quot;, &quot;new value&quot;);&lt;br /&gt;               }&lt;br /&gt;            } &lt;br /&gt;        });&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The important part of the updater in this case is that we override the &lt;b&gt;leaving()&lt;/b&gt;&amp;nbsp;method, which will be called before the visitor leaves this node and moves on to the next. It will then change the value of a certain property and move on.&lt;br /&gt;&lt;br /&gt;If you want to see more examples of how to use certain types of visitors please let me know, but I hope that the two examples above can help you get started with writing updater modules. Now let's see how to get the repository to run your updater module&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Adding the updater module to your deployment&lt;/h2&gt;&lt;br /&gt;Now that we've seen how to write an updater module, the next step is to get the repository to run your updater module. The Hippo CMS 7 repository knows about the existence of these updater module, but you will need to instruct the repository on where they can be found. Making an updater module available to repository is done in the similar fashion as &lt;a href=&quot;http://blog.jeroenreijn.com/2009/03/using-daemon-modules-with-hippo-cms-7.html&quot;&gt;adding a daemon module to the repository&lt;/a&gt;. The location of the updater module needs to be added to the MANIFEST.MF, which will end up in your jar. Maven 2 can help you with achieving this by means of the maven-jar-plugin. See the following plugin configuration from my pom.xml file.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;  &amp;lt;groupid&amp;gt;org.apache.maven.plugins&amp;lt;/groupid&amp;gt;&lt;br /&gt;  &amp;lt;artifactid&amp;gt;maven-jar-plugin&amp;lt;/artifactid&amp;gt;&lt;br /&gt;  &amp;lt;configuration&amp;gt;&lt;br /&gt;    &amp;lt;archive&amp;gt;&lt;br /&gt;      &amp;lt;manifest&amp;gt;&lt;br /&gt;        &amp;lt;addDefaultImplementationEntries&amp;gt;true&amp;lt;/addDefaultImplementationEntries&amp;gt;&lt;br /&gt;      &amp;lt;/manifest&amp;gt;&lt;br /&gt;      &amp;lt;manifestEntries&amp;gt;&lt;br /&gt;        &amp;lt;Hippo-Modules&amp;gt;com.myproject.repository.update.MyProjectUpdater&amp;lt;/Hippo-Modules&amp;gt;&lt;br /&gt;      &amp;lt;/manifestEntries&amp;gt;&lt;br /&gt;    &amp;lt;/archive&amp;gt;&lt;br /&gt;  &amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now when you add the jar with our updater module to the CMS web application archive and start the CMS, the repository will scan all manifest files for implementations of the UpdaterModule interface. The updater modules will be registered and triggered when needed. &lt;br /&gt;&lt;br /&gt;The updater modules are quite powerful and it's great that you can test them on your test environment, so you can make sure that when you perform an update in production it will succeed.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2962867622850517744-6097047555291621858?l=blog.jeroenreijn.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 10 Jun 2010 07:45:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Jeroen Reijn)</dc:creator>
</item>
<item>
	<title>Vijay Kiran (Hippo): Faceted Navigation with Hippo CMS and HST2</title>
	<guid>http://www.vijaykiran.com/?p=2143</guid>
	<link>http://www.vijaykiran.com/2010/06/02/building-faceted-navigation-with-hippo-cms-hst2/</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://www.vijaykiran.com/wp-content/uploads/2010/06/faceted-navigation-post.png&quot; alt=&quot;&quot; title=&quot;faceted-navigation&quot; class=&quot;alignright wp-image-2148&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Categorizing and presenting large volumes of documents is a big challenge. Content can be organized by</description>
	<pubDate>Wed, 02 Jun 2010 12:14:08 +0000</pubDate>
	<dc:creator>Vijay Kiran</dc:creator>
</item>
<item>
	<title>Rolf van der Steen (Hippo): Designing Complex Applications</title>
	<guid>tag:blogger.com,1999:blog-8488651744833642317.post-5737193779065514279</guid>
	<link>http://rolfvandersteen.blogspot.com/2010/05/from-16-to-18-may-i-was-in-london-for.html</link>
	<description>&lt;span&gt;From 16 to 18 may I was in London for the  training 'Designing Complex Applications'. This training is part of the  Usability Week by the Norman Nielsen group.&lt;br /&gt;&lt;br /&gt;For those interested;  more information on the training:&lt;br /&gt;&lt;a href=&quot;http://www.nngroup.com/events/tutorials/complex_apps.html&quot; target=&quot;_blank&quot;&gt;http://www.nngroup.com/events/tutorials/complex_apps.html&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.nngroup.com/events/tutorials/complex_apps_2.html&quot; target=&quot;_blank&quot;&gt;http://www.nngroup.com/events/tutorials/complex_apps_2.html&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.nngroup.com/events/tutorials/complex_apps_3.html&quot; target=&quot;_blank&quot;&gt;http://www.nngroup.com/events/tutorials/complex_apps_3.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I would like to share my two most important insights from this  training.&lt;/span&gt;   &lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;1. Do More User Centered Design&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Hippo's  development process is very much technology-oriented and requirements  are mostly based on internal vision only. The level of UCD should be  higher. There are two key elements in this:&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Design research (usefulness). Truly getting to know and  understand our users; what is the value of our software to them, what is  important to them on a deep level addressing feelings and concerns.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt; Usability  testing (usability): once useful functionality has been determined and  designed, we should test whether it is usable (before developing it).  Note: designed means 'draft design' here; testing with paper prototypes,  mockups, partial clickables etc. There are some good methods to do  'guerilla' usability testing (=fast and low cost).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;Get out of the building! Do design research to make design  decisions data-driven. Without it, we're just guessing. This is all about aligning the users mental model and the  designers (and hopefully developer's) conceptual model to create a  consistent 'system image'.&lt;br /&gt;&lt;br /&gt;This will result in better adoption, higher customer satisfaction,  higher ROI, etc (although it is difficult to put some hard numbers on  this).&lt;/span&gt; &lt;span&gt;&lt;br /&gt;&lt;br /&gt;My goals:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Set up methods for design research /  usability testing which fit within the Agile process: set up user group, stakeholder interviews, domain  investigation&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Deliver design artifacts: personas, use cases, mental models, sketches, wireframes, prototypes&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;&lt;i&gt;2.  Make Design Artifacts Tangible&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Design is not a 'black art';  transforming data from the design research into 'bits and clicks'  can be broken down into distinct tools and steps that anyone can learn  and use to improve. I want to make these design  artifacts more tangible (to Hippo developers, management and user group)  by having it centrally available on our Confluence-wiki. This will  help:&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Communicate designs and open up design discussions internally&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Do  remote usability testing&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Align stakeholders and end-users  concerns/goals, preventing people filling in the gaps with their own  different assumptions.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Secure design knowledge&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Shorten design process (by means of  reusing patterns from a central library)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;My goals:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Create  a 'UI-place' on Confluence and start filling it in. Note that this will  be an ongoing thing (so-called 'living specifications').&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Try-out Balsamiq, which is a wireframing/prototyping tool which  integrates with Confluence.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;Furthermore the training provided a  lot of patterns and examples - specifically for complex  (web)applications used by domain experts - which are useful to me as  source of inspiration / to be in the library.&lt;br /&gt;&lt;br /&gt;Hope this gives you some idea of what I've been up to in London and  like to hear your opinion on this.&lt;/span&gt; &lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8488651744833642317-5737193779065514279?l=rolfvandersteen.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 28 May 2010 06:35:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Rolf van der Steen)</dc:creator>
</item>
<item>
	<title>Vijay Kiran (Hippo): Multi Channel Publishing with Hippo CMS and HST</title>
	<guid>http://www.vijaykiran.com/?p=2051</guid>
	<link>http://www.vijaykiran.com/2010/05/26/multi-channel-publishing-with-hippo-cms-hst/</link>
	<description>&lt;h3&gt;
            Introduction&lt;br /&gt;
        &lt;/h3&gt;
&lt;p&gt;
            When you are using&lt;a href=&quot;http://www.onehippo.com/en/products/cms&quot; target=&quot;_blank&quot;&gt;Hippo CMS&lt;/a&gt;, the content and the presentation logic are clearly separated. This cleaner approach to content management allows the users to publish content to various channels with less or no effort. In this post I&amp;#8217;ll try to explain how you can setup a multi channel publishing system using &lt;a href=&quot;http://www.onehippo.com/en/products/cms&quot; target=&quot;_blank&quot;&gt;Hippo CMS&lt;/a&gt; and Hippo Site Toolkit that can serve same content to different channels viz. Web Sites, Mobile (iPhone), iCalendar format and &lt;a href=&quot;http://www.layar.com&quot; target=&quot;_blank&quot;&gt;Layar&lt;/a&gt; (Augmented Reality Browser).&lt;br /&gt;
            In this article, I assume that you are a bit familiar with developing a website using Hippo CMS and Hippo Site Toolkit.
        &lt;/p&gt;
&lt;h3&gt;
            What is Multi Channel Publishing?&lt;br /&gt;
        &lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;
            Multi Channel Publishing represents the execution and/or deployment of communication(s) across any of the various channels (of communication), which includes print, email, mobile, web, podcasts or any other of the existing channels.&lt;br /&gt;
                &amp;#8211; &lt;a href=&quot;http://en.wikipedia.org/wiki/Multi_Channel_Publishing&quot; target=&quot;_blank&quot;&gt;WikiPedia&lt;/a&gt;
        &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;
             As an example scenario, consider that you are building an events website with each event having a location, image, date and time etc. You may want to ensure the availability of the data in various channels:
        &lt;/p&gt;
&lt;h4&gt;
            Web Page&lt;br /&gt;
        &lt;/h4&gt;
&lt;p&gt;
            The obvious channel to publish your content is a website where people can check the list of events and the details.
        &lt;/p&gt;
&lt;h4&gt;
            iCalendar Format (ics)&lt;br /&gt;
        &lt;/h4&gt;
&lt;p&gt;
            You can provide the events calendar in an iCal format so that your site visitors can subscribe to the calendar using their calendar client (iCal, Outlook etc.)
        &lt;/p&gt;
&lt;h4&gt;
            Mobile (iPhone)&lt;br /&gt;
        &lt;/h4&gt;
&lt;p&gt;
            You can optimize the site for best user experience by providing a customized version of the webpages specifically targeted for different mobile devices. In our case we will see how we can generate iPhone web application type of interface fort the site using &lt;a href=&quot;http://www.jqtouch.com&quot; target=&quot;_blank&quot;&gt;jQTouch&lt;/a&gt;.
        &lt;/p&gt;
&lt;h4&gt;
            Augmented Reality Layer&lt;br /&gt;
        &lt;/h4&gt;
&lt;p&gt;
            If our events have location information added to them, you can also provide a Augmented Reality layer and publish using a third party service like &lt;a href=&quot;http://www.layar.com&quot; target=&quot;_blank&quot;&gt;Layar&lt;/a&gt;. Let us see how we can publish to these various outlets using CMS and Hippo Site Tookit.
        &lt;/p&gt;
&lt;h3&gt;
            Content Model&lt;br /&gt;
        &lt;/h3&gt;
&lt;p&gt;
            The content model for the event is fairly simple. Each event will have a Title, Description, Date, Image and Location information. You can define the Event as a compound type in the CMS. The CND for the content type will be as follows:
        &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cnd&quot;&gt;[myproject:event] &amp;gt; nt:base
- myproject:title (string)
- myproject:date (date)
+ myproject:location (myproject:location)
+ myproject:description (hippostd:html)
+ myproject:image  (hippogallerypicker:imagelink)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;
            The location type is just a compound type with longitude and latitude. We can use this for displaying the map and publishing the location information to Layar.
        &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cnd&quot;&gt;[myproject:location] &amp;gt; nt:base
- myproject:longitude (double)
- myproject:latitude (double)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://www.vijaykiran.com/wp-content/uploads/2010/05/cms-gmaps.png&quot; class=&quot;enlarge&quot;&gt;&lt;img src=&quot;http://www.vijaykiran.com/wp-content/uploads/2010/05/cms-gmaps-300x251.png&quot; alt=&quot;&quot; title=&quot;cms-gmaps&quot; width=&quot;300&quot; height=&quot;251&quot; class=&quot;aligncenter size-medium wp-image-2112&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;blockquote&gt;&lt;p&gt;
            For adding the location to the document you can use the &lt;a href=&quot;http://forge.onehippo.org/projects/gmaps&quot; target=&quot;_blank&quot;&gt;Google Maps Plugin&lt;/a&gt;. This plugin provides a Google Maps widget that you can include in the document template. And allows the user to specify the location by right clicking on the map. I&amp;#8217;ll explain how to install/use the plugin in a different blog post.
        &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;
            You can optionally add the boolean fields whether the event is available for Augmented Reality (Layar) or iCal etc. The events page is the document which can have multiple events. The CND for the same is as follows:
        &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cnd&quot;&gt;[myproject:eventspage] &amp;gt; myproject:basedocument
- myproject:title (string)
+ myproject:events (myproject:event) multiple&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;
            As per the content storage structure, all the events documents will be stored under the myproject/events.
        &lt;/p&gt;
&lt;h3&gt;
            Presentation of Data&lt;br /&gt;
        &lt;/h3&gt;
&lt;p&gt;
            If you are already acquainted with Hippo Site Toolkit, the next logical step to build your site is to create the Hippo Beans for your content model. I&amp;#8217;ll leave out the Hippo Bean details for brevity&amp;#8217;s sake.
        &lt;/p&gt;
&lt;h4&gt;
            Web Page&lt;br /&gt;
        &lt;/h4&gt;
&lt;p&gt;
            Developing a web page to display the events using HST is very straight forward. You just need to define the sitemap item and a component with template. And link them up together. In our case, http://myproject.com/events/${eventdoc} will map to the myprojects/events/${eventdoc}. You can define the mapping using the HSTConfig Editor or the CMS console. As shown below, The component for retrieving the events is pretty simple.
        &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;java&quot;&gt;&lt;span&gt;import&lt;/span&gt; &lt;span&gt;com.onehippo.beans.EventsPageBean&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;org.hippoecm.hst.component.support.bean.BaseHstComponent&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;org.hippoecm.hst.core.component.HstComponentException&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;org.hippoecm.hst.core.component.HstRequest&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;org.hippoecm.hst.core.component.HstResponse&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; EventsPage &lt;span&gt;extends&lt;/span&gt; BaseHstComponent &lt;span&gt;&amp;#123;&lt;/span&gt;
    @Override
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; doBeforeRender&lt;span&gt;&amp;#40;&lt;/span&gt;HstRequest request, HstResponse response&lt;span&gt;&amp;#41;&lt;/span&gt;
                       &lt;span&gt;throws&lt;/span&gt; HstComponentException &lt;span&gt;&amp;#123;&lt;/span&gt;
        EventsPageBean eventsPageBean &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;EventsPageBean&lt;span&gt;&amp;#41;&lt;/span&gt; getContentBean&lt;span&gt;&amp;#40;&lt;/span&gt;request&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
        request.&lt;span&gt;setAttribute&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;doc&amp;quot;&lt;/span&gt;, eventsPageBean&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;
            The template just iterates through the list fo events and displays them. We can use &lt;a href=&quot;http://www.vijaykiran.com/tags/hippo/feed/code.google.com/apis/maps/&quot; target=&quot;_blank&quot;&gt;Google Static Maps API&lt;/a&gt; to render the a static map on the site. Here&amp;#8217;s the relevant JSP snippet for the component&amp;#8217;s template:
        &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;html&quot;&gt;    &amp;lt;ul style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
        &amp;lt;li&amp;gt;
          &amp;lt;ul style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
                    &amp;lt;li&amp;gt;
                        &amp;lt;div class=&amp;quot;eventWrapper&amp;quot;&amp;gt;
                            &amp;lt;span class=&amp;quot;eventTitle&amp;quot;&amp;gt;${event.title}&amp;lt;/span&amp;gt;, &amp;lt;img style=&amp;quot;padding: 5px; margin-left: 5px;&amp;quot; src=&amp;quot;http://maps.google.com/maps/api/staticmap?&amp;amp;amp;zoom=10&amp;amp;amp;size=150x150&amp;amp;amp;maptype=roadmap&amp;amp;amp;markers=color:green|${event.location.latitude},${event.location.longitude}&amp;amp;amp;sensor=true&amp;quot; alt=&amp;quot;&amp;quot; align=&amp;quot;right&amp;quot;&amp;gt; &amp;lt;img style=&amp;quot;padding: 5px; margin-right: 5px;&amp;quot; src=&amp;quot;${imageLink}&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;200&amp;quot; align=&amp;quot;left&amp;quot;&amp;gt; ${event.description}
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/li&amp;gt;
                &amp;lt;/ul&amp;gt;
            &amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;
            As you can see this is pretty straightforward and simple. Now let us take a look at how we can publish the events in iCal Format
        &lt;/p&gt;
&lt;h4&gt;
            iCal/ICS format&lt;br /&gt;
        &lt;/h4&gt;
&lt;p&gt;
            For the iCal file we can provide a link on the events page users can click and add it to their calendar software. In HST Sitemap you can define a new sitemap item with /events/_default_.ics and map it to the iCal component. For generating the iCal file I used &lt;a href=&quot;http://ical4j.sourceforge.net/index.html&quot; target=&quot;_blank&quot;&gt;iCal4j&lt;/a&gt; library. Here&amp;#8217;s the complete code of the component that generates the iCal file.
        &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;java&quot;&gt;&lt;span&gt;import&lt;/span&gt; &lt;span&gt;java.net.SocketException&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;java.util.List&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;com.onehippo.beans.Event&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;com.onehippo.beans.EventsPageBean&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;net.fortuna.ical4j.model.Calendar&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;net.fortuna.ical4j.model.DateTime&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;net.fortuna.ical4j.model.component.VEvent&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;net.fortuna.ical4j.model.property.CalScale&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;net.fortuna.ical4j.model.property.ProdId&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;net.fortuna.ical4j.model.property.Uid&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;net.fortuna.ical4j.model.property.Version&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;net.fortuna.ical4j.util.UidGenerator&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;org.hippoecm.hst.component.support.bean.BaseHstComponent&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;org.hippoecm.hst.core.component.HstComponentException&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;org.hippoecm.hst.core.component.HstRequest&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;org.hippoecm.hst.core.component.HstResponse&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;org.slf4j.Logger&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; &lt;span&gt;org.slf4j.LoggerFactory&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; EventsPageICS &lt;span&gt;extends&lt;/span&gt; BaseHstComponent &lt;span&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;private&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;final&lt;/span&gt; Logger LOGGER &lt;span&gt;=&lt;/span&gt; LoggerFactory.&lt;span&gt;getLogger&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EventsPageICS.&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    @Override
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; doBeforeRender&lt;span&gt;&amp;#40;&lt;/span&gt;HstRequest request, HstResponse response&lt;span&gt;&amp;#41;&lt;/span&gt;
                       &lt;span&gt;throws&lt;/span&gt; HstComponentException &lt;span&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
        &lt;span&gt;try&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
            &lt;span&gt;Calendar&lt;/span&gt; calendar &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Calendar&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
            calendar.&lt;span&gt;getProperties&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;add&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt; ProdId&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;-//Ben Fortuna//iCal4j 1.0//EN&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
            calendar.&lt;span&gt;getProperties&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;add&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;Version.&lt;span&gt;VERSION_2_0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
            calendar.&lt;span&gt;getProperties&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;add&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;CalScale.&lt;span&gt;GREGORIAN&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
            EventsPageBean eventsPage &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;EventsPageBean&lt;span&gt;&amp;#41;&lt;/span&gt; getContentBean&lt;span&gt;&amp;#40;&lt;/span&gt;request&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
            &lt;span&gt;List&lt;/span&gt; events &lt;span&gt;=&lt;/span&gt; eventsPage.&lt;span&gt;getEvents&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
            &lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;Event&lt;/span&gt; event &lt;span&gt;:&lt;/span&gt; events&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
                DateTime start &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; DateTime&lt;span&gt;&amp;#40;&lt;/span&gt;event.&lt;span&gt;getDate&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;getTime&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
                VEvent calendarEvent &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; VEvent&lt;span&gt;&amp;#40;&lt;/span&gt;start, event.&lt;span&gt;getTitle&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
                UidGenerator ug &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; UidGenerator&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;uidGen&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
                Uid uid &lt;span&gt;=&lt;/span&gt; ug.&lt;span&gt;generateUid&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
                calendarEvent.&lt;span&gt;getProperties&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;add&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;uid&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
                calendar.&lt;span&gt;getComponents&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;add&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;calendarEvent&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
            &lt;span&gt;&amp;#125;&lt;/span&gt;
            request.&lt;span&gt;setAttribute&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;calendar&amp;quot;&lt;/span&gt;, calendar&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
        &lt;span&gt;&amp;#125;&lt;/span&gt; &lt;span&gt;catch&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;SocketException&lt;/span&gt; e&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
            LOGGER.&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;e.&lt;span&gt;getMessage&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
        &lt;span&gt;&amp;#125;&lt;/span&gt;
    &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;
            The corresponding JSP template is just a simple one-liner, in which you specify the contentType to be &lt;em&gt;text/calendar&lt;/em&gt;:
        &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;html&quot;&gt;            &amp;lt;%@ page contentType=&amp;quot;text/calendar; charset=utf-8&amp;quot; %&amp;gt;${calendar}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;
            Whenever users visit the http://myproject.com/events/${eventdoc}.ics the browser will automatically open the application that is bound to the mime type &lt;a&gt;text/calendar&lt;/a&gt;.
        &lt;/p&gt;
&lt;h4&gt;
            Mobile (iPhone using jQTouch)&lt;br /&gt;
        &lt;/h4&gt;
&lt;div align=&quot;center&quot;&gt;
           &lt;a href=&quot;http://www.vijaykiran.com/wp-content/uploads/2010/05/iphone-version.png&quot; class=&quot;enlarge&quot;&gt;&lt;img src=&quot;http://www.vijaykiran.com/wp-content/uploads/2010/05/iphone-version-172x300.png&quot; alt=&quot;&quot; title=&quot;iphone-version&quot; width=&quot;172&quot; height=&quot;300&quot; class=&quot;aligncenter size-medium wp-image-2102&quot; /&gt;&lt;/a&gt;
       &lt;/div&gt;
&lt;p&gt;You can create a mobile version of the events and make it simple, but using jQTouch the iPhone users will see your site as an application rather than a plain website. jQTouch is a really simple to use iPhone web app library built on top of jQuery. You can sniff the user agent and detect the iPhone browser and render the appropriate content. You can either have a different URL with different component, or you can use the JSP to conditionally render appropriate content if the client is an iPhone. I show how you can use the latter approach. In the EventsPage Component, just add this line:
        &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;java&quot;&gt;request.&lt;span&gt;setAttribute&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;iphone&amp;quot;&lt;/span&gt;, request.&lt;span&gt;getHeader&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;User-Agent&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;contains&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;iPhone&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;
            In the JSP Template you can check for the attribute and render the jQTouch. First in the header add the jQTouch library as follows:
        &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;html&quot;&gt;    &amp;lt;c:if test=&amp;quot;${iphone}&amp;quot;&amp;gt;
           &amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot; src=&amp;quot;&amp;lt;hst:link path='/jqtouch/jquery.1.3.2.min.js'/&amp;gt;&amp;quot;/&amp;gt;
           &amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot; src=&amp;quot;&amp;lt;hst:link path='/jqtouch/jqtouch.js'/&amp;gt;&amp;quot;/&amp;gt;
           &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;lt;hst:link path='/jqtouch/jqtouch.css'/&amp;gt;&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen&amp;quot;
                 charset=&amp;quot;UTF-8&amp;quot;/&amp;gt;
           &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;lt;hst:link path='/themes/apple/theme.css'/&amp;gt;&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen&amp;quot;
                 charset=&amp;quot;UTF-8&amp;quot;/&amp;gt;
           &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
               $.jQTouch({
                   statusBar: 'black'
               });
           &amp;lt;/script&amp;gt;
       &amp;lt;/c:if&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;
            And in the body use the display the events using jQTouch, Navigation bar, a table view etc.
        &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;html&quot;&gt;    &amp;lt;c:if test=&amp;quot;${iphone}&amp;quot;&amp;gt;
        &amp;lt;div id=&amp;quot;about&amp;quot;&amp;gt;
            &amp;lt;div class=&amp;quot;toolbar&amp;quot;&amp;gt;
                &amp;lt;h1&amp;gt;About&amp;lt;/h1&amp;gt;
                &amp;lt;a class=&amp;quot;button flip done&amp;quot; href=&amp;quot;#events&amp;quot;&amp;gt;Done&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;li&amp;gt;
                    Hippo CMS &amp;amp; HST Based Website - Optimized for iPhone&amp;amp;trade;
                &amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div id=&amp;quot;events&amp;quot; class=&amp;quot;current&amp;quot;&amp;gt;
            &amp;lt;div class=&amp;quot;toolbar&amp;quot;&amp;gt;
                &amp;lt;h1&amp;gt;${doc.title}&amp;lt;/h1&amp;gt;
                &amp;lt;a class=&amp;quot;button flip&amp;quot; href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;c:forEach items=&amp;quot;${doc.events}&amp;quot; var=&amp;quot;event&amp;quot; varStatus=&amp;quot;st&amp;quot;&amp;gt;
                    &amp;lt;li class=&amp;quot;arrow&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#event-${st.index}&amp;quot;&amp;gt;${event.title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;/c:forEach&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;c:forEach items=&amp;quot;${doc.events}&amp;quot; var=&amp;quot;event&amp;quot; varStatus=&amp;quot;st&amp;quot;&amp;gt;
        &amp;lt;div id=&amp;quot;event-${st.index}&amp;quot;&amp;gt;
            &amp;lt;div class=&amp;quot;toolbar&amp;quot;&amp;gt;
                &amp;lt;h1&amp;gt;${event.title}&amp;lt;/h1&amp;gt;
                &amp;lt;a class=&amp;quot;button back&amp;quot; href=&amp;quot;#events&amp;quot;&amp;gt;Events&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;h2&amp;gt;Title&amp;lt;/h2&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;li style=&amp;quot;font-size:0.9em;&amp;quot;&amp;gt;${event.title}&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
            &amp;lt;h2&amp;gt;Description&amp;lt;/h2&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;li style=&amp;quot;font-size:0.7em;&amp;quot;&amp;gt;${event.description}&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
            &amp;lt;h2&amp;gt;Date &amp;amp; Time&amp;lt;/h2&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;li style=&amp;quot;font-size:0.7em&amp;quot;&amp;gt;&amp;lt;fmt:formatDate value=&amp;quot;${event.date.time}&amp;quot; pattern=&amp;quot;dd MMM yyyy HH:mm&amp;quot;/&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
            &amp;lt;h2&amp;gt;Image&amp;lt;/h2&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;li&amp;gt;
                    &amp;lt;img src=&amp;quot;&amp;lt;hst:link hippobean='${event.image.picture}'/&amp;gt;&amp;quot; width=&amp;quot;280&amp;quot;/&amp;gt;
                &amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
            &amp;lt;h2&amp;gt;Location&amp;lt;/h2&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;li&amp;gt;
                    &amp;lt;a target=&amp;quot;_blank&amp;quot;
                       href=&amp;quot;http://maps.google.com/?ll=${event.location.latitude},${event.location.longitude}&amp;quot;&amp;gt;
                        &amp;lt;img src=&amp;quot;http://maps.google.com/maps/api/staticmap?&amp;amp;zoom=10&amp;amp;size=280x280&amp;amp;maptype=roadmap&amp;amp;markers=color:green|${event.location.latitude},${event.location.longitude}&amp;amp;sensor=true&amp;quot;/&amp;gt;
                    &amp;lt;/a&amp;gt;
                &amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;/c:forEach&amp;gt;
        &amp;lt;/c:if&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;
    That&amp;#8217;s it, now whenever a user visits the same URL with an iPhone the user will get the jQTouch application type of interface instead of a simple website. Of couse, you can extend and link to google maps application on the iPhone as well.
&lt;/p&gt;
&lt;h4&gt;
    Augmented Reality Layer (&lt;a href=&quot;http://www.layar.com&quot; target=&quot;_blank&quot;&gt;Layar&lt;/a&gt;)&lt;br /&gt;
&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://www.layar.com&quot; target=&quot;_blank&quot;&gt;Layar&lt;/a&gt; is an Augmented Reality browser for iPhone and Android. To publish the events via the Augmented Reality application Layar, first you need to get a developer account for Layar. You can get the account for free by going to &lt;a href=&quot;http://dev.layar.com&quot; target=&quot;_blank&quot;&gt;dev.layar.com&lt;/a&gt;.  For each layer you want to dislay in Layar AR browser, you need to provide a JSON feed of Points Of Interest via a publicly available URL. The Layar application wll send a GET request along with several parameters, to the URL you provided. In our application, we will create a new Sitemap item that will publish the Layar JSON data for the URL format &lt;em&gt;http://myproject.com/events/${eventname}.poi&lt;/em&gt;. You can use this URL in the Layar&amp;#8217;s developer interface.&lt;/p&gt;
&lt;p&gt;
We can create a different component or reuse the existing the events page component that will get all the events. If you use the same component, the only thing you need to do is create a simple JSP page that will render the JSON. You can use json-taglib for rendering the data as JSON.&lt;br /&gt;
Here&amp;#8217;s the JSP code that will render the data as JSON using &lt;a href=&quot;http://json-taglib.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;json-taglib&lt;/a&gt;:
&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;html&quot;&gt;    &amp;lt;%@ page contentType=&amp;quot;application/json; charset=utf-8&amp;quot; %&amp;gt;
    &amp;lt;%@ taglib prefix=&amp;quot;json&amp;quot; uri=&amp;quot;http://www.atg.com/taglibs/json&amp;quot; %&amp;gt;
    &amp;lt;%@ taglib prefix=&amp;quot;c&amp;quot; uri=&amp;quot;http://java.sun.com/jsp/jstl/core&amp;quot; %&amp;gt;
    &amp;lt;%@ taglib prefix=&amp;quot;fmt&amp;quot; uri=&amp;quot;http://java.sun.com/jsp/jstl/fmt&amp;quot; %&amp;gt;
    &amp;lt;%@ taglib prefix=&amp;quot;hst&amp;quot; uri=&amp;quot;http://www.hippoecm.org/jsp/hst/core&amp;quot; %&amp;gt;
&amp;nbsp;
    &amp;lt;json:object&amp;gt;
        &amp;lt;json:array name=&amp;quot;hotspots&amp;quot; items=&amp;quot;${doc.events}&amp;quot; var=&amp;quot;event&amp;quot;&amp;gt;
            &amp;lt;json:object&amp;gt;
                &amp;lt;json:property name=&amp;quot;title&amp;quot; value=&amp;quot;${event.title}&amp;quot;/&amp;gt;
                &amp;lt;json:property name=&amp;quot;distance&amp;quot; value=&amp;quot;100&amp;quot;/&amp;gt;
                &amp;lt;json:property name=&amp;quot;attribution&amp;quot; value=&amp;quot;attribution&amp;quot;/&amp;gt;
                &amp;lt;json:property name=&amp;quot;lat&amp;quot; value=&amp;quot;${event.location.latitudeInt}&amp;quot; /&amp;gt;
                &amp;lt;json:property name=&amp;quot;lon&amp;quot; value=&amp;quot;${event.location.longitudeInt}&amp;quot; /&amp;gt;
                &amp;lt;hst:link hippobean='${event.image.thumbnail}' var=&amp;quot;imgPath&amp;quot; /&amp;gt;
                &amp;lt;json:property name=&amp;quot;imageURL&amp;quot; value=&amp;quot;http://myproject.com/${imgPath}&amp;quot;/&amp;gt;
                &amp;lt;json:property name=&amp;quot;line2&amp;quot;&amp;gt;
                    &amp;lt;fmt:formatDate value=&amp;quot;${event.date.time}&amp;quot; pattern=&amp;quot;dd-MMM-yyyy HH:mm&amp;quot;/&amp;gt;                
                &amp;lt;/json:property&amp;gt;
                &amp;lt;json:property name=&amp;quot;line3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;
                &amp;lt;json:property name=&amp;quot;line4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;
                &amp;lt;json:property name=&amp;quot;type&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;
                &amp;lt;json:property name=&amp;quot;id&amp;quot; value=&amp;quot;${event}&amp;quot;/&amp;gt;
                &amp;lt;json:array name=&amp;quot;actions&amp;quot;/&amp;gt;
            &amp;lt;/json:object&amp;gt;
        &amp;lt;/json:array&amp;gt;
        &amp;lt;json:property name=&amp;quot;layer&amp;quot; value=&amp;quot;${doc.name}&amp;quot; /&amp;gt;      
        &amp;lt;json:property name=&amp;quot;errorString&amp;quot; value=&amp;quot;ok&amp;quot; /&amp;gt;
        &amp;lt;json:property name=&amp;quot;errorCode&amp;quot; value=&amp;quot;${0}&amp;quot; /&amp;gt;
        &amp;lt;json:property name=&amp;quot;morePages&amp;quot; value=&amp;quot;${false}&amp;quot;/&amp;gt;
        &amp;lt;json:property name=&amp;quot;nextPageKey&amp;quot; value=&amp;quot;${null}&amp;quot; /&amp;gt;
    &amp;lt;/json:object&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;
As explained, you&amp;#8217;ll get different parameters from Layar request that you can use to process the data. For example, instead of returning all the events, you can just send only the events within the range. More information on these parameters is available in Layar&amp;#8217;s documentation.&lt;/p&gt;

&lt;div class=&quot;asideHeading superiorTitle&quot;&gt;Layar for iPhone&lt;/div&gt;
&lt;a href=&quot;http://www.vijaykiran.com/wp-content/uploads/2010/05/layar-1.jpg&quot; class=&quot;enlarge&quot;&gt;&lt;img src=&quot;http://www.vijaykiran.com/wp-content/uploads/2010/05/layar-1-200x300.jpg&quot; alt=&quot;&quot; title=&quot;layar-1&quot; width=&quot;200&quot; height=&quot;300&quot; class=&quot;aligncenter size-medium wp-image-2116&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.vijaykiran.com/wp-content/uploads/2010/05/layar-2.jpg&quot; class=&quot;enlarge&quot;&gt;&lt;img src=&quot;http://www.vijaykiran.com/wp-content/uploads/2010/05/layar-2-300x200.jpg&quot; alt=&quot;&quot; title=&quot;layar-2&quot; width=&quot;300&quot; height=&quot;200&quot; class=&quot;aligncenter size-medium wp-image-2117&quot; /&gt;&lt;/a&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;As you can see, for publishing the data in different formats to different channels, we have not modified anything in the CMS. Using single HST component and different templates, we were able to publish the data. The decoupling in the content management, content retrieval and content prsentation of the Hippo CMS and HST, helps a lot in creating multi channel publishing systems. You can extend it to any kind of channel like RSS Feeds or may be even create a Podcast of the pages using a Robotic Overlord!&lt;/p&gt;
&lt;p&gt;
    If you have any questions or need more explanation don&amp;#8217;t hesitate to ask us in our &lt;a href=&quot;http://www.onehippo.org/cms7/support/forums.html&quot; target=&quot;_blank&quot;&gt;forums&lt;/a&gt;!&lt;/p&gt;</description>
	<pubDate>Wed, 26 May 2010 18:42:29 +0000</pubDate>
	<dc:creator>Vijay Kiran</dc:creator>
</item>
<item>
	<title>Jeroen Reijn (Hippo): Giving Hippo CMS 7 some WebDAV support</title>
	<guid>tag:blogger.com,1999:blog-2962867622850517744.post-5953210072064637852</guid>
	<link>http://blog.jeroenreijn.com/2010/05/giving-hippo-cms-7-some-webdav-support.html</link>
	<description>A while ago a user on the &lt;a href=&quot;http://www.onehippo.org/cms7/support/forums.html&quot;&gt;Hippo CMS 7 forum&lt;/a&gt; donated a patch, which provided a servlet for simple &lt;a href=&quot;http://en.wikipedia.org/wiki/WebDAV&quot;&gt;WebDAV&lt;/a&gt; support. He donated his code as a proof of concept and hoped that somebody with some deeper knowledge of Hippo and it's nodetypes could pick this up and continue to work on it. Since the patch was left alone for quite some time I picked it up and turned it into a&amp;nbsp;&lt;a href=&quot;http://forge.onehippo.org/&quot;&gt;Hippo Forge&lt;/a&gt;&amp;nbsp;project and called it: '&lt;a href=&quot;http://forge.onehippo.org/projects/webdav/&quot;&gt;Hippo CMS 7 WebDAV Support&lt;/a&gt;'.&lt;br /&gt;&lt;br /&gt;Now and then I find some time to work on this project and the current status now is that I have a working quickstart, which you can check out. I personally think it's far from finished, because there is still a lot of work remaining, but it is already usable. In this post I will explain how the WebDAV plugin works, the current status of the project and some future plans. Let's start with some of the basics.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What is WebDAV?&lt;/h2&gt;&lt;br /&gt;WebDAV is short for Web-based Distributed Authoring and Versioning. In short WebDAV is an extension on top of the default HTTP protocol and it allows computer users to edit and store files on a remote server. All the major operating systems provide support for WebDAV and will allow you to easily store and edit files on a remote server as if they were on your own computer.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Enable WebDAV support for your Hippo CMS 7 project&lt;/h2&gt;&lt;br /&gt;Using WebDAV in combination with Hippo CMS 7 is quite easy actually. All you need to do for now is do four things to enable the WebDAV support for your project.&lt;br /&gt;&lt;br /&gt;1. Add the WebDAV support maven dependency to your project&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.onehippo.forge.addon.webdav&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;webdav-addon&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;${webdav.addon.version}&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2. Add the WebDAV support servlet definition to your web.xml&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt; &amp;lt;servlet-name&amp;gt;WebDAVServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt; &amp;lt;servlet-class&amp;gt;org.onehippo.forge.addon.webdav.HippoWebdavServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt; &amp;lt;init-param&amp;gt;&lt;br /&gt;  &amp;lt;param-name&amp;gt;repository-address&amp;lt;/param-name&amp;gt;&lt;br /&gt;  &amp;lt;param-value&amp;gt;vm://&amp;lt;/param-value&amp;gt;&lt;br /&gt; &amp;lt;/init-param&amp;gt;&lt;br /&gt; &amp;lt;init-param&amp;gt;&lt;br /&gt;  &amp;lt;param-name&amp;gt;resource-path-prefix&amp;lt;/param-name&amp;gt;&lt;br /&gt;  &amp;lt;param-value&amp;gt;/webdav&amp;lt;/param-value&amp;gt;&lt;br /&gt;  &amp;lt;description&amp;gt;defines the prefix for spooling resources out of the repository.&amp;lt;/description&amp;gt;&lt;br /&gt; &amp;lt;/init-param&amp;gt;&lt;br /&gt; &amp;lt;init-param&amp;gt;&lt;br /&gt;  &amp;lt;param-name&amp;gt;resource-config&amp;lt;/param-name&amp;gt;&lt;br /&gt;  &amp;lt;param-value&amp;gt;/WEB-INF/config.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;  &amp;lt;description&amp;gt;&lt;br /&gt;   Defines various dav-resource configuration parameters.&lt;br /&gt;  &amp;lt;/description&amp;gt;&lt;br /&gt; &amp;lt;/init-param&amp;gt;        &lt;br /&gt; &amp;lt;load-on-startup&amp;gt;5&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. Add the WebDAV servlet mapping to your web.xml&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt; &amp;lt;servlet-name&amp;gt;WebDAVServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt; &amp;lt;url-pattern&amp;gt;/webdav/*&amp;lt;/url-pattern&amp;gt;        &lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4. Add the WebDAV support configuration file to your projects WEB-INF directory.&lt;br /&gt;&lt;br /&gt;This configuration file can be found on the WebDAV support &lt;a href=&quot;http://webdav.forge.onehippo.org/&quot;&gt;documentation site&lt;/a&gt;. It's quite easy to read and you should put it into your &lt;b&gt;/webapp/WEB-INF/&lt;/b&gt; folder if possible.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;In action&lt;/h2&gt;&lt;br /&gt;The following video will show you how easy it is to upload multiple files into the CMS. &lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http://vimeo.com/11991107&quot;&gt;Hippo CMS 7 WebDAV support&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/user3888132&quot;&gt;Jeroen Reijn&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;This &lt;a href=&quot;http://www.youtube.com/watch?v=U0uXPyCn-EI&quot;&gt;video&lt;/a&gt; is also available on &lt;a href=&quot;http://www.youtube.com/watch?v=U0uXPyCn-EI&quot;&gt;YouTube&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Current status&lt;/h2&gt;&lt;br /&gt;The current status is that the WebDAV addon has default support for the Hippo &lt;b&gt;assets&lt;/b&gt; folder. This was actually quite easy to develop. This can also be used to copy all assets from a CMS 6 instance directly into a running CMS 7 instance. All other folders are not WebDAV enabled yet, but I have some plans for the other folders in the future.&lt;br /&gt;&lt;br /&gt;For the short-term roadmap: 'pretty url support' is the first thing I want to work on. I could have put it in hardcoded, but since I want to make it configurable like in the CMS this will my main focus for the next two weeks. If you have ideas or want to help out, please let me know!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2962867622850517744-5953210072064637852?l=blog.jeroenreijn.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 24 May 2010 18:23:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Jeroen Reijn)</dc:creator>
</item>
<item>
	<title>Jasha Joachimsthal (Hippo): Components in my blog: Properties component</title>
	<guid>http://www.jasha.eu/blogposts/2010/05/components-in-my-blog-properties-component.html</guid>
	<link>http://www.jasha.eu/blogposts/2010/05/components-in-my-blog-properties-component.html</link>
	<description>&lt;div&gt;&lt;p&gt;This blogpost is about the Hippo Forge Properties component. This component allows you to manage labels for your website instead of hardcoding them into the JSP.&lt;/p&gt;&lt;p&gt;My website is mostly an extended version of the Hippo Site Toolkit
&lt;a href=&quot;http://www.onehippo.org/site-toolkit/getting+started/learn+the+demo&quot;&gt;demo
project&lt;/a&gt;. I did a complete HTML and CSS (re)design but the core components
look a lot like the original demo. My blogpost document type contains only a few
more fields for keywords and keyword suggestions compared to the original text
document. In the comment document type I added fields so you can fill in your
email address (which I will never publish) and website (which I will publish
unless you're trying to send spam).&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://forge.onehippo.org/projects/properties/&quot;&gt;properties
component&lt;/a&gt; is extremely useful to avoid hard coded labels in your rendering
templates, in my case the JSP's. The values of the labels are managed from the
CMS so if you want to change a common navigation element like &quot;previous&quot; to
&quot;previous page&quot; you don't have to do a new deploy of your site. At this moment
it is used for the labels of the month facets when navigating through the
blogposts. The faceted navigation returns values from 0 to 11 but I rather
display them as January to December.&lt;/p&gt;

&lt;p&gt;After &lt;a href=&quot;http://properties.forge.onehippo.org/install.html&quot;&gt;adding the
properties component&lt;/a&gt; to the CMS you get a new document type for maintaining
the properties. This document type contains repeating key-value pairs, e.g.
&quot;month.0&quot; as key for label &quot;January&quot;. Then add the necessary dependencies and
configuration to the site project. In your own default component or in a
specific component add the code that adds the key-value pairs to the request for
the rendering templates. You can find examples in the
&lt;a href=&quot;http://properties.forge.onehippo.org/sitecode.html&quot;&gt;documentation&lt;/a&gt;
how to add this to your own site. In my case I added it to the HST component
that handles the listing of the faceted navigation. &lt;/p&gt;

&lt;p&gt;This is how my JSP code looks like to display the label of a month:&lt;/p&gt;

&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;c:set var=&quot;labelkey&quot; value=&quot;month.${facetvalue.name}&quot; /&amp;gt;
   ${labels[labelkey]}
&lt;/pre&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 24 May 2010 09:01:11 +0000</pubDate>
	<dc:creator>Jasha Joachimsthal</dc:creator>
</item>
<item>
	<title>Mathijs Brand (Hippo): There's a Hippo on my Ipad</title>
	<guid>tag:blogger.com,1999:blog-862413798174121061.post-5677457519263813725</guid>
	<link>http://mathijsbrand.blogspot.com/2010/05/theres-hippo-on-my-ipad.html</link>
	<description>Okay, okay, so it won't be your favorite editing tool, but the Ipad surely looks a lot cooler with a Hippo on it!&lt;a href=&quot;http://farm5.static.flickr.com/4022/4617612136_e8eb64e8fa_b.jpg&quot; title=&quot;hippo on ipad, click to see bigger image&quot;&gt;    &lt;img src=&quot;http://farm5.static.flickr.com/4022/4617612136_e8eb64e8fa.jpg&quot; alt=&quot;Hippo CMS on the Ipad&quot; /&gt;&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/862413798174121061-5677457519263813725?l=mathijsbrand.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 18 May 2010 06:01:14 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Mathijs Brand)</dc:creator>
</item>
<item>
	<title>Jasha Joachimsthal (Hippo): First blogpost in Hippo</title>
	<guid>http://www.jasha.eu/blogposts/2010/05/First-blogpost-in-Hippo.html</guid>
	<link>http://www.jasha.eu/blogposts/2010/05/First-blogpost-in-Hippo.html</link>
	<description>&lt;div&gt;&lt;p&gt;This is my first blogpost written in Hippo CMS&lt;/p&gt;&lt;p&gt;I wanted to build my own website and get rid of the tagsoup produced by
Blogger. That's why I built my own site using
&lt;a href=&quot;http://www.onehippo.org/cms7&quot;&gt;Hippo CMS&lt;/a&gt; and
&lt;a href=&quot;http://www.onehippo.org/site-toolkit&quot;&gt;Hippo Site toolkit&lt;/a&gt;. It's not
finished yet (is a website ever finished?) but it's getting close to what I had
in mind.&lt;/p&gt;

&lt;p&gt;Building this site was one of the reasons I had not written any blog post in
months. It took a bit more time than I thought. I had to think what I wanted,
played with HTML5 and CSS3 and eventually write some code that tied it all
together. In the end I had to configure Apache HTTPD which is something the
sysadmins normally do (thanks Bart &amp;amp; Bartosz for your hints). Thanks Hippo
for hosting my new blog :-)&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 17 May 2010 20:01:31 +0000</pubDate>
	<dc:creator>Jasha Joachimsthal</dc:creator>
</item>
<item>
	<title>Mathijs Brand (Hippo): Smoothly going through a Hippo CMS project</title>
	<guid>tag:blogger.com,1999:blog-862413798174121061.post-2470769699172875098</guid>
	<link>http://mathijsbrand.blogspot.com/2010/05/smoothly-going-through-hippo-cms.html</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.jboye.com/conferences/philadelphia10/&quot; title=&quot;JBoye 2010 website&quot;&gt;Jboye 2010&lt;/a&gt; has come to an end. The Jboye conference is about getting CMS expert users, analysts and vendors together. The central idea is to learn more by communicating openly. This means I shouldn't too obviously put marketing messages in my sentences, so you can have interesting discussions and get to the point. &lt;img src=&quot;http://farm5.static.flickr.com/4020/4587636608_8ae78e9909_o.jpg&quot; align=&quot;right&quot; /&gt; I like this idea since it's very close to communicating in an open source project. A project like Hippo CMS for example, the best and most user friendly CMS in the world, especially if you have huge amounts of content. Java developers love it. By the way, here's one of those cute Hippo toys.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;My first day at the conference I selected &lt;a href=&quot;http://video.jboye.com/video/608800/jim-hobart&quot; title=&quot;a video by James Hobart&quot;&gt;a tutorial course about rapid prototyping by James Hobart&lt;/a&gt;. Prototyping helps in getting expectations aligned quickly. It's not all that easy to turn the ship around once it's close to the harbour, so it makes sense to make a prototype early in the project. It's an investment, but a very important one.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;That's why prototyping combined with SCRUM became a common practice at Hippo. I don't want to keep all the success to myself, so I'm sharing a couple of best practices for a Hippo CMS project in this blogpost. If anything is too technical, please say so. If you think you do it better, please share. If you don't know SCRUM, &lt;a href=&quot;http://www.youtube.com/watch?v=Q5k7a9YEoUI&quot;&gt;this is a very fast video introducing you to it under 10 minutes&lt;/a&gt;. A sprint takes about two weeks depending on the size of the project and your personal preferences. In small projects a sprint and a phase is the same thing. In larger projects a phase takes one or more sprints.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;The business case&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The most important part of a project is not part of the project. It's about getting your business case straight. A question you should ask yourself: why are we actually doing this? Which audience do we target and what value does it have for our business. In other words: describe your targets. Once this is clear, don't forget to share your carefully designed ideas. I share the business goals and targets with everyone participating in the project. Even when it's unessential for someone's day-to-day job. In the end this understanding delivered better and more consistent projects. At Jboye I had the pleasure to meet Christine Pierpoint. She had inspiring ideas you should take into account before starting a web project and &lt;a href=&quot;http://video.jboye.com/video/607332/christine-pierpoint-on-web&quot; title=&quot;jboye video of Christine Pierpoint&quot;&gt;in this video some of these interesting thoughts will come to you&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;The design phase&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The (user action) designers can take on the business case and start designing: screen-shots, scratches, wire-frames, anything concrete. Details are not important yet. Keep your focus on the absolute minimum the project needs to go live with. The reason I always focus on the bare minimum is because a) it's nice to get fast results, b) search engines can start indexing your website, c) your marketing people can get going, d) it's easier to end up with something, &lt;a href=&quot;http://www.zdnet.com/blog/projectfailures/study-68-percent-of-it-projects-fail/1175&quot;&gt;surprisingly this is not straightforward &lt;/a&gt;. A Hippo project has a very solid foundation, so don't worry about adding modules and features after going live. That is, if you make sure you have some &lt;a href=&quot;http://www.onehippo.com/en/support/training&quot;&gt;Hippo certified developers&lt;/a&gt; on your team. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;A clickable website&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The goal of this phase is to get a real website with HTML, javascript and CSS up and running. No connections to any database or repository. Just plain text, easy programming. I don't like latin texts in a design, because people don't seem to understand what these &quot;lorem ipsum&quot; texts are about. It's confusing, so better use good examples or even texts describing the sort of content that should be there. A functional design can be helpfull for details, but nothing beats having a go at something similar to the end product. I make every link clickable, to make sure the interaction is clear. The clickable website will give you valuable feedback fast. Developers, designers, managers, editors and end users can all have conflicting ideas. Discussions in this phase are necessary. Don't avoid them, but end up with conclusions everybody agrees upon. Your clickable website will help you focus. &lt;/p&gt;&lt;p&gt;&lt;i&gt;About the tools used for a clickable website:&lt;/i&gt;&lt;br /&gt;Hippo developed guidelines to make the web design extensible and accessible, however Hippo CMS doesn't impose any technical restrictions on your web design. You're really free to do whatever you're used to do. My team usually creates a simple maven project, use svn for versioning, jsp for coding and jetty to run it all. We created a lot of code snippets for paging, calendars, faceted navigation, related items, forms, header and footer templates, etc. Hippo has support for any javascript library you would like to use, although we tend to use &lt;a href=&quot;http://jquery.com/&quot;&gt;jquery&lt;/a&gt;. Don't use more than one javascript library. It ruins your performance. Because projects requirements tend to change all the time during this phase your precious code turns into spaghetti quite easily. That's why we usually keep the clickable website as a seperate project. You can take a different approach and use your own tools or use Hippo Site Toolkit from the start.  &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;The content model and architecture&lt;/b&gt;&lt;/p&gt;&lt;p&gt;While frontend developers, end users and business people are getting together to focus on the look and feel of the website, extranet or intranet. The analysts can work on the content model and architecture. You can start at the same time the clickable phase starts and of course there's some overlap. Take your time during this phase to get a good overview of the content model. It's essential for any CMS project. I like to use an excel sheet to describe all the templates, but anything will do as long as it's clear. A news page for example can have a title, a date used for sorting, an introduction, a rich text field, a multiple thumbnail picture or whatever you would like it to have. Don't forget to describe metadata. A simple website has a couple of templates, for example a news template, a simple text template, a template for adds and so on. Define them. Hippo CMS is content driven, so you're defining content types, not web pages.&lt;/p&gt;&lt;p&gt;Next to the model, it's smart to define a good way to structure the actual content in folders, so make a basic setup with a folder for news items or a folder for the communication department depending on your preferences. Editors have an opinion about this, so ask them. The way you structure your content doesn't have to be the same way you structure your website. In Hippo Site Toolkit you can query the content anyway you like. Questions to help you get your answers: Where does each type of content come from. Does the content come from an external source like a webservice or rss feed? Which groups of editors add which content, for example do you have a group of people only editing news pages? If that's the case you help editors a lot by only showing the news pages in Hippo CMS. It's more user friendly and secure.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Hippo CMS and data entry&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Because of the &lt;a href=&quot;http://www.onehippo.org/about/architecture.html&quot;&gt;Hippo CMS architecture&lt;/a&gt;, you can first get Hippo CMS up and running and later further develop your website. This means content migration can take place first and editors can start entering content before the project is finished. That is, as long as you have your (test / acceptance) servers up and running. Even though Hippo CMS is very user friendly, a training course and custom documentation for editors can help to get going fast and consistent. The training material can also be used for &lt;a href=&quot;http://www.useit.com/papers/webwriting/&quot;&gt;writing guidelines&lt;/a&gt;. Do you have to migrate a lot of content and you're stuck with tons of xml files? &lt;a href=&quot;http://forge.onehippo.org/projects/import-tool/&quot;&gt;This tool comes in handy&lt;/a&gt;. Changes in your content model are more expensive from this phase onwards, but not impossible. If you need to make a change, do it, but only if you're sure you really need it. More info for developers on: http://www.onehippo.org/.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Adding features and phases recursively&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Your project is growing and growing and soon your real website starts to look better then your clickable website. You can add sprints until the end of your project's lifecycle, so don't put too much pressure on the first time you enter the world wide web.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Champagne&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I congratulate you for reading this and hope you share a glass of champagne with me once your own Hippo CMS project goes live, so feel free to contact me even if it doesn't go as planned. We wouldn't leave you out in the cold. For guarantees and a healthy relationship &lt;a href=&quot;http://www.onehippo.com/en/support&quot;&gt;Hippo offers support&lt;/a&gt;. &lt;img src=&quot;http://4.bp.blogspot.com/_DDc07JYdn5w/RcBtWuJ7coI/AAAAAAAAACA/VaFtSn3D05M/s400/hippo-turtle-4.jpg&quot; alt=&quot;Hippo taking care&quot; align=&quot;left&quot; /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/862413798174121061-2470769699172875098?l=mathijsbrand.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 08 May 2010 02:04:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Mathijs Brand)</dc:creator>
</item>
<item>
	<title>Mathijs Brand (Hippo): Limited choices</title>
	<guid>tag:blogger.com,1999:blog-862413798174121061.post-5149206723063457718</guid>
	<link>http://mathijsbrand.blogspot.com/2010/05/limited-choices-repost.html</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3241/3115404982_cbb22e231a.jpg?v=0&quot; alt=&quot;Coffee choices...&quot; align=&quot;right&quot; width=&quot;250px&quot; /&gt;&lt;br /&gt;&lt;br /&gt;I don't like to make choices. For me the best choice in life is - no choice at all. For example: I like to drink coffee. Any kind is fine. Still I get questions: Do I want the coffee with a touch of frost that gives a dreamy feeling on a lazy afternoon thanks to a selected combination of superbly engineered beans made by an ancient line of distinctive coffee entrepreneurs? Or maybe I would just go for the high-quality coffee which maintains endurance in taste while ensuring a fresh, consistent kick every time I hear the sound of a whisper? I don't know... just give me strong coffee without milk or sugar. And why don't you try to make it yesterday?&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Hi, my name is Mathijs Brand and I'm a Hippo business consultant / project manager. I've been working with customers and partners on Hippo projects for the last couple of years. I'll use this blog to tell you a bit about my experiences. Also I hope to show you some of the nice solutions we've come up with.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So maybe I was overreacting with the coffee. And I can understand why we're acting the way we are: it's harder for people to reduce options then just handing them out. Reducing options means making a choice yourself. If limiting options is hard for all kinds of features in the real world; it's even harder in the software world where options are virtually endless. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;So why don't we give it a little effort? Try and define your audience. Find out what they are allowed to do or what they just don't want to see. Luckily - once you're done with the analysis - it's pretty straightforward to configure these options in Hippo CMS. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;An example&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Suppose you have a lot of very specific technical documents lying around. A few people are asking for them, but most don't find them very interesting. Just uploading all these documents to your website can easily end up in chaos like the picture below:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2460/3629355048_d3dc51c548.jpg?v=0/&quot; title=&quot;hmm... what button should I push?&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;i&gt;hmm... what button should I push?&lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Less is more&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Let's say you want to do it right this time. Your editor wants to type a news item about cats and dogs. She doesn't want to see all these buttons and folders she can't do anything with. So give her a nice and quiet interface to give her more focus on the contents of the message. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2472/3628825403_f7603d6994.jpg?v=0&quot; title=&quot;The editor just has a couple of options. In the news folder she can only add news items. &quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;In the above picture the editor just has a couple of options. In the news folder she can only add news items.&lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;On the other side of the spectrum is your site administrator. He wants to be able to go through all of the advanced features managing your site. He likes to configure the rss feeds, widgets, overview pages, pdf's, portals and websites. He makes sure the news item automatically ends up in all of these media types. He likes to see how much memory his server has got and which java version is running. So hand him the buttons...&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2425/3628523447_62c0f80d8a.jpg?v=0&quot; title=&quot;cool, I like my admin interface&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The administrator has lots of options.&lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The same kind of options can be given to people visiting your website. With metadata you can define which documents are interesting for which audience. You can also guide your audience through some questions and answers to find out their information needs. With a personal login you can achieve even more. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Hippo CMS gives you a lot of flexibility to limit choices. In the end reducing options gives your powerful web application the simplicity it needs. So pretty please with sugar on top - use these options - and let's get back to the real question:&lt;br /&gt;&lt;br /&gt;Do you want the coffee with a touch of frost that gives a dreamy feeling on a lazy afternoon thanks to a selected combination of superbly engineered beans made by an ancient line of distinctive coffee engineers?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;i&gt;This was a repost, you can find the original post here: &lt;a href=&quot;http://blogs.onehippo.org/mathijs/2009/06/limited_choices.html#more&quot;&gt;Limited choices&lt;/a&gt;, however there's not much sense in doing that, since you just read the same thing ;)&lt;/i&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/862413798174121061-5149206723063457718?l=mathijsbrand.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 07 May 2010 17:57:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Mathijs Brand)</dc:creator>
</item>
<item>
	<title>Jeroen Verberg (Hippo): Open source business model</title>
	<guid>http://jverberg.posterous.com/open-source-business-model</guid>
	<link>http://jverberg.posterous.com/open-source-business-model</link>
	<description>&lt;p&gt;
	The recent turmoil by Gartner's Brian Prentice &lt;a href=&quot;http://blogs.gartner.com/brian_prentice/2010/03/23/open-sources-reality-distortion-field/&quot;&gt;blogpost&lt;/a&gt; and my upcoming trip to the &lt;a href=&quot;http://thinktank.olliancegroup.com/&quot;&gt;Open Source Think Tank&lt;/a&gt; inspired me to pick up a</description>
	<pubDate>Sun, 11 Apr 2010 20:56:56 +0000</pubDate>
</item>
<item>
	<title>Lars Peters (Hippo): On Search Engine Optimization: Why canonical URLs matter</title>
	<guid>tag:blogger.com,1999:blog-7342593045185099406.post-2062664575998299775</guid>
	<link>http://larsjpeters.blogspot.com/2010/04/on-search-engine-optimization-why.html</link>
	<description>&lt;span class=&quot;Apple-style-span&quot;&gt;With the explosion of the amount of information organizations make accessible over the Internet, searchability and navigability are increasingly prominent on CMS wish lists. How do you structure site navigation when you have a bit more content than the average company?&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span&gt;Gov.nl&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Consider the case of the &lt;a href=&quot;http://rijksoverheid.nl/&quot;&gt;Dutch national government&lt;/a&gt;: To provide convenient access to all governmental information citizens may need on a daily basis, it decided to bring information from 16 different ministries into one CMS.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_6PBcxTxjfz0/S7uYNa-xXII/AAAAAAAAHjM/xJ5zXHQ7V40/s1600/image1.bmp&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/_6PBcxTxjfz0/S7uYNa-xXII/AAAAAAAAHjM/xJ5zXHQ7V40/s320/image1.bmp&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5457122729837812866&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;To make centralization effective it needs to be paired with smart navigation. &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;In larger contexts websites typically choose to provide more than &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;one &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;path to the same content. Technically this is achieved by tagging content instead of dropping it into fixed folders. &lt;/span&gt;&lt;a href=&quot;http://www.onehippo.com/en/products/cms&quot; id=&quot;w.3m&quot; title=&quot;Hippo CMS&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Hippo CMS&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;&gt; helps authors create these tags expediently and as of April 2010 citizens of the Netherlands have a number of centralized starting points to a large chunk of central government information (in Dutch):&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.rijksoverheid.nl/onderwerpen&quot; id=&quot;vhpl&quot; title=&quot;Topic&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Topic&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.rijksoverheid.nl/onderwerpen/thema&quot; id=&quot;eiuj&quot; title=&quot;Theme&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Theme&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.rijksoverheid.nl/ministeries&quot; id=&quot;af9s&quot; title=&quot;Ministry / Department&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ministry / Department&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.rijksoverheid.nl/regering&quot; id=&quot;t1sf&quot; title=&quot;Ministers&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ministers&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.rijksoverheid.nl/nieuws&quot; id=&quot;fy:k&quot; title=&quot;News&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;News&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/ul&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_6PBcxTxjfz0/S7uYgPaJC6I/AAAAAAAAHjU/H5JYYZc73OU/s1600/image2.bmp&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_6PBcxTxjfz0/S7uYgPaJC6I/AAAAAAAAHjU/H5JYYZc73OU/s320/image2.bmp&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5457123053148900258&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span&gt;Canonical URLs&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Flexible navigation may be great for users, it is not ideal for search engines. To offer compact results, search engines try to condense the list of URLs gathered from crawling through different paths to the same content piece. With a variety of algorithms a search engine then decides which URL is the leading road to the content. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Leaving this decision to the search engine is a risky choice. Various URLs for the same content compete with each other in the rankings and the site owner loses control over incoming links. For faceted search paths the number of navigation ways to a single piece of content is practically infinite. If not managed carefully, offering faceted paths could even lead to accidental blacklisting as the search engine might conclude you're trying to game its rating algorithm.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_6PBcxTxjfz0/S7uYr8B-jrI/AAAAAAAAHjc/gIJK-3uF8iQ/s1600/im3.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_6PBcxTxjfz0/S7uYr8B-jrI/AAAAAAAAHjc/gIJK-3uF8iQ/s320/im3.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5457123254105706162&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;This is where canonical URLs come in&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;. &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Tagging pages with a canonical URL helps a search engine understand&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt; that multiple URLs should be be listed only once. Hippo builds &lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html&quot; id=&quot;owkv&quot; title=&quot;Canonicalization&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;canonicalization&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt; into its CMS design&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;, making sure that the dominant URL is provided to the search engine for each unique piece of content.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt; This approach provides a combination of multiple flexible navigation paths, optimized search results and consistency for incoming links. &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;gfcb&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;span&gt;Example&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Let's have a more detailed look at the government example. The following are just two sample URLs leading to an article about tougher laws for repeat DUIs:&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://www.rijksoverheid.nl/onderwerpen/alcohol/nieuws/2010/04/01/rijden-onder-invloed-harder-aangepakt.html&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;http://www.rijksoverheid.nl/onderwerpen/alcohol/nieuws/2010/04/01/rijden-onder-invloed-harder-aangepakt.html&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://www.rijksoverheid.nl/nieuws/2010/04/01/rijden-onder-invloed-harder-aangepakt.html&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;http://www.rijksoverheid.nl/nieuws/2010/04/01/rijden-onder-invloed-harder-aangepakt.html&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;In the source of both pages, invisible to the casual browser, a tag tells the search engine where to place this piece of content in its results.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre id=&quot;line15&quot;&gt;&lt;span class=&quot;start-tag&quot;&gt;link&lt;/span&gt;&lt;span class=&quot;attribute-name&quot;&gt; rel&lt;/span&gt;=&lt;span class=&quot;attribute-value&quot;&gt;&quot;canonical&quot; &lt;/span&gt;&lt;span class=&quot;attribute-name&quot;&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://www.blogger.com/nl=&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;http://www.rijksoverheid.nl/nieuws/2010/04/01/rijden-onder-invloed-harder-aangepakt.html&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&quot;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;And this is what Google returns when searching for a few of the article's keywords - Mission accomplished!&lt;/span&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;h3&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://www.rijksoverheid.nl/nieuws/2010/04/01/rijden-onder-invloed-harder-aangepakt.html&quot; target=&quot;_blank&quot;&gt;Rijden onder invloed harder aangepakt&lt;/a&gt;&lt;/b&gt;&lt;a href=&quot;http://www.rijksoverheid.nl/nieuws/2010/04/01/rijden-onder-invloed-harder-aangepakt.html&quot; target=&quot;_blank&quot;&gt; | Nieuwsbericht &lt;/a&gt;&lt;b&gt;&lt;a href=&quot;http://www.rijksoverheid.nl/nieuws/2010/04/01/rijden-onder-invloed-harder-aangepakt.html&quot; target=&quot;_blank&quot;&gt;...&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;1 april 2010 &lt;b&gt;...&lt;/b&gt; &lt;b&gt;Rijden onder invloed harder aangepakt&lt;/b&gt; &lt;b&gt;...&lt;/b&gt; Ministerraad. Bel 0800-8051 voor vragen aan de Rijksoverheid &lt;b&gt;...&lt;/b&gt; Zoek binnen &lt;b&gt;rijksoverheid&lt;/b&gt;.&lt;b&gt;nl&lt;/b&gt; &lt;b&gt;...&lt;/b&gt;&lt;br /&gt;www.&lt;b&gt;rijksoverheid&lt;/b&gt;.&lt;b&gt;nl&lt;/b&gt;/.../&lt;b&gt;rijden&lt;/b&gt;-&lt;b&gt;onder&lt;/b&gt;-&lt;b&gt;invloed&lt;/b&gt;-&lt;b&gt;harder&lt;/b&gt;-&lt;b&gt;aangepakt&lt;/b&gt;.html - &lt;span class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://webcache.googleusercontent.com/search?q=cache:JItXRYjlzTQJ:www.rijksoverheid.nl/nieuws/2010/04/01/rijden-onder-invloed-harder-aangepakt.html+rijden+onder+invloed+harder+aangepakt+rijksoverheid.nl&amp;amp;cd=1&amp;amp;hl=en&amp;amp;ct=clnk&amp;amp;gl=us&quot; target=&quot;_blank&quot;&gt;Cached&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/ol&gt;&lt;ol&gt;&lt;li&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;For a more in depth description how you can create canonical URLs with Hippo CMS check out our &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://wiki.onehippo.com/display/HST2/Context+Aware,+Canonical+and+Preferred+URLs&quot; id=&quot;gh4t&quot; title=&quot;public wiki&quot;&gt;public wiki&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/7342593045185099406-2062664575998299775?l=larsjpeters.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 06 Apr 2010 18:50:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Lars Peters)</dc:creator>
</item>
<item>
	<title>Jeroen Reijn (Hippo): Metadata extraction with Apache Tika</title>
	<guid>tag:blogger.com,1999:blog-2962867622850517744.post-2556839578610686454</guid>
	<link>http://blog.jeroenreijn.com/2010/04/metadata-extraction-with-apache-tika.html</link>
	<description>&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_hd6Y7yyFK7E/S7pGYKIkWSI/AAAAAAAAAX4/LLz_aNEujsM/s1600/tika.png&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/_hd6Y7yyFK7E/S7pGYKIkWSI/AAAAAAAAAX4/LLz_aNEujsM/s320/tika.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;At&amp;nbsp;&lt;a href=&quot;http://www.onehippo.com/&quot;&gt;Hippo&lt;/a&gt;&amp;nbsp;I work with/for customers that have quite a lot of content. The&amp;nbsp;projects I work on have content in the range of 5.000 to 500.000 document gathered in one content repository. This can be just textual content, but most of the time this is a variety of different content types.&amp;nbsp;You might think of images, PDFs and Microsoft office document formats. By default &lt;a href=&quot;http://jackrabbit.apache.org/&quot;&gt;Apache JackRabbit&lt;/a&gt;, the layer underneath &lt;a href=&quot;http://docs.onehippo.org/&quot;&gt;Hippo Repository&lt;/a&gt;, can indexes this kind of content by using extractors, so that the information can be found within the&amp;nbsp;&lt;a href=&quot;http://docs.onehippo.org/&quot;&gt;Hippo CMS 7&lt;/a&gt;&amp;nbsp;search or from any application connected to the Hippo Repository which is performing a search on the content repository. Being able to search on content found within a file is interesting, but there is so much more that you can do with this kind of information.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Content metadata&lt;/h2&gt;&lt;br /&gt;Having all this content inside the repository is nice, but a certain piece of content uploaded to the repository can contain much more information then the file itself and sometimes this metadata is ignored in content management systems. As an example you might want to be able to see the number of pages of a PDF document inside your CMS or view the &lt;a href=&quot;http://en.wikipedia.org/wiki/Exchangeable_image_file_format&quot;&gt;EXIF&lt;/a&gt; information of an image stored inside your content repository. There are a number of parser libraries out there that can extract information from a specific file format, but you can get quite lost. Within the ASF there is also a very nice toolkit called &lt;a href=&quot;http://lucene.apache.org/tika/&quot;&gt;Apache Tika&lt;/a&gt;, which provides parsers for a lot of different file formats.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What is Apache Tika?&lt;/h2&gt;&lt;br /&gt;&lt;div&gt;Apache Tika is a subproject of the &lt;a href=&quot;http://lucene.apache.org/&quot;&gt;Apache Lucene&lt;/a&gt; project and is a toolkit for extracting content and metadata from different kind of file formats. The content extraction logic is not located inside Tika itself, but&amp;nbsp;Tika&amp;nbsp;defines a standard API and makes use of existing libraries like &lt;a href=&quot;http://poi.apache.org/&quot;&gt;POI&lt;/a&gt;&amp;nbsp;and &lt;a href=&quot;http://pdfbox.apache.org/&quot;&gt;PDFBox&lt;/a&gt;&amp;nbsp;for it's content extraction.&amp;nbsp;While writing this post the current release of Tika is version 0.6 and the following file formats are already supported:&amp;nbsp;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;HyperText Markup Language&lt;/li&gt;&lt;li&gt;XML and derived formats&lt;/li&gt;&lt;li&gt;Microsoft Office document formats&lt;/li&gt;&lt;li&gt;OpenDocument Format&lt;/li&gt;&lt;li&gt;Portable Document Format&lt;/li&gt;&lt;li&gt;Electronic Publication Format&lt;/li&gt;&lt;li&gt;Rich Text Format&lt;/li&gt;&lt;li&gt;Compression and packaging formats&lt;/li&gt;&lt;li&gt;Text formats&lt;/li&gt;&lt;li&gt;Audio formats&lt;/li&gt;&lt;li&gt;Image formats&lt;/li&gt;&lt;li&gt;Video formats&lt;/li&gt;&lt;li&gt;Java class files and archives&lt;/li&gt;&lt;li&gt;The mbox format&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;As you can see this is already quite a lot. The team behind Tika is working hard on improving the current parser possibilities and adding more formats for the upcoming releases. Tika is actually already being used by a number of other Apache projects like JackRabbit and &lt;a href=&quot;http://lucene.apache.org/solr/&quot;&gt;Solr&lt;/a&gt;. Now let's see how we can use Tika ourselves.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Getting started&lt;/h2&gt;&lt;br /&gt;I always work with &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven&lt;/a&gt; as my build system, so let's start of with a piece of pom.xml. First add the Tika parser dependency to our pom.xml.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.apache.tika&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;tika-parsers&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;0.6&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;By depending on &lt;i&gt;tika-parsers&lt;/i&gt;&amp;nbsp;Maven will automatically gather the required parser libraries, which are needed to parse certain file formats. Since my Java code example will be based on a unit test, we will also need to add JUnit as a dependency to our pom.xml.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;4.7&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In this post I want to see what kind of&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Exchangeable_image_file_format&quot;&gt;EXIF&lt;/a&gt;&amp;nbsp;information can be retrieved from an image by using Tika.&amp;nbsp;One of my hobbies is photography and therefor I have tons of images, which contain a lot of metadata about for instance the ISO speed or dimensions of an image.&amp;nbsp;Now let's write some actual code to see how Tika works.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The actual code&lt;/h2&gt;&lt;br /&gt;As I mentioned before, my&amp;nbsp;example&amp;nbsp;code is written as a &lt;a href=&quot;http://www.junit.org/&quot;&gt;JUnit&lt;/a&gt; test. If you are not familiar with writing tests or JUnit itself please have a look at the JUnit &lt;a href=&quot;http://www.junit.org/&quot;&gt;website&lt;/a&gt;.&lt;br /&gt;To be able to run this test, I've added one of my images on the test classpath, so my test class will be able to find the image resource. The following piece of code shows my entire test class.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: java&quot;&gt;public class ImageMetaDataTest {&lt;br /&gt;&lt;br /&gt;    private static final String fileName = &quot;IMG_2659.JPG&quot;;&lt;br /&gt;&lt;br /&gt;    private Tika tika;&lt;br /&gt;    private InputStream stream;&lt;br /&gt;&lt;br /&gt;    @Before&lt;br /&gt;    public void setUp() {&lt;br /&gt;        tika = new Tika();&lt;br /&gt;        stream = this.getClass().getResourceAsStream(fileName);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Test&lt;br /&gt;    public void testImageMetadataCameraModel() throws IOException, SAXException, &lt;br /&gt;            TikaException {&lt;br /&gt;&lt;br /&gt;        Metadata metadata = new Metadata();&lt;br /&gt;        ContentHandler handler = new DefaultHandler();&lt;br /&gt;        Parser parser = new JpegParser();&lt;br /&gt;        ParseContext context = new ParseContext();&lt;br /&gt;&lt;br /&gt;        String mimeType = tika.detect(stream);&lt;br /&gt;        metadata.set(Metadata.CONTENT_TYPE, mimeType);&lt;br /&gt;&lt;br /&gt;        parser.parse(stream,handler,metadata,context);&lt;br /&gt;        assertTrue(&quot;The expected Model is not correct&quot;, &lt;br /&gt;                metadata.get(&quot;Model&quot;).equals(&quot;Canon EOS 350D DIGITAL&quot;));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @After&lt;br /&gt;    public void close() throws IOException {&lt;br /&gt;        if(stream!=null) {&lt;br /&gt;            stream.close();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see the code is quite small. The most important part of the above code example is using the&amp;nbsp;JpegParser to parse the .JPG file&amp;nbsp;and the creation of the Metadata object with the appropriate information.&lt;br /&gt;I think this simple test case shows you how easy to use the Tika API is. Of course in the above test case I only test for the current Camera Model, but the Metadata object holds much more information then just that.&lt;br /&gt;&lt;br /&gt;Viewing all the&amp;nbsp;fields found in the metadata of the image can be achieved quite easily by using for instance the following method.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: java&quot;&gt;private void listAvailableMetaDataFields(final Metadata metadata) {&lt;br /&gt;  for(int i = 0; i &amp;lt;metadata.names().length; i++) {&lt;br /&gt;    String name = metadata.names()[i];&lt;br /&gt;    System.out.println(name + &quot; : &quot; + metadata.get(name));&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The output of this method can be like:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Easy Shooting Mode : Manual&lt;br /&gt;Image Type : Canon EOS 350D DIGITAL&lt;br /&gt;Model : Canon EOS 350D DIGITAL&lt;br /&gt;Metering Mode : Evaluative&lt;br /&gt;Quality : Fine&lt;br /&gt;Shutter/Auto Exposure-lock Buttons : AF/AE lock&lt;br /&gt;ISO Speed Ratings : 400&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It's as easy as that.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Looking ahead&lt;/h2&gt;&lt;br /&gt;I'm currently looking for possibilities of integrating Apache Tika into Hippo CMS 7, to enhance the system with much more metadata then there currently is available in the system. I think this can become quite a powerful addition in combination with the&amp;nbsp;facetted navigation feature introduced in&amp;nbsp;&lt;a href=&quot;http://www.onehippo.com/en/news/2010/03/CMS+7.3.html&quot;&gt;Hippo CMS 7.3&lt;/a&gt;. I've already started working on some code, which I hope to provide as a patch in the near future. I hope to provide an update in the near future.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2962867622850517744-2556839578610686454?l=blog.jeroenreijn.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 05 Apr 2010 20:59:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Jeroen Reijn)</dc:creator>
</item>
<item>
	<title>Arje Cahn (Hippo): The Dutch national government has a brand new website</title>
	<guid>http://blogs.onehippo.org/arje/2010/03/the_dutch_national_government.html</guid>
	<link>http://blogs.onehippo.org/arje/2010/03/the_dutch_national_government.html</link>
	<description>&lt;p&gt;News from the Dutch open source camp:&lt;/p&gt;

&lt;blockquote&gt;&quot;On March 31, 2010, the first version of &lt;a href=&quot;http://www.rijksoverheid.nl&quot;&gt;www.rijksoverheid.nl&lt;/a&gt; went live. This common website for all government ministries will make the central government more recognizable and accessible.&quot; (source:</description>
	<pubDate>Wed, 31 Mar 2010 09:01:19 +0000</pubDate>
</item>
<item>
	<title>Tjeerd D. Brenninkmeijer (Hippo): OSBC 2010: open source is much more than just a money saver</title>
	<guid>http://blogs.onehippo.org/tjeerd/2010/03/osbc_2010_open_source_is_much.html</guid>
	<link>http://blogs.onehippo.org/tjeerd/2010/03/osbc_2010_open_source_is_much.html</link>
	<description>Last week, for the second consecutive year, Hippo sponsored the &lt;a href=&quot;https://www.eiseverywhere.com/ehome/index.php?eventid=7578&quot;&gt;OSBC&lt;/a&gt; - Where Open Source meets Business in downtown San Francisco. 

Living up to its reputation as the most business oriented open source conference out there, the OSBC offered a chance to interact with other business leaders of open source companies and discuss how we're able to combine great free for all software with the payroll of a professional organization.

&lt;img alt=&quot;OSBC Tim O'Reilly's&quot; src=&quot;http://blogs.onehippo.org/tjeerd/Tim%20on%20stage%20%5BCropped%5D.jpg&quot; width=&quot;300&quot; height=&quot;200&quot; /&gt;


At the second OSBC since Lehman Brothers, this was a good moment to reconfirm what was tentatively said last year: Companies see Open Source technologies as a great way to control cost, and while the rest of IT struggled, Open Source companies continued to grow at a rapid &lt;a href=&quot;http://blogs.the451group.com/opensource/2009/12/14/open-source-means-cost-savings/&quot;&gt;pace&lt;/a&gt;.

However, Open Source as a money savings device is no longer a hard sell. It has become such a popular theme, that other advantages don't get the attention they deserve.  Clearly part of the mission of the OSBC is to set the record straight and focus on the open source method and technologies as a source of &lt;a href=&quot;http://www.sdtimes.com/OSBC_FOCUS_TURNS_TO_BEST_PRACTICES_FOR_OPEN_SOURCE_ADOPTION/By_Alex_Handy/About_OPENSOURCE/34210&quot;&gt;competitive advantage&lt;/a&gt; 

Meanwhile, in the exhibitor hall, the Hippo team was showing off the latest demos of Hippo CMS 7.3 and a pre release version of Hippo Portal 2, due to be released before the Summer. As an attention grabber, the demos met some stiff competition from the other side of the table where orange hippos were stacked up. 

&lt;img alt=&quot;Orange Hippos&quot; src=&quot;http://blogs.onehippo.org/tjeerd/Oranje%20Hippo%27s%20%5BResized%5D.jpg&quot; width=&quot;300&quot; height=&quot;200&quot; /&gt;


The OSBC was just the first in a row of US conferences for Hippo to sponsor this year. If you have a chance to attend, find us the coming months at &lt;a href=&quot;http://www.cmsexpo.net/&quot;&gt;CMSExpo&lt;/a&gt; in Chicago, &lt;a href=&quot;http://www.web2expo.com/&quot;&gt;Web2.0&lt;/a&gt; in San Franciso, &lt;a href=&quot;http://www.jboye.com/conferences/philadelphia10/&quot;&gt;JBoye&lt;/a&gt; in Philadelphia and the &lt;a href=&quot;http://gilbanesf.com/index.html&quot;&gt;Gilbane conference&lt;/a&gt; in San Francisco.

Keep an eye out for more events to be announced on &lt;a href=&quot;http://www.onehippo.com/en/events&quot;&gt;our website&lt;/a&gt;.</description>
	<pubDate>Wed, 24 Mar 2010 07:01:35 +0000</pubDate>
</item>
<item>
	<title>Arje Cahn (Hippo): Hippo CMS 7.4 preview: version compare</title>
	<guid>http://blogs.onehippo.org/arje/2010/03/hippo_cms_74_preview_version_c.html</guid>
	<link>http://blogs.onehippo.org/arje/2010/03/hippo_cms_74_preview_version_c.html</link>
	<description>&lt;p&gt;This is work in progress - but I got so excited when I saw it working that I couldn't resist turning it into a quick Friday afternoon demo video. This functionality will be released in Hippo CMS 7.4 which is scheduled for June, so I'm afraid I'm going to have to ask you for a bit of patience - but at least you'll have something to look out for :)&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Suppose Joe is our author and he's working on a new article that he wants to push live. He requests publication, and sends the article off to his editor, Jane, for review.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Screen%20shot%202010-03-19%20at%205.11.31%20PM.png&quot; src=&quot;http://blogs.onehippo.org/arje/2010/03/19/Screen%20shot%202010-03-19%20at%205.11.31%20PM.png&quot; width=&quot;500&quot; height=&quot;294&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I'm logging in as Jane now, and I can see the request that she got. Jane is fine with the article, so she pushes it live.&lt;/p&gt;

&lt;p&gt;A couple of days later, Joe the author comes in again, and he changes some of that content he wrote before. And he requests publication again. &lt;/p&gt;

&lt;p&gt;Jane logs in, sees the requests and wonders: What's new?&lt;/p&gt;

&lt;p&gt;Hold it here - I need to explain some background. Of course we have versioning and history and all that. Every CMS does. But how easy is it to get to that comparison view? How many clicks do you have to perform to compare the current version of the document with the one that's online right now? And what kind of a view does it give you? How often do you do this? And if it would be *super* easy, wouldn't you just want to see that comparison view all the time? All in all, you're working with a team of editors in the same content pool and you need that contextual information about what's going on in the system, and who did what, where.&lt;/p&gt;

&lt;p&gt;So that's what we did. We made it uber-super easy!&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Screen%20shot%202010-03-19%20at%205.13.49%20PM.png&quot; src=&quot;http://blogs.onehippo.org/arje/2010/03/19/Screen%20shot%202010-03-19%20at%205.13.49%20PM.png&quot; width=&quot;500&quot; height=&quot;160&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Click it - and there you go! That's what's new. Hippo CMS shows you the comparison view right there when you view the article. That is, when something has changed. It simply shows you the difference between the current version of the document and the one live on the website. How useful is that? If you need more information - you can of course dive into the version history, but this simple comparison view is probably all you need. &lt;/p&gt;

&lt;p&gt;Again - we hope to be releasing this with Hippo CMS 7.4 in June, so hold tight.&lt;/p&gt;

&lt;p&gt;In the meantime, let me know what you think - feedback is very much appreciated.&lt;/p&gt;</description>
	<pubDate>Fri, 19 Mar 2010 16:51:03 +0000</pubDate>
</item>
<item>
	<title>Arje Cahn (Hippo): What's wrong with portals?</title>
	<guid>http://blogs.onehippo.org/arje/2010/03/whats_wrong_with_portals.html</guid>
	<link>http://blogs.onehippo.org/arje/2010/03/whats_wrong_with_portals.html</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.cmswire.com/cms/enterprise-cms/5-things-to-consider-when-integrating-your-content-management-system-and-portal-006789.php&quot;&gt;This post&lt;/a&gt; clearly describes the problem that I see with all current portal implementations: they treat content as “just another application running inside a portlet”. When we stick to this paradigm, it will kill Portal. Content behaves very different from legacy apps, and simply offering a contextually disconnected content management portlet is not enough. Content deals with semantics and relationships: users expect a portal to be smart enough to render content that is related to the apps they see right there on their screen, and they expect content to be reused across different sections in a portal, wherever that makes sense. Not to mention user-generated content.&lt;/p&gt;

&lt;p&gt;Wikis gave users the possibility to quickly create and collaborate on content, but they don't come with the visual application integration that Portals offer. And they lacked the degree of control of a decent content management system. Integrating Portal and CMS is more than just adding a 'content portlet'. Adding an in-context application to a Wiki page would be more in line with how users think. They navigate your online consumer portal, find a page that answers their question and then they want to act on it directly. The FAQ page on “How to request a new password” should render the “New password” portlet in-line with the article. This is just an example - but this is clearly the direction Wikis are heading as they're maturing towards something that resembles an integration of Portal and CMS, and they're leaving traditional Portals way behind.&lt;/p&gt;

&lt;p&gt;Portal vendors need to move towards the Content Driven Portal. At least, this is direction we've chosen to go with &lt;a href=&quot;http://www.onehippo.com&quot;&gt;Hippo Portal&lt;/a&gt;. Users want URLs that make sense, that say something about the information that can be found on a page. They want to pop the URL of a portal page into an email and send it to someone else and it should just work - within the appropriate security constraints of course. What applications are shown on the portal page should follow the context, not the other way around. People got used to this concept during the Wiki revolution, and they'll never want to go back.&lt;/p&gt;</description>
	<pubDate>Thu, 11 Mar 2010 08:50:36 +0000</pubDate>
</item>
<item>
	<title>Tjeerd D. Brenninkmeijer (Hippo): Five golden rings, four golden Hippos and one platinum Hippo</title>
	<guid>http://blogs.onehippo.org/tjeerd/2010/02/five_golden_rings_four_golden.html</guid>
	<link>http://blogs.onehippo.org/tjeerd/2010/02/five_golden_rings_four_golden.html</link>
	<description>Today we will leave the office by taxi to a secret 'kart' location where we will be treated to some (non alcoholic) drinks, some &quot;bittergarnituur&quot; and a presentation by Stefan.  Later on we will get a short introduction in how a kart works (probably only useful for myself) and do a training lap.
Three races will follow after the best classed drivers will compete in a grand finale!
The best driver will get a bottle of (very cheap) champagne after which the barbecue will be lit.
We'll have food, beer and laughs until ~8 after which the official programme is over. We'll see what happens afterwards.

And of course the one true winner of the evening will receive the Golden Hippo!

A golden what? A golden Hippo? Yes! a golden Hippo! Not just one, they're like Pokemon, gotta catch'em all! One can 'catch' (i.e. win) a golden Hippo by popular vote (how open source awards should be won). Once every quarter each member of our professional services department can be voted. Clients, Hippo partners &amp; colleagues can vote the 'best' Hippo consultant (and yes, we disabled the option that you can vote for yourself or your chief ;-)

&lt;img alt=&quot;goldenhippo.jpg&quot; src=&quot;http://blogs.onehippo.org/tjeerd/goldenhippo.jpg&quot; width=&quot;397&quot; height=&quot;339&quot; /&gt;

Just like today the golden Hippo will be awarded on a team event (organized by our very own event committee) and it is accompanied with a nice little bonus. This bonus, while nice, should be publicly disregarded by the receiver as insignificant compared to the true honour of receiving a gold coated piece of wood with a rubber hippo on top!

And our &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Twelve_Days_of_Christmas_(song)&quot;&gt;partridge in a pear tree&lt;/a&gt;? Replaced by a single platinum Hippo which is awarded at the end of each year to the true master of the Golden Hippos. This should be considered as an even more important cheap statue :-)</description>
	<pubDate>Fri, 26 Feb 2010 14:18:51 +0000</pubDate>
</item>
<item>
	<title>Jeroen Reijn (Hippo): Jboss ModeShape: A federating JCR repository</title>
	<guid>tag:blogger.com,1999:blog-2962867622850517744.post-58432697545718137</guid>
	<link>http://blog.jeroenreijn.com/2010/02/jboss-modeshape-federating-jcr.html</link>
	<description>Some interesting stuff is happing in the JCR community. With &lt;a href=&quot;http://jackrabbit.apache.org/&quot;&gt;Apache Jackrabbit 2.0.0&lt;/a&gt; out (with JCR 2.0) and an interesting project called &lt;a href=&quot;http://www.jboss.org/modeshape&quot;&gt;Jboss ModeShape&lt;/a&gt; almost reaching it's final 1.0 release. ModeShape recently came to my attention and it seems an interesting project. In this post I will give a short introduction of ModeShape and it's features.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What's ModeShape?&lt;/h2&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://bits.ohloh.net/attachments/28896/modeshape_icon_64px_med.png&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://bits.ohloh.net/attachments/28896/modeshape_icon_64px_med.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;ModeShape is a Java Content Repository implementation which will support both &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=170&quot;&gt;JSR-170&lt;/a&gt; and &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=283&quot;&gt;JSR-283&lt;/a&gt;. It's not trying to be just another isolated content repository, but a repository with a strong focus on content federation. In other words: ModeShape's main goal is to provide a single JCR interface for accessing and searching content coming from different back-end systems. These systems can even be of different sorts. You might think of a ModeShape repository containing information from a relation database, a file system and perhaps even another Java content repository like for instance &lt;a href=&quot;http://www.onehippo.org/&quot;&gt;Hippo CMS 7&lt;/a&gt;'s content repository. You can configure these sources of information with the help of ModeShapes connector framework.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Connectors&lt;/h2&gt;&lt;p&gt;One of ModeShape's key concepts is the concept of connectors. A connector will allow you to connect to a certain type of back-end system and&amp;nbsp;transparently&amp;nbsp;expose the information inside the ModeShape repository. In the current 1.0.0 beta release there are already a couple of out of the box connectors available:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In-Memory Connector&lt;/li&gt;&lt;li&gt;File System Connector&lt;/li&gt;&lt;li&gt;JPA Connector&lt;/li&gt;&lt;li&gt;Federation Connector&lt;/li&gt;&lt;li&gt;Subversion Connector&lt;/li&gt;&lt;li&gt;JBoss Cache Connector&lt;/li&gt;&lt;li&gt;Infinispan Connector&lt;/li&gt;&lt;li&gt;JDBC Metadata Connector&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;That's already quite a few, but for the upcoming release they also have plans for expanding the set of&amp;nbsp;connectors with for instance a JCR connector, which I find quite interesting myself, because that would allow you to expose other JCR implementations like Hippo CMS 7 (Apache JackRabbit) in combination with other systems through one JCR interface.&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_hd6Y7yyFK7E/S2rRrGuaTNI/AAAAAAAAAXw/fFDuXs75Ykc/s1600-h/modeshap-connectors.png&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/_hd6Y7yyFK7E/S2rRrGuaTNI/AAAAAAAAAXw/fFDuXs75Ykc/s320/modeshap-connectors.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;There are many other content solutions out there, so if you can't find a connector that suits your need, you can of course write one yourself and perhaps donate it to the ModeShape project.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Sequencers&lt;/h2&gt;&lt;p&gt;One of&amp;nbsp;ModeShapes other&amp;nbsp;interesting features is the concept of sequencers. With sequencers you can gather additional information from a certain item inside the repository and store that extracted information in the repository. ModeShape has quite a few sequencers out of the box:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Compact Node Type (CND) Sequencer&lt;/li&gt;&lt;li&gt;XML Document Sequencer&lt;/li&gt;&lt;li&gt;ZIP File Sequencer&lt;/li&gt;&lt;li&gt;Microsoft Office Document Sequencer&lt;/li&gt;&lt;li&gt;Java Source File Sequencer&lt;/li&gt;&lt;li&gt;Java Class File Sequencer&lt;/li&gt;&lt;li&gt;Image Sequencer&lt;/li&gt;&lt;li&gt;MP3 Sequencer&lt;/li&gt;&lt;li&gt;DDL File Sequencer&lt;/li&gt;&lt;li&gt;Text Sequencers&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;The example below is of the ImageSequencer, which can gather information from certain types of images stored inside the repository. The ImageMetaDataSequencer is used here to extract metadata like size, dimensions and so on from the image if they have one of the specified extensions and the extracted information is stored somewhere else inside the repository.&lt;br /&gt;&lt;/p&gt;&lt;pre class=&quot;brush:java&quot;&gt;JcrConfiguration config = ...&lt;br /&gt;config.sequencer(&quot;Image Sequencer&quot;)&lt;br /&gt;.usingClass(&quot;org.modeshape.sequencer.image.ImageMetadataSequencer&quot;)&lt;br /&gt;.loadedFromClasspath()&lt;br /&gt;.setDescription(&quot;Sequences image files to extract the characteristics of the image&quot;)&lt;br /&gt;.sequencingFrom(&quot;//(*.(jpg|jpeg|gif|bmp|psd)[*])/jcr:content[@jcr:data]&quot;)&lt;br /&gt;.andOutputtingTo(&quot;/images/$1&quot;);&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;With other mature JCR implementations out there I think ModeShapes strongest point is it's focus on content federation. Providing a single JCR interface for content stored in different systems is a great initiative, because the JCR API is quite easy to learn and to use.&amp;nbsp;I see a bright future for ModeShape, since companies are sharing more and more in-house information on the web these days. I myself will try to keep a close eye on ModeShape and see how it evolves.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2962867622850517744-58432697545718137?l=blog.jeroenreijn.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 04 Feb 2010 15:27:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Jeroen Reijn)</dc:creator>
</item>
<item>
	<title>Lars Peters (Hippo): Why WCM/Portal convergence is a good thing</title>
	<guid>tag:blogger.com,1999:blog-7342593045185099406.post-1817586119523489133</guid>
	<link>http://larsjpeters.blogspot.com/2010/01/why-portalwcm-convergence-is-good-thing.html</link>
	<description>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Stephen Powers' &lt;a href=&quot;http://blogs.forrester.com/information_management/2010/01/web-content-management-and-portal-together-at-last.html&quot;&gt;blogpost&lt;/a&gt; on convergence between WCM and Portal sparked a nice little controversy about the alleged trade-off between integration and separation of concerns. It ain't necessarily so: If integration is done right, the trade-off does not need to be there at all. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Convergence is a two way street. From the WCM perspective we like to think of Portals as a way to offer 'self service', personalization, security and integration with other applications / widgets / iframes and the like. From the Portal perspective we need WCM to provide tools to work with our portal content that does not reside in other applications.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Both are, of course, nothing new. Neither is the fact that vendors (&lt;a href=&quot;http://www.onehippo.com/&quot;&gt;Hippo&lt;/a&gt; with Hippo CMS and &lt;a href=&quot;http://portals.apache.org/jetspeed-2/&quot;&gt;Apache Jetspeed Portal&lt;/a&gt; is the open source example) have been offering integrated portal offerings for a number of years. Given the challenges and costs involved in true integration, it clearly makes sense to offer integrated solutions as to keep such projects manageable. And who can better ensure integration is done right than the vendor itself?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;New in Stephen's post is the fact that he, or rather IBM, sees the package of WCM &amp;amp; Portal becoming such a common combination that distinguishing the two markets would no longer be meaningful. This does not mean that WCM and Portals will become an undistinguishable mesh (or mess?) with the risk of losing all we gained from separating content from the presentation layer in the first place.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;It does mean, just like before, that buyers should be careful not to select a package that restricts their choice in where and how to manage and publish their content.  It also means that buyers should be critical when making decisions about such things as collaboration platforms. Collaboration systems put in place today, may be with us for many years to come. Where does the content reside? Can it be accessed, altered, integrated in other applications? What about the source code? Remember &lt;a href=&quot;http://www.guardian.co.uk/technology/2006/feb/09/guardianweeklytechnologysection&quot;&gt;Lotus Notes&lt;/a&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;For maximum flexibility and future readiness in purchasing an integrated WCM &amp;amp; Portal, there are four basic questions to ask:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;1. Can the WCM system stand on its own? Would you buy it for its WCM functionality?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;2. Can the Portal stand on its own? Would you buy it for its Portal functionality?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;3. Are the two really integrated? Integrated user management, security, administration, URL mapping, ease of development etc.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;4. Is it Open Source (eg, are you free to use and change the software as you wish)?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/7342593045185099406-1817586119523489133?l=larsjpeters.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 27 Jan 2010 01:01:11 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Lars Peters)</dc:creator>
</item>
<item>
	<title>David Taylor (Hippo): Jetspeed UI in 2.2.1</title>
	<guid>tag:blogger.com,1999:blog-8747054103324856503.post-1357900328500871741</guid>
	<link>http://davidseantaylor.blogspot.com/2010/01/jetspeed-ui-in-221.html</link>
	<description>With this blog post, I introduce the new Jetspeed portal user interface we are developing for the upcoming release of version 2.2.1. For the past several years, the Apache Jetspeed Portal has had two user interfaces:&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;The Portal Pipeline&lt;/b&gt;, a server-side, servlet based aggregation engine. The server-side rendering engine was and still is the most common user interface for Jetspeed portals. It has progressed over the years, including the addition of nice features like a multi-threaded aggregation engine, rendering each portlet in parallel on its own thread.&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;The Desktop Pipeline&lt;/b&gt;, a client-side, Javascript based aggregation engine. The client-side rendering engine was not the default, and didn't get as much attention as the server-side. That said, I think the desktop pipeline had much more interesting features, with Ajax rendering pipelines serving portlet content to handle parallel rendering requests from within the browser.  The desktop pipeline, even though it ran in the browser, still supported the Java Portlet API, adhering to the requirements of action and render phases. It also had some interesting features including drag and drop moving of portlets in either grid or detached mode, and resizing the portlets and layouts.&lt;br /&gt;&lt;br /&gt;With version 2.2.1 (still unreleased), we are working on a single rendering engine sharing the same pipeline and code base. This engine can be configured to render portlets on the server-side or client-side. We call this new rendering engine &lt;b&gt;&quot;Jetui&quot;&lt;/b&gt;, since the client-side code is based on the YUI Javascript library. Jetui already supports many of the drag and drop customization features of the Desktop pipeline, with the addition of several new features. Two interesting new additions are the toolbars: a Page and Space Navigator and a Toolbox.&lt;br /&gt;&lt;br /&gt;In this blog I will introduce the Jetspeed Toolbox. The Toolbox is designed to make user customizations very easy in just one click. The toolbox contains three panels:&lt;br /&gt;&lt;br /&gt;- Portlet Selector&lt;br /&gt;- Layouts&lt;br /&gt;- Themes&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_Cd01IhxVCuQ/S0fXr_xQ0NI/AAAAAAAAABE/VVvpcjW3fRI/s1600-h/toolbox.jpg&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/_Cd01IhxVCuQ/S0fXr_xQ0NI/AAAAAAAAABE/VVvpcjW3fRI/s320/toolbox.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5424541427043455186&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;The Portlet Selector can be docked to the left or right side of the page, or it can float freely on top of the page. Portlets can be searched for using this tool, as all portlet metadata is automatically indexed in the portlet registry. Additionally, portlets can be categorized and filtered based on categories (see the drop down list). One click addition of portlets is now possible without ever leaving the page being customized. Portlets are also filtered by secure access. Only portlets that are configured to be viewable to the current user are displayed in the Jetspeed Toolbox.&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_Cd01IhxVCuQ/S0faKoQsOYI/AAAAAAAAABM/doKz9EoNfiI/s1600-h/toolboxpreview.jpg&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/_Cd01IhxVCuQ/S0faKoQsOYI/AAAAAAAAABM/doKz9EoNfiI/s320/toolboxpreview.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5424544152332024194&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;An interesting new feature is portlet preview mode:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Selecting the theme for the current page or space is as easy as selecting the theme tab and then clicking on the theme. Jetspeed introduces several new themes in 2.2.1:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_Cd01IhxVCuQ/S06FdcDVcPI/AAAAAAAAABU/BV4GPlhkmxo/s1600-h/theme.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_Cd01IhxVCuQ/S06FdcDVcPI/AAAAAAAAABU/BV4GPlhkmxo/s320/theme.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5426421341820907762&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Page layouts, selected from the Layout tab, provide several default layouts (with more coming).&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_Cd01IhxVCuQ/S06GmKfxQrI/AAAAAAAAABc/rnkFbw-ar5E/s1600-h/layout.png&quot;&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_Cd01IhxVCuQ/S06GmKfxQrI/AAAAAAAAABc/rnkFbw-ar5E/s320/layout.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5426422591238783666&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We are working on integrating the &lt;a href=&quot;http://www.blogger.com/%27http://getwookie.org/Welcome.html%27&quot;&gt;W3C Widgets&lt;/a&gt; alongside Java Portlets. Like portlets, widgets will be available for searching and adding from the Jetspeed Toolbar. I will discuss Widgets more in an upcoming blog.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In an upcoming blog, I will talk more about how to use templates to configure tools across pages...&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8747054103324856503-1357900328500871741?l=davidseantaylor.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 14 Jan 2010 04:01:16 +0000</pubDate>
	<dc:creator>noreply@blogger.com (DST)</dc:creator>
</item>
<item>
	<title>Arje Cahn (Hippo): 2010: the year the E-Reader will become the content managers’ favorite productivity tool</title>
	<guid>http://blogs.onehippo.org/arje/2009/12/2010_the_year_the_ereader_will.html</guid>
	<link>http://blogs.onehippo.org/arje/2009/12/2010_the_year_the_ereader_will.html</link>
	<description>&lt;p&gt;Flipping through my usability notes, I noticed one of our &lt;a href=&quot;http://www.onehippo.com&quot; target=&quot;_blank&quot;&gt;Hippo CMS&lt;/a&gt; users mentioned the following about proof-reading:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;There is no printing facility for content in Hippo CMS so everything has to be done on screen. Ev</description>
	<pubDate>Thu, 31 Dec 2009 11:43:41 +0000</pubDate>
</item>
<item>
	<title>Jeroen Reijn (Hippo): Content mangement and the semantic web</title>
	<guid>tag:blogger.com,1999:blog-2962867622850517744.post-654486552283314687</guid>
	<link>http://blog.jeroenreijn.com/2009/12/content-mangement-and-semantic-web.html</link>
	<description>&lt;img align=&quot;left&quot; alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5390347010206616578&quot; src=&quot;http://4.bp.blogspot.com/_hd6Y7yyFK7E/Ss5cC-d0TAI/AAAAAAAAASM/JtnIYqZivhU/s320/Semantic-Web-Logo-by-W3C.png&quot; /&gt; I came across the term 'semantic web' a couple of years ago, when &lt;a href=&quot;http://www.betaversion.org/~stefano/linotype/&quot;&gt;one of the original creators&lt;/a&gt; of &lt;a href=&quot;http://cocoon.apache.org/&quot;&gt;Apache Cocoon&lt;/a&gt; went of to work on the &lt;a href=&quot;http://simile.mit.edu/wiki/SIMILE:About&quot;&gt;SIMILE Project&lt;/a&gt; at MIT. I didn't pay much attention to the concept of 'semantic web' back then, because I just started learning Apache Cocoon and still had a lot to learn.&lt;br /&gt;But over the last couple of months I've been doing some research on the currently available standards for providing semantic data on the web with a strong focus on &lt;a href=&quot;http://en.wikipedia.org/wiki/RDFa&quot;&gt;RD&lt;span id=&quot;goog_1260951462840&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_1260951462841&quot;&gt;&lt;/span&gt;Fa&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Content management&lt;/h2&gt;&lt;p&gt;Working at &lt;a href=&quot;http://www.onehippo.com/&quot;&gt;Hippo&lt;/a&gt;, a &lt;a href=&quot;http://en.wikipedia.org/wiki/Content_management_system&quot;&gt;CMS&lt;/a&gt; vendor based in the Netherlands &amp; USA, makes me think in content and publishing strategies. Publishing information to the web is one of our core businesses, but I've learned over the last couple of month we can enrich our publishing platform even more by providing semantic data. I started my journey by looking around if other CMS vendors are paying attention to semantic web standards. I noticed that only a few of the enormous amount of&amp;nbsp; content management vendors actually put effort in providing semantic web functionalities for their end-users. I think that's a shame, because enrich your pages a lot.&lt;br /&gt;This post should give you an insight on how you could create a website with embedded meta data (with Hippo), but let's first start with some basics.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;What's the idea behind the semantic web?&lt;/h2&gt;&lt;p&gt;The current web is very well suited for being read by people like you and me. Computers however can only analyze the words on a page, but can not see the semantics of a piece of information on that specific page, that we as people &lt;i&gt;do&lt;/i&gt; see.&lt;br /&gt;If you would allow the information on you page to be machine-readable, the computer would be able to analyze your page and extract much more information from it then just being a piece of text. That's where semantic web standards can help out.&lt;br /&gt;Standards for providing semantic data on the web are not new and some of them have already been available for quite some time. Probably the two most well known are: &lt;a href=&quot;http://www.w3.org/RDF/&quot;&gt;RDF&lt;/a&gt; and &lt;a href=&quot;http://microformats.org/&quot;&gt;Microformats&lt;/a&gt;. However recently &lt;a href=&quot;http://en.wikipedia.org/wiki/RDFa&quot;&gt;RDFa&lt;/a&gt; has been getting a lot of attention by &lt;a href=&quot;http://googlewebmastercentral.blogspot.com/2009/05/introducing-rich-snippets.html&quot;&gt;Google&lt;/a&gt;, &lt;a href=&quot;http://developer.yahoo.com/searchmonkey/smguide/semantic_web.html&quot;&gt;Yahoo&lt;/a&gt; and now also the &lt;a href=&quot;http://coi.gov.uk/guidance.php?page=315#section3d&quot;&gt;UK government&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;What is RDFa?&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;RDFa is short for “Resource Description Framework in attributes”.  This sounds a bit descriptive, but it means that RDFa provides a set of XHTML attributes, which in their turn provide a way of translating visual data on a page into machine-readable hints. So let's take a look at an example of how a simple web page is currently structured.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;h1&amp;gt;Content management and the semantic web&amp;lt;/h1&amp;gt;&lt;br /&gt;    &amp;lt;h2&amp;gt;Jeroen Reijn&amp;lt;/h2&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;some information&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;As you can see in the above XHTML fragment, we have a page with a title, a subtitle and a small snippet of text inside the body of the page. By rendering this HTML fragment in the browser the visitor of this page will recognize this piece of text as being the title and author of the current article on the page. A machine however would need a bit more information to be sure the content can be identified as a title and author. That's where RDFa can help out. By using vocabularies, you can give meaning to specific pieces of content on a page.&lt;br /&gt;Let's see what the above XHTML fragment would look like if we would use RDFa.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;body xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot;&amp;gt; &lt;br /&gt;    &amp;lt;h1 property=&quot;dc:title&quot;&amp;gt;Content management and the semantic web&amp;lt;/h1&amp;gt;&lt;br /&gt;    &amp;lt;h2 property=&quot;dc:creator&quot;&amp;gt;Jeroen Reijn&amp;lt;/h2&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;some information&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;As shown in the example, the Dublin Core vocabulary is added to the page first. This is important to be able to use the properties inside the vocabulary later on. Once the vocabulary is in place, we can give meaning to fragments on the page. In the HTML fragment above the h1 is marked as the Dublin Core &lt;i&gt;title&lt;/i&gt; attribute and the h2 as the Dublin Core &lt;i&gt;creator&lt;/i&gt; attribute. With these properties in place a machine, like a search engine crawler, can now also store this as additional meta data of the page.&lt;br /&gt;One of the main advantages of RDFa is that your content can processed in a more efficient way, which in turn can make your page rank higher then it might have been before. &lt;br /&gt;Big search engines like Google and Yahoo already scan your website for RDFa embedded information, so why not use it?&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;How to use RDFa in your (hippo) website?&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;http://www.onehippo.org/&quot;&gt;Hippo CMS&lt;/a&gt; is a content (centered) management system and it differs from other CMS's in such a way that the information inside the Hippo CMS content repository is not stored or identified as pages, but rather as content. In most cases even reusable content. To be more precise: information stored inside the content repository is stored as &lt;a href=&quot;http://en.wikipedia.org/wiki/Content_repository_API_for_Java&quot;&gt;JCR&lt;/a&gt; nodes and/or properties. &lt;br /&gt;Since the data is just content and not bound to any front-end technology, you can either publish it as XML, (X)HTML with some help from the &lt;a href=&quot;http://www.onehippo.org/site-toolkit&quot;&gt;Hippo Site Toolkit&lt;/a&gt; (HST) or any other format you might like.&lt;br /&gt;Now let's take the above HTML fragment as an example and let's see what this would look like on a content level. One of the most important things to mention here is that a JCR repository has the concept of nodetype definitions in which you can configure what your data model looks like. You could compare it with for instance a XML Schema or DTD for a piece of XML, but then for the nodes and properties available in a JCR repository.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Let's first start with our content definition or in content management terms the document type. We will need three fields:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Title&lt;/li&gt;&lt;li&gt;Author&lt;/li&gt;&lt;li&gt;Body (rich-text field)&lt;/li&gt;&lt;/ul&gt;If you would create a document type with the &lt;a href=&quot;http://blogs.onehippo.org/arje/2009/08/an_improved_template_editor.html&quot;&gt;Hippo CMS template editor&lt;/a&gt;, the resulting nodetype definition will end up looking like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;'myproject'='http://www.myproject.org/nt/myproject/1.0'&amp;gt;&lt;br /&gt;&amp;lt;'hippostd'='http://www.onehippo.org/jcr/hippostd/nt/2.0'&amp;gt;&lt;br /&gt;&amp;lt;'hippo'='http://www.onehippo.org/jcr/hippo/nt/2.0'&amp;gt;&lt;br /&gt;&lt;br /&gt;[myproject:text] &amp;gt; hippostd:publishable, hippostd:publishableSummary, hippo:document&lt;br /&gt;- myproject:title (string)&lt;br /&gt;- myproject:author (string)&lt;br /&gt;+ myproject:body (hippostd:html)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;As you can see all three fields are available and can be used later on by any client that can read from the Java content repository. To be able to render this type of information as XHTML, we will be using the Hippo Site Toolkit. The Hippo Site Toolkit uses the concept of mapping&amp;nbsp; JCR nodes to simple Java beans, to be able to have an easier development cycle without having to learn the entire JCR API.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A Java bean representation of the JCR 'myproject:text' nodetype will look like this:&lt;br /&gt;&lt;pre class=&quot;brush: java&quot;&gt;import org.hippoecm.hst.content.beans.Node; &lt;br /&gt;&lt;br /&gt;import org.hippoecm.hst.content.beans.standard.HippoDocument;&lt;br /&gt;import org.hippoecm.hst.content.beans.standard.HippoHtml;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@Node(jcrType=&quot;myproject:text&quot;)&lt;br /&gt;public class TextBean extends HippoDocument{&lt;br /&gt;&lt;br /&gt;    public String getTitle() {&lt;br /&gt;        return getProperty(&quot;myproject:title&quot;);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public String getAuthor() {&lt;br /&gt;        return getProperty(&quot;myproject:author&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public HippoHtml getBody(){&lt;br /&gt;        return getHippoHtml(&quot;myproject:body&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;As you can see the Java bean is quite straight forward and easy to read.&lt;br /&gt;Now if we want to render the information on a webpage, we can use for instance JSP's with expression language to get the information from the Java bean. The JSP needed for outputting the RDFa enabled webpage can be as simple as this:&lt;br /&gt;&lt;/p&gt;&lt;pre class=&quot;brush: java&quot;&gt;&amp;lt;%@ page language=&quot;java&quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib uri=&quot;http://www.hippoecm.org/jsp/hst/core&quot; prefix='hst'%&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;body xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot;&amp;gt; &lt;br /&gt;    &amp;lt;h1 property=&quot;dc:title&quot;&amp;gt;${document.title}&amp;lt;/h1&amp;gt;&lt;br /&gt;    &amp;lt;h2 property=&quot;dc:creator&quot;&amp;gt;${document.author}&amp;lt;/h2&amp;gt;&lt;br /&gt;    &amp;lt;hst:html hippohtml=&quot;${document.body}&quot;/&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;As you can see it's that easy to use RDFa inside your website if you have a template independent CMS like Hippo.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;It gets even better&lt;/h2&gt;&lt;p&gt;Using RDFa for simple text can already be a great improvement for you website, but support for other RDFa vocabularies is added on a regular basis. Google &lt;a href=&quot;http://googlewebmastercentral.blogspot.com/2009/09/supporting-facebook-share-and-rdfa-for.html&quot;&gt;recently announced&lt;/a&gt; support for RDFa enabled pages with videos (or media) on them. You can provide extra information for your media files to the Google crawler, like the url to the thumbnail that belongs to your video, which can be presented when your video is found as one of the results in a search performed at Google. The possibilities are enormous, so I can see a lot of good things coming from using RDFa in the near future.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I think the role that content management systems can have for RDFa should not be underestimated, since most website these days are backed by some sort of content management system.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;For more information on RDFa see:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.w3.org/MarkUp/2009/rdfa-for-html-authors&quot;&gt;RDFa for HTML authors, by Steven Pemberton&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://rdfa.info/&quot;&gt;RDFa.info&lt;/a&gt; - A site containing news about RDFa &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://googlewebmastercentral.blogspot.com/2009/09/supporting-facebook-share-and-rdfa-for.html&quot;&gt;Google supporting FaceBook Share and RDFa for videos&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2962867622850517744-654486552283314687?l=blog.jeroenreijn.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 17 Dec 2009 10:43:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Jeroen Reijn)</dc:creator>
</item>
<item>
	<title>Jasha Joachimsthal (Hippo): Generate RSS in JSP? Set the locale!</title>
	<guid>tag:blogger.com,1999:blog-5942185880332728298.post-3298764568944033554</guid>
	<link>http://www.jasha.eu/blogposts/2009/12/generate-rss-in-jsp-set-locale.html</link>
	<description>&lt;div&gt;&lt;p&gt;The RSS pubDate fields contain dates in a format that may be human readable,
but not very handy in a programmer's point of view. According to the
&lt;a href=&quot;http://cyber.law.harvard.edu/rss/rss.html&quot;&gt;RSS specification&lt;/a&gt; the
date must conform to the RFC822 specification. A typical RSS snippet looks like:
&lt;/p&gt;

&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;item&amp;gt;
  &amp;lt;title&amp;gt;Generate RSS in JSP? Set the locale!&amp;lt;/title&amp;gt;
  &amp;lt;description&amp;gt;&amp;lt;p&amp;gt;Description of the feed item&amp;lt;/p&amp;gt;&amp;lt;/description&amp;gt;
  &amp;lt;link&amp;gt;http://blog.jasha.eu/2009/12/generate-rss-in-jsp-set-locale.html&amp;lt;/link&amp;gt;
  &amp;lt;guid&amp;gt;http://blog.jasha.eu/2009/12/generate-rss-in-jsp-set-locale.html&amp;lt;/guid&amp;gt;
  &amp;lt;pubDate&amp;gt;Wed, 10 Dec 2009 09:55:00 +0100&amp;lt;/pubDate&amp;gt;
&amp;lt;/item&amp;gt;
&lt;/pre&gt;

&lt;p&gt;An easy way to generate this from JSP is using the
&lt;a href=&quot;http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/fmt/tld-summary.html&quot;&gt;fmt
library&lt;/a&gt; from JSTL.&lt;/p&gt;

&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; %&amp;gt;
&amp;lt;item&amp;gt;
  &amp;lt;title&amp;gt;${item.title}&amp;lt;/title&amp;gt;
  &amp;lt;description&amp;gt;
    &amp;lt;![CDATA[&amp;lt;hst:html hippohtml=&quot;${item.html}&quot;/&amp;gt;]]&amp;gt;
  &amp;lt;/description&amp;gt;
  &amp;lt;link&amp;gt;${link}&amp;lt;/link&amp;gt;
  &amp;lt;guid&amp;gt;${link}&amp;lt;/guid&amp;gt;
  &amp;lt;pubDate&amp;gt;
    &amp;lt;fmt:formatDate value=&quot;${item.date.time}&quot; pattern=&quot;EE, dd MMM yyyy HH:mm:ss Z&quot;/&amp;gt;
  &amp;lt;/pubDate&amp;gt;
&amp;lt;/item&amp;gt;
&lt;/pre&gt;

&lt;p&gt;This seems to look good when you request the RSS feed from your browser.
However when you request the same feed from a Java
(&lt;a href=&quot;http://rome.dev.java.net&quot;&gt;ROME&lt;/a&gt;), a request generator
(&lt;a href=&quot;http://www.fiddler2.com/fiddler2/&quot;&gt;Fiddler&lt;/a&gt;) or just use
&lt;a href=&quot;http://www.gnu.org/software/wget/&quot;&gt;wget&lt;/a&gt; the format of the pubDate
field is invalid. It returns &quot;Wed Dec 10 09:55:00 CET 2009&quot; instead of &quot;Wed, 10
Dec 2009 09:55:00 +0100&quot; as value of pubDate. What happened?&lt;/p&gt;

&lt;p&gt;Your browser sends a header &quot;Accept-Language&quot; with, hopefully, &quot;en-US&quot; as
first value. The JSTL library uses the en-US locale to format the date and the
feed gets parsed correctly. The other tools don't send this header and the
programmer did not specify a locale for fmt. fmt does not know how to format the
date and returns a &quot;Date.getString();&quot;.&lt;/p&gt;

&lt;p&gt;A workaround for you as requester of the feed is to manually add the
&quot;Accept-Language&quot; header to the request with value &quot;en-US&quot;. For the JSP
developer: the date format for RSS should always be &quot;en_US&quot;. Just add this line
to your JSP:&lt;/p&gt;

&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;fmt:setLocale value=&quot;en_US&quot;/&amp;gt;&lt;/pre&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 10 Dec 2009 08:55:00 +0000</pubDate>
	<dc:creator>Jasha Joachimsthal</dc:creator>
</item>
<item>
	<title>Tjeerd D. Brenninkmeijer (Hippo): A short recap of Forge Friday: October 30th</title>
	<guid>http://blogs.onehippo.org/tjeerd/2009/11/a_short_recap_of_forge_friday.html</guid>
	<link>http://blogs.onehippo.org/tjeerd/2009/11/a_short_recap_of_forge_friday.html</link>
	<description>&lt;a href=&quot;http://wiki.onehippo.com/display/CMS7/Hippo+Forge+Friday+on+the+30th+of+October&quot;&gt;Everyone&lt;/a&gt; was invited at the Hippo office's in Amsterdam or San Francisco to participate in the creation of cool projects. Any idea was welcome, as long as it was Hippo related (and could therefore be posted</description>
	<pubDate>Mon, 16 Nov 2009 11:25:08 +0000</pubDate>
</item>
<item>
	<title>David Taylor (Hippo): Apachecon, Oakland</title>
	<guid>tag:blogger.com,1999:blog-8747054103324856503.post-8833090494463267162</guid>
	<link>http://davidseantaylor.blogspot.com/2009/11/apachecon-oakland.html</link>
	<description>I will be presenting at Apachecon in Oakland tomorrow at 9 AM.&lt;br /&gt;&lt;br /&gt;http://www.eu.apachecon.com/c/acus2009/sessions/282&lt;br /&gt;&lt;br /&gt;The presentation is less than an hour, introducing new direction in the Jetspeed open source portal, integrating with the Apache Jackrabbit project&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8747054103324856503-8833090494463267162?l=davidseantaylor.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 05 Nov 2009 02:01:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (DST)</dc:creator>
</item>
<item>
	<title>Arje Cahn (Hippo): ApacheCon US 09 Evening Meet-ups - Free for all</title>
	<guid>http://blogs.onehippo.org/arje/2009/10/apachecon_us_09_evening_meetup.html</guid>
	<link>http://blogs.onehippo.org/arje/2009/10/apachecon_us_09_evening_meetup.html</link>
	<description>&lt;p&gt;Monday 2nd, Tuesday 3rd and Thursday 5th of November&lt;br /&gt;
Oakland, CA&lt;br /&gt;
Content Tech, Hadoop, Lucene, NoSql, OSGi/Felix, SocialAndWidgets, Subversion, Tomcat, Traffic Server Podling, WebCrawlers, WebServices&lt;/p&gt;

&lt;p&gt;Join us for a third year of Apache Meetups! Users, committers, managers and</description>
	<pubDate>Mon, 26 Oct 2009 13:01:18 +0000</pubDate>
</item>
<item>
	<title>Jasha Joachimsthal (Hippo): Generate the robots.txt from Hippo CMS</title>
	<guid>tag:blogger.com,1999:blog-5942185880332728298.post-1819522123885782193</guid>
	<link>http://www.jasha.eu/blogposts/2009/10/generate-robotstxt-from-hippo-cms.html</link>
	<description>&lt;div&gt;&lt;p&gt;The
&lt;a href=&quot;http://www.robotstxt.org/robotstxt.html&quot; rel=&quot;external&quot;&gt;robots.txt&lt;/a&gt;
is a response from your website that is unimportant for your human visitors but
very important for search engine crawlers. That's why we created a Hippo CMS /
Hippo Site Toolkit
(&lt;a href=&quot;http://www.onehippo.org/site-toolkit/&quot; rel=&quot;external&quot;&gt;HST&lt;/a&gt;) plugin
to manage the robots.txt in the CMS and return the proper output.&lt;/p&gt;

&lt;p&gt;&lt;span&gt;
 &lt;a href=&quot;http://www.jasha.eu/binaries/content/gallery/2009/robotstxt_01_cms.png&quot; class=&quot;grouped_elements&quot; rel=&quot;lightbox&quot;&gt;&lt;img width=&quot;240&quot; height=&quot;177&quot; src=&quot;http://www.jasha.eu/binaries/thumbnail/content/gallery/2009/robotstxt_01_cms.png&quot; alt=&quot;Screenshot of Robots.txt configuration&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
The plugin comes with an out of the box document type to manage the parts of the
site that are disallowed to crawl for search robots. There's usually one
configuration for all crawlers but if you want, you can add multiple
configurations per crawler.&lt;/p&gt;

&lt;p&gt;In the first screenshot all crawlers should skip &quot;/donotindex/&quot; and
&quot;/search/&quot;, only &quot;Googlebot&quot; should ignore /hide/for/googlebot and the non
existing &quot;EvilBot&quot; is kindly requested not to index the site at all.&lt;/p&gt;

&lt;p&gt;Generating the response is mostly configuring the HST response for the
request for &quot;robots.txt&quot;. The plugin comes with a
&lt;a href=&quot;http://robotstxt.forge.onehippo.org/demo.html&quot;&gt;demo project&lt;/a&gt; and
documentation &lt;a href=&quot;http://robotstxt.forge.onehippo.org/usage.html&quot;&gt;how to
configure&lt;/a&gt; the plugin for your existing project.&lt;/p&gt;

&lt;p&gt;&lt;span&gt;
&lt;a href=&quot;http://www.jasha.eu/binaries/content/gallery/2009/robotstxt_11_site.png&quot; class=&quot;grouped_elements&quot; rel=&quot;lightbox&quot;&gt;&lt;img width=&quot;240&quot; height=&quot;177&quot; align=&quot;left&quot; src=&quot;http://www.jasha.eu/binaries/thumbnail/content/gallery/2009/robotstxt_11_site.png&quot; alt=&quot;Sample robots.txt output&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
In the second screenshot you see the response by the HST for the &quot;robots.txt&quot;
request. The HST returns a plain text response with all the fields we've
configured in the CMS.&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 25 Oct 2009 14:01:10 +0000</pubDate>
	<dc:creator>Jasha Joachimsthal</dc:creator>
</item>
<item>
	<title>Arje Cahn (Hippo): Hippo Forge Friday: October 30</title>
	<guid>http://blogs.onehippo.org/arje/2009/10/hippo_forge_friday_october_30.html</guid>
	<link>http://blogs.onehippo.org/arje/2009/10/hippo_forge_friday_october_30.html</link>
	<description>&lt;p&gt;Get your hands dirty with Hippo, the &lt;b&gt;open source &lt;a href=&quot;http://www.onehippo.com/&quot;&gt;Java CMS and Portal framework&lt;/a&gt;&lt;/b&gt; that everybody talks about. Join us for this &lt;b&gt;free&lt;/b&gt; Hippo Forge Friday plugfest! We've scheduled an afternoon of free flow Hippo coding on &lt;b&gt;Friday, October 30&lt;/b&gt; in our offices in Amsterdam and San Francisco.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Build a CMS plugin, a portlet, a repository addon, an HST component&lt;/b&gt;, or something else that you think is cool enough to turn into an open source &lt;a href=&quot;http://forge.onehippo.org/&quot;&gt;Hippo Forge&lt;/a&gt; project. The core Hippo developers will be there to help build the Hippo component you always dreamed of! A Google Analytics plugin, an image resizer, a Jira portlet, a Lightbox HST Component, you name it. You can &lt;a href=&quot;https://spreadsheets.google.com/viewform?formkey=dHgzbVk2OWJwU1Y1SEJKTnJMeUIxNmc6MA&quot;&gt;sign up here.&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Whether you're an &lt;b&gt;experienced&lt;/b&gt; Hippo hacker &lt;b&gt;or a complete newbie&lt;/b&gt;, come join us for some proper coding fun, beers and food. If you don't know where to start - we'll help you get on track :)&lt;/p&gt;&lt;br /&gt;
&lt;img src=&quot;http://blogs.hippo.nl/tjeerd/forge_friday4.jpg&quot; align=&quot;center&quot; /&gt;&lt;br /&gt;
&lt;p&gt;We'll spend half a day on pure hacking galore, a big BBQ, beers, and of course: geeky prizes! Bring your laptop and we'll take care of the rest.&lt;/p&gt;&lt;br /&gt;
&lt;img src=&quot;http://blogs.hippo.nl/tjeerd/forge_friday1.jpg&quot; align=&quot;center&quot; /&gt;&lt;br /&gt;
                                    &lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; First international Hippo Forge Friday&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;                                    &lt;strong&gt;When:&lt;/strong&gt; October 30th from 14.00 until 21.00&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;                                    &lt;strong&gt;Where:&lt;/strong&gt;&lt;br /&gt;&lt;/strong&gt;Where:&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;http://www.onehippo.com/en/company/contact&quot;&gt;Hippo Office Amsterdam&lt;/a&gt;: Oosteinde 11, 1017 WT Amsterdam&lt;br /&gt;&lt;a href=&quot;http://www.onehippo.com/en/company/contact&quot;&gt;Hippo Office San Francisco&lt;/a&gt;: 185 H Street, Suite B, Petaluma, CA 94952&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;                                    &lt;strong&gt;Why:&lt;/strong&gt; A fast paced, hands-on introduction to Hippo. Get to know Hippo by writing plug-ins, HST components, portlets, and all things Hippo-like. Gain eternal fame by winning one of our prestigious prizes!&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;                                    &lt;strong&gt;Who:&lt;/strong&gt; All Java developers and web enthousiasts.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;                                    &lt;strong&gt;Registration:&lt;/strong&gt; Make sure you sign up early by filling in the &lt;a href=&quot;https://spreadsheets.google.com/viewform?formkey=dHgzbVk2OWJwU1Y1SEJKTnJMeUIxNmc6MA&quot;&gt;Forge Friday sign up form&lt;/a&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;More info:&lt;/strong&gt; Read Tjeerd's &lt;a href=&quot;http://blogs.hippo.nl/tjeerd/2009/08/block_your_agenda_for_the_inte.html&quot;&gt;blogpost about the last Forge Friday&lt;/a&gt; and keep an eye on the &lt;a href=&quot;http://wiki.onehippo.com/display/CMS7/Hippo+Forge+Friday+on+the+30th+of+October&quot;&gt;Wiki page&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 22 Oct 2009 10:08:02 +0000</pubDate>
</item>
<item>
	<title>Tjeerd D. Brenninkmeijer (Hippo): The Hippo hunting season has been opened!</title>
	<guid>http://blogs.onehippo.org/tjeerd/2009/10/the_hippo_hunting_season_has_b_1.html</guid>
	<link>http://blogs.onehippo.org/tjeerd/2009/10/the_hippo_hunting_season_has_b_1.html</link>
	<description>Last week I was in Paris for the &lt;a href=&quot;http://www.openworldforum.org/&quot;&gt;Open Source World Forum&lt;/a&gt;. And looking at my travel plans for the upcoming months I noticed that the conference season has started again. For us this means driving around with big boxes of orange-anti-stress-hippos, lots of</description>
	<pubDate>Wed, 07 Oct 2009 16:23:13 +0000</pubDate>
</item>
<item>
	<title>Lars Peters (Hippo): Do it yourself software</title>
	<guid>tag:blogger.com,1999:blog-7342593045185099406.post-655244316637410156</guid>
	<link>http://larsjpeters.blogspot.com/2009/06/do-it-yourself-software.html</link>
	<description>&lt;!--StartFragment--&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Recently I refreshed my memory on a company my friend &lt;a href=&quot;http://blog.arendsen.net/&quot;&gt;Alef Arendsen&lt;/a&gt;, then at &lt;a href=&quot;http://www.springsource.com/&quot;&gt;SpringSource&lt;/a&gt;, pointed out to me. &lt;span class=&quot;justified&quot;&gt;Charles Simonyi of &lt;a href=&quot;http://intentsoft.com/technology/overview.html&quot;&gt;Intentional&lt;/a&gt; writes that&lt;/span&gt; “all too often the knowledge and insights gained during the development disappear into the details of the code”.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;Although Intentional as a company has been around since 2002, and its ideas date back to the 90’s, this is still very much where business software is at today. The need for specialized engineers to get involved to build applications or websites, comes at a loss of direct influence and knowledge about the things that you need to build. Companies that are able to successfully bridge this gap, can produce stunningly usable software that others just don’t seem to get right: &lt;a href=&quot;http://www.google.com/&quot;&gt;Google&lt;/a&gt; and &lt;a href=&quot;http://www.apple.com/&quot;&gt;Apple&lt;/a&gt; are the obvious examples.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;In this light Content Management Systems have always been about putting direct control back into the hands of business. When trying to create web pages, back in the early/mid ‘90s, I had to teach myself a bit of HTML for even the simplest piece of green text on a black background. With business software this is no different. While years back for every 1 or 0 you needed a team of programmers, now many of us with simple development skills can create very complex and powerful applications.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Most of these developments stop short of one final step: new technology has empowered the developer, but you still need programming skills to get sophisticated enterprise applications up and running. The business users or ‘lay programmers’ as Martin Fowler calls them &lt;a href=&quot;http://martinfowler.com/bliki/IntentionalSoftware.html&quot;&gt;here&lt;/a&gt;, remain dependent on the IT community to realize their ideas. Hence business users stretch the boundaries of the tools they control: multi billion dollar projects with 1000s of people are entirely managed with cleverly designed spreadsheets.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;The first step in CMS development was to take the developers out of the loop in changing content on the website. With this 'Do-it-yourself' software a company did not only dramatically reduce the cost of maintenance, it also enabled business users to control the content directly. This in turn solved many of the translation problems on early websites. With a CMS it was immediately clear what a text would look like online. Text could be correctly fitted and the author could place pictures exactly where he wanted. &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Today even the simplest CMS has solved this problem and it is time to push the bar a bit higher: giving business the power to change and build complex websites integrating existing applications without IT support: so it does not require a project proposal and 4 months queuing time to get a new site live. And yes, it would be nice if it could all run on an invisible internal or external cloud infrastructure, so you would not have to worry about plugging in an extra server or getting the backup hooked up. &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;The benefits are clear: No more ridiculously detailed requirement sheets, no more blame game when the results don’t meet expectations in spite of this effort, and much, much shorter cycles – removing an entire layer of ‘friction’ between customer and producer.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;None of this is new – but in practice many challenges remain. While those in the know seem to be able to develop great looking, complex integrated sites in a matter of days or weeks; the average business user still fumbles with his Excel spreadsheet. And while the developer community has largely embraced the open source development model, participation of business users is notably low. With business users largely sidelined, there is a permanent danger for open source projects to lose track of the ‘business intent’ of a project. In projects where the engineers and business end users are one and the same, this danger is relatively low, but with any software that moves up the enterprise ladder, the dangers of a disconnect grow. On the bright side: if successfully tackled there seems to be a terrific opportunity for open source companies to involve more business users in their projects. &lt;/span&gt;&lt;/p&gt;        &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Ideally the end result of such a project is not only a CMS driven website or a content driven portal, but a system that allows users to use this as a starting point, with easy to use interfaces for creating additional websites and/or portals.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;!--[if !supportEmptyParas]--&gt;&lt;!--[endif]--&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Here are a few things we do at Hippo make it easier for our partners and customers to build such environments:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span lang=&quot;EN-US&quot;&gt;Provide direct and user friendly access to administrative interfaces; &lt;span&gt;eg, drag and drop Portlet selector for Jetspeed Portal 2&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Give access to functionality previously only available to programmers through a user friendly UI:&lt;span&gt; eg, Nested Template Picker, Site control functions in CMS 7 or space creation in Jetspeed Portal 2.&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang=&quot;EN-US&quot;&gt;Involve end-users in ongoing road map meetings, not just during the requirement / delivery phase&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang=&quot;EN-US&quot;&gt;And of-course: Develop products with a keen eye on keeping things clean and nimble for the daily user&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;So we're not quite at the full realization of Simonyi’s lofty goals yet, but rapid development environments and the rise of cloud infrastructures provide an opportunity to involve business users in different ways than before. Companies definitely seem eager to embrace it.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;!--EndFragment--&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/7342593045185099406-655244316637410156?l=larsjpeters.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 22 Sep 2009 03:54:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Lars Peters)</dc:creator>
</item>
<item>
	<title>Jeroen Reijn (Hippo): Apache Cocoon and Javascript minification</title>
	<guid>tag:blogger.com,1999:blog-2962867622850517744.post-2307076827958581338</guid>
	<link>http://blog.jeroenreijn.com/2009/09/apache-cocoon-and-javascript.html</link>
	<description>A couple of days ago somebody on the &lt;a href=&quot;http://cocoon.apache.org/&quot;&gt;Apache Cocoon&lt;/a&gt; user list send a message to the mailing-list about on the fly minification of for instance Javascript files. This topic has been quite popular over the past years, since web application have become richer and Javascript files have become larger.&lt;br /&gt;&lt;br /&gt;The ideal situation would be to compres your static files (CSS or Javascript) at build time, so this will not cost you any processing power, when your application is already running. I myself quite often use the &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven 2&lt;/a&gt; &lt;a href=&quot;http://alchim.sourceforge.net/yuicompressor-maven-plugin/overview.html&quot;&gt;YUI compressor plugin&lt;/a&gt; while building my projects, but in case you can't use this plugin you could think about a different solution. Since I've been using Cocoon for over more then 5 years, I thought I gave it another try and write a nice Cocoon reader that does this minification for you.&lt;br /&gt;&lt;br /&gt;There are multiple minification and obfuscation frameworks out there. One has a greater compression ratio then the other, but for me the most well know ones are probably:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://shrinksafe.dojotoolkit.org/&quot; target=&quot;_blank&quot;&gt;Dojo Shrinksafe&lt;/a&gt; - Rhino based compressor from the Dojo Toolkit&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://developer.yahoo.com/yui/compressor/&quot; target=&quot;_blank&quot;&gt;YUI Compressor&lt;/a&gt; - Rhino based compressor by Yahoo&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.crockford.com/javascript/jsmin.html&quot;&gt;JSMin&lt;/a&gt; - a whitespace compressor by Douglas Crockford&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Since Apache Cocoon comes with a version of Rhino and both #1 and #2 have their own version of Rhino included, this could end up having nasty conflicts because of two different versions of the library on the same classpath. Therefore I chose to write a reader based on JSMin, which does a lot of whitespace compression for you.&lt;br /&gt;&lt;br /&gt;The implementation of this reader was quite simple and if you're interested, you can get the source &lt;a href=&quot;http://people.apache.org/%7Ejreijn/sources/java/JavaScriptMinifyReader.java&quot;&gt;here&lt;/a&gt;. Do keep in mind that you will have to have the JSMin.java file also on the classpath, otherwise it wil not work.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2962867622850517744-2307076827958581338?l=blog.jeroenreijn.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 15 Sep 2009 20:01:17 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Jeroen Reijn)</dc:creator>
</item>
<item>
	<title>Tjeerd D. Brenninkmeijer (Hippo): Block your agenda for the international Hippo Forge Friday on the 30th of October</title>
	<guid>http://blogs.onehippo.org/tjeerd/2009/08/block_your_agenda_for_the_inte.html</guid>
	<link>http://blogs.onehippo.org/tjeerd/2009/08/block_your_agenda_for_the_inte.html</link>
	<description>Forge Friday sounds cool, but what is it?

The goal for everyone, so all developers, technical support engineers, architects, sys admins, hackers etc. is to build a CMS plugin, a portlet, a repository addon, a HST component, or something else that you think is cool enough to turn into a &lt;a href=&quot;http://forge.onehippo.org/&quot;&gt;Hippo Forge&lt;/a&gt; project (and win the big prize(s)! ;-).

On Friday the 14th of August Hippo had its first international Forge Friday, a joint effort between the offices in San Francisco and Amsterdam. We had a full afternoon and evening of pure hacking, a big BBQ, beers, and of course: geeky prizes. 

Besides building forge projects the overall goal is also to share knowledge between all the different people in our offices in Amsterdam and San Francisco and do something different for a day. So build a portlet when you've been building HST components all of your life, or build a CMS plugin when you've been building portlets since the Americans set foot on the moon.

&lt;img alt=&quot;forge_friday1.jpg&quot; src=&quot;http://blogs.hippo.nl/tjeerd/forge_friday1.jpg&quot; width=&quot;350&quot; height=&quot;320&quot; /&gt;
 
For this special occasion we built a brand new Forge Portal (a mashup of &lt;a href=&quot;http://www.onehippo.org/cms7&quot;&gt;Hippo CMS&lt;/a&gt;, &lt;a href=&quot;http://portals.apache.org/jetspeed-2/&quot;&gt;Jetspeed&lt;/a&gt; &amp; &lt;a href=&quot;http://www.google.com/apps/intl/en/business/index.html&quot;&gt;Google ideas&lt;/a&gt;). On this Portal employees could submit ideas of what they think would be useful to create or (also important) fun to work on.

During an intensive and fairly warm afternoon in our brand new office space you could feel the creativity and energy flowing. Groups were formed in such a way that teams were mixed as much as possible to get a maximum cross-over of knowledge and skills. And the results were amazing. 

&lt;img alt=&quot;forge_friday2.jpg&quot; src=&quot;http://blogs.hippo.nl/tjeerd/forge_friday2.jpg&quot; width=&quot;350&quot; height=&quot;221&quot; /&gt;

Not only did it seem possible to create a forge project in less then a day, it was even possible to make it work and demonstrate it to the rest of the colleagues. There were no restrictions to the projects chosen, but there were some for the presentations:

- Whatever you build has to be targeted towards the latest stable or Trunk versions of Hippo CMS 7, Jetspeed 2.2, HST 2, Hippo Repository 2, or a combination;
- Your code has to be ready at 20:00, and demoed live, in a 2 minute elevator pitch;
- Your demo has to be accessible over HTTP from within a web browser (ie - from the jury laptop); 
- You have to submit your demo by adding a URL to the submission page, after which the jury will randomly pick demos from the list;
- You have to assign a presenter for your demo. Only one person is allowed to touch the keyboard and mouse. And make sure to test your demo remotely :-);
- No slides or code is allowed; the only thing that you'll be judged upon is the running demo;

Results of the day: 9 forge projects presented. Interesting components were built that are more or less usable for clients right away. Good integration between the different technologies, lots of interaction between departments / developers, 20 kilo of meat, 60 liter of beer, 1 bottle of cola...

&lt;img alt=&quot;forge_frida4.jpg&quot; src=&quot;http://blogs.hippo.nl/tjeerd/forge_friday4.jpg&quot; width=&quot;350&quot; height=&quot;221&quot; /&gt;

This was just the first day in a hopefully long series of Hippo Forge Fridays. We think there are lots of you out there who would like to dive deeper into the Hippo products and built new components together with the experts in the specific Hippo / open source fields. Therefore we decided to organize the first Hippo Forge Friday for everyone who would like to participate in or contribute to the Hippo community.

So here we go:

&lt;strong&gt;What:&lt;/strong&gt; First international Hippo Forge Friday with friends
&lt;strong&gt;When:&lt;/strong&gt; October 30th from 14.00 until 21.00 (CET)
&lt;strong&gt;Where:&lt;/strong&gt; Hippo Office Amsterdam, Hippo Office San Francisco or join us through skype/ internet etc
&lt;strong&gt;Why: &lt;/strong&gt;To learn all about the Hippo products, create new or expand the current plug-ins, HST components, portlets etc. And to win eternal fame by earning one of the prestigious prizes in the following categories ( The Wow! Factor award, Most customer friendly, Most promising, And of course.. The Nice Try Award (too bad it didn't work out))
&lt;strong&gt;Cost:&lt;/strong&gt; Free (as in free beer ;-) 
&lt;strong&gt;Who:&lt;/strong&gt; Everyone who has a Hippo heart.

If you are interested in joining or want more information, drop an email at &quot;forgefriday at onehippo dot com&quot;.</description>
	<pubDate>Wed, 26 Aug 2009 14:18:36 +0000</pubDate>
</item>
<item>
	<title>Jeroen Reijn (Hippo): Japanese and Java resource bundles</title>
	<guid>tag:blogger.com,1999:blog-2962867622850517744.post-643144263057325293</guid>
	<link>http://blog.jeroenreijn.com/2009/08/japanese-and-java-resource-bundles.html</link>
	<description>At &lt;a href=&quot;http://www.onehippo.com/&quot;&gt;Hippo&lt;/a&gt; we have a project, which is build with &lt;a href=&quot;http://en.wikipedia.org/wiki/JavaServer_Faces&quot;&gt;Java Server Faces&lt;/a&gt;, for which I occasionally do some maintenance. A while ago I had an issue in our JIRA bug tracker that reported an error for the Japanese version of the website. The error came from a component that reads information from a resource bundle properties file, which is stored on the local filesystem. In this case from the Japanese version of the resource bundle (ApplicationResource_jp.properties), which is used by the web application to display some Japanese labels.&lt;br /&gt;&lt;br /&gt;The error wasn't very clear since it only gave the following exception:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;java.util.MissingResourceException:&lt;br /&gt;Can't find resource for bundle java.util.PropertyResourceBundle, key 'somekey'&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Looking in my project, I could clearly see that the resource bundle &lt;span&gt;was&lt;/span&gt; there and after a quick peek at the resource bundle file itself, I could see that the requested key was also present.&lt;br /&gt;&lt;br /&gt;After trying some different options I came to the conclusion that my web application was unable to read the actual .properties file from the classpath. By searching some more, I found out that the Java compiler and other Java tools can only process files which contain Latin-1 and/or Unicode-encoded (\udddd notation) characters. Since I was seeing Japanese characters when opening the properties file, it was clearly the case that this file did not meet those requirements.&lt;br /&gt;&lt;br /&gt;Solving this issue was quite simple in the end, since the &lt;a href=&quot;http://java.sun.com/javase/6/&quot;&gt;Sun JDK&lt;/a&gt; comes with a utility to help you out with files that contain characters, which are not Latin1. The utility is called: '&lt;a href=&quot;http://java.sun.com/javase/6/docs/technotes/tools/windows/native2ascii.html&quot;&gt;native2ascii&lt;/a&gt;' and can be run from the command-line quite easily by typing:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ native2ascii [inputfile] [outputfile]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Once I did that the application was working like a charm again!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2962867622850517744-643144263057325293?l=blog.jeroenreijn.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 07 Aug 2009 16:01:17 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Jeroen Reijn)</dc:creator>
</item>
<item>
	<title>Niels van Kampenhout (Hippo): Creating a new document through the Hippo Repository Workflow API</title>
	<guid>tag:blogger.com,1999:blog-49500217511749617.post-1392800822193897306</guid>
	<link>http://dev.nielsvk.com/2009/06/creating-new-document-through-hippo.html</link>
	<description>It's already a couple of months ago that I wrote about &lt;a href=&quot;http://dev.nielsvk.com/2009/02/using-hippo-repository-workflow-api.html&quot;&gt;using the Hippo Repository Workflow API&lt;/a&gt;. Back then, I explained how to modify an existing document, and request publication. Ever since that blog post I have been getting the same question over and over again: how to create a new document through the repository API?&lt;br /&gt;&lt;br /&gt;If you read the previous blog post, and looked at the worklfow API, it might not be directly obvious how to create a new document through the workflow. Think about how a document is created though: it is always created as a child node of an existing node: the parent folder. Creating a new document is actually part of the Folder Workflow!&lt;br /&gt;&lt;br /&gt;Knowing this, it all becomes very easy. Let's step through the code:&lt;br /&gt;&lt;br /&gt;Let's hardcode some values for simplicity's sake:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;String folderPath = &quot;/content/documents/news&quot;;&lt;br /&gt;String newDocumentName = &quot;Hippo CMS 7.1 released!&quot;;&lt;br /&gt;String newDocumentType = &quot;defaultcontent:news&quot;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We will be creating a new document inside the folder &lt;code&gt;/content/documents/news&lt;/code&gt;. This is actually a node of type &lt;code&gt;hippostd:folder&lt;/code&gt;, which means a FolderWorkflow applies to this node. We will be creating a new document of type &quot;defaultcontent:news&quot;, as provided with the Hippo CMS Quickstart WAR. We will call the new document &quot;Hippo CMS 7.1 released!&quot;.&lt;br /&gt;&lt;br /&gt;Next, we get the folder node from the repository session:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;// get the folder node&lt;br /&gt;HippoNode folderNode = (HippoNode) session.getItem(folderPath);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We also need the workflow manager:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;// get the workflow manager&lt;br /&gt;HippoWorkspace workspace = (HippoWorkspace) folderNode.getSession().getWorkspace();&lt;br /&gt;WorkflowManager workflowMgr = workspace.getWorkflowManager();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Using the workflow manager, get the folder node's workflow:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;// get the folder node's workflow&lt;br /&gt;Workflow workflow = workflowMgr.getWorkflow(&quot;internal&quot;, folderNode);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Check if the workflow is a folder workflow, and cast it to a FolderWorkflow object:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;if (workflow instanceof FolderWorkflow) {&lt;br /&gt;    FolderWorkflow fw = (FolderWorkflow) workflow;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now that we have the folder workflow, we can simply call the &lt;code&gt;add&lt;/code&gt; method. It takes three String parameters: the category (&quot;new-document&quot;), the node type, and the node name:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;// create the new document&lt;br /&gt;fw.add(&quot;new-document&quot;, newDocumentType, newDocumentName);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That's it! Run the program, and check your CMS. There should be a new document &quot;Hippo CMS 7.1 Released!&quot; visible under the &quot;news&quot; folder. You can edit and publish this document just like any other. To modify the document through the API, see my &lt;a href=&quot;http://dev.nielsvk.com/2009/02/using-hippo-repository-workflow-api.html&quot;&gt;previous post on this subject&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For your convenience, here is the complete class:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;package org.example;&lt;br /&gt;&lt;br /&gt;import java.rmi.RemoteException;&lt;br /&gt;&lt;br /&gt;import javax.jcr.RepositoryException;&lt;br /&gt;import javax.jcr.Session;&lt;br /&gt;&lt;br /&gt;import org.hippoecm.repository.HippoRepository;&lt;br /&gt;import org.hippoecm.repository.HippoRepositoryFactory;&lt;br /&gt;import org.hippoecm.repository.api.HippoNode;&lt;br /&gt;import org.hippoecm.repository.api.HippoWorkspace;&lt;br /&gt;import org.hippoecm.repository.api.Workflow;&lt;br /&gt;import org.hippoecm.repository.api.WorkflowException;&lt;br /&gt;import org.hippoecm.repository.api.WorkflowManager;&lt;br /&gt;import org.hippoecm.repository.standardworkflow.FolderWorkflow;&lt;br /&gt;&lt;br /&gt;public class CreateDocument {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        Session session;&lt;br /&gt;        HippoRepository repository;&lt;br /&gt;        try {&lt;br /&gt;            repository = HippoRepositoryFactory.getHippoRepository(&quot;rmi://localhost:1099/hipporepository&quot;);&lt;br /&gt;            session = repository.login(&quot;author&quot;, &quot;author&quot;.toCharArray());&lt;br /&gt;            &lt;br /&gt;            String folderPath = &quot;/content/documents/news&quot;;&lt;br /&gt;            String newDocumentName = &quot;Hippo CMS 7.1 released!&quot;;&lt;br /&gt;            String newDocumentType = &quot;defaultcontent:news&quot;;&lt;br /&gt;&lt;br /&gt;            // get the folder node&lt;br /&gt;            HippoNode folderNode = (HippoNode) session.getItem(folderPath);&lt;br /&gt;            &lt;br /&gt;            // get the workflow manager&lt;br /&gt;            HippoWorkspace workspace = (HippoWorkspace) folderNode.getSession().getWorkspace();&lt;br /&gt;            WorkflowManager workflowMgr = workspace.getWorkflowManager();&lt;br /&gt;            &lt;br /&gt;            // get the folder node's workflow&lt;br /&gt;            Workflow workflow = workflowMgr.getWorkflow(&quot;internal&quot;, folderNode);&lt;br /&gt;            &lt;br /&gt;            if (workflow instanceof FolderWorkflow) {&lt;br /&gt;                FolderWorkflow fw = (FolderWorkflow) workflow;&lt;br /&gt;                &lt;br /&gt;                // create the new document&lt;br /&gt;                fw.add(&quot;new-document&quot;, newDocumentType, newDocumentName);&lt;br /&gt;                &lt;br /&gt;                System.out.println(&quot;New document '&quot; + newDocumentName + &quot;' of type '&quot; + newDocumentType + &quot;' created&quot;);&lt;br /&gt;            }&lt;br /&gt;            else {&lt;br /&gt;                System.out.println(&quot;Workflow is not an instance of FolderWorkflow&quot;);&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;        } catch (RepositoryException e) {&lt;br /&gt;            System.out.println(e.getMessage());&lt;br /&gt;        } catch (RemoteException e) {&lt;br /&gt;            System.out.println(e.getMessage());&lt;br /&gt;        } catch (WorkflowException e) {&lt;br /&gt;            System.out.println(e.getMessage());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/49500217511749617-1392800822193897306?l=dev.nielsvk.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 23 Jun 2009 21:33:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Niels)</dc:creator>
</item>
<item>
	<title>David Taylor (Hippo): Roadmap Jetspeed 2.2.1</title>
	<guid>tag:blogger.com,1999:blog-8747054103324856503.post-3201750838967443021</guid>
	<link>http://davidseantaylor.blogspot.com/2009/06/roadmap-jetspeed-221.html</link>
	<description>I am sketching out a Roadmap for the next Jetspeed release, version 2.2.1. Here was my original plan for 2.2.1, to be based on maintenance and improvements to 2.2.0:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Old Roadmap for 2.2.1&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Advanced Portlet API 2.0 Support&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Data Migration from 2.1.x to 2.2.x&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Bug and Performance fixes to initial 2.2.0 release &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Complete implementation of optional JSR-286 Cache features&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Improved User and Site Browsing in Admin Portlets&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Registry Export&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;As time passes, priorities change. I have been working with the &lt;a href=&quot;http://onehippo.com/&quot;&gt;Hippo&lt;/a&gt; Enterprise Content Management suite quite a bit lately, and I realized Content Management goes hand and hand with portals. It is about time Jetspeed gets content management features too. We were originally planning on implementing &lt;a href=&quot;http://jackrabbit.apache.org/&quot;&gt;JCR&lt;/a&gt; features in version 2.2.2. After discussions with other team members, we are now looking at the following feature sets for JCR as the top priority for the 2.2.1 Roadmap:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Site and PSML persisted in JCR (Jackrabbit) Repository&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Navigation integration with repository: portal can navigate directly to bookmarked content&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Automatic publishing of content from repository, immediately accessible in portal&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Security synchronized with JCR security&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;We will still need to provide Data Migration for 2.1.x users, thus the new high level Roadmap for 2.2.1 is as follows:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;New High Level Roadmap for 2.2.1&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Site and PSML persisted in JCR (Jackrabbit) Repository&lt;/li&gt;&lt;li&gt;Navigation integration with repository: portal can navigate directly to bookmarked content&lt;/li&gt;&lt;li&gt;Automatic publishing of content from repository, immediately accessible in portal&lt;/li&gt;&lt;li&gt;Security synchronized with JCR security&lt;/li&gt;&lt;li&gt;Data Migration from 2.1.x to 2.2.x&lt;/li&gt;&lt;li&gt;Bug and Performance fixes to initial 2.2.0 release&lt;/li&gt;&lt;li&gt;Registry Export&lt;/li&gt;&lt;/ul&gt; With full Portlet API 2.0 support from version 2.2.0, and JCR support coming in version 2.2.1, we are planting the foundation for developing Java enterprise applications mixed with content.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8747054103324856503-3201750838967443021?l=davidseantaylor.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 19 Jun 2009 21:31:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (DST)</dc:creator>
</item>
<item>
	<title>Jeroen Reijn (Hippo): JCR: Sorting on child node properties</title>
	<guid>tag:blogger.com,1999:blog-2962867622850517744.post-8494252870185399323</guid>
	<link>http://blog.jeroenreijn.com/2009/06/jcr-sorting-on-child-node-properties.html</link>
	<description>A JCR repository, like &lt;a href=&quot;http://jackrabbit.apache.org&quot;&gt;Apache Jackrabbit&lt;/a&gt; (basis for &lt;a href=&quot;http://www.onehippo.org&quot;&gt;Hippo CMS 7&lt;/a&gt;'s content repository), mainly consists of nodes and properties. &lt;br /&gt;As described in the &lt;a href=&quot;http://jcp.org/aboutJava/communityprocess/final/jsr170/index.html&quot;&gt;JCR specification&lt;/a&gt;, a Java Content Repository should support 2 different query syntaxes: XPath and SQL. Once you get the hang of the syntax, performing a search on a JCR repository is quite easy, but today I came into a situation where I was not able perform the query I wanted. In this post I'll try to describe what my problem was and how the same result can still be achieved. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The content model&lt;/h3&gt;&lt;br /&gt;Let's first start with my content model. The actual node definition for my project looks something like the below:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;[myproject:metadata]&lt;br /&gt;- myproject:creator (string)&lt;br /&gt;- myproject:language (string)&lt;br /&gt;- myproject:publicationDate (date)&lt;br /&gt;- myproject:availableUntil (date)&lt;br /&gt;- myproject:lastModified (date)&lt;br /&gt;- myproject:keywords (string)&lt;br /&gt;- myproject:contributor (string)&lt;br /&gt;&lt;br /&gt;[myproject:news] &gt; hippostd:publishable, hippostd:publishableSummary, hippo:document&lt;br /&gt;- myproject:title (string)&lt;br /&gt;+ myproject:introduction (hippostd:html)&lt;br /&gt;+ myproject:body (hippostd:html)&lt;br /&gt;+ myproject:metadata (myproject:metadata)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I came into a situation where I wanted to search for nodes of type '&lt;span&gt;myproject:news&lt;/span&gt;', but sorted on the 'myproject:publicationDate' property of the '&lt;span&gt;myproject:metadata&lt;/span&gt;' subnode. Writing an XPath for such a query is quite easy if you're familiar with the XPath syntax.&lt;br /&gt;&lt;br /&gt;Let's start out with a very simple search and just search for nodes of the type '&lt;span&gt;myproject:news&lt;/span&gt;' , which in XPath looks like:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//element( *, myproject:news)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now if we would want to order these node types based on for instance the myproject:title property the same XPath query looks like:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//element( *, myproject:news) order by @myproject:title descending&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now if we would want to sort on the '&lt;span&gt;myproject:publicationDate&lt;/span&gt;' property of the myproject:metadata subnode, I would expect the same XPath to be:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//element( *, myproject:news) order by myproject:metadata/@myproject:publicationDate descending&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately this query did not seem to actually sort the result on the publicatenDate property as I would have expected. I was searching for typos first, but it appeared that the syntax of my query was ok, but it appeared that support for child axis in order by clauses was not yet supported by Jackrabbit itself.&lt;br /&gt;&lt;br /&gt;Then I found &lt;a href=&quot;https://issues.apache.org/jira/browse/JCR-800&quot;&gt;this&lt;/a&gt; JIRA issue[1] in the Jackrabbit bugtracker describing this problem and there appears to be a patch available. I'm still wondering how much of a performance impact this might have for large repositories, where you might want to sort on a property of a child node 'n'-levels deep underneath the actual node.&lt;br /&gt;&lt;br /&gt;If you want to sort on properties of a specific nodetype, you will have to add the sortable properties to the actual nodetype, which you are searching for and can't put them on a subnode. &lt;br /&gt;It seems that the patch, which should fix this problem, has already been comitted to the Jackrabbit trunk and should be available from Jackrabbit 1.6.0 as marked in the JackRabbit JIRA.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2962867622850517744-8494252870185399323?l=blog.jeroenreijn.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 13 Jun 2009 17:01:11 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Jeroen Reijn)</dc:creator>
</item>
<item>
	<title>Woonsan Ko (Hippo): Spring Web MVC framework support in HST-2</title>
	<guid>http://blogs.onehippo.org/woonsan/2009/06/spring_web_mvc_framework_suppo_1.html</guid>
	<link>http://blogs.onehippo.org/woonsan/2009/06/spring_web_mvc_framework_suppo_1.html</link>
	<description>&lt;h1&gt;Spring Web MVC framework support in HST-2&lt;/h1&gt;
&lt;br /&gt;
HST-2 has provided a basic support to enable developers to utilize
Spring Framework IoC container for HST components. [1]&lt;br /&gt;
Now, HST-2 provides even more. It supports Spring Web MVC Framework
based applications under HST-2 environment! Using</description>
	<pubDate>Fri, 05 Jun 2009 16:28:37 +0000</pubDate>
</item>
<item>
	<title>Jasha Joachimsthal (Hippo): Hippo Site Toolkit Query interface and pagination</title>
	<guid>tag:blogger.com,1999:blog-5942185880332728298.post-4064821216161876139</guid>
	<link>http://www.jasha.eu/blogposts/2009/06/hippo-site-toolkit-query-interface-and.html</link>
	<description>&lt;div&gt;&lt;p&gt;Today an interesting question came from a developer of one of our
implementation partners. He wanted to list items from our JCR repository and use
pagination. In this post I tried to make a summary out of the
&lt;a href=&quot;http://n2.nabble.com/Query-interface-and-pagination-tt3024511.html&quot;&gt;conversation&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;The query was:&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;      HstQuery query = getQueryManager().createQuery(requestContext, scope,
      filterBean);
      Filter filter = query.createFilter();
      filter.addContains(&quot;.&quot;, &quot;my keywords&quot;);
      query.setFilter(filter);
      HstQuery queryResult = query.execute();
      &lt;/pre&gt;

&lt;p&gt;The developer tried to get a paged result and the total number of items with:
&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;      query.setOffset(0);
      query.setLimit(10);

      HippoBeanIterator hits = queryResult.getHippoBeans();
      hits.getSize();
      &lt;/pre&gt;

&lt;p&gt;The result contained indeed 10 items but hits.getSize(); also returned 10.
What's going wrong? Ard Schrijvers explained:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you use setLimit(3), you will get at most 3 hits, but never more.
getSize() from the queryResult returns at most 3. Even if the search criteria
matched hundreds of documents. If you use offset(10) and no limit, getSize()
returns just 10 hits less then without the offset.&lt;/p&gt;

&lt;p&gt;This limit is there to be used for performance, and suits for example very
well &quot;show last 3 agenda items on homepage&quot;.&lt;/p&gt;

&lt;p&gt;If you need paging and only want 10 results, do not use setLimit(int limit).
&lt;/p&gt;

&lt;p&gt;What you do use, is just the query without setLimit(). Then you'll get back a
queryResult, from which you get a HippoBeanIterator. This is a normal Iterator,
with some extensions. A very important one is the method skip(int skipNum).&lt;/p&gt;

&lt;p&gt;From the HippoBeanIterator, you can simply iterate the beans you need. Make
sure you use skip(int skipNum) to jump to the correct place. If the current page
is 11 and pagesize is 20, set skipNum to 220.&lt;/p&gt;

&lt;p&gt;Then fill your List in a for loop from skipNum - skipNum + pageSize.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What about performance?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The skip is propagated to the JCR NodeIterator. If you want to display item
100-110, and you use skip(100), still only 10 Beans will be created. JCR nodes
for Beans 0-99 are not fetched.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What if you need the total number of hits?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use getSize(). The getSize() on the the HstQueryResultImpl or on the
HippoBeanIteratorImpl does not actually populate the entire iterator with
HippoBeans. It is a call through the JCR NodeIterator, which in JackRabbit is
some lazy loading iterator, and, where the getSize is propagated to the executed
query, without fetching actual nodes.&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 04 Jun 2009 18:01:43 +0000</pubDate>
	<dc:creator>Jasha Joachimsthal</dc:creator>
</item>
<item>
	<title>Niels van Kampenhout (Hippo): HST Components at Hippo Forge</title>
	<guid>tag:blogger.com,1999:blog-49500217511749617.post-7912832826758318126</guid>
	<link>http://dev.nielsvk.com/2009/05/hst-components-at-hippo-forge.html</link>
	<description>&lt;a href=&quot;http://www.flickr.com/photos/oskay/265899811/&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/117/265899811_6eb93ed68d_m.jpg&quot; alt=&quot;Inside-out Lego brick by oskay&quot; align=&quot;right&quot; /&gt;&lt;/a&gt;In the past couple of days I slapped together two simple components for use with the Hippo Site Toolkit 2: &lt;a href=&quot;http://rss.forge.onehippo.org/&quot;&gt;RSS Feed Creator&lt;/a&gt; and &lt;a href=&quot;http://listbuilder.forge.onehippo.org/&quot;&gt;List Builder&lt;/a&gt;. At this moment, their names are more fancy than their actual functionalities ;-) but the idea is to provide some basic building blocks that people can take and extend. Both components are hosted at &lt;a href=&quot;http://forge.onehippo.org/&quot;&gt;Hippo Forge&lt;/a&gt;, so the source code is available and you can do with them whatever you want. Go ahead and take them for a test drive. If you think you can improve them (not that hard), feel free to contribute your work. I am happy to apply your patches. I might even consider giving you commit rights! ;-)&lt;br /&gt;&lt;br /&gt;The Forge is actually starting to become a well stocked library of CMS and HST components. Check out the &lt;a href=&quot;http://relateddocs.forge.onehippo.org/&quot;&gt;Related Items Plugin&lt;/a&gt;; It helps you creating a list of documents related to the one you are editing, by making suggestions. Just one example of reusable functionality that you can add to your CMS project. Doesn't match your exact requirements? Adapt it, it's open source! Made a component for your project that is useful for others? Add it to the Forge!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/49500217511749617-7912832826758318126?l=dev.nielsvk.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 21 May 2009 18:01:42 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Niels)</dc:creator>
</item>
<item>
	<title>Jasha Joachimsthal (Hippo): I don't want to register before downloading</title>
	<guid>tag:blogger.com,1999:blog-5942185880332728298.post-7926038348793250183</guid>
	<link>http://www.jasha.eu/blogposts/2009/05/i-dont-want-to-register-before.html</link>
	<description>&lt;div&gt;&lt;p&gt;Okay I just wanted to try the &quot;community edition&quot; of some software. So I
clicked on the big download button and then... I had to login. Because I don't
have an account yet I had to register first. So I filled in all required field
like my email address and a free to choose password without any help message
about it's strength and then I got this error message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Password not strong enough. Please use at least 3 of the following
prerequisites:lowercase (a-z), uppercase (A-Z), numbers (0-9), and special
characters (!^%#$@*.,)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Come on, I just want to try some software. Just let me download it without
creating an account I will probably never use again. When I want to post on your
support forum that's the right moment to create an account. I wonder if these
companies have ever looked into their website statistics to see at which point
people quit.&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 16 May 2009 12:01:19 +0000</pubDate>
	<dc:creator>Jasha Joachimsthal</dc:creator>
</item>
<item>
	<title>Jasha Joachimsthal (Hippo): Hippo developer training</title>
	<guid>tag:blogger.com,1999:blog-5942185880332728298.post-9074074974667498397</guid>
	<link>http://www.jasha.eu/blogposts/2009/04/hippo-developer-training.html</link>
	<description>&lt;div&gt;&lt;p&gt;&lt;a href=&quot;http://www.onehippo.com&quot;&gt;Hippo&lt;/a&gt; let me follow the three day
developer training for CMS 7 and Hippo Site Toolkit 2 (HST2) by
&lt;a href=&quot;http://blog.jeroenreijn.com/&quot;&gt;Jeroen Reijn&lt;/a&gt;. I don't live inside a
cocoon so I knew already which new products had been developed. Until now I
hadn't done any implementation yet with Hippo CMS 7 and the HST2 because I was
too occupied with Hippo CMS 6 projects. Since I'm also a Hippo trainer it was a
good chance to get to know our new training programmes.&lt;/p&gt;
&lt;h3&gt;Day 1: introduction &lt;/h3&gt;
&lt;p&gt;After we received the handouts of the training we introduced ourselves. It
was a pretty mixed group with developers from partner implementation companies,
an independent consultant, developers from a customer and me.
&lt;a href=&quot;http://www.onehippo.org/about/architecture.html&quot; title=&quot;Hippo architecture&quot;&gt;&lt;img width=&quot;250&quot; height=&quot;142&quot; src=&quot;http://www.jasha.eu/binaries/content/gallery/2009/hippo-architecture.jpg&quot; alt=&quot;Hippo Architecture&quot; /&gt;&lt;/a&gt;
Jeroen explained the Hippo architecture which is basically still the same as
with version 6 but based on different technologies. The WebDAV repository has
been replaced with our JCR Repository (based on
&lt;a href=&quot;http://jackrabbit.apache.org/&quot;&gt;Apache Jackrabbit&lt;/a&gt;) which also uses
&lt;a href=&quot;http://lucene.apache.org/&quot;&gt;Apache Lucene&lt;/a&gt; for fast indexing &amp;amp;
searching. &lt;a href=&quot;http://www.onehippo.org/cms7/&quot;&gt;Hippo CMS 7&lt;/a&gt; is still an
application that runs separate from the repository and has been written in
&lt;a href=&quot;http://wicket.apache.org/&quot;&gt;Apache Wicket&lt;/a&gt;. For front end
applications you're free to choose a technology but Java is recommended because
of the J in JCR ;)&lt;/p&gt;

&lt;p&gt;Jeroen showed us the CMS and the Console to show what's happening inside the
repository. The trainees all got a laptop from Hippo with a VirtualBox image for
the training to &quot;play&quot; with the CMS and the console. No need to bring your own
laptop for the first two days!&lt;/p&gt;
&lt;h3&gt;Day 2: changing templates and HST2 introduction &lt;/h3&gt;
&lt;p&gt;After some explanation we started to create our own document type. We used
&lt;a href=&quot;http://svn.onehippo.org/repos/hippo/hippo-ecm/tags/Tag-HREPTWO-v2_03_00/&quot;&gt;
version 2.03.00&lt;/a&gt; (later versions have some issues with the graphical template
editor which are being solved soon). With just a few mouse clicks I had a
&quot;blogpost&quot; template with a date, title, WYSIWYG field and a checkbox for
&quot;allowing&quot; comments. Because this template isn't very difficult, it's nice to
create it by the GUI editor instead of creating XML configuration by hand (which
is still possible if you like to).&lt;/p&gt;

&lt;p&gt;After lunch Jeroen started explaining the Hippo Site Toolkit
&lt;a href=&quot;http://svn.onehippo.org/repos/hippo/ecm/site-toolkit/tags/Release-HSTTWO-v2_03_02/&quot;&gt;
version 2.03.02&lt;/a&gt;. The HST is not a framework but a toolkit to create your own
website using Hippo CMS and Hippo Repository. At this moment there's an HST for
JSP sites but other (Java) technologies may follow in the coming years. On the
VirtualBox image there is a sample site with a navigation structure, a news
listing and a view for detail pages. All configuration for the menu structure,
sitemap (mapping between URLs and repository paths), pages and templates is done
in the repository. Now you have to do it by hand but in the near future there
will be a configuration editor in the CMS. That would make it easy for the
webmaster to change the URL structure or the way pages look.&lt;/p&gt;

&lt;p&gt;The URL mapping is easy to understand if you know how
&lt;a href=&quot;http://cocoon.apache.org/2.0/userdocs/matchers/matchers.html&quot;&gt;matching&lt;/a&gt;
works in Apache Cocoon. _default_ is the equivalent of * in a Cocoon sitemap and
_any_ is equal to ** in the WildCardMatcher. A navigation structure like&lt;/p&gt;

&lt;pre class=&quot;brush: text&quot;&gt;      News
      |- _default_
      |- _default_
      |- _any_.html
      &lt;/pre&gt;

&lt;p&gt;would match a URL like /News/2009/04/My_blogpost.html. The &quot;wildcards&quot;
_default_ and _any_ can be added as parameters to the rendering class that can
pass it to the JSP so you can display &quot;April 2009&quot; in the title of your news
overview if a visitor goes to /News/2009/04. As last exercise we added a new
document type for events in the CMS, created some events and added a new event
listing to the existing example site.&lt;/p&gt;
&lt;h3&gt;Day 3: create your own site from the Maven archetype &lt;/h3&gt;
&lt;p&gt;For this day we were asked to bring our own laptop so we could leave with a
functional website at the end of the day and have all the necessary software
installed to create another. Jeroen explained about
&lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven&lt;/a&gt; en let us create a project using
the Maven archetype:&lt;/p&gt;

&lt;pre class=&quot;brush: text&quot;&gt;      $ mvn archetype:generate \
      -DarchetypeRepository=http://repository.onehippo.org/maven2 \
      -DarchetypeGroupId=org.onehippo.ecm.hst \
      -DarchetypeArtifactId=hst-archetype \
      -DarchetypeVersion=2.03.02 \
      -Dversion=1.01.00 \
      -DgroupId=org.example \
      -DartifactId=myproject
      &lt;/pre&gt;

&lt;p&gt;
 &lt;a href=&quot;http://www.jasha.eu/binaries/content/gallery/2009/urbannet-screenshot.jpg&quot; class=&quot;grouped_elements&quot; rel=&quot;lightbox&quot;&gt;&lt;img width=&quot;240&quot; height=&quot;176&quot; src=&quot;http://www.jasha.eu/binaries/thumbnail/content/gallery/2009/urbannet-screenshot.jpg&quot; alt=&quot;Screenshot of the Urbannet homepage&quot; /&gt;&lt;/a&gt;
It creates a project on the file system in three parts: the content, CMS and the
site. After lunch we started to build our own website. I took the
&lt;a href=&quot;http://www.urban-net.org/&quot;&gt;Urban-net&lt;/a&gt; website as example because it
has an easy layout (1 header and 3 columns: left hand navigation, dynamic
content in the centre and some downloads on the right hand site).&lt;/p&gt;

&lt;p&gt;First I created two document types, one for normal text and one for &quot;research
programmes&quot; (leaving away some fields compared to the original site). Then there
was the time consuming part: copy-pasting enough content for a decent paging in
the site. For real projects there are
&lt;a href=&quot;http://svn.onehippo.org/repos/hippo/hippo-ecm/tags/Tag-HREPTWO-v2_03_00/tools/migration/&quot;&gt;migration
tools&lt;/a&gt; available to convert the XML content from the WebDAV repository to JCR
nodes and properties.
&lt;a href=&quot;http://www.jasha.eu/binaries/content/gallery/2009/urbannet-screenshot-listing.jpg&quot; class=&quot;grouped_elements&quot; rel=&quot;lightbox&quot;&gt;&lt;img width=&quot;240&quot; height=&quot;177&quot; src=&quot;http://www.jasha.eu/binaries/thumbnail/content/gallery/2009/urbannet-screenshot-listing.jpg&quot; alt=&quot;Screenshot of document listing&quot; /&gt;&lt;/a&gt;
For the themes I used an ordinary repeating text field but the
&lt;a href=&quot;http://forge.onehippo.org/projects/ecm-tagging/&quot;&gt;Hippo ECM Tagging
add-on&lt;/a&gt; would be more user friendly in a real life implementation.&lt;/p&gt;

&lt;p&gt;After defining the several sitemenu parts, components, pages and templates it
was time to add the design and copy-paste the HTML into the JSP's. I couldn't
implement everything I wanted (helped others as well and the time was limited).
However in just a few hours I managed to implement a subset of the normal site.
It does not contain search, no faceted navigation, the links on the right hand
site are fake but it does show the basics.&lt;/p&gt;

&lt;p&gt;After the training it was time to enjoy the beautiful weather on our balcony
with some drinks and chips.&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 27 Apr 2009 06:20:00 +0000</pubDate>
	<dc:creator>Jasha Joachimsthal</dc:creator>
</item>
<item>
	<title>Woonsan Ko (Hippo): Spring framework support in HST-2</title>
	<guid>http://blogs.onehippo.org/woonsan/2009/04/spring_framework_support_in_hs_1.html</guid>
	<link>http://blogs.onehippo.org/woonsan/2009/04/spring_framework_support_in_hs_1.html</link>
	<description>I'd like to explain the current status to support Spring Framework-based developer community.
HST-2 (Hippo Site Toolkit - 2) now supports Spring Framework more than the earlier versions because there are a lot of developers utilizing the framework.

&lt;strong&gt;1. Introduction&lt;/strong&gt;

It is very desirable to use spring web framework if the development team is familiar with Spring and they could make better productivity with that.
HST-2 now provides a bridge &lt;code&gt;HstComponent&lt;/code&gt; to &lt;code&gt;HstComponent&lt;/code&gt; beans which are managed by spring web application context.
So, you can define your HstComponent beans in your spring context configuration and inject your existing component to them.
You can see an example in the HST-2 source already if you download the source from the trunk for now.
In the /applications/site/, 'contact-spring' menu will show the example which uses the bridge component. The actual bean is defined in &lt;code&gt;/WEB-INF/applicationContext.xml&lt;/code&gt; like the following:

&lt;code&gt;&lt;pre&gt;
  &amp;lt;!-- HST Component Beans --&amp;gt;
  &amp;lt;bean id=&quot;contactBean&quot; class=&quot;org.hippoecm.hst.components.ContactSpring&quot;&amp;gt;
    &amp;lt;property name=&quot;mailSender&quot; ref=&quot;mailSender&quot; /&amp;gt;
    &amp;lt;property name=&quot;templateMessage&quot; ref=&quot;templateMessage&quot; /&amp;gt;
  &amp;lt;/bean&amp;gt;

  &amp;lt;!-- The existing components as an example --&amp;gt;
  &amp;lt;bean id=&quot;templateMessage&quot; class=&quot;org.springframework.mail.SimpleMailMessage&quot;&amp;gt;
    &amp;lt;property name=&quot;to&quot; value=&quot;contact@mycompany.com&quot; &amp;gt;
    &amp;lt;property name=&quot;subject&quot; value=&quot;My opinion&quot; &amp;gt;
  &amp;lt;/bean&amp;gt;
  &amp;lt;bean id=&quot;mailSender&quot; class=&quot;org.springframework.mail.javamail.JavaMailSenderImpl&quot;&amp;gt;
    &amp;lt;property name=&quot;host&quot; value=&quot;mail.mycompany.com&quot;/&amp;gt;
  &amp;lt;/bean&amp;gt;
&lt;/pre&gt;&lt;/code&gt;

&lt;strong&gt;2. How it integrates with HST 2.3?&lt;/strong&gt;

HST container manages, invokes and aggregates only components based on  &lt;code&gt;HstComponent&lt;/code&gt; interface for some reasons: to support transparent page aggregation, seamless portal integration, etc.
A generic &lt;code&gt;HstComponent&lt;/code&gt; was developed to play a role as a bridge to a bean managed by spring framework.
So, the generic bridge &lt;code&gt;HstComponent&lt;/code&gt; will delegate all invocation to the actual HstComponent bean managed by spring framework.

&lt;strong&gt;3. What the benefits are? What the drawbacks are?&lt;/strong&gt;

Spring-based developers can use full cool functionalities of spring framework like Dependency Injection, out-of-box spring components to support enterprise computing like JDBC template, transaction management and enterprise messaging, AOP techniques, Web Service support, Various view technologies, etc.
&lt;code&gt;HstComponent&lt;/code&gt; can be fully integrated with these rich spring supports.

The Spring bridge &lt;code&gt;HstComponent&lt;/code&gt; invokes directly the actual bean, so there's no performance degrade and functional shortage here.

Of course, it looks a little bit different from the original spring web mvc pattern. The differences you can think of are originally from the differences of goals: HST-2 is to support transparent page aggregation and seamless portal integration, etc.
Because HST-2 container aggregates multiple components in one page, the action phase should be separated from the rendering phase of all components. This means that HST container's aggregation should imply the &lt;em&gt;PRG&lt;/em&gt; pattern internally. [1]
Therefore, in a HST component, the *controlling* logic should be separated in doAction() and in doBeforeRender(). Also, those two separate phase should have separate request life cycles.

Anyway, once you get accustomed to &lt;code&gt;HstComponent&lt;/code&gt; request l</description>
	<pubDate>Mon, 20 Apr 2009 10:04:55 +0000</pubDate>
</item>
<item>
	<title>Niels van Kampenhout (Hippo): Coming soon to a computer near you: Hippo Site Toolkit 2!</title>
	<guid>tag:blogger.com,1999:blog-49500217511749617.post-3563955525382474018</guid>
	<link>http://dev.nielsvk.com/2009/04/coming-soon-to-computer-near-you-hippo.html</link>
	<description>It's almost finished! &lt;a href=&quot;http://www.onehippo.org/site-toolkit/&quot;&gt;Hippo Site Toolkit 2&lt;/a&gt; will be released really soon now. I am working on the documentation right now and I have to say I am impressed by the work of our development team.&lt;br /&gt;&lt;br /&gt;Hippo Site Toolkit 2 is a very versatile and lightweight component based framework for building websites on the &lt;a href=&quot;http://www.onehippo.org/cms7/&quot;&gt;Hippo CMS&lt;/a&gt; stack. Very much in Hippo tradition, we do not enforce you to use any particular technology or framework, but rather give you freedom of choice and the building blocks you need.&lt;br /&gt;&lt;br /&gt;Some highlights among the many features of Hippo Site Toolkit 2 are:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Component based&lt;/span&gt;&lt;br /&gt;HST2 lets you create reusable components and assemble webpages from those components.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Transparent support for portlets&lt;/span&gt;&lt;br /&gt;HST2 components can be used out of the box as portlets in a portal environment.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Framework independent&lt;/span&gt;&lt;br /&gt;Although our primary focus is JSP, any Java web framework can make use of HST2 functionalities. A Spring MVC example is included.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Plain Java&lt;/span&gt;&lt;br /&gt;HST2 does not enforce any &quot;dominating technology&quot; that has been built on top of Java, such as Cocoon or Sling. It's all plain old Java.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Rapid website development&lt;/span&gt;&lt;br /&gt;HST2 includes a web based configuration GUI embedded in Hippo CMS, and many reusable out of the box components.&lt;br /&gt;&lt;br /&gt;There is no official release yet, and it's still a little rough around the edges here and there (you need to use the CMS Console for some configuration), but it is already usable. If you want to live on the edge, check out the &lt;a href=&quot;http://svn.hippocms.org/repos/hippo/ecm/site-toolkit/trunk/&quot;&gt;trunk&lt;/a&gt; and give it a go (see the &lt;a href=&quot;http://svn.hippocms.org/repos/hippo/ecm/site-toolkit/trunk/README&quot;&gt;README&lt;/a&gt;). If not, stay tuned while we finish up the release and the documentation!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/49500217511749617-3563955525382474018?l=dev.nielsvk.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 13 Apr 2009 23:01:32 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Niels)</dc:creator>
</item>
<item>
	<title>Niels van Kampenhout (Hippo): Publishing Maven artifacts for your Hippo Forge project</title>
	<guid>tag:blogger.com,1999:blog-49500217511749617.post-6938902042979972255</guid>
	<link>http://dev.nielsvk.com/2009/03/publishing-maven-artifacts-for-your.html</link>
	<description>Do you have a project on &lt;a href=&quot;http://forge.onehippo.org/&quot;&gt;Hippo Forge&lt;/a&gt;? Then you might want to &lt;a href=&quot;http://maven.apache.org/plugins/maven-deploy-plugin/usage.html&quot;&gt;deploy&lt;/a&gt; artifacts in a Maven repository, so your projects can be added as a dependency to other Maven projects. Hippo Forge has no central Maven repository, but you can use your project's SVN repository to publish the artifacts. To do this, you can use &lt;a href=&quot;https://wagon-svn.dev.java.net/&quot;&gt;wagon-svn&lt;/a&gt;, a Maven Wagon provider for Subversion.&lt;br /&gt;&lt;br /&gt;The first thing you need to do is create a space in your SVN repository to deploy the artifacts in. If your project's SVN repository is at &lt;code&gt;http://forge.hippo-ecm.org/svn/myproject/&lt;/code&gt;, create a folder &lt;code&gt;maven2&lt;/code&gt; in the root of the repository, i.e. &lt;code&gt;http://forge.hippo-ecm.org/svn/myproject/maven2/&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;In your project's POM, add the wagon-svn extension to the &lt;code&gt;build&lt;/code&gt; section:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;  &amp;lt;build&amp;gt;&lt;br /&gt;    ...&lt;br /&gt;    &amp;lt;extensions&amp;gt;&lt;br /&gt;      &amp;lt;extension&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.jvnet.wagon-svn&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&gt;wagon-svn&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&gt;1.8&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;/extension&amp;gt;&lt;br /&gt;    &amp;lt;/extensions&amp;gt;&lt;br /&gt;  &amp;lt;/build&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then add a distributionManagement section to your project's POM, and specify the SVN location you created as the Maven repository to deploy artifacts to. For the &lt;code&gt;id&lt;/code&gt; you can use any string you like.&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;  &amp;lt;distributionManagement&amp;gt;&lt;br /&gt;    &amp;lt;repository&amp;gt;&lt;br /&gt;      &amp;lt;uniqueVersion&amp;gt;false&amp;lt;/uniqueVersion&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;myproject-maven-repo&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;url&amp;gt;svn:http://forge.hippo-ecm.org/svn/myproject/maven2/&amp;lt;/url&amp;gt;&lt;br /&gt;    &amp;lt;/repository&amp;gt;&lt;br /&gt;  &amp;lt;/distributionManagement&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finally, add credentials for the Maven/SVN repository to your Maven &lt;code&gt;settings.xml&lt;/code&gt;, located in the &lt;code&gt;.m2&lt;/code&gt; directory in your home directory (e.g. &lt;code&gt;/home/username/.m2/settings.xml&lt;/code&gt; on Unix). Right under the &lt;code&gt;settings&lt;/code&gt; element, add a &lt;code&gt;servers&lt;/code&gt; element:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;  &amp;lt;servers&amp;gt;&lt;br /&gt;    &amp;lt;server&amp;gt;&lt;br /&gt;      &amp;lt;id&gt;docselector-maven-repo&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;username&gt;myname&amp;lt;/username&amp;gt;&lt;br /&gt;      &amp;lt;password&gt;secret&amp;lt;/password&amp;gt;&lt;br /&gt;    &amp;lt;/server&amp;gt;&lt;br /&gt;  &amp;lt;/servers&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You should now be able to deploy artifacts to the SVN repository using the following command:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;shell&quot;&gt;&lt;br /&gt;mvn deploy&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Don't forget to add the location of the Maven repository to your project documentation! People need to add that repository location to their project POM or settings.xml in order to download dependencies from it.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/49500217511749617-6938902042979972255?l=dev.nielsvk.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 31 Mar 2009 16:06:00 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Niels)</dc:creator>
</item>
<item>
	<title>Jeroen Reijn (Hippo): Apache Camel: open source integration framework</title>
	<guid>tag:blogger.com,1999:blog-2962867622850517744.post-100576576454717007</guid>
	<link>http://blog.jeroenreijn.com/2009/03/apache-camel-open-source-integration.html</link>
	<description>I'm currently working on a project where we are looking at creating an integration layer for external applications to connect to our back-end applications. In our case, one of the back-end applications is &lt;a href=&quot;http://docs.onehippo.org/&quot;&gt;Hippo CMS 7's&lt;/a&gt; repository.&lt;br /&gt;&lt;br /&gt;I've been reading up on &lt;a href=&quot;http://en.wikipedia.org/wiki/Enterprise_service_bus&quot;&gt;ESB&lt;/a&gt;'s like &lt;a href=&quot;http://servicemix.apache.org/&quot;&gt;Apache ServiceMix&lt;/a&gt; and &lt;a href=&quot;http://synapse.apache.org/&quot;&gt;Synapse&lt;/a&gt;, but even though both projects look very interesting, they actually are a bit too much for what I want to do. There was one project though that seems to be exactly what I want: &lt;a href=&quot;http://camel.apache.org/&quot;&gt;Apache Camel&lt;/a&gt;.&lt;br /&gt;&lt;h3&gt;About Apache Camel&lt;/h3&gt;Apache Camel is an open source Java framework that focuses on making integration easier. One of the great things is that Camel comes with a lot of default components and connectors.&lt;br /&gt;Even though I was quite new to the integration concept, I was able to get my first Camel project up and running within 30 minutes or so, which I think is quite fast. You only need is a bit of Java/Spring knowledge to get going.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The basic concepts&lt;/h3&gt;While using an integration framework like Camel, you will have to keep four key terms in mind:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Endpoint&lt;/span&gt;: where the message comes in or leaves the integration layer&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Route&lt;/span&gt;: how a message goes from endpoint A to endpoint B&lt;/li&gt;&lt;li&gt;&lt;span&gt;Filter&lt;/span&gt;: the chained components that are involved in the process of handling a message that comes from endpoint A and goes to endpoint B. It could be that the content of the message  needs to be transformed from SOAP to for instance ATOM.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Pipe&lt;/span&gt;: the way the message travels from endpoint A through filters to endpoint B&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;One of the things I'm looking at Camel for is using it to convert RSS feed entries into JCR nodes. If I would create an endpoint diagram, which would describe my route, it would look something like the image below.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_hd6Y7yyFK7E/SdHfznTRvsI/AAAAAAAAANM/tdaCZzPnCZ8/s1600-h/camel_endpoints.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_hd6Y7yyFK7E/SdHfznTRvsI/AAAAAAAAANM/tdaCZzPnCZ8/s400/camel_endpoints.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5319278712717426370&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;With Camel, the endpoints and routes can be configured in a few lines of Java code or with Spring XML configuration. I started out with the Spring XML configuration and it was actually quite easy to get going. Here is an example where I poll my own RSS feed and store the items into a mock 'feeds' object.&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;&lt;br /&gt;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;xmlns:context=&quot;http://www.springframework.org/schema/context&quot;&lt;br /&gt;xsi:schemaLocation=&quot;&lt;br /&gt;http://www.springframework.org/schema/beans&lt;br /&gt;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;http://www.springframework.org/schema/context&lt;br /&gt;http://www.springframework.org/schema/context/spring-context-2.5.xsd&lt;br /&gt;http://camel.apache.org/schema/spring&lt;br /&gt;http://camel.apache.org/schema/spring/camel-spring.xsd&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;camelContext xmlns=&quot;http://camel.apache.org/schema/spring&quot;&amp;gt;&lt;br /&gt;    &amp;lt;route&amp;gt;&lt;br /&gt;      &amp;lt;from uri=&quot;rss://http://blog.jeroenreijn.com/feeds/posts/default?alt=rss&quot; /&amp;gt;&lt;br /&gt;      &amp;lt;to uri=&quot;mock:feeds&quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/route&amp;gt;&lt;br /&gt;  &amp;lt;/camelContext&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see that's just a couple of lines of code. It's really that simple to do things in Camel. Of course this configuration does not end up in a JCR repository, but as an example I think it's quite easy to grasp. For those of you, that want to play around with Camel as well, I'll try to explain all the step I took to get a working web application example from here on. As I'm using &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven2&lt;/a&gt; for building my projects, you should be able to reproduce my setup quite easily.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Setting up your maven project&lt;/h3&gt;First off we'll start with adding the camel dependencies to our maven project descriptor( pom.xml).&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.apache.camel&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;camel-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;${camel-version}&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.apache.camel&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;camel-spring&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;${camel-version}&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;spring-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;${spring-version}&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;spring-web&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;${spring-version}&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.apache.camel&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;camel-rss&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;${camel-version}&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;/pre&gt;As you can see I explicitly added the camel-rss component, so that my camel application knows how to handle rss feeds. Camel does not have it's own RSS parser, but is using &lt;a href=&quot;https://rome.dev.java.net/&quot;&gt;Rome&lt;/a&gt; in the background for handling the RSS feeds. The Camel project is setup in such a way that you can include any component you want, by adding the needed component dependency to your pom.xml. If you're thinking about using Camel, make sure you checkout the &lt;a href=&quot;http://camel.apache.org/components.html&quot;&gt;components page&lt;/a&gt;, which shows you all of the currently available components.&lt;br /&gt;&lt;br /&gt;Camel uses Spring, so we need to add the Spring ContextLoaderListener to the local web.xml in &lt;span&gt;src/main/webapp/WEB-INF/&lt;/span&gt;.&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;web-app xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot;&lt;br /&gt;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee&lt;br /&gt;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot;&lt;br /&gt;version=&quot;2.4&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;listener&amp;gt;&lt;br /&gt;    &amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;  &amp;lt;/listener&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;The last step in our process is defining our endpoints. In my case I chose to use the Spring XML configuration for defining my endpoints.&lt;br /&gt;&lt;br /&gt;Add a file called &lt;span&gt;applicationContext.xml&lt;/span&gt; to your &lt;span&gt;src/main/webapp/WEB-INF/&lt;/span&gt; folder.&lt;br /&gt;Once the file is created you should be able to define your routes like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;&lt;br /&gt;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;xmlns:context=&quot;http://www.springframework.org/schema/context&quot;&lt;br /&gt;xsi:schemaLocation=&quot;&lt;br /&gt;http://www.springframework.org/schema/beans&lt;br /&gt;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;http://www.springframework.org/schema/context&lt;br /&gt;http://www.springframework.org/schema/context/spring-context-2.5.xsd&lt;br /&gt;http://camel.apache.org/schema/spring&lt;br /&gt;http://camel.apache.org/schema/spring/camel-spring.xsd&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;camelContext xmlns=&quot;http://camel.apache.org/schema/spring&quot;&amp;gt;&lt;br /&gt;   &amp;lt;route&amp;gt;&lt;br /&gt;     &amp;lt;from uri=&quot;rss://http://blog.jeroenreijn.com/feeds/posts/default?alt=rss&quot; /&amp;gt;&lt;br /&gt;     &amp;lt;to uri=&quot;mock:feeds&quot;/&amp;gt;&lt;br /&gt;  &amp;lt;/route&amp;gt;&lt;br /&gt;&amp;lt;/camelContext&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;In this example I'm using my own RSS feed, but you can of course use any feed url you like.&lt;br /&gt;For testing purposes you can add a &lt;span&gt;log4j.properties&lt;/span&gt; file in &lt;span&gt;src/main/resources/&lt;/span&gt;, so you can see the output of the Camel RSS component in your console. Here is the configuration I used writing this blogpost.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# The logging properties used for eclipse testing, We want to see debug output on the console.&lt;br /&gt;log4j.rootLogger=INFO, out&lt;br /&gt;&lt;br /&gt;log4j.logger.org.apache.camel=DEBUG&lt;br /&gt;&lt;br /&gt;# uncomment the following line to turn on ActiveMQ debugging&lt;br /&gt;# log4j.logger.org.springframework=INFO&lt;br /&gt;&lt;br /&gt;# CONSOLE appender not used by default&lt;br /&gt;log4j.appender.out=org.apache.log4j.ConsoleAppender&lt;br /&gt;log4j.appender.out.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.out.layout.ConversionPattern=[%30.30t] %-30.30c{1} %-5p %m%n&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well that's it. Now the only thing you will need to do is fire up an application container, like Jetty and see what's going on in the console.&lt;br /&gt;&lt;br /&gt;$ mvn jetty:run&lt;br /&gt;&lt;br /&gt;If Jetty is running and everything is setup correctly you should be able to see some debug information come by that looks like:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  SyndFeedImpl.author=noreply@blogger.com (Jeroen Reijn)&lt;br /&gt;  SyndFeedImpl.authors=[]&lt;br /&gt;  SyndFeedImpl.title=Jeroen Reijn&lt;br /&gt;  SyndFeedImpl.description=&lt;br /&gt;  SyndFeedImpl.feedType=rss_2.0&lt;br /&gt;  SyndFeedImpl.encoding=null&lt;br /&gt;  SyndFeedImpl.entries[0].contributors=[]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;As you will see the RSS feed is parsed and converted into a SyndFeed object.&lt;br /&gt;From there on you can make use of this object and perform any operation on it.&lt;br /&gt;&lt;br /&gt;I must admit that while playing around with Camel and RSS feeds, &lt;br /&gt;I noticed that the RSS (and Atom) component did not handle extra request parameters correctly, so I added a patch in the Camel JIRA, hoping it wil be included in the next release of Camel.&lt;br /&gt;If you have issues with the RSS component and request parameters, you might want to try to build the Camel SVN trunk and apply my patch (&lt;a href=&quot;https://issues.apache.org/activemq/browse/CAMEL-1496&quot;&gt;CAMEL-1496&lt;/a&gt;).&lt;br /&gt;This is only necessary if you want to parse a feed that has for instance a unique id as request parameter added to the feed URL.&lt;br /&gt;&lt;br /&gt;We'll that's it! This post will get a follow-up, where I will show you have to use Camel to actually store the RSS feed entries into a JCR repository.&lt;br /&gt;&lt;br /&gt;Here are a couple of good articles too read before starting with Camel:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://camel.apache.org/&quot;&gt;Apache Camel (official website)&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://architects.dzone.com/articles/apache-camel-integration&quot;&gt;Apache Camel: Integration Nirvana&lt;/a&gt; (@&lt;a href=&quot;http://www.dzone.com/&quot;&gt;dzone&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://refcardz.dzone.com/refcardz/enterprise-integration&quot;&gt;Camel Reference card (@dzone)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;This blogpost was inspired by an article over at &lt;a href=&quot;http://www.gridshore.nl/&quot;&gt;Gridshore&lt;/a&gt;, where Jettro  wrote a post on using &lt;a href=&quot;http://www.gridshore.nl/2009/03/29/using-spring-integration-for-rss-reading/&quot;&gt;Spring Integrations&lt;/a&gt; as integration framework. Since I'm pretty much Apache minded, I have been looking around for other open source integration frameworks within the ASF, which brought me to Apache Camel.&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2962867622850517744-100576576454717007?l=blog.jeroenreijn.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 31 Mar 2009 13:01:22 +0000</pubDate>
	<dc:creator>noreply@blogger.com (Jeroen Reijn)</dc:creator>
</item>

</channel>
</rss>
