package btools.routingapp; import java.io.File; public class WpDatabaseScanner extends Thread { private String currentDir = ""; private String bestGuess = ""; private String lastError = ""; private Object currentDirSync = new Object(); private long maxtimestamp = 0; public String getCurrentDir() { synchronized (currentDirSync) { return currentDir; } } private void setCurrentDir( String dir ) { synchronized (currentDirSync) { currentDir = dir; } } public String getBestGuess() { synchronized (currentDirSync) { return bestGuess; } } public String getLastError() { synchronized (currentDirSync) { return lastError; } } private void setLastError( String msg ) { synchronized (currentDirSync) { lastError = msg; } } private static String[] vetos = new String[] { "dev", "sys", "system", "proc", "etc", "init", "d", "cache", "acct", "data" }; private void scan( File dir, int level ) { if ( level > 8 ) { return; } try { if ( dir.isDirectory() ) { if ( level == 1 ) { String name = dir.getName(); for( String veto: vetos ) { if ( veto.equals( name ) ) { return; } } } testPath( dir.getPath() ); File[] childs = dir.listFiles(); if ( childs == null ) { return; } for ( File child : childs ) { scan( child, level+1 ); } } } catch (Exception e) { setLastError( e.toString() ); } } private void testPath( String path ) throws Exception { setCurrentDir( path ); testReader( new CoordinateReaderOsmAnd( path ) ); testReader( new CoordinateReaderOsmAnd( path, true ) ); testReader( new CoordinateReaderLocus( path ) ); testReader( new CoordinateReaderOrux( path ) ); } private void testReader( CoordinateReader cor ) throws Exception { long ts = cor.getTimeStamp(); if ( ts > maxtimestamp ) { maxtimestamp = ts; synchronized (currentDirSync) { bestGuess = cor.basedir; } } else if ( ts > 0 && ts == maxtimestamp ) { synchronized (currentDirSync) { if ( cor.basedir.length() < bestGuess.length() ) { bestGuess = cor.basedir; } } } } @Override public void run() { scan( new File( "/" ), 0 ); setCurrentDir( null ); } }