/*
* Copyright 2015-Present Entando Inc. (http://www.entando.com) All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/
package com.agiletec.plugins.jacms.aps.system.services.linkresolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.agiletec.aps.system.RequestContext;
import com.agiletec.aps.system.SystemConstants;
import com.agiletec.aps.system.common.AbstractService;
import com.agiletec.aps.system.services.authorization.IAuthorizationManager;
import com.agiletec.aps.system.services.group.Group;
import com.agiletec.aps.system.services.page.IPage;
import com.agiletec.aps.system.services.page.IPageManager;
import com.agiletec.aps.system.services.url.IURLManager;
import com.agiletec.aps.system.services.url.PageURL;
import com.agiletec.aps.system.services.user.IUserManager;
import com.agiletec.aps.system.services.user.UserDetails;
import com.agiletec.plugins.jacms.aps.system.services.content.IContentManager;
import com.agiletec.plugins.jacms.aps.system.services.content.model.SymbolicLink;
import com.agiletec.plugins.jacms.aps.system.services.content.model.extraAttribute.AbstractResourceAttribute;
import com.agiletec.plugins.jacms.aps.system.services.contentpagemapper.IContentPageMapperManager;
import com.agiletec.plugins.jacms.aps.system.services.resource.IResourceManager;
import com.agiletec.plugins.jacms.aps.system.services.resource.model.ResourceInterface;
/**
* Servizio gestore della risoluzione dei link sinbolici.
* Scopo di questa classe è l'individuazione in un testo di stringhe rappresentanti
* link simbolici, e la loro traduzione e sostituzione nel testo con i
* corrispondenti URL.
* @author M.Diana - E.Santoboni
*/
public class LinkResolverManager extends AbstractService implements ILinkResolverManager {
private static final Logger _logger = LoggerFactory.getLogger(LinkResolverManager.class);
@Override
public void init() throws Exception {
_logger.debug("{} ready.", this.getClass().getName());
}
@Override
public String resolveLinks(String text, RequestContext reqCtx) {
return this.resolveLinks(text, null, reqCtx);
}
/**
* Sotituisce nel testo i link simbolici con URL reali.
* @param text Il testo che può contenere link simbolici.
* @param contentId The id of content that contains the link to resolve
* @param reqCtx Il contesto di richiesta
* @return Il testo in cui i link simbolici sono sostituiti con URL reali.
*/
@Override
public String resolveLinks(String text, String contentId, RequestContext reqCtx) {
StringBuilder resolvedText = new StringBuilder();
int postfixLen = SymbolicLink.SYMBOLIC_DEST_POSTFIX.length();
int end = 0;
int parsed = 0;
int start = text.indexOf(SymbolicLink.SYMBOLIC_DEST_PREFIX);
while(start >= 0){
end = text.indexOf(SymbolicLink.SYMBOLIC_DEST_POSTFIX, start);
if(end >= 0) {
end = end + postfixLen;
String symbolicString = text.substring(start, end);
String url = this.convertToURL(symbolicString, contentId, reqCtx);
if(url != null){
String invariantText = text.substring(parsed, start);
resolvedText.append(invariantText);
resolvedText.append(url);
parsed = end;
} else {
end = start + 1;
}
start = text.indexOf(SymbolicLink.SYMBOLIC_DEST_PREFIX, end);
} else {
start = -1; //uscita
}
}
String residualText = text.substring(parsed);
resolvedText.append(residualText);
return resolvedText.toString();
}
protected String convertToURL(String symbolicString, String contentId, RequestContext reqCtx) {
String url = null;
SymbolicLink symbolicLink = new SymbolicLink();
if (symbolicLink.setSymbolicDestination(symbolicString)) {
url = this.resolveLink(symbolicLink, contentId, reqCtx);
}
return url;
}
@Override
public String resolveLink(SymbolicLink symbolicLink, RequestContext reqCtx) {
return this.resolveLink(symbolicLink, null, reqCtx);
}
@Override
public String resolveLink(SymbolicLink symbolicLink, String contentId, RequestContext reqCtx) {
if (null == symbolicLink) {
_logger.error("Null Symbolic Link");
return "";
}
String url = null;
try {
if (symbolicLink.getDestType() == SymbolicLink.URL_TYPE) {
url = symbolicLink.getUrlDest();
} else if (symbolicLink.getDestType() == SymbolicLink.PAGE_TYPE) {
PageURL pageUrl = this.getUrlManager().createURL(reqCtx);
pageUrl.setPageCode(symbolicLink.getPageDest());
url = pageUrl.getURL();
} else if (symbolicLink.getDestType() == SymbolicLink.CONTENT_ON_PAGE_TYPE) {
PageURL pageUrl = this.getUrlManager().createURL(reqCtx);
pageUrl.setPageCode(symbolicLink.getPageDest());
pageUrl.addParam(SystemConstants.K_CONTENT_ID_PARAM, symbolicLink.getContentDest());
url = pageUrl.getURL();
} else if (symbolicLink.getDestType() == SymbolicLink.CONTENT_TYPE) {
PageURL pageUrl = this.getUrlManager().createURL(reqCtx);
String contentIdDest = symbolicLink.getContentDest();
String pageCode = this.getContentPageMapperManager().getPageCode(contentIdDest);
boolean forwardToDefaultPage = !this.isPageAllowed(reqCtx, pageCode);
if (forwardToDefaultPage) {
String viewPageCode = this.getContentManager().getViewPage(contentIdDest);
pageUrl.setPageCode(viewPageCode);
pageUrl.addParam(SystemConstants.K_CONTENT_ID_PARAM, contentIdDest);
} else {
pageUrl.setPageCode(pageCode);
}
url = pageUrl.getURL();
} else if (symbolicLink.getDestType() == SymbolicLink.RESOURCE_TYPE) {
ResourceInterface resource = this.getResourceManager().loadResource(symbolicLink.getResourceDest());
if (null != resource) {
url = resource.getDefaultUrlPath();
if (!resource.getMainGroup().equals(Group.FREE_GROUP_NAME)) {
if (!url.endsWith("/")) {
url += "/";
}
url += AbstractResourceAttribute.REFERENCED_RESOURCE_INDICATOR + "/" + contentId + "/";
}
}
}
} catch (Throwable t) {
_logger.error("Error resolve link from SymbolicLink", t);
throw new RuntimeException("Error resolve link from SymbolicLink", t);
}
return url;
}
/**
* Verifica se l'utente corrente è autorizzato
* all'accesso alla pagina specificata.
* @param reqCtx Il contesto della richiesta.
* @param pageCode Il codice della pagina.
* @return true se l'utente corrente è abilitato all'accesso
* alla pagina specificata, false in caso contrario.
* @deprecated Old Wrong method name. Use isPageAllowed
*/
protected boolean isCurrentUserAllowed(RequestContext reqCtx, String pageCode) {
return this.isPageAllowed(reqCtx, pageCode);
}
protected boolean isPageAllowed(RequestContext reqCtx, String pageCode) {
UserDetails user = null;
if (null != reqCtx) {
user = (UserDetails) reqCtx.getRequest().getSession().getAttribute(SystemConstants.SESSIONPARAM_CURRENT_USER);
}
return this.isPageAllowed(user, pageCode);
}
protected boolean isPageAllowed(UserDetails user, String pageCode) {
if (null == user) {
user = this.getUserManager().getGuestUser();
}
boolean isPageAllowed = false;
if (pageCode != null) {
IPage page = this.getPageManager().getPage(pageCode);
if (page != null && this.getAuthorizationManager().isAuth(user, page)) {
isPageAllowed = true;
}
}
return isPageAllowed;
}
protected IContentManager getContentManager() {
return _contentManager;
}
public void setContentManager(IContentManager contentManager) {
this._contentManager = contentManager;
}
protected IResourceManager getResourceManager() {
return _resourceManager;
}
public void setResourceManager(IResourceManager resourceManager) {
this._resourceManager = resourceManager;
}
protected IContentPageMapperManager getContentPageMapperManager() {
return _contentPageMapperManager;
}
public void setContentPageMapperManager(IContentPageMapperManager contentPageMapperManager) {
this._contentPageMapperManager = contentPageMapperManager;
}
protected IPageManager getPageManager() {
return _pageManager;
}
public void setPageManager(IPageManager pageManager) {
this._pageManager = pageManager;
}
protected IURLManager getUrlManager() {
return _urlManager;
}
public void setUrlManager(IURLManager urlManager) {
this._urlManager = urlManager;
}
protected IUserManager getUserManager() {
return _userManager;
}
public void setUserManager(IUserManager userManager) {
this._userManager = userManager;
}
protected IAuthorizationManager getAuthorizationManager() {
return _authorizationManager;
}
public void setAuthorizationManager(IAuthorizationManager authorizationManager) {
this._authorizationManager = authorizationManager;
}
private IPageManager _pageManager;
private IContentManager _contentManager;
private IResourceManager _resourceManager;
private IContentPageMapperManager _contentPageMapperManager;
private IURLManager _urlManager;
private IUserManager _userManager;
private IAuthorizationManager _authorizationManager;
}