001 package ps6.tigerdb; 002 003 import java.io.Serializable; 004 005 import ps2.GeoPoint; 006 007 /** 008 * TigerRecord.java 009 * 010 * @author Felix S. Klock II 011 */ 012 013 public class TigerRecord implements Serializable { 014 public static final long serialVersionUID = 4534; 015 protected static GeoPoint makeGP(int lng, int lat) { 016 GeoPoint gp = new GeoPoint(lat, lng); 017 return gp; 018 } 019 020 /** Special ctor to work around predefined record length (Record 021 * Type C seems to be flawed. 022 */ 023 public TigerRecord() { } 024 025 public TigerRecord(String s, int recordSize) { 026 if (s.length() != recordSize) 027 die("length must be "+recordSize+ 028 ", not "+s.length()); 029 } 030 031 protected void die(String reason) {throw new RuntimeException(reason);} 032 033 /** Parses `s' as an int, with the following additions to the 034 * standard Integer.parseInt() method: 035 * 1. White space around `s' is allowed (and ignored) 036 * 2. If s is an empty string after trimming, throws NoInt 037 * 3. The number may be prefixed by a '+' character. 038 * 4. If s is contains non-numeric data, throws NonNumericDataException 039 */ 040 protected int toInt(String s) throws NoInt, NonNumericDataException { 041 s = s.trim(); 042 if (s.length() == 0) throw new NoInt(); 043 if (s.charAt(0) == '+') { 044 s = s.substring(1); 045 } 046 try { 047 return Integer.parseInt(s); 048 } catch (NumberFormatException e) { 049 throw new NonNumericDataException(s); 050 } 051 } 052 053 protected static class NoInt extends Throwable { 054 public static final long serialVersionUID = 4534; 055 } 056 057 public DirectedStreetNumberRange 058 parseAddrRange(String frStr, String toStr) throws BadRecordException { 059 060 try { 061 int fraddl = toInt(frStr); 062 int toaddl = toInt(toStr); 063 if ((fraddl % 2) != (toaddl % 2)) 064 throw new BadRecordException 065 ("bad left address ["+fraddl+","+toaddl+"]",frStr+toStr); 066 int low = Math.min(fraddl, toaddl); 067 int high = Math.max(fraddl, toaddl); 068 069 boolean b = (fraddl < toaddl); 070 IntSet s = new IntSet(low, high); 071 return new DirectedStreetNumberRange(s, b); 072 } catch (NoInt e) { 073 return new DirectedStreetNumberRange(); 074 } catch (NumberFormatException e) { 075 throw new NonNumericDataException(frStr+","+toStr); 076 } 077 } 078 079 080 } // TigerRecord