package dk.daoas.fulddaekning; import java.io.File; import java.io.FileReader; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; 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 { static final String CONFIG_FILENAME = "fulddaekning.properties"; static int max_workers; static boolean verbose; static boolean rename_tables; static SafeProperties conf; static Logger logger = Logger.getLogger( Lookup.class.toString() ); int postnr; Database db; ArrayList daekkedeAdresser; Queue queue; Map workers = new ConcurrentHashMap(); static Statistik flestDaekkede = new Statistik(); static Statistik flestIkkeDaekkede = new Statistik(); static class Statistik { int postnr; int antalDaekkede = 0; int antalIkkeDaekkede = 0; @Override public String toString() { return "postnr=" + postnr + " antalIkkeDaekkede=" + antalIkkeDaekkede + " antalDaekkede=" + antalDaekkede; } } public Lookup(int postnr, Database db) { this.postnr = postnr; this.db = db; } public static void saveStatistics(Statistik stat) { if (stat.antalDaekkede > flestDaekkede.antalDaekkede) { flestDaekkede = stat; } if (stat.antalIkkeDaekkede > flestIkkeDaekkede.antalIkkeDaekkede) { flestIkkeDaekkede = stat; } } public void doLookup() throws BoundingBoxException { logger.info("Starting for postnr=" + postnr); Statistik stat = new Statistik(); long start1 = System.currentTimeMillis(); long start2 = 0; try { 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); logger.info("Henter _ikke_ daekkede adresser i " + postnr); queue = db.hentIkkedaekkedeAdresser(postnr); stat.postnr = postnr; stat.antalDaekkede = daekkedeAdresser.size(); stat.antalIkkeDaekkede = queue.size(); saveStatistics(stat); logger.info("Starter beregning for " + postnr); start2 = System.currentTimeMillis(); for (int i =0; i 0) { Thread.sleep(10);//wait for worker threads } } 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(); 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); workers.remove(workerid); } // Getters and setters /////////////////////////// public Database getDb() { return db; } public ArrayList getDaekkedeAdresser() { return daekkedeAdresser; } public Queue getQueue() { return queue; } ///////////////////////////// // Static functions public static void main(String[] args) throws Exception { File confFile = new File( CONFIG_FILENAME ); if (! confFile.exists() ) { logger.warning("Config file not found: " + CONFIG_FILENAME); System.exit(1); } conf = new SafeProperties(); conf.load( new FileReader(confFile) ); max_workers = Integer.parseInt( conf.getSafeProperty("MAX_WORKERS") ); logger.info("Starting with MAX_WORKERS:" + max_workers); verbose = Boolean.parseBoolean( conf.getSafeProperty("VERBOSE") ); logger.info("Starting with VERBOSE:" + verbose); rename_tables = Boolean.parseBoolean( conf.getSafeProperty("RENAMETABLES") ); logger.info("Starting with RENAMETABLES:" + rename_tables); Database db = new Database(conf); db.resetResultTable(); long start = System.currentTimeMillis(); logger.info("Finder postnumre"); List postnumre = db.hentPostnumre(); for(Integer postnr : postnumre) { Lookup lookup = new Lookup(postnr, db); lookup.doLookup(); } if (rename_tables) { db.renameResultTables(); } else { logger.info( "Rename tables is disabled !!!" ); } long now = System.currentTimeMillis(); logger.info("Flest Ikke-dækkede, " + flestIkkeDaekkede); logger.info("Flest Dækkede, " + flestDaekkede); logger.info("Fuld load done : " + (now-start) ); //Lookup lookup = new Lookup(7400, db); //lookup.doLookup(); } }