/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/rwiki/trunk/rwiki-tool/tool/src/java/uk/ac/cam/caret/sakai/rwiki/tool/bean/ViewBean.java $
* $Id: ViewBean.java 84225 2010-11-03 13:48:44Z david.horwitz@uct.ac.za $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006 The Sakai Foundation.
*
* Licensed under the Educational Community License, Version 1.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.opensource.org/licenses/ecl1.php
*
* 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 uk.ac.cam.caret.sakai.rwiki.tool.bean;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import uk.ac.cam.caret.sakai.rwiki.service.api.RWikiObjectService;
import uk.ac.cam.caret.sakai.rwiki.tool.util.WikiPageAction;
import uk.ac.cam.caret.sakai.rwiki.utils.NameHelper;
/**
* This bean is a helper bean for the view view.
*
* @author andrew
*/
// FIXME: Need a better way of making urls!
public class ViewBean
{
/**
* Parameter name for the parameter indicating which panel to use
*/
public static final String PANEL_PARAM = "panel";
/**
* Value of the parameter panel that indicates the main panel
*/
public static final String MAIN_PANEL = "Main";
/**
* Parameter name for the parameter indicating what action is required
*/
public static final String ACTION_PARAM = "action";
/**
* Parameter name for the paramater indicating which pageName to view, edit
* etc.
*/
public static final String PAGE_NAME_PARAM = "pageName";
/**
* Parameter name for the paramater indicating which pageName to view, edit
* etc.
*/
public static final String PARAM_BREADCRUMB_NAME = "breadcrumb";
/*
* These are urlencoded variants of constants from files that actually do
* the work...
*/
protected static final String PAGENAME_URL_ENCODED = urlEncode(PAGE_NAME_PARAM);
protected static final String DISBLE_BREADCRUMBS_ENCODED = urlEncode(PARAM_BREADCRUMB_NAME)
+ "=0";
protected static final String ACTION_URL_ENCODED = urlEncode(ACTION_PARAM);
protected static final String PANEL_URL_ENCODED = urlEncode(PANEL_PARAM);
protected static final String MAIN_URL_ENCODED = urlEncode(MAIN_PANEL);
protected static final String SEARCH_URL_ENCODED = urlEncode(SearchBean.SEARCH_PARAM);
protected static final String PAGE_URL_ENCODED = urlEncode(SearchBean.PAGE_PARAM);
protected static final String REALM_URL_ENCODED = urlEncode(SearchBean.REALM_PARAM);
/**
* The current pageName
*/
private String pageName;
/**
* The current localSpace
*/
private String localSpace;
/**
* The anchor to view
*/
private String anchor;
/**
* The current search criteria
*/
private String search;
/**
* Simple constructor that creates an empty view bean. You must set the
* pageName and the localSpace to make this useful
*/
public ViewBean()
{
// Beans must have null constructor!
}
/**
* Creates a ViewBean and set's the interested page name and local space
*
* @param name
* page name possibly non-globalised
* @param defaultSpace
* default space to globalise against
*/
public ViewBean(String name, String defaultSpace)
{
this.pageName = NameHelper.globaliseName(name, defaultSpace);
this.localSpace = defaultSpace;
}
private String getAnchorString()
{
if (anchor != null)
{
return "#" + urlEncode(anchor);
}
return "";
}
/**
* Returns a public view URL with no breadcrumbs
*
* @return
*/
public String getExportUrl()
{
return getPageUrl(pageName, WikiPageAction.EXPORT_ACTION.getName());
}
/**
* Returns a public view URL with no breadcrumbs
*
* @return
*/
public String getPublicViewUrl()
{
return getPublicViewUrl(false);
}
/**
* Returns a string representation of an url to perma view the current page
*
* @return url as string
*/
public String getPublicViewUrl(boolean withBreadcrumbs)
{
return getPageUrl(pageName, WikiPageAction.PUBLICVIEW_ACTION.getName(),
withBreadcrumbs);
}
/**
* Returns a string representation of an url to view the current page
*
* @return url as string
*/
public String getViewUrl()
{
return getPageUrl(pageName, WikiPageAction.VIEW_ACTION.getName());
}
/**
* Returns a string representation of an url to view the passed in page
*
* @param name
* possibly non-globalised name to view
* @return url as string
*/
public String getViewUrl(String name)
{
return getPageUrl(NameHelper.globaliseName(name, localSpace),
WikiPageAction.VIEW_ACTION.getName());
}
/**
* Returns a string representation of an url to edit the current page
*
* @return url as string
*/
public String getEditUrl()
{
return getPageUrl(pageName, WikiPageAction.EDIT_ACTION.getName());
}
/**
* Returns a string representation of an url to edit the passed in page.
*
* @param name
* possibly non-globalised name
* @return url as string
*/
public String getEditUrl(String name)
{
return getPageUrl(NameHelper.globaliseName(name, localSpace),
WikiPageAction.EDIT_ACTION.getName());
}
/**
* Returns a string representation of an url to view information about the
* current page
*
* @return url as string
*/
public String getInfoUrl()
{
return getPageUrl(pageName, WikiPageAction.INFO_ACTION.getName());
}
/**
* Returns a string representation of an url to view information about the
* passed in page
*
* @param name
* possibly non-globalised name
* @return url as string
*/
public String getInfoUrl(String name)
{
return getPageUrl(NameHelper.globaliseName(name, localSpace),
WikiPageAction.INFO_ACTION.getName());
}
public String getHistoryUrl()
{
return getHistoryUrl(pageName);
}
public String getHistoryUrl(String name)
{
return getPageUrl(NameHelper.globaliseName(name, localSpace),
WikiPageAction.HISTORY_ACTION.getName());
}
/**
* Given a WikiPageAction return an url to the current page for performing
* that action.
*
* @param action
* WikiPageAction to perform
* @return url as string
*/
public String getActionUrl(WikiPageAction action)
{
return getActionUrl(action, true);
}
/**
* Given a WikiPageAction return an url to the current page (with
* breadcrumbs on or off) for performing that action.
*
* @param action
* WikiPageAction to perform
* @param breadcrumbs
* false if breadcrumbs should be disabled
* @return url as string
*/
public String getActionUrl(WikiPageAction action, boolean breadcrumbs)
{
return getPageUrl(this.pageName, action.getName(), breadcrumbs);
}
/**
* Given a WikiPageAction return an url to the requested page (with
* breadcrumbs on or off) for performing that action.
*
* @param action
* WikiPageAction to perform
* @param breadcrumbs
* false if breadcrumbs should be disabled
* @return url as string
*/
public String getActionUrl(String pageName, WikiPageAction action,
boolean breadcrumbs)
{
return getPageUrl(pageName, action.getName(), breadcrumbs);
}
/**
* Given a WikiPageAction return an url to the current page with the
* additional parameters being set.
*
* @param action
* WikiPageAction to perform
* @param parameters
* Additional query parameters to attach
* @return url as String
*/
public String getActionUrl(WikiPageAction action, Map parameters)
{
return getPageUrl(this.pageName, action.getName(), parameters);
}
/**
* Given a WikiPageAction return an url to the requested page with the
* additional parameters being set.
*
* @param pageName
* globalised pagename to perform action on
* @param action
* WikiPageAction to perform
* @param parameters
* Additional query parameters to attach
* @return url as String
*/
public String getActionUrl(String pageName, WikiPageAction action,
Map parameters)
{
return getPageUrl(pageName, action.getName(), parameters);
}
/**
* Given a page name and an action return an url that represents it.
*
* @param pageName
* globalised pagename to perform action on
* @param action
* name of action to perform
* @return url as string
*/
protected String getPageUrl(String pageName, String action)
{
return getPageUrl(pageName, action, true);
}
/**
* Given a page name and an action return an url that represents it.
*
* @param pageName
* globalised pagename to perform action on
* @param action
* name of action to perform
* @param withBreadcrumbs
* if false, breadcrumb disable is propagated
* @return url as string
*/
protected String getPageUrl(String pageName, String action,
boolean withBreadcrumbs)
{
if (withBreadcrumbs)
{
return "?" + PAGENAME_URL_ENCODED + "=" + urlEncode(pageName) + "&"
+ ACTION_URL_ENCODED + "=" + urlEncode(action) + "&"
+ PANEL_URL_ENCODED + "=" + MAIN_URL_ENCODED + "&"
+ REALM_URL_ENCODED + "=" + urlEncode(localSpace)
+ getAnchorString();
}
else
{
return "?" + PAGENAME_URL_ENCODED + "=" + urlEncode(pageName) + "&"
+ ACTION_URL_ENCODED + "=" + urlEncode(action) + "&"
+ PANEL_URL_ENCODED + "=" + MAIN_URL_ENCODED + "&"
+ DISBLE_BREADCRUMBS_ENCODED + "&" + REALM_URL_ENCODED
+ "=" + urlEncode(localSpace) + getAnchorString();
}
}
protected String getPageUrl(String pageName, String action, Map params)
{
StringBuffer url = new StringBuffer();
url.append("?").append(PAGENAME_URL_ENCODED).append('=').append(
urlEncode(pageName));
url.append('&').append(ACTION_URL_ENCODED).append('=').append(
urlEncode(action));
url.append('&').append(PANEL_URL_ENCODED).append('=').append(
MAIN_URL_ENCODED);
url.append('&').append(REALM_URL_ENCODED).append('=').append(
urlEncode(localSpace));
for (Iterator<Entry<String, String>> it = params.entrySet().iterator(); it.hasNext();)
{
Entry<String, String> entry = it.next();
String key = entry.getKey();
String value = entry.getValue();
if (!(PAGE_NAME_PARAM.equals(key) || ACTION_PARAM.equals(key)
|| PANEL_PARAM.equals(key) || SearchBean.REALM_PARAM
.equals(key)))
{
url.append('&').append(urlEncode(key)).append('=').append(
urlEncode(value));
}
}
return url.append(getAnchorString()).toString();
}
/**
* Creates an appropriate url for searching for the given criteria. XXX this
* shouldn't be here!
*
* @return url as string
*/
protected String getSearchUrl()
{
return "?" + ACTION_URL_ENCODED + "=" + SEARCH_URL_ENCODED + "&"
+ SEARCH_URL_ENCODED + "=" + urlEncode(search) + "&"
+ REALM_URL_ENCODED + "=" + urlEncode(localSpace) + "&"
+ PANEL_URL_ENCODED + "=" + MAIN_URL_ENCODED;
}
/**
* The Globalised Page Name
*
* @return globalised page name
*/
public String getPageName()
{
return pageName;
}
/**
* Set the globalised page name
*
* @param pageName
* globalised page name
*/
public void setPageName(String pageName)
{
this.pageName = pageName;
}
/**
* The page name localised against the localSpace
*
* @return localised page name
*/
public String getLocalName()
{
return NameHelper.localizeName(this.pageName, this.localSpace);
}
/**
* The localSpace
*
* @return localSpace as string
*/
public String getLocalSpace()
{
return localSpace;
}
/**
* Set the localSpace
*
* @param localSpace
* the new localSpace
*/
public void setLocalSpace(String localSpace)
{
this.localSpace = localSpace;
}
/**
* The space of that the page is in
*
* @return the page's space
*/
public String getPageSpace()
{
return NameHelper.localizeSpace(pageName, localSpace);
}
/**
* Takes a string to encode and encodes it as a UTF-8 URL-Encoded string.
*
* @param toEncode
* string to encode.
* @return url encoded string.
*/
public static String urlEncode(String toEncode)
{
try
{
return URLEncoder.encode(toEncode, "UTF-8");
}
catch (UnsupportedEncodingException e)
{
throw new RuntimeException(
"Not entirely sure how this happened but UTF-8 doesn't "
+ "represent a valid encoding anymore! Weird!", e);
}
}
/**
* Set the current anchor
*
* @param anchor
* anchor to set
*/
public void setAnchor(String anchor)
{
this.anchor = anchor;
}
/**
* Get the current anchor name
*
* @return anchor
*/
public String getAnchor()
{
return anchor;
}
/**
* The current search criteria XXX This shouldn't be here!
*
* @return search criteria
*/
public String getSearch()
{
return search;
}
/**
* Set the current search criteria XXX This shouldn't be here!
*
* @param search
* the search criteria
*/
public void setSearch(String search)
{
this.search = search;
}
public String getNewCommentURL()
{
return getPageUrl(pageName, WikiPageAction.NEWCOMMENT_ACTION.getName());
}
public String getEditCommentURL()
{
return getPageUrl(pageName, WikiPageAction.EDITCOMMENT_ACTION.getName());
}
public String getListCommentsURL()
{
return getPageUrl(pageName, WikiPageAction.LISTCOMMENT_ACTION.getName());
}
public String getListPresenceURL()
{
return getPageUrl(pageName, WikiPageAction.LISTPRESENCE_ACTION
.getName());
}
/**
* @return
*/
public String getOpenPageChatURL()
{
return getPageUrl(pageName, WikiPageAction.OPENPAGECHAT_ACTION
.getName());
}
/**
* @return
*/
public String getOpenSpaceChatURL()
{
return getPageUrl(pageName, WikiPageAction.OPENSPACECHAT_ACTION
.getName());
}
/**
* @return
*/
public String getListPageChatURL()
{
return getPageUrl(pageName, WikiPageAction.LISTPAGECHAT_ACTION
.getName());
}
/**
* @return
*/
public String getListSpaceChatURL()
{
return getPageUrl(pageName, WikiPageAction.LISTSPACECHAT_ACTION
.getName());
}
public String getBaseAccessUrl()
{
// /wiki
return RWikiObjectService.REFERENCE_ROOT + pageName + ".";
}
public String getRssAccessUrl()
{
// /wiki
return RWikiObjectService.REFERENCE_ROOT + getPageSpace() + "/.20.rss";
}
public String getPreferencesUrl()
{
return this.getPageUrl(getPageName(), WikiPageAction.PREFERENCES_ACTION
.getName());
}
/**
* Returns a print view URL with no breadcrumbs
*
* @return
*/
public String getPrintViewUrl()
{
return getPrintViewUrl(false);
}
/**
* Returns a string representation of an url to perma view the current page
*
* @return url as string
*/
public String getPrintViewUrl(boolean withBreadcrumbs)
{
return getPageUrl(pageName, WikiPageAction.PRINTVIEW_ACTION.getName(),
withBreadcrumbs);
}
}