--- android/TrainInfoService/src/dk/thoerup/traininfoservice/RequestPlotter.java 2010/06/07 12:01:42 803 +++ android/TrainInfoService/src/dk/thoerup/traininfoservice/RequestPlotter.java 2010/07/05 08:46:57 954 @@ -2,8 +2,10 @@ import java.io.BufferedReader; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -13,6 +15,7 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.zip.GZIPInputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -31,7 +34,7 @@ static final String KML = "application/vnd.google-earth.kml"; static final String KMZ = "application/vnd.google-earth.kmz"; - Map cache = new TimeoutMap(2*60*1000); + Map cache = new TimeoutMap(30*60*1000); class RequestPosition { public String ip; @@ -39,42 +42,96 @@ public String lat; public String lng; } + + class PositionContainer { + List green = new ArrayList(); + List yellow = new ArrayList(); + List red = new ArrayList(); + } + boolean isGz(String fileStr) { + return fileStr.substring(fileStr.length() - 3).equals(".gz"); + } - protected List getRequestsFromFile() throws IOException{ - List positions = new ArrayList(); + protected PositionContainer getRequestsFromFileWorker(boolean multiple) throws IOException{ + PositionContainer positions = new PositionContainer(); try { - FileInputStream fis = new FileInputStream("/var/log/apache2/app_access.log"); - BufferedReader in = new BufferedReader( new InputStreamReader(fis) ); + String files_single[] = {"/var/log/apache2/app_access.log"}; + String files_multi[] = {"/var/log/apache2/app_access.log.3.gz", "/var/log/apache2/app_access.log.2.gz", "/var/log/apache2/app_access.log.1", "/var/log/apache2/app_access.log"}; + + String files[]; + + if (multiple == false) { + files = files_single; + } else { + files = files_multi; + } SimpleDateFormat df = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss"); - - String line; - while ( (line=in.readLine()) != null) { - if (line.indexOf("LocateStation") == -1 ){ + + Date now = new Date(); + for (String fileStr : files ) { + File f = new File(fileStr); + if ( !f.exists() ) { continue; } - - if (line.indexOf("latitude") == -1 ) { - continue; + + FileInputStream fis = new FileInputStream(fileStr); + + InputStream input; + if ( isGz(fileStr)) { + input = new GZIPInputStream(fis); + } else { + input = fis; } - RequestPosition pos = new RequestPosition(); - - String toks[] = line.split(" "); - pos.ip = toks[0]; - - pos.time = df.parse( toks[3].replace("[", "") ); - - String argpart = toks[6].split("\\?")[1]; - - String args[] = argpart.split("&"); - - pos.lat = args[0].split("=")[1]; - pos.lng = args[1].split("=")[1]; + + BufferedReader in = new BufferedReader( new InputStreamReader(input) ); - positions.add(pos); + + String line; + while ( (line=in.readLine()) != null) { + if (line.indexOf("LocateStation") == -1 ){ + continue; + } + + if (line.indexOf("latitude=") == -1 ) { + continue; + } + + if (line.indexOf("longitude=") == -1) { + continue; + } + + RequestPosition pos = new RequestPosition(); + + String toks[] = line.split(" "); + pos.ip = toks[0]; + + pos.time = df.parse( toks[3].replace("[", "") ); + + String argpart = toks[6].split("\\?")[1]; + + String args[] = argpart.split("&"); + + pos.lat = args[0].split("=")[1]; + pos.lng = args[1].split("=")[1]; + + + long timediff = now.getTime() - pos.time.getTime(); + if ( timediff < (3*60*60*1000) ) { + positions.red.add(pos); //RED + } else if ( timediff < (24*60*60*1000)) { + positions.yellow.add(pos); //YELLOW + } else { + positions.green.add(pos); //GREEN + } + + } + in.close(); + input.close(); + fis.close(); } } catch (ParseException pe) { log.log(Level.SEVERE, "parseException", pe); @@ -86,13 +143,34 @@ return positions; } + + protected void formatPositions(StringBuilder sb, String color, List list) { + sb.append( "\n"); + sb.append( " " ).append(color).append("\n"); + sb.append( " 0\n" ); + + for(RequestPosition current : list) { + sb.append( " \n" ); + sb.append( " #").append(color).append("\n" ); + sb.append( " IP=").append(current.ip).append(" Time=").append(current.time).append("\n" ); + sb.append( " ").append(current.lng).append(",").append(current.lat).append(",0\n" ); + sb.append( " \n" ); + } + + sb.append("\n"); + } - protected String formatXml(List list) { - StringBuilder sb = new StringBuilder(); + protected String formatXml(PositionContainer positions) { + StringBuilder sb = new StringBuilder(1024*1024); sb.append( "\n" ); sb.append( "\n" ); sb.append( "\n" ); + sb.append( " \n"); + sb.append( " Yellow:").append(positions.yellow.size()).append("
\n"); + sb.append( " Red:").append(positions.red.size()).append("\n"); + sb.append( " ]]>
"); sb.append( "