package uk.ac.leeds.sog.moses.agent; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import org.apache.log4j.Logger; /** * @author BELINDA *This class builds up the model and outputs the model description */ public class ModelBuilder { public static final int NUMBER_OF_DATA_FIELDS = 18; private Model i_model; private Map i_modelMap; private List i_invalidData; private int i_numOfValidaData; private int i_numberOfHRPs; private int i_numberOfSpouses; private int i_numberOfChildren; private int i_numberOfElderlyDependents; private int i_numberOfAdultDependents; private List i_areas; private static Logger s_logger = Logger.getLogger(ModelBuilder.class); private static String s_lineSeparator = System.getProperty("line.separator"); //the constructor public ModelBuilder() { i_model = new Model(); i_modelMap = new HashMap(); i_invalidData = new ArrayList(); i_numOfValidaData = 0; i_numberOfHRPs = 0; i_numberOfSpouses = 0; i_numberOfChildren = 0; i_numberOfElderlyDependents = 0; i_numberOfAdultDependents = 0; i_areas = new ArrayList(); } //method to get the model public Model getModel() { return i_model; } //method to build up the model public Model buildModel(String filename) { try { BufferedReader in = new BufferedReader(new FileReader(filename)); String line = in.readLine(); while(line != null) { // read file and create hrp/child/elderlyDependent/spouse/AdultDependent lists StringTokenizer st = new StringTokenizer(line, ","); // HRP number of tokens: NUMBER_OF_DATA_FIELDS; non-HRP number of tokens: NUMBER_OF_DATA_FIELDS - 1 int numberOfTokens = st.countTokens(); if(numberOfTokens == NUMBER_OF_DATA_FIELDS || numberOfTokens == (NUMBER_OF_DATA_FIELDS - 1)) { String pid = st.nextToken(); if(pid.equalsIgnoreCase("PID")) { // not a data line in the data file // PID,IndividualSARRecordID,ID,Age,Social Class,Gender,Marital Status etc. s_logger.debug("not a data line: " + line); } else { st.nextToken(); st.nextToken(); st.nextToken(); st.nextToken(); st.nextToken(); st.nextToken(); st.nextToken(); st.nextToken(); String location = st.nextToken(); //finish for all people in the area, then move to the next area if(i_modelMap.containsKey(location)) { AreaModel areaModel = (AreaModel) i_modelMap.get(location); areaModel.addPersonData(line); } else { AreaModel areaModel = new AreaModel(location); areaModel.addPersonData(line); i_modelMap.put(location, areaModel); i_areas.add(location); } i_numOfValidaData++; } } else { s_logger.error("data error(number of fields): " + st.countTokens()); s_logger.error("data error(number of fields): " + line); i_invalidData.add(line); } // read next line line = in.readLine(); } } catch(IOException e) { e.printStackTrace(); s_logger.error("Unable to read data. System stops."); System.exit(1); } // get all areaModel information then output to model description for(int i=0; i