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' /> "); + 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' /> "); + 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