chess/src/main/java/com/oracle/chess/client/htmljava/UIModel.java
branchchess
changeset 51 3f1866fdb2a1
parent 50 49011b4a2689
child 52 6bb4070d2c20
     1.1 --- a/chess/src/main/java/com/oracle/chess/client/htmljava/UIModel.java	Tue Sep 24 22:28:31 2013 +0200
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,315 +0,0 @@
     1.4 -/**
     1.5 - * The MIT License (MIT)
     1.6 - *
     1.7 - * Copyright (C) 2013 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     1.8 - *
     1.9 - * Permission is hereby granted, free of charge, to any person obtaining a copy
    1.10 - * of this software and associated documentation files (the "Software"), to deal
    1.11 - * in the Software without restriction, including without limitation the rights
    1.12 - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    1.13 - * copies of the Software, and to permit persons to whom the Software is
    1.14 - * furnished to do so, subject to the following conditions:
    1.15 - *
    1.16 - * The above copyright notice and this permission notice shall be included in
    1.17 - * all copies or substantial portions of the Software.
    1.18 - *
    1.19 - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    1.20 - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    1.21 - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    1.22 - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    1.23 - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    1.24 - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    1.25 - * THE SOFTWARE.
    1.26 - */
    1.27 -package com.oracle.chess.client.htmljava;
    1.28 -
    1.29 -import java.io.IOException;
    1.30 -import java.net.URISyntaxException;
    1.31 -import java.util.HashSet;
    1.32 -import java.util.List;
    1.33 -import java.util.Set;
    1.34 -import java.util.logging.Level;
    1.35 -import java.util.logging.Logger;
    1.36 -import net.java.html.json.ComputedProperty;
    1.37 -import net.java.html.json.Function;
    1.38 -import net.java.html.json.Model;
    1.39 -import net.java.html.json.ModelOperation;
    1.40 -import net.java.html.json.OnPropertyChange;
    1.41 -import net.java.html.json.OnReceive;
    1.42 -import net.java.html.json.Property;
    1.43 -
    1.44 -/**
    1.45 - *
    1.46 - * @author Jaroslav Tulach <jtulach@netbeans.org>
    1.47 - */
    1.48 -@Model(className = "UI", properties = {
    1.49 -    @Property(name = "status", type = String.class),
    1.50 -    @Property(name = "selectedGameId", type = String.class),
    1.51 -    @Property(name = "boards", type = Board.class, array = true),
    1.52 -    @Property(name = "viewGames", type = Games.class),
    1.53 -    @Property(name = "settings", type = Settings.class),
    1.54 -    @Property(name = "connected", type = boolean.class),
    1.55 -    @Property(name = "disconnected", type = boolean.class),
    1.56 -})
    1.57 -public class UIModel {
    1.58 -    private static final Logger LOG = Logger.getLogger(UIModel.class.getName());
    1.59 -    
    1.60 -    @ComputedProperty static boolean settingsActive(String selectedGameId) {
    1.61 -        return selectedGameId == null;
    1.62 -    }
    1.63 -    
    1.64 -    @ComputedProperty static boolean viewGamesActive(String selectedGameId, boolean connected) {
    1.65 -        return selectedGameId == null && connected;
    1.66 -    }
    1.67 -    
    1.68 -    @ComputedProperty static Board selectedBoard(String selectedGameId, List<Board> boards) {
    1.69 -        Board active = null;
    1.70 -        for (Board b : boards) {
    1.71 -            b.setActive(false);
    1.72 -            if (selectedGameId != null && selectedGameId.equals(b.getGameId())) {
    1.73 -                b.setActive(true);
    1.74 -                active = b;
    1.75 -            }
    1.76 -        }
    1.77 -        return active;
    1.78 -    }
    1.79 -    
    1.80 -    @Function static void activateGame(UI m, Board data) {
    1.81 -        m.setSelectedGameId(data.getGameId());
    1.82 -    }
    1.83 -
    1.84 -    @Function static void activateSettings(UI m) {
    1.85 -        m.setSelectedGameId(null);
    1.86 -        refreshGames(m);
    1.87 -    }
    1.88 -    
    1.89 -    @Function static void createGame(UI u) {
    1.90 -        u.setStatus("Creating new game...");
    1.91 -        Request r = new Request();
    1.92 -        r.setMsg(MsgType.CreateGame);
    1.93 -        r.setColor(Color.valueOf(u.getViewGames().getSelectedColor()));
    1.94 -        u.sendMsg(r);
    1.95 -    }
    1.96 -
    1.97 -    @ModelOperation @Function static void refreshGames(UI u) {
    1.98 -        u.setStatus("Refreshing games...");
    1.99 -        Request r = new Request();
   1.100 -        r.setMsg(MsgType.QueryGames);
   1.101 -        u.sendMsg(r);
   1.102 -    }
   1.103 -    
   1.104 -    @ModelOperation static void sendMsg(UI ui, Request r) {
   1.105 -        final Settings sttngs = ui.getSettings();
   1.106 -        
   1.107 -        String url = sttngs.getUrl();
   1.108 -        r.setUsername(sttngs.getUsername());
   1.109 -        r.setPassword(sttngs.getPassword());
   1.110 -        
   1.111 -        LOG.log(Level.INFO, "Sending {0} to {1}", new Object[]{r, url});
   1.112 -        ui.queryServer(url, r);
   1.113 -    }
   1.114 -    
   1.115 -    
   1.116 -    @OnReceive(data = Request.class, url = "{url}", method = "WebSocket", onError = "wasAnError") 
   1.117 -    static void queryServer(UI ui, Response r) {
   1.118 -        LOG.log(Level.INFO, "Received {0}", r);
   1.119 -        if (r == null) {
   1.120 -            ui.setDisconnected(false);
   1.121 -            verifyLogin(ui);
   1.122 -            return;
   1.123 -        }
   1.124 -        SWITCH: switch (MsgType.forResponse(r.getMsg())) {
   1.125 -            case CheckCredentials: {
   1.126 -                switch (r.getCheck()) {
   1.127 -                    case NOT_REGISTERED:
   1.128 -                    case VALID:
   1.129 -                        ui.setConnected(true);
   1.130 -                        ui.refreshGames();
   1.131 -                        ui.setStatus("Connected.");
   1.132 -                        return;
   1.133 -                    case INVALID:
   1.134 -                        ui.setStatus("Password is invalid");
   1.135 -                        break;
   1.136 -                }
   1.137 -                disconnect(ui);
   1.138 -            }
   1.139 -                
   1.140 -            case QueryGames:
   1.141 -                ui.getViewGames().listGames(r.getGames(), ui.getSettings().getUsername());
   1.142 -                ui.setStatus("");
   1.143 -                break;
   1.144 -            case CreateGame: {
   1.145 -                ui.setStatus("Game " + r + " created");
   1.146 -                final Board b = Rules.createBoard();
   1.147 -                Rules.initBoard(
   1.148 -                    b, r.getBoard().getWhites(),
   1.149 -                    r.getBoard().getBlacks(),
   1.150 -                    r.getTurn()
   1.151 -                );
   1.152 -                b.setGameId(r.getGameId());
   1.153 -                b.setWhitePlayer(r.getWhitePlayer());
   1.154 -                b.setBlackPlayer(r.getBlackPlayer());
   1.155 -                b.setPlayer(ui.getSettings().getUsername());
   1.156 -                b.updateSummary(r.getSummary());
   1.157 -                ui.getBoards().add(b);
   1.158 -                ui.setSelectedGameId(r.getGameId());
   1.159 -                UIModel.refreshGames(ui);
   1.160 -                break;
   1.161 -            }
   1.162 -            case SendMove: {
   1.163 -                if (r.getBoard() == null) {
   1.164 -                    throw new NullPointerException("No board in " + r);
   1.165 -                }
   1.166 -                final Board b = findBoard(ui, r.getGameId());
   1.167 -                if (b == null) {
   1.168 -                    break;
   1.169 -                }
   1.170 -                b.updateSummary(r.getSummary());
   1.171 -                final String errMsg = r.getError() == null ? null : r.getError().getMessage();
   1.172 -                final List<String> whites = r.getBoard().getWhites();
   1.173 -                final List<String> blacks = r.getBoard().getBlacks();
   1.174 -                final Color turn = r.getNextTurn();
   1.175 -                BoardModel.moveResponse(b, errMsg, whites, blacks, turn, r.getAlert());
   1.176 -                break;
   1.177 -            }
   1.178 -            case JoinGame: {
   1.179 -                Board b;
   1.180 -                if ((b = findBoard(ui, r.getGameId())) != null) {
   1.181 -                    b.setWhitePlayer(r.getWhitePlayer());
   1.182 -                    b.setBlackPlayer(r.getBlackPlayer());
   1.183 -                    b.setPlayer(ui.getSettings().getUsername());
   1.184 -                    b.updateSummary(r.getSummary());
   1.185 -                    ui.setSelectedGameId(r.getGameId());
   1.186 -                    break SWITCH;
   1.187 -                }
   1.188 -                ui.setStatus("Joining " + r.getGameId() + " as " + r.getColor());
   1.189 -                b = Rules.createBoard();
   1.190 -                Rules.initBoard(
   1.191 -                    b, r.getBoard().getWhites(),
   1.192 -                    r.getBoard().getBlacks(),
   1.193 -                    r.getTurn()
   1.194 -                );
   1.195 -                b.setGameId(r.getGameId());
   1.196 -                b.setWhitePlayer(r.getWhitePlayer());
   1.197 -                b.setBlackPlayer(r.getBlackPlayer());
   1.198 -                b.setPlayer(ui.getSettings().getUsername());
   1.199 -                b.updateSummary(r.getSummary());
   1.200 -                if (r.getColor() == Color.B) {
   1.201 -                    BoardModel.rotateBoard(b);
   1.202 -                }
   1.203 -                if (r.getMoves() != null) {
   1.204 -                    for (String move : r.getMoves()) {
   1.205 -                        Move m = BoardModel.MoveImpl.valueOf(move);
   1.206 -                        b.getMoves().add(m);
   1.207 -                    }
   1.208 -                } else {
   1.209 -                    b.getMoves().clear();
   1.210 -                }
   1.211 -                ui.setSelectedGameId(b.getGameId());
   1.212 -                ui.getBoards().add(b);
   1.213 -                break;
   1.214 -            }
   1.215 -            case UpdateGame: {
   1.216 -                final Board b = findBoard(ui, r.getGameId());
   1.217 -                if (b == null) {
   1.218 -                    break;
   1.219 -                }
   1.220 -                b.updateSummary(r.getSummary());
   1.221 -                final Move move = BoardModel.MoveImpl.valueOf(r.getFrom() + r.getTo());
   1.222 -                final List<String> whites = r.getBoard().getWhites();
   1.223 -                final List<String> blacks = r.getBoard().getBlacks();
   1.224 -                final Color turn = r.getNextTurn();
   1.225 -                BoardModel.moveUpdate(b, move, whites, blacks, turn, null);
   1.226 -            }
   1.227 -        }
   1.228 -    }
   1.229 -
   1.230 -
   1.231 -    private static Board findBoard(UI ui, String gameId) {
   1.232 -        for (Board tmp : ui.getBoards()) {
   1.233 -            if (tmp.getGameId().equals(gameId)) {
   1.234 -                return tmp;
   1.235 -            }
   1.236 -        }
   1.237 -        return null;
   1.238 -    }
   1.239 -    
   1.240 -    
   1.241 -    static void wasAnError(UI ui, Exception t) {
   1.242 -        if (t == null) {
   1.243 -            ui.setConnected(false);
   1.244 -            ui.setDisconnected(true);
   1.245 -            ui.setStatus("Disconnected.");
   1.246 -        } else {
   1.247 -            ui.setStatus("Error: " + t.getLocalizedMessage());
   1.248 -        }
   1.249 -    }
   1.250 -    
   1.251 -    @Function static void joinGame(UI u, Game data) {
   1.252 -        Request r = new Request();
   1.253 -        r.setMsg(MsgType.JoinGame);
   1.254 -        r.setObserver(false);
   1.255 -        r.setGameId(data.getGameId());
   1.256 -        u.sendMsg(r);
   1.257 -    }
   1.258 -
   1.259 -    @Function static void observeGame(UI u, Game data) {
   1.260 -        Request r = new Request();
   1.261 -        r.setMsg(MsgType.JoinGame);
   1.262 -        r.setObserver(true);
   1.263 -        r.setGameId(data.getGameId());
   1.264 -        u.sendMsg(r);
   1.265 -    }
   1.266 -
   1.267 -    private static final Set<UI> ACTIVE = new HashSet<>();
   1.268 -    @OnPropertyChange("connected") static void clearGames(UI m) {
   1.269 -        if (m.isDisconnected()) {
   1.270 -            m.getBoards().clear();
   1.271 -            ACTIVE.remove(m);
   1.272 -        } else {
   1.273 -            ACTIVE.add(m);
   1.274 -        }
   1.275 -    }
   1.276 -    
   1.277 -    static UI findUI(Board b) {
   1.278 -        for (UI ui : ACTIVE) {
   1.279 -            if (ui.getBoards().contains(b)) {
   1.280 -                return ui;
   1.281 -            }
   1.282 -        }
   1.283 -        return null;
   1.284 -    }
   1.285 -    
   1.286 -    @Function static void leave(UI ui, Board data) {
   1.287 -        ui.getBoards().remove(data);
   1.288 -        ui.setSelectedGameId(null);
   1.289 -    }
   1.290 -    
   1.291 -    @Function static void disconnect(UI ui) {
   1.292 -        ui.queryServer(ui.getSettings().getUrl(), null);
   1.293 -        ui.setStatus("Disconnecting...");
   1.294 -    }
   1.295 -
   1.296 -    private static void verifyLogin(UI ui) {
   1.297 -        ui.setStatus("Verifying user credentials...");
   1.298 -        Request r = new Request();
   1.299 -        r.setMsg(MsgType.CheckCredentials);
   1.300 -        ui.sendMsg(r);
   1.301 -    }
   1.302 -    
   1.303 -    @Function static void reconnect(UI ui) {
   1.304 -        final Settings s = ui.getSettings();
   1.305 -        ui.setStatus("Connecting to the server...");
   1.306 -        ui.queryServer(s.getUrl(), null);
   1.307 -        s.write(ui);
   1.308 -    }
   1.309 -    
   1.310 -    public static void initialize(String... args) throws URISyntaxException, IOException {
   1.311 -        UI ui = new UI();
   1.312 -        ui.getSettings().read();
   1.313 -        ui.setStatus("Ready.");
   1.314 -        ui.setDisconnected(true);
   1.315 -        ui.applyBindings();
   1.316 -    }
   1.317 -
   1.318 -}