/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.modules.scorm.archiver;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.olat.core.gui.translator.Translator;
/**
*
* Description:<br>
* An implementation of the ScormExportVisitor which create a tab separated
* file with the results of the visited scos.
*
* <P>
* Initial Date: 17 august 2009 <br>
* @author srosse
*/
public class ScormExportFormatter implements ScormExportVisitor {
private final Translator translator;
private final List<ScoDatas> datas = new ArrayList<ScoDatas>();
private final Map<String,CmiColumn> interactionColsMap = new HashMap<String,CmiColumn>();
private final Map<String,CmiColumn> objectivesColsMap = new HashMap<String,CmiColumn>();
public ScormExportFormatter(Translator translator) {
this.translator = translator;
}
/**
* Collect the datas and count the number of interactions and objectives
* @see org.olat.modules.scorm.archiver.ScormExportVisitor#visit(org.olat.modules.scorm.archiver.ScoDatas)
*/
public void visit(ScoDatas data) {
datas.add(data);
for(ScoInteraction interaction:data.getInteractions()) {
CmiColumn col = interactionColsMap.get(interaction.getInteractionId());
if(col == null)
{
col = new CmiColumn(interaction);
interactionColsMap.put(interaction.getInteractionId(), col);
}
}
for(ScoObjective objective:data.getObjectives()) {
CmiColumn col = interactionColsMap.get(objective.getId());
if(col == null)
{
col = new CmiColumn(objective);
objectivesColsMap.put(objective.getId(), col);
}
}
}
/**
* Build the file with the collected datas.
* @return
*/
public String export() {
StringBuilder sb = new StringBuilder();
List<CmiColumn> interactionsCols = new ArrayList<CmiColumn>(interactionColsMap.values());
Collections.sort(interactionsCols);
List<CmiColumn> objectivesCols = new ArrayList<CmiColumn>(objectivesColsMap.values());
Collections.sort(objectivesCols);
// header
String headerVal = translator.translate("results.table.header.username");
sb.append(headerVal);
headerVal = translator.translate("results.table.header.itemId");
sb.append('\t').append(headerVal);
headerVal = translator.translate("results.table.header.rawScore");
sb.append('\t').append(headerVal);
headerVal = translator.translate("results.table.header.lessonStatus");
sb.append('\t').append(headerVal);
headerVal = translator.translate("results.table.header.totalTime");
sb.append('\t').append(headerVal);
for (int i=0; i<interactionsCols.size(); i++) {
int count = i+1;
String headerInteraction = translator.translate("results.table.header.interaction", new String[]{Integer.toString(count)});
sb.append('\t').append(headerInteraction);
sb.append('\t').append("SR").append(' ').append(count);
sb.append('\t').append("CR").append(' ').append(count);
}
for(int i=0; i<objectivesCols.size(); i++) {
int count = i+1;
String headerObjective = translator.translate("results.table.header.objective", new String[]{Integer.toString(count)});
sb.append('\t').append(headerObjective);
}
headerVal = translator.translate("results.table.header.comments");
sb.append('\t').append(headerVal);
sb.append('\n');
// data
for (ScoDatas data:datas) {
sb.append(clean(data.getUsername()));
sb.append('\t').append(clean(data.getItemId()));
sb.append('\t').append(clean(data.getRawScore()));
sb.append('\t').append(clean(data.getLessonStatus()));
sb.append('\t').append(clean(data.getTotalTime()));
// interactions
for (CmiColumn col:interactionsCols) {
int pos = col.getPosition();
ScoInteraction interactions = data.getInteraction(pos);
sb.append('\t').append(clean(interactions.getResult()));
sb.append('\t').append(clean(interactions.getStudentResponse()));
sb.append('\t').append(clean(interactions.getCorrectResponse()));
}
// objectives
for(CmiColumn col:objectivesCols) {
String id = col.getId();
ScoObjective objective = data.getObjective(id);
if(objective == null) {
sb.append('\t');
}
else {
sb.append('\t').append(objective.getScoreRaw());
}
}
sb.append('\t').append(clean(data.getComments()));
sb.append('\n');
}
// footer
sb.append('\n').append('\n').append('\n');
String footerVal = translator.translate("results.table.foot.cr");
sb.append("SR:").append('\t').append(footerVal).append('\n');
footerVal = translator.translate("results.table.footer.sr");
sb.append("CR:").append('\t').append(footerVal).append('\n');
return sb.toString();
}
private String clean(String str) {
return str == null ? "" : str;
}
public String toString() {
return export();
}
public class CmiColumn implements Comparable<CmiColumn> {
private final int position;
private final String id;
public CmiColumn(ScoObjective objective) {
this.id = objective.getId();
this.position = objective.getPosition();
}
public CmiColumn(ScoInteraction interaction) {
this.id = interaction.getInteractionId();
this.position = interaction.getPosition();
}
public String getId() {
return id;
}
public int getPosition() {
return position;
}
public int compareTo(CmiColumn o) {
int c = position - o.position;
if(c == 0) {
if(id == null)
return -1;
else if(o.id == null)
return 1;
c = id.compareTo(o.id);
}
return c;
}
@Override
public int hashCode() {
return id == null ? 257869 : id.hashCode();
}
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
else if(obj instanceof CmiColumn) {
CmiColumn col = (CmiColumn)obj;
return id != null && id.equals(col.id);
}
return false;
}
}
}