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