package org.sakaiproject.portal.portlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletConfig;
import javax.portlet.PortletException;
import javax.portlet.PortletMode;
import javax.portlet.PortletModeException;
import javax.portlet.PortletSecurityException;
import javax.portlet.PortletURL;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.portal.api.PortalService;
import org.sakaiproject.portal.api.PortletApplicationDescriptor;
import org.sakaiproject.portal.api.PortletDescriptor;
import org.sakaiproject.portal.render.cover.ToolRenderService;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.api.ToolConfiguration;
import org.sakaiproject.site.cover.SiteService;
public class PlacementPortlet extends GenericPortlet
{
private static final Log log = LogFactory.getLog(PlacementPortlet.class);
private PortletRenderEngine rengine;
private PortalService portalService;
@Override
public void processAction(ActionRequest request, ActionResponse response)
throws PortletException, IOException
{
// find the tool configuration and save the settings
String portletContext = request.getParameter("context");
String portletName = request.getParameter("portlet");
String placementId = (String) request
.getAttribute(PortalService.PLACEMENT_ATTRIBUTE);
String setportlet = request.getParameter("setportlet");
log.debug("Got, PortletContext:" + portletContext + "; PortletName:"
+ portletName + " Placement Id " + placementId);
if ("true".equals(setportlet))
{
// locate the placement, then the site in which the site is
try
{
ToolConfiguration config = SiteService.findTool(placementId);
Site siteEdit = SiteService.getSite(config.getSiteId());
// bind the placement to the site
config = siteEdit.getTool(placementId);
Properties p = config.getPlacementConfig();
log
.debug("Changing "
+ PortalService.TOOL_PORTLET_CONTEXT_PATH
+ " from "
+ p
.getProperty(PortalService.TOOL_PORTLET_CONTEXT_PATH)
+ " to " + portletContext);
log.debug("Changing " + PortalService.TOOL_PORTLET_NAME
+ " from "
+ p.getProperty(PortalService.TOOL_PORTLET_NAME)
+ " to " + portletName);
p.setProperty(PortalService.TOOL_PORTLET_CONTEXT_PATH,
portletContext);
p.setProperty(PortalService.TOOL_PORTLET_NAME, portletName);
config.save();
SiteService.save(siteEdit);
ToolRenderService.getInstance().reset(config);
log.debug("Save Complete ================================");
}
catch (IdUnusedException e)
{
throw new PortletException(
"Tool has no site to save configuration with ", e);
}
catch (PermissionException e)
{
throw new PortletSecurityException("Permission denied ", e);
}
}
}
@Override
public void init(PortletConfig config) throws PortletException
{
super.init(config);
// this should be a spring bean, but for the moment I dont want to bind
// to spring.
String renderEngineClass = config.getInitParameter("renderEngineImpl");
if (renderEngineClass == null || renderEngineClass.trim().length() == 0)
{
renderEngineClass = PortletRenderEngine.DEFAULT_RENDER_ENGINE;
}
try
{
Class c = Class.forName(renderEngineClass);
rengine = (PortletRenderEngine) c.newInstance();
rengine.init();
}
catch (Exception e)
{
throw new PortletException("Failed to start velocity ", e);
}
portalService = org.sakaiproject.portal.api.cover.PortalService
.getInstance();
}
public void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException
{
PortletRenderContext rcontext = rengine.newRenderContext(request);
rcontext.put("test", "testing");
rcontext.put("portletapplications", getPortletApplications(response));
try
{
response.setContentType("text/html");
rengine.render("view", rcontext, response.getWriter());
}
catch (Exception e)
{
throw new PortletException("Failed to render view template ", e);
}
}
protected void doEdit(RenderRequest request, RenderResponse response)
throws PortletException, IOException
{
PortletRenderContext rcontext = rengine.newRenderContext(request);
rcontext.put("test", "testing");
rcontext.put("portletapplications", getPortletApplications(response));
try
{
response.setContentType("text/html");
rengine.render("edit", rcontext, response.getWriter());
}
catch (Exception e)
{
throw new PortletException("Failed to render edit template ", e);
}
}
private List<Map> getPortletApplications(RenderResponse response)
throws PortletModeException
{
List<Map> portletApps = new ArrayList<Map>();
for (Iterator<PortletApplicationDescriptor> i = portalService
.getRegisteredApplications(); i.hasNext();)
{
PortletApplicationDescriptor portletApplication = i.next();
Map<String, Object> portletApp = new HashMap<String, Object>();
portletApp.put("name", portletApplication.getApplicationContext());
List<Map> portlets = new ArrayList<Map>();
for (Iterator<PortletDescriptor> pai = portletApplication
.getPortlets(); pai.hasNext();)
{
PortletDescriptor pd = pai.next();
Map<String, String> portletDesc = new HashMap<String, String>();
portletDesc.put("name", pd.getPortletName());
PortletURL purl = response.createActionURL();
purl.setParameter("context", portletApplication.getApplicationId());
purl.setParameter("portlet", pd.getPortletId());
purl.setParameter("setportlet", "true");
purl.setPortletMode(PortletMode.VIEW);
portletDesc.put("url", purl.toString());
portlets.add(portletDesc);
}
portletApp.put("portlets", portlets);
portletApps.add(portletApp);
}
return portletApps;
}
protected void doHelp(RenderRequest request, RenderResponse response)
throws PortletException, IOException
{
PortletRenderContext rcontext = rengine.newRenderContext(request);
rcontext.put("test", "testing");
try
{
response.setContentType("text/html");
rengine.render("help", rcontext, response.getWriter());
}
catch (Exception e)
{
throw new PortletException("Failed to render help template ", e);
}
}
}