package dk.daoas.fulddaekning; import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; import dk.daoas.fulddaekning.BoundingBox.BoundingBoxException; public class Lookup { final static Logger logger = Logger.getLogger( Lookup.class.toString() ); String postnr; Database db; Adresse daekkedeAdresser[]; Queue queue; Map workers = new ConcurrentHashMap(); public Lookup(String postnr, Database db) { this.postnr = postnr; this.db = db; } public void doLookup() throws BoundingBoxException { logger.info("Starting for postnr=" + postnr); Statistik stat = new Statistik(); long start1 = System.currentTimeMillis(); long start2 = 0; try { logger.info("Henter _ikke_ daekkede adresser i " + postnr); queue = db.hentIkkedaekkedeAdresser(postnr); if (queue.size() == 0) { logger.info("Fandt ikke nogen _ikke_ daekkede adresser i " + postnr); return; } BoundingBox bbox = db.getBoundingbox(postnr); bbox.validateBbox(); logger.info("Bbox=" + bbox); bbox.adjustToMargin(); logger.info("Bbox Adjusted=" + bbox); logger.info("Henter daekkede adresser i " + postnr); daekkedeAdresser = db.hentDaekkedeAdresser(bbox); stat.postnr = postnr; stat.antalDaekkede = daekkedeAdresser.length; stat.antalIkkeDaekkede = queue.size(); stat.totalDataset = stat.antalDaekkede * stat.antalIkkeDaekkede; logger.info("Starter beregning for " + postnr); start2 = System.currentTimeMillis(); for (int i =0; i < LookupMain.max_workers; i++) { LookupWorker worker = new LookupWorker(i, this); Thread t = new Thread(worker); t.start(); workers.put(i, worker); } while (workers.size() > 0) { Thread.sleep(10);//wait for worker threads } db.saveBatch();//Save any unsaved rows } catch(Exception e) { logger.log(Level.WARNING, "Exception during lookup", e); if (e instanceof BoundingBoxException) { logger.severe( e.getMessage() ); System.exit(1); } } long now = System.currentTimeMillis(); stat.forbrugtTid = (now-start1); LookupMain.saveStatistics(stat); logger.info( stat.toString() ); logger.info("Done! elapsed=" + (now-start1) + "/" + (now-start2) + " postnr=" + postnr); } public void shutdownWorker(int workerid) { //logger.info("Shutting down worker: " + workerid); LookupWorker key = workers.remove(workerid); if (key == null) { System.out.println("Error removing worker from set " + workerid); System.exit(0); } } // Getters and setters /////////////////////////// public Database getDb() { return db; } public Adresse[] getDaekkedeAdresser() { return daekkedeAdresser; } public Queue getQueue() { return queue; } }