/********************************************************************************** * $URL: https://source.sakaiproject.org/contrib/syracuse/taggable/branches/oncourse_osp_enhancements/taggable-impl/impl/src/java/org/sakaiproject/taggable/impl/TaggingManagerImpl.java $ * $Id: TaggingManagerImpl.java 46822 2008-03-17 16:19:47Z chmaurer@iupui.edu $ *********************************************************************************** * * Copyright (c) 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.taggable.impl; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.exception.PermissionException; import org.sakaiproject.taggable.api.Evaluation; import org.sakaiproject.taggable.api.EvaluationContainer; 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.taggable.api.TaggableActivityProducer; import org.sakaiproject.taggable.api.TaggingProvider; import org.sakaiproject.taggable.api.URLBuilder; import org.sakaiproject.user.api.User; import org.sakaiproject.user.api.UserDirectoryService; public class TaggingManagerImpl implements TaggingManager { private static final Log logger = LogFactory .getLog(TaggingManagerImpl.class); protected List<TaggableActivityProducer> taggableActivityProducers = new ArrayList<TaggableActivityProducer>(); protected List<TaggingProvider> taggingProviders = new ArrayList<TaggingProvider>(); private LinkManager linkManager; private UserDirectoryService userDirectoryService; public void init() { logger.info("init()"); } public TaggableActivityProducer findProducerByRef(String ref) { TaggableActivityProducer producer; for (Iterator<TaggableActivityProducer> i = taggableActivityProducers .iterator(); i.hasNext();) { producer = i.next(); if (producer.checkReference(ref)) { return producer; } } return null; } public String getContext(String ref) { TaggableActivityProducer producer = findProducerByRef(ref); if (producer != null) return producer.getContext(ref); return null; } public TaggableActivityProducer findProducerById(String id) { TaggableActivityProducer producer = null; for (TaggableActivityProducer p : taggableActivityProducers) { if (p.getId().equals(id)) { producer = p; } } return producer; } public TaggingProvider findProviderById(String id) { TaggingProvider provider = null; for (TaggingProvider p : taggingProviders) { if (p.getId().equals(id)) { provider = p; } } return provider; } public List<TaggableActivity> getActivities(String context, TaggingProvider provider) { List<TaggableActivity> activities = new ArrayList<TaggableActivity>(); for (TaggableActivityProducer producer : taggableActivityProducers) { activities.addAll(producer.getActivities(context, provider)); } return activities; } public TaggableActivity getActivity(String activityRef, TaggingProvider provider, String taggedItem) { TaggableActivity activity = null; TaggableActivityProducer producer = findProducerByRef(activityRef); if (producer != null) { activity = producer.getActivity(activityRef, provider, taggedItem); } return activity; } public List<TaggableActivityProducer> getProducers() { return taggableActivityProducers; } public List<TaggingProvider> getProviders() { return taggingProviders; } public TaggableItem getItem(String itemRef, TaggingProvider provider, boolean getMyItemOnly, String taggedItem) { return findProducerByRef(itemRef).getItem(itemRef, provider, getMyItemOnly, taggedItem); } public List<TaggableItem> getItems(String activityRef, TaggingProvider provider, boolean getMyItemsOnly, String taggedItem) { List<TaggableItem> items = new ArrayList<TaggableItem>(); TaggableActivityProducer producer = findProducerByRef(activityRef); if (producer != null) { items = producer.getItems(getActivity(activityRef, provider, taggedItem), provider, getMyItemsOnly, taggedItem); } return items; } public void registerProducer(TaggableActivityProducer producer) { taggableActivityProducers.add(producer); } public void registerProvider(TaggingProvider provider) { taggingProviders.add(provider); } public boolean isTaggable() { return !taggingProviders.isEmpty(); } /** * {@inheritDoc} * * This method calls * {@link #addLink(String, Goal, String, String, boolean, boolean)} with * locked set to false. */ public Link addLink(String activityRef, String tagCriteriaRef, String rationale, String rubric, boolean visible) throws PermissionException { return addLink(activityRef, tagCriteriaRef, rationale, rubric, visible, false); } /** * {@inheritDoc} * * A {@link RuntimeException} will be thrown if the goal set of the given * goal is not published (see {@link GoalSet#isPublished()}). * * {@link #SECURE_MODIFY_LINKS_FROM} is checked in the activity context and * {@link #SECURE_MODIFY_LINKS_TO} is checked in the goal context. If locked * is true, {@link #SECURE_LOCK_LINKS} is also checked in in the activity * context. */ public Link addLink(String activityRef, String tagCriteriaRef, String rationale, String rubric, boolean visible, boolean locked) throws PermissionException { //if (!tagCriteria.isPublished()) { // throw new RuntimeException( // "Trying to create a link to a goal in an unpublished goal set!"); //} //TODO TEMPORARY PERM BYPASS /* if (locked) { unlock(SECURE_LOCK_LINKS, gmtReference(null, tagCriteria.getContext(), null)); } unlock(SECURE_MODIFY_LINKS_FROM, gmtReference(null, getContext(activityRef), null)); unlock(SECURE_MODIFY_LINKS_TO, gmtReference(null, tagCriteria.getContext(), null)); */ return linkManager.persistLink(activityRef, tagCriteriaRef, rationale, rubric, visible, locked); } public TaggingHelperInfo createTaggingHelperInfoObject(String helperId, String name, String description, Map<String, ? extends Object> parameterMap, TaggingProvider provider) { return new TaggingHelperInfoImpl(helperId, name, description, parameterMap, provider); } public TagList createTagList() { return new TagListImpl(); } public TagList createTagList(List<TagColumn> columns) { return new TagListImpl(columns); } public Tag createTag(Link link) { return new TagImpl(link); } /** * {@inheritDoc} * * Permission is checked against the producer of the activity via * {@link TaggableActivityProducer#allowRemoveTags(TaggableActivity)}. */ public void removeLinks(TaggableActivity activity) throws PermissionException { TaggableActivityProducer producer = activity.getProducer(); if (producer.allowRemoveTags(activity)) { getLinkManager().removeLinks(activity.getReference()); } else { throw new PermissionException(getUser().getEid(), producer .getClass().getName() + ".allowRemoveTags()", activity.getReference()); } } public TagColumn createTagColumn(String name, String displayName, String description, boolean sortable) { return new TagColumnImpl(name, displayName, description, sortable); } protected User getUser() { return getUserDirectoryService().getCurrentUser(); } public URLBuilder createURLBuilder(String base, String view, Map<String, String> params) { return new URLBuilderImpl(base, view, params); } /** * {@inheritDoc} */ public EvaluationContainer createEvaluationContainer() { return new EvaluationContainerImpl(); } /** * {@inheritDoc} */ public EvaluationContainer createEvaluationContainer(URLBuilder addUrlBuilder) { return new EvaluationContainerImpl(addUrlBuilder); } public Evaluation createEvaluation(URLBuilder editUrlBuilder, URLBuilder removeUrlBuilder) { return new EvaluationImpl(editUrlBuilder, removeUrlBuilder); } public LinkManager getLinkManager() { return linkManager; } public void setLinkManager(LinkManager linkManager) { this.linkManager = linkManager; } public void setUserDirectoryService(UserDirectoryService userDirectoryService) { this.userDirectoryService = userDirectoryService; } public UserDirectoryService getUserDirectoryService() { return userDirectoryService; } }