<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Jive SBS Syndication Feed</title>
    <link>http://www.jivesoftware.com/jivespace/blogs</link>
    <description>A syndication feed of all the blogs on this system</description>
    <pubDate>Tue, 18 Mar 2008 21:21:46 GMT</pubDate>
    <generator>Jive SBS 4.0.5 (http://jivesoftware.com/products/clearspace/)</generator>
    <dc:date>2008-03-18T21:21:46Z</dc:date>
    <item>
      <title>Clearspace 2.0 Public Beta 4</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2008/03/18/clearspace-20-public-beta-4</link>
      <description>&lt;!-- [DocumentBodyStart:48250930-9a36-44b7-b64c-6b5d09696eb1] --&gt;&lt;div class="jive-rendered-content"&gt;&lt;p&gt;The fourth update to the public beta has just been released. Thanks to all your activity in the community the past few weeks, we have resolved over 200 issues since the first public beta. We encourage all of you using a previous version of the beta to download the latest and let us know what you think.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Same as before, the best place to contribute is in the &lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/community/community/developer/clearspace/beta"&gt;Clearspace Beta space&lt;/a&gt;. You can download the new beta releases from your Jive Software &lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/dev/downloads/index.jsp"&gt;website account&lt;/a&gt; where you find other releases.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Documentation for the new beta release is available &lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/builds/docs/clearspacex/beta/index.html"&gt;here&lt;/a&gt; and includes upgrade information.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Thanks again for all your questions, comments, and feedback over the past few weeks!&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:48250930-9a36-44b7-b64c-6b5d09696eb1] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">clearspace</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">beta</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">release</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">xlearspacex</category>
      <pubDate>Tue, 18 Mar 2008 21:21:46 GMT</pubDate>
      <author>communities@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2008/03/18/clearspace-20-public-beta-4</guid>
      <dc:date>2008-03-18T21:21:46Z</dc:date>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/clearspace-20-public-beta-4</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1492</wfw:commentRss>
    </item>
    <item>
      <title>Freemarker w/ WebWork Tutorial</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2008/01/31/freemarker-w-webwork-tutorial</link>
      <description>&lt;!-- [DocumentBodyStart:2f49d685-1e8c-480f-aa45-3a9de4b0711b] --&gt;&lt;div class="jive-rendered-content"&gt;&lt;h3&gt;&lt;span&gt;Configuring your action to use the freemarker result type&lt;/span&gt;&lt;/h3&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;ul&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Freemarker views are rendered via the webwork result type freemarker, or by using the dispatcher result type in conjunction Webwork's FreemarkerServlet.&lt;/p&gt;&lt;/li&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;We use the freemarker result type which is defined in xwork-community.xml, so you can simply use it like so:&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;!--[CodeBlockStart:0003878a-2130-48bd-90b9-5ed69002cbf1]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-xml"&gt;
&lt;span class="jive-xml-tag"&gt;&amp;lt;action name="test" class="package.Test"&amp;gt;&lt;/span&gt;
&amp;#160;&amp;#160;&amp;#160; &lt;span class="jive-xml-tag"&gt;&amp;lt;result name="success" type="freemarker"&amp;gt;&lt;/span&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /templates/testView.ftl
&amp;#160;&amp;#160;&amp;#160; &lt;span class="jive-xml-tag"&gt;&amp;lt;/result&amp;gt;&lt;/span&gt; 
&lt;span class="jive-xml-tag"&gt;&amp;lt;/action&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:0003878a-2130-48bd-90b9-5ed69002cbf1]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;ul&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Since freemarker is defined as the default result type, type="freemarker" is not necessary when declaring your action.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h3&gt;&lt;span&gt;Property Resolution&lt;/span&gt;&lt;/h3&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;ul&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Your action properties are automatically resolved. FOR EXAMPLE:&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;!--[CodeBlockStart:b6169106-887d-4606-ba22-f3cb956455c2]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;
${name} will result in stack.findValue("name"), which generally results in action.getName() being executed.
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:b6169106-887d-4606-ba22-f3cb956455c2]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;ul&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;A search process is used to resolve the variable, searching the following scopes in order, until a value is found:&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;!--[CodeBlockStart:f9ab0f55-bb5e-4034-b7bc-788dc1bea824]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;
1.) Freemarker Variables 
2.) Webwork Value Stack 
3.) Request Attributes 
4.) Session Attributes 
5.) Servlet Context Attributes
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:f9ab0f55-bb5e-4034-b7bc-788dc1bea824]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt; &amp;#160;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h3&gt;&lt;span&gt;Objects in the Context&lt;/span&gt;&lt;/h3&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;ul&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Webwork objects added to the context&lt;/p&gt;&lt;/li&gt;&lt;ul&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;&lt;strong&gt;request&lt;/strong&gt; - the current HttpServletRequest &lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;&lt;strong&gt;response&lt;/strong&gt; - the current HttpServletResponse &lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;&lt;strong&gt;stack&lt;/strong&gt; - the current OgnlValueStack &lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;&lt;strong&gt;ognl&lt;/strong&gt; - the OgnlTool instance. This class contains useful methods to execute OGNL expressions against arbitary objects&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;&lt;strong&gt;webwork&lt;/strong&gt; ? an instance of FreemarkerWebWorkUtil&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;&lt;strong&gt;action&lt;/strong&gt; - the current WebWork action &lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;&lt;strong&gt;exception&lt;/strong&gt; - optional the Exception instance, if the view is a JSP exception or Servlet exception&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;ul&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Jive objects added to the context&lt;/p&gt;&lt;/li&gt;&lt;ul&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;JiveGlobals&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;JiveConstants&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;LocaleUtils&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;StringUtils&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;DateUtils&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;SkinUtils&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;Permissions&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;IMSettingsUtils&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;ActionUtils&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;RSSActionSupport&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;ViewCountManager&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;CommunityUtils&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;BlogUtils&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;FeedUtils&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;WikiUtils&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;LicenseManager&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;DocumentPermHelper&lt;/p&gt;&lt;/li&gt;&lt;li level="2" type="ul"&gt;&lt;p&gt;MessagePermHelper&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;!--[CodeBlockStart:1e4d6526-4e61-4c08-96d3-af295017d29a]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;
${JiveGlobals.getJiveProperty(?skin.defaultHeader?)?default(?Community Home?)}
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:1e4d6526-4e61-4c08-96d3-af295017d29a]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;ul&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;In addition, static models and enums can be referenced as so:&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;!--[CodeBlockStart:7b230ab5-c76b-46c5-b0c8-741018cb316b]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;
${statics('com.jivesoftware.community.action.CommunityAction').VIEW_OVERVIEW}
${enums('com.jivesoftware.community.SearchQueryCriteria$SortType').RELEVANCE.key?c}
where ) is replaced with ] and ( is replaced with [
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:7b230ab5-c76b-46c5-b0c8-741018cb316b]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:2f49d685-1e8c-480f-aa45-3a9de4b0711b] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">tutorial</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">clearspace</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">freemarker</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">webwork</category>
      <pubDate>Thu, 31 Jan 2008 16:56:52 GMT</pubDate>
      <author>communities@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2008/01/31/freemarker-w-webwork-tutorial</guid>
      <dc:date>2008-01-31T16:56:52Z</dc:date>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/freemarker-w-webwork-tutorial</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1380</wfw:commentRss>
    </item>
    <item>
      <title>Clearspace 1.10 Now Available</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2007/12/28/clearspace-110-now-available</link>
      <description>&lt;!-- [DocumentBodyStart:aba5fbe6-cbb5-42a5-8d53-a435ebbc9c48] --&gt;&lt;div class="jive-rendered-content"&gt;&lt;p&gt;&lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/products/clearspace/"&gt;Clearspace 1.10&lt;/a&gt; was released yesterday and includes a number of minor bug fixes and improvements. Be sure to &lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/builds/docs/clearspace/latest/changelog.html"&gt;checkout the changelog&lt;/a&gt; if you are interested in what has changed.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;We are going to continue putting out releases for the Clearspace 1.x series, but from this point forward they will only contain bug fixes and minor improvements. All new feature development has been moved to Clearspace 2.0, which will be available at the end of Q1 2008.&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:aba5fbe6-cbb5-42a5-8d53-a435ebbc9c48] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">clearspacex</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">clearspace</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">release</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">1.10</category>
      <pubDate>Fri, 28 Dec 2007 18:30:02 GMT</pubDate>
      <author>communities@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2007/12/28/clearspace-110-now-available</guid>
      <dc:date>2007-12-28T18:30:02Z</dc:date>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/clearspace-110-now-available</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1347</wfw:commentRss>
    </item>
    <item>
      <title>The Switch to Freemarker</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2007/07/20/the-switch-to-freemarker</link>
      <description>&lt;!-- [DocumentBodyStart:77afa0fd-d7bd-4d7f-bb32-336d756b6298] --&gt;&lt;div class="jive-rendered-content"&gt;&lt;p&gt;Where are all the JSP's? That is a question we have been hearing a lot lately, after deciding that the view layer of Clearspace would be built on an open alternative to JSP, Freemarker. What is Freemarker? &lt;a class="jive-link-external-small" href="http://freemarker.org"&gt;Freemarker&lt;/a&gt; is simply a "template engine"; a generic tool to generate text output based on tempaltes. The next question that usually follows: &lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h4&gt;&lt;span&gt;Common problems with JSP&lt;/span&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Java code is too tempting, even though it is considered bad design to mix presentation with core logic, everyone knowingly does it.&lt;/p&gt;&lt;/li&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Java code is required to do mundane things, such as &amp;amp;lt;a href="&amp;amp;lt;%= request.getContextPath() %&amp;gt;/index.html"&amp;amp;gt;Home page&amp;amp;lt;/a&amp;amp;gt;&lt;/p&gt;&lt;/li&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Simple tasks are difficult, such as escaping html, or formatting a date&lt;/p&gt;&lt;/li&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Looping is verbose, awkward and messy&lt;/p&gt;&lt;/li&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Bad exception handling, printing out things like NullPointerExceptions to the user&lt;/p&gt;&lt;/li&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Need a compiler and any change needs to be recompiled.&lt;/p&gt;&lt;/li&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;Various application server bugs. We have recently run into a few problems on 'unnamed' application servers where&amp;#160; the jsp's are created importing the servlet package without fully qualifying names, This causes us to have class name problems.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h4&gt;&lt;span&gt;Freemarker as an alternative&lt;/span&gt;&lt;/h4&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;To fully realize the benefits of the &lt;a class="jive-link-external-small" href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;MVC Pattern&lt;/a&gt;, a true separation of Java Code (the controller) and the HTML (the view) is required. Using a template engine, such as Freemarker, as your view will solve many of the problems listed above. The underlying design will be cleaner, the syntax clearer, the error messages more meaningful, and the application more customizable.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Also, Unlike JSP, FreeMarker templates are completely independent of the file format; they can just as easily be used to create an HTML file, XML file, CSS file, JavaScript file, even a plain text file. In fact, FreeMarker is independent of servlets altogether, making it just as useful on the client as on the server.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;As an example of how Freemarker can cleanup your view pages, lets take one line of JSP and convert it to freemarker:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;JSP&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;Freemarker&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&amp;amp;lt;% Action action = ActionUtils.getAction(); %&amp;amp;gt; &lt;/p&gt;&lt;p&gt;&amp;amp;lt;input type="text" name="subject" &lt;/p&gt;&lt;p&gt;value="&amp;amp;lt;%= action.getSubject() != null ? StringUtils.escapeHTMLTags(action.getSubject()) : "" %&amp;amp;gt; "/&amp;amp;gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&amp;amp;lt;input type="text" name="subject" &lt;/p&gt;&lt;p&gt;value="${subject!?html}"/&amp;amp;gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h4&gt;&lt;span&gt;Interesting Clearspace features relating to Freemarker&lt;/span&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;&lt;strong&gt;Themes:&lt;/strong&gt; To help facilitate our customer's need to customize the look and feel of our products, we wrote a feature that provides our customer's the ability to customize most front end pages directly from the admin console without having to make a single change to the source code or even restart the application server. Simply select the page you want to customize and edit the template. Additionally, these custom pages can be grouped into different "Themes" and mapped to a commuity, a forum, even a URL pattern. This type of flexible UI would not be possible with JSP's. Freemarker provides us the ability to load the source of a template from a number of places, including a remote server, and without ever needing to be recompiled.&lt;/p&gt;&lt;/li&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;&lt;strong&gt;Community Everywhere:&lt;/strong&gt; If you want to make some dynamic HTML content available on any remote site, such as displaying a Clearspace thread at the bottom of a remote article, all you have to do is process the freemarker template that contains the thread HTML, wrap it in document.write(result); and return contentType text/javascript.&lt;/p&gt;&lt;/li&gt;&lt;li level="1" type="ul"&gt;&lt;p&gt;&lt;strong&gt;Freemarker Email Templates:&lt;/strong&gt; Allows for easily customizable dynamic emails with very detailed and useful information.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;After using Freemarker for some time, we can definitely say that it is a template language we?re confident in. We found it to be the easiest to use, learn and the most powerful while still having a clean, simple syntax. For a comparision with velocity, check out &lt;a class="jive-link-external-small" href="http://freemarker.org/fmVsVel.html"&gt;Freemarker vs. Velocity&lt;/a&gt;. We?ve also found that any good JSP programmer finds Freemarker enjoyable to use and learn. The one downside is that we all use Intellij Idea for development and there is currently no Freemarker support.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;For those who still are not convinced, rest assured that it is still possible to make customizations to the application using only JSP's.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;To learn more, check out &lt;a class="jive-link-external-small" href="http://www.javaworld.com/jw-01-2001/jw-0119-freemarker.html?page=1"&gt;FreeMarker: An open alternative to JSP&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:77afa0fd-d7bd-4d7f-bb32-336d756b6298] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">clearspacex</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">clearspace</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">themes</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">freemarker</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">ui</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">jsp</category>
      <pubDate>Fri, 20 Jul 2007 16:20:09 GMT</pubDate>
      <author>communities@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2007/07/20/the-switch-to-freemarker</guid>
      <dc:date>2007-07-20T16:20:09Z</dc:date>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/the-switch-to-freemarker</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1014</wfw:commentRss>
    </item>
    <item>
      <title>The Benefits of an Upgrade Framework</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2007/07/20/the-benefits-of-an-upgrade-framework</link>
      <description>&lt;!-- [DocumentBodyStart:b06156dc-c974-461a-a805-1ded7f9ddd2d] --&gt;&lt;div class="jive-rendered-content"&gt;&lt;p&gt;We have always been committed to making the user experience as painless as possible. Our goal has always been to create products that are incredibly easy to setup and administer; however, we went without developing an upgrade framework for some time.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Why did we wait until now? Well, because upgrades are generally viewed as a "one time" thing and we always had more demanding feature requests.&amp;#160; When we embarked on building Clearspace however, we knew from the start that building an upgrade framework would be a valuable investment, and help us reach the goal of making upgrades painless for both our existing and our rapidly growing customer base.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;We knew that we needed a tool that did more than execute simple SQL scripts. We knew that it needed to be as robust as our setup tool. That means that it needed to be secure by requiring a system administrator to authenticate, concise by prompting the user that an upgrade needs to take place, and informative by alerting the user if a task has failed for any reason and providing them with the ability to manually perform that task.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1013-1007/sshot-2.png"&gt;&lt;img height="279" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1013-1007/450-279/sshot-2.png" width="450"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1013-1008/sshot-4.png"&gt;&lt;img height="124" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1013-1008/450-124/sshot-4.png" width="450"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1013-1010/sshot-6.png"&gt;&lt;img height="194" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1013-1010/450-194/sshot-6.png" width="450"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1013-1011/sshot-7.png"&gt;&lt;img height="161" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1013-1011/450-161/sshot-7.png" width="450"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1013-1009/sshot-5.png"&gt;&lt;img height="173" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1013-1009/450-173/sshot-5.png" width="450"/&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;You know that feeling when you get something free? Whether it is a free Ipod with your new Macbook Pro, or simply a free sample at Costco, it's a good feeling. Having developed this upgrade framework with the mindset of making our customer's lives easier, we quickly found many other benefits of having developed an upgrade framework:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h5&gt;&lt;span&gt;Improves the user experience by allowing painless automated upgrades.&lt;/span&gt;&lt;/h5&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Customers no longer have to pour through documentation and gain access to their database administrators to execute scripts. The system will automatically determine which version is installed and perform all necessary upgrade tasks. Customers will be more willing to upgrade to new releases, which will result in reduced support costs and increased revenues.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h5&gt;&lt;span&gt;Enhances the development process&lt;/span&gt;&lt;/h5&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;How many times have you updated from version control and no longer been able to start up the application because of some changes made by another developer? How many times have you been working on a project when you receive an email from one of your team members saying that table xyz has been changed and all the developers need to execute some script? This unnecessary frustration and cost of development is solved with the upgrade framework and helps to decrease the cost of development.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h5&gt;&lt;span&gt;Manages exact changes between versions&lt;/span&gt;&lt;/h5&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;As a developer, I generally can not remember all the changes I made last week, let alone last month.&amp;#160; Unless you are highly disciplined and you keep notes of every major change you have made, you will likely miss something when it comes time to worry about upgrades. By writing an upgrade task when you make a change, you are effectively documenting your changes and will be ready to go when it is time to release.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h5&gt;&lt;span&gt;Allows for demo servers to be up running during development&lt;/span&gt;&lt;/h5&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Having a demo server up for the company to use during development is beneficial in many ways. It allows your company to 'eat its own dog food' and test the functionality and usability of an application months before the beta process. However, managing the state of a demo server during development can be a daunting task. Not if you have an automated upgrade framework. Day to day changes will be picked up and your demo server will always be the latest and greatest.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h5&gt;&lt;span&gt;Lowers the support burden for new releases and upgrade&lt;/span&gt;&lt;/h5&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;When upgrades go smoothly, the cost of upgrading is lowered for both the customer and the company.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h5&gt;&lt;span&gt;Improves the productivity of the Professional Services Department&lt;/span&gt;&lt;/h5&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Having previously worked in our professional services department, I know first hand how managing various projects can be difficult. Having an upgrade framework facilitates the process of making customizations to the core product. Not to mention two years down the road when the customer wants to upgrade the core product and keep their customizations.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;h5&gt;&lt;span&gt;Enables plugins to provide their own upgrade path.&lt;/span&gt;&lt;/h5&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Similar to customizations made by the professional services department, having the ability to provide automated plugin specific upgrade paths is insanely powerful.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;For any of you looking to justify investing in an upgrade framework, it has been our experience that an upgrade framework will benefit everyone involved, and will pay for itself in a matter of weeks. In fact, I would go so far as to say that developing an automated upgrade framework is as essential a practice for enterprise applications as unit testing.&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:b06156dc-c974-461a-a805-1ded7f9ddd2d] --&gt;</description>
      <pubDate>Thu, 19 Jul 2007 23:50:30 GMT</pubDate>
      <author>communities@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2007/07/20/the-benefits-of-an-upgrade-framework</guid>
      <dc:date>2007-07-19T23:50:30Z</dc:date>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/the-benefits-of-an-upgrade-framework</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1013</wfw:commentRss>
    </item>
    <item>
      <title>Organizing Clearspace Content: Sub-spaces vs. Tag Groups</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2007/07/19/organizing-clearspace-content-subspaces-vs-tag-groups</link>
      <description>&lt;!-- [DocumentBodyStart:53d60474-63cb-4113-bd8a-85f10f4746db] --&gt;&lt;div class="jive-rendered-content"&gt;&lt;p&gt;Unfortunately wiki documents and discussions can only be created in a single specific space. The primary reason is that each space has its own set of permissions, allowed content types, etc. With that goal in mind, the logic around creating and viewing content living in multiple spaces could be counterintuitive.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;But this problem is the ideal use case for tags. Think of a space as a folder on your operating system. It can have sub-spaces (nested folders) and some files (wiki docs and discussions). Each file must live in one and only one parent folder. We are all very comfortable with this paradigm, but the drawbacks become self-evident in time.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Let's take a simple example. I want to organize all of my recipes, so I create a folder (space) called recipes. Now what? Do I create more sub folders based of the type of food, such as Italian, Chinese, Indian, Mexican, etc. Or do I create sub folders for breakfast, lunch, dinner, and dessert? How do I classify an Italian dessert then?&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;The solution to this problem, at least in Clearspace, is to use tags and tag groups. So wiki documents and discussions must live in one and only one space; however, they can be tagged with any keywords you might use to look for them. You can then browse the content by tags, regardless of which space the content was created in. Tags will transcend this typical folder-tree structure that we are all used to, and provide a means to find relevant content regardless of where it is created.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Also, we went a step further and created tag groups. A tag group is nothing more than a named collection of tags. The primary benefit of a tag group is that it groups your content virtually. A wiki document or discussion is not created in a tag group,&lt;/p&gt;&lt;p&gt;but will be associated with one or more tag groups if it is associated with tags in the tag groups. If a discussions morphs into something entirely different in time, you can change its tags to change the tag groups it can be found in.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;So when would you use a sub-space as opposed to a tag group? A good rule of thumb is to think about people as opposed to content. If you simply need need a way to organize content, use a tag group. If instead you need to capture permissions for specific users, limit available content types, and so on, then you should create a sub-space.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Here is an example of both:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Space: Product Development&lt;/p&gt;&lt;p&gt;Sub-spaces: Clearspace, Forums, Openfire, Spark&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;The preceding sub-spaces are some of our different products, and they would be sub-spaces because there are different teams with different permissions for each.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Space: Clearspace&lt;/p&gt;&lt;p&gt;Tag groups: Release Plan, Weekly Status, Documentation, Features&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;The preceding are tag groups because they are simple containers of content; they do not need all the extra complexity a sub-space provides. As mentioned above, it is entirely possible to create a document or discussion that can be found in both Documentation and Features simply by tagging your content with the appropriate tags, say "documentation" and "features."&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:53d60474-63cb-4113-bd8a-85f10f4746db] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">clearspacex</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">clearspace</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">organization</category>
      <pubDate>Thu, 19 Jul 2007 23:44:28 GMT</pubDate>
      <author>communities@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2007/07/19/organizing-clearspace-content-subspaces-vs-tag-groups</guid>
      <dc:date>2007-07-19T23:44:28Z</dc:date>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/organizing-clearspace-content-subspaces-vs-tag-groups</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1012</wfw:commentRss>
    </item>
    <item>
      <title>Clearspace 1.0.4 Released</title>
      <link>http://www.jivesoftware.com/jivespace/community/jivetalks/blog/2007/03/29/clearspace-104-released</link>
      <description>&lt;!-- [DocumentBodyStart:de532c76-a08b-4cf3-822e-48162b6817b6] --&gt;&lt;div class="jive-rendered-content"&gt;&lt;p&gt;We just released Clearspace 1.0.4 (&lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/downloads/"&gt;download&lt;/a&gt;, &lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/builds/docs/clearspace/1.0.4/README.html"&gt;README&lt;/a&gt;, &lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/builds/docs/clearspace/1.0.4/changelog.html"&gt;changelog&lt;/a&gt;). Like version 1.0.3, this is primarily a bug fix release. We fixed 23 bugs and made 6 improvements. Two of the most requested minor improvements were added to the 1.0.4 release, those being the ability to set a global theme, and the ability to completely disable guest access in Clearspace. We are now focused on delivering the external version of Clearspace in the coming month, so keep your eyes peeled.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;#160;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:de532c76-a08b-4cf3-822e-48162b6817b6] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">clearspace</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/tags">announcements</category>
      <pubDate>Thu, 29 Mar 2007 18:55:46 GMT</pubDate>
      <author>communities@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/community/jivetalks/blog/2007/03/29/clearspace-104-released</guid>
      <dc:date>2007-03-29T18:55:46Z</dc:date>
      <wfw:comment>http://www.jivesoftware.com/jivespace/community/jivetalks/blog/comment/clearspace-104-released</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/community/jivetalks/blog/feeds/comments?blogPost=1161</wfw:commentRss>
    </item>
  </channel>
</rss>

