Skip to content

Commit

Permalink
Merge pull request sakaiproject#862 from mcarropellicer/SAM-1596
Browse files Browse the repository at this point in the history
SAM-1596 - Update site ids in published question pool questions
  • Loading branch information
juanjmerono committed Aug 3, 2015
2 parents 2b07455 + 4f12922 commit ac723d2
Showing 1 changed file with 158 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@ public class PublishedAssessmentFacadeQueries extends HibernateDaoSupport

public static final String SUBMITTED = "submittedDate";

public static final String SITECONTENTPATH = "/access/content/group/";

public PublishedAssessmentFacadeQueries() {
}

Expand Down Expand Up @@ -721,6 +723,7 @@ public PublishedAssessmentFacade publishAssessment(
Iterator itemIter = itemSet.iterator();
while (itemIter.hasNext()) {
PublishedItemData item = (PublishedItemData) itemIter.next();
replaceEmbeddedSiteIdsForItem(item);
Set itemMetaDataSet = item.getItemMetaDataSet();
Iterator itemMetaDataIter = itemMetaDataSet.iterator();
while (itemMetaDataIter.hasNext()) {
Expand Down Expand Up @@ -3438,4 +3441,159 @@ public Object doInHibernate(Session session)throws HibernateException, SQLExcept
return assessmentList;
}
*/

/**
* Replaces embedded site ids for Items.
* Helper method for replaceEmbeddedSiteIds(); handles the question (item) level. This
* includes the item-level feedback and itemText objects containing more item data.
* Called by replaceEmbeddedSiteIds()
* Calls into replaceEmbeddedSiteIdsForItemText() in order to access more detailed item data.
*
* @param item
*/
private void replaceEmbeddedSiteIdsForItem(PublishedItemData item) {
String toContext = AgentFacade.getCurrentSiteId();

replaceEmbeddedSiteIdsForItemText(item.getItemTextSet(), toContext);

// Replace the hint (model answer) site ids
String itemHint = item.getHint();
if (itemHint != null) {
item.setHint(replaceSiteIdsForString(itemHint,toContext));
}

replaceEmbeddedSiteIdsForFeedback(item.getItemFeedbackSet(), toContext);
}

/**
* Replaces embedded site ids for ItemText objects.
* Helper method for replaceEmbeddedSiteIds(); handles the ItemText objects which contain
* text and answers for each question (item).
* Called by replaceEmbeddedSiteIdsForItems()
* Calls into replaceEmbeddedSiteIdsForItemText() to replace more detailed item information.
*
* @param itemTextSet
* @param toContext Site Id
*/
private void replaceEmbeddedSiteIdsForItemText(Set itemTextSet, String toContext) {

Iterator itemTextSetIter = itemTextSet.iterator();
while (itemTextSetIter.hasNext()) {
PublishedItemText itemText = (PublishedItemText) itemTextSetIter.next();
String itemTextString = itemText.getText();
if (itemTextString != null) {
itemText.setText(replaceSiteIdsForString(itemTextString,toContext)); // text for the question (item)
}

// Go through each answer (A,B,C,etc) object and replace the Site Ids
replaceEmbeddedSiteIdsForAnswers(itemText.getAnswerSet(), toContext);

}
}

/**
* Replaces embedded site ids for Item Answers.
* Helper method for replaceEmbeddedSiteIds(); handles the Answers from items.
* Called by replaceEmbeddedSiteIdsForItemText()
* Calls into replaceEmbeddedSiteIdsForAnswerFeedback() to access each question-level
* feedback.
*
* @param answerSet
* @param toContext Site Id
*/
private void replaceEmbeddedSiteIdsForAnswers(Set answerSet, String toContext) {

Iterator answerSetIter = answerSet.iterator();
while (answerSetIter.hasNext()) {
PublishedAnswer answer = (PublishedAnswer) answerSetIter.next();
String answerText = answer.getText();
if (answerText != null) {
answer.setText(replaceSiteIdsForString(answerText,toContext)); // each answer text (A,B,C,etc)
}

// Go through the answer-level feedback and replace site ids
replaceEmbeddedSiteIdsForAnswerFeedback(answer.getAnswerFeedbackSet(), toContext);

}
}

/**
* Replaces embedded site ids for Answer-level feedback
* Helper method for replaceEmbeddedSiteIds(); handles the answer-level feedback.
* Called by replaceEmbeddedSiteIdsForAnswers()
*
* @param answerFeedbackSet
* @param toContext Site Id
*/
private void replaceEmbeddedSiteIdsForAnswerFeedback(Set answerFeedbackSet, String toContext) {

Iterator answerFeedbackSetIter = answerFeedbackSet.iterator();
while (answerFeedbackSetIter.hasNext()) {
PublishedAnswerFeedback answerFeedback = (PublishedAnswerFeedback) answerFeedbackSetIter.next();
String answerFeedbackText = answerFeedback.getText();
if (answerFeedbackText != null) {
answerFeedback.setText(replaceSiteIdsForString(answerFeedbackText,toContext)); // answer-level
}
}
}

/**
* Replaces embedded site ids for ItemFeedback objects
* Helper method for replaceEmbeddedSiteIds(); hanldes the itemfeedback objects which contain
* text for question-level feedback.
* Called by replaceEmbeddedSiteIdsForItems()
*
* @param feedbackSet
* @param toContext Site Id
*/
private void replaceEmbeddedSiteIdsForFeedback(Set feedbackSet, String toContext) {

Iterator feedbackSetIter = feedbackSet.iterator();
while (feedbackSetIter.hasNext()) {
PublishedItemFeedback feedback = (PublishedItemFeedback) feedbackSetIter.next();
String feedbackString = feedback.getText();
if (feedbackString != null) {
feedback.setText(replaceSiteIdsForString(feedbackString,toContext));
}
}
}

/**
* Replaces embedded site ids for individual strings contained in
* assessment objects
* Helper method for replaceEmbeddedSiteIds();
*
* @param assessmentStringData text contained in any assessment item object (question text, feedback text, etc)
* @param toContext Site Id
* @return updatedAssessmentStringData
*/
private String replaceSiteIdsForString(String assessmentStringData, String toContext) {
String updatedAssessmentStringData = null;

//if contains "..getServerUrl()/access/content/group/" then it's a standard site content file
if (assessmentStringData != null) {
String sakaiSiteResourcePath = ServerConfigurationService.getServerUrl() + SITECONTENTPATH;
int beginIndex = assessmentStringData.indexOf(sakaiSiteResourcePath);

if (beginIndex > 0) {
// have to loop because there may be more than one site of origin for the content
while (beginIndex > 0) {
int siteIdIndex = beginIndex + sakaiSiteResourcePath.length();
int endSiteIdIndex = assessmentStringData.indexOf('/', siteIdIndex);
String fromContext = assessmentStringData.substring(siteIdIndex, endSiteIdIndex);
updatedAssessmentStringData = assessmentStringData.replaceAll(fromContext, toContext);

beginIndex = assessmentStringData.indexOf(sakaiSiteResourcePath, endSiteIdIndex);
} // end while
}
else {
// It's not a standard site url. It's either a 'My Workspace',
// external site url, or something else, so leave it alone.
updatedAssessmentStringData = assessmentStringData;
}

} // end:if (assessmentStringData != null)

return updatedAssessmentStringData;
}
}

0 comments on commit ac723d2

Please sign in to comment.