<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:clearspace="http://www.jivesoftware.com/xmlns/clearspace/rss" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Blog Posts From Jivespace Community Blog Tagged With customize</title>
    <link>http://www.jivesoftware.com/jivespace/blogs/jivespace</link>
    <description>Jivespace Developer Community Blog</description>
    <pubDate>Mon, 16 Feb 2009 23:43:13 GMT</pubDate>
    <generator>Jive SBS 3.0.8 (http://jivesoftware.com/products/clearspace/)</generator>
    <dc:date>2009-02-16T23:43:13Z</dc:date>
    <item>
      <title>The science behind public cases</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2009/02/16/the-science-behind-public-cases</link>
      <description>&lt;!-- [DocumentBodyStart:665eda3b-0db7-412b-a9f6-4236891e687c] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;One very important feature of the Supportal that can sometimes be overlooked is the ability to make a case public.&amp;#160; A public case is just a case that shows as a discussion thread in a community that can be viewed by anyone.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The Supportal makes it easy to change a case from just being a normal case in your secure account space into a public case that can benefit the whole Clearspace user base.&amp;#160; Let's take a look at how this is done:&lt;/p&gt;&lt;h2&gt;A private case&lt;br/&gt;&lt;/h2&gt;&lt;p&gt;Let's suppose that you've already created a case in your secure account space.&amp;#160; As a customer, when you view the case, the case fields will look like this:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1665-10423/blogpost_privatecase.png"&gt;&lt;img alt="blogpost_privatecase.png" class="jive-image-thumbnail jive-image" height="331" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1665-10423/620-331/blogpost_privatecase.png" width="620"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Notice the "public" check box is &lt;strong&gt;not&lt;/strong&gt; checked.&amp;#160; Also, notice that the breadcrumbs at the top show that the case thread is in the secure account space as expected.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;A public case&lt;/h2&gt;&lt;p&gt;Being a good citizen of the broader Clearspace user community, you see that this question or issue that you had in this case is something that others may encounter as well.&amp;#160; Making this case public would help others out because if they are searching for an answer to the same question, this case thread will then show in their search results and they can find that answer quickly.&amp;#160; Who knows, maybe they will then return the favor by making a case they have public as well which could benefit you later on down the road &lt;img height="16px" src="http://www.jivesoftware.com/community/images/emoticons/wink.gif" width="16px"/&gt;.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ok, so you look at the content of the case thread and ensure that there is nothing there that is sensitive information, and you decide to make the case public.&amp;#160; How is this done?&amp;#160; With just two easy steps:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Click the "public" check box to indicate you want the case publicly viewable.&lt;br/&gt;&lt;/li&gt;&lt;li&gt;After clicking the check box, you'll see a combo box showing the possible communities that you can put the public case in.&amp;#160; Choose whatever community makes most sense for the content of the case thread.&lt;/li&gt;&lt;/ol&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Now, click the "Update Case" button.&amp;#160; Looks like nothing changed right?&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1665-10424/blogpost_publiccase.png"&gt;&lt;img alt="blogpost_publiccase.png" class="jive-image-thumbnail jive-image" height="374" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1665-10424/620-374/blogpost_publiccase.png" width="620"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Take a look at the breadcrumbs.&amp;#160; Notice that this discussion thread is now listed as being in the public community that you selected above.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1665-10425/blogpost_publicbreadcrumb.png"&gt;&lt;img alt="blogpost_publicbreadcrumb.png" class="jive-image" height="29" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1665-10425/266-29/blogpost_publicbreadcrumb.png" width="266"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Also, notice that the case now has a box that says "This is a public case which is tied to your support account.&amp;#160; Your community is located here:"&amp;#160; The "Account Community" link takes you back to the homepage for your secure account space.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;But wait.&amp;#160; You still want this to show as a case in your list of cases in your secure account space so you can easily reference it for yourself later right?&amp;#160; No problem.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1665-10426/blogpost_community.png"&gt;&lt;img alt="blogpost_community.png" class="jive-image-thumbnail jive-image" height="188" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1665-10426/620-188/blogpost_community.png" width="620"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1665-10427/blogpost_casestab.png"&gt;&lt;img alt="blogpost_casestab.png" class="jive-image-thumbnail jive-image" height="215" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1665-10427/620-215/blogpost_casestab.png" width="620"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The case appears as expected in the list of cases in your secure account space, but it actually resides in a public community now.&amp;#160; You can manage the case as you would any other private case, but the content of that case is now benefiting the whole community!&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;The code&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Making the case a publicly viewable case was easy enough right?&amp;#160; Surely, the code behind the scenes must be complicated!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Not at all!&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;When the "Public" check box is checked, some Javascript on the page fires to show the communities that the case thread can be moved to:&lt;/p&gt;&lt;!--[CodeBlockStart:d89e8226-6236-49de-a6d1-15792c5557f9]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;function changeVisibility()
{
&amp;#160;&amp;#160;&amp;#160; if (document.getElementById('publicCase').checked==true) {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; document.getElementById('publicCommunityTag1').style.display="table-row";
&amp;#160;&amp;#160;&amp;#160; }
&amp;#160;&amp;#160;&amp;#160; else {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; document.getElementById('publicCommunityTag1').style.display="none";
&amp;#160;&amp;#160;&amp;#160; }
}
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:d89e8226-6236-49de-a6d1-15792c5557f9]--&gt;&lt;p&gt;The list of community options that are show in the community drop down is populated in the action class with this code:&lt;/p&gt;&lt;!--[CodeBlockStart:00a7cd7a-1e7a-466c-b487-cae1a2073726]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; List&amp;lt;Community&amp;gt; getPublicCommunityOptions() &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160; List&amp;lt;Community&amp;gt; availCommunities = &lt;font color="navy"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; ArrayList&amp;lt;Community&amp;gt;();
&amp;#160;&amp;#160;&amp;#160; Community root = communityManager.getRootCommunity();
&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (Community c : communityManager.getRecursiveCommunities(root)) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!accountManager.isAccountContainer(c)) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; availCommunities.add(c);
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; availCommunities;
&lt;font color="navy"&gt;}&lt;/font&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:00a7cd7a-1e7a-466c-b487-cae1a2073726]--&gt;&lt;p&gt;The call to &lt;strong&gt;accountManager.isAccountContainer(c)&lt;/strong&gt; calls a custom class in the Supportal that basically just checks to see if the community has an extended property set that marks it as a secure account space or not.&amp;#160; If the community is not an account space, it is eligible for putting public cases into.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Here is the code from the method responsible for doing the move:&lt;/p&gt;&lt;!--[CodeBlockStart:b196b484-2425-4cb6-90c9-8e65c4a9b197]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; moveCaseThread(ForumThread caseThread, &lt;font color="navy"&gt;&lt;b&gt;long&lt;/b&gt;&lt;/font&gt; targetContainerID) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Community publicCommunity = communityManager.getCommunity(targetContainerID);
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; forumManager.moveThread(caseThread, publicCommunity);
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:b196b484-2425-4cb6-90c9-8e65c4a9b197]--&gt;&lt;p&gt;The first line gets the Community object for the community that the discussion thread is going to be moved to (the one that was selected in our example above).&amp;#160; The second line is what causes the move of the discussion thread to occur.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;What about the code responsible for having the public case still show in the open cases widget?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;We store the account that the case was created in originally as an extended property on the ForumThread object.&amp;#160; So, to get all the threads associated with a private account community, we use this SQL:&lt;/p&gt;&lt;!--[CodeBlockStart:df3912b7-08ad-4048-90da-2ea4c29eeb0d]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-sql"&gt;&lt;span class="jive-sql-keyword"&gt;SELECT&lt;/span&gt; threadID &lt;span class="jive-sql-keyword"&gt;FROM&lt;/span&gt; jiveThreadProp &lt;span class="jive-sql-keyword"&gt;WHERE&lt;/span&gt; name='caseAccountID' &lt;span class="jive-sql-keyword"&gt;AND&lt;/span&gt; propValue=&amp;lt;PRIVATE_ACCOUNT_ID&amp;gt; &lt;span class="jive-sql-keyword"&gt;ORDER&lt;/span&gt; &lt;span class="jive-sql-keyword"&gt;BY&lt;/span&gt; threadID &lt;span class="jive-sql-keyword"&gt;DESC&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:df3912b7-08ad-4048-90da-2ea4c29eeb0d]--&gt;&lt;p&gt;This gives us a list of the thread ids for all threads that are associated with &amp;lt;PRIVATE_ACCOUNT_ID&amp;gt; no matter what community that thread actually lives in.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;That's really pretty much all there is to it.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;So the next time you open a new case with Jive Software Support, ask yourself, "Would the broader Clearspace user community benefit from the question and answer I just had?"&amp;#160; If the answer is "yes," (and really, when is the answer not "yes?" &lt;img height="16px" src="http://www.jivesoftware.com/community/images/emoticons/happy.gif" width="16px"/&gt;), make it public!&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:665eda3b-0db7-412b-a9f6-4236891e687c] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">customize</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">supportal</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">public_case</category>
      <pubDate>Mon, 16 Feb 2009 23:43:13 GMT</pubDate>
      <author>communities@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2009/02/16/the-science-behind-public-cases</guid>
      <dc:date>2009-02-16T23:43:13Z</dc:date>
      <clearspace:dateToText>9 months, 1 week ago</clearspace:dateToText>
      <clearspace:replyCount>1</clearspace:replyCount>
      <clearspace:objectType>0</clearspace:objectType>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/the-science-behind-public-cases</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1665</wfw:commentRss>
    </item>
    <item>
      <title>Creating account spaces, part II: Widgets</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2009/01/23/creating-account-spaces-part-ii-widgets</link>
      <description>&lt;!-- [DocumentBodyStart:2f216fc6-8287-4ac1-bc1e-2c1751d82be7] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;Last episode I explained how we create the secure spaces and setup permissions (see &lt;a class="jive-link-blog-small" href="http://www.jivesoftware.com/jivespace/blogs/jivespace/2009/01/08/how-do-the-account-spaces-get-created-anyway-is-it-private"&gt;How do the account spaces get created anyway? Is it private?&lt;/a&gt;). This post deals with the default widgets that come with a newly created community, and how we had to customize this functionality to meet our requirements.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1648-9086/defaultLayout.png"&gt;&lt;img alt="defaultLayout.png" class="jive-image-thumbnail jive-image" height="453" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1648-9086/620-453/defaultLayout.png" width="620"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;I. How it's done out of the box&lt;/h2&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;To do this, let's first take a look at how it would be done out of the box:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a new community&lt;/li&gt;&lt;li&gt;Then get re-directed to the newly created community&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Here, community.ftl will call CommunityAction's getWidgetLayout via:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:80da263f-032c-4f28-a0d7-65c16d6c760f]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;&amp;lt;#if widgetLayout?exists&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-body-main"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-widget-content"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="thread.watch.notify" class="jive-info-box" style="display:none"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#include "/template/global/include/form-message.ftl" /&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#include "${widgetLayout.freemarkerTemplate}" /&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;lt;/#if&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:80da263f-032c-4f28-a0d7-65c16d6c760f]--&gt;&lt;div&gt; &lt;/div&gt;&lt;p&gt;And within getWidgetLayout() you'll see that if we haven't customized a community and a layout doesn't exist yet, we'll just copy the default:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:33b6e576-c948-41b7-b963-a1fd67108aba]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; WidgetLayout getWidgetLayout() &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!isHasCustomized()) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="darkgreen"&gt;// if no draft widget frames exist, then no default layout exists&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManager.getWidgetFrames(getCommunity()).size() == 0) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; copyDefaultLayout();
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:33b6e576-c948-41b7-b963-a1fd67108aba]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;And to copy the default, we do this:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:52e5f04b-6f3e-4da3-9d7b-2a8d191783c2]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="darkgreen"&gt;/**
* Copy the default layout (large left, small right) to the current community.
*/&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; copyDefaultLayout() &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WidgetManager widgetManagerUnproxied = (widgetManager &lt;font color="navy"&gt;&lt;b&gt;instanceof&lt;/b&gt;&lt;/font&gt; WidgetManagerProxy) ? ((WidgetManagerProxy)widgetManager).getUnproxiedObject() : widgetManager;
&amp;nbsp;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WidgetLayoutDescriptor wld = widgetManagerUnproxied.getWidgetLayoutByName(TwoColumnLargeLeftColumnLayout.class.getName());
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WidgetLayout wl = widgetManagerUnproxied.getWidgetLayout(wld);
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetLayout(getCommunity(), wl);
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:52e5f04b-6f3e-4da3-9d7b-2a8d191783c2]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;And at that point, you'll have the default layout with no widgets, and so further down the line you'll see a call to getWidgetFrames, and similarly to above it will copy the default:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:36385ebf-2850-48fd-9370-91dde8a0fbc8]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; Map&amp;lt;Integer, List&amp;lt;WidgetFrame&amp;gt;&amp;gt; getWidgetFrames() &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!isHasCustomized()) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManager.getWidgetFrames(getCommunity()).size() == 0) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; copyDefaultFrames();
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:36385ebf-2850-48fd-9370-91dde8a0fbc8]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;which will add the default widgets:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:04ed6dfb-a753-4623-bdac-e97fc3d73e9f]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="darkgreen"&gt;/**
&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Copy the default widget frames to the current community:
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160; &amp;lt;ul&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Left: Sub-Spaces&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Left: Projects&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Left: Recent Activity&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Right: Actions&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Right: Top Members&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Right: Tag Cloud&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160; &amp;lt;/ul&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; copyDefaultFrames() &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WidgetManager widgetManagerUnproxied = (widgetManager &lt;font color="navy"&gt;&lt;b&gt;instanceof&lt;/b&gt;&lt;/font&gt; WidgetManagerProxy) ? ((WidgetManagerProxy)widgetManager).getUnproxiedObject() : widgetManager;
&amp;nbsp;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="darkgreen"&gt;// column 1&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; row = 0;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(SubCommunitiesWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), SubCommunitiesWidget.class.getName(), 1, row++));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (isProjectsEnabled()) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(CommunityProjectsWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), CommunityProjectsWidget.class.getName(), 1, row++));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(RecentContentWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), RecentContentWidget.class.getName(), 1, row));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;nbsp;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="darkgreen"&gt;// column 2, start row back at 0&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; row = 0;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(CommunityActionsWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), CommunityActionsWidget.class.getName(), 2, row++));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(TopMembersWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), TopMembersWidget.class.getName(), 2, row++));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(TagCloudWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), TagCloudWidget.class.getName(), 2, row));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ......
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:04ed6dfb-a753-4623-bdac-e97fc3d73e9f]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;II. How do the objects interact, and how are they displayed?&lt;/h2&gt;&lt;p&gt;Sometimes these widget layouts, widget layout descriptors, widgets, widget frames, etc can get kind of confusing. I hope this illustration and ftl explanation can help paint a better picture, and deepen the understanding.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;As an overview, you have the layout (red - WidgetLayout), the layout descriptor (blue - WidgetLayoutDescriptor) which tells how to display the widgets (green - WidgetFrames, contain widgets). A bit more technical tidbits from the database side of things, the container in jiveWidgetFrame is essentially the column, and the frameIndex is essentially the row. See more here:&lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/builds/docs/clearspace/latest/DatabaseSchemaGuide.html#jiveWidgetFrame"&gt;http://www.jivesoftware.com/builds/docs/clearspace/latest/DatabaseSchemaGuide.html#jiveWidgetFrame&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: center; "&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1648-9087/defaultLayout_explain_b.png"&gt;&lt;img alt="defaultLayout_explain_b.png" class="jive-image-thumbnail jive-image" height="453" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1648-9087/620-453/defaultLayout_explain_b.png" width="620"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;We saw above how it will grab the widget layout, but I didn't show it returning from that method. This can be seen as the red box in the picture above (the layout)&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:d5169091-1445-46d0-969c-28b2d12970aa]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;&amp;lt;#if widgetLayout?exists&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-body-main"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-widget-content"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="thread.watch.notify" class="jive-info-box" style="display:none"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#include "/template/global/include/form-message.ftl" /&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#include "${widgetLayout.freemarkerTemplate}" /&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;lt;/#if&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:d5169091-1445-46d0-969c-28b2d12970aa]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:3aba2ba2-1748-47cf-9743-1a4fd1cdc4aa]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; WidgetLayout getWidgetLayout() &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!isHasCustomized()) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="darkgreen"&gt;// if no draft widget frames exist, then no default layout exists&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManager.getWidgetFrames(getCommunity()).size() == 0) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; copyDefaultLayout();
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; widgetManager.getWidgetLayout(getCommunity());
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:3aba2ba2-1748-47cf-9743-1a4fd1cdc4aa]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;After returning the layout, we look to the layout FTL (which for this particular layout is ls.ftl) and CommunityAction for what happens next (this is the blue box above, the layout descriptor). Each different layout FTL asks for the widget frames associated with it, and will have them available via the CommunityAction. For our example, it looks for the widget frames in the left container, and then the right container.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;This loads the widgets in the left container (green A)...&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:edb5ebfe-7ebe-4fcc-a59e-8c7c49f6bb95]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;&amp;lt;div id="jive-body-layout-ls"&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;div class="jive-body-layout-l"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-widget-container_1" class="jive-widget-container jive-widget-container-large"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#if widgetFrames?exists &amp;amp;&amp;amp; widgetFrames.containsKey(1?int)&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#list widgetFrames.get(1?int) as widgetFrame&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#if widgets?exists&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;@jive.editWidgetFrame widgetFrame=widgetFrame /&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#else&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;@jive.displayWidgetFrame widgetFrame=widgetFrame size=enums["com.jivesoftware.community.widget.Widget$ContainerSize"].LARGE /&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#if&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#list&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#if&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:edb5ebfe-7ebe-4fcc-a59e-8c7c49f6bb95]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;....and the rest of the file loads the widgets in the right container (green B)&lt;/p&gt;&lt;!--[CodeBlockStart:c20179c7-39f6-4d8b-8508-a4e45d041525]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div class="jive-body-layout-s"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-widget-container_2" class="jive-widget-container jive-widget-container-small"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#if widgetFrames?exists &amp;amp;&amp;amp; widgetFrames.containsKey(2?int)&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#list widgetFrames.get(2?int) as widgetFrame&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#if widgets?exists&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;@jive.editWidgetFrame widgetFrame=widgetFrame /&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#else&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;@jive.displayWidgetFrame widgetFrame=widgetFrame size=enums["com.jivesoftware.community.widget.Widget$ContainerSize"].SMALL /&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#if&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#list&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#if&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:c20179c7-39f6-4d8b-8508-a4e45d041525]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;They widgetFrames are available from this call to the widgetManager in CommunityAction.getWidgetFrames():&lt;/p&gt;&lt;!--[CodeBlockStart:96b28525-5bb6-4014-8ea2-1a3ceee9b11b]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; widgetManager.getPublishedWidgetFrames(getCommunity());
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:96b28525-5bb6-4014-8ea2-1a3ceee9b11b]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;And that's it! The widgets are displayed.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;III. How we customized this&lt;/h2&gt;&lt;p&gt;As you've seen, it's all initiated by NOT having anything setup the first time you are directed to the community.ftl file. So, we needed to ensure that there was a widget layout, and within that widget layout there are widget frames. So, during our secure space creation we need to hook into this ourselves. Have a look at how we're doing it:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1. Get a list of all the widgets in the system&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:57c2d4d9-da98-4f40-87d2-ffdc0229dc0a]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;Map&amp;lt;WidgetDescriptor, Widget&amp;gt; widgets = widgetManager.getAvailableWidgets();
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:57c2d4d9-da98-4f40-87d2-ffdc0229dc0a]--&gt;&lt;p&gt;2. Identify the two widgets we want to add initially, and loop through all the available widgets and hold onto them&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:c738f89d-4e61-4197-a348-1cd248fc4597]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;Widget actionWidget = &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;;
Widget openCasesWidget = &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;;
&lt;font color="navy"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt;(Iterator&amp;lt;WidgetDescriptor&amp;gt; it = widgets.keySet().iterator(); it.hasNext(); ) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; WidgetDescriptor descriptor = it.next();
&amp;#160;&amp;#160;&amp;#160;&amp;#160; Widget widget = widgets.get(descriptor);
&amp;nbsp;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(descriptor.getClassName().equalsIgnoreCase(&lt;font color="red"&gt;"com.jivesoftware.community.widget.impl.CommunityActionsWidget"&lt;/font&gt;)) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; actionWidget = widget;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt; &lt;font color="navy"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(descriptor.getClassName().equalsIgnoreCase(&lt;font color="red"&gt;"com.jivesoftware.community.portal.widgets.OpenCasesWidget"&lt;/font&gt;)) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; openCasesWidget = widget;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&lt;font color="navy"&gt;}&lt;/font&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:c738f89d-4e61-4197-a348-1cd248fc4597]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3. Then, as we saw above, we need to get the widget layout desired and add it to the newly created secure community&lt;/p&gt;&lt;!--[CodeBlockStart:33e54ae8-97b2-4b5c-8120-cf2b6ddf61a0]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160; WidgetLayoutDescriptor wld = getWidgetLayoutByName(TwoColumnLargeLeftColumnLayout.class.getName());
&amp;#160; WidgetLayout wl = widgetManager.getWidgetLayout(wld);
&amp;#160; widgetManager.addWidgetLayout(community, wl);
&amp;#160; widgetManager.publishWidgetLayout(community);
&lt;font color="navy"&gt;}&lt;/font&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:33e54ae8-97b2-4b5c-8120-cf2b6ddf61a0]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4. Finally, setup our OpenCasesWidget (custom built by us) and the Actions widget. They are mapped to the correct lay out by the matching up of parentObjectType and ParentObjectID.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:a3900ab4-7bcd-4357-96f8-06e419417486]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="darkgreen"&gt;//load the widgets&lt;/font&gt;
WidgetFrameBean widgetBean = &lt;font color="navy"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; WidgetFrameBean();
widgetBean.setWidgetID(openCasesWidget.getID());
widgetBean.setContainerID(1);
widgetBean.setParentObjectID(community.getID());
widgetBean.setParentObjectType(JiveConstants.COMMUNITY);
widgetBean.setPublished(&lt;font color="navy"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt;);
widgetManager.addWidgetFrame(widgetBean);
&amp;nbsp;
WidgetFrameBean actionWidgetBean = &lt;font color="navy"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; WidgetFrameBean();
actionWidgetBean.setWidgetID(actionWidget.getID());
actionWidgetBean.setContainerID(2);
actionWidgetBean.setParentObjectID(community.getID());
actionWidgetBean.setParentObjectType(JiveConstants.COMMUNITY);
actionWidgetBean.setPublished(&lt;font color="navy"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt;);
widgetManager.addWidgetFrame(actionWidgetBean);
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:a3900ab4-7bcd-4357-96f8-06e419417486]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;5. All done!&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;That is how we are creating the communities &lt;em&gt;and&lt;/em&gt; customizing their overview tabs. Hope this has been helpful!&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Let me know if there are any questions on the above functionality &lt;img height="16px" src="http://www.jivesoftware.com/community/images/emoticons/happy.gif" width="16px"/&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:2f216fc6-8287-4ac1-bc1e-2c1751d82be7] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">widgets</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">customize</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">supportal</category>
      <pubDate>Fri, 23 Jan 2009 16:52:22 GMT</pubDate>
      <author>communities@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2009/01/23/creating-account-spaces-part-ii-widgets</guid>
      <dc:date>2009-01-23T16:52:22Z</dc:date>
      <clearspace:dateToText>10 months, 1 day ago</clearspace:dateToText>
      <clearspace:replyCount>4</clearspace:replyCount>
      <clearspace:objectType>0</clearspace:objectType>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/creating-account-spaces-part-ii-widgets</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1648</wfw:commentRss>
    </item>
  </channel>
</rss>

