package org.sakaiproject.tool.assessment.entity.impl;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.sakaiproject.authz.api.SecurityService;
import org.sakaiproject.entitybroker.entityprovider.CoreEntityProvider;
import org.sakaiproject.entitybroker.entityprovider.capabilities.AutoRegisterEntityProvider;
import org.sakaiproject.entitybroker.entityprovider.capabilities.PropertyProvideable;
import org.sakaiproject.tool.assessment.entity.api.PublishedAssessmentEntityProvider;
import org.sakaiproject.tool.assessment.facade.PublishedAssessmentFacade;
import org.sakaiproject.tool.assessment.facade.PublishedAssessmentFacadeQueriesAPI;
import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService;
import org.sakaiproject.tool.assessment.shared.api.grading.GradingServiceAPI;
import org.sakaiproject.entitybroker.EntityReference;
import org.sakaiproject.entitybroker.entityprovider.search.Search;
import org.sakaiproject.entitybroker.entityprovider.capabilities.CollectionResolvable;
import org.sakaiproject.entitybroker.entityprovider.capabilities.BrowseSearchable;
import org.sakaiproject.entitybroker.entityprovider.extension.EntityData;
import org.sakaiproject.entitybroker.entityprovider.search.Restriction;
import org.sakaiproject.entitybroker.entityprovider.extension.Formats;
import org.sakaiproject.entitybroker.entityprovider.capabilities.Outputable;
import org.sakaiproject.entitybroker.entityprovider.capabilities.RESTful;
import org.sakaiproject.entitybroker.entityprovider.capabilities.RedirectDefinable;
import org.sakaiproject.entitybroker.entityprovider.extension.TemplateMap;
import org.sakaiproject.entitybroker.DeveloperHelperService;
import java.lang.IllegalArgumentException;
import java.lang.SecurityException;
import java.lang.IllegalStateException;
/**
* Entity Provider impl for samigo PublishedAssessments
*
* Implements PropertyProvideable to allow things to browse the entities provided by site
*
* @author Joshua Ryan josh@asu.edu alt^I
*
*/
public class PublishedAssessmentEntityProviderImpl implements PublishedAssessmentEntityProvider,
CoreEntityProvider, AutoRegisterEntityProvider, PropertyProvideable, BrowseSearchable, RESTful, Outputable, RedirectDefinable {
private static final String CAN_TAKE = "assessment.takeAssessment";
private static final String CAN_PUBLISH = "assessment.publishAssessment.any";
private PublishedAssessmentFacadeQueriesAPI publishedAssessmentFacadeQueries;
private SecurityService securityService;
private GradingServiceAPI gradingService = null;
public String getEntityPrefix() {
return ENTITY_PREFIX;
}
public boolean entityExists(String id) {
boolean rv = false;
try {
PublishedAssessmentService service = new PublishedAssessmentService();
//TODO: Should we refrence Published Assessments via ID or via alias as they are now?
PublishedAssessmentFacade pub = service.getPublishedAssessment(id);
if (pub != null) {
rv = true;
}
}
catch (Exception e){
rv=false;
}
return rv;
}
public TemplateMap[] defineURLMappings() {
return new TemplateMap[] {
new TemplateMap("/{prefix}/context/{siteId}", "{prefix}{dot-extension}") // all assignments in a site
};
}
/**
* Browse for the list of published assessments for a given site for a user
*
* @param siteId
* @param userId
*
* @return list of published assessments that a user has access to see in a site
*/
private List<String> browseEntities(String siteId, String userId) {
List refs = null;
List assessments = null;
boolean canPublish = false;
Date currentDate = new Date();
//TODO: support sorting by other attributes
String orderBy = "title";
// Check what the user can do
if (securityService.unlock(CAN_PUBLISH, "/site/"+siteId)) {
publishedAssessmentFacadeQueries.
getBasicInfoOfAllActivePublishedAssessments(orderBy, siteId, true);
assessments = publishedAssessmentFacadeQueries
.getBasicInfoOfAllInActivePublishedAssessments(orderBy, siteId, true);
assessments.addAll(publishedAssessmentFacadeQueries
.getBasicInfoOfAllActivePublishedAssessments(orderBy, siteId, true));
canPublish = true;
}
else if (securityService.unlock(CAN_TAKE, "/site/"+siteId)) {
assessments = publishedAssessmentFacadeQueries
.getBasicInfoOfAllActivePublishedAssessments(orderBy, siteId, true);
}
if (assessments != null) {
refs = new ArrayList();
for (int i = 0; i < assessments.size(); i++) {
PublishedAssessmentFacade pub = (PublishedAssessmentFacade) assessments.get(i);
if (canPublish || pub.getStartDate() == null || currentDate.after(pub.getStartDate()))
refs.add("/" + ENTITY_PREFIX + "/" + pub.getPublishedAssessmentId());
}
}
return refs;
}
public List getEntities(EntityReference ref, Search search){
Vector results = new Vector();
String siteId = null;
Restriction[] restrictions = search.getRestrictions();
String userId = null;
for(int r=0;r<restrictions.length;r++){
if(restrictions[r].property.equalsIgnoreCase("siteId")){
siteId = (String) restrictions[r].value;
}
if(restrictions[r].property.equalsIgnoreCase("userId")){
userId = (String) restrictions[r].value;
}
if(restrictions[r].property.equalsIgnoreCase("context")){
siteId = (String) restrictions[r].value;
}
}
if(userId==null){
userId = developerHelperService.getCurrentUserId();
}
if (userId == null) {
throw new SecurityException("No user is currently logged in so no data can be retrieved");
}
if(userId==null)return results;
if(siteId==null) return results;
String orderBy = "title";
List assessments = null;
boolean canPublish = false;
Date currentDate = new Date();
// Check what the user can do
if (securityService.unlock(CAN_PUBLISH, "/site/"+siteId)) {
publishedAssessmentFacadeQueries.
getBasicInfoOfAllActivePublishedAssessments(orderBy, siteId, true);
assessments = publishedAssessmentFacadeQueries
.getBasicInfoOfAllInActivePublishedAssessments(orderBy, siteId, true);
assessments.addAll(publishedAssessmentFacadeQueries
.getBasicInfoOfAllActivePublishedAssessments(orderBy, siteId, true));
canPublish = true;
}
else if (securityService.unlock(CAN_TAKE, "/site/"+siteId)) {
assessments = publishedAssessmentFacadeQueries
.getBasicInfoOfAllActivePublishedAssessments(orderBy, siteId, true);
}
if (assessments != null) {
Iterator assessmentIterator = assessments.iterator();
while(assessmentIterator.hasNext()){
PublishedAssessmentFacade pub = (PublishedAssessmentFacade) assessmentIterator.next();
results.add(pub);
}
}
return results;
}
public Object getEntity(EntityReference ref) {
return new EntityData(new EntityReference("dummy reference"), "dummy");
}
public List<EntityData> browseEntities(Search search,
String userReference,
String associatedReference,
Map<String,Object> params){
Vector results = new Vector();
String siteId = (String) params.get("context");
Restriction[] restrictions = search.getRestrictions();
String userId = null;
for(int r=0;r<restrictions.length;r++){
if(restrictions[r].property.equalsIgnoreCase("userId")){
userId = (String) restrictions[r].value;
}
if(restrictions[r].property.equalsIgnoreCase("context")){
siteId = (String) restrictions[r].value;
}
}
if(userId==null)return results;
if(siteId==null) return results;
String orderBy = "title";
List assessments = null;
boolean canPublish = false;
Date currentDate = new Date();
// Check what the user can do
if (securityService.unlock(CAN_PUBLISH, "/site/"+siteId)) {
publishedAssessmentFacadeQueries.
getBasicInfoOfAllActivePublishedAssessments(orderBy, siteId, true);
assessments = publishedAssessmentFacadeQueries
.getBasicInfoOfAllInActivePublishedAssessments(orderBy, siteId, true);
assessments.addAll(publishedAssessmentFacadeQueries
.getBasicInfoOfAllActivePublishedAssessments(orderBy, siteId, true));
canPublish = true;
}
else if (securityService.unlock(CAN_TAKE, "/site/"+siteId)) {
assessments = publishedAssessmentFacadeQueries
.getBasicInfoOfAllActivePublishedAssessments(orderBy, siteId, true);
}
Iterator assessmentIterator = assessments.iterator();
while(assessmentIterator.hasNext()){
PublishedAssessmentFacade pub = (PublishedAssessmentFacade) assessmentIterator.next();
if(canPublish || pub.getStartDate() == null || currentDate.after(pub.getStartDate())){
String thisEntityReference = "/" + ENTITY_PREFIX + "/" + pub.getPublishedAssessmentId();
String thisEntityTitle = pub.getTitle();
results.add(new EntityData(new EntityReference(thisEntityReference), thisEntityTitle));
}
}
return results;
}
public List<String> findEntityRefs(String[] prefixes, String[] name, String[] searchValue,
boolean exactMatch) {
String siteId = null;
String userId = null;
if (ENTITY_PREFIX.equals(prefixes[0])) {
for (int i = 0; i < name.length; i++) {
if ("context".equalsIgnoreCase(name[i]) || "site".equalsIgnoreCase(name[i]))
siteId = searchValue[i];
else if ("user".equalsIgnoreCase(name[i]) || "userId".equalsIgnoreCase(name[i]))
userId = searchValue[i];
}
if (siteId != null && userId != null) {
return browseEntities(siteId, userId);
}
}
return null;
}
public Map<String, String> getProperties(String reference) {
Map<String, String> props = new HashMap<String, String>();
PublishedAssessmentService service = new PublishedAssessmentService();
PublishedAssessmentFacade pub =
service.getPublishedAssessment(reference.substring(ENTITY_PREFIX.length() + 2));
props.put("title", pub.getTitle());
props.put("description", pub.getDescription());
props.put("author", pub.getCreatedBy());
if (pub.getCreatedDate() != null)
props.put("created_date", DateFormat.getInstance().format(pub.getCreatedDate()));
props.put("modified_by", pub.getLastModifiedBy());
if (pub.getLastModifiedDate() != null)
props.put("modified_date", DateFormat.getInstance().format(pub.getLastModifiedDate()));
if (pub.getTotalScore() != null)
props.put("totalScore", pub.getTotalScore().toString());
if (pub.getStartDate() != null)
props.put("start_date", DateFormat.getInstance().format(pub.getStartDate()));
else if (pub.getAssessmentAccessControl().getStartDate() != null)
props.put("start_date", DateFormat.getInstance().format(
pub.getAssessmentAccessControl().getStartDate()));
if (pub.getDueDate() != null)
props.put("due_date", DateFormat.getInstance().format(pub.getDueDate()));
else if (pub.getAssessmentAccessControl().getDueDate() != null)
props.put("due_date", DateFormat.getInstance().format(
pub.getAssessmentAccessControl().getDueDate()));
if (pub.getRetractDate() != null)
props.put("retract_date", DateFormat.getInstance().format(pub.getRetractDate()));
else if (pub.getAssessmentAccessControl().getRetractDate() != null)
props.put("retract_date", DateFormat.getInstance().format(
pub.getAssessmentAccessControl().getRetractDate()));
props.put("comments", pub.getComments());
props.put("siteId", pub.getOwnerSiteId());
return props;
}
public String[] getHandledOutputFormats() {
return new String[] {Formats.XML, Formats.JSON};
}
public String[] getHandledInputFormats() {
return new String[] {Formats.XML, Formats.JSON, Formats.HTML};
}
public String createEntity(EntityReference ref, Object entity, Map<String, Object> params) {
return null;
}
public Object getSampleEntity() {
return null;
}
public void updateEntity(EntityReference ref, Object entity, Map<String, Object> params) {
}
public void deleteEntity(EntityReference ref, Map<String, Object> params) {
}
public String getPropertyValue(String reference, String name) {
Map<String, String> props = getProperties(reference);
return props.get(name);
}
public void setPropertyValue(String reference, String name, String value) {
// This does nothing for now... we could all the setting of many published assessment properties
// here though... if you're feeling jumpy feel free.
}
public PublishedAssessmentFacadeQueriesAPI getPublishedAssessmentFacadeQueries() {
return publishedAssessmentFacadeQueries;
}
public void setPublishedAssessmentFacadeQueries(
PublishedAssessmentFacadeQueriesAPI publishedAssessmentFacadeQueries) {
this.publishedAssessmentFacadeQueries = publishedAssessmentFacadeQueries;
}
public SecurityService getSecurityService() {
return securityService;
}
public void setSecurityService(SecurityService security) {
this.securityService = security;
}
private DeveloperHelperService developerHelperService;
public void setDeveloperHelperService(DeveloperHelperService developerHelperService) {
this.developerHelperService = developerHelperService;
}
}