You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by cg...@apache.org on 2012/10/29 04:17:01 UTC

svn commit: r1403150 [1/2] - in /rave/branches/model-split: ./ rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/ rave-components/rave-core/src/main/java/org/apache/rave/portal/service/ rave-components/rave-core/src/main/ja...

Author: cgeer
Date: Mon Oct 29 03:16:59 2012
New Revision: 1403150

URL: http://svn.apache.org/viewvc?rev=1403150&view=rev
Log:
RAVE-834 Merge all from trunk at 1403092

Added:
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/
      - copied from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/BadOmdlXmlFormatException.java
      - copied unchanged from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/BadOmdlXmlFormatException.java
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlConstants.java
      - copied unchanged from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlConstants.java
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlInputAdapter.java
      - copied unchanged from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlInputAdapter.java
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlModelUtils.java
      - copied unchanged from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlModelUtils.java
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlOutputAdapter.java
      - copied, changed from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlOutputAdapter.java
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/package-info.java
      - copied unchanged from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/package-info.java
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/OmdlService.java
      - copied, changed from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/OmdlService.java
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultOmdlService.java
      - copied, changed from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultOmdlService.java
    rave/branches/model-split/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/util/omdl/
      - copied from r1403092, rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/util/omdl/
    rave/branches/model-split/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/util/omdl/OmdlTest.java
      - copied unchanged from r1403092, rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/util/omdl/OmdlTest.java
    rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/tag/ShowStackTraceTag.java
      - copied unchanged from r1403092, rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/tag/ShowStackTraceTag.java
    rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/ShowStackTraceTagTest.java
      - copied unchanged from r1403092, rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/tag/ShowStackTraceTagTest.java
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/usernotfound.jsp
      - copied unchanged from r1403092, rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/usernotfound.jsp
Modified:
    rave/branches/model-split/   (props changed)
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/PageService.java
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/web/renderer/impl/DefaultScriptManager.java
    rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/web/util/PortalPreferenceKeys.java
    rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rest/PageApi.java
    rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rpc/PageApi.java
    rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/ProfileController.java
    rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/util/ControllerUtils.java
    rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/model/PortalPreferenceForm.java
    rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
    rave/branches/model-split/rave-components/rave-web/src/main/resources/META-INF/rave.tld
    rave/branches/model-split/rave-components/rave-web/src/main/resources/org/apache/rave/web-applicationContext.xml
    rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rest/PageApiTest.java
    rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rpc/PageApiTest.java
    rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/ProfileControllerTest.java
    rave/branches/model-split/rave-integration-tests/rave-default-account-tests/src/main/stories/openidLogin.story
    rave/branches/model-split/rave-portal-resources/src/main/resources/messages.properties
    rave/branches/model-split/rave-portal-resources/src/main/resources/messages_es.properties
    rave/branches/model-split/rave-portal-resources/src/main/resources/messages_nl.properties
    rave/branches/model-split/rave-portal-resources/src/main/resources/portal.properties
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/addwidget.jsp
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/addwidget.w3c.jsp
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/admin/preferencedetail.jsp
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/error.jsp
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/mobile_home.jsp
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/page.jsp
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/widget.jsp
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/tags/region_widget.tag
    rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/tiles-defs.xml
    rave/branches/model-split/rave-portal-resources/src/main/webapp/static/css/rave-css.less
    rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave.js
    rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_api.js
    rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_layout.js
    rave/branches/model-split/rave-portal-resources/src/main/webapp/static/script/rave_opensocial.js
    rave/branches/model-split/rave-portal-resources/src/test/javascript/raveSpec.js

Propchange: rave/branches/model-split/
------------------------------------------------------------------------------
  Merged /rave/trunk:r1394121-1403092

Copied: rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlOutputAdapter.java (from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlOutputAdapter.java)
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlOutputAdapter.java?p2=rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlOutputAdapter.java&p1=rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlOutputAdapter.java&r1=1403092&r2=1403150&rev=1403150&view=diff
==============================================================================
--- rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlOutputAdapter.java (original)
+++ rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/util/omdl/OmdlOutputAdapter.java Mon Oct 29 03:16:59 2012
@@ -29,7 +29,11 @@ import javax.xml.bind.annotation.XmlRoot
 import javax.xml.bind.annotation.XmlValue;
 
 import org.apache.rave.portal.model.Page;
+import org.apache.rave.portal.model.User;
 import org.apache.rave.portal.model.Widget;
+import org.apache.rave.portal.service.UserService;
+import org.apache.rave.portal.service.WidgetService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 /**
@@ -40,7 +44,7 @@ import org.springframework.stereotype.Co
  * for more information on the specification.
  * 
  */
-@Component
+//@Component
 @XmlRootElement(name = "workspace")
 @XmlAccessorType(XmlAccessType.NONE)
 public class OmdlOutputAdapter implements OmdlConstants {
@@ -79,7 +83,14 @@ public class OmdlOutputAdapter implement
 
     private List<OmdlWidget> widgetsList;
 
-    public OmdlOutputAdapter(){}
+    private WidgetService widgetService;
+    private UserService userService;
+
+    //@Autowired
+    public OmdlOutputAdapter(WidgetService widgetService, UserService userService){
+        this.widgetService = widgetService;
+        this.userService = userService;
+    }
 
     public void buildModel(Page page, String omdlUrl, String wookieUrl) {
         this.wookieUrl = wookieUrl;
@@ -95,7 +106,7 @@ public class OmdlOutputAdapter implement
         widgetsList = new ArrayList<OmdlWidget>();
         for(int i=0;i<page.getRegions().size(); i++){
             for(int j=0;j<page.getRegions().get(i).getRegionWidgets().size();j++){
-                 Widget widget = page.getRegions().get(i).getRegionWidgets().get(j).getWidget();
+                 Widget widget = widgetService.getWidget(page.getRegions().get(i).getRegionWidgets().get(j).getWidgetId());
                  omdlWidget = new OmdlWidget();
                  omdlWidget.setUrl(widget.getUrl());
                  omdlWidget.setLink(createLinkElement(widget.getType(), widget.getUrl()));
@@ -133,11 +144,12 @@ public class OmdlOutputAdapter implement
 
     private String getCreator(Page page){
         String result="";
-        result = page.getOwner().getDisplayName();
+        User user = userService.getUserById(page.getOwnerId());
+        result = user.getDisplayName();
         if(result == null || result.equals("")){
-            result = page.getOwner().getPreferredName();
+            result = user.getPreferredName();
             if(result == null || result.equals("")){
-                result = page.getOwner().getUsername();
+                result = user.getUsername();
             }
         }
         return result;

Copied: rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/OmdlService.java (from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/OmdlService.java)
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/OmdlService.java?p2=rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/OmdlService.java&p1=rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/OmdlService.java&r1=1403092&r2=1403150&rev=1403150&view=diff
==============================================================================
--- rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/OmdlService.java (original)
+++ rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/OmdlService.java Mon Oct 29 03:16:59 2012
@@ -29,7 +29,7 @@ public interface OmdlService {
      * @param omdlUrl - page url - used in construction of OMDL file
      * @return an OmdlOutputAdapter - a JaxB xml OMDL format
      */
-    OmdlOutputAdapter exportOmdl(long pageId, String omdlUrl);
+    OmdlOutputAdapter exportOmdl(String pageId, String omdlUrl);
     
     /**
      * Import an OMDL xml format file to generate into a page object (with all of its reqionwidgets)

Modified: rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/PageService.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/PageService.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/PageService.java (original)
+++ rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/PageService.java Mon Oct 29 03:16:59 2012
@@ -162,6 +162,16 @@ public interface PageService {
     @PreAuthorize("hasPermission(#pageId, 'org.apache.rave.portal.model.Page', 'update') and " +
                   "hasPermission(#widgetId, 'org.apache.rave.portal.model.Widget', 'read')") 
     RegionWidget addWidgetToPage(String pageId, String widgetId);
+    
+    /**
+     * Creates a new instance of a widget and adds it to the first position of the identified region on the page
+     * @param pageId the id of the page to add the widget to
+     * @param widgetId the {@link org.apache.rave.portal.model.Widget} id to add
+     * @return a valid widget instance
+     */
+    @PreAuthorize("hasPermission(#pageId, 'org.apache.rave.portal.model.Page', 'update') and " +
+                  "hasPermission(#widgetId, 'org.apache.rave.portal.model.Widget', 'read')") 
+    RegionWidget addWidgetToPageRegion(String pageId, String widgetId, String regionId);
 
     /**
      * Deletes the specified widget from the page.
@@ -204,6 +214,16 @@ public interface PageService {
     Page movePageToDefault(String pageId);
 
     /**
+     * Clone the page and then share it with another user (Page is detached from original)
+     * @param pageId - the id of the page in question
+     * @param userId - the userid to add
+     * @param pageName = name of the page
+     * @return true or false whether the user was added
+     */
+    @PreAuthorize("hasPermission(#pageId, 'org.apache.rave.portal.model.Page', 'update')")
+    Boolean clonePageForUser(String pageId, String userId, String pageName);
+
+    /**
      * Add another user to share this page with
      * @param pageId - the id of the page in question
      * @param userId - the userid to add
@@ -211,7 +231,7 @@ public interface PageService {
      */
     @PreAuthorize("hasPermission(#pageId, 'org.apache.rave.portal.model.Page', 'update')")
     Boolean addMemberToPage(String pageId, String userId);
-    
+
     /**
      * Remove an existing user from the page share
      * @param pageId - the id of the page in question

Copied: rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultOmdlService.java (from r1403092, rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultOmdlService.java)
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultOmdlService.java?p2=rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultOmdlService.java&p1=rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultOmdlService.java&r1=1403092&r2=1403150&rev=1403150&view=diff
==============================================================================
--- rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultOmdlService.java (original)
+++ rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultOmdlService.java Mon Oct 29 03:16:59 2012
@@ -38,6 +38,7 @@ import org.apache.rave.portal.model.util
 import org.apache.rave.portal.model.util.omdl.OmdlOutputAdapter;
 import org.apache.rave.portal.service.OmdlService;
 import org.apache.rave.portal.service.PageService;
+import org.apache.rave.portal.service.UserService;
 import org.apache.rave.portal.service.WidgetService;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -67,19 +68,21 @@ public class DefaultOmdlService implemen
 
     private PageService pageService;
     private WidgetService widgetService;
+    private UserService userService;
     
     public DefaultOmdlService(){}
 
     @Autowired
-    public DefaultOmdlService(PageService pageService, WidgetService widgetService){
+    public DefaultOmdlService(PageService pageService, WidgetService widgetService, UserService userService){
         this.pageService = pageService;
         this.widgetService = widgetService;
+        this.userService = userService;
     }
     
     @Override
-    public OmdlOutputAdapter exportOmdl(long pageId, String omdlUrl) {
+    public OmdlOutputAdapter exportOmdl(String pageId, String omdlUrl) {
         Page page = pageService.getPage(pageId);
-        OmdlOutputAdapter omdl = new OmdlOutputAdapter();
+        OmdlOutputAdapter omdl = new OmdlOutputAdapter(widgetService, userService);
         omdl.buildModel(page, omdlUrl, wookieUrl);
         return omdl;
     }
@@ -142,7 +145,7 @@ public class DefaultOmdlService implemen
         return page;
     }
 
-    private void populateRegionWidgets(Page page, List<String> urlList, Long regionId ){
+    private void populateRegionWidgets(Page page, List<String> urlList, String regionId ){
         Widget widget = null;
         for (String widgetUrl : urlList){
             widget = widgetService.getWidgetByUrl(widgetUrl);

Modified: rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java (original)
+++ rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java Mon Oct 29 03:16:59 2012
@@ -258,6 +258,21 @@ public class DefaultPageService implemen
         verifyRegionIsNotLocked(region);
         return createWidgetInstance(widget, region, 0);
     }
+    
+    @Override
+    @Transactional
+    public RegionWidget addWidgetToPageRegion(String pageId, String widgetId, String regionId) {
+        Page page = getFromRepository(pageId, pageRepository);
+        Widget widget = getFromRepository(widgetId, widgetRepository);
+        for(Region region : page.getRegions()){
+            if(region.getId().equals(regionId)){
+                verifyRegionIsNotLocked(region);
+                return createWidgetInstance(widget, region, 0);
+            }
+        }
+        // region not found
+        return null;
+    }
 
     @Override
     @Transactional
@@ -302,6 +317,34 @@ public class DefaultPageService implemen
     }
 
     @Transactional
+    public Boolean clonePageForUser(String pageId, String userId, String pageName) {
+        Widget widget = null;
+        Page page = getPage(pageId);
+        if(pageName == null || pageName.equals("null")){
+            // try to use the original page name if none supplied
+            pageName = page.getName();
+        }
+        Page clonedPage = addNewUserPage(userService.getUserById(userId), pageName, page.getPageLayout().getCode());
+        // populate all the widgets in cloned page from original
+        for(int i=0; i<page.getRegions().size(); i++){
+            for(int j=0; j<page.getRegions().get(i).getRegionWidgets().size(); j++){
+                String widgetId = page.getRegions().get(i).getRegionWidgets().get(j).getWidgetId();
+                widget = widgetRepository.get(widgetId);
+                addWidgetToPageRegion(clonedPage.getId(), widget.getId(), clonedPage.getRegions().get(i).getId());
+            }
+        }
+        // newly created page - so only one pageUser
+        PageUser pageUser = clonedPage.getMembers().get(0);
+        // update status to pending
+        pageUser.setPageStatus(PageInvitationStatus.PENDING);
+        if(pageRepository.save(clonedPage) != null){
+            return Boolean.TRUE;
+        }else{
+            return Boolean.FALSE;
+        }
+    }
+
+    @Transactional
     public Boolean addMemberToPage(String pageId, String userId){
         Page page = getPage(pageId);
         PageUser pageUser = new PageUserImpl();
@@ -320,7 +363,16 @@ public class DefaultPageService implemen
 
     @Transactional
     public Boolean removeMemberFromPage(String pageId, String userId){
+        User user = userService.getAuthenticatedUser();
         Page page = this.getPage(pageId);
+        if(page.getOwnerId().equals(user.getId())){
+            // If I am the owner, this page has been cloned
+            // Declining a cloned page means there is no need to strip
+            // out this users pageUser object, instead remove the page itself
+            // which also removes the pageUser object further down the stack
+            pageRepository.delete(page);
+            return true;
+        }
         PageUser pageUserToRemove = null;
         for(PageUser pageUser : page.getMembers()){
             if(pageUser.getUserId().equals(userId)){

Modified: rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/web/renderer/impl/DefaultScriptManager.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/web/renderer/impl/DefaultScriptManager.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/web/renderer/impl/DefaultScriptManager.java (original)
+++ rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/web/renderer/impl/DefaultScriptManager.java Mon Oct 29 03:16:59 2012
@@ -98,7 +98,8 @@ public class DefaultScriptManager implem
     @Synchronized(discriminator = "'SM_#map.toString()'", id = "#location")
     private static void addMapForLocation(ScriptLocation location, Map<ScriptLocation, Map<String, String>> map) {
         if (!map.containsKey(location)) {
-            map.put(location, new HashMap<String, String>());
+            // use a LinkedHashMap to preserve the order of the script registrations
+            map.put(location, new LinkedHashMap<String, String>());
         }
     }
     

Modified: rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/web/util/PortalPreferenceKeys.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/web/util/PortalPreferenceKeys.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/web/util/PortalPreferenceKeys.java (original)
+++ rave/branches/model-split/rave-components/rave-core/src/main/java/org/apache/rave/portal/web/util/PortalPreferenceKeys.java Mon Oct 29 03:16:59 2012
@@ -30,4 +30,5 @@ public final class PortalPreferenceKeys 
     public static final String INITIAL_WIDGET_STATUS = "initialWidgetStatus";
     public static final String EXTERNAL_MARKETPLACE_URL = "externalMarketplaceUrl";
     public static final String WIDGET_HEIGHT = "defaultWidgetHeight";
+    public static final String SHOW_STACK_TRACE = "showStackTrace";
 }

Modified: rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rest/PageApi.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rest/PageApi.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rest/PageApi.java (original)
+++ rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rest/PageApi.java Mon Oct 29 03:16:59 2012
@@ -21,6 +21,8 @@ package org.apache.rave.portal.web.api.r
 import org.apache.rave.portal.model.Page;
 import org.apache.rave.portal.model.Region;
 import org.apache.rave.portal.model.RegionWidget;
+import org.apache.rave.portal.model.util.omdl.OmdlOutputAdapter;
+import org.apache.rave.portal.service.OmdlService;
 import org.apache.rave.portal.service.PageService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,6 +31,7 @@ import org.springframework.http.HttpStat
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 /**
@@ -41,22 +44,32 @@ import javax.servlet.http.HttpServletRes
 public class PageApi extends AbstractRestApi {
     private Logger logger = LoggerFactory.getLogger(getClass());
     private PageService pageService;
+    private OmdlService omdlService;
     
     @Autowired
-    public PageApi(PageService pageService) {
+    public PageApi(PageService pageService, OmdlService omdlService) {
         this.pageService = pageService;
+        this.omdlService = omdlService;
     }       
           
-    @RequestMapping(value = "{pageId}", method = RequestMethod.DELETE)    
+    @RequestMapping(value = "{pageId}", method = RequestMethod.DELETE)
     public void deletePage(@PathVariable String pageId, HttpServletResponse response) {
-        logger.debug("DELETE received for /api/rest/page/" + pageId);                              
-        pageService.deletePage(pageId);                               
+        logger.debug("DELETE received for /api/rest/page/" + pageId);
+        pageService.deletePage(pageId);
         
         // send a 204 back for success since there is no content being returned
         response.setStatus(HttpStatus.NO_CONTENT.value());
     }
 
     @ResponseBody
+    @RequestMapping(value = "{pageId}/omdl", method = RequestMethod.GET)
+    public OmdlOutputAdapter getOmdl(@PathVariable String pageId, HttpServletRequest request, HttpServletResponse response) {
+        logger.debug("GET received for /api/rest/page/" + pageId + "/omdl");
+        response.setHeader("Content-Disposition", "attachment; filename=\"rave-omdl-page-" + pageId + ".xml\"");
+        return omdlService.exportOmdl(pageId, request.getRequestURL().toString());
+    }
+
+    @ResponseBody
     @RequestMapping(value = "{pageId}", method = RequestMethod.GET)
     public Page getPage(@PathVariable String pageId, @RequestParam(required=false) boolean export) {
         logger.debug("GET received for /api/rest/page/" + pageId);        

Modified: rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rpc/PageApi.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rpc/PageApi.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rpc/PageApi.java (original)
+++ rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rpc/PageApi.java Mon Oct 29 03:16:59 2012
@@ -18,15 +18,27 @@
  */
 package org.apache.rave.portal.web.api.rpc;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
 import org.apache.rave.portal.model.Page;
 import org.apache.rave.portal.model.Region;
 import org.apache.rave.portal.model.RegionWidget;
+import org.apache.rave.portal.service.OmdlService;
 import org.apache.rave.portal.service.PageService;
 import org.apache.rave.portal.web.api.rpc.model.RpcOperation;
 import org.apache.rave.portal.web.api.rpc.model.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
 
 /**
  * Defines RPC operations for a Page or its components
@@ -35,11 +47,14 @@ import org.springframework.web.bind.anno
 @RequestMapping(value = "/api/rpc/page/*")
 public class PageApi {
 
+    private Logger logger = LoggerFactory.getLogger(getClass());
     private final PageService pageService;
+    private OmdlService omdlService;
 
     @Autowired
-    public PageApi(PageService pageService) {
+    public PageApi(PageService pageService, OmdlService omdlService) {
         this.pageService = pageService;
+        this.omdlService = omdlService;
     }
 
     /**
@@ -69,6 +84,36 @@ public class PageApi {
     }
 
     /**
+     * Adds a widget to the given page region
+     *
+     * @param pageId
+     *            the ID of the {@link org.apache.rave.portal.model.Page} to add
+     *            the widget to
+     * @param widgetId
+     *            the ID of the {@link org.apache.rave.portal.model.Widget} to
+     *            add do the page
+     * @param regionId
+     *            the ID of the {@link org.apache.rave.portal.model.Region} to
+     *            add the the widget to
+     * @return a {@link RpcOperation} containing the new widget instance (
+     *         {@link org.apache.rave.portal.model.RegionWidget }) or any errors
+     *         encountered while performing the RPC operation
+     */
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.POST, value = "{pageId}/widget/add/region/{regionId}")
+    public RpcResult<RegionWidget> addWidgetToPageRegion(
+            @PathVariable final String pageId, @RequestParam final String widgetId, @PathVariable final String regionId) {
+
+        return new RpcOperation<RegionWidget>() {
+            @Override
+            public RegionWidget execute() {
+                return pageService.addWidgetToPageRegion(pageId, widgetId, regionId);
+            }
+        }.getResult();
+    }
+    
+
+    /**
      * Moves a widget to a new location
      * <p/>
      * Moves can take place within a region, region to region, or between pages
@@ -218,6 +263,17 @@ public class PageApi {
     }
 
     @ResponseBody
+    @RequestMapping(value = "{pageId}/clone", method = RequestMethod.POST)
+    public RpcResult<Boolean> clonePageForUser(@PathVariable final String pageId, @RequestParam final String userId, @RequestParam final String pageName) {
+        return new RpcOperation<Boolean>() {
+             @Override
+             public Boolean execute() {
+               return pageService.clonePageForUser(pageId, userId, pageName);
+             }
+        }.getResult();
+    }
+
+    @ResponseBody
     @RequestMapping(value = "{pageId}/addmember", method = RequestMethod.POST)
     public RpcResult<Boolean> addMemberToPage(@PathVariable final String pageId, @RequestParam final String userId) {
         return new RpcOperation<Boolean>() {
@@ -260,4 +316,18 @@ public class PageApi {
              }
         }.getResult();
     }
+
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.POST, value = "import/omdl")
+    public RpcResult<Page> importPage(HttpServletRequest request, final HttpServletResponse response,
+            @RequestParam final String pageName) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        final MultipartFile multipartFile = multipartRequest.getFile("omdlFile");
+        return new RpcOperation<Page>() {
+             @Override
+             public Page execute() {
+               return omdlService.importOmdl(multipartFile, pageName);
+             }
+        }.getResult();
+    }
 }
\ No newline at end of file

Modified: rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/ProfileController.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/ProfileController.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/ProfileController.java (original)
+++ rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/ProfileController.java Mon Oct 29 03:16:59 2012
@@ -32,6 +32,7 @@ import org.apache.rave.portal.web.util.V
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.ModelMap;
@@ -67,24 +68,17 @@ public class ProfileController {
 	 */
 	@RequestMapping(value = {"/{username:.*}"}, method = RequestMethod.GET)
 	public String viewProfileByUsername(@PathVariable String username, ModelMap model, @RequestParam(required = false) String referringPageId) {
-		logger.debug("Viewing person profile for: " + username);
-		User user = userService.getUserByUsername(username);
-        Page personProfilePage = pageService.getPersonProfilePage(user.getId());
-        addAttributesToModel(model, user, referringPageId);
-        model.addAttribute(ModelKeys.PAGE, personProfilePage);
-        List<Widget> widgets = new ArrayList<Widget>();
-        if (personProfilePage.getRegions() != null) {
-            for(Region region : personProfilePage.getRegions()) {
-                for (RegionWidget regionWidget : region.getRegionWidgets()) {
-                    widgets.add(widgetService.getWidget(regionWidget.getWidgetId()));
-                }
-            }
+        User user = null;
+        try{
+            user = userService.getUserByUsername(username);
+            logger.debug("Viewing person profile for: " + user.getUsername());
+            return viewProfileCommon(user, model, referringPageId);
+        }catch(Exception e){
+            addAttributesToModel(model, user, referringPageId);
+            String view = ViewNames.USER_NOT_FOUND;
+            addNavItemsToModel(view, model, referringPageId, user, null);
+            return view;
         }
-        model.addAttribute(ModelKeys.WIDGETS, widgets);
-		String view =  ViewNames.getPersonPageView(personProfilePage.getPageLayout().getCode());
-        List<Person> friendRequests = userService.getFriendRequestsReceived(username);
-        addNavItemsToModel(view, model, referringPageId, user, friendRequests);
-        return view;
 	}
 	  /**
 		 * Views the main page of another user's profile
@@ -96,26 +90,28 @@ public class ProfileController {
 		 */
 	@RequestMapping(value = {"/id/{userid:.*}"}, method = RequestMethod.GET)
 	public String viewProfile(@PathVariable String userid, ModelMap model, @RequestParam(required = false) String referringPageId) {
-		User user = userService.getUserById(userid);
-		logger.debug("Viewing person profile for: " + user.getUsername());
-		
-		Page personProfilePage = pageService.getPersonProfilePage(user.getId());
+        User user = null;
+        try{
+            user = userService.getUserById(userid);
+            logger.debug("Viewing person profile for: " + user.getUsername());
+            return viewProfileCommon(user, model, referringPageId);
+        }catch (Exception e){
+            addAttributesToModel(model, user, referringPageId);
+            String view = ViewNames.USER_NOT_FOUND;
+            addNavItemsToModel(view, model, referringPageId, user, null);
+            return view;
+        }
+	}
+
+    private String viewProfileCommon(User user, ModelMap model, String referringPageId){
+        Page personProfilePage = pageService.getPersonProfilePage(user.getId());
         addAttributesToModel(model, user, referringPageId);
         model.addAttribute(ModelKeys.PAGE, personProfilePage);
-        List<Widget> widgets = new ArrayList<Widget>();
-        if (personProfilePage.getRegions() != null) {
-            for(Region region : personProfilePage.getRegions()) {
-                for (RegionWidget regionWidget : region.getRegionWidgets()) {
-                    widgets.add(widgetService.getWidget(regionWidget.getWidgetId()));
-                }
-            }
-        }
-        model.addAttribute(ModelKeys.WIDGETS, widgets);
-		String view =  ViewNames.getPersonPageView(personProfilePage.getPageLayout().getCode());
+        String view =  ViewNames.getPersonPageView(personProfilePage.getPageLayout().getCode());
         List<Person> friendRequests = userService.getFriendRequestsReceived(user.getUsername());
         addNavItemsToModel(view, model, referringPageId, user, friendRequests);
         return view;
-	}
+    }
 
 	/**
 	 * Updates the user's personal information
@@ -162,12 +158,15 @@ public class ProfileController {
         String refPageId = referringPageId != null ? referringPageId : "";
         final NavigationMenu topMenu = new NavigationMenu("topnav");
 
-        NavigationItem friendRequestItems = new NavigationItem("page.profile.friend.requests", String.valueOf(friendRequests.size()) , "#");
-        for(Person request : friendRequests) {
-        	NavigationItem childItem = new NavigationItem((request.getDisplayName()!=null && !request.getDisplayName().isEmpty())? request.getDisplayName() : request.getUsername(), request.getUsername(), "#");
-        	friendRequestItems.addChildNavigationItem(childItem);
+        if(friendRequests != null){
+            NavigationItem friendRequestItems = new NavigationItem("page.profile.friend.requests", String.valueOf(friendRequests.size()) , "#");
+            for(Person request : friendRequests) {
+                NavigationItem childItem = new NavigationItem((request.getDisplayName()!=null && !request.getDisplayName().isEmpty())? request.getDisplayName() : request.getUsername(), request.getUsername(), "#");
+                friendRequestItems.addChildNavigationItem(childItem);
+            }
+
+            topMenu.addNavigationItem(friendRequestItems);
         }
-    	topMenu.addNavigationItem(friendRequestItems);
     	topMenu.getNavigationItems().addAll((ControllerUtils.getTopMenu(view, refPageId, user, false).getNavigationItems()));
 
     	model.addAttribute(topMenu.getName(), topMenu);

Modified: rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/util/ControllerUtils.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/util/ControllerUtils.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/util/ControllerUtils.java (original)
+++ rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/util/ControllerUtils.java Mon Oct 29 03:16:59 2012
@@ -96,7 +96,7 @@ public class ControllerUtils {
 
             NavigationItem logout = getLogoutItem();
             menu.addNavigationItem(logout);
-        } else if (view.startsWith(ViewNames.PERSON_PROFILE)) {
+        } else if (view.startsWith(ViewNames.PERSON_PROFILE) || view.startsWith(ViewNames.USER_NOT_FOUND)) {
             NavigationItem back = getBackItem(referringPageId);
             menu.addNavigationItem(back);
 
@@ -105,7 +105,8 @@ public class ControllerUtils {
 
             NavigationItem logout = getLogoutItem();
             menu.addNavigationItem(logout);
-        } else if (view.startsWith(ViewNames.ADD_WIDGET_FORM) || view.startsWith(ViewNames.WIDGET)) {
+        }
+        else if (view.startsWith(ViewNames.ADD_WIDGET_FORM) || view.startsWith(ViewNames.WIDGET)) {
             if(view.equals(ViewNames.WIDGET_MARKETPLACE)){
                 NavigationItem addWidget = new NavigationItem("page.widget.backToMarketplace", null, "/app/marketplace?referringPageId=" + referringPageId);
                 menu.addNavigationItem(addWidget);

Modified: rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/model/PortalPreferenceForm.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/model/PortalPreferenceForm.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/model/PortalPreferenceForm.java (original)
+++ rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/model/PortalPreferenceForm.java Mon Oct 29 03:16:59 2012
@@ -36,7 +36,8 @@ public class PortalPreferenceForm {
     public static final String DEFAULT_JAVASCRIPT_DEBUG_MODE = "1";
     public static final String DEFAULT_WIDGET_HEIGHT = "250";
     public static final String DEFAULT_INITIAL_WIDGET_STATUS = "PREVIEW";
-    public static final String DEFAULT_EXTERNAL_MARKETPLACE_URL = "";    
+    public static final String DEFAULT_EXTERNAL_MARKETPLACE_URL = "";
+    public static final String DEFAULT_SHOW_STACK_TRACE ="0";
 
 
     private Map<String, PortalPreference> preferenceMap;
@@ -66,6 +67,9 @@ public class PortalPreferenceForm {
         if(getDefaultWidgetHeight() == null){
             preferenceMap.put(WIDGET_HEIGHT, new PortalPreferenceImpl(WIDGET_HEIGHT, DEFAULT_WIDGET_HEIGHT));
         }
+        if(getShowStackTrace() == null){
+            preferenceMap.put(SHOW_STACK_TRACE, new PortalPreferenceImpl(SHOW_STACK_TRACE, DEFAULT_SHOW_STACK_TRACE));
+        }
     }
     
     public PortalPreference getExternalMarketplaceUrl() {
@@ -96,6 +100,14 @@ public class PortalPreferenceForm {
         preferenceMap.put(WIDGET_HEIGHT, widgetHeight);
     }
 
+    public PortalPreference getShowStackTrace(){
+        return preferenceMap.get(SHOW_STACK_TRACE);
+    }
+
+    public void setShowStackTrace(PortalPreference showStackTrace){
+        preferenceMap.put(SHOW_STACK_TRACE, showStackTrace);
+    }
+
     public PortalPreference getTitleSuffix() {
         return preferenceMap.get(TITLE_SUFFIX);
     }

Modified: rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java (original)
+++ rave/branches/model-split/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java Mon Oct 29 03:16:59 2012
@@ -38,6 +38,7 @@ public final class ViewNames {
     public static final String NEW_ACCOUNT = USER_PREFIX + "newaccount";
     public static final String USER_PROFILE = USER_PREFIX + "userProfile";
     public static final String PERSON_PROFILE = USER_PREFIX + "personProfile";
+    public static final String USER_NOT_FOUND = USER_PREFIX + "usernotfound";
     public static final String ADD_WIDGET_MARKETPLACE = ADD_WIDGET_FORM + ".marketplace";
     public static final String ADD_WIDGET_W3C = ADD_WIDGET_FORM + ".w3c";
 
@@ -79,4 +80,4 @@ public final class ViewNames {
     public static String getPersonPageView(String layoutName) {
         return new StringBuilder(PERSON_PROFILE).append('.').append(layoutName).toString();
     }
-}
\ No newline at end of file
+}

Modified: rave/branches/model-split/rave-components/rave-web/src/main/resources/META-INF/rave.tld
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/main/resources/META-INF/rave.tld?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/main/resources/META-INF/rave.tld (original)
+++ rave/branches/model-split/rave-components/rave-web/src/main/resources/META-INF/rave.tld Mon Oct 29 03:16:59 2012
@@ -125,4 +125,10 @@
         <tag-class>org.apache.rave.portal.web.tag.JavaScriptDebugModeTag</tag-class>
         <body-content>JSP</body-content>
     </tag>
+    <tag>
+        <description>Renders the value of the ShowStackTrace portal preference</description>
+        <name>render-show-stack-trace</name>
+        <tag-class>org.apache.rave.portal.web.tag.ShowStackTraceTag</tag-class>
+        <body-content>JSP</body-content>
+    </tag>
 </taglib>

Modified: rave/branches/model-split/rave-components/rave-web/src/main/resources/org/apache/rave/web-applicationContext.xml
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/main/resources/org/apache/rave/web-applicationContext.xml?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/main/resources/org/apache/rave/web-applicationContext.xml (original)
+++ rave/branches/model-split/rave-components/rave-web/src/main/resources/org/apache/rave/web-applicationContext.xml Mon Oct 29 03:16:59 2012
@@ -33,5 +33,12 @@
     -->
     <context:component-scan base-package="org.apache.rave.portal.web.renderer"/>
     <context:component-scan base-package="org.apache.rave.portal.web.validator"/>
-
+    
+    <!-- Configure the multipart resolver -->
+    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
+        <!-- one of the properties available; the maximum file size in bytes -->
+        <property name="maxUploadSize" value="100000"/>
+    </bean>
+    <bean id="fileUploadController" class="org.apache.rave.portal.web.api.rpc.PageApi">
+    </bean>
 </beans>
\ No newline at end of file

Modified: rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rest/PageApiTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rest/PageApiTest.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rest/PageApiTest.java (original)
+++ rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rest/PageApiTest.java Mon Oct 29 03:16:59 2012
@@ -22,6 +22,7 @@ import org.apache.rave.portal.model.impl
 import org.apache.rave.portal.model.*;
 import org.springframework.http.HttpStatus;
 import org.springframework.mock.web.MockHttpServletResponse;
+import org.apache.rave.portal.service.OmdlService;
 import org.apache.rave.portal.service.PageService;
 import org.junit.Before;
 import org.junit.Test;
@@ -39,6 +40,7 @@ import static org.hamcrest.CoreMatchers.
 public class PageApiTest {
     private PageApi pageApi;
     private PageService pageService;
+    private OmdlService omdlService;
     private MockHttpServletResponse response;
 
     private final String PAGE_ID = "1";
@@ -47,7 +49,8 @@ public class PageApiTest {
     public void setUp() {
         response = new MockHttpServletResponse();
         pageService = createMock(PageService.class);
-        pageApi = new PageApi(pageService);
+        omdlService = createMock(OmdlService.class);
+        pageApi = new PageApi(pageService, omdlService);
     }
 
     @Test

Modified: rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rpc/PageApiTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rpc/PageApiTest.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rpc/PageApiTest.java (original)
+++ rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rpc/PageApiTest.java Mon Oct 29 03:16:59 2012
@@ -23,6 +23,7 @@ import org.apache.rave.portal.model.Page
 import org.apache.rave.portal.model.Region;
 import org.apache.rave.portal.model.RegionWidget;
 import org.apache.rave.portal.model.impl.*;
+import org.apache.rave.portal.service.OmdlService;
 import org.apache.rave.portal.service.PageService;
 import org.apache.rave.portal.web.api.rpc.model.RpcResult;
 import org.junit.Before;
@@ -39,6 +40,7 @@ public class PageApiTest {
     private final String INTERNAL_ERROR_MESSAGE = "Internal Error";
     private PageApi pageApi;
     private PageService pageService;
+    private OmdlService omdlService;
     private final String REGION_WIDGET_ID = "35";
     private final int NEW_POSITION = 3;
     private final String PAGE_ID = "20";
@@ -50,7 +52,8 @@ public class PageApiTest {
     @Before
     public void setup() {
         pageService = createMock(PageService.class);
-        pageApi = new PageApi(pageService);
+        omdlService = createMock(OmdlService.class);
+        pageApi = new PageApi(pageService, omdlService);
 
         page = new PageImpl(PAGE_ID);
         page2 = new PageImpl(PAGE_2_ID);

Modified: rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/ProfileControllerTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/ProfileControllerTest.java?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/ProfileControllerTest.java (original)
+++ rave/branches/model-split/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/ProfileControllerTest.java Mon Oct 29 03:16:59 2012
@@ -98,7 +98,7 @@ public class ProfileControllerTest {
 		//creating a mock user
 		final UserImpl user = new UserImpl();
 		final ModelMap model = new ModelMap();
-		final int modelSize = 5;
+		final int modelSize = 4;
 		final String username="canonical";
         user.setUsername(username);
         user.setId(USER_ID);
@@ -139,7 +139,7 @@ public class ProfileControllerTest {
 		//creating a mock user
 		final UserImpl user = new UserImpl();
 		final ModelMap model = new ModelMap();
-		final int modelSize = 5;
+		final int modelSize = 4;
 		final String username="canonical";
         user.setUsername(username);
         user.setId(USER_ID);
@@ -175,7 +175,7 @@ public class ProfileControllerTest {
 		verify(userService, pageService);
 	}
 
-    @Test(expected = UsernameNotFoundException.class)
+    @Test
     public void viewPersonProfile_invalidUser() {
         //creating a mock user
         final User user = null;
@@ -191,7 +191,8 @@ public class ProfileControllerTest {
 
         replay(userService, pageService);
 
-        profileController.viewProfileByUsername(username, model, null);
+        String view = profileController.viewProfileByUsername(username, model, null);
+        assertThat(view, is(ViewNames.USER_NOT_FOUND));
 
         verify(userService, pageService);
     }

Modified: rave/branches/model-split/rave-integration-tests/rave-default-account-tests/src/main/stories/openidLogin.story
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-integration-tests/rave-default-account-tests/src/main/stories/openidLogin.story?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-integration-tests/rave-default-account-tests/src/main/stories/openidLogin.story (original)
+++ rave/branches/model-split/rave-integration-tests/rave-default-account-tests/src/main/stories/openidLogin.story Mon Oct 29 03:16:59 2012
@@ -30,6 +30,6 @@ Then I see the login page
 When I provide my OpenID identity "http://rave2011.myopenid.com/"
 Then I see the OpenID authentication page
 When I provide my OpenID password "rave2011"
-Then I see the message "Hello http://rave2011.myopenid.com/, welcome to Rave!" for the user "http://rave2011.myopenid.com/"
+Then I see the message "Hello rave2011.myopenid.com, welcome to Rave!" for the user "rave2011.myopenid.com"
 When I log out
 Then I see the Rave login page

Modified: rave/branches/model-split/rave-portal-resources/src/main/resources/messages.properties
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/resources/messages.properties?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/resources/messages.properties (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/resources/messages.properties Mon Oct 29 03:16:59 2012
@@ -50,6 +50,8 @@ page.error.details=technical details
 page.general.back=Back to Rave
 page.general.browse=Browse
 page.general.addnewpage=Add a New Page
+page.general.importnewpage=Import Page
+page.general.exportpage=Export Page
 page.general.close=Close
 page.general.confirmpassword=Confirm password:
 page.general.deletepage=Delete Page
@@ -213,6 +215,7 @@ page.profile.save=Save
 page.profile.cancel=Cancel
 
 page.personProfile.title={0}''s Profile
+page.personProfile.userNotFound.title=Person Not Found
 page.personProfile.personal.info=Personal Information
 page.personProfile.first.name=First Name:
 page.personProfile.last.name=Last Name:
@@ -235,6 +238,7 @@ page.personProfile.edit=Edit
 page.personProfile.edit.option=Edit your profile here
 page.personProfile.save=Save
 page.personProfile.cancel=Cancel
+page.personProfile.userNotFound=The user's page you were looking for could not be found.
 
 admin.home.title=Rave admin interface
 admin.home.shorttitle=Home
@@ -283,10 +287,13 @@ admin.preferencedetail.externalMarketpla
 admin.preferencedetail.titleSuffix=Page title suffix
 admin.preferencedetail.pageSize=Number of items per page (list)
 admin.preferencedetail.defaultWidgetHeight=Default widget height
+admin.preferencedetail.showStackTrace=Show stack trace on error pages
 admin.preferencedetail.pageSize.malformed=Enter a whole number greater than 0
 admin.preferencedetail.javaScriptDebugMode=JavaScript Debug Mode
 admin.preferencedetail.javaScriptDebugMode.true=Enabled
 admin.preferencedetail.javaScriptDebugMode.false=Disabled
+admin.preferencedetail.showStackTrace.true=Enabled
+admin.preferencedetail.showStackTrace.false=Disabled
 admin.preferencedetail.updateButton=Update preferences
 admin.preferencedetail.action.update.success=Preferences have been updated
 admin.preferencedetail.goback=\u00ab Back to overview
@@ -347,6 +354,8 @@ widget.chrome.toggle=Collapse/Restore Wi
 widget.chrome.disabled=This widget is currently disabled
 
 widget.menu.about=About this Widget
+widget.menu.comment=Comment on this Widget
+widget.menu.rate=Rate this Widget
 widget.menu.delete=Delete Widget
 widget.menu.editprefs=Edit Preferences
 widget.menu.maximize=Maximize
@@ -357,6 +366,7 @@ widget.menu.title=Widget Actions
 sharing.page.confirm.message={0} has shared this page with you. Do you wish to accept and add this page to your collection?
 sharing.page.tab.icon.tip.from=This page has been shared with you by {0}
 sharing.page.tab.icon.tip.to=You have shared this page with other users
+cloned.page.confirm.message=Another user has made a copy of his/her page and shared it with you. Do you wish to accept and add this page to your collection?
 
 #######################################################################################################################
 # messages available to the client javascript via the MessageBundleController must start with "_rave_client."
@@ -413,4 +423,9 @@ _rave_client.failed.add.from.marketplace
 _rave_client.success.add.from.marketplace=Widget was successfully added to the Rave Widget store
 _rave_client.person.profile.friend.requests.none=No Friend Requests
 _rave_client.person.profile.friend.requests=Friend Requests
+_rave_client.import.page.not.supported=Your browser does not support this operation
+_rave_client.confirm.clone.page=Are you sure you wish to create a copy of this page and share it with this user?
+_rave_client.success.clone.page=Cloned page was added to the users collection
+_rave_client.page.clone.dialog.title=Clone
+_rave_client.page.clone.dialog.detail=New
 page.general.status=Relationship Status\:

Modified: rave/branches/model-split/rave-portal-resources/src/main/resources/messages_es.properties
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/resources/messages_es.properties?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/resources/messages_es.properties (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/resources/messages_es.properties Mon Oct 29 03:16:59 2012
@@ -52,6 +52,8 @@ page.error.details=Detalles t\u00E9cnico
 page.general.back=Volver a Rave
 page.general.browse=Navegue
 page.general.addnewpage=Agregue una nueva pagina
+page.general.importnewpage=Pagina de importacion
+page.general.exportpage=Pagina de exportacion
 page.general.close=Cerrar
 page.general.confirmpassword=Confirme su contrase\u00F1a
 page.general.deletepage=Eliminar pagina
@@ -219,6 +221,7 @@ page.profile.save=Guardar
 page.profile.cancel=Cancelar
 
 page.personProfile.title=Perfil de {0}
+page.personProfile.userNotFound.title=Persona no encontrada
 page.personProfile.personal.info=Informacion Personal
 page.personProfile.first.name=Nombre(s)\:
 page.personProfile.last.name=Apellido(s)\:
@@ -241,6 +244,7 @@ page.personProfile.edit=Editar
 page.personProfile.edit.option=Edite su perfil
 page.personProfile.save=Guardar
 page.personProfile.cancel=Cancelar
+page.personProfile.userNotFound=Página del usuario que estaba buscando no se pudo encontrar.
 
 admin.home.title=Interfaz de administraci\u00F3n Rave
 admin.home.shorttitle=Inicio
@@ -284,11 +288,14 @@ admin.preferences.edit=Editar preferenci
 admin.preferencedetail.title=Interfaz de administraci\u00F3n Rave - Preferencias
 admin.preferencedetail.titleSuffix=Sufijo del titulo de la pagina
 admin.preferencedetail.defaultWidgetHeight=Altura predeterminada Widget
+admin.preferencedetail.showStackTrace=Mostrar seguimiento de pila en las páginas de error
 admin.preferencedetail.pageSize=Numero de items por pagina (lista)
 admin.preferencedetail.pageSize.malformed=Entre un numero valido superior a 0
 admin.preferencedetail.javaScriptDebugMode=Modo de Debug de JavaScript
 admin.preferencedetail.javaScriptDebugMode.true=Habilitado
 admin.preferencedetail.javaScriptDebugMode.false=Deshabilitado
+admin.preferencedetail.showStackTrace.true=Habilitado
+admin.preferencedetail.showStackTrace.false=Deshabilitado
 admin.preferencedetail.updateButton=Actualizar preferencias
 admin.preferencedetail.action.update.success=Las preferencias han sido actualizadas
 admin.preferencedetail.goback=u00AB Volver a la vista general
@@ -362,6 +369,7 @@ widget.menu.title=Acciones de Widget
 
 sharing.page.tab.icon.tip.from=Esta pagina ha sido compartida con usted por {0}.
 sharing.page.tab.icon.tip.to=Usted ha compartido esta pagina con otros usuarios
+cloned.page.confirm.message=Otro usuario ha realizado una copia de su su / page y lo compartio con usted. Desea aceptar y anadir esta pagina a su coleccion?
 
 #######################################################################################################################
 # todo lo relacionado con javascript mediante el MessageBundleController debe comenzar con "_rave_client."
@@ -422,4 +430,9 @@ _rave_client.common.friend.status=Amista
 _rave_client.common.cancel.request=Cancelar solicitud
 _rave_client.person.profile.friend.requests=Solicitudes de Amistad
 _rave_client.person.profile.friend.requests.none=No hay solicitudes de amistad
+_rave_client.import.page.not.supported=Su navegador no soporta esta operacion
+_rave_client.confirm.clone.page=Esta seguro que desea crear una copia de esta pagina y compartala con este usuario?
+_rave_client.success.clone.page=Pagina clonado fue anadido a la coleccion de usuarios
+_rave_client.page.clone.dialog.title=Clonar
+_rave_client.page.clone.dialog.detail=nuevo
 page.profile.friend.requests=Solicitudes de Amistad

Modified: rave/branches/model-split/rave-portal-resources/src/main/resources/messages_nl.properties
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/resources/messages_nl.properties?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/resources/messages_nl.properties (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/resources/messages_nl.properties Mon Oct 29 03:16:59 2012
@@ -54,6 +54,8 @@ page.error.details=Technische details
 page.general.back=Terug naar Rave
 page.general.browse=Blader
 page.general.addnewpage=Voeg een nieuwe pagina toe
+page.general.importnewpage=Pagina importeren
+page.general.exportpage=Pagina exporteren
 page.general.close=Dichtdoen
 page.general.confirmpassword=Bevestig wachtwoord:
 page.general.deletepage=Verwijder pagina
@@ -222,6 +224,7 @@ page.profile.save=Bewaar
 page.profile.cancel=Annuleer
 
 page.personProfile.title=Profiel van {0}
+page.personProfile.userNotFound.title=Persoon niet gevonden
 page.personProfile.personal.info=Persoonsgegevens
 page.personProfile.first.name=Voornaam:
 page.personProfile.last.name=Achternaam:
@@ -244,6 +247,7 @@ page.personProfile.edit=Bewerk
 page.personProfile.edit.option=Bewerk uw profiel hier
 page.personProfile.save=Bewaar
 page.personProfile.cancel=Annuleer
+page.personProfile.userNotFound=De gebruiker pagina die u zocht kon niet worden gevonden.
 
 admin.home.title=Rave admin interface
 admin.home.shorttitle=Home
@@ -289,9 +293,12 @@ admin.preferencedetail.titleSuffix=Toevo
 admin.preferencedetail.pageSize=Aantal items per pagina (lijst)
 admin.preferencedetail.pageSize.malformed=Voer een geheel getal in groter dan 0
 admin.preferencedetail.defaultWidgetHeight=Standaard widget hoogte
+admin.preferencedetail.showStackTrace=Toon stack trace op foutpagina's
 admin.preferencedetail.javaScriptDebugMode=JavaScript Debug Mode
 admin.preferencedetail.javaScriptDebugMode.true=Ingeschakeld
 admin.preferencedetail.javaScriptDebugMode.false=Uitgeschakeld
+admin.preferencedetail.showStackTrace.true=Ingeschakeld
+admin.preferencedetail.showStackTrace.false=Uitgeschakeld
 admin.preferencedetail.updateButton=Wijzig voorkeuren
 admin.preferencedetail.action.update.success=De voorkeuren zijn bijgewerkt
 admin.preferencedetail.goback=\u00AB Terug naar overzicht
@@ -362,6 +369,7 @@ widget.menu.title=Widget acties
 sharing.page.confirm.message={0} heeft een pagina met jou gedeeld. Wil je deze gedeelde pagina accepteren en toevoegen?
 sharing.page.tab.icon.tip.from=Deze pagina is met jou gedeeld door {0}.
 sharing.page.tab.icon.tip.to=U hebt deze pagina met andere gebruikers gedeeld
+cloned.page.confirm.message=Een andere gebruiker heeft een kopie van zijn / haar pagina en gedeeld met je. Wilt u accepteren en deze pagina toe te voegen aan uw collectie?
 
 #######################################################################################################################
 # boodschappen ter beschikking van de opdrachtgever javascript via de MessageBundleController moet beginnen met "_rave_client."
@@ -426,3 +434,8 @@ _rave_client.failed.add.from.marketplace
 _rave_client.success.add.from.marketplace=Widget is toegevoegd aan de Rave Widgetwinkel
 _rave_client.person.profile.friend.requests=Vriendschapsverzoeken
 _rave_client.person.profile.friend.requests.none=Geen vriendschapsverzoeken
+_rave_client.import.page.not.supported=Uw browser biedt geen ondersteuning voor deze bewerking
+_rave_client.confirm.clone.page=Weet u zeker dat u een kopie van deze pagina te maken en te delen met deze gebruiker?
+_rave_client.success.clone.page=Gekloonde pagina werd toegevoegd aan de gebruikers verzamelen
+_rave_client.page.clone.dialog.title=nieuw
+_rave_client.page.clone.dialog.detail=kloon

Modified: rave/branches/model-split/rave-portal-resources/src/main/resources/portal.properties
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/resources/portal.properties?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/resources/portal.properties (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/resources/portal.properties Mon Oct 29 03:16:59 2012
@@ -85,4 +85,6 @@ portal.user.account.needapproval=false
 portal.user.account.admin.email=
 portal.user.account.admin.subject=Rave User Approval
 portal.user.account.admin.template=admin_approval.ftl
-portal.mail.service.loginpage=http://localhost:8080/portal/
\ No newline at end of file
+portal.mail.service.loginpage=http://localhost:8080/portal/
+# Enable/disable omdl import and export in UI
+portal.export.ui.enable=false
\ No newline at end of file

Modified: rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql Mon Oct 29 03:16:59 2012
@@ -1123,6 +1123,13 @@ values (@next_portal_preference_id, 'def
 INSERT INTO portal_preference_values
 values (@next_portal_preference_id, '250');
 UPDATE RAVE_PORTAL_SEQUENCES SET seq_count = (seq_count + 1) WHERE seq_name = @portal_preference_seq;
+
+set @next_portal_preference_id = (SELECT seq_count FROM RAVE_PORTAL_SEQUENCES WHERE seq_name = @portal_preference_seq);
+INSERT INTO portal_preference (entity_id, preference_key)
+values (@next_portal_preference_id, 'showStackTrace');
+INSERT INTO portal_preference_values
+values (@next_portal_preference_id, '0');
+UPDATE RAVE_PORTAL_SEQUENCES SET seq_count = (seq_count + 1) WHERE seq_name = @portal_preference_seq;
 -- end portal preferences
 
 -- category

Modified: rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/addwidget.jsp
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/addwidget.jsp?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/addwidget.jsp (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/addwidget.jsp Mon Oct 29 03:16:59 2012
@@ -49,29 +49,29 @@
             </div>
             
             <form:hidden path="type" value="OpenSocial"/>
-
-            <a href="#" class="btn btn-primary"
-               id="fetchMetadataButton"
-               onclick="rave.api.rpc.getWidgetMetadata({
-                                url: $('#url').get(0).value,
-                                providerType: 'OpenSocial',
-                                successCallback: function(result) {
-                                    var widget = result.result;
-                                    $('#title').val(widget.title);
-                                    $('#description').val(widget.description);
-                                    $('#thumbnailUrl').val(widget.thumbnailUrl);
-                                    $('#screenshotUrl').val(widget.screenshotUrl);
-                                    $('#titleUrl').val(widget.titleUrl);
-                                    $('#author').val(widget.author);
-                                    $('#authorEmail').val(widget.authorEmail);
-                                    $('#addWidgetForm').show();
-                                    $('#addWidgetFormSubmit').show();
-                                }
-                            });">
-                <fmt:message key="page.getWidgetMetadata.button"/>
-            </a>
-
-            <div class="row clearfix" id="addWidgetForm">
+			<div class="control-group">
+	            <a href="#" class="btn btn-primary"
+	               id="fetchMetadataButton"
+	               onclick="rave.api.rpc.getWidgetMetadata({
+	                                url: $('#url').get(0).value,
+	                                providerType: 'OpenSocial',
+	                                successCallback: function(result) {
+	                                    var widget = result.result;
+	                                    $('#title').val(widget.title);
+	                                    $('#description').val(widget.description);
+	                                    $('#thumbnailUrl').val(widget.thumbnailUrl);
+	                                    $('#screenshotUrl').val(widget.screenshotUrl);
+	                                    $('#titleUrl').val(widget.titleUrl);
+	                                    $('#author').val(widget.author);
+	                                    $('#authorEmail').val(widget.authorEmail);
+	                                    $('#addWidgetForm').show();
+	                                    $('#addWidgetFormSubmit').show();
+	                                }
+	                            });">
+	                <fmt:message key="page.getWidgetMetadata.button"/>
+	            </a>
+			</div>
+            <div class="clearfix" id="addWidgetForm">
 
                 <div class="control-group">
                     <form:label cssClass="control-label" path="title"> <fmt:message key="widget.title"/> *</form:label>

Modified: rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/addwidget.w3c.jsp
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/addwidget.w3c.jsp?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/addwidget.w3c.jsp (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/addwidget.w3c.jsp Mon Oct 29 03:16:59 2012
@@ -34,8 +34,11 @@
     </div>
     
     <div class="row-fluid">
-    <a class="btn btn-primary" id="w3cBrowseLink" href="#"><fmt:message key="page.general.browse"/></a>
-    
+    <div class="control-group">
+    	<fieldset>
+    		<a class="btn btn-primary" id="w3cBrowseLink" href="#"><fmt:message key="page.general.browse"/></a>
+    	</fieldset>
+    </div>
     <form:errors path="widget" cssClass="error" element="p"/>
     <form:form cssClass="form-horizontal" id="newWidgetForm" action="w3c?referringPageId=${referringPageId}" commandName="widget" method="POST">
         <fieldset>

Modified: rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/admin/preferencedetail.jsp
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/admin/preferencedetail.jsp?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/admin/preferencedetail.jsp (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/admin/preferencedetail.jsp Mon Oct 29 03:16:59 2012
@@ -88,6 +88,20 @@
 	                            <form:errors path="javaScriptDebugMode.value" cssClass="error"/>
 	                        </spring:bind>
 	                    </div>
+                        <div class="control-group">
+                            <spring:bind path="showStackTrace.value">
+                                <form:label path="showStackTrace.value" class="control-label">
+                                    <fmt:message key="admin.preferencedetail.showStackTrace"/> *
+                                </form:label>
+                                <div class="controls">
+                                    <form:select id="showStackTrace" path="showStackTrace.value">
+                                        <form:option value="0"><fmt:message key="admin.preferencedetail.showStackTrace.false"/></form:option>
+                                        <form:option value="1"><fmt:message key="admin.preferencedetail.showStackTrace.true"/></form:option>
+                                    </form:select>
+                                </div>
+                                <form:errors path="showStackTrace.value" cssClass="error"/>
+                            </spring:bind>
+                        </div>
 	                   <div class="control-group">
 	                        <spring:bind path="initialWidgetStatus.value">
 	                            <form:label path="initialWidgetStatus.value" class="control-label">

Modified: rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/error.jsp
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/error.jsp?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/error.jsp (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/error.jsp Mon Oct 29 03:16:59 2012
@@ -19,23 +19,24 @@
 <%@ page isErrorPage="true" language="java" trimDirectiveWhitespaces="true" %>
 <%@ include file="/WEB-INF/jsp/includes/taglibs.jsp" %>
 <fmt:setBundle basename="messages"/>
+<c:set var="showStackTrace"><portal:render-show-stack-trace /></c:set>
 <%-- Note: This page has the body definition embedded so we can reference it from the web.xml file
 and use it as the default error page for the entire application. --%>
 <tiles:insertDefinition name="templates.base">
     <tiles:putAttribute name="pageTitleKey" value="page.error.title"/>
     <tiles:putAttribute name="body">
-        <header>
-          <h1>
-              <fmt:message key="page.error.title" />
-          </h1>
-        </header>
-        <div id="content" >
-            <div id="errorMessage">
-                <div class="errorMessage">
-                    <fmt:message key="page.error.message" />
-                    &nbsp;<a href="javascript: window.location.reload();"><fmt:message key="page.error.reload" /></a>.<br/>
-                    <a onclick="document.getElementById('errorStack').style.display = 'block';"><fmt:message key="page.error.details" /></a>
-                </div>
+        <c:if test="${showStackTrace == 1}">
+        <rave:navbar/>
+            <header>
+                <h1>
+                    <fmt:message key="page.error.title" />
+                </h1>
+            </header>
+        <div id="content" class="container-fluid navbar-spacer">
+            <div id="errorMessage" class="errorMessage">
+                <h2><fmt:message key="page.error.message" />
+                    &nbsp;<a href="javascript: window.location.reload();"><fmt:message key="page.error.reload" /></a>.</h2><br/>
+                <a onclick="document.getElementById('errorStack').style.display = 'block';"><fmt:message key="page.error.details" /></a>
             </div>
             <div id="errorStack" title="Error Details" >
                 <pre class="errorTrace">
@@ -50,5 +51,20 @@ and use it as the default error page for
                 </button>
             </div>
         </div>
+        </c:if>
+        <c:if test="${showStackTrace == 0}">
+            <rave:navbar/>
+            <header>
+                <h1>
+                    <fmt:message key="page.error.title" />
+                </h1>
+            </header>
+            <div id="content" class="container-fluid navbar-spacer">
+                <div id="errorMessage" class="errorMessage">
+                    <h2><fmt:message key="page.error.message" />
+                        &nbsp;<a href="javascript: window.location.reload();"><fmt:message key="page.error.reload" /></a>.</h2><br/>
+                </div>
+            </div>
+        </c:if>
     </tiles:putAttribute>
 </tiles:insertDefinition>
\ No newline at end of file

Modified: rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/mobile_home.jsp
URL: http://svn.apache.org/viewvc/rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/mobile_home.jsp?rev=1403150&r1=1403149&r2=1403150&view=diff
==============================================================================
--- rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/mobile_home.jsp (original)
+++ rave/branches/model-split/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/mobile_home.jsp Mon Oct 29 03:16:59 2012
@@ -68,7 +68,7 @@
             <c:forEach var="regionWidget" items="${region.regionWidgets}">
                <div class="widget-wrapper widget-wrapper-mobile" id="widget-${regionWidget.id}-wrapper">
                     <div class="widget-title-bar widget-title-bar-mobile" onclick="rave.toggleMobileWidget(${regionWidget.id});">
-                        <span id="widget-${regionWidget.id}-collapse" class="widget-toolbar-toggle-collapse" title="<fmt:message key="widget.chrome.toggle"/>"></span>
+                        <span id="widget-${regionWidget.id}-collapse" class="widget-toolbar-toggle-collapse" title="<fmt:message key="widget.chrome.toggle"/>"><i class="icon-chevron-down"></i></span>
                         <div id="widget-${regionWidget.id}-title" class="widget-title">
                             <c:out value="${regionWidget.widget.title}"/>
                         </div>