/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/assignment/trunk/assignment-impl/impl/src/java/org/sakaiproject/assignment/taggable/impl/AssignmentActivityProducerImpl.java $
* $Id: AssignmentActivityProducerImpl.java 131546 2013-11-14 16:37:54Z dsobiera@indiana.edu $
***********************************************************************************
*
* Copyright (c) 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.assignment.taggable.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.assignment.api.Assignment;
import org.sakaiproject.assignment.api.AssignmentService;
import org.sakaiproject.assignment.api.AssignmentSubmission;
import org.sakaiproject.assignment.taggable.api.AssignmentActivityProducer;
import org.sakaiproject.taggable.api.TaggableActivity;
import org.sakaiproject.taggable.api.TaggableItem;
import org.sakaiproject.taggable.api.TaggingManager;
import org.sakaiproject.taggable.api.TaggingProvider;
import org.sakaiproject.authz.api.SecurityService;
import org.sakaiproject.entity.api.EntityManager;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.site.api.SiteService;
import org.sakaiproject.user.api.UserDirectoryService;
import org.sakaiproject.user.api.UserNotDefinedException;
import org.sakaiproject.util.ResourceLoader;
public class AssignmentActivityProducerImpl implements
AssignmentActivityProducer {
private static final Log logger = LogFactory
.getLog(AssignmentActivityProducerImpl.class);
private static ResourceLoader rb = new ResourceLoader("assignment");
protected AssignmentService assignmentService;
protected EntityManager entityManager;
protected TaggingManager taggingManager;
protected SiteService siteService;
protected SecurityService securityService;
protected UserDirectoryService userDirectoryService;
public boolean allowGetItems(TaggableActivity activity,
TaggingProvider provider, boolean allowGetItems, String taggedItem) {
// We aren't picky about the provider, so ignore that argument.
// Only allow this if the user can grade submissions
return assignmentService.allowGradeSubmission(activity.getReference());
}
public boolean allowRemoveTags(TaggableActivity activity) {
return securityService.unlock(
AssignmentService.SECURE_REMOVE_ASSIGNMENT, activity
.getReference());
}
public boolean allowRemoveTags(TaggableItem item) {
return securityService.unlock(
AssignmentService.SECURE_REMOVE_ASSIGNMENT_SUBMISSION,
parseSubmissionRef(item.getReference()));
}
public boolean allowTransferCopyTags(TaggableActivity activity) {
return securityService.unlock(SiteService.SECURE_UPDATE_SITE,
siteService.siteReference(activity.getContext()));
}
public boolean checkReference(String ref) {
return ref.startsWith(AssignmentService.REFERENCE_ROOT);
}
public List<TaggableActivity> getActivities(String context,
TaggingProvider provider) {
// We aren't picky about the provider, so ignore that argument.
List<TaggableActivity> activities = new ArrayList<TaggableActivity>();
List<Assignment> assignments = assignmentService
.getListAssignmentsForContext(context);
for (Assignment assignment : assignments) {
activities.add(getActivity(assignment));
}
return activities;
}
public TaggableActivity getActivity(Assignment assignment) {
return new AssignmentActivityImpl(assignment, this);
}
public TaggableActivity getActivity(String activityRef,
TaggingProvider provider, String taggedItem) {
// We aren't picky about the provider, so ignore that argument.
TaggableActivity activity = null;
if (checkReference(activityRef)) {
try {
Assignment assignment = assignmentService.getAssignment(activityRef);
if (assignment != null)
activity = new AssignmentActivityImpl(assignment, this);
} catch (IdUnusedException iue) {
logger.error(iue.getMessage(), iue);
} catch (PermissionException pe) {
logger.error(pe.getMessage(), pe);
}
}
return activity;
}
public String getContext(String ref) {
return entityManager.newReference(ref).getContext();
}
public String getId() {
return PRODUCER_ID;
}
public TaggableItem getItem(AssignmentSubmission assignmentSubmission,
String userId) {
return new AssignmentItemImpl(assignmentSubmission, userId,
new AssignmentActivityImpl(
assignmentSubmission.getAssignment(), this));
}
public TaggableItem getItem(String itemRef, TaggingProvider provider, boolean getMyItemsOnly, String taggedItem) {
// We aren't picky about the provider, so ignore that argument.
TaggableItem item = null;
if (checkReference(itemRef)) {
try {
AssignmentSubmission submission = assignmentService
.getSubmission(parseSubmissionRef(itemRef));
item = new AssignmentItemImpl(submission, parseAuthor(itemRef),
new AssignmentActivityImpl(submission.getAssignment(),
this));
} catch (IdUnusedException iue) {
logger.error(iue.getMessage(), iue);
} catch (PermissionException pe) {
logger.error(pe.getMessage(), pe);
}
}
return item;
}
public List<TaggableItem> getItems(TaggableActivity activity,
String userId, TaggingProvider provider, boolean getMyItemsOnly, String taggedItem) {
// We aren't picky about the provider, so ignore that argument.
List<TaggableItem> returned = new ArrayList<TaggableItem>();
try {
Assignment assignment = (Assignment) activity.getObject();
AssignmentSubmission submission = assignmentService.getSubmission(
assignment.getReference(), userDirectoryService
.getUser(userId));
if (submission != null && submission.getSubmitted() && submission.getTimeSubmitted() != null) {
TaggableItem item = new AssignmentItemImpl(submission, userId,
activity);
returned.add(item);
}
} catch (UserNotDefinedException unde) {
logger.error(unde.getMessage(), unde);
}
return returned;
}
public List<TaggableItem> getItems(TaggableActivity activity,
TaggingProvider provider, boolean getMyItemsOnly, String taggedItem) {
// We aren't picky about the provider, so ignore that argument.
List<TaggableItem> items = new ArrayList<TaggableItem>();
Assignment assignment = (Assignment) activity.getObject();
/*
* If you're not allowed to grade submissions, you shouldn't be able to
* look at submission items. It seems that anybody is allowed to get any
* submissions.
*/
if (assignmentService.allowGradeSubmission(assignment.getReference())) {
for (Iterator<AssignmentSubmission> i = assignmentService
.getSubmissions(assignment).iterator(); i.hasNext();) {
AssignmentSubmission submission = i.next();
if (submission != null && submission.getSubmitted() && submission.getTimeSubmitted() != null) {
for (Object submitterId : submission.getSubmitterIds()) {
items.add(new AssignmentItemImpl(submission,
(String) submitterId, activity));
}
}
}
}
return items;
}
public String getItemPermissionOverride() {
return AssignmentService.SECURE_ACCESS_ASSIGNMENT;
}
public String getName() {
return rb.getString("gen.assig");
}
public void init() {
logger.info("init()");
taggingManager.registerProducer(this);
}
protected String parseAuthor(String itemRef) {
return itemRef.split(AssignmentItemImpl.ITEM_REF_SEPARATOR)[1];
}
protected String parseSubmissionRef(String itemRef) {
return itemRef.split(AssignmentItemImpl.ITEM_REF_SEPARATOR)[0];
}
public void setAssignmentService(AssignmentService assignmentService) {
this.assignmentService = assignmentService;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public void setSecurityService(SecurityService securityService) {
this.securityService = securityService;
}
public void setSiteService(SiteService siteService) {
this.siteService = siteService;
}
public void setTaggingManager(TaggingManager taggingManager) {
this.taggingManager = taggingManager;
}
public void setUserDirectoryService(
UserDirectoryService userDirectoryService) {
this.userDirectoryService = userDirectoryService;
}
public boolean hasSubmissions(TaggableActivity activity,
TaggingProvider provider, boolean getMyItemsOnly, String taggedItem) {
List<TaggableItem> items = getItems(activity, provider, getMyItemsOnly, taggedItem);
return items.size() > 0;
}
public boolean hasSubmissions(TaggableActivity activity, String userId,
TaggingProvider provider, boolean getMyItemsOnly, String taggedItem) {
List<TaggableItem> items = getItems(activity, userId, provider, getMyItemsOnly, taggedItem);
return items.size() > 0;
}
}