/*
*
* Copyright 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved.
*
* This file is part of jAPS software.
* jAPS is a free software;
* you can redistribute it and/or modify it
* under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; version 2.
*
* See the file License for the specific language governing permissions
* and limitations under the License
*
*
*
* Copyright 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved.
*
*/
package com.agiletec.plugins.jacms.aps.system.services.linkresolver;
import com.agiletec.aps.system.ApsSystemUtils;
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.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.contentpagemapper.IContentPageMapperManager;
/**
* 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
*/
public class LinkResolverManager extends AbstractService implements ILinkResolverManager {
@Override
public void init() throws Exception {
ApsSystemUtils.getLogger().config(this.getClass().getName() + ": inizializzato " );
}
/**
* Sotituisce nel testo i link simbolici con URL reali.
* @param text Il testo che può contenere link simbolici.
* @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, RequestContext reqCtx) {
StringBuffer resolvedText = new StringBuffer();
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, 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, RequestContext reqCtx){
String url = null;
SymbolicLink link = new SymbolicLink();
if (link.setSymbolicDestination(symbolicString)) {
if (link.getDestType() == SymbolicLink.URL_TYPE) {
url = link.getUrlDest();
} else if (link.getDestType() == SymbolicLink.PAGE_TYPE) {
PageURL pageUrl = this.getUrlManager().createURL(reqCtx);
pageUrl.setPageCode(link.getPageDest());
url = pageUrl.getURL();
} else if (link.getDestType() == SymbolicLink.CONTENT_ON_PAGE_TYPE) {
PageURL pageUrl = this.getUrlManager().createURL(reqCtx);
pageUrl.setPageCode(link.getPageDest());
pageUrl.addParam(SystemConstants.K_CONTENT_ID_PARAM, link.getContentDest());
url = pageUrl.getURL();
} else if (link.getDestType() == SymbolicLink.CONTENT_TYPE) {
PageURL pageUrl = this.getUrlManager().createURL(reqCtx);
String contentId = link.getContentDest();
String pageCode = this.getContentPageMapperManager().getPageCode(contentId);
boolean forwardToDefaultPage = this.isCurrentUserAllowed(reqCtx, pageCode);
if (forwardToDefaultPage) {
String viewPageCode = this.getContentManager().getViewPage(contentId);
pageUrl.setPageCode(viewPageCode);
pageUrl.addParam(SystemConstants.K_CONTENT_ID_PARAM, contentId);
} else {
pageUrl.setPageCode(pageCode);
}
url = pageUrl.getURL();
}
}
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..
*/
protected boolean isCurrentUserAllowed(RequestContext reqCtx, String pageCode) {
UserDetails currentUser = (UserDetails) reqCtx.getRequest().getSession().getAttribute(SystemConstants.SESSIONPARAM_CURRENT_USER);
IAuthorizationManager authManager = (IAuthorizationManager) this.getService(SystemConstants.AUTHORIZATION_SERVICE);
boolean isUserAllowed = true;
if (pageCode != null) {
IPage forwardPage = this.getPageManager().getPage(pageCode);
if (forwardPage != null) {
String pageGroup = forwardPage.getGroup();
if (Group.FREE_GROUP_NAME.equals(pageGroup)
|| authManager.isAuthOnGroup(currentUser, pageGroup)
|| authManager.isAuthOnGroup(currentUser, Group.ADMINS_GROUP_NAME)) {
isUserAllowed = false;
}
}
}
return isUserAllowed;
}
protected IContentManager getContentManager() {
return _contentManager;
}
public void setContentManager(IContentManager contentManager) {
this._contentManager = contentManager;
}
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;
}
private IPageManager _pageManager;
private IContentManager _contentManager;
private IContentPageMapperManager _contentPageMapperManager;
private IURLManager _urlManager;
}