package org.theospi.portfolio.tagging.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.entity.api.EntityManager;
import org.sakaiproject.entity.api.Reference;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.metaobj.shared.mgt.AgentManager;
import org.sakaiproject.metaobj.shared.mgt.IdManager;
import org.sakaiproject.metaobj.shared.model.Agent;
import org.sakaiproject.metaobj.shared.model.Id;
import org.sakaiproject.siteassociation.api.SiteAssocManager;
import org.sakaiproject.taggable.api.Link;
import org.sakaiproject.taggable.api.LinkManager;
import org.sakaiproject.taggable.api.Tag;
import org.sakaiproject.taggable.api.TagColumn;
import org.sakaiproject.taggable.api.TagList;
import org.sakaiproject.taggable.api.TaggableActivity;
import org.sakaiproject.taggable.api.TaggableItem;
import org.sakaiproject.taggable.api.TaggingHelperInfo;
import org.sakaiproject.taggable.api.TaggingManager;
import org.sakaiproject.user.cover.UserDirectoryService;
import org.sakaiproject.util.ResourceLoader;
import org.theospi.portfolio.matrix.MatrixFunctionConstants;
import org.theospi.portfolio.matrix.MatrixManager;
import org.theospi.portfolio.matrix.model.Scaffolding;
import org.theospi.portfolio.matrix.model.ScaffoldingCell;
import org.theospi.portfolio.security.AuthorizationFacade;
import org.theospi.portfolio.tagging.api.MatrixTaggingProvider;
public class MatrixTaggingProviderImpl implements MatrixTaggingProvider {
private static final Log logger = LogFactory.getLog(MatrixTaggingProviderImpl.class);
private static ResourceLoader messages = new ResourceLoader("org.theospi.portfolio.matrix.bundle.Messages");
protected TaggingManager taggingManager;
protected LinkManager linkManager;
protected SiteAssocManager siteAssocManager;
private IdManager idManager = null;
private AuthorizationFacade authzManager = null;
private AgentManager agentManager = null;
private MatrixManager matrixManager = null;
private EntityManager entityManager = null;
protected static final String LINK_HELPER = "osp.matrix.link";
public void init() {
logger.info("init()");
// register as a tagging provider
getTaggingManager().registerProvider(this);
}
public String getId() {
return MatrixTaggingProvider.PROVIDER_ID;
}
public String getName() {
return messages.getString("provider_name");
}
public String getSimpleTextLabel() {
return messages.getString("provider_text_label");
}
public String getHelpLabel() {
return messages.getString("provider_help_label");
}
public String getHelpDescription() {
return messages.getString("provider_help_desc");
}
public boolean allowViewTags(String context) {
boolean allow = false;
List<String> associations = siteAssocManager.getAssociatedFrom(context);
if (associations != null && associations.size() > 0) {
allow = true;
}
return allow;
}
public boolean allowGetActivity(String activityRef, String userId, String taggedItem) {
Agent currentUser = getAgentManager().getAgent(userId);
Reference ref = getEntityManager().newReference(taggedItem);
Id pageDefId = getIdManager().getId(ref.getId());
ScaffoldingCell sCell = getMatrixManager().getScaffoldingCellByWizardPageDef(pageDefId);
Id scaffoldingId = sCell.getScaffolding().getId();
Scaffolding scaff = getMatrixManager().getScaffolding(scaffoldingId);
boolean result = getAuthzManager().isAuthorized(currentUser, MatrixFunctionConstants.REVISE_SCAFFOLDING_ANY, getIdManager().getId(ref.getContext())) ||
(scaff.getOwner().equals(currentUser)
&& getAuthzManager().isAuthorized(currentUser, MatrixFunctionConstants.REVISE_SCAFFOLDING_OWN, getIdManager().getId(ref.getContext())) ||
canViewCellContents(activityRef, new String[] {}, userId, taggedItem));
return result;
}
public boolean allowGetItem(String activityRef, String itemRef, String userId, String taggedItem) {
String[] itemRefs = {itemRef};
return allowGetItems(activityRef, itemRefs, userId, taggedItem);
}
public boolean allowGetItems(String activityRef, String[] itemRefs, String userId, String taggedItem) {
return canViewCellContents(activityRef, itemRefs, userId, taggedItem);
}
private boolean canViewCellContents(String activityRef, String[] itemRefs, String userId, String taggedItem) {
//make sure item is properly linked and then do perm check
try {
Link link = getLinkManager().getLink(activityRef, taggedItem);
if (link != null) {
Agent agent = getAgentManager().getAgent(userId);
Reference ref = getEntityManager().newReference(taggedItem);
Id pageDefId = getIdManager().getId(ref.getId());
ScaffoldingCell sCell = getMatrixManager().getScaffoldingCellByWizardPageDef(pageDefId);
if(UserDirectoryService.getCurrentUser().getId().equals(userId) ||
(sCell.isDefaultEvaluators() && getAuthzManager().isAuthorized(agent, MatrixFunctionConstants.EVALUATE_MATRIX, sCell.getScaffolding().getId())) ||
(!sCell.isDefaultEvaluators() && getAuthzManager().isAuthorized(agent, MatrixFunctionConstants.EVALUATE_MATRIX, sCell.getId())) ||
(sCell.isDefaultReviewers() && getAuthzManager().isAuthorized(agent, MatrixFunctionConstants.EVALUATE_MATRIX, sCell.getScaffolding().getId())) ||
(!sCell.isDefaultReviewers() && getAuthzManager().isAuthorized(agent, MatrixFunctionConstants.EVALUATE_MATRIX, sCell.getId())) ||
(getAuthzManager().isAuthorized(agent, MatrixFunctionConstants.ACCESS_ALL_CELLS, getIdManager().getId(sCell.getScaffolding().getReference())))){
//SecurityService.pushAdvisor(new MySecurityAdvisor(userId, Arrays.asList(functions), Arrays.asList(itemRefs)));
return Boolean.valueOf(true);
}
}
} catch (PermissionException e) {
logger.warn("Unable to get the link for activity: " + activityRef + " and tagCriteriaRef: " + taggedItem, e);
}
return false;
}
/**
* If there are any associations, allow it
* @param activityContext
* @return
*/
protected boolean allowTagActivities(String activityContext) {
boolean allow = false;
List<String> associations = siteAssocManager.getAssociatedFrom(activityContext);
if (associations != null && associations.size() > 0) {
allow = true;
}
return allow;
}
public TaggingHelperInfo getActivityHelperInfo(String activityRef) {
TaggingHelperInfo helperInfo = null;
String context = taggingManager.getContext(activityRef);
if (allowTagActivities(context)
&& (taggingManager.getActivity(activityRef, this) != null)) {
Map<String, String> parameterMap = new HashMap<String, String>();
parameterMap.put(ACTIVITY_REF, activityRef);
String text = messages.getString("act_helper_text");
String title = messages.getString("act_helper_title");
helperInfo = taggingManager.createTaggingHelperInfoObject(LINK_HELPER, text, title,
parameterMap, this);
}
return helperInfo;
}
public Map<String, TaggingHelperInfo> getActivityHelperInfo(String context, List<String> activityRefs) {
TaggingHelperInfo helperInfo = null;
Map<String, TaggingHelperInfo> returnMap = new HashMap<String, TaggingHelperInfo>();
if (allowTagActivities(context)) {
for (String activityRef : activityRefs) {
TaggableActivity activity = taggingManager.getActivity(activityRef, this);
if (activity != null && context.equals(activity.getContext())) {
Map<String, String> parameterMap = new HashMap<String, String>();
parameterMap.put(ACTIVITY_REF, activityRef);
String text = messages.getString("act_helper_text");
String title = messages.getString("act_helper_title");
helperInfo = taggingManager.createTaggingHelperInfoObject(LINK_HELPER, text, title,
parameterMap, this);
returnMap.put(activityRef, helperInfo);
}
}
}
return returnMap;
}
public TaggingHelperInfo getItemHelperInfo(String itemRef) {
// TODO Auto-generated method stub
return null;
}
public TaggingHelperInfo getItemsHelperInfo(String activityRef) {
// TODO Auto-generated method stub
return null;
}
public TagList getTags(TaggableActivity activity) {
List<TagColumn> columns = new ArrayList<TagColumn>();
columns.add(taggingManager.createTagColumn(TagList.CRITERIA, messages.getString("column_criteria"), messages.getString("column_criteria"), true));
columns.add(taggingManager.createTagColumn(TagList.PARENT, messages.getString("column_parent"), messages.getString("column_parent_desc"), true));
columns.add(taggingManager.createTagColumn(TagList.WORKSITE, messages.getString("column_worksite"), messages.getString("column_worksite_desc"), true));
TagList tagList = taggingManager.createTagList(columns);
String activityContext = activity.getContext();
for (String toContext : getSiteAssocManager().getAssociatedFrom(activityContext)) {
try {
for (Link link : linkManager.getLinks(activity
.getReference(), true, toContext)) {
Tag tag = taggingManager.createTag(link);
tagList.add(tag);
}
} catch (PermissionException pe) {
logger.error(pe.getMessage(), pe);
}
}
return tagList;
}
public void removeTags(TaggableActivity activity)
throws PermissionException {
getTaggingManager().removeLinks(activity);
}
public void removeTags(TaggableItem item) throws PermissionException {
// TODO Auto-generated method stub
}
public void transferCopyTags(TaggableActivity fromActivity,
TaggableActivity toActivity) throws PermissionException {
// TODO Auto-generated method stub
}
public TaggingManager getTaggingManager() {
return taggingManager;
}
public void setTaggingManager(TaggingManager taggingManager) {
this.taggingManager = taggingManager;
}
public LinkManager getLinkManager()
{
return linkManager;
}
public void setLinkManager(LinkManager linkManager)
{
this.linkManager = linkManager;
}
public SiteAssocManager getSiteAssocManager()
{
return siteAssocManager;
}
public void setSiteAssocManager(SiteAssocManager siteAssocManager)
{
this.siteAssocManager = siteAssocManager;
}
public IdManager getIdManager() {
return idManager;
}
public void setIdManager(IdManager idManager) {
this.idManager = idManager;
}
public AuthorizationFacade getAuthzManager() {
return authzManager;
}
public void setAuthzManager(AuthorizationFacade authzManager) {
this.authzManager = authzManager;
}
public AgentManager getAgentManager() {
return agentManager;
}
public void setAgentManager(AgentManager agentManager) {
this.agentManager = agentManager;
}
public void setMatrixManager(MatrixManager matrixManager) {
this.matrixManager = matrixManager;
}
public MatrixManager getMatrixManager() {
return matrixManager;
}
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}