You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by at...@apache.org on 2012/09/18 01:05:15 UTC

svn commit: r1386900 - in /rave/sandbox/content-services/demo-portal/src/main: java/org/apache/rave/portal/web/mvc/controller/ java/org/apache/rave/portal/web/mvc/interceptors/ resources/ webapp/WEB-INF/ webapp/WEB-INF/jsp/views/layouts/ webapp/WEB-INF...

Author: ate
Date: Mon Sep 17 23:05:14 2012
New Revision: 1386900

URL: http://svn.apache.org/viewvc?rev=1386900&view=rev
Log:
RAVE-696: rave-web-jcr / demo-portal
- mostly complete refactoring of PageController -> hmvc controller model and extra HandlerInterceptors
- large restructuring and cleanup of freemarker/jsp view templates for page controller(s)
  layout templates now properly pulled and executed using the hmvc model instead of being pushed through Tiles

Added:
    rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageContentController.java   (with props)
    rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageLayoutController.java   (with props)
    rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageTabsController.java   (with props)
    rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/
    rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/AuthenticatedUserInterceptor.java   (with props)
    rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/MobileDeviceInterceptor.java   (with props)
    rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/UserPageInterceptor.java   (with props)
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_1.jsp
      - copied unchanged from r1385243, rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/columns_1.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_2.jsp
      - copied unchanged from r1385243, rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/columns_2.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_2wn.jsp
      - copied unchanged from r1385243, rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/columns_2wn.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_3.jsp
      - copied unchanged from r1385243, rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/columns_3.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_3_newuser.jsp
      - copied, changed from r1385243, rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/columns_3_newuser.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_3nwn.jsp
      - copied unchanged from r1385243, rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/columns_3nwn.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_3nwn_1_bottom.jsp
      - copied unchanged from r1385243, rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/columns_3nwn_1_bottom.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_4.jsp
      - copied unchanged from r1385243, rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/columns_4.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/mobile.jsp   (with props)
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content-mobile.jsp
      - copied, changed from r1385242, rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs-mobile.jsp
      - copied, changed from r1385242, rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs.jsp
Removed:
    rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageController.java
Modified:
    rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/PageHeaderController.java
    rave/sandbox/content-services/demo-portal/src/main/resources/page-config.json
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-body.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs.jsp
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/nested-dispatcher-servlet.xml
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/page-definitions.xml
    rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/routes.xml

Modified: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/PageHeaderController.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/PageHeaderController.java?rev=1386900&r1=1386899&r2=1386900&view=diff
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/PageHeaderController.java (original)
+++ rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/PageHeaderController.java Mon Sep 17 23:05:14 2012
@@ -20,7 +20,6 @@ import org.apache.rave.portal.model.Page
 import org.apache.rave.portal.model.PageUser;
 import org.apache.rave.portal.model.User;
 import org.apache.rave.portal.web.mvc.Named;
-import org.apache.rave.portal.web.mvc.HandlerConfig;
 import org.apache.rave.portal.web.model.NavigationItem;
 import org.apache.rave.portal.web.model.NavigationMenu;
 import org.apache.rave.portal.web.mvc.NestedHandlerContext;

Added: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageContentController.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageContentController.java?rev=1386900&view=auto
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageContentController.java (added)
+++ rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageContentController.java Mon Sep 17 23:05:14 2012
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rave.portal.web.mvc.controller;
+
+import org.apache.rave.portal.web.mvc.Named;
+import org.apache.rave.portal.web.mvc.NestedHandlerContext;
+import org.apache.rave.portal.web.mvc.Routed;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Routed
+@Controller
+public class UserPageContentController {
+
+    @Named
+    @RequestMapping
+    public String render(NestedHandlerContext hc, @ModelAttribute boolean mobileDevice) {
+        if (mobileDevice) {
+            return hc.getConfig().getViewName() + "-mobile";
+        }
+        else {
+            return hc.getConfig().getViewName();
+        }
+    }
+}

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageContentController.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageContentController.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageLayoutController.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageLayoutController.java?rev=1386900&view=auto
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageLayoutController.java (added)
+++ rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageLayoutController.java Mon Sep 17 23:05:14 2012
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rave.portal.web.mvc.controller;
+
+import org.apache.rave.portal.model.Page;
+import org.apache.rave.portal.web.mvc.Named;
+import org.apache.rave.portal.web.mvc.NestedHandlerContext;
+import org.apache.rave.portal.web.mvc.Routed;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Routed
+@Controller
+public class UserPageLayoutController {
+
+    @Named
+    @RequestMapping
+    public String render(@ModelAttribute Page page, @ModelAttribute("mobileDevice") boolean mobileDevice) {
+        if (mobileDevice) {
+            return "layouts/mobile";
+        }
+        else {
+            return "layouts/"+page.getPageLayout().getCode();
+        }
+    }
+}

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageLayoutController.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageLayoutController.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageTabsController.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageTabsController.java?rev=1386900&view=auto
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageTabsController.java (added)
+++ rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageTabsController.java Mon Sep 17 23:05:14 2012
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rave.portal.web.mvc.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.rave.portal.model.Page;
+import org.apache.rave.portal.model.PageInvitationStatus;
+import org.apache.rave.portal.model.PageUser;
+import org.apache.rave.portal.model.User;
+import org.apache.rave.portal.service.PageLayoutService;
+import org.apache.rave.portal.service.PageService;
+import org.apache.rave.portal.web.mvc.Named;
+import org.apache.rave.portal.web.mvc.NestedHandlerContext;
+import org.apache.rave.portal.web.mvc.Routed;
+import org.apache.rave.portal.web.util.ModelKeys;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Routed
+@Controller
+public class UserPageTabsController {
+
+    private PageService pageService;
+    private PageLayoutService pageLayoutService;
+
+    @Autowired
+    public UserPageTabsController(PageService pageService, PageLayoutService pageLayoutService) {
+        this.pageService = pageService;
+        this.pageLayoutService = pageLayoutService;
+    }
+
+    @Named
+    @RequestMapping
+    public String render(NestedHandlerContext hc, @ModelAttribute("mobileDevice") boolean mobileDevice, @ModelAttribute User user, Model model) {
+        model.addAttribute(ModelKeys.PAGES, getAllPagesForAuthenticatedUser(user));
+        model.addAttribute(ModelKeys.PAGE_LAYOUTS, pageLayoutService.getAllUserSelectable());
+        if (mobileDevice) {
+            return hc.getConfig().getViewName() + "-mobile";
+        }
+        else {
+            return hc.getConfig().getViewName();
+        }
+    }
+
+    private List<Page> getAllPagesForAuthenticatedUser(User user) {
+        List<Page> pages = pageService.getAllUserPages(user.getId());
+        // we add pages to this list which the corresponding pageUser object is not set to "refused"
+        List<Page> viewablePages = new ArrayList<Page>();
+        for(Page page : pages){
+            for(PageUser pageUser : page.getMembers()){
+                if(pageUser != null && pageUser.getUser().equals(user) && !pageUser.getPageStatus().equals(PageInvitationStatus.REFUSED)){
+                    viewablePages.add(page);
+                }
+            }
+        }
+        return viewablePages;
+    }
+}

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageTabsController.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/controller/UserPageTabsController.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/AuthenticatedUserInterceptor.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/AuthenticatedUserInterceptor.java?rev=1386900&view=auto
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/AuthenticatedUserInterceptor.java (added)
+++ rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/AuthenticatedUserInterceptor.java Mon Sep 17 23:05:14 2012
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rave.portal.web.mvc.interceptors;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.rave.portal.service.UserService;
+import org.apache.rave.portal.web.mvc.PreHandleModelHandlerInterceptor;
+import org.apache.rave.portal.web.util.ModelKeys;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.ExtendedModelMap;
+
+public class AuthenticatedUserInterceptor extends PreHandleModelHandlerInterceptor {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    private UserService userService;
+
+    @Autowired
+    public AuthenticatedUserInterceptor(UserService userService) {
+        this.userService = userService;
+    }
+
+    @Override
+    protected boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final ExtendedModelMap modelMap) throws Exception {
+        modelMap.put(ModelKeys.USER, userService.getAuthenticatedUser());
+        return true;
+    }
+}

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/AuthenticatedUserInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/AuthenticatedUserInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/MobileDeviceInterceptor.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/MobileDeviceInterceptor.java?rev=1386900&view=auto
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/MobileDeviceInterceptor.java (added)
+++ rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/MobileDeviceInterceptor.java Mon Sep 17 23:05:14 2012
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rave.portal.web.mvc.interceptors;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.rave.portal.web.mvc.PreHandleModelHandlerInterceptor;
+import org.springframework.mobile.device.DeviceUtils;
+import org.springframework.ui.ExtendedModelMap;
+
+public class MobileDeviceInterceptor extends PreHandleModelHandlerInterceptor {
+
+    @Override
+    protected boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final ExtendedModelMap modelMap) throws Exception {
+        modelMap.addAttribute("mobileDevice", Boolean.valueOf(DeviceUtils.getCurrentDevice(request).isMobile()));
+        return true;
+    }
+}

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/MobileDeviceInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/MobileDeviceInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/UserPageInterceptor.java
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/UserPageInterceptor.java?rev=1386900&view=auto
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/UserPageInterceptor.java (added)
+++ rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/UserPageInterceptor.java Mon Sep 17 23:05:14 2012
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rave.portal.web.mvc.interceptors;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.rave.portal.model.Page;
+import org.apache.rave.portal.model.PageInvitationStatus;
+import org.apache.rave.portal.model.PageUser;
+import org.apache.rave.portal.model.User;
+import org.apache.rave.portal.service.PageService;
+import org.apache.rave.portal.web.mvc.PreHandleModelHandlerInterceptor;
+import org.apache.rave.portal.web.util.ModelKeys;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.ExtendedModelMap;
+
+public class UserPageInterceptor extends PreHandleModelHandlerInterceptor {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    private PageService pageService;
+
+    @Autowired
+    public UserPageInterceptor(PageService pageService) {
+        this.pageService = pageService;
+    }
+
+    @Override
+    protected boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final ExtendedModelMap modelMap) throws Exception {
+        Map<String, String> uriTemplateVariables = getUriTemplateVariables(request);
+        Long pageId = null;
+        User user = (User) modelMap.get(ModelKeys.USER);
+        if (user == null) {
+            throw new RuntimeException("Unresolved User Model attribute");
+        }
+        if (uriTemplateVariables.get("pageId") != null) {
+            pageId = Long.valueOf(uriTemplateVariables.get("pageId"));
+        }
+        Page page = null;
+        if (pageId != null) {
+            try {
+                page = pageService.getPage(pageId);
+            }
+            catch (Exception e) {
+                logger.info("unable to get page - possibly because a shared page was revoked by its owner");
+            }
+        }
+        if (page == null) {
+            List<Page> pages = pageService.getAllUserPages(user.getId());
+            // we find the first page in this list which the corresponding pageUser object is not set to "refused"
+            for(Page p : pages) {
+                for(PageUser pageUser : p.getMembers()){
+                    if(pageUser != null && pageUser.getUser().equals(user) && !pageUser.getPageStatus().equals(PageInvitationStatus.REFUSED)){
+                        page = p;
+                        break;
+                    }
+                }
+                if (page != null) {
+                    break;
+                }
+            }
+            if (page == null) {
+                // create a new default page for the user
+                logger.info("User {} does not have any pages - creating default page", user.getUsername());
+                page = pageService.addNewDefaultUserPage(user.getId());
+            }
+        }
+        modelMap.put(ModelKeys.PAGE, page);
+
+        for(PageUser pageUser : page.getMembers()){
+            if(pageUser.getUser().equals(user)){
+                modelMap.addAttribute(ModelKeys.PAGE_USER, pageUser);
+                break;
+            }
+        }
+        return true;
+    }
+}

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/UserPageInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/demo-portal/src/main/java/org/apache/rave/portal/web/mvc/interceptors/UserPageInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: rave/sandbox/content-services/demo-portal/src/main/resources/page-config.json
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/resources/page-config.json?rev=1386900&r1=1386899&r2=1386900&view=diff
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/resources/page-config.json (original)
+++ rave/sandbox/content-services/demo-portal/src/main/resources/page-config.json Mon Sep 17 23:05:14 2012
@@ -3,26 +3,27 @@
         "jcr:primaryType":"raveconfig:routes",
         "r1":{
             "jcr:primaryType":"raveconfig:route",
-            "path":"/home",
+            "path":"/",
             "target":"/userPage",
-            "action":"defaultPage"
+            "interceptors":"userPage"
         },
         "r2":{
             "jcr:primaryType":"raveconfig:route",
             "path":"/page",
             "target":"/userPage",
-            "action":"defaultPage"
+            "interceptors":"userPage"
         },
         "r3":{
             "jcr:primaryType":"raveconfig:route",
             "path":"/page/view",
             "target":"/userPage",
-            "action":"defaultPage"
+            "interceptors":"userPage"
         },
         "r4":{
             "jcr:primaryType":"raveconfig:route",
             "path":"/page/view/{pageId}",
-            "target":"/userPage"
+            "target":"/userPage",
+            "interceptors":"userPage"
         },
         "r5":{
             "jcr:primaryType":"raveconfig:route",
@@ -35,7 +36,6 @@
         "userPage":{
             "jcr:primaryType":"raveconfig:pagefragment",
             "name":"userPage",
-            "controller":"org.apache.rave.portal.web.mvc.controller.UserPageController",
             "extends":"extended",
             "viewName":"jcr:/pages/userpage/page",
             "body":{
@@ -45,19 +45,24 @@
                 "tabs":{
                     "jcr:primaryType":"raveconfig:pagefragment",
                     "name":"tabs",
+                    "controller":"org.apache.rave.portal.web.mvc.controller.UserPageTabsController",
                     "viewName":"pages/userpage/page-tabs"
                 },
                 "content":{
                     "jcr:primaryType":"raveconfig:pagefragment",
                     "name":"content",
-                    "viewName":"pages/userpage/page-content"
+                    "viewName":"pages/userpage/page-content",
+                    "layout": {
+                        "jcr:primaryType":"raveconfig:pagefragment",
+                        "name":"layout",
+                        "controller":"org.apache.rave.portal.web.mvc.controller.UserPageLayoutController"
+                    }
                 }
             }
         },
         "extended":{
             "jcr:primaryType":"raveconfig:pagefragment",
             "name":"extended",
-            "controller":"org.apache.rave.portal.web.mvc.controller.UserPageController",
             "extends":"standard",
             "viewName":"pages/userpage/page",
             "header":{
@@ -70,7 +75,6 @@
         "standard":{
             "jcr:primaryType":"raveconfig:pagefragment",
             "name":"standard",
-            "controller":"org.apache.rave.portal.web.mvc.controller.UserPageController",
             "viewName":"pages/userpage/page",
             "header":{
                 "jcr:primaryType":"raveconfig:pagefragment",

Copied: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_3_newuser.jsp (from r1385243, rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/columns_3_newuser.jsp)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_3_newuser.jsp?p2=rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_3_newuser.jsp&p1=rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/columns_3_newuser.jsp&r1=1385243&r2=1386900&rev=1386900&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/columns_3_newuser.jsp (original)
+++ rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/columns_3_newuser.jsp Mon Sep 17 23:05:14 2012
@@ -19,7 +19,6 @@
   --%>
 
 <fmt:setBundle basename="messages"/>
-<%--@elvariable id="page" type="org.apache.rave.portal.model.Page"--%>
 <div class="columns_3_newuser_static">
     <fmt:message key="page.layout.newuser.introtext"/>
 </div>

Added: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/mobile.jsp
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/mobile.jsp?rev=1386900&view=auto
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/mobile.jsp (added)
+++ rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/mobile.jsp Mon Sep 17 23:05:14 2012
@@ -0,0 +1,41 @@
+<%--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  --%>
+<%@ page language="java" trimDirectiveWhitespaces="true" %>
+<%@ include file="/WEB-INF/jsp/includes/taglibs.jsp" %>
+<%-- the mobile view will only show one column of widgets --%>
+<div id="pageContent" class="pageContent-mobile">
+  <c:forEach var="region" items="${page.regions}">
+    <div class="region-mobile" id="region-${region.id}-id">
+      <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>
+            <div id="widget-${regionWidget.id}-title" class="widget-title">
+              <c:out value="${regionWidget.widget.title}"/>
+            </div>
+          </div>
+          <div class="widget-prefs" id="widget-${regionWidget.id}-prefs-content"></div>
+          <div class="widget widget-mobile" id="widget-${regionWidget.id}-body">
+            <portal:render-widget regionWidget="${regionWidget}" />
+          </div>
+        </div>
+      </c:forEach>
+    </div>
+  </c:forEach>
+</div>

Propchange: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/mobile.jsp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/layouts/mobile.jsp
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-body.jsp
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-body.jsp?rev=1386900&r1=1386899&r2=1386900&view=diff
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-body.jsp (original)
+++ rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-body.jsp Mon Sep 17 23:05:14 2012
@@ -1,26 +1,5 @@
 <%@ page language="java" trimDirectiveWhitespaces="true" %>
 <%@ include file="/WEB-INF/jsp/includes/taglibs.jsp" %>
 <%@ taglib uri="http://www.apache-rave.org/jsp/hmvc" prefix="rave-hmvc" %>
-<jsp:useBean id="pageUser" type="org.apache.rave.portal.model.PageUser" scope="request"/>
-<sec:authentication property="principal.username" var="principleUsername" scope="request"/>
-
 <rave-hmvc:include ref="tabs"/>
-<rave-hmvc:include ref="content"/>
-
-<portal:register-init-script location="${'AFTER_RAVE'}">
-  <script>
-    $(function () {
-      rave.initPageEditorStatus(<c:out value="${pageUser.editor}"/>);
-      rave.initProviders();
-      rave.initWidgets();
-      rave.initUI();
-      rave.layout.init();
-      rave.layout.searchHandler.setDefaults("<c:out value="${principleUsername}"/>", "<sec:authentication property="principal.id" />", "<c:out value="${page.id}"/>", "${pageUser.pageStatus}");
-      rave.runOnPageInitializedHandlers();
-    });
-  </script>
-  <c:forEach var="members" items="${page.members}">
-    <script>rave.layout.searchHandler.addExistingMember("${members.user.username}", ${members.editor});</script>
-  </c:forEach>
-</portal:register-init-script>
-
+<rave-hmvc:include ref="content"/>
\ No newline at end of file

Copied: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content-mobile.jsp (from r1385242, rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content.jsp)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content-mobile.jsp?p2=rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content-mobile.jsp&p1=rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content.jsp&r1=1385242&r2=1386900&rev=1386900&view=diff
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content.jsp (original)
+++ rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content-mobile.jsp Mon Sep 17 23:05:14 2012
@@ -1,38 +1,32 @@
-<%@ page language="java" trimDirectiveWhitespaces="true" %>
-<%@ include file="/WEB-INF/jsp/includes/taglibs.jsp" %>
-<fmt:setBundle basename="messages"/>
-<jsp:useBean id="pageUser" type="org.apache.rave.portal.model.PageUser" scope="request"/>
-<div class="row-fluid">
-  <div id="emptyPageMessageWrapper" class="emptyPageMessageWrapper hidden">
-    <div class="emptyPageMessage">
-      <c:choose>
-        <c:when test="${pageUser.editor == true}">
-          <a href="<spring:url value="/app/store?referringPageId=${page.id}" />"><fmt:message key="page.general.empty"/></a>
-        </c:when>
-        <c:otherwise>
-          <fmt:message key="page.general.non.editing.empty"/>
-        </c:otherwise>
-      </c:choose>
-    </div>
-  </div>
-  <div class="regions">
-    <%-- insert the region layout template --%>
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
 
-      <%-- TODO: hardcoded columns_3_newuser template for now --%>
-      <div class="columns_3_newuser_static">
-        <fmt:message key="page.layout.newuser.introtext"/>
-      </div>
+    http://www.apache.org/licenses/LICENSE-2.0
 
-      <div class="columns_3_newuser_widgets">
-        <div class="columns_3_newuser_subtitle"><fmt:message key="page.layout.newuser.subtitle"/></div>
-        <div class="widgetRow upperRow">
-          <rave:region region="${page.regions[0]}" regionIdx="1" />
-          <rave:region region="${page.regions[1]}" regionIdx="2" />
-        </div>
-        <div class="widgetRow bottomRow">
-          <rave:region region="${page.regions[2]}" regionIdx="3" />
-        </div>
-      </div>
-  </div>
-  <div class="clear-float">&nbsp;</div>
-</div>
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  --%>
+<%@ page language="java" trimDirectiveWhitespaces="true" %>
+<%@ include file="/WEB-INF/jsp/includes/taglibs.jsp" %>
+<%@ taglib uri="http://www.apache-rave.org/jsp/hmvc" prefix="rave-hmvc" %>
+<rave-hmvc:include ref="layout"/>
+<portal:register-init-script location="${'AFTER_RAVE'}">
+  <script>
+    $(function() {
+      rave.initPageEditorStatus(<c:out value="${pageUser.editor}"/>);
+      rave.setMobile(true);
+      rave.initProviders();
+      rave.initWidgets();
+    });
+  </script>
+</portal:register-init-script>
\ No newline at end of file

Modified: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content.jsp
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content.jsp?rev=1386900&r1=1386899&r2=1386900&view=diff
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content.jsp (original)
+++ rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-content.jsp Mon Sep 17 23:05:14 2012
@@ -1,10 +1,30 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  --%>
 <%@ page language="java" trimDirectiveWhitespaces="true" %>
 <%@ include file="/WEB-INF/jsp/includes/taglibs.jsp" %>
+<%@ taglib uri="http://www.apache-rave.org/jsp/hmvc" prefix="rave-hmvc" %>
 <fmt:setBundle basename="messages"/>
-<jsp:useBean id="pageUser" type="org.apache.rave.portal.model.PageUser" scope="request"/>
+<sec:authentication property="principal.username" var="principleUsername" scope="request"/>
 <div class="row-fluid">
   <div id="emptyPageMessageWrapper" class="emptyPageMessageWrapper hidden">
-    <div class="emptyPageMessage">
+      <c:if test="${pageUser.pageStatus != 'PENDING'}">
+      <div class="emptyPageMessage">
       <c:choose>
         <c:when test="${pageUser.editor == true}">
           <a href="<spring:url value="/app/store?referringPageId=${page.id}" />"><fmt:message key="page.general.empty"/></a>
@@ -14,25 +34,50 @@
         </c:otherwise>
       </c:choose>
     </div>
+    </c:if>
   </div>
-  <div class="regions">
-    <%-- insert the region layout template --%>
-
-      <%-- TODO: hardcoded columns_3_newuser template for now --%>
-      <div class="columns_3_newuser_static">
-        <fmt:message key="page.layout.newuser.introtext"/>
+  <c:choose>
+    <c:when test="${pageUser.pageStatus != 'PENDING'}">
+      <div class="regions">
+          <%-- insert the region layout template --%>
+          <rave-hmvc:include ref="layout"/>
       </div>
-
-      <div class="columns_3_newuser_widgets">
-        <div class="columns_3_newuser_subtitle"><fmt:message key="page.layout.newuser.subtitle"/></div>
-        <div class="widgetRow upperRow">
-          <rave:region region="${page.regions[0]}" regionIdx="1" />
-          <rave:region region="${page.regions[1]}" regionIdx="2" />
+      <div class="clear-float">&nbsp;</div>
+    </c:when>
+    <c:otherwise>
+      <div class="emptyPageMessage">
+        <div>
+          <div id="confirmSharePageLegend">
+            <fmt:message key="sharing.page.confirm.message">
+              <fmt:param value="${page.owner.username}"/>
+            </fmt:message>
+          </div>
+        </div>
+        <div>&nbsp;</div>
+        <div>
+          <a href="#" onclick="rave.layout.searchHandler.acceptShare()"><fmt:message key="_rave_client.common.accept"/></a>
         </div>
-        <div class="widgetRow bottomRow">
-          <rave:region region="${page.regions[2]}" regionIdx="3" />
+        <div>
+          <a href="#" onclick="rave.layout.searchHandler.declineShare();"><fmt:message key="_rave_client.common.decline"/></a>
         </div>
+        <div class="clear-float">&nbsp;</div>
       </div>
-  </div>
-  <div class="clear-float">&nbsp;</div>
+    </c:otherwise>
+  </c:choose>
 </div>
+<portal:register-init-script location="${'AFTER_RAVE'}">
+  <script>
+    $(function () {
+      rave.initPageEditorStatus(<c:out value="${pageUser.editor}"/>);
+      rave.initProviders();
+      rave.initWidgets();
+      rave.initUI();
+      rave.layout.init();
+      rave.layout.searchHandler.setDefaults("<c:out value="${principleUsername}"/>", "<sec:authentication property="principal.id" />", "<c:out value="${page.id}"/>", "${pageUser.pageStatus}");
+      rave.runOnPageInitializedHandlers();
+    });
+  </script>
+  <c:forEach var="members" items="${page.members}">
+    <script>rave.layout.searchHandler.addExistingMember("${members.user.username}", ${members.editor});</script>
+  </c:forEach>
+</portal:register-init-script>

Copied: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs-mobile.jsp (from r1385242, rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs.jsp)
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs-mobile.jsp?p2=rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs-mobile.jsp&p1=rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs.jsp&r1=1385242&r2=1386900&rev=1386900&view=diff
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs.jsp (original)
+++ rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs-mobile.jsp Mon Sep 17 23:05:14 2012
@@ -1,244 +1,97 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  --%>
 <%@ page language="java" trimDirectiveWhitespaces="true" %>
 <%@ include file="/WEB-INF/jsp/includes/taglibs.jsp" %>
 <fmt:setBundle basename="messages"/>
-<jsp:useBean id="pages" type="java.util.List<org.apache.rave.portal.model.Page>" scope="request"/>
-<jsp:useBean id="pageUser" type="org.apache.rave.portal.model.PageUser" scope="request"/>
-<jsp:useBean id="pageLayouts" type="java.util.List<org.apache.rave.portal.model.JpaPageLayout>" scope="request"/>
-
-<c:set var="hasOnlyOnePage" scope="request">
-  <c:choose>
-    <c:when test="${fn:length(pages) == 1}">true</c:when>
-    <c:otherwise>false</c:otherwise>
-  </c:choose>
-</c:set>
-<c:set var="canMoveWidgetsToEditablePage" scope="request" value="false"/>
-
-<div id="pageContent" class="container-fluid">
-  <nav>
-    <ul class="nav nav-tabs">
-      <c:forEach var="userPage" items="${pages}">
-        <%-- determine if the current page in the list matches the page the user is viewing --%>
-        <c:set var="isCurrentPage">
-          <c:choose>
-            <c:when test="${page.id == userPage.id}">true</c:when>
-            <c:otherwise>false</c:otherwise>
-          </c:choose>
-        </c:set>
-        <c:set var="isSharedToMe">
-          <c:choose>
-            <c:when test="${userPage.owner.username == principleUsername}">false</c:when>
-            <c:otherwise>true</c:otherwise>
-          </c:choose>
-        </c:set>
-        <c:set var="isSharedByMe">
-          <c:choose>
-            <c:when test="${fn:length(userPage.members) > 1 and isSharedToMe == false}">true</c:when>
-            <c:otherwise>false</c:otherwise>
-          </c:choose>
-        </c:set>
-        <fmt:message key="sharing.page.tab.icon.tip.from" var="iconShareToolTipFrom">
-          <fmt:param value="${userPage.owner.username}"/>
-        </fmt:message>
-        <fmt:message key="sharing.page.tab.icon.tip.to" var="iconShareToolTipTo"/>
+<div id="tabsHeader">
+  <%-- render the page links --%>
+  <div id="tabs" class="rave-ui-tabs">
+    <c:forEach var="userPage" items="${pages}">
+      <%-- determine if the current page in the list matches the page the user is viewing --%>
+      <c:set var="isCurrentPage">
         <c:choose>
-          <c:when test="${isCurrentPage}">
-            <li id="tab-${userPage.id}" class="active dropdown" >
-              <a href="#" class="dropdown-toggle" data-toggle="dropdown">
-                <c:if test="${isSharedToMe}">
-                  <b id="pageMenuSharedIcon" class="ui-icon ui-icon-person" title="<c:out value="${iconShareToolTipFrom}"/>"></b>
-                </c:if>
-                <c:if test="${isSharedByMe}">
-                  <b id="pageMenuSharedIcon" class="ui-icon ui-icon-folder-open" title="<c:out value="${iconShareToolTipTo}"/>"></b>
-                </c:if>
-                <c:out value="${userPage.name}"/>
-                <b class="caret"></b>
-              </a>
-              <ul class="dropdown-menu" >
-                <li id="pageMenuEdit" class="<c:if test="${isSharedToMe}">menu-item-disabled</c:if>"><a href="#"><fmt:message key="page.general.editpage"/></a></li>
-                <li id="pageMenuDelete" class="<c:if test='${hasOnlyOnePage or isSharedToMe}'>menu-item-disabled</c:if>"><a href="#"><fmt:message key="page.general.deletepage"/></a></li>
-                <li id="pageMenuMove" class="<c:if test='${hasOnlyOnePage}'>menu-item-disabled</c:if>"><a href="#"><fmt:message key="page.general.movepage"/></a></li>
-                <li id="pageMenuShare" class="<c:if test="${isSharedToMe}">menu-item-disabled</c:if>"><a href="#"><fmt:message key="page.general.sharepage"/></a></li>
-                <li id="pageMenuRevokeShare" class="<c:if test="${isSharedToMe == false}">menu-item-disabled</c:if>"><a href="#"><fmt:message key="page.general.removeshare"/></a></li>
-              </ul>
-            </li>
-          </c:when>
-          <c:otherwise>
-            <li id="tab-${userPage.id}" onclick="rave.viewPage(${userPage.id});">
-              <c:choose>
-                <c:when test="${isSharedToMe}">
-                  <a href="#" class="rave-ui-tab-shared-to-me">
-                    <b id="pageMenuSharedIcon" class="ui-icon ui-icon-person" title="<c:out value="${iconShareToolTipFrom}"/>"></b>
-                    <c:out value="${userPage.name}"/>
-                  </a>
-                </c:when>
-                <c:when test="${isSharedByMe}">
-                  <a href="#" class="rave-ui-tab-shared-by-me">
-                    <b id="pageMenuSharedIcon" class="ui-icon ui-icon-folder-open" title="<c:out value="${iconShareToolTipTo}"/>"></b>
-                    <c:out value="${userPage.name}"/>
-                  </a>
-                </c:when>
-                <c:otherwise>
-                  <a href="#"><c:out value="${userPage.name}"/></a>
-                </c:otherwise>
-              </c:choose>
-            </li>
-          </c:otherwise>
+          <c:when test="${page.id == userPage.id}">true</c:when>
+          <c:otherwise>false</c:otherwise>
         </c:choose>
-        <c:forEach var="members" items="${userPage.members}">
-          <c:if test="${members.user.username == principleUsername and members.editor and userPage.id != page.id}">
-            <c:set var="canMoveWidgetsToEditablePage" scope="request" value="true"/>
-          </c:if>
-        </c:forEach>
+      </c:set>
+      <div id="tab-${userPage.id}" class="rave-ui-tab rave-ui-tab-mobile<c:if test="${isCurrentPage}"> rave-ui-tab-selected rave-ui-tab-selected-mobile</c:if>">
+        <div id="pageTitle-${userPage.id}" class="page-title" onclick="rave.viewPage(${userPage.id});"><c:out value="${userPage.name}"/></div>
+      </div>
+    </c:forEach>
+    <%-- display the add page button at the end of the tabs --%>
+    <fmt:message key="page.general.addnewpage" var="addNewPageTitle"/>
+    <button id="add_page" title="${addNewPageTitle}" style="display: none;"></button>
+  </div>
+</div>
+<fmt:message key="page.general.addnewpage" var="addNewPageTitle"/>
+<div id="dialog" title="${addNewPageTitle}" class="dialog hidden">
+  <form id="pageForm">
+    <div id="pageFormErrors" class="error"></div>
+    <fieldset class="ui-helper-reset">
+      <input type="hidden" name="tab_id" id="tab_id" value="" />
+      <label for="tab_title"><fmt:message key="page.general.addpage.title"/></label>
+      <input type="text" name="tab_title" id="tab_title" value="" class="required ui-widget-content ui-corner-all" />
+      <label for="pageLayout"><fmt:message key="page.general.addpage.selectlayout"/></label>
+      <select name="pageLayout" id="pageLayout">
+        <option value="columns_1" id="columns_1_id"><fmt:message key="page.general.addpage.layout.columns_1"/></option>
+        <option value="columns_2" id="columns_2_id" selected="selected"><fmt:message key="page.general.addpage.layout.columns_2"/></option>
+        <option value="columns_2wn" id="columns_2wn_id"><fmt:message key="page.general.addpage.layout.columns_2wn"/></option>
+        <option value="columns_3" id="columns_3_id"><fmt:message key="page.general.addpage.layout.columns_3"/></option>
+        <option value="columns_3nwn" id="columns_3nwn_id"><fmt:message key="page.general.addpage.layout.columns_3nwn"/></option>
+        <option value="columns_4" id="columns_4_id"><fmt:message key="page.general.addpage.layout.columns_4"/></option>
+        <option value="columns_3nwn_1_bottom" id="columns_3nwn_1_bottom"><fmt:message key="page.general.addpage.layout.columns_3nwn_1_bottom"/></option>
+      </select>
+    </fieldset>
+  </form>
+</div>
+<fmt:message key="page.general.movepage" var="movePageTitle"/>
+<div id="movePageDialog" title="${movePageTitle}" class="dialog hidden">
+  <div><fmt:message key="page.general.movethispage"/></div>
+  <form id="movePageForm">
+    <select id="moveAfterPageId">
+      <c:if test="${pageUser.renderSequence != 1}">
+        <option value="-1"><fmt:message key="page.general.movethispage.tofirst"/></option>
+      </c:if>
+      <c:forEach var="userPage" items="${pages}">
+        <c:if test="${userPage.id != page.id}">
+          <option value="${userPage.id}">
+            <fmt:message key="page.general.movethispage.after">
+              <fmt:param><c:out value="${userPage.name}"/></fmt:param>
+            </fmt:message>
+          </option>
+        </c:if>
       </c:forEach>
-      <li id="addPageButton"><a href="#"><i class="icon-plus"></i></a></li>
-    </ul>
-  </nav>
-</div>
-
-<div id="pageMenuDialog" class="modal hide" data-backdrop="static">
-  <div class="modal-header">
-    <a href="#" class="close" data-dismiss="modal">&times;</a>
-    <h3 id="pageMenuDialogHeader"></h3>
-  </div>
-  <div class="modal-body">
-    <form id="pageForm" class="form-horizontal">
-      <input type="hidden" name="tab_id" id="tab_id" value=""/>
-      <fieldset>
-        <div class="control-group error">
-          <label id="pageFormErrors" class="control-label"></label>
-        </div>
-        <div class="control-group">
-          <label class="control-label" for="tab_title"><fmt:message key="page.general.addpage.title"/></label>
-          <div class="controls">
-            <input id="tab_title" name="tab_title" class="input-xlarge focused required" type="text" value="" />
-          </div>
-        </div>
-        <div class="control-group">
-          <label class="control-label" for="pageLayout"><fmt:message key="page.general.addpage.selectlayout"/></label>
-          <div class="controls">
-            <select name="pageLayout" id="pageLayout">
-              <c:forEach var="pageLayout" items="${pageLayouts}">
-                <option value="${pageLayout.code}" id="${pageLayout.code}_id">
-                  <fmt:message key="page.general.addpage.layout.${pageLayout.code}"/></option>
-              </c:forEach>
-            </select>
-          </div>
-        </div>
-      </fieldset>
-    </form>
-  </div>
-  <div class="modal-footer">
-    <a id="pageMenuCloseButton" href="#" class="btn"><fmt:message key="_rave_client.common.cancel"/></a>
-    <a id="pageMenuUpdateButton" href="#" class="btn btn-primary"></a>
-  </div>
-</div>
-
-<div id="movePageDialog" class="modal hide" data-backdrop="static">
-  <div class="modal-header">
-    <a href="#" class="close" data-dismiss="modal">&times;</a>
-    <h3><fmt:message key="page.general.movethispage"/></h3>
-  </div>
-  <div class="modal-body">
-    <form id="movePageForm" class="form-horizontal">
-      <fieldset>
-        <div class="control-group">
-          <div class="controls">
-            <select id="moveAfterPageId">
-              <c:if test="${pageUser.renderSequence != 1}">
-                <option value="-1"><fmt:message key="page.general.movethispage.tofirst"/></option>
-              </c:if>
-              <c:forEach var="userPage" items="${pages}">
-                <c:if test="${userPage.id != page.id}">
-                  <option value="${userPage.id}">
-                    <fmt:message key="page.general.movethispage.after">
-                      <fmt:param><c:out value="${userPage.name}"/></fmt:param>
-                    </fmt:message>
-                  </option>
-                </c:if>
-              </c:forEach>
-            </select>
-          </div>
-        </div>
-      </fieldset>
-    </form>
-  </div>
-  <div class="modal-footer">
-    <a href="#" class="btn" onclick="$('#movePageDialog').modal('hide');"><fmt:message key="_rave_client.common.cancel"/></a>
-    <a href="#" class="btn btn-primary" onclick="rave.layout.movePage();"><fmt:message key="page.general.movepage"/></a>
-  </div>
+    </select>
+  </form>
 </div>
-
 <fmt:message key="widget.menu.movetopage" var="moveWidgetToPageTitle"/>
-<div id="moveWidgetModal" class="modal hide" data-backdrop="static">
-  <div class="modal-header">
-    <a href="#" class="close" data-dismiss="modal">&times;</a>
-    <h3><fmt:message key="widget.menu.movethiswidget"/></h3>
-  </div>
-  <div class="modal-body">
-    <form id="moveWidgetForm" class="form-horizontal">
-      <fieldset>
-        <div class="control-group">
-          <div class="controls">
-            <select id="moveToPageId">
-              <c:forEach var="userPage" items="${pages}">
-                <c:forEach var="members" items="${userPage.members}">
-                  <c:if test="${members.user.username == principleUsername and members.editor and userPage.id != page.id}">
-                    <option value="${userPage.id}">
-                      <c:out value="${userPage.name}"/>
-                    </option>
-                  </c:if>
-                </c:forEach>
-              </c:forEach>
-            </select>
-          </div>
-        </div>
-      </fieldset>
-    </form>
-  </div>
-  <div class="modal-footer">
-    <a href="#" class="btn" onclick="$('#moveWidgetModal').modal('hide');"><fmt:message key="_rave_client.common.cancel"/></a>
-    <a href="#" class="btn btn-primary" onclick="rave.layout.moveWidgetToPage($('#moveWidgetModal').data('regionWidgetId'));"><fmt:message key="_rave_client.common.move"/></a>
-  </div>
-</div>
-
-<div id="sharePageDialog" class="modal hide" data-backdrop="static">
-  <div class="modal-header">
-    <a href="#" class="close" data-dismiss="modal">&times;</a>
-    <h3><fmt:message key="page.general.search.title"/></h3>
-  </div>
-  <div class="modal-body">
-    <div id="sharePageDialogContent" >
-      <div id="shareContent">
-        <div id="searchControls"><input id="searchTerm" name="searchTerm" type="text"/>
-          <input id="shareSearchButton" value="<fmt:message key="page.store.search.button"/>" type="submit"/>
-          <input id="clearSearchButton" value="<fmt:message key="admin.clearsearch"/>" type="submit" class="hide"/>
-        </div>
-        <div id="shareSearchListHeader"></div>
-        <div id="shareSearchListPaging"></div>
-        <div id="shareSearchResults"></div>
-      </div>
-    </div>
-  </div>
-  <div class="modal-footer">
-    <a href="#" class="btn" onclick="$('#sharePageDialog').modal('hide');"><fmt:message key="_rave_client.common.cancel"/></a>
-  </div>
-</div>
-
-<div id="confirmSharePageDialog" class="modal hide" data-backdrop="static">
-  <div class="modal-header">
-    <a href="#" class="close" data-dismiss="modal">&times;</a>
-    <h3><fmt:message key="sharing.dialog.confirm.title"/></h3>
-  </div>
-  <div class="modal-body">
-    <div id="confirmSharePageDialogLegend">
-      <fmt:message key="sharing.dialog.confirm.message">
-        <fmt:param value="${page.owner.username}"/>
-      </fmt:message>
-    </div>
-  </div>
-  <div class="modal-footer">
-    <a href="#" class="btn btn-primary" onclick="rave.layout.searchHandler.acceptShare()"><fmt:message key="_rave_client.common.accept"/></a>
-    <a href="#" class="btn" onclick="rave.layout.searchHandler.declineShare();"><fmt:message key="_rave_client.common.decline"/></a>
-    <a href="#" class="btn" onclick="$('#confirmSharePageDialog').modal('hide');"><fmt:message key="_rave_client.common.cancel"/></a>
-  </div>
+<div id="moveWidgetDialog" title="${moveWidgetToPageTitle}" class="dialog hidden">
+  <div><fmt:message key="widget.menu.movethiswidget"/></div>
+  <form id="moveWidgetForm">
+    <select id="moveToPageId">
+      <c:forEach var="userPage" items="${pages}">
+        <c:if test="${userPage.id != page.id}">
+          <option value="${userPage.id}">
+            <c:out value="${userPage.name}"/>
+          </option>
+        </c:if>
+      </c:forEach>
+    </select>
+  </form>
 </div>

Modified: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs.jsp
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs.jsp?rev=1386900&r1=1386899&r2=1386900&view=diff
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs.jsp (original)
+++ rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/jsp/views/pages/userpage/page-tabs.jsp Mon Sep 17 23:05:14 2012
@@ -1,9 +1,7 @@
 <%@ page language="java" trimDirectiveWhitespaces="true" %>
 <%@ include file="/WEB-INF/jsp/includes/taglibs.jsp" %>
 <fmt:setBundle basename="messages"/>
-<jsp:useBean id="pages" type="java.util.List<org.apache.rave.portal.model.Page>" scope="request"/>
-<jsp:useBean id="pageUser" type="org.apache.rave.portal.model.PageUser" scope="request"/>
-<jsp:useBean id="pageLayouts" type="java.util.List<org.apache.rave.portal.model.JpaPageLayout>" scope="request"/>
+<sec:authentication property="principal.username" var="principleUsername" scope="request"/>
 
 <c:set var="hasOnlyOnePage" scope="request">
   <c:choose>

Modified: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/nested-dispatcher-servlet.xml
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/nested-dispatcher-servlet.xml?rev=1386900&r1=1386899&r2=1386900&view=diff
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/nested-dispatcher-servlet.xml (original)
+++ rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/nested-dispatcher-servlet.xml Mon Sep 17 23:05:14 2012
@@ -147,10 +147,22 @@
     <constructor-arg index="4" value="true"/>
   </bean>
 
+  <util:map id="routeInterceptors">
+    <entry key="userPage">
+      <list>
+        <bean class="org.apache.rave.portal.web.mvc.interceptors.MobileDeviceInterceptor"/>
+        <bean class="org.apache.rave.portal.web.mvc.interceptors.AuthenticatedUserInterceptor"/>
+        <bean class="org.apache.rave.portal.web.mvc.interceptors.UserPageInterceptor"/>
+      </list>
+    </entry>
+  </util:map>
+
   <!-- JCR|File based LOADING -->
   <bean name="nestedHandlerMethodHandlerMapping" class="org.apache.rave.portal.web.mvc.NestedHandlerMethodHandlerMapping">
     <property name="order" value="-1"/>
     <property name="configManager" ref="enhancedPagesConfigManager"/>
+    <property name="interceptors" ref="interceptors"/>
+    <property name="routeInterceptors" ref="routeInterceptors"/>
   </bean>
 
   <bean id="jcrPagesConfigManager" class="org.apache.rave.portal.web.mvc.config.jcr.JcrPagesConfigManager" destroy-method="shutdown">

Modified: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/page-definitions.xml
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/page-definitions.xml?rev=1386900&r1=1386899&r2=1386900&view=diff
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/page-definitions.xml (original)
+++ rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/page-definitions.xml Mon Sep 17 23:05:14 2012
@@ -19,12 +19,21 @@
   -->
 <pageDefinitions name="default">
 
-  <pageFragment name="/userPage" viewName="pages/userpage/page" controller="org.apache.rave.portal.web.mvc.controller.UserPageController">
-    <pageFragment name="header" viewName="pages/userpage/page-header" controller="org.apache.rave.portal.web.mvc.controller.PageHeaderController"/>
-    <pageFragment name="body" viewName="pages/userpage/page-body">
-      <pageFragment name="tabs" viewName="pages/userpage/page-tabs"/>
-      <pageFragment name="content" viewName="pages/userpage/page-content"/>
+  <pageFragment name="userPage"    viewName="jcr:/pages/userpage/page" extends="extended">
+    <pageFragment name="body"      viewName="pages/userpage/page-body">
+      <pageFragment name="tabs"    viewName="pages/userpage/page-tabs"    controller="org.apache.rave.portal.web.mvc.controller.UserPageTabsController"/>
+      <pageFragment name="content" viewName="pages/userpage/page-content" controller="org.apache.rave.portal.web.mvc.controller.UserPageContentController">
+        <pageFragment name="layout"                                       controller="org.apache.rave.portal.web.mvc.controller.UserPageLayoutController"/>
+      </pageFragment>
     </pageFragment>
+  </pageFragment>
+
+  <pageFragment name="extended" viewName="pages/userpage/page" extends="standard">
+    <pageFragment name="header" viewName="pages/userpage/page-header" controller="org.apache.rave.portal.web.mvc.controller.PageHeaderController"/>
+  </pageFragment>
+
+  <pageFragment name="standard" viewName="pages/userpage/page">
+    <pageFragment name="header" viewName="pages/header"/>
     <pageFragment name="footer" viewName="pages/footer"/>
   </pageFragment>
 

Modified: rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/routes.xml
URL: http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/routes.xml?rev=1386900&r1=1386899&r2=1386900&view=diff
==============================================================================
--- rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/routes.xml (original)
+++ rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/routes.xml Mon Sep 17 23:05:14 2012
@@ -18,9 +18,9 @@
   under the License.
   -->
 <routes name="default">
-  <route path="/"                    target="/userPage" action="defaultPage"/>
-  <route path="/page"                target="/userPage" action="defaultPage"/>
-  <route path="/page/view"           target="/userPage" action="defaultPage"/>
-  <route path="/page/view/{pageId}"  target="/userPage"/>
+  <route path="/"                    target="/userPage" interceptors="userPage"/>
+  <route path="/page"                target="/userPage" interceptors="userPage"/>
+  <route path="/page/view"           target="/userPage" interceptors="userPage"/>
+  <route path="/page/view/{pageId}"  target="/userPage" interceptors="userPage"/>
   <route path="/dynapi/rest/widgets" target="org.apache.rave.portal.web.mvc.api.rest.DynWidgetApi"/>
 </routes>