Newer
Older
package ac.ed.lurg.landuse;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import ac.ed.lurg.ModelConfig;
import ac.ed.lurg.country.CompositeCountry;
import ac.ed.lurg.country.CompositeCountryManager;
import ac.ed.lurg.country.SingleCountry;
import ac.ed.lurg.types.CropType;
import ac.ed.lurg.utils.LazyHashMap;
import ac.ed.lurg.utils.LogWriter;
public class CropUsageReader {
private static final int COUNTRY_COL = 1;
private static final int COMMODITY_COL = 0;
private static final int NET_IMPORT_COL = 3;
private CompositeCountryManager compositeCountryManager;
public CropUsageReader(CompositeCountryManager compositeCountryManager) {
this.compositeCountryManager = compositeCountryManager;
}
public Map<CompositeCountry, Map<CropType, CropUsageData>> getCommodityData() {
LazyHashMap<CompositeCountry, Map<CropType, CropUsageData>> commodityMap = new LazyHashMap<CompositeCountry, Map<CropType, CropUsageData>>() {
protected Map<CropType, CropUsageData> createValue() {
Map<CropType, CropUsageData> countryData = new HashMap<CropType, CropUsageData>();
countryData.put(CropType.ENERGY_CROPS, new CropUsageData(Double.NaN, Double.NaN, 0.0, Double.NaN,Double.NaN, Double.NaN, Double.NaN)); // 2nd generation energy crops not in FAO data, so adding zero values.
return countryData;
}
String filename = ModelConfig.NET_IMPORTS_FILE;
try {
BufferedReader fitReader = new BufferedReader(new FileReader(filename));
String line, countryName, commodityName;
double netImports;
fitReader.readLine(); // read header
while ((line=fitReader.readLine()) != null) {
String[] tokens = line.split(",");
if (tokens.length < 4)
LogWriter.printlnError("Too few columns in " + filename + ", " + line);
countryName = tokens[COUNTRY_COL];
commodityName = tokens[COMMODITY_COL];
netImports = Double.parseDouble(tokens[NET_IMPORT_COL]);
SingleCountry country = CountryManager.getForName(countryName);
CropType crop = CropType.getForFaoName(commodityName);
CompositeCountry cc = compositeCountryManager.getForSingleCountry(country);
Map<CropType, CropUsageData> countryData = commodityMap.lazyGet(cc);
CropUsageData oldData = countryData.get(crop);
// aggregate if multiple countries for cc
if (oldData != null) {
netImports += oldData.getNetImports();
}
CropUsageData newData = new CropUsageData(Double.NaN, Double.NaN, netImports, Double.NaN,Double.NaN, Double.NaN, Double.NaN);
}
fitReader.close();
} catch (IOException e) {
LogWriter.printlnError("Failed in reading commodity demand fits");
}
LogWriter.println("Processed " + filename + ", create " + commodityMap.size() + " country commodity maps values");
return commodityMap;
}
}