Index: site-manage-link-helper/src/java/org/sakaiproject/site/tool/LinkAction.java =================================================================== --- site-manage-link-helper/src/java/org/sakaiproject/site/tool/LinkAction.java (revision 0) +++ site-manage-link-helper/src/java/org/sakaiproject/site/tool/LinkAction.java (revision 0) @@ -0,0 +1,319 @@ +/********************************************************************************** + * $URL$ + * $Id$ + *********************************************************************************** + * + * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation + * + * Licensed under the Educational Community 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.osedu.org/licenses/ECL-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.sakaiproject.site.tool; + +import java.io.IOException; + +import java.util.Properties; +import java.util.Iterator; +import java.util.List; +import java.util.ArrayList; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.sakaiproject.authz.api.AuthzGroup; +import org.sakaiproject.authz.api.GroupNotDefinedException; +import org.sakaiproject.authz.api.Role; +import org.sakaiproject.authz.cover.AuthzGroupService; +import org.sakaiproject.cheftool.Context; +import org.sakaiproject.cheftool.JetspeedRunData; +import org.sakaiproject.cheftool.RunData; +import org.sakaiproject.cheftool.VelocityPortlet; +import org.sakaiproject.cheftool.VelocityPortletPaneledAction; +import org.sakaiproject.component.cover.ServerConfigurationService; +import org.sakaiproject.entity.api.Reference; +import org.sakaiproject.entity.cover.EntityManager; +import org.sakaiproject.entity.api.ResourcePropertiesEdit; +import org.sakaiproject.event.api.SessionState; +import org.sakaiproject.exception.IdUnusedException; +import org.sakaiproject.site.api.Site; +import org.sakaiproject.site.api.SitePage; +import org.sakaiproject.site.api.SiteService.SortType; +import org.sakaiproject.site.api.ToolConfiguration; +import org.sakaiproject.site.cover.SiteService; +import org.sakaiproject.tool.api.Tool; +import org.sakaiproject.tool.api.ToolException; +import org.sakaiproject.tool.api.ToolSession; +import org.sakaiproject.tool.api.Placement; +import org.sakaiproject.tool.api.Session; +import org.sakaiproject.tool.api.ToolSession; +import org.sakaiproject.tool.cover.SessionManager; +import org.sakaiproject.tool.cover.ToolManager; +import org.sakaiproject.util.ResourceLoader; +import org.sakaiproject.util.StringUtil; +import org.sakaiproject.util.ParameterParser; +import org.sakaiproject.user.api.User; +import org.sakaiproject.user.api.UserNotDefinedException; +import org.sakaiproject.user.cover.UserDirectoryService; + +/** + *

+ * LinkAction allows site owners to link a site to a parent. + *

+ */ +public class LinkAction extends VelocityPortletPaneledAction +{ + /** Resource bundle using current language locale */ + protected static ResourceLoader rb = new ResourceLoader("link"); + + private static final Log logger = LogFactory.getLog(LinkAction.class); + + private static final String LINK_MODE = "link_mode"; + private static final String MODE_DONE = "helper.done"; + + /** + * Get the current site page our current tool is placed on. + * + * @return The site page id on which our tool is placed. + */ + protected String getCurrentSitePageId() + { + ToolSession ts = SessionManager.getCurrentToolSession(); + if (ts != null) + { + ToolConfiguration tool = SiteService.findTool(ts.getPlacementId()); + if (tool != null) + { + return tool.getPageId(); + } + } + + return null; + } + + /** + * Get the current site id + * @throws SessionDataException + * @return Site id (GUID) + */ + private String getSiteId() throws SessionDataException + { + Placement placement = ToolManager.getCurrentPlacement(); + + if (placement == null) + { + throw new SessionDataException("No current tool placement"); + } + return placement.getContext(); + } + + /** + * Get a site property by name + * + * @param name Property name + * @throws IdUnusedException, SessionDataException + * @return The property value (null if none) + */ + private String getSiteProperty(String name) throws IdUnusedException, SessionDataException + { + Site site; + + site = SiteService.getSite(getSiteId()); + return site.getProperties().getProperty(name); + } + + /** + * Setup the velocity context and choose the template for the response. + */ + public String buildMainPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) + { + // set the resource bundle with our strings + context.put("tlang", rb); + + context.put("doSave", BUTTON + "doSave"); + context.put("doCancel", BUTTON + "doCancel"); + context.put("doRemove", BUTTON + "doRemove"); + try + { + Site site; + String siteId = getSiteId(); + + site = SiteService.getSite(siteId); + String parentId = site.getProperties().getProperty("sakai:parent-id"); + context.put("currentSite", site); + if ( parentId != null ) { + // Make sure parent site exists before we show it. + // If the parent site does not exist, clear the property + try { + Site parentSite = SiteService.getSite(parentId); + context.put("parentId", parentId); + context.put("parentTitle", parentSite.getTitle()); + return "sakai_link"; + } catch (Exception e) { + addAlert(state,rb.getString("alert.parent.removed")+" "+parentId); + ResourcePropertiesEdit rpe = site.getPropertiesEdit(); + rpe.removeProperty("sakai:parent-id"); + SiteService.save(site); + } + } + + // Give the user a list of sites to select as parent + List sites = SiteService.getSites( + org.sakaiproject.site.api.SiteService.SelectionType.UPDATE, + null, null, null, SortType.TITLE_ASC, null); + + List goodSites = new ArrayList (); + // Do not include any sites which point to us as a parent + // Do not include ourself in the candidate list + for (Iterator i = sites.iterator(); i.hasNext(); ) { + Site thisSite = (Site) i.next(); + String pid = thisSite.getProperties().getProperty("sakai:parent-id"); + if ( siteId.equals(pid) ) continue; + if ( siteId.equals(thisSite.getId()) ) continue; + goodSites.add(thisSite); + } + if ( goodSites.size() > 0 ) context.put("sites", goodSites); + } + catch (Exception e) + { + addAlert(state,rb.getString("error.cannot.access")); + } + + return "sakai_link"; + } + + /** + * Handle the configure context's update button + */ + public void doSave(RunData data, Context context) + { + // TODO: if we do limit the initState() calls, we need to make sure we get a new one after this call -ggolden + + String peid = ((JetspeedRunData) data).getJs_peid(); + SessionState state = ((JetspeedRunData) data).getPortletSessionState(peid); + ParameterParser params = data.getParameters(); + String parentId = params.getString("parentSite"); + + if ( ! SiteService.allowUpdateSite(parentId) ) + { + addAlert(state,rb.getString("error.cannot.update")); + return; + } + + try + { + Site site; + site = SiteService.getSite(getSiteId()); + ResourcePropertiesEdit rpe = site.getPropertiesEdit(); + rpe.addProperty("sakai:parent-id", parentId); + SiteService.save(site); + SessionManager.getCurrentToolSession().setAttribute(LINK_MODE, MODE_DONE); + scheduleTopRefresh(); + } + catch (Exception e) + { + addAlert(state,rb.getString("error.cannot.update")); + } + + } + + /** + * doRemove - Clear the parent id value + */ + public void doRemove(RunData data, Context context) + { + // access the portlet element id to find our state + String peid = ((JetspeedRunData) data).getJs_peid(); + SessionState state = ((JetspeedRunData) data).getPortletSessionState(peid); + + try + { + Site site; + site = SiteService.getSite(getSiteId()); + ResourcePropertiesEdit rpe = site.getPropertiesEdit(); + rpe.removeProperty("sakai:parent-id"); + SiteService.save(site); + SessionManager.getCurrentToolSession().setAttribute(LINK_MODE, MODE_DONE); + scheduleTopRefresh(); + } + catch (Exception e) + { + addAlert(state,rb.getString("error.cannot.remove")); + } + } + + /** + * doCancel called for form input tags type="submit" named="eventSubmit_doCancel" cancel the options process + */ + public void doCancel(RunData data, Context context) + { + // access the portlet element id to find our state + String peid = ((JetspeedRunData) data).getJs_peid(); + SessionState state = ((JetspeedRunData) data).getPortletSessionState(peid); + SessionManager.getCurrentToolSession().setAttribute(LINK_MODE, MODE_DONE); + scheduleTopRefresh(); + } + + /** + * Note a "local" problem (we failed to get session or site data) + */ + private static class SessionDataException extends Exception + { + public SessionDataException(String text) + { + super(text); + } + } + + + /* (non-Javadoc) + * @see org.sakaiproject.cheftool.VelocityPortletPaneledAction#toolModeDispatch(java.lang.String, java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + protected void toolModeDispatch(String methodBase, String methodExt, HttpServletRequest req, HttpServletResponse res) + throws ToolException + { + ToolSession toolSession = SessionManager.getCurrentToolSession(); + SessionState state = getState(req); + + if (MODE_DONE.equals(toolSession.getAttribute(LINK_MODE))) + { + + Tool tool = ToolManager.getCurrentTool(); + + String url = (String) SessionManager.getCurrentToolSession().getAttribute(tool.getId() + Tool.HELPER_DONE_URL); + + SessionManager.getCurrentToolSession().removeAttribute(tool.getId() + Tool.HELPER_DONE_URL); + SessionManager.getCurrentToolSession().removeAttribute(LINK_MODE); + + try + { + res.sendRedirect(url); + } + catch (IOException e) + { + logger.warn("IOException: ", e); + } + return; + } + else if(sendToHelper(req, res, req.getPathInfo())) + { + return; + } + else + { + super.toolModeDispatch(methodBase, methodExt, req, res); + } + } +} Property changes on: site-manage-link-helper/src/java/org/sakaiproject/site/tool/LinkAction.java ___________________________________________________________________ Added: svn:keywords + Date Revision Author HeadURL Id Added: svn:eol-style + native Index: site-manage-link-helper/src/bundle/link.properties =================================================================== --- site-manage-link-helper/src/bundle/link.properties (revision 0) +++ site-manage-link-helper/src/bundle/link.properties (revision 0) @@ -0,0 +1,15 @@ +gen.alert = Alert +gen.save = Set Link +gen.cancel = Cancel +gen.remove = Remove Link +gen.done = Done + +java.selectparent=Linking this site to a parent site does not affect membership or permission or tool behavior or tool content in either the parent or child sites. Linking to a parent site simply means that for users who are members of both sites and have permission to view both sites, they will see navigation hints and breadcrumb navigation showing site links between the parent and child sites. A site can have many child sites pointing to it, but a child site can have only one parent. + +java.please.select=---- Please Select Parent Site---- + +error.cannot.update=Could not set parent id for site. +error.cannot.remove=Could not remove parent id from site. +error.cannot.access=Error accessing site information. +error.nosites=You do not have access to any suitable parent sites. +alert.parent.removed=Parent site no longer exists, link removed. Property changes on: site-manage-link-helper/src/bundle/link.properties ___________________________________________________________________ Added: svn:eol-style + native Index: site-manage-link-helper/src/webapp/tools/sakai.siteinfo.link.helper.xml =================================================================== --- site-manage-link-helper/src/webapp/tools/sakai.siteinfo.link.helper.xml (revision 0) +++ site-manage-link-helper/src/webapp/tools/sakai.siteinfo.link.helper.xml (revision 0) @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + Property changes on: site-manage-link-helper/src/webapp/tools/sakai.siteinfo.link.helper.xml ___________________________________________________________________ Added: svn:eol-style + native Index: site-manage-link-helper/src/webapp/vm/sakai_link.vm =================================================================== --- site-manage-link-helper/src/webapp/vm/sakai_link.vm (revision 0) +++ site-manage-link-helper/src/webapp/vm/sakai_link.vm (revision 0) @@ -0,0 +1,42 @@ +
+#if ($alertMessage) +
$tlang.getString("gen.alert") $validator.escapeHtml($alertMessage)
+#end +#if ($parentId) +

Current Parent Site: $parentTitle ($parentId)

+
+

+ + +

+
+#else +

$tlang.getString('java.selectparent')

+
+#if ( $sites ) + +#else +

+

$tlang.getString('error.nosites')
+

+#end +

+#if ( $sites ) + +#end + +

+
+#end +
Property changes on: site-manage-link-helper/src/webapp/vm/sakai_link.vm ___________________________________________________________________ Added: svn:keywords + Date Revision Author HeadURL Id Added: svn:eol-style + native Index: site-manage-link-helper/src/webapp/WEB-INF/web.xml =================================================================== --- site-manage-link-helper/src/webapp/WEB-INF/web.xml (revision 0) +++ site-manage-link-helper/src/webapp/WEB-INF/web.xml (revision 0) @@ -0,0 +1,55 @@ + + + sakai-site-manage-link-helper + sakai-site-manage-link-helper + + + + sakai.request + org.sakaiproject.util.RequestFilter + + + + sakai.request + sakai-site-manage-link-helper + REQUEST + FORWARD + INCLUDE + + + + + + sakai.vm + + + org.sakaiproject.vm.VelocityServlet + + + properties + velocity.properties + + 1 + + + + + sakai-site-manage-link-helper + + + org.sakaiproject.site.tool.LinkAction + + + template + web/chef_iframe + + 1 + + + + org.sakaiproject.util.ToolListener + + + Property changes on: site-manage-link-helper/src/webapp/WEB-INF/web.xml ___________________________________________________________________ Added: svn:eol-style + native Index: site-manage-link-helper/src/webapp/velocity.properties =================================================================== --- site-manage-link-helper/src/webapp/velocity.properties (revision 0) +++ site-manage-link-helper/src/webapp/velocity.properties (revision 0) @@ -0,0 +1,107 @@ +#---------------------------------------------------------------------------- +# These are the override settiongs over the default properties for the +# Velocity Runtime. +#---------------------------------------------------------------------------- + +#---------------------------------------------------------------------------- +# R U N T I M E L O G +#---------------------------------------------------------------------------- + +# log to our existing log4j +runtime.log.logsystem.class = org.apache.velocity.runtime.log.SimpleLog4JLogSystem + +# use vm.info.toolname to get info and up messages +# use vm.warn.toolname to get warn and up messages +# use vm.error.toolname to get only error messages +# use vm.none to get no messages +runtime.log.logsystem.log4j.category = vm.none + +# use this for no logging +#runtime.log.logsystem.class = org.apache.velocity.runtime.log.NullLogSystem + +#---------------------------------------------------------------------------- +# T E M P L A T E E N C O D I N G +#---------------------------------------------------------------------------- + +# This encoding is needed to properly pass through international Unicode characters +input.encoding=UTF-8 +output.encoding=UTF-8 + +#---------------------------------------------------------------------------- +# F O R E A C H P R O P E R T I E S +#---------------------------------------------------------------------------- +# These properties control how the counter is accessed in the #foreach +# directive. By default the reference $velocityCount will be available +# in the body of the #foreach directive. The default starting value +# for this reference is 1. +#---------------------------------------------------------------------------- + +###directive.foreach.counter.name = velocityCount +###directive.foreach.counter.initial.value = 1 + +#---------------------------------------------------------------------------- +# I N C L U D E P R O P E R T I E S +#---------------------------------------------------------------------------- +# These are the properties that governed the way #include'd content +# is governed. +#---------------------------------------------------------------------------- + +###directive.include.output.errormsg.start = + +#---------------------------------------------------------------------------- +# P A R S E P R O P E R T I E S +#---------------------------------------------------------------------------- + +directive.parse.max.depth = 10 + +#---------------------------------------------------------------------------- +# T E M P L A T E L O A D E R S +#---------------------------------------------------------------------------- +# +# +#---------------------------------------------------------------------------- + +resource.loader = file, classpath + +file.resource.loader.description = Velocity File Resource Loader +file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader +file.resource.loader.path = .,WebRoot +file.resource.loader.cache = true +file.resource.loader.modificationCheckInterval = 0 + +classpath.resource.loader.description = Velocity Classpath Resource Loader +classpath.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader + +#---------------------------------------------------------------------------- +# VELOCIMACRO PROPERTIES +#---------------------------------------------------------------------------- +# global : name of default global library. It is expected to be in the regular +# template path. You may remove it (either the file or this property) if +# you wish with no harm. +#---------------------------------------------------------------------------- +velocimacro.library = VM_chef_library.vm + +###velocimacro.permissions.allow.inline = true +###velocimacro.permissions.allow.inline.to.replace.global = false +###velocimacro.permissions.allow.inline.local.scope = false + +###velocimacro.context.localscope = false + +#---------------------------------------------------------------------------- +# INTERPOLATION +#---------------------------------------------------------------------------- +# turn off and on interpolation of references and directives in string +# literals. ON by default :) +#---------------------------------------------------------------------------- +###runtime.interpolate.string.literals = true + + +#---------------------------------------------------------------------------- +# RESOURCE MANAGEMENT +#---------------------------------------------------------------------------- +# Allows alternative ResourceManager and ResourceCache implementations +# to be plugged in. +#---------------------------------------------------------------------------- +resource.manager.class = org.apache.velocity.runtime.resource.ResourceManagerImpl +resource.manager.cache.class = org.apache.velocity.runtime.resource.ResourceCacheImpl Property changes on: site-manage-link-helper/src/webapp/velocity.properties ___________________________________________________________________ Added: svn:eol-style + native Index: site-manage-link-helper/pom.xml =================================================================== --- site-manage-link-helper/pom.xml (revision 0) +++ site-manage-link-helper/pom.xml (revision 0) @@ -0,0 +1,111 @@ + + + 4.0.0 + + site-manage-base + org.sakaiproject + M2 + ../pom.xml + + site-manage-link-helper + org.sakaiproject + sakai-site-manage-link-helper + + The Sakai Foundation + http://sakaiproject.org/ + + 2003 + war + + + org.sakaiproject + sakai-authz-api + ${sakai.version} + + + org.sakaiproject + sakai-entity-api + ${sakai.version} + + + org.sakaiproject + sakai-event-api + ${sakai.version} + + + org.sakaiproject + sakai-site-api + ${sakai.version} + + + org.sakaiproject + sakai-tool-api + ${sakai.version} + + + org.sakaiproject + sakai-util-api + ${sakai.version} + + + org.sakaiproject + sakai-util + ${sakai.version} + + + org.sakaiproject + sakai-user-api + ${sakai.version} + + + org.sakaiproject + sakai-component-api + ${sakai.version} + + + javax.servlet + servlet-api + + + commons-logging + commons-logging + 1.0.4 + + + org.sakaiproject + sakai-velocity-tool-api + ${sakai.version} + + + org.sakaiproject + sakai-velocity-tool + ${sakai.version} + + + + velocity + velocity + 1.3.1 + + + logkit + logkit + 1.2 + + + oro + oro + 2.0.8 + + + + + + ${basedir}/src/bundle + + **/*.properties + + + + + Property changes on: site-manage-link-helper/pom.xml ___________________________________________________________________ Added: svn:eol-style + native Index: site-manage-tool/tool/src/java/org/sakaiproject/site/tool/SiteAction.java =================================================================== --- site-manage-tool/tool/src/java/org/sakaiproject/site/tool/SiteAction.java (revision 67427) +++ site-manage-tool/tool/src/java/org/sakaiproject/site/tool/SiteAction.java (working copy) @@ -1683,7 +1683,18 @@ if (allowUpdateSite) { + // show add parent sites menu if (!isMyWorkspace) { + if (notStealthOrHiddenTool("sakai-site-manage-link-helper")) { + b.add(new MenuEntry(rb.getString("java.link"), + "doLinkHelper")); + } + } + } + + if (allowUpdateSite) + { + if (!isMyWorkspace) { List gradToolsSiteTypes = (List) state .getAttribute(GRADTOOLS_SITE_TYPES); boolean isGradToolSite = false; @@ -2953,7 +2964,27 @@ // launch the helper startHelper(data.getRequest(), "sakai-site-pageorder-helper"); } + + + /** + * Launch the Link Helper Tool -- for setting/clearing parent site + * + * @see case 12 // TODO + * + */ + public void doLinkHelper(RunData data) { + SessionState state = ((JetspeedRunData) data) + .getPortletSessionState(((JetspeedRunData) data).getJs_peid()); + // pass in the siteId of the site to be ordered (so it can configure + // sites other then the current site) + SessionManager.getCurrentToolSession().setAttribute( + HELPER_ID + ".siteId", ((Site) getStateSite(state)).getId()); + + // launch the helper + startHelper(data.getRequest(), "sakai-site-manage-link-helper"); + } + // htripath: import materials from classic /** * Master import -- for import materials from a file Index: site-manage-tool/tool/src/bundle/sitesetupgeneric.properties =================================================================== --- site-manage-tool/tool/src/bundle/sitesetupgeneric.properties (revision 67427) +++ site-manage-tool/tool/src/bundle/sitesetupgeneric.properties (working copy) @@ -27,6 +27,7 @@ java.duplicate = Duplicate Site java.import = Import from Site java.importFile = Import from File +java.link = Link to Parent Site java.newsite = New Site java.saveas = Save As java.dontperm = could not be deleted. You do not have permission to remove this site. Index: pom.xml =================================================================== --- pom.xml (revision 67427) +++ pom.xml (working copy) @@ -19,5 +19,6 @@ site-manage-tool/tool site-manage-util/util pageorder/tool + site-manage-link-helper