package org.ijsolutions.testbench; import java.util.Iterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openedit.Data; import org.openedit.hittracker.HitTracker; import org.openedit.hittracker.SearchQuery; public class DefaultTestBuilder implements TestBuilder { private static final Log log = LogFactory.getLog(DefaultTestBuilder.class); public Test createTest(TestBench testBench, TestPlan inStructions) throws Exception { boolean allowduplicates = inStructions.isAllowDuplicates(); QuestionSearcher searcher = testBench.getQuestionSearcher(); Test test = new Test(); test.setTime(inStructions.getTime());//the time it should take to write this test test.setTimed(inStructions.isTimed()); for (Iterator iterator = inStructions.getCategoryList().iterator(); iterator.hasNext();) { String categoryid = (String) iterator.next(); Category category = testBench.getCategory(categoryid); if(category == null){ continue; } test.addCategory(category); SearchQuery query = searcher.createSearchQuery(); query.addMatches("category", categoryid);//very slow. We'll change this query.addSortBy("random"); HitTracker hits = searcher.search(query); int questionCount = inStructions.getQuestionCount(categoryid); for (Iterator iter2 = hits.iterator(); iter2.hasNext();) { Data doc = (Data) iter2.next(); String id = doc.get("id"); Question question = searcher.getQuestionArchive().getQuestion(id); if(question != null){ TestNode testNode = new TestNode(); testNode.setQuestion(question); test.addNode(testNode); } String linkedquestion = question.get("linkedquestion"); if(linkedquestion != null){ log.info("adding linked question"); SearchQuery linked = searcher.createSearchQuery(); linked.addMatches("category", linkedquestion); query.addSortBy("random"); HitTracker links = searcher.search(linked); if(links.size() >0 ){ Data d = (Data) links.get(0); String linkedid = d.get("id"); Question q = searcher.getQuestionArchive().getQuestion(linkedid); if(question != null){ TestNode testNode = new TestNode(); testNode.setQuestion(q); test.addNode(testNode); } } } int size = test.getNodesForCategory(categoryid).size(); if(size >= questionCount){ break; } } } return test; } }