package org.egonet.io;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import net.sf.functionalj.tuple.Pair;
import net.sf.functionalj.tuple.Triple;
import org.egonet.io.InterviewDataWritingUtil.StudyQuestionsByCategoryAndId;
import org.egonet.model.Interview;
import org.egonet.model.Study;
import org.egonet.model.answer.*;
import org.egonet.model.question.Question;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
public class VnaInterviewWriter {
// See com.endlessloopsoftware.ego.client.statistics.Statistics.writeAlterArray
// and org.egonet.io.RawDataWriter
// and http://netwiki.amath.unc.edu/DataFormats/NetDrawVna
private Study study;
private Interview interview;
public VnaInterviewWriter(Study study, Interview interview) {
this.study = study;
this.interview = interview;
}
public void write(File file) throws IOException {
FileWriter fw = new FileWriter(file);
write(fw);
fw.close();
}
public void write(Writer writer) {
StudyQuestionsByCategoryAndId questions =
InterviewDataWritingUtil.studyQuestionsByCategoryAndId(study);
InterviewDataWritingUtil.InterviewAnswers answers =
InterviewDataWritingUtil.interviewAnswers(study, interview);
PrintWriter pw = new PrintWriter(writer);
pw.println("*Node data");
ArrayList<String> alterhead = Lists.newArrayList();
ArrayList<Long> alterQIds = Lists.newArrayList(questions.alterQuestions.keySet());
alterhead.add(sanitize("ID"));
for(Long qid : alterQIds) {
Question question = questions.alterQuestions.get(qid);
if(InterviewDataWritingUtil.showableAsText(question)) {
alterhead.add(sanitize(question.title+" text"));
}
if(InterviewDataWritingUtil.showableAsNumber(question)) {
alterhead.add(sanitize(question.title+" value"));
}
}
pw.println(Joiner.on(", ").join(alterhead));
String[] alterList = interview.getAlterList();
Integer numAlters = alterList.length;
for(Integer alterID = 0; alterID < numAlters; alterID++) {
ArrayList<String> rowData = Lists.newArrayList();
rowData.add(sanitize(alterList[alterID]));
for(Long qid : alterQIds) {
Question question = questions.alterQuestions.get(qid);
Answer answer =
answers.alterQuestionToAnswer.get(
new Pair<Long,Integer>(
qid,alterID));
if(InterviewDataWritingUtil.showableAsText(question)) {
rowData.add(sanitize(InterviewDataWritingUtil.showAsText(answer)));
}
if(InterviewDataWritingUtil.showableAsNumber(question)) {
rowData.add(sanitize(InterviewDataWritingUtil.showAsNumber(answer)+""));
}
}
pw.println(" "+Joiner.on(" ").join(rowData));
}
pw.println("*Tie data");
ArrayList<String> aphead = Lists.newArrayList();
ArrayList<Long> apQIds = Lists.newArrayList(questions.linkQuestions.keySet());
aphead.add("FROM TO");
for(Long qid : apQIds) {
Question question = questions.linkQuestions.get(qid);
if(InterviewDataWritingUtil.showableAsNumber(question)) {
aphead.add(sanitize(question.title));
}
}
pw.println(Joiner.on(" ").join(aphead));
for(Integer alterID1 = 0; alterID1 < numAlters; alterID1++) {
for(Integer alterID2 = alterID1+1; alterID2 < numAlters; alterID2++) {
ArrayList<String> rowData = Lists.newArrayList();
rowData.add(sanitize(alterList[alterID1]));
rowData.add(sanitize(alterList[alterID2]));
for(Long qid : apQIds) {
Question question = questions.linkQuestions.get(qid);
Answer answer =
answers.linkQuestionToAnswer.get(
new Triple<Long,Integer,Integer>(
qid,alterID1,alterID2));
if(InterviewDataWritingUtil.showableAsNumber(question)) {
Integer number = InterviewDataWritingUtil.showAsNumber(answer);
rowData.add((number == null ? 0 : number)+"");
}
}
pw.println(Joiner.on(" ").join(rowData));
}
}
pw.flush();
}
private String sanitize(String string) {
if(string == null) {
return "_";
}
return "\""+string.replaceAll("[^a-zA-Z_\\-0-9 ]","_")+"\"";
}
}