package com.lyndir.omicron.webapp.resource; import com.google.common.base.Preconditions; import com.google.common.collect.Collections2; 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.webapp.data.User; import com.lyndir.omicron.webapp.data.service.*; import edu.umd.cs.findbugs.annotations.*; import java.lang.SuppressWarnings; import java.util.Collection; import java.util.List; import javax.annotation.Nonnull; import javax.ws.rs.*; import javax.ws.rs.core.*; /** * @author lhunath, 2013-10-15 */ @Path("/game/build") public class GameBuilderResource { private final SessionManager sessionManager; private final StateManager stateManager; @Inject public GameBuilderResource(final SessionManager sessionManager, final StateManager stateManager) { this.sessionManager = sessionManager; this.stateManager = stateManager; } @GET @Path("{gameBuilderID}") @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED }) public Response get(@PathParam("gameBuilderID") final long gameBuilderID) { IGame.IBuilder gameBuilder = stateManager.getGameBuilder( gameBuilderID ); // Response. return Response.ok( new GetResponse( gameBuilder ) ).build(); } @POST @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED }) public Response post(final GameBuilderRequest input) { long gameBuilderID = stateManager.addGameBuilder( Director.CORE_DIRECTOR.gameBuilder() ); // Handle. input.handle( Preconditions.checkNotNull( stateManager.getGameBuilder( gameBuilderID ) ), sessionManager.getUser() ); // Response. return Response.created( UriBuilder.fromPath( "{gameBuilderID}" ).build( gameBuilderID ) ).build(); } @PUT @Path("{gameBuilderID}") @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED }) public Response put(@PathParam("gameBuilderID") final long gameBuilderID, final GameBuilderRequest input) { IGame.IBuilder gameBuilder = stateManager.getGameBuilder( gameBuilderID ); // Handle. input.handle( gameBuilder, sessionManager.getUser() ); // Response. return Response.ok().build(); } @SuppressFBWarnings({ "URF_UNREAD_FIELD" }) public static class GetResponse { final Size levelSize; final Collection<HumanPlayer> players; final List<PublicVictoryConditionType> victoryConditions; final IGame.GameResourceConfig resourceConfig; final IGame.GameUnitConfig unitConfig; public GetResponse(final IGame.IBuilder gameBuilder) { levelSize = gameBuilder.getLevelSize(); players = Collections2.transform( gameBuilder.getPlayers(), new NNFunctionNN<IPlayer, HumanPlayer>() { @Nonnull @Override public HumanPlayer apply(@Nonnull final IPlayer player) { return new HumanPlayer( player ); } } ); victoryConditions = gameBuilder.getVictoryConditions(); resourceConfig = gameBuilder.getResourceConfig(); unitConfig = gameBuilder.getUnitConfig(); } } @SuppressWarnings("InstanceVariableMayNotBeInitialized") public static class GameBuilderRequest { Size levelSize; Integer totalPlayers; HumanPlayer player; PublicVictoryConditionType[] victoryConditions; IGame.GameResourceConfigs resourceConfig; IGame.PublicGameUnitConfigs unitConfig; public void handle(@Nonnull final IGame.IBuilder gameBuilder, @Nonnull final User user) { if (levelSize != null) gameBuilder.setLevelSize( levelSize ); if (totalPlayers != null) gameBuilder.setTotalPlayers( totalPlayers ); if (victoryConditions != null) for (final PublicVictoryConditionType victoryCondition : victoryConditions) gameBuilder.addVictoryCondition( victoryCondition ); if (player != null) gameBuilder.setPlayer( user.getPlayerKey(), player.name, player.primaryColor, player.secondaryColor ); if (resourceConfig != null) gameBuilder.setResourceConfig( resourceConfig ); if (unitConfig != null) gameBuilder.setUnitConfig( unitConfig.get() ); } } public static class HumanPlayer { public HumanPlayer() { } public HumanPlayer(final IPlayer player) { name = player.getName(); primaryColor = player.getPrimaryColor(); secondaryColor = player.getSecondaryColor(); } String name; Color primaryColor; Color secondaryColor; } }