package me.osm.gazetter.diff; import java.io.PrintWriter; import java.util.Set; import java.util.TreeMap; import me.osm.gazetter.striper.GeoJsonWriter; import me.osm.gazetter.utils.FileUtils.LineHandler; import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; /** * Read New file and get timestamps and md5 hashes of strings * if map (prefiled with same values from old file) doesnt * contains same object id - write add instruction into ooutput * * @author dkiselev */ public final class DiffNewFileFirstPassReader implements LineHandler { private final Set<String> olds; private final Counters counters; private TreeMap<String, Object[]> map; private PrintWriter outTmp; /** * @param map with ids and timestamps from old * @param outTmp output writer * @param olds old object ids * @param counters */ public DiffNewFileFirstPassReader(TreeMap<String, Object[]> map, PrintWriter outTmp, Set<String> olds, Counters counters) { this.olds = olds; this.counters = counters; this.map = map; this.outTmp = outTmp; } @Override public void handle(String s) { if(StringUtils.isEmpty(s)) { return; } String id = GeoJsonWriter.getId(s); DateTime timestamp = GeoJsonWriter.getTimestamp(s); String md5 = GeoJsonWriter.getMD5(s); counters.newHash = counters.newHash ^ s.hashCode(); counters.newTs = counters.newTs.isAfter(timestamp) ? counters.newTs : timestamp; Object[] row = map.get(id); if(row == null) { outTmp.println("+ " + s); counters.add++; } else { if (!((String)row[0]).equals(md5)) { DateTime old = (DateTime)row[1]; if(old.isBefore(timestamp)) { outTmp.println("N " + s); counters.takeNew++; } else { olds.add(id); } } } map.remove(id); } }