package com.lyndir.omicron.webapp.resource; import com.google.common.collect.FluentIterable; import com.google.inject.Inject; import com.lyndir.lhunath.opal.math.Size; import com.lyndir.lhunath.opal.system.util.NNFunctionNN; import com.lyndir.omicron.api.*; import com.lyndir.omicron.api.view.PlayerGameInfo; import com.lyndir.omicron.webapp.data.service.StateManager; import edu.umd.cs.findbugs.annotations.*; import javax.annotation.Nonnull; import javax.ws.rs.*; import javax.ws.rs.core.*; /** * @author lhunath, 2013-10-15 */ @Path("/game") public class GameResource { private final StateManager stateManager; @Inject public GameResource(final StateManager stateManager) { this.stateManager = stateManager; } @GET @Path("{gameID}") @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED }) public Response get(@PathParam("gameID") final long gameID) { // Response. return Response.ok( new GetResponse( stateManager.getGame( gameID ) ) ).build(); } @POST public Response post(@QueryParam( "gameBuilderID" ) final long gameBuilderID, final UriInfo uriInfo) { IGame.IBuilder gameBuilder = stateManager.getGameBuilder(gameBuilderID); // Handle. long gameID = stateManager.addGame( gameBuilder.build() ); stateManager.dropAndRedirectGameBuilder( gameBuilderID, uriInfo.getAbsolutePathBuilder().path( "{gameID}" ).build( gameID ) ); // Response. return Response.created( UriBuilder.fromPath( "{gameID}" ).build( gameID ) ).build(); } @SuppressFBWarnings({ "URF_UNREAD_FIELD" }) public static class GetResponse { final Turn turn; final Size levelSize; final Iterable<PlayerGameInfo> playersInfo; public GetResponse(final IGame game) { turn = game.getTurns(); levelSize = game.getLevelSize(); playersInfo = FluentIterable.from( game.getPlayers() ).transform( new NNFunctionNN<IPlayer, PlayerGameInfo>() { @Nonnull @Override public PlayerGameInfo apply(@Nonnull final IPlayer player) { return game.getController().getPlayerGameInfo( player ); } } ); } } }