package org.sakaiproject.portal.charon.handlers;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.portal.api.Portal;
import org.sakaiproject.portal.api.PortalHandlerException;
import org.sakaiproject.portal.api.PortalRenderContext;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.cover.SiteService;
import org.sakaiproject.tool.api.Session;
import org.sakaiproject.tool.api.ToolException;
import org.sakaiproject.portal.util.URLUtils;
/**
* Handler for managing the joining of a user to a site.
* Handles URLs like /portal/join/siteId. Will get user to login first if
* not already authenticated. Redirects back to site after a successful join
* or sends the user to the error page.
* @author buckett
*
*/
public class JoinHandler extends BasePortalHandler
{
private static final String URL_FRAGMENT = "join";
public JoinHandler()
{
setUrlFragment(URL_FRAGMENT);
}
@Override
public int doGet(String[] parts, HttpServletRequest req,
HttpServletResponse res, Session session)
throws PortalHandlerException
{
if ((parts.length == 3) && (parts[1].equals(URL_FRAGMENT)))
{
try {
showJoin(parts, req, res, session);
return END;
} catch (Exception e) {
throw new PortalHandlerException(e);
}
}
return NEXT;
}
@Override
public int doPost(String[] parts, HttpServletRequest req,
HttpServletResponse res, Session session)
throws PortalHandlerException {
if ((parts.length == 3) && (parts[1].equals(URL_FRAGMENT)))
{
try {
doJoin(parts, req, res, session);
return END;
} catch (Exception e) {
throw new PortalHandlerException(e);
}
}
return NEXT;
}
protected void doJoin(String[] parts, HttpServletRequest req,
HttpServletResponse res, Session session) throws ToolException, IOException {
String siteId = parts[2];
try
{
if (req.getParameter("join") != null) {
Site site = portal.getSiteHelper().getSite(siteId);
SiteService.getInstance().join(site.getId());
sendToSite(res, site);
} else {
// The user didn't opt to join so show the error.
portal.doError(req, res, session, Portal.ERROR_SITE);
}
}
catch (IdUnusedException e) {
portal.doError(req, res, session, Portal.ERROR_SITE);
} catch (PermissionException e) {
portal.doError(req, res, session, Portal.ERROR_SITE);
}
}
private void sendToSite(HttpServletResponse res, Site site)
throws IOException, IdUnusedException {
res.sendRedirect(site.getUrl());
}
protected void showJoin(String[] parts, HttpServletRequest req,
HttpServletResponse res, Session session) throws IOException, ToolException {
// Handle user not logged in.
if (session.getUserId() == null)
{
portal.doLogin(req, res, session, URLUtils.getSafePathInfo(req), false);
}
else
{
try
{
String siteId = parts[2];
// We use this as it
Site site = portal.getSiteHelper().getSite(siteId);
// Check that the current user can access the site before we redirect.
if (site.getUserRole(session.getUserId()) != null && SiteService.allowAccessSite(site.getId()))
{
sendToSite(res, site);
return;
}
if (site.isJoinable())
{
String siteType = portal.calcSiteType(site.getId());
String serviceName = ServerConfigurationService.getString("ui.service", "Sakai");
String title = serviceName+ " : "+ site.getTitle();
String skin = site.getSkin();
PortalRenderContext context = portal.startPageContext(siteType, title, skin, req);
context.put("currentSite", portal.getSiteHelper().convertSiteToMap(req, site, null, site.getId(), null, false, false, false, false, null, true));
context.put("uiService", serviceName);
portal.sendResponse(context, res, "join", "text/html");
return;
}
}
catch (IdUnusedException e) {
}
}
portal.doError(req, res, session, Portal.ERROR_SITE);
}
}