Author: woonsan
Date: Wed Dec 23 14:01:58 2009
New Revision: 893517

URL: http://svn.apache.org/viewvc?rev=893517&view=rev
Log:
JS2-1057: Hierarchical space page/folder navigation. Also, changes to copy 
space template folder during space creation.

Modified:
    
portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/spaces/SpacesManager.java
    
portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/spaces/page-navigator.jsp

Modified: 
portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/spaces/SpacesManager.java
URL: 
http://svn.apache.org/viewvc/portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/spaces/SpacesManager.java?rev=893517&r1=893516&r2=893517&view=diff
==============================================================================
--- 
portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/spaces/SpacesManager.java
 (original)
+++ 
portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/spaces/SpacesManager.java
 Wed Dec 23 14:01:58 2009
@@ -18,7 +18,6 @@
 
 import java.io.IOException;
 import java.util.Locale;
-import java.util.Random;
 
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
@@ -34,13 +33,14 @@
 import org.apache.jetspeed.decoration.DecorationFactory;
 import org.apache.jetspeed.om.folder.Folder;
 import org.apache.jetspeed.om.page.Fragment;
-import org.apache.jetspeed.om.page.Page;
 import org.apache.jetspeed.om.portlet.GenericMetadata;
 import org.apache.jetspeed.page.PageManager;
 import org.apache.jetspeed.portlets.toolbox.ThemeBean;
 import org.apache.jetspeed.spaces.Spaces;
 import org.apache.portals.bridges.common.GenericServletPortlet;
 import org.apache.portals.messaging.PortletMessaging;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Spaces Manager
@@ -50,6 +50,12 @@
  */
 public class SpacesManager extends GenericServletPortlet 
 {
+    
+    private static final String DEFAULT_SPACE_TEMPLATE = 
"/_user/template-space";
+    private static final String SPACE_TEMPLATE = "SpaceTemplate";
+
+    private static Logger log = LoggerFactory.getLogger(SpacesManager.class);
+    
     protected PageManager pageManager;
     private PortalAdministration admin;    
     
@@ -119,18 +125,24 @@
             {
                 String folderName = name.replace(' ', '_');                    
            
                 String spacePath = "/" + folderName; // TODO: make this 
configurable
-                System.out.println("adding space named = " + spacePath);
-                Folder folder = pageManager.newFolder(spacePath);
-                folder.setDefaultDecorator(theme, Fragment.LAYOUT);
-                folder.setDefaultDecorator(theme, Fragment.PORTLET);
-                GenericMetadata metadata = folder.getMetadata();
+                
+                String templateFolderPath = 
actionRequest.getPreferences().getValue(SPACE_TEMPLATE, DEFAULT_SPACE_TEMPLATE);
+                
+                if (!pageManager.folderExists(templateFolderPath))
+                {
+                    throw new PortletException("Space template folder does not 
exist: " + templateFolderPath);
+                }
+                
+                Folder templateFolder = 
pageManager.getFolder(templateFolderPath);
+                Folder spaceFolder = createSpaceFolder(spacePath, 
templateFolder, null);
+                
+                spaceFolder.setDefaultDecorator(theme, Fragment.LAYOUT);
+                spaceFolder.setDefaultDecorator(theme, Fragment.PORTLET);
+                GenericMetadata metadata = spaceFolder.getMetadata();
                 metadata.addField(Locale.ENGLISH, "space-owner", 
actionRequest.getUserPrincipal().getName());
-                folder.setTitle((title == null) ? name : title);
-                pageManager.updateFolder(folder);
-                //add default page
-                Page source = 
pageManager.getPage("/_user/template/space-home.psml");                
-                Page home = pageManager.copyPage(source, spacePath + 
"/default-page.psml");
-                pageManager.updatePage(home);
+                spaceFolder.setTitle((title == null) ? name : title);
+                pageManager.updateFolder(spaceFolder);
+                
                 // TODO: remove publish to JetspeedNavigator when 
replaced/removed for Space+PageNavigator
                 PortletMessaging.publish(actionRequest, "JetspeedNavigator", 
"spaceChange", name);                
                 PortletMessaging.publish(actionRequest, "SpaceNavigator", 
"spaceChange", name);
@@ -139,19 +151,54 @@
                 String path = admin.getPortalURL(actionRequest, 
actionResponse, spacePath);
                 actionResponse.sendRedirect(path);                        
             }
-            catch (Throwable t)
+            catch (Exception e)
             {
-                t.printStackTrace();
+                log.error("Failed to create space.", e);
             }
         }
-   }        
+    }        
+    
+    private String scrapeParameter(ActionRequest request, String paramName)
+    {
+        String param = request.getParameter(paramName);
+        if (param == null)
+            param = "";
+        param = param.trim();
+        return param;
+    }
     
-   private String scrapeParameter(ActionRequest request, String paramName)
-   {
-       String param = request.getParameter(paramName);
-       if (param == null)
-           param = "";
-       param = param.trim();
-       return param;
-   }
+    private Folder createSpaceFolder(String spacePath, Folder templateFolder, 
String owner)
+    {
+        Folder spaceFolder = null;
+        boolean found = false;
+        
+        try
+        {
+            spaceFolder = this.pageManager.getFolder(spacePath);
+            found = (spaceFolder != null);
+        }
+        catch (Exception ignore)
+        {
+        }
+        
+        try
+        {
+            if (!found)
+            {
+                pageManager.deepCopyFolder(templateFolder, spacePath, owner);
+            }
+            else
+            {
+                pageManager.deepMergeFolder(templateFolder, spacePath, owner);
+            }
+            
+            spaceFolder = pageManager.getFolder(spacePath);
+        }
+        catch (Exception e)
+        {
+            log.error("Failed to copy or merge folder.", e);
+        }
+        
+        return spaceFolder;
+    }
 }
\ No newline at end of file

Modified: 
portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/spaces/page-navigator.jsp
URL: 
http://svn.apache.org/viewvc/portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/spaces/page-navigator.jsp?rev=893517&r1=893516&r2=893517&view=diff
==============================================================================
--- 
portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/spaces/page-navigator.jsp
 (original)
+++ 
portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/spaces/page-navigator.jsp
 Wed Dec 23 14:01:58 2009
@@ -19,6 +19,8 @@
 <%...@page import="java.util.Locale"%>
 <%...@page import="java.text.DecimalFormat"%>
 <%...@page import="java.text.NumberFormat"%>
+<%...@page import="javax.portlet.RenderRequest"%>
+<%...@page import="javax.portlet.RenderResponse"%>
 <%...@page import="org.apache.jetspeed.spaces.Space"%>
 <%...@page import="org.apache.jetspeed.om.page.Page"%>
 <%...@page import="org.apache.jetspeed.om.page.Link"%>
@@ -31,22 +33,19 @@
 <%...@page import="org.apache.jetspeed.portlets.spaces.PageNavigator"%>
 
 <%@ page contentType="text/html" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core"; prefix="c"%>
 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"; prefix="fmt" %>
 <%@ taglib uri="http://java.sun.com/portlet"; prefix="portlet"%>
 
-<portlet:defineObjects/>
-<%
-RequestContext rc = 
(RequestContext)request.getAttribute(RequestContext.REQUEST_PORTALENV);
-Space space = (Space)renderRequest.getAttribute("space");
-Locale locale = renderRequest.getLocale();
-PageNavigator pageNavigator = 
(PageNavigator)renderRequest.getAttribute("pageNavigator");
-List<MenuElement> menuElements = (List<MenuElement>) 
renderRequest.getAttribute("spaceMenuElements");
-List<MenuElement> linkElements = (List<MenuElement>) 
renderRequest.getAttribute("spaceLinkElements");
-%>
-<table>
-       <tr><td class="portlet-section-body"><b><%=space.getTitle() %> 
Space</b></td> </tr>
-<%
-for (MenuElement element : menuElements)
+<%!
+private void printMenuItem(MenuElement element,
+                           int depth,
+                           javax.servlet.jsp.JspWriter out, 
+                           RenderRequest renderRequest, 
+                           RenderResponse renderResponse,
+                           RequestContext rc,
+                           Space space,
+                           PageNavigator pageNavigator) throws 
java.io.IOException
 {
     String type = element.getElementType();
     
@@ -57,51 +56,126 @@
         String folderUrl = folderMenu.getUrl();
         String url = pageNavigator.getAbsoluteUrl(folderUrl, renderResponse, 
rc);
         //TODO: why the folderMenu's name is null?
-        if (folderName == null) folderName = 
folderUrl.substring(space.getPath().length() + 1);
-        %>
-        <tr>
-          <td class="portlet-section-body"><a 
href="<%=url%>"><%=folderName%></a></td>
-        </tr>
-   <%
+        if (folderName == null)
+        {
+            folderName = folderUrl;
+            try
+            {
+                folderName = folderName.substring(space.getPath().length() + 
1);
+            }
+            catch (Exception ignore)
+            {
+            }
+        }
+        
+        String namespace = renderResponse.getNamespace();
+        String folderId = namespace + folderUrl;
+        
+        out.write("<div>");
+        
+        if (depth > 0) 
+        {
+            out.write("<img height='20' width='" + (depth * 16) + "' src='" + 
renderRequest.getContextPath() + "/images/tree/noline.gif' align='absmiddle' 
/>");
+        }
+        
+        out.write("<img src='" + renderRequest.getContextPath() + 
"/images/folder.gif' align='absmiddle' />&nbsp;");
+        out.write("<a folderId='" + folderId + "' href='#' onclick='return " + 
namespace + "toggleFolder(this);'>" + folderName + "</a></div>");
+        out.write("\n");
+        
+        List<MenuElement> childElements = (List<MenuElement>) 
folderMenu.getElements();
+        
+        if (childElements != null && !childElements.isEmpty())
+        {
+            out.write("<div id='" + folderId + "' style=\"DISPLAY: none\">");
+            
+            for (MenuElement child : childElements)
+            {
+                printMenuItem(child, depth + 1, out, renderRequest, 
renderResponse, rc, space, pageNavigator);
+            }
+            
+            out.write("</div>");
+            out.write("\n");
+        }        
     }
     else if (MenuElement.OPTION_ELEMENT_TYPE.equals(type))
-       {
-               MenuOption option = (MenuOption)element;
-               String url = pageNavigator.getAbsoluteUrl(option.getUrl(), 
renderResponse, rc);
-       %>     
-            <tr>
-              <td class="portlet-section-body"><a 
href="<%=url%>"><%=element.getTitle(locale) %></a></td>
-            </tr>
-       <%
-       }
+    {
+        MenuOption option = (MenuOption)element;
+        String url = pageNavigator.getAbsoluteUrl(option.getUrl(), 
renderResponse, rc);
+        
+        out.write("<div>");
+        
+        if (depth > 0) 
+        {
+            out.write("<img height='20' width='" + (depth * 16) + "' src='" + 
renderRequest.getContextPath() + "/images/tree/noline.gif' align='absmiddle' 
/>");
+        }
+        
+        out.write("<img src='" + renderRequest.getContextPath() + 
"/images/page.gif' align='absmiddle' />&nbsp;");
+        out.write("<a href='" + url + "'>" + 
element.getTitle(renderRequest.getLocale()) + "</a>");
+        
+        out.write("</div>");
+        out.write("\n");
+    }
 }
 %>
+
+<portlet:defineObjects/>
+<%
+RequestContext rc = (RequestContext) 
request.getAttribute(RequestContext.REQUEST_PORTALENV);
+Space space = (Space) renderRequest.getAttribute("space");
+Locale locale = renderRequest.getLocale();
+PageNavigator pageNavigator = (PageNavigator) 
renderRequest.getAttribute("pageNavigator");
+List<MenuElement> menuElements = (List<MenuElement>) 
renderRequest.getAttribute("spaceMenuElements");
+List<MenuElement> linkElements = (List<MenuElement>) 
renderRequest.getAttribute("spaceLinkElements");
+%>
+
+<script language="javascript">
+function <portlet:namespace/>toggleFolder(a) {
+    var folderId = a.getAttribute("folderId");
+    var div = document.getElementById(folderId);
+    if (div) {
+        div.style.display = (div.style.display == "none" ? "" : "none");
+    }
+    return false;
+}
+</script>
+
+<table>
     <tr>
-        <th class="portlet-section-header" colspan="1"></th>
+        <td class="portlet-section-body"><b><%=space.getTitle() %> 
Space</b></td>
+    </tr>
+    <tr>
+        <td class="portlet-section-body">
+<%
+for (MenuElement element : menuElements)
+{
+    printMenuItem(element, 0, out, renderRequest, renderResponse, rc, space, 
pageNavigator);
+}
+%>
+        </td>
     </tr>
 <%
 if (!linkElements.isEmpty())
 {
+%>
+    <tr>
+        <th class="portlet-section-header" colspan="1"></th>
+    </tr>
+    <tr>
+        <td class="portlet-section-body">
+<%
        for (MenuElement element : linkElements)
        {
-               if 
(element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE))
-               {
-                       MenuOption option = (MenuOption)element;
-                       String url = 
pageNavigator.getAbsoluteUrl(option.getUrl(), renderResponse, rc); 
-%>     
-     <tr>
-       <td class="portlet-section-body"><a 
href="<%=url%>"><%=element.getTitle(locale) %></a></td>
-     </tr>
-<%
-               }
+           printMenuItem(element, 0, out, renderRequest, renderResponse, rc, 
space, pageNavigator);
        }
 %>
-    <tr>
-        <th class="portlet-section-header" colspan="1"></th>
+        </td>
     </tr>
 <%
 }
 %>
+    <tr>
+        <th class="portlet-section-header" colspan="1"></th>
+    </tr>
 
 <%
 Object princ2 = renderRequest.getUserPrincipal();



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscr...@portals.apache.org
For additional commands, e-mail: jetspeed-dev-h...@portals.apache.org

Reply via email to