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);
