--- android/TrainInfoService/src/dk/thoerup/traininfoservice/RequestPlotter.java 2010/07/05 08:46:57 954 +++ android/TrainInfoService/src/dk/thoerup/traininfoservice/RequestPlotter.java 2011/04/19 16:39:07 1312 @@ -4,28 +4,31 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.List; 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; import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dk.thoerup.traininfoservice.banedk.TimeoutMap; +@WebServlet(urlPatterns={"/RequestPlotter"}) public class RequestPlotter extends HttpServlet { private static final long serialVersionUID = 1L; @@ -44,6 +47,7 @@ } class PositionContainer { + List blue = new ArrayList(); List green = new ArrayList(); List yellow = new ArrayList(); List red = new ArrayList(); @@ -53,7 +57,115 @@ boolean isGz(String fileStr) { return fileStr.substring(fileStr.length() - 3).equals(".gz"); } + + protected File[] getFiles(int count) { + File accessLogDir = new File("/home/app/domain1/logs/access/"); + //File accessLogDir = new File("/home/torben/inst/glassfishv3/glassfish/domains/domain1/logs/access/"); + + File logFiles[] = accessLogDir.listFiles( new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + //log.info("name:" + name); + return name.startsWith("server_access_log"); + } + }); + + Arrays.sort(logFiles); + + if (logFiles == null) { + File[] empty = {}; + log.info("file array was empty"); + return empty; + } + + int from = logFiles.length - (count); + int to = logFiles.length; + + return Arrays.copyOfRange(logFiles, from, to); + } + + protected PositionContainer getRequestsFromFileWorker(int count) throws IOException{ + PositionContainer positions = new PositionContainer(); + + try { + + File files[] = getFiles(count); + + SimpleDateFormat df = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss"); + + Date now = new Date(); + for (File f : files ) { + log.info("Parsing file: " + f.getName() ); + + if ( !f.exists() ) { + continue; + } + + + InputStream input = new FileInputStream(f); + + + BufferedReader in = new BufferedReader( new InputStreamReader(input) ); + + + 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].replaceAll("\"", ""); + + pos.time = df.parse( toks[2].replace("\"", "") ); + + String argpart = toks[5].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 if ( timediff < (7*24*60*60*1000)) { + positions.green.add(pos); //GREEN + } else { + positions.blue.add(pos); //BLUE + } + + } + in.close(); + input.close(); + + } + } catch (ParseException pe) { + log.log(Level.SEVERE, "parseException", pe); + throw new IOException(pe); + } catch (IOException e) { + log.log(Level.SEVERE, "getKml()", e); + throw e; + } + + return positions; + } + + /* old apache code protected PositionContainer getRequestsFromFileWorker(boolean multiple) throws IOException{ PositionContainer positions = new PositionContainer(); @@ -124,8 +236,10 @@ positions.red.add(pos); //RED } else if ( timediff < (24*60*60*1000)) { positions.yellow.add(pos); //YELLOW - } else { + } else if ( timediff < (7*24*60*60*1000)) { positions.green.add(pos); //GREEN + } else { + positions.blue.add(pos); //BLUE } } @@ -142,17 +256,19 @@ } 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" ); + int count=0; + for(RequestPosition current : list) { + String id = color + count++; + sb.append( " \n" ); sb.append( " #").append(color).append("\n" ); - sb.append( " IP=").append(current.ip).append(" Time=").append(current.time).append("\n" ); + sb.append( " Time=").append(current.time).append("]]>\n" ); sb.append( " ").append(current.lng).append(",").append(current.lat).append(",0\n" ); sb.append( " \n" ); } @@ -167,9 +283,10 @@ 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( " Red:").append(positions.red.size()).append(" (whithin 3 hours)
\n"); + sb.append( " Yellow:").append(positions.yellow.size()).append(" (within 24 hours)
\n"); + sb.append( " Green:").append(positions.green.size()).append(" (within one week)
\n"); + sb.append( " Blue:").append(positions.blue.size()).append(" (older)
\n"); sb.append( " ]]>
"); @@ -185,6 +302,9 @@ sb.append( " http://maps.google.com/mapfiles/kml/paddle/grn-circle.png\n" ); sb.append( " \n\n" ); + sb.append( " \n\n" ); /* String overlay = " " + @@ -204,6 +324,7 @@ */ + formatPositions(sb, "blue", positions.blue); formatPositions(sb, "green", positions.green); formatPositions(sb, "yellow", positions.yellow); formatPositions(sb, "red", positions.red); @@ -215,20 +336,16 @@ return sb.toString(); } - protected String getRequestsFromFile(boolean multiple) throws IOException { + protected String getRequestsFromFile(int count) throws IOException { String kmlData = null; String key; - if (multiple == false) { - key = "kmldata"; - } else { - key = "kmldata-multi"; - } + key = "kmldata-" + count; kmlData = cache.get(key); if (kmlData == null) { - kmlData = formatXml( getRequestsFromFileWorker(multiple) ); + kmlData = formatXml( getRequestsFromFileWorker(count) ); cache.put(key, kmlData); kmlData += ""; } else { @@ -254,9 +371,13 @@ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - boolean multiple = enabled( req.getParameter("multi") ); - String kmlData = getRequestsFromFile(multiple); + int count = Integer.parseInt( req.getParameter("count") ); + + if (count > 30) //limit to 30 days + count = 30; + + String kmlData = getRequestsFromFile(count); if ( enabled(req.getParameter("zip")) ) {