statistics/src/main/java/cz/xelfi/quoridor/statistics/resources/Statistics.java
author Martin Rexa <martin.rexa@centrum.cz>
Wed, 13 Jan 2010 16:55:20 +0100
changeset 215 6744870122e0
parent 200 11c1287c7802
child 223 7416b11ad09f
permissions -rw-r--r--
processing games after midnight
     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * The contents of this file are subject to the terms of either the GNU
     5  * General Public License Version 2 only ("GPL") or the Common
     6  * Development and Distribution License("CDDL") (collectively, the
     7  * "License"). You may not use this file except in compliance with the
     8  * License. You can obtain a copy of the License at
     9  * http://www.netbeans.org/cddl-gplv2.html
    10  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
    11  * specific language governing permissions and limitations under the
    12  * License.  When distributing the software, include this License Header
    13  * Notice in each file and include the License file at
    14  * nbbuild/licenses/CDDL-GPL-2-CP.  Sun designates this
    15  * particular file as subject to the "Classpath" exception as provided
    16  * by Sun in the GPL Version 2 section of the License file that
    17  * accompanied this code. If applicable, add the following below the
    18  * License Header, with the fields enclosed by brackets [] replaced by
    19  * your own identifying information:
    20  * "Portions Copyrighted [year] [name of copyright owner]"
    21  *
    22  * Contributor(s):
    23  *
    24  * Portions Copyrighted 2010 Martin Rexa
    25  */
    26 
    27 package cz.xelfi.quoridor.statistics.resources;
    28 
    29 import com.sun.jersey.api.container.httpserver.HttpServerFactory;
    30 import com.sun.jersey.api.core.PackagesResourceConfig;
    31 import com.sun.jersey.api.core.ResourceConfig;
    32 import com.sun.jersey.spi.resource.Singleton;
    33 import com.sun.net.httpserver.HttpServer;
    34 import java.io.File;
    35 import java.io.IOException;
    36 import java.util.Comparator;
    37 import java.util.List;
    38 import java.util.Collections;
    39 import java.net.ServerSocket;
    40 import javax.ws.rs.Path;
    41 import cz.xelfi.quoridor.webidor.resources.Games;
    42 import cz.xelfi.quoridor.webidor.Game;
    43 
    44 /**
    45  *
    46  * @author Martin Rexa
    47  */
    48 @Path("/")
    49 @Singleton
    50 public class Statistics {
    51     static final Comparator<Game> OLDEST_FIRST = new OldestFirst();
    52     static Elo elo;
    53     static Openings openings;
    54 
    55     @Path("elo")
    56     public Elo getElo() {
    57         return elo;
    58     }
    59 
    60     @Path("openings")
    61     public Openings getOpenings() {
    62         return openings;
    63     }
    64 
    65     public static void main( String[] args ) throws IOException, InterruptedException
    66     {
    67         int port = 9444;
    68         // timeout between reprocessing games in miliseconds
    69         long timeout = 1000 * 60 * 60 * 24;
    70 //        long timeout = 1000 * 10;
    71 
    72         try {
    73             port = Integer.parseInt(args[0]);
    74         } catch (Exception ex) {
    75             // OK
    76         }
    77 
    78         if (System.getProperty("quoridor.dir") == null) {
    79             File home = new File(System.getProperty("user.home"));
    80             File quoridor = new File(home, ".quoridor");
    81             System.setProperty("quoridor.dir", quoridor.getPath());
    82         }
    83 
    84         long lastExec = System.currentTimeMillis();
    85         processGames();
    86         HttpServer s = start(port);
    87         System.out.println("Statistics started at port " + port);
    88         Object monitor = new Object();
    89         // Wait until begining of next period. If timeout is one day, then next
    90         // processing will be done after midnight
    91         synchronized (monitor) {
    92             monitor.wait(timeout - (lastExec % timeout));
    93         }
    94         for(;;){
    95             synchronized (monitor) {
    96                 monitor.wait(timeout);
    97             }
    98             processGames();
    99         }
   100     }
   101 
   102     public static HttpServer start(int port) throws IOException {
   103         if (port == -1) {
   104             ServerSocket ss = new ServerSocket(0);
   105             port =ss.getLocalPort();
   106             ss.close();
   107         }
   108         final String baseUri = "http://localhost:" + port + "/";
   109 
   110         if (System.getProperty("quoridor.dir") == null) {
   111             File home = new File(System.getProperty("user.home"));
   112             File quoridor = new File(home, ".quoridor");
   113             System.setProperty("quoridor.dir", quoridor.getPath());
   114         }
   115 
   116         ResourceConfig rc = new PackagesResourceConfig("cz.xelfi.quoridor.statistics");
   117         HttpServer server = HttpServerFactory.create(baseUri, rc);
   118         server.start();
   119         return server;
   120     }
   121 
   122     public static void processGames(){
   123         Elo eloTmp = new Elo();
   124         Openings openingsTmp = new Openings();
   125 
   126         final String prop = System.getProperty("quoridor.dir"); // NOI18N
   127         if (prop == null) {
   128             throw new IllegalStateException("quoridor.dir property must be specified"); // NOI18N
   129         }
   130         File path = new File(prop);
   131         path.mkdirs();
   132         File fGames = new File(path, "games");
   133         //fGames.mkdirs();
   134         Games games = new Games(fGames, null);
   135         List<Game> lGames = games.getGames();
   136         Collections.sort(lGames, OLDEST_FIRST);
   137 
   138         // process games
   139         for(Game g: lGames){
   140             if(g.getId().isFinished()){
   141                 eloTmp.processGame(g.getId());
   142                 openingsTmp.processGame(g);
   143             }
   144         }
   145 
   146         elo = eloTmp;
   147         openings = openingsTmp;
   148     }
   149 
   150     private static final class OldestFirst implements Comparator<Game> {
   151         public int compare(Game g1, Game g2) {
   152             if(g1.getId() == g2.getId())
   153                 return 0;
   154             long diff = g2.getId().getModified() - g1.getId().getModified();
   155             if (diff != 0) {
   156                 return diff < 0 ? 1 : -1;
   157             }
   158             return g1.getId().getId().compareTo(g2.getId().getId());
   159         }
   160     }
   161 
   162 }