Modified: 
rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_person_profile.js
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_person_profile.js?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_person_profile.js
 (original)
+++ 
rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_person_profile.js
 Fri Oct  5 14:59:18 2012
@@ -19,35 +19,56 @@
 
 var rave = rave || {};
 rave.personprofile = rave.personprofile || (function() {
-    // map of [subpage id, boolean] tracking whether or not a sub page has 
been viewed at least once
-    var subPagesViewedStatus = {};
+     // map of {subpage name, boolean} tracking whether or not a sub page has 
been viewed at least once
+     var subPagesViewedStatus = {};
      function initSubPages() {
-        //Make first tab active (Twitter Bootstrap)
-        $('.nav-tabs a:first').tab('show');
-        $('#personProfileSubPages a[data-toggle="tab"]').on('shown', 
function(event, ui) {
+         var $tabs = $('#personProfileSubPages a[data-toggle="tab"]');
+         //If the implementation does not use bootstrap tabs / subpages, skip 
this method
+         if($tabs.length == 0){
+             return;
+         }
+         
+        //Make the tab identified by hash url active, defaulting to the first 
tab (Twitter Bootstrap)
+         var activeSubPage = decodeURIComponent(location.hash).slice(1);
+         if (activeSubPage===''){
+             activeSubPage = $tabs.first().text();
+         }
+
+         // build the subPageViewedStatus map to track if a given sub page has 
been viewed yet to determine if we need
+         // to refresh the widgets upon first viewing to ensure they are sized 
properly.  Set the default active tab to
+         // true since it will be rendered and sized properly as part of the 
initial page load
+         $.each($tabs, function(i, el){
+             var $tab = $(el);
+             var page = $tab.text();
+             var isActive =  (page == activeSubPage);
+             subPagesViewedStatus[page] = isActive;
+            //show the initial tab
+             if(isActive){
+                 $tab.tab('show');
+             }
+         });
+
+         $tabs.on('shown', function(event, ui) {
+             //on tab click, change the url hash
+             var page = $(this).text();
+             var target = $(this).attr('href');
+             location.hash = encodeURIComponent(page);
+
             // refresh the widgets on the sub page when selected to ensure 
proper sizing
-            var subPageId = $( $(this).attr("href") ).attr("id");
-            if (subPagesViewedStatus[subPageId] == false) {
-                $("#" + subPageId + " .widget-wrapper").each(function(){
+            if (subPagesViewedStatus[page] == false) {
+                $(target + " .widget-wrapper").each(function(){
                     var regionWidget = 
rave.getRegionWidgetById(rave.getObjectIdFromDomId(this.id));
                     regionWidget.restore();
                 });
                 // mark that this sub page has been viewed at least once and 
there is no need to refresh
                 // the widgets in future views
-                subPagesViewedStatus[subPageId] = true;
+                subPagesViewedStatus[page] = true;
             }
         });
-        // build the subPageViewedStatus map to track if a given sub page has 
been viewed yet to determine if we need
-        // to refresh the widgets upon first viewing to ensure they are sized 
properly.  Set the default active tab to
-        // true since it will be rendered and sized properly as part of the 
initial page load
-        var activeSubPageId = $("#personProfileSubPages 
.tab-pane.active")[0].id;
-        $("#personProfileSubPages .tab-pane").each(function(){
-            subPagesViewedStatus[this.id] = (this.id == activeSubPageId);
-        });
-    }
+     }
 
      function dealWithUserResults(userResults){
-        var currentUser = $("#addRemoveFriend").get(0).value;
+         var currentUser = $("#addRemoveFriend").get(0).value;
          var searchTerm = $('#searchTerm').get(0).value;
          if(searchTerm == undefined || searchTerm == ""){
              $('#clearSearchButton').hide();
@@ -161,7 +182,7 @@ rave.personprofile = rave.personprofile 
                      }
                  }
 
-       });
+         });
      }
 
      function paginate(userResults){
@@ -218,51 +239,51 @@ rave.personprofile = rave.personprofile 
 
      // Remove a friend of the current user
      function removeFriend(userId, username){
-        var message = 
rave.layout.searchHandler.updateParamsInString(rave.getClientMessage("remove.friend.confirm"),
+         var message = 
rave.layout.searchHandler.updateParamsInString(rave.getClientMessage("remove.friend.confirm"),
                  new Array(username));
          if(confirm(message)){
-                $('#friendStatusButtonHolder'+userId).hide();
-                rave.api.rpc.removeFriend({friendUsername : username,
-                    successCallback: function(result) {
-                        rave.personprofile.removeFriendUI(username);
-                        $('#friendStatusButtonHolder'+userId).empty();
-                        $('#friendStatusButtonHolder'+userId)
-                            .append(
-                                    $("<a/>")
-                                    .attr("href", "#")
-                                    .attr("id", userId)
-                                    .attr("onclick", 
"rave.personprofile.addFriend(" +
-                                        userId+", '" + username+"');")
-                                    .text(rave.getClientMessage("common.add"))
-                            );
-                        $('#friendStatusButtonHolder'+userId).show();
-                    }
-                });
+             $('#friendStatusButtonHolder'+userId).hide();
+             rave.api.rpc.removeFriend({friendUsername : username,
+                 successCallback: function(result) {
+                     rave.personprofile.removeFriendUI(username);
+                     $('#friendStatusButtonHolder'+userId).empty();
+                     $('#friendStatusButtonHolder'+userId)
+                         .append(
+                                 $("<a/>")
+                                 .attr("href", "#")
+                                 .attr("id", userId)
+                                 .attr("onclick", 
"rave.personprofile.addFriend(" +
+                                     userId+", '" + username+"');")
+                                 .text(rave.getClientMessage("common.add"))
+                         );
+                     $('#friendStatusButtonHolder'+userId).show();
+                 }
+             });
          }
      }
 
      // Cancel the friend request already sent to a user
      function removeFriendRequestSent(userId, username){
-        var message = 
rave.layout.searchHandler.updateParamsInString(rave.getClientMessage("remove.friend.request.confirm"),
+         var message = 
rave.layout.searchHandler.updateParamsInString(rave.getClientMessage("remove.friend.request.confirm"),
                  new Array(username));
          if(confirm(message)){
-                $('#friendStatusButtonHolder'+userId).hide();
-                rave.api.rpc.removeFriend({friendUsername : username,
-                    successCallback: function(result) {
-                        rave.personprofile.removeFriendRequestSentUI(username);
-                        $('#friendStatusButtonHolder'+userId).empty();
-                        $('#friendStatusButtonHolder'+userId)
-                            .append(
-                                    $("<a/>")
-                                    .attr("href", "#")
-                                    .attr("id", userId)
-                                    .attr("onclick", 
"rave.personprofile.addFriend(" +
-                                        userId+", '" + username+"');")
-                                    .text(rave.getClientMessage("common.add"))
-                            );
-                        $('#friendStatusButtonHolder'+userId).show();
-                    }
-                });
+             $('#friendStatusButtonHolder'+userId).hide();
+             rave.api.rpc.removeFriend({friendUsername : username,
+                 successCallback: function(result) {
+                     rave.personprofile.removeFriendRequestSentUI(username);
+                     $('#friendStatusButtonHolder'+userId).empty();
+                     $('#friendStatusButtonHolder'+userId)
+                         .append(
+                                 $("<a/>")
+                                 .attr("href", "#")
+                                 .attr("id", userId)
+                                 .attr("onclick", 
"rave.personprofile.addFriend(" +
+                                     userId+", '" + username+"');")
+                                 .text(rave.getClientMessage("common.add"))
+                         );
+                     $('#friendStatusButtonHolder'+userId).show();
+                 }
+             });
          }
      }
 
@@ -309,7 +330,7 @@ rave.personprofile = rave.personprofile 
      }
      // Add an item to the List of friend requests sent(maintained for the UI)
      function addFriendRequestUI(username){
-        rave.personprofile.requestsSent.push(username);
+         rave.personprofile.requestsSent.push(username);
      }
 
      // Remove a friend from the list of friends(maintained for the UI)
@@ -332,25 +353,25 @@ rave.personprofile = rave.personprofile 
          if(rave.personprofile.friends.indexOf(username)>=0){
              return true;
          } else {
-                return false;
+             return false;
          }
      }
 
      // Check if a friend request is already sent to a particular user
      function isFriendRequestSent(username){
-        if(rave.personprofile.requestsSent.indexOf(username)>=0){
+         if(rave.personprofile.requestsSent.indexOf(username)>=0){
              return true;
          } else {
-                return false;
+             return false;
          }
      }
 
      // Check if a friend request is received from a particular user
      function isFriendRequestReceived(username){
-        if(rave.personprofile.friendRequestsReceived.indexOf(username)>=0){
+         if(rave.personprofile.friendRequestsReceived.indexOf(username)>=0){
              return true;
          } else {
-                return false;
+             return false;
          }
      }
 
@@ -365,15 +386,15 @@ rave.personprofile = rave.personprofile 
         //user clicks add/remove friend button in the profile page
         var $friendButton = $("#addRemoveFriend");
         if ($friendButton) {
-               $friendButton.click(function() {
-                       rave.personprofile.getFriends({successCallback : 
function() {
+            $friendButton.click(function() {
+                rave.personprofile.getFriends({successCallback : function() {
                     rave.api.rpc.getUsers({offset: 0,
                         successCallback: function(result) {
                             dealWithUserResults(result);
                             $("#userDialog").modal('show');
                         }
                     });
-                       }});
+                }});
             });
         }
 
@@ -408,77 +429,77 @@ rave.personprofile = rave.personprofile 
 
         // When the user accepts a friend request
         var $acceptFriend = $(".acceptFriendRequest");
-       if($acceptFriend) {
-               $acceptFriend.click(function(e) {
-                       rave.api.rpc.acceptFriendRequest({friendUsername : 
this.id});
-               var listRequestItem = $(this).parents('.requestItem');
-               var friendRequestMenu = $(listRequestItem).parent();
-               $(listRequestItem).remove();
-               $('.friendRequestDropdown').append('<li 
class="message">Accepted</li>');
-               $('.message').fadeOut(2000, function() {
+        if($acceptFriend) {
+              $acceptFriend.click(function(e) {
+                  rave.api.rpc.acceptFriendRequest({friendUsername : this.id});
+                var listRequestItem = $(this).parents('.requestItem');
+                var friendRequestMenu = $(listRequestItem).parent();
+                $(listRequestItem).remove();
+                $('.friendRequestDropdown').append('<li 
class="message">'+rave.getClientMessage("common.accepted")+'</li>');
+                $('.message').fadeOut(2000, function() {
                     $('.message').remove();
-                       var childItems = $(friendRequestMenu).children('li');
-                       $('.friendRequestDropdownLink').html('Friend 
Requests('+childItems.size()+')');
-                       if(childItems.size()==0)
-                               $('.friendRequestDropdown').append('<li>No 
Friend Requests</li>');
+                    var childItems = $(friendRequestMenu).children('li');
+                    
$('.friendRequestDropdownLink').html(''+rave.getClientMessage("person.profile.friend.requests")+'
 ('+childItems.size()+')');
+                    if(childItems.size()==0)
+                        
$('.friendRequestDropdown').append('<li>'+rave.getClientMessage("person.profile.friend.requests.none")+'</li>');
                 });
-               e.stopPropagation();
-           });
-       }
+                e.stopPropagation();
+            });
+        }
 
-       // When the user declines a friend request
+        // When the user declines a friend request
         var $declineFriend = $(".declineFriendRequest");
-       if($declineFriend) {
-               $declineFriend.click(function(e) {
-                       rave.api.rpc.removeFriend({friendUsername : this.id});
+        if($declineFriend) {
+            $declineFriend.click(function(e) {
+                  rave.api.rpc.removeFriend({friendUsername : this.id});
                 var listRequestItem = $(this).parents('.requestItem');
-               var friendRequestMenu = $(listRequestItem).parent();
-               $(listRequestItem).remove();
-               $('.friendRequestDropdown').append('<li 
class="message">Declined</li>');
-               $('.message').fadeOut(2000, function() {
+                var friendRequestMenu = $(listRequestItem).parent();
+                $(listRequestItem).remove();
+                $('.friendRequestDropdown').append('<li 
class="message">'+rave.getClientMessage("common.declined")+'</li>');
+                $('.message').fadeOut(2000, function() {
                     $('.message').remove();
                     var childItems = $(friendRequestMenu).children('li');
-                    $('.friendRequestDropdownLink').html('Friend 
Requests('+childItems.size()+')');
-                       if(childItems.size()==0)
-                               $('.friendRequestDropdown').append('<li>No 
Friend Requests</li>');
+                    
$('.friendRequestDropdownLink').html(''+rave.getClientMessage("person.profile.friend.requests")+'
 ('+childItems.size()+')');
+                    if(childItems.size()==0)
+                        
$('.friendRequestDropdown').append('<li>'+rave.getClientMessage("person.profile.friend.requests.none")+'</li>');
                 });
-               e.stopPropagation();
-           });
-       }
+                e.stopPropagation();
+            });
+        }
     }
 
     // Gets the list of friends from the DB
     function getFriends(args) {
-               rave.personprofile.friends = new Array();
-       rave.personprofile.requestsSent = new Array();
-       rave.personprofile.friendRequestsReceived = new Array();
-       rave.api.rpc.getFriends({
+           rave.personprofile.friends = new Array();
+        rave.personprofile.requestsSent = new Array();
+        rave.personprofile.friendRequestsReceived = new Array();
+        rave.api.rpc.getFriends({
             successCallback: function(result) {
-               jQuery.each(result.result.accepted, function() {
-                       
if(!rave.personprofile.isUserAlreadyFriend(this.username))
-                               rave.personprofile.friends.push(this.username);
-               });
-               jQuery.each(result.result.sent, function() {
-                       
if(!rave.personprofile.isFriendRequestSent(this.username))
-                               
rave.personprofile.requestsSent.push(this.username);
-               });
-               jQuery.each(result.result.received, function() {
-                       
if(!rave.personprofile.isFriendRequestReceived(this.username))
-                               
rave.personprofile.friendRequestsReceived.push(this.username);
-               });
-               if(result !=null && typeof args.successCallback == 'function') {
+                jQuery.each(result.result.accepted, function() {
+                    if(!rave.personprofile.isUserAlreadyFriend(this.username))
+                        rave.personprofile.friends.push(this.username);
+                });
+                jQuery.each(result.result.sent, function() {
+                    if(!rave.personprofile.isFriendRequestSent(this.username))
+                        rave.personprofile.requestsSent.push(this.username);
+                });
+                jQuery.each(result.result.received, function() {
+                    
if(!rave.personprofile.isFriendRequestReceived(this.username))
+                        
rave.personprofile.friendRequestsReceived.push(this.username);
+                });
+                if(result !=null && typeof args.successCallback == 'function') 
{
                     args.successCallback();
                 }
             }
         });
     }
 
-       function init() {
+    function init() {
         initSubPages();
         initButtons();
     }
 
-       return {
+    return {
         init : init,
         dealWithUserResults : dealWithUserResults,
         addFriend : addFriend,

Modified: 
rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_store.js
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_store.js?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_store.js
 (original)
+++ 
rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_store.js
 Fri Oct  5 14:59:18 2012
@@ -203,16 +203,46 @@ rave.store = rave.store || (function() {
         }
     }
 
+    function initMarketplaceCategory(referringPageId) {
+        if (referringPageId != null){
+            // category list box
+            $("#marketplaceCategoryList").change(function() {
+                var selectedCategory = $("#marketplaceCategoryList 
option:selected").val();
+                document.location.href = rave.getContext() + 
"marketplace/category/"+selectedCategory
+                           +"?referringPageId="+referringPageId;
+            });
+        }
+    }
+
+    function confirmAddFromMarketplace(uri, pType){
+        var answer = 
confirm(rave.getClientMessage("confirm.add.from.marketplace"));
+        if(answer){
+            rave.api.rpc.addWidgetFromMarketplace({
+                url: uri,
+                providerType: pType,
+                successCallback: function(widget){
+                    if(widget.result == null){
+                        
alert(rave.getClientMessage("failed.add.from.marketplace"));
+                    }else{
+                        alert("(" + widget.result.title + ") " + 
rave.getClientMessage("success.add.from.marketplace"));
+                    }
+                }
+            });
+        }
+    }
+
     function init(referringPageId){
         initRatings();
         initComments();
         initWidgetsTag(referringPageId);
         initWidgetsCategory(referringPageId);
+        initMarketplaceCategory(referringPageId);
     }
 
     return {
         init: init,
-        initTags: initTags
+        initTags: initTags,
+        confirmAddFromMarketplace : confirmAddFromMarketplace
     };
 
 }());

Modified: 
rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_wookie.js
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_wookie.js?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_wookie.js
 (original)
+++ 
rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_wookie.js
 Fri Oct  5 14:59:18 2012
@@ -20,7 +20,6 @@ var rave = rave || {};
 rave.wookie = rave.wookie || (function() {
     var WIDGET_TYPE = "W3C";
     var OFFSET = 10;
-    var MIN_HEIGHT = 250;
     // keep this value so we can show the widget in the maximize view even 
when its collapsed
     var userCollapsed;
     var container;
@@ -34,7 +33,7 @@ rave.wookie = rave.wookie || (function()
        userCollapsed = widget.collapsed;
         var widgetBodyElement = document.getElementById(["widget-", 
widget.regionWidgetId, "-body"].join(""));
         
-        var height = MIN_HEIGHT;
+        var height = rave.getDefaultWidgetHeight();
         if (widget.height) height = widget.height;
         
         //
@@ -66,7 +65,7 @@ rave.wookie = rave.wookie || (function()
                 scroll: "no",
                 frameborder: 0,
                 height: height,
-                "min-height": ""+MIN_HEIGHT+"px"
+                "min-height": ""+rave.getDefaultWidgetHeight()+"px"
             },
             uri: widget.widgetUrl,
             onGadgetLoad: "onWidget"+widget.regionWidgetId+"Load"
@@ -94,9 +93,13 @@ rave.wookie = rave.wookie || (function()
                 $(ooacontainer.getIframe()).hide();
             }
         };
-        // if in the collapsed state, hide the layer
-        if (widget.collapsed){
-            $(ooacontainer.getIframe()).hide();
+
+        // if the widget is on a top level page, or an active sub page tab, 
render it
+        if (!rave.layout.isWidgetOnHiddenTab(widget)) {
+            // if in the collapsed state, hide the layer
+            if (widget.collapsed){
+                $(ooacontainer.getIframe()).hide();
+            }
         }
     }
 

Modified: 
rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/main/java/org/apache/rave/provider/opensocial/service/impl/OpenSocialWidgetMetadataResolver.java
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/main/java/org/apache/rave/provider/opensocial/service/impl/OpenSocialWidgetMetadataResolver.java?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/main/java/org/apache/rave/provider/opensocial/service/impl/OpenSocialWidgetMetadataResolver.java
 (original)
+++ 
rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/main/java/org/apache/rave/provider/opensocial/service/impl/OpenSocialWidgetMetadataResolver.java
 Fri Oct  5 14:59:18 2012
@@ -115,4 +115,10 @@ public class OpenSocialWidgetMetadataRes
       // not implemented
       return null;
     }
+
+    @Override
+    public Widget publishRemote(String url) {
+        // not implemented
+        return null;
+    }
 }

Modified: 
rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/main/java/org/apache/rave/provider/opensocial/web/renderer/OpenSocialWidgetRenderer.java
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/main/java/org/apache/rave/provider/opensocial/web/renderer/OpenSocialWidgetRenderer.java?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/main/java/org/apache/rave/provider/opensocial/web/renderer/OpenSocialWidgetRenderer.java
 (original)
+++ 
rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/main/java/org/apache/rave/provider/opensocial/web/renderer/OpenSocialWidgetRenderer.java
 Fri Oct  5 14:59:18 2012
@@ -20,6 +20,8 @@
 package org.apache.rave.provider.opensocial.web.renderer;
 
 import org.apache.rave.exception.NotSupportedException;
+import org.apache.rave.portal.model.Page;
+import org.apache.rave.portal.model.PageType;
 import org.apache.rave.portal.model.RegionWidget;
 import org.apache.rave.portal.model.RegionWidgetPreference;
 import org.apache.rave.portal.web.renderer.RegionWidgetRenderer;
@@ -73,7 +75,9 @@ public class OpenSocialWidgetRenderer im
             " collapsed: %8$s, " +
             " widgetId: %9$s," +
             " locked: %10$s," +
-            " hideChrome: %11$s});</script>";
+            " hideChrome: %11$s," +
+            " subPage: {id: %12$s, name: '%13$s', isDefault: %14$s}" +
+            "});</script>";
     private static final String MARKUP = "<!-- RegionWidget %1$s placeholder 
-->";
 
     @Override
@@ -117,6 +121,20 @@ public class OpenSocialWidgetRenderer im
             }
         }
 
+        // get attributes about the sub page this regionWidget is on.  This is 
needed to assist the client in
+        // determining which gadgets are on visible tabs/sub pages initially 
to make widget rendering more efficient
+        String pageId = null;
+        String pageName = "";
+        boolean isDefault = false;
+        Page page =  item.getRegion().getPage();
+        if (PageType.SUB_PAGE.equals(page.getPageType())) {
+            pageId = page.getId();
+            pageName = page.getName();
+            // check to see if this regionWidget is on the first sub page, 
which will be the default
+            // subpage rendered if the user doesn't specify which subpage via 
the URL hash
+            isDefault = isDefaultSubPage(page);
+        }
+
         return String.format(SCRIPT_BLOCK,
                 item.getRegion().getId(),
                 Constants.WIDGET_TYPE,
@@ -128,6 +146,14 @@ public class OpenSocialWidgetRenderer im
                 item.isCollapsed(),
                 item.getWidget().getId(),
                 item.isLocked(),
-                item.isHideChrome());
+                item.isHideChrome(),
+                pageId,
+                pageName,
+                isDefault
+                );
+    }
+
+    private boolean isDefaultSubPage(Page subPage) {
+        return 
subPage.getParentPage().getSubPages().get(0).getId().equals(subPage.getId());
     }
 }

Modified: 
rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/test/java/org/apache/rave/provider/opensocial/web/renderer/OpenSocialWidgetRendererTest.java
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/test/java/org/apache/rave/provider/opensocial/web/renderer/OpenSocialWidgetRendererTest.java?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/test/java/org/apache/rave/provider/opensocial/web/renderer/OpenSocialWidgetRendererTest.java
 (original)
+++ 
rave/branches/model-split/rave-providers/rave-opensocial-provider/rave-opensocial-client/src/test/java/org/apache/rave/provider/opensocial/web/renderer/OpenSocialWidgetRendererTest.java
 Fri Oct  5 14:59:18 2012
@@ -20,13 +20,8 @@
 package org.apache.rave.provider.opensocial.web.renderer;
 
 import org.apache.rave.exception.NotSupportedException;
-import org.apache.rave.portal.model.Region;
-import org.apache.rave.portal.model.RegionWidget;
-import org.apache.rave.portal.model.RegionWidgetPreference;
-import org.apache.rave.portal.model.impl.RegionImpl;
-import org.apache.rave.portal.model.impl.RegionWidgetImpl;
-import org.apache.rave.portal.model.impl.RegionWidgetPreferenceImpl;
-import org.apache.rave.portal.model.impl.WidgetImpl;
+import org.apache.rave.portal.model.*;
+import org.apache.rave.portal.model.impl.*;
 import org.apache.rave.portal.web.renderer.RenderScope;
 import org.apache.rave.portal.web.renderer.Renderer;
 import org.apache.rave.portal.web.renderer.ScriptLocation;
@@ -39,6 +34,7 @@ import org.json.JSONException;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 
 import static org.easymock.EasyMock.*;
@@ -79,15 +75,28 @@ public class OpenSocialWidgetRendererTes
         final String WIDGET_ID = "999";
         final String REGION_WIDGET_ID = "12345";
         final String REGION_ID = "8675309";
+        final String VALID_SUBPAGE_ID = "778899";
+        final String VALID_SUBPAGE_NAME = "My Activity";
+        final boolean VALID_IS_DEFAULT_SUBPAGE = true;
 
         
expect(openSocialService.getGadgetMetadata(VALID_GADGET_URL)).andReturn(VALID_METADATA);
         replay(openSocialService);
 
+        Page page = new PageImpl();
+        page.setSubPages(new ArrayList<Page>());
+        Page subPage = new PageImpl();
+        subPage.setId(VALID_SUBPAGE_ID);
+        subPage.setName(VALID_SUBPAGE_NAME);
+        subPage.setParentPage(page);
+        subPage.setPageType(PageType.SUB_PAGE);
+        page.getSubPages().add(subPage);
+
         WidgetImpl w = new WidgetImpl();
         w.setId(WIDGET_ID);
         w.setType(Constants.WIDGET_TYPE);
         w.setUrl(VALID_GADGET_URL);
         Region region = new RegionImpl(REGION_ID);
+        region.setPage(subPage);
         RegionWidget rw = new RegionWidgetImpl(REGION_WIDGET_ID);
         rw.setCollapsed(VALID_COLLAPSED);
         rw.setWidget(w);
@@ -108,7 +117,8 @@ public class OpenSocialWidgetRendererTes
             " collapsed: " + VALID_COLLAPSED + ", " +
             " widgetId: " + WIDGET_ID + "," +
             " locked: " + VALID_LOCKED + "," +
-            " hideChrome: " + VALID_HIDE_CHROME +
+            " hideChrome: " + VALID_HIDE_CHROME + "," +
+            " subPage: {id: " + VALID_SUBPAGE_ID + ", name: '" + 
VALID_SUBPAGE_NAME + "', isDefault: " + VALID_IS_DEFAULT_SUBPAGE + "}" +
             "});</script>";
 
         
expect(securityTokenService.getEncryptedSecurityToken(rw)).andReturn(VALID_SECURITY_TOKEN);
@@ -132,9 +142,13 @@ public class OpenSocialWidgetRendererTes
         final String REGION_WIDGET_ID = "12345";
         final String REGION_ID = "8675309";
 
+        Page page = new PageImpl();
+        page.setPageType(PageType.USER);
+        
         WidgetImpl w = new WidgetImpl();
         w.setType(Constants.WIDGET_TYPE);
         Region region = new RegionImpl(REGION_ID);
+        region.setPage(page);
         RegionWidget rw = new RegionWidgetImpl();
         rw.setWidget(w);
         rw.setRegion(region);
@@ -148,7 +162,10 @@ public class OpenSocialWidgetRendererTes
             " userPrefs: {}," +
             " collapsed: false, " +
             " widgetId: null," +
-            " locked: false, hideChrome: false});</script>";
+            " locked: false," +
+            " hideChrome: false," +
+            " subPage: {id: null, name: '', isDefault: false}" +
+            "});</script>";
 
         
scriptManager.registerScriptBlock(OpenSocialWidgetRenderer.REGISTER_WIDGET_KEY, 
markup, ScriptLocation.AFTER_RAVE, RenderScope.CURRENT_REQUEST, null);
         expectLastCall();

Modified: 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/repository/W3CWidgetMetadataRepository.java
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/repository/W3CWidgetMetadataRepository.java?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/repository/W3CWidgetMetadataRepository.java
 (original)
+++ 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/repository/W3CWidgetMetadataRepository.java
 Fri Oct  5 14:59:18 2012
@@ -37,4 +37,11 @@ public interface W3CWidgetMetadataReposi
      * @return an array of Widget objects representing available W3C widgets
      */
     public Widget[] getWidgetMetadata();
+    
+    /**
+     * Publishes a remote widget to the target environment
+     * @param url - url of remote widget
+     * @return
+     */
+    Widget publishRemote(String url);
 }

Modified: 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/repository/impl/WookieWidgetMetadataRepository.java
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/repository/impl/WookieWidgetMetadataRepository.java?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/repository/impl/WookieWidgetMetadataRepository.java
 (original)
+++ 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/repository/impl/WookieWidgetMetadataRepository.java
 Fri Oct  5 14:59:18 2012
@@ -19,6 +19,8 @@
 
 package org.apache.rave.provider.w3c.repository.impl;
 
+import java.io.IOException;
+
 import org.apache.rave.portal.model.Widget;
 import org.apache.rave.portal.service.WidgetProviderService;
 import org.apache.rave.provider.w3c.repository.W3CWidgetMetadataRepository;
@@ -68,6 +70,11 @@ public class WookieWidgetMetadataReposit
             throw new IllegalArgumentException("Error occurred while 
processing response from wookie metadata call", e);
                }
        }
+
+    @Override
+    public Widget publishRemote(String url) {
+        return this.widgetService.publishWidgetUrlToWookie(url);
+    }
     
     
 

Modified: 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetMetadataResolver.java
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetMetadataResolver.java?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetMetadataResolver.java
 (original)
+++ 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetMetadataResolver.java
 Fri Oct  5 14:59:18 2012
@@ -74,4 +74,9 @@ public class WookieWidgetMetadataResolve
         }
     }
 
+    @Override
+    public Widget publishRemote(String url) {
+        return widgetMetadataRepository.publishRemote(url);
+    }
+
 }

Modified: 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetService.java
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetService.java?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetService.java
 (original)
+++ 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/service/impl/WookieWidgetService.java
 Fri Oct  5 14:59:18 2012
@@ -18,7 +18,19 @@
  */
 
 package org.apache.rave.provider.w3c.service.impl;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.rave.portal.model.User;
 import org.apache.rave.portal.model.Widget;
 import org.apache.rave.portal.service.WidgetProviderService;
@@ -28,20 +40,20 @@ import org.apache.wookie.connector.frame
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-
 public class WookieWidgetService implements WidgetProviderService {
-  private static Logger logger = 
LoggerFactory.getLogger(WookieWidgetService.class);
+    private static Logger logger = 
LoggerFactory.getLogger(WookieWidgetService.class);
 
     private final String wookieServerUrl; // = "http://localhost:8080/wookie";;
     private final String wookieApiKey; // = "TEST";
-    private static WookieConnectorService  connectorService;
+    private final String adminUsername;
+    private final String adminPassword;
+    private static WookieConnectorService connectorService;
 
-    public WookieWidgetService(String wookieServerUrl, String wookieApiKey){
+    public WookieWidgetService(String wookieServerUrl, String wookieApiKey, 
String adminUsername, String adminPassword){
         this.wookieServerUrl = wookieServerUrl;
         this.wookieApiKey = wookieApiKey;
+        this.adminUsername = adminUsername;
+        this.adminPassword = adminPassword;
     }
 
     /* (non-Javadoc)
@@ -61,6 +73,7 @@ public class WookieWidgetService impleme
      * @return an array of available widgets
      * @throws WookieConnectorException
      */
+    @SuppressWarnings("deprecation")
     public Widget[] getWidgets() throws WookieConnectorException{
         connectorService = getWookieConnectorService(wookieServerUrl, 
wookieApiKey, null);    
         Collection<org.apache.wookie.connector.framework.Widget> widgets = 
connectorService.getAvailableWidgets().values();
@@ -86,6 +99,102 @@ public class WookieWidgetService impleme
         return null;
     }
     
+    @SuppressWarnings("deprecation")
+    public Widget publishWidgetUrlToWookie(String widgetStrUrl){
+        Widget widget = null;
+        File tempWgtFile = null;
+        try {
+            if(adminUsername.equals(null) || adminUsername.equals("") || 
adminPassword.equals(null) || adminPassword.equals("")){
+                throw new WookieConnectorException("Either the wookie username 
or password is not defined in portal.properties", null);
+            }
+            connectorService = getWookieConnectorService(wookieServerUrl, 
wookieApiKey, "");
+            // TODO - replace code with line below when bundled with wookie 
0.13.0
+            // wookie-0.13.0 can accept postWidget with a url parameter as 
well as file parameter
+            //org.apache.wookie.connector.framework.Widget wookieWidget = 
connectorService.postWidget(widgetUrl, adminUsername, adminPassword);
+            
+            URL widgetUrl = new URL(widgetStrUrl);
+            String tempUploadFolder = System.getProperty("java.io.tmpdir");
+            String filename = normalizeFileName(widgetUrl);
+            tempWgtFile = new File(tempUploadFolder, filename);
+            FileUtils.copyURLToFile(widgetUrl, tempWgtFile, 10000, 10000);
+            org.apache.wookie.connector.framework.Widget wookieWidget = 
connectorService.postWidget(tempWgtFile,  adminUsername, adminPassword);
+            widget = new W3CWidget();
+            widget.setUrl(wookieWidget.getIdentifier());
+            widget.setDescription(wookieWidget.getDescription());
+            widget.setTitle(wookieWidget.getTitle());
+            widget.setType("W3C");
+            widget.setThumbnailUrl(wookieWidget.getIcon().toString());
+        } catch (WookieConnectorException e){
+            logger.warn(e.getMessage());
+            return returnURLFromConfig(tempWgtFile);
+        } catch (MalformedURLException e) {
+            logger.error("Malformed url error. " + e.getMessage());
+        } catch (IOException e) {
+            logger.error("I/O error. Problem downloading widget from given 
URL" + e.getMessage());
+        }
+        finally{
+            if(tempWgtFile.exists()){
+                tempWgtFile.delete();
+            }
+        }
+        return widget;
+    }
+    
+    // This function compensates for a bug in wookie-0.10.0.  The 
postWidget(tempWgtFile,  adminUsername, adminPassword)
+    // call will only accept new widgets and not allow you to update existing 
widgets, without already knowing the
+    // widgets Id attribute (this is the same as the 'url' attribute in rave)
+    // In some cases (the marketplace for example) we need to know the widgets 
Id (rave url) when we only have
+    // the original file.wgt.  This method tries to find the .wgt id in the 
config file of the downloaded zip file
+    // so we can determine if it has already been added to rave without having 
to reimport to wookie.
+    // This routine does not generate identifiers, as wookie would on empty 
<id> elements found in the config.xml.
+    // NOTE: this has been fixed in wookie 0.13.0 onwards
+    private Widget returnURLFromConfig(File wgtFile){
+        Widget widget = null;
+        try {
+            final ZipFile zipFile = new ZipFile(wgtFile);
+            ZipEntry entry = zipFile.getEntry("config.xml");
+            InputStream input = zipFile.getInputStream(entry);
+            BufferedReader br = new BufferedReader(new 
InputStreamReader(input, "UTF-8"));
+            try {
+                String line = null;
+                while (( line = br.readLine()) != null){
+                    if(line.contains("id=")){
+                        String val = line.substring(line.indexOf("id=")+4, 
line.indexOf("\"", line.indexOf("id=")+5));
+                        widget = new W3CWidget();
+                        widget.setUrl(val);
+                        return widget;
+                    }
+                }
+            }
+            finally {
+                input.close();
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+        }
+        return widget;
+    }
+
+    private String normalizeFileName(URL urlPath){
+        String filename;
+        String[] parts = urlPath.getFile().split("/");
+        if(parts[parts.length-1].length() < 1){
+           filename = "unknown.wgt";
+        }else{
+            filename = parts[parts.length-1];
+        }
+        if(filename.indexOf('.') == -1){
+           filename = filename + ".wgt"; 
+        }
+        else{
+            if(!filename.endsWith(".wgt")){
+                String[] split = filename.split("\\.");
+                filename = split[0] + ".wgt";
+            }
+        }
+        return filename;
+    }
+
     /**
      * Gets the Widget Instance corresponding to the RegionWidget and the 
Viewer
      * @param widget the type of Widget to obtain
@@ -93,13 +202,12 @@ public class WookieWidgetService impleme
      * @param viewer the current viewer
      * @return a Widget
      */
+    @SuppressWarnings("deprecation")
     private W3CWidget getWidgetForViewer(Widget widget, String sharedDataKey, 
User viewer){
        try {
-            // TODO: parameters for WookieConnectorService should not be fixed 
in code.
             connectorService = getWookieConnectorService(wookieServerUrl, 
wookieApiKey, sharedDataKey);
             org.apache.wookie.connector.framework.User user = new 
org.apache.wookie.connector.framework.User(String.valueOf(viewer.getUsername()),
 viewer.getUsername());
             connectorService.setCurrentUser(user);
-            
             logger.debug("Getting widget:"+widget.getUrl()+" from:" 
+connectorService.getConnection().getURL());
             WidgetInstance instance = 
connectorService.getOrCreateInstance(widget.getUrl());
             return createWidget(instance);
@@ -128,8 +236,7 @@ public class WookieWidgetService impleme
         widget.setWidth(Integer.parseInt(instance.getWidth()));
         return widget;
     }
-    
-    
+
     // Get the wookie service connector
     private WookieConnectorService getWookieConnectorService(String serverURL, 
String apiKey, String sharedDataKey ) throws WookieConnectorException {
       connectorService = new WookieConnectorService(serverURL, apiKey, 
sharedDataKey);

Modified: 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/web/renderer/W3cWidgetRenderer.java
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/web/renderer/W3cWidgetRenderer.java?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/web/renderer/W3cWidgetRenderer.java
 (original)
+++ 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/java/org/apache/rave/provider/w3c/web/renderer/W3cWidgetRenderer.java
 Fri Oct  5 14:59:18 2012
@@ -20,10 +20,7 @@
 package org.apache.rave.provider.w3c.web.renderer;
 
 import org.apache.rave.exception.NotSupportedException;
-import org.apache.rave.portal.model.RegionWidget;
-import org.apache.rave.portal.model.RegionWidgetPreference;
-import org.apache.rave.portal.model.User;
-import org.apache.rave.portal.model.Widget;
+import org.apache.rave.portal.model.*;
 import org.apache.rave.portal.service.UserService;
 import org.apache.rave.portal.service.WidgetProviderService;
 import org.apache.rave.portal.web.renderer.RegionWidgetRenderer;
@@ -75,7 +72,9 @@ public class W3cWidgetRenderer implement
         " collapsed: %7$s, " +
         " widgetId: %8$s, " +
         " locked: %9$s, " +
-        " hideChrome: %10$s});</script>";
+        " hideChrome: %10$s, " +
+        " subPage: {id: %11$s, name: '%12$s', isDefault: %13$s}" +
+        "});</script>";
     private static final String MARKUP = "<!-- RegionWidget %1$s placeholder 
-->";
 
 
@@ -150,6 +149,20 @@ public class W3cWidgetRenderer implement
         if (contextualizedWidget.getHeight() > 0)
                height = String.valueOf(contextualizedWidget.getHeight()) + 
"px";
 
+        // get attributes about the sub page this regionWidget is on.  This is 
needed to assist the client in
+        // determining which gadgets are on visible tabs/sub pages initially 
to make widget rendering more efficient
+        String pageId = null;
+        String pageName = "";
+        boolean isDefault = false;
+        Page page =  item.getRegion().getPage();
+        if (PageType.SUB_PAGE.equals(page.getPageType())) {
+            pageId = page.getId();
+            pageName = page.getName();
+            // check to see if this regionWidget is on the first sub page, 
which will be the default
+            // subpage rendered if the user doesn't specify which subpage via 
the URL hash
+            isDefault = isDefaultSubPage(page);
+        }
+
         //
         // Construct and return script block
         //
@@ -163,6 +176,13 @@ public class W3cWidgetRenderer implement
                 item.isCollapsed(),
                 item.getWidget().getId(),
                 item.isLocked(),
-                item.isHideChrome());
+                item.isHideChrome(),
+                pageId,
+                pageName,
+                isDefault);
+    }
+
+    private boolean isDefaultSubPage(Page subPage) {
+        return 
subPage.getParentPage().getSubPages().get(0).getId().equals(subPage.getId());
     }
 }

Modified: 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/resources/org/apache/rave/w3c-provider-applicationContext.xml
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/resources/org/apache/rave/w3c-provider-applicationContext.xml?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/resources/org/apache/rave/w3c-provider-applicationContext.xml
 (original)
+++ 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/main/resources/org/apache/rave/w3c-provider-applicationContext.xml
 Fri Oct  5 14:59:18 2012
@@ -47,6 +47,8 @@
     <bean id="wookieWidgetService" 
class="org.apache.rave.provider.w3c.service.impl.WookieWidgetService">
         <constructor-arg name="wookieServerUrl" 
value="${provider.wookie.wookieServerUrl}"/>
         <constructor-arg name="wookieApiKey" 
value="${provider.wookie.wookieApiKey}"/>
+        <constructor-arg name="adminUsername" 
value="${provider.wookie.adminUsername}"/>
+        <constructor-arg name="adminPassword" 
value="${provider.wookie.adminPassword}"/>
     </bean>
 
 </beans>

Modified: 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/test/java/org/apache/rave/provider/w3c/web/renderer/W3cWidgetRendererTest.java
URL: 
http://svn.apache.org/viewvc/rave/branches/model-split/rave-providers/rave-w3c-provider/src/test/java/org/apache/rave/provider/w3c/web/renderer/W3cWidgetRendererTest.java?rev=1394560&r1=1394559&r2=1394560&view=diff
==============================================================================
--- 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/test/java/org/apache/rave/provider/w3c/web/renderer/W3cWidgetRendererTest.java
 (original)
+++ 
rave/branches/model-split/rave-providers/rave-w3c-provider/src/test/java/org/apache/rave/provider/w3c/web/renderer/W3cWidgetRendererTest.java
 Fri Oct  5 14:59:18 2012
@@ -20,14 +20,8 @@
 package org.apache.rave.provider.w3c.web.renderer;
 
 import org.apache.rave.exception.NotSupportedException;
-import org.apache.rave.portal.model.Region;
-import org.apache.rave.portal.model.RegionWidget;
-import org.apache.rave.portal.model.User;
-import org.apache.rave.portal.model.Widget;
-import org.apache.rave.portal.model.impl.RegionImpl;
-import org.apache.rave.portal.model.impl.RegionWidgetImpl;
-import org.apache.rave.portal.model.impl.UserImpl;
-import org.apache.rave.portal.model.impl.WidgetImpl;
+import org.apache.rave.portal.model.*;
+import org.apache.rave.portal.model.impl.*;
 import org.apache.rave.portal.service.UserService;
 import org.apache.rave.portal.service.WidgetProviderService;
 import org.apache.rave.portal.web.renderer.Renderer;
@@ -38,6 +32,8 @@ import org.apache.rave.provider.w3c.serv
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.ArrayList;
+
 import static org.easymock.EasyMock.*;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
@@ -50,7 +46,6 @@ public class W3cWidgetRendererTest {
 
     private static final String VALID_WIDGET_URL = 
"http://example.com/widgets/1";;
     private static final String VALID_WIDGET_INSTANCE_URL = 
"http://example.com/widgetinstances/1";;
-    private static final String REGION_WIDGET_ID = "1";
     private Renderer<RegionWidget> renderer;
     private WidgetProviderService wookieService;
     private UserService userService;
@@ -74,14 +69,30 @@ public class W3cWidgetRendererTest {
 
     @Test
     public void render_valid() {
+        final String REGION_ID = "222";
+        final String REGION_WIDGET_ID = "444";
+        final String VALID_SUBPAGE_ID = "778899";
+        final String VALID_SUBPAGE_NAME = "My Activity";
+        final boolean VALID_IS_DEFAULT_SUBPAGE = true;
+
         User user = new UserImpl("9999", "testUser");
         expect(userService.getAuthenticatedUser()).andReturn(user);
         replay(userService);
-        
+
+        Page page = new PageImpl();
+        page.setSubPages(new ArrayList<Page>());
+        Page subPage = new PageImpl();
+        subPage.setId(VALID_SUBPAGE_ID);
+        subPage.setName(VALID_SUBPAGE_NAME);
+        subPage.setParentPage(page);
+        subPage.setPageType(PageType.SUB_PAGE);
+        page.getSubPages().add(subPage);
+
         W3CWidget w = new W3CWidget();
         w.setType(Constants.WIDGET_TYPE);
         w.setUrl("http://example.com/widgets/1";);
-        Region region = new RegionImpl("1");
+        Region region = new RegionImpl(REGION_ID);
+        region.setPage(subPage);
         RegionWidget rw = new RegionWidgetImpl(REGION_WIDGET_ID);
         rw.setWidget(w);
         rw.setRegion(region);


Reply via email to