package com.celements.menu.access;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xwiki.component.annotation.Component;
import org.xwiki.component.annotation.Requirement;
import org.xwiki.context.Execution;
import org.xwiki.model.reference.DocumentReference;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
@Component
public class MenuAccessService implements IMenuAccessServiceRole {
private static Log LOGGER = LogFactory.getFactory().getInstance(MenuAccessService.class);
@Requirement
Map<String, IMenuAccessProviderRole> accessProviderMap;
@Requirement
Execution execution;
private XWikiContext getContext() {
return (XWikiContext) execution.getContext().getProperty("xwikicontext");
}
public boolean hasview(DocumentReference menuBarDocRef) {
if (accessProviderMap != null) {
boolean hasview = false;
boolean allowForDeny = true;
for (IMenuAccessProviderRole accessProvider : accessProviderMap.values()) {
LOGGER.trace("start accessProvider [" + accessProvider.getClass()
+ "] check for menuBarDocRef [" + menuBarDocRef + "] current database ["
+ getContext().getDatabase() + "].");
try {
boolean newHasView = accessProvider.hasview(menuBarDocRef);
LOGGER.debug("check has view for [" + getContext().getUser() + "] on [" + menuBarDocRef
+ "] and provider [" + accessProvider.getClass() + "]" + " results in [" + newHasView
+ "].");
if (!newHasView && accessProvider.denyView(menuBarDocRef)) {
LOGGER.debug("deny view for [" + getContext().getUser() + "] on [" + menuBarDocRef
+ "] and provider [" + accessProvider.getClass() + "]"
+ " thus returning false and cancel hasview check.");
return false;
} else if (allowForDeny) {
hasview |= newHasView;
}
} catch (NoAccessDefinedException noAccExp) {
LOGGER.debug("skip Access Provider [" + accessProvider.getClass() + "] because"
+ " of NoAccessDefinedException on [" + menuBarDocRef + "].", noAccExp);
} catch (XWikiException exp) {
LOGGER.error("Access Provider [" + accessProvider.getClass() + "] failed for"
+ " hasview on [" + menuBarDocRef + "].", exp);
}
}
LOGGER.debug("deny view for [" + getContext().getUser() + "] on [" + menuBarDocRef
+ "] ends with result [" + hasview + "].");
return hasview;
}
return false;
}
}