package dk.daoas.fulddaekning; import java.sql.SQLException; import java.util.Queue; import java.util.logging.Level; import java.util.logging.Logger; public class LookupWorker implements Runnable { class LookupResult { double bedsteAfstand = 9999999.999; Adresse bedsteAdr = null; } Constants consts; Logger logger = Logger.getLogger( LookupWorker.class.getName() ); int workerId; Lookup lookup; public LookupWorker(int workerId, Lookup lookup) { this.workerId = workerId; this.lookup = lookup; consts = Constants.getInstance(); } @Override public void run() { Constants consts = Constants.getInstance(); Adresse daekkede[] = lookup.getDaekkedeAdresser(); Queue queue = lookup.getQueue(); Database db = lookup.getDb(); Adresse qAdresse; while ( (qAdresse = queue.poll()) != null) { //logger.info("Worker " + workerId + ", analyzing " + qAdresse); LookupResult result = findBedsteAdresse(qAdresse, daekkede); if (result.bedsteAdr == null && consts.doExtendedLookup() == true) {//hvis vi ikke fandt en adresse og vi må kigge på udvidet område logger.info("Extended lookup for " + qAdresse); result = findBedsteAdresse(qAdresse, Lookup.alleDaekkedeAdresser); } if ( result.bedsteAdr != null) { if (result.bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren if (Lookup.verbose == true) { logger.info("(" +workerId + ") Bedste: " + qAdresse + "==>" + result.bedsteAdr + " ::: " + result.bedsteAfstand ); } try { db.gemResultat(qAdresse, result.bedsteAdr, result.bedsteAfstand); } catch (SQLException e) { logger.log(Level.WARNING, "Error saving result", e); logger.warning("Shutting down"); System.exit(0); //hvis at indsættelsen fejler skal vi afbryde med det samme } } else { logger.info("(" +workerId + ") For stor afstand " + qAdresse + " -> " + result.bedsteAfstand); } } else { logger.warning("(" +workerId + ") Ingen match til " + qAdresse); } } lookup.shutdownWorker( workerId); } LookupResult findBedsteAdresse(Adresse qAdresse, Adresse daekkede[]) { LookupResult result = new LookupResult(); for (int i=0; i" + daekket); //Skal udkommenteres senere når HO check er valideret continue; } } double afstand = Adresse.beregnAfstand(qAdresse, daekket); if (afstand < result.bedsteAfstand) { result.bedsteAfstand = afstand; result.bedsteAdr = daekket; } } return result; } }