package com.celements.rights;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.celements.rights.publication.IPublicationServiceRole;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.doc.XWikiDocument;
import com.xpn.xwiki.user.api.XWikiRightNotFoundException;
import com.xpn.xwiki.user.impl.xwiki.XWikiRightServiceImpl;
import com.xpn.xwiki.web.Utils;
public class CelementsRightServiceImpl extends XWikiRightServiceImpl {
private static Log LOGGER = LogFactory.getFactory().getInstance(CelementsRightServiceImpl.class);
/*
* Adds an optional check for publish and unpublish dates to determine whether or not a
* page can be viewed.
*/
@Override
public boolean checkRight(String userOrGroupName, XWikiDocument doc, String accessLevel,
boolean user, boolean allow, boolean global, XWikiContext context)
throws XWikiRightNotFoundException, XWikiException {
if (getPubSrv().isPublishActive() && getPubSrv().isRestrictedRightsAction(accessLevel)) {
// default behaviour: no object -> published
if (!getPubSrv().isPubOverride() && (getPubSrv().isUnpubOverride() || getPubSrv().isPublished(
doc))) {
LOGGER.info("Document published or not publish controlled.");
return super.checkRight(userOrGroupName, doc, accessLevel, user, allow, global, context);
} else {
LOGGER.info("Document not published, checking edit rights.");
try {
return super.checkRight(userOrGroupName, doc, "edit", user, allow, global, context);
} catch (XWikiRightNotFoundException xwrnfe) {
LOGGER.info("Rights could not be determined.");
// If rights can not be determined default to no rights.
return false;
}
}
} else {
if (getPubSrv().isPubUnpubOverride()) {
LOGGER.warn("Needs CelementsRightServiceImpl for publish / unpublish to work");
}
return super.checkRight(userOrGroupName, doc, accessLevel, user, allow, global, context);
}
}
IPublicationServiceRole getPubSrv() {
return Utils.getComponent(IPublicationServiceRole.class);
}
}