2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
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]"
24 * Portions Copyrighted 2009 Jaroslav Tulach
27 package cz.xelfi.quoridor.webidor.resources;
29 import cz.xelfi.quoridor.IllegalPositionException;
30 import cz.xelfi.quoridor.webidor.*;
31 import cz.xelfi.quoridor.Move;
32 import cz.xelfi.quoridor.visidor.Visidor;
33 import java.awt.Image;
34 import java.io.BufferedReader;
35 import java.io.BufferedWriter;
37 import java.io.FileReader;
38 import java.io.FileWriter;
39 import java.io.IOException;
40 import java.io.PrintWriter;
41 import java.util.ArrayList;
42 import java.util.Date;
43 import java.util.List;
44 import java.util.logging.Level;
45 import java.util.logging.Logger;
46 import javax.ws.rs.GET;
47 import javax.ws.rs.POST;
48 import javax.ws.rs.PUT;
49 import javax.ws.rs.Path;
50 import javax.ws.rs.PathParam;
51 import javax.ws.rs.Produces;
52 import javax.ws.rs.QueryParam;
53 import javax.ws.rs.WebApplicationException;
54 import javax.ws.rs.core.MediaType;
55 import javax.ws.rs.core.Response.Status;
59 * @author Jaroslav Tulach <jtulach@netbeans.org>
61 public final class Games {
62 private final Quoridor quoridor;
63 private final List<Game> games = new ArrayList<Game>();
64 private final File dir;
65 private static final Logger LOG = Logger.getLogger(Games.class.getName());
67 public Games(File dir, Quoridor quoridor) {
69 this.quoridor = quoridor;
70 File[] arr = dir.listFiles();
76 } catch (IOException ex) {
77 LOG.log(Level.WARNING, "Wrong game in " + f, ex);
84 @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_XML })
85 public GameId createGame(
86 @QueryParam("loginID") String id,
87 @QueryParam("white") String white,
88 @QueryParam("black") String black
89 ) throws IOException {
90 String logUser = quoridor.isLoggedIn(id);
91 if (logUser == null) {
92 throw new WebApplicationException(Status.UNAUTHORIZED);
95 throw new WebApplicationException(Status.PRECONDITION_FAILED);
98 throw new WebApplicationException(Status.PRECONDITION_FAILED);
100 if (!logUser.equals(white) && !logUser.equals(black)) {
101 throw new WebApplicationException(Status.PRECONDITION_FAILED);
104 Game g = new Game(white, black);
112 @Produces(MediaType.TEXT_PLAIN)
113 public String getBoard(@PathParam("id") String id) {
114 Game g = findGame(id);
116 throw new IllegalArgumentException("Unknown game " + id);
118 return g.getBoard().toString();
123 @Produces("image/png")
124 public Image getBoardImage(@PathParam("id") String id) {
125 Game g = findGame(id);
127 throw new IllegalArgumentException("Unknown game " + id);
129 return Visidor.draw(g.getBoard());
134 @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_XML })
135 public Game getBoardInfo(@PathParam("id") String id) {
136 Game g = findGame(id);
138 throw new IllegalArgumentException("Unknown game " + id);
145 @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_XML })
146 public GameId applyMove(
147 @QueryParam("loginID") String loginId,
148 @PathParam("id") String id,
149 @QueryParam("player") String player,
150 @QueryParam("move") String move
151 ) throws IllegalPositionException {
152 String logUser = quoridor.isLoggedIn(loginId);
153 if (logUser == null) {
154 throw new WebApplicationException(Status.UNAUTHORIZED);
156 if (!logUser.equals(player)) {
157 throw new WebApplicationException(Status.UNAUTHORIZED);
160 Game g = findGame(id);
162 throw new IllegalArgumentException("Unknown game " + id);
164 Move m = Move.valueOf(move);
165 g.apply(player, m, new Date());
168 } catch (IOException ex) {
169 LOG.log(Level.WARNING, "Cannot store game " + id, ex);
175 @Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_XML })
176 public List<GameId> listGames() {
177 List<GameId> arr = new ArrayList<GameId>(games.size());
178 for (Game g : games) {
184 public List<Game> getGames() {
188 private Game findGame(String id) {
189 for (Game g : games) {
190 if (g.getId().getId().equals(id)) {
197 private Game readGame(File f) throws IOException {
198 BufferedReader r = new BufferedReader(new FileReader(f));
203 String line = r.readLine();
208 if (line.length() == 0) {
211 if (line.startsWith("# white: ")) {
212 white = line.substring(9);
215 if (line.startsWith("# black: ")) {
216 black = line.substring(9);
219 if (line.startsWith("#")) {
222 if (white == null || black == null) {
223 throw new IOException("Missing white and black identification in " + f);
226 GameId id = new GameId(f.getName(), white, black, new Date(f.lastModified()), new Date(f.lastModified()), GameStatus.whiteMove);
229 if (line.equals("finish")) {
232 String[] moves = line.split(" ");
233 if (moves.length == 0) {
236 if (moves.length > 2) {
237 throw new IOException("Too much moves on line: " + line);
240 g.apply(white, Move.valueOf(moves[0]), null);
241 if (moves.length == 2) {
242 g.apply(black, Move.valueOf(moves[1]), null);
244 } catch (IllegalPositionException ex) {
245 throw new IOException("Wrong move: " + ex.getMessage());
249 throw new IOException("No moves in " + f);
254 private void storeGame(Game g) throws IOException {
256 File f = new File(dir, g.getId().getId());
257 PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(f)));
258 pw.println("# white: " + g.getId().getWhite());
259 pw.println("# black: " + g.getId().getBlack());
260 pw.println("# status: " + g.getId().getStatus());
262 for (Move m : g.getMoves()) {
263 pw.print(m.toString());
264 if (++cnt % 2 == 0) {