Utils.java
/*
* Copyright (C) 2003-2010 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.wiki.commons;
import java.net.URL;
import java.net.URLEncoder;
import java.util.*;
import java.util.Map.Entry;
import javax.portlet.PortletPreferences;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import org.xwiki.context.Execution;
import org.xwiki.context.ExecutionContext;
import org.xwiki.rendering.syntax.Syntax;
import org.exoplatform.commons.utils.MimeTypeResolver;
import org.exoplatform.container.ExoContainer;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.config.model.PortalConfig;
import org.exoplatform.portal.webui.portal.UIPortal;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.organization.User;
import org.exoplatform.services.organization.UserStatus;
import org.exoplatform.services.security.ConversationState;
import org.exoplatform.services.security.Identity;
import org.exoplatform.services.security.IdentityConstants;
import org.exoplatform.social.core.space.model.Space;
import org.exoplatform.social.core.space.spi.SpaceService;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormTextAreaInput;
import org.exoplatform.wiki.mow.api.*;
import org.exoplatform.wiki.rendering.RenderingService;
import org.exoplatform.wiki.rendering.impl.RenderingServiceImpl;
import org.exoplatform.wiki.resolver.PageResolver;
import org.exoplatform.wiki.service.WikiContext;
import org.exoplatform.wiki.service.WikiPageParams;
import org.exoplatform.wiki.service.WikiService;
import org.exoplatform.wiki.service.impl.SessionManager;
import org.exoplatform.wiki.tree.utils.TreeUtils;
import org.exoplatform.wiki.webui.UIWikiPageEditForm;
import org.exoplatform.wiki.webui.UIWikiPortlet;
import org.exoplatform.wiki.webui.UIWikiRichTextArea;
import org.exoplatform.wiki.webui.WikiMode;
public class Utils {
public static final int DEFAULT_VALUE_UPLOAD_PORTAL = -1;
public static final String SLASH = "/";
public static final String DRAFT_ID = "draftId";
public static String upperFirstCharacter(String str) {
if (StringUtils.isEmpty(str)) {
return str;
}
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
public static String getCurrentSpaceName() throws Exception {
Wiki currentSpace = Utils.getCurrentWiki();
if (currentSpace == null) {
return StringUtils.EMPTY;
}
return getSpaceName(currentSpace);
}
public static String getSpaceName(Wiki wiki) throws Exception {
WikiType wikiType = WikiType.valueOf(wiki.getType().toUpperCase());
if (WikiType.PORTAL.equals(wikiType)) {
String displayName = wiki.getOwner();
int slashIndex = displayName.lastIndexOf('/');
if (slashIndex > -1) {
displayName = displayName.substring(slashIndex + 1);
}
return Utils.upperFirstCharacter(displayName);
}
if (WikiType.USER.equals(wikiType)) {
String currentUser = org.exoplatform.wiki.utils.Utils.getCurrentUser();
if (wiki.getOwner().equals(currentUser)) {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
String mySpaceLabel = res.getString("UISpaceSwitcher.title.my-space");
return mySpaceLabel;
}
return wiki.getOwner();
}
WikiService wikiService = (WikiService) PortalContainer.getComponent(WikiService.class);
return wikiService.getSpaceNameByGroupId(wiki.getOwner());
}
public static String getCurrentRequestURL() throws Exception {
PortalRequestContext portalRequestContext = Util.getPortalRequestContext();
HttpServletRequest request = portalRequestContext.getRequest();
String requestURL = java.net.URLDecoder.decode(request.getRequestURL().toString(), "UTF-8");
UIPortal uiPortal = Util.getUIPortal();
String pageNodeSelected = uiPortal.getSelectedUserNode().getURI();
if (!requestURL.contains(pageNodeSelected)) {
// Happens at the first time processRender() called when add wiki portlet
// manually
requestURL = portalRequestContext.getPortalURI() + pageNodeSelected;
}
return requestURL;
}
public static WikiPageParams getCurrentWikiPageParams() throws Exception {
String requestURL = getCurrentRequestURL();
PageResolver pageResolver = (PageResolver) PortalContainer.getComponent(PageResolver.class);
WikiPageParams params = pageResolver.extractWikiPageParams(requestURL, Util.getUIPortal().getSelectedUserNode());
HttpServletRequest request = Util.getPortalRequestContext().getRequest();
Map<String, String[]> paramsMap = request.getParameterMap();
params.setParameters(paramsMap);
return params;
}
/**
* Gets current wiki page directly from data base
*
* @return current wiki page
* @throws Exception
*/
public static Page getCurrentWikiPage() throws Exception {
String requestURL = Utils.getCurrentRequestURL();
PageResolver pageResolver = (PageResolver) PortalContainer.getComponent(PageResolver.class);
Page page = pageResolver.resolve(requestURL, Util.getUIPortal().getSelectedUserNode());
return page;
}
public static boolean canModifyPagePermission() throws Exception {
WikiService wikiService = (WikiService) PortalContainer.getComponent(WikiService.class);
String currentUser = org.exoplatform.wiki.utils.Utils.getCurrentUser();
Page currentPage = Utils.getCurrentWikiPage();
if (currentPage == null) {
return false;
}
return wikiService.canModifyPagePermission(currentPage, currentUser);
}
public static boolean isPagePublic(Page page) throws Exception {
WikiService wikiService = (WikiService) PortalContainer.getComponent(WikiService.class);
return (page != null)
&& wikiService.hasPermissionOnPage(page, PermissionType.EDITPAGE, new Identity(IdentityConstants.ANONIM));
}
public static boolean isCurrentPagePublic() throws Exception {
Page currentPage = Utils.getCurrentWikiPage();
return isPagePublic(currentPage);
}
public static String getSpaceHomeURL(String spaceGroupId) {
SpaceService spaceService = ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(SpaceService.class);
Space space = spaceService.getSpaceByGroupId(spaceGroupId);
String spaceLink = org.exoplatform.social.webui.Utils.getSpaceHomeURL(space);
return spaceLink;
}
public static String getURLFromParams(WikiPageParams params) throws Exception {
if (StringUtils.isEmpty(params.getType()) || StringUtils.isEmpty(params.getOwner())) {
return StringUtils.EMPTY;
}
if (params.getType().equals(PortalConfig.GROUP_TYPE)) {
StringBuilder spaceUrl = new StringBuilder(getSpaceHomeURL(params.getOwner()));
if (!spaceUrl.toString().endsWith("/")) {
spaceUrl.append("/");
}
// spaceUrl.append("wiki/");
spaceUrl.append(getWikiAppNameInSpace(params.getOwner())).append("/");
if (!StringUtils.isEmpty(params.getPageName())) {
spaceUrl.append(params.getPageName());
}
return spaceUrl.toString();
}
return org.exoplatform.wiki.utils.Utils.getPermanlink(params, false);
}
private static String getWikiAppNameInSpace(String spaceId) {
SpaceService spaceService = org.exoplatform.wiki.rendering.util.Utils.getService(SpaceService.class);
Space space = spaceService.getSpaceByGroupId(spaceId);
String apps = space.getApp();
if (apps != null) {
for (String app : apps.split(",")) {
String[] appInfos = app.split(":");
if (appInfos.length > 1 && "WikiPortlet".equals(appInfos[0])) {
return appInfos[1];
}
}
}
return "wiki";
}
public static Page getCurrentNewDraftWikiPage() throws Exception {
WikiService wikiService = (WikiService) PortalContainer.getComponent(WikiService.class);
return wikiService.getExsitedOrNewDraftPageById(null, null, org.exoplatform.wiki.utils.Utils.getPageNameForAddingPage());
}
public static String getExtension(String filename) throws Exception {
MimeTypeResolver mimeResolver = new MimeTypeResolver();
try {
return mimeResolver.getExtension(mimeResolver.getMimeType(filename));
} catch (Exception e) {
return mimeResolver.getDefaultMimeType();
}
}
public static Wiki getCurrentWiki() throws Exception {
WikiService wikiService = (WikiService) PortalContainer.getComponent(WikiService.class);
WikiPageParams params = Utils.getCurrentWikiPageParams();
return wikiService.getWikiByTypeAndOwner(params.getType(), params.getOwner());
}
public static WikiContext setUpWikiContext(UIWikiPortlet wikiPortlet) throws Exception {
RenderingService renderingService = (RenderingService) ExoContainerContext.getCurrentContainer()
.getComponentInstanceOfType(RenderingService.class);
Execution ec = ((RenderingServiceImpl) renderingService).getExecution();
if (ec.getContext() == null) {
ec.setContext(new ExecutionContext());
}
WikiContext wikiContext = createWikiContext(wikiPortlet);
ec.getContext().setProperty(WikiContext.WIKICONTEXT, wikiContext);
return wikiContext;
}
public static void feedDataForWYSIWYGEditor(UIWikiPageEditForm pageEditForm, String markup) throws Exception {
UIWikiPortlet wikiPortlet = pageEditForm.getAncestorOfType(UIWikiPortlet.class);
UIWikiRichTextArea richTextArea = pageEditForm.getChild(UIWikiRichTextArea.class);
RenderingService renderingService = (RenderingService) PortalContainer.getComponent(RenderingService.class);
HttpSession session = Util.getPortalRequestContext().getRequest().getSession(false);
UIFormTextAreaInput markupInput = pageEditForm.getUIFormTextAreaInput(UIWikiPageEditForm.FIELD_CONTENT);
String markupSyntax = getDefaultSyntax();
WikiContext wikiContext = Utils.setUpWikiContext(wikiPortlet);
if (markup == null) {
markup = (markupInput.getValue() == null) ? "" : markupInput.getValue();
}
String xhtmlContent = renderingService.render(markup, markupSyntax, Syntax.ANNOTATED_XHTML_1_0.toIdString(), false);
richTextArea.getUIFormTextAreaInput().setValue(xhtmlContent);
session.setAttribute(UIWikiRichTextArea.SESSION_KEY, xhtmlContent);
session.setAttribute(UIWikiRichTextArea.WIKI_CONTEXT, wikiContext);
ExoContainer container = ExoContainerContext.getCurrentContainer();
SessionManager sessionManager = (SessionManager) container.getComponentInstanceOfType(SessionManager.class);
sessionManager.addSessionContext(session.getId(), Utils.createWikiContext(wikiPortlet));
sessionManager.addSessionContext(ConversationState.getCurrent().getIdentity().getUserId(),
Utils.createWikiContext(wikiPortlet));
if (sessionManager.getSessionContainer(session.getId()) != null) {
sessionManager.addSessionContainer(ConversationState.getCurrent().getIdentity().getUserId(),
sessionManager.getSessionContainer(session.getId()));
}
}
public static String getCurrentWikiPagePath() throws Exception {
return TreeUtils.getPathFromPageParams(getCurrentWikiPageParams());
}
public static String getDefaultSyntax() throws Exception {
WikiPreferences currentPreferences = Utils.getCurrentPreferences();
String currentDefaultSyntax;
if (currentPreferences != null) {
currentDefaultSyntax = currentPreferences.getWikiPreferencesSyntax().getDefaultSyntax();
if (currentDefaultSyntax == null) {
WikiService wservice = (WikiService) PortalContainer.getComponent(WikiService.class);
currentDefaultSyntax = wservice.getDefaultWikiSyntaxId();
}
} else {
WikiService wikiService = (WikiService) PortalContainer.getComponent(WikiService.class);
currentDefaultSyntax = wikiService.getDefaultWikiSyntaxId();
}
return currentDefaultSyntax;
}
public static WikiPreferences getCurrentPreferences() throws Exception {
Wiki currentWiki = getCurrentWiki();
return currentWiki.getPreferences();
}
public static WikiContext createWikiContext(UIWikiPortlet wikiPortlet) throws Exception {
PortalRequestContext portalRequestContext = Util.getPortalRequestContext();
WikiMode currentMode = wikiPortlet.getWikiMode();
List<WikiMode> editModes = Arrays.asList(new WikiMode[] { WikiMode.EDITPAGE, WikiMode.ADDPAGE, WikiMode.EDITTEMPLATE,
WikiMode.ADDTEMPLATE });
UIPortal uiPortal = Util.getUIPortal();
String portalURI = portalRequestContext.getPortalURI();
URL requestURL = new URL(portalRequestContext.getRequest().getRequestURL().toString());
String domainURL = requestURL.getProtocol() + "://" + requestURL.getAuthority();
String portalURL = domainURL + portalURI;
String pageNodeSelected = uiPortal.getSelectedUserNode().getURI();
String treeRestURL = getCurrentRestURL().concat("/wiki/tree/children/");
WikiContext wikiContext = new WikiContext();
wikiContext.setPortalURL(portalURL);
wikiContext.setTreeRestURI(treeRestURL);
wikiContext.setRestURI(getCurrentRestURL());
wikiContext.setRedirectURI(wikiPortlet.getRedirectURL());
wikiContext.setPortletURI(pageNodeSelected);
WikiPageParams params = Utils.getCurrentWikiPageParams();
wikiContext.setType(params.getType());
wikiContext.setOwner(params.getOwner());
if (editModes.contains(currentMode)) {
wikiContext.setSyntax(getDefaultSyntax());
} else {
WikiService service = (WikiService) PortalContainer.getComponent(WikiService.class);
Page currentPage = service.getPageOfWikiByName(params.getType(), params.getOwner(), params.getPageName());
if (currentPage != null) {
wikiContext.setSyntax(currentPage.getSyntax());
}
}
if (wikiPortlet.getWikiMode() == WikiMode.ADDPAGE) {
wikiContext.setPageName(org.exoplatform.wiki.utils.Utils.getPageNameForAddingPage());
} else {
wikiContext.setPageName(params.getPageName());
}
wikiContext.setBaseUrl(getBaseUrl());
return wikiContext;
}
public static String getBaseUrl() throws Exception {
WikiPageParams params = getCurrentWikiPageParams();
params.setPageName(null);
return getURLFromParams(params);
}
public static String getCurrentWikiNodeUri() throws Exception {
PortalRequestContext portalRequestContext = Util.getPortalRequestContext();
StringBuilder sb = new StringBuilder(portalRequestContext.getPortalURI());
UIPortal uiPortal = Util.getUIPortal();
String pageNodeSelected = uiPortal.getSelectedUserNode().getURI();
sb.append(pageNodeSelected);
return sb.toString();
}
public static void redirect(WikiPageParams pageParams, WikiMode mode) throws Exception {
redirect(pageParams, mode, null);
}
/**
* Get the full path for current wiki page
*/
public static String getPageLink() throws Exception {
WikiPageParams params = getCurrentWikiPageParams();
params.setPageName(null);
if (PortalConfig.PORTAL_TYPE.equals(params.getType())) {
String navigationURI = Util.getUIPortal().getNavPath().getURI();
String requestURI = Util.getPortalRequestContext().getRequestURI();
if (requestURI.indexOf(navigationURI) < 0) {
navigationURI = "wiki";
}
return requestURI.substring(0, requestURI.indexOf(navigationURI) + navigationURI.length()) + "/";
}
return getURLFromParams(params);
}
public static void redirect(WikiPageParams pageParams, WikiMode mode, Map<String, String[]> params) throws Exception {
PortalRequestContext portalRequestContext = Util.getPortalRequestContext();
portalRequestContext.setResponseComplete(true);
if (PortalConfig.GROUP_TYPE.equals(Utils.getCurrentWiki().getType())) {
pageParams.setPageName(URLEncoder.encode(pageParams.getPageName(), "UTF-8"));
}
portalRequestContext.sendRedirect(createURLWithMode(pageParams, mode, params));
}
public static void redirect(String url) throws Exception {
PortalRequestContext portalRequestContext = Util.getPortalRequestContext();
portalRequestContext.setResponseComplete(true);
portalRequestContext.sendRedirect(url);
}
public static void ajaxRedirect(Event<? extends UIComponent> event,
WikiPageParams pageParams,
WikiMode mode,
Map<String, String[]> params) throws Exception {
String redirectLink = Utils.createURLWithMode(pageParams, mode, params);
ajaxRedirect(event, redirectLink);
}
public static void ajaxRedirect(Event<? extends UIComponent> event, String redirectLink) throws Exception {
event.getRequestContext()
.getJavascriptManager()
.addCustomizedOnLoadScript("eXo.wiki.UIWikiPortlet.ajaxRedirect('" + redirectLink + "');");
}
public static String createURLWithMode(WikiPageParams pageParams, WikiMode mode, Map<String, String[]> params) throws Exception {
StringBuffer sb = new StringBuffer();
sb.append(getURLFromParams(pageParams));
// sb.append(getPageLink());
// if(!StringUtils.isEmpty(pageParams.getPageName())){
// sb.append(URLEncoder.encode(pageParams.getPageName(), "UTF-8"));
// }
if (!mode.equals(WikiMode.VIEW)) {
sb.append("#").append(Utils.getActionFromWikiMode(mode));
}
if (params != null) {
Iterator<Entry<String, String[]>> iter = params.entrySet().iterator();
while (iter.hasNext()) {
Entry<String, String[]> entry = iter.next();
sb.append("&");
sb.append(entry.getKey()).append("=").append(entry.getValue()[0]);
}
}
return sb.toString();
}
public static String createFormActionLink(UIComponent uiComponent, String action, String beanId) throws Exception {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
boolean isForm = UIForm.class.isInstance(uiComponent);
UIForm form = isForm ? (UIForm) uiComponent : uiComponent.getAncestorOfType(UIForm.class);
if (form != null) {
String formId = form.getId();
if (context instanceof PortletRequestContext) {
formId = ((PortletRequestContext) context).getWindowId() + "#" + formId;
}
StringBuilder b = new StringBuilder();
b.append("javascript:eXo.wiki.UIForm.submitPageEvent('").append(formId).append("','");
b.append(action).append("','");
if (!isForm) {
b.append("&").append(UIForm.SUBCOMPONENT_ID).append("=").append(uiComponent.getId());
if (beanId != null) {
b.append("&").append(UIComponent.OBJECTID).append("=").append(beanId);
}
}
b.append("')");
return b.toString();
} else {
return form.event(action, uiComponent.getId(), action);
}
}
public static String getActionFromWikiMode(WikiMode mode) {
switch (mode) {
case EDITPAGE:
return "EditPage";
case ADDPAGE:
return "AddPage";
case ADDTEMPLATE:
return "AddTemplate";
case EDITTEMPLATE:
return "EditTemplate";
case SPACESETTING:
return "SpaceSetting";
case MYDRAFTS:
return "MyDrafts";
default:
return "";
}
}
public static String getCurrentRestURL() {
StringBuilder sb = new StringBuilder();
sb.append("/").append(PortalContainer.getCurrentPortalContainerName()).append("/");
sb.append(PortalContainer.getCurrentRestContextName());
return sb.toString();
}
public static WikiMode getModeFromAction(String actionParam) {
String[] params = actionParam.split(WikiConstants.WITH);
String name = params[0];
if (name != null) {
try {
WikiMode mode = WikiMode.valueOf(name.toUpperCase());
if (mode != null)
return mode;
} catch (IllegalArgumentException e) {
return null;
}
}
return null;
}
/**
* render macro to XHtml string.
*
* @param uiComponent - component that contain the macro.
* @param macroName - name of macro
* @param wikiSyntax - wiki syntax referred from {@link Syntax}
* @return String in format {@link Syntax#XHTML_1_0}
*/
public static String renderMacroToXHtml(UIComponent uiComponent, String macroName, String wikiSyntax) {
try {
RenderingService renderingService = (RenderingService) PortalContainer.getComponent(RenderingService.class);
setUpWikiContext(uiComponent.getAncestorOfType(UIWikiPortlet.class));
String content = renderingService.render(macroName, wikiSyntax, Syntax.XHTML_1_0.toIdString(), false);
return content;
} catch (Exception e) {
return "";
}
}
public static void removeWikiContext() throws Exception {
RenderingService renderingService = (RenderingService) PortalContainer.getComponent(RenderingService.class);
Execution ec = ((RenderingServiceImpl) renderingService).getExecution();
if (ec != null) {
ec.removeContext();
}
}
public static int getLimitUploadSize() {
PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
PortletPreferences portletPref = pcontext.getRequest().getPreferences();
int limitMB = DEFAULT_VALUE_UPLOAD_PORTAL;
try {
limitMB = Integer.parseInt(portletPref.getValue("uploadFileSizeLimitMB", "").trim());
} catch (Exception e) {
limitMB = 10;
}
return limitMB;
}
public static String getFullName(String userId) {
try {
OrganizationService organizationService = (OrganizationService) PortalContainer.getComponent(OrganizationService.class);
User user = organizationService.getUserHandler().findUserByName(userId, UserStatus.ANY);
return user.getFullName();
} catch (Exception e) {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
return res.getString("UIWikiPortlet.label.Anonymous");
}
}
public static String getDraftIdSessionKey() {
return ConversationState.getCurrent().getIdentity().getUserId() + DRAFT_ID;
}
public static String getWikiTypeFromWikiId(String wikiId) {
String wikiType = "";
if (wikiId.startsWith("/spaces/")) {
wikiType = PortalConfig.GROUP_TYPE;
} else if (wikiId.startsWith("/user/")) {
wikiType = PortalConfig.USER_TYPE;
} else {
if (wikiId.startsWith("/")) {
wikiType = PortalConfig.PORTAL_TYPE;
}
}
return wikiType;
}
public static String getWikiOwnerFromWikiId(String wikiId) {
String wikiType = getWikiTypeFromWikiId(wikiId);
if (PortalConfig.USER_TYPE.equals(wikiType) || PortalConfig.PORTAL_TYPE.equals(wikiType)) {
wikiId = wikiId.substring(wikiId.lastIndexOf('/') + 1);
}
return wikiId;
}
}