From 2399aebc487804ac9252f0f1f432c8ffde9f13f5 Mon Sep 17 00:00:00 2001
From: Peter Alexander <peter@blackhillock.co.uk>
Date: Wed, 5 Aug 2015 13:36:17 +0100
Subject: [PATCH] A little refactoring

---
 src/ac/ed/lurg/landuse/LandCoverReader.java   | 100 +++---------------
 .../raster/AbstractTabularRasterReader.java   |  88 +++++++++++++++
 2 files changed, 103 insertions(+), 85 deletions(-)
 create mode 100644 src/ac/sac/raster/AbstractTabularRasterReader.java

diff --git a/src/ac/ed/lurg/landuse/LandCoverReader.java b/src/ac/ed/lurg/landuse/LandCoverReader.java
index 3253f6d8..dbe86eb2 100644
--- a/src/ac/ed/lurg/landuse/LandCoverReader.java
+++ b/src/ac/ed/lurg/landuse/LandCoverReader.java
@@ -1,28 +1,22 @@
 package ac.ed.lurg.landuse;
 
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-
 import ac.ed.lurg.types.LandCoverType;
-import ac.ed.lurg.utils.LogWriter;
+import ac.sac.raster.AbstractTabularRasterReader;
 import ac.sac.raster.RasterHeaderDetails;
 import ac.sac.raster.RasterKey;
 import ac.sac.raster.RasterSet;
 
-public class LandCoverReader {	
-
-	private static int X_COL = 0;
-	private static int Y_COL = 1;
+public class LandCoverReader extends AbstractTabularRasterReader<LandCoverItem> {	
 
-	private RasterSet<LandCoverItem> dataset;
-	
+	private static final int MIN_COLS = 6;
 	private int croplandCol = 2;
 	private int pastureCol = 3;
 	private int naturalCol = 4;
 	private int barrenCol = 5;
 
 	public LandCoverReader (RasterHeaderDetails rasterProj) {
+		super(" +", MIN_COLS);
+		
 		dataset = new RasterSet<LandCoverItem> (rasterProj) {
 			private static final long serialVersionUID = 4642550777741425501L;
 			@Override
@@ -31,85 +25,21 @@ public class LandCoverReader {
 			}
 		};
 	}
-	
-	private String[] parseLine(String line) {
-		return line.trim().split(" +");
-	}
-	
-	private boolean handleHeader(String[] headertokens) throws IOException {
-		if (headertokens.length < 6) {
-			LogWriter.printlnError("Too few columns");
-			return false;
-		}
+		
+	protected void handleHeader(String[] headertokens) {
+		handleHeader(headertokens);
 		croplandCol = findColIndex(headertokens, "CROPLAND");
 		pastureCol = findColIndex(headertokens, "PASTURE");
 		naturalCol = findColIndex(headertokens, "NATURAL");
 		barrenCol = findColIndex(headertokens, "BARREN");
-		
-		return true;
 	}
-	
-	private int findColIndex(String[] headertokens, String colName) {
-		for (int i=0; i<headertokens.length; i++) {
-			if (headertokens[i].toUpperCase().equals(colName)) {
-				return i;
-			}
-		}
-		
-		throw new RuntimeException("Can't find colName " + colName);
-	}
-	
-	public RasterSet<LandCoverItem> getRasterDataFromFile(String filename) {
-		long startTime = System.currentTimeMillis();
-
-		BufferedReader in = null;
-		try {
-			in = new BufferedReader(new FileReader(filename));
-			String line = in.readLine(); // read header
-			boolean headOk = handleHeader(parseLine(line));
-
-			if (!headOk) {
-				LogWriter.printlnError("Problems reading head " + filename);
-				throw new RuntimeException("Too few columns in " + filename);
-			}
-
-			while ((line=in.readLine()) != null) {
-				String[] tokens = parseLine(line);
-								
-				double[] colValues = new double[tokens.length];
-				for (int i=0; i<tokens.length; i++) {
-					double d = Double.parseDouble(tokens[i]);
-					colValues[i] = d;
-				}
-				
-				LandCoverItem lcData = dataset.getFromCoordinates(colValues[X_COL], colValues[Y_COL]);
-				RasterKey key = dataset.getKeyFromCoordinates(colValues[X_COL], colValues[Y_COL]);
-				lcData.setTotalArea(dataset.getAreaMha(key));		
-				
-				lcData.setLandCoverFract(LandCoverType.CROPLAND, colValues[croplandCol]);
-				lcData.setLandCoverFract(LandCoverType.PASTURE, colValues[pastureCol]);
-				lcData.setLandCoverFract(LandCoverType.OTHER_NATURAL, colValues[naturalCol]);
-				lcData.setLandCoverFract(LandCoverType.BARREN, colValues[barrenCol]);
-			}
-			
-			in.close();
-		}
-		catch (Exception e) {
-			LogWriter.printlnError("Problem reading initial land cover data");
-			e.printStackTrace();
-			throw new RuntimeException(e);
-		}
-		finally {
-			if (in != null)
-				try {
-					in.close();
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-		}
-
-		LogWriter.println("Reading " + filename + ", took " + (System.currentTimeMillis() - startTime) + " ms");
 
-		return dataset;
+	@Override
+	protected void setData(RasterKey key, LandCoverItem lcData, double[] colValues) {
+		lcData.setTotalArea(dataset.getAreaMha(key));		
+		lcData.setLandCoverFract(LandCoverType.CROPLAND, colValues[croplandCol]);
+		lcData.setLandCoverFract(LandCoverType.PASTURE, colValues[pastureCol]);
+		lcData.setLandCoverFract(LandCoverType.OTHER_NATURAL, colValues[naturalCol]);
+		lcData.setLandCoverFract(LandCoverType.BARREN, colValues[barrenCol]);
 	}
 }
diff --git a/src/ac/sac/raster/AbstractTabularRasterReader.java b/src/ac/sac/raster/AbstractTabularRasterReader.java
new file mode 100644
index 00000000..7abbc23c
--- /dev/null
+++ b/src/ac/sac/raster/AbstractTabularRasterReader.java
@@ -0,0 +1,88 @@
+package ac.sac.raster;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+import ac.ed.lurg.utils.LogWriter;
+
+public abstract class AbstractTabularRasterReader<D extends RasterItem> {
+
+	private static int X_COL = 0;
+	private static int Y_COL = 1;
+
+	protected RasterSet<D> dataset;
+	private String delimiterRegex;
+	private int minColNum;
+
+	public AbstractTabularRasterReader (String delimiterRegex, int minColNum) {
+		this.delimiterRegex = delimiterRegex;
+		this.minColNum = minColNum;
+	}
+	
+	private String[] parseLine(String line) {
+		return line.trim().split(delimiterRegex);
+	}
+	
+	private void handleHeader(String[] headertokens) {
+		if (headertokens.length < minColNum) {
+			LogWriter.printlnError("Too few columns");
+		}
+	}
+	
+	protected int findColIndex(String[] headertokens, String colName) {
+		for (int i=0; i<headertokens.length; i++) {
+			if (headertokens[i].toUpperCase().equals(colName)) {
+				return i;
+			}
+		}
+		
+		throw new RuntimeException("Can't find colName " + colName);
+	}
+	
+	public RasterSet<D> getRasterDataFromFile(String filename) {
+		long startTime = System.currentTimeMillis();
+
+		BufferedReader in = null;
+		try {
+			in = new BufferedReader(new FileReader(filename));
+			String line = in.readLine(); // read header
+			handleHeader(parseLine(line));
+
+			while ((line=in.readLine()) != null) {
+				String[] tokens = parseLine(line);
+								
+				double[] colValues = new double[tokens.length];
+				for (int i=0; i<tokens.length; i++) {
+					double d = Double.parseDouble(tokens[i]);
+					colValues[i] = d;
+				}
+				
+				D item = dataset.getFromCoordinates(colValues[X_COL], colValues[Y_COL]);
+				RasterKey key = dataset.getKeyFromCoordinates(colValues[X_COL], colValues[Y_COL]);
+				setData(key, item, colValues);
+			}
+			
+			in.close();
+		}
+		catch (Exception e) {
+			LogWriter.printlnError("Problem reading initial land cover data");
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+		finally {
+			if (in != null)
+				try {
+					in.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+		}
+
+		LogWriter.println("Reading " + filename + ", took " + (System.currentTimeMillis() - startTime) + " ms");
+
+		return dataset;
+	}
+
+	abstract protected void setData(RasterKey key, D item, double[] colValues);
+}
-- 
GitLab