/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-qti/src/java/org/sakaiproject/tool/assessment/qti/helper/MetaDataList.java $
* $Id: MetaDataList.java 106463 2012-04-02 12:20:09Z david.horwitz@uct.ac.za $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.tool.assessment.qti.helper;
import java.util.List;
import java.util.StringTokenizer;
import org.sakaiproject.tool.assessment.qti.constants.AuthoringConstantStrings;
import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentMetaDataIfc;
import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemDataIfc;
import org.sakaiproject.tool.assessment.facade.AssessmentFacade;
import org.sakaiproject.tool.assessment.facade.ItemFacade;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
/**
* Contract: use List of special "|" delimited "KEY|VALUE" Strings!
* @author Ed Smiley esmiley@stanford.edu
*/
public class MetaDataList
{
private static Log log = LogFactory.getLog(ExtractionHelper.class);
/**
* list of editable settings
*/
private static final String[] editableKeys =
{
"assessmentAuthor_isInstructorEditable",
"assessmentCreator_isInstructorEditable",
"description_isInstructorEditable",
"dueDate_isInstructorEditable",
"retractDate_isInstructorEditable",
"anonymousRelease_isInstructorEditable",
"authenticatedRelease_isInstructorEditable",
"ipAccessType_isInstructorEditable",
"passwordRequired_isInstructorEditable",
"lockedBrowser_isInstructorEditable",
"timedAssessment_isInstructorEditable",
"timedAssessmentAutoSubmit_isInstructorEditable",
"itemAccessType_isInstructorEditable",
"displayChunking_isInstructorEditable",
"displayNumbering_isInstructorEditable",
"submissionModel_isInstructorEditable",
"lateHandling_isInstructorEditable",
"autoSave_isInstructorEditable",
"submissionMessage_isInstructorEditable",
"finalPageURL_isInstructorEditable",
"feedbackType_isInstructorEditable",
"feedbackAuthoring_isInstructorEditable",
"feedbackComponents_isInstructorEditable",
"testeeIdentity_isInstructorEditable",
"toGradebook_isInstructorEditable",
"recordedScore_isInstructorEditable",
"bgColor_isInstructorEditable",
"bgImage_isInstructorEditable",
"metadataAssess_isInstructorEditable",
"metadataParts_isInstructorEditable",
"metadataQuestions_isInstructorEditable",
};
private List metadataList;
/**
* Contract: use List of special "|" delimited "KEY|VALUE" Strings!
* Uses special "|" delimited "KEY|VALUE" strings
* @param metadataList
*/
public MetaDataList(List metadataList)
{
this.setMetadataList(metadataList);
}
/**
* Adds extraction-created list of "|" key value pairs
* to item metadata map, if there are any.
* Example:<metadata type =" list " > TEXT_FORMAT| HTML </metadata >
* <metadata type =" list " > ITEM_OBJECTIVE| </ metadata >
* Becomes:
* TEXT_FORMAT=>HTML
* @param metadataList extraction-created list of "|" key value pairs
* @param item the item
*/
public void addTo(ItemFacade item)
{
if (metadataList == null)
{
return; // no metadata found
}
for (int i = 0; i < metadataList.size(); i++)
{
String meta = (String) metadataList.get(i);
StringTokenizer st = new StringTokenizer(meta, "|");
String key = null;
String value = null;
if (st.hasMoreTokens())
{
key = st.nextToken().trim();
}
if (st.hasMoreTokens())
{
value = st.nextToken().trim();
if (key.equalsIgnoreCase("TIMEALLOWED")){
item.setDuration(new Integer(value));
}
else if (key.equalsIgnoreCase("NUM_OF_ATTEMPTS")){
item.setTriesAllowed(new Integer(value));
}
/*
// these metadata names are different in QTI and Authoring,
public static final String OBJECTIVE = "OBJECTIVE";
public static final String KEYWORD= "KEYWORD";
public static final String RUBRIC= "RUBRIC";
*/
else if (key.equalsIgnoreCase("ITEM_KEYWORD")){
item.addItemMetaData("KEYWORD", value);
}
else if (key.equalsIgnoreCase("ITEM_OBJECTIVE")){
item.addItemMetaData("OBJECTIVE", value);
}
else if (key.equalsIgnoreCase("ITEM_RUBRIC")){
item.addItemMetaData("RUBRIC", value);
}
else if (key.equalsIgnoreCase("ATTACHMENT")) {
value = meta.substring(meta.indexOf("|") + 1);
item.addItemAttachmentMetaData(value);
}
else {
log.debug("key now is " + key);
item.addItemMetaData(key, value);
}
}
}
}
public String getSubmissionMessage()
{
String submissionMsg = null;
if (metadataList == null)
{
return null; // no metadata found
}
for (int i = 0; i < metadataList.size(); i++)
{
String meta = (String) metadataList.get(i);
StringTokenizer st = new StringTokenizer(meta, "|");
String key = null;
String value = null;
if (st.hasMoreTokens())
{
key = st.nextToken().trim();
}
// SAK-6831: if it's submissionMessage, do not store in sam_assessmentmetadata_t, because the value is 255 char.
if ("SUBMISSION_MESSAGE".equalsIgnoreCase(key))
{
if (st.hasMoreTokens())
{
value = st.nextToken().trim();
submissionMsg = value;
}
}
}
return submissionMsg;
}
/**
* Adds extraction-created list of "|" key value pairs to assessment metadata map, if there are any. Example:
* <metadata type =" list " > FEEDBACK_SHOW_CORRECT_RESPONSE|True </ metadata >
* <metadata type =" list " > FEEDBACK_SHOW_STUDENT_SCORE|True </ metadata >
* Becomes:TEXT_FORMAT=>HTML etc.
*
* @param metadataList
* extraction-created list of "|" key value pairs
* @param assessment
* the assessment
*/
public void addTo(AssessmentFacade assessment)
{
if (metadataList == null)
{
return; // no metadata found
}
for (int i = 0; i < metadataList.size(); i++)
{
String meta = (String) metadataList.get(i);
//log.debug( "meta = "+ meta);
StringTokenizer st = new StringTokenizer(meta, "|");
String key = "";
String value = "";
if (st.hasMoreTokens())
{
key = st.nextToken().trim();
}
//log.debug( "key = "+ key );
// translate XML metadata strings to assessment metadata strings here
// key to patch up the difference between Daisy's and earlier labels
// that are compatible with the earlier beta version of Samigo
if ("AUTHORS".equals(key))
{
key = AssessmentMetaDataIfc.AUTHORS;
value = meta.substring(meta.indexOf("|") + 1);
assessment.addAssessmentMetaData(key, value);
}
else if ("ASSESSMENT_KEYWORDS".equals(key))
{
key = AssessmentMetaDataIfc.KEYWORDS;
value = meta.substring(meta.indexOf("|") + 1);
assessment.addAssessmentMetaData(key, value);
}
else if ("ASSESSMENT_OBJECTIVES".equals(key))
{
key = AssessmentMetaDataIfc.OBJECTIVES;
value = meta.substring(meta.indexOf("|") + 1);
assessment.addAssessmentMetaData(key, value);
}
else if ("ASSESSMENT_RUBRICS".equals(key))
{
key = AssessmentMetaDataIfc.RUBRICS;
value = meta.substring(meta.indexOf("|") + 1);
assessment.addAssessmentMetaData(key, value);
}
else if ("BGCOLOR".equals(key))
{
key = AssessmentMetaDataIfc.BGCOLOR;
value = meta.substring(meta.indexOf("|") + 1);
assessment.addAssessmentMetaData(key, value);
}
else if ("BGIMG".equals(key))
{
key = AssessmentMetaDataIfc.BGIMAGE;
value = meta.substring(meta.indexOf("|") + 1);
assessment.addAssessmentMetaData(key, value);
}
else if ("COLLECT_ITEM_METADATA".equals(key))
{
key = "hasMetaDataForQuestions";
value = meta.substring(meta.indexOf("|") + 1);
assessment.addAssessmentMetaData(key, value);
}
// for backwards compatibility with version 1.5 exports.
else if ("ASSESSMENT_RELEASED_TO".equals(key) &&
value != null && value.indexOf("Authenticated Users") > -1)
{
log.debug(
"Fixing obsolete reference to 'Authenticated Users', setting released to 'Anonymous Users'.");
value = AuthoringConstantStrings.ANONYMOUS;
}
else if ("SUBMISSION_MESSAGE".equalsIgnoreCase(key)){
//log.debug("key is submsg " + key);
// skip
}
else if ("ATTACHMENT".equalsIgnoreCase(key)) {
value = meta.substring(meta.indexOf("|") + 1);
assessment.addAssessmentAttachmentMetaData(value);
}
else if (st.hasMoreTokens())
{
value = st.nextToken().trim();
assessment.addAssessmentMetaData(key, value);
}
}
}
/**
* Turns on editability for everything (ecept template info),
* since we don't know if this metadata is in the assessment or not,
* or may not want to follow it, even if it is.
*
* The importer of the assesment may also be different than the
* exporter, and may be on a different system or have different
* templates, or policies, even if using this softwware.
*
* @param assessment
*/
public void setDefaults(AssessmentFacade assessment)
{
// turn this off specially, as template settings are meaningless on import
assessment.addAssessmentMetaData("templateInfo_isInstructorEditable",
"false");
for (int i = 0; i < editableKeys.length; i++)
{
assessment.addAssessmentMetaData(editableKeys[i], "true");
}
}
public List getMetadataList()
{
return metadataList;
}
public void setMetadataList(List metadataList)
{
this.metadataList = metadataList;
}
}