package org.egonet.io; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.TreeMap; import net.sf.functionalj.tuple.Pair; import net.sf.functionalj.tuple.Triple; import org.egonet.exceptions.CorruptedInterviewException; import org.egonet.model.Interview; import org.egonet.model.Study; import org.egonet.model.answer.*; import org.egonet.model.question.AlterPairQuestion; import org.egonet.model.question.AlterQuestion; import org.egonet.model.question.EgoQuestion; import org.egonet.model.question.Question; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class InterviewDataWritingUtil { public static boolean showableAsText(Question question) { return question.answerType.equals(TextAnswer.class) || question.answerType.equals(CategoricalAnswer.class); } public static boolean showableAsNumber(Question question) { return question.answerType.equals(NumericalAnswer.class) || question.answerType.equals(CategoricalAnswer.class); } public static String showAsText(Answer answer) { return answer == null ? "" : answer.toString(); } public static Integer showAsNumber(Answer answer) { return answer == null ? -1 : answer.getValue(); } public static InterviewAnswers interviewAnswers(Study study, Interview interview) { InterviewAnswers result = new InterviewAnswers(); StudyQuestionsByCategoryAndId studyQuestions = studyQuestionsByCategoryAndId(study); for(Answer answer : interview.get_answers()) { Long qId = answer.getQuestionId(); if(null != studyQuestions.egoQuestions.get(answer.getQuestionId())) { // answer to ego question result.egoQuestionToAnswer.put( qId, answer); } else if(null != studyQuestions.alterQuestions.get(qId)) { // answer to alter question result.alterQuestionToAnswer.put( new Pair<Long,Integer>( qId, answer.firstAlter()), answer); } else if (null != studyQuestions.linkQuestions.get(qId)) { // answer to alter-pair question result.linkQuestionToAnswer.put( new Triple<Long,Integer,Integer>( qId, answer.firstAlter(), answer.secondAlter()), answer); } } return result; } public static class InterviewAnswers { public TreeMap<Long,Answer> egoQuestionToAnswer = new TreeMap<Long,Answer>(); public TreeMap<Pair<Long,Integer>,Answer> alterQuestionToAnswer = new TreeMap<Pair<Long,Integer>,Answer>(); public TreeMap<Triple<Long,Integer,Integer>,Answer> linkQuestionToAnswer = new TreeMap<Triple<Long,Integer,Integer>,Answer>(); } public static StudyQuestionsByCategoryAndId studyQuestionsByCategoryAndId(Study study) { StudyQuestionsByCategoryAndId result = new StudyQuestionsByCategoryAndId(); for(Question question : study.getQuestions().values()) { TreeMap<Long,Question> qIdToTitle; if(question instanceof AlterPairQuestion) { qIdToTitle = result.linkQuestions; } else if(question instanceof EgoQuestion) { qIdToTitle = result.egoQuestions; } else if(question instanceof AlterQuestion) { qIdToTitle = result.alterQuestions; } else { qIdToTitle = null; } if(qIdToTitle != null) { qIdToTitle.put( question.UniqueId, question); } } return result; } public static class StudyQuestionsByCategoryAndId { public TreeMap<Long,Question> linkQuestions = new TreeMap<Long,Question>(); public TreeMap<Long,Question> egoQuestions = new TreeMap<Long,Question>(); public TreeMap<Long,Question> alterQuestions = new TreeMap<Long,Question>(); } // Get this directory with: // File intPath = // new File(egoClient.getStorage().getPackageFile().getParent(), // "/Interviews/"); public static Iterable<Interview> interviewsInDirectory(Study study, File interviewDirectory) { return new InterviewIterable(study,interviewDirectory); } private static class InterviewIterable implements Iterable<Interview> { final private static Logger logger = LoggerFactory.getLogger(InterviewIterable.class); private final Study study; final File interviewDirectory; public InterviewIterable( final Study study, final File interviewDirectory) { this.study = study; this.interviewDirectory = interviewDirectory; } public Iterator<Interview> iterator() { List<Interview> foundInterviews = new ArrayList<Interview>(); final String[] interviewFilenames = interviewDirectory.list(); for(int i = 0; i < interviewFilenames.length; i++) { String intFileName = interviewFilenames[i]; File intFile = new File(interviewDirectory, intFileName); InterviewReader intReader = new InterviewReader(study, intFile); try { Interview interview = intReader.getInterview(); foundInterviews.add(interview); } catch(CorruptedInterviewException ex) { String err = "Unable to read interview file, skipping in iterator"; if(intFile != null) err += " "+ intFile.getName(); if(ex.getMessage() != null) err += ": " + ex.getMessage(); logger.info(err, ex); } } return foundInterviews.iterator(); } } }