Package org.ggp.base.player.request.factory

Source Code of org.ggp.base.player.request.factory.RequestFactory

package org.ggp.base.player.request.factory;

import java.util.ArrayList;
import java.util.List;

import org.ggp.base.player.gamer.Gamer;
import org.ggp.base.player.request.factory.exceptions.RequestFormatException;
import org.ggp.base.player.request.grammar.AbortRequest;
import org.ggp.base.player.request.grammar.InfoRequest;
import org.ggp.base.player.request.grammar.PlayRequest;
import org.ggp.base.player.request.grammar.PreviewRequest;
import org.ggp.base.player.request.grammar.Request;
import org.ggp.base.player.request.grammar.StartRequest;
import org.ggp.base.player.request.grammar.StopRequest;
import org.ggp.base.util.game.Game;
import org.ggp.base.util.gdl.factory.GdlFactory;
import org.ggp.base.util.gdl.factory.exceptions.GdlFormatException;
import org.ggp.base.util.gdl.grammar.GdlConstant;
import org.ggp.base.util.gdl.grammar.GdlTerm;
import org.ggp.base.util.symbol.factory.SymbolFactory;
import org.ggp.base.util.symbol.grammar.Symbol;
import org.ggp.base.util.symbol.grammar.SymbolAtom;
import org.ggp.base.util.symbol.grammar.SymbolList;

public final class RequestFactory
{
  public Request create(Gamer gamer, String source) throws RequestFormatException
  {
    try
    {
      SymbolList list = (SymbolList) SymbolFactory.create(source);
      SymbolAtom head = (SymbolAtom) list.get(0);

      String type = head.getValue().toLowerCase();
      if (type.equals("play"))
      {
        return createPlay(gamer, list);
      }
      else if (type.equals("start"))
      {
        return createStart(gamer, list);
      }
      else if (type.equals("stop"))
      {
        return createStop(gamer, list);
      }
      else if (type.equals("abort"))
      {
          return createAbort(gamer, list);
      }
      else if (type.equals("info"))
      {
        return createInfo(gamer, list);
      }
      else if (type.equals("preview"))
      {
        return createPreview(gamer, list);
      }
      else
      {
        throw new IllegalArgumentException("Unrecognized request type!");
      }
    }
    catch (Exception e)
    {
      throw new RequestFormatException(source, e);
    }
  }

  private PlayRequest createPlay(Gamer gamer, SymbolList list) throws GdlFormatException
  {
    if (list.size() != 3)
    {
      throw new IllegalArgumentException("Expected exactly 2 arguments!");
    }

    SymbolAtom arg1 = (SymbolAtom) list.get(1);
    Symbol arg2 = list.get(2);

    String matchId = arg1.getValue();
    List<GdlTerm> moves = parseMoves(arg2);

    return new PlayRequest(gamer, matchId, moves);
  }

  private StartRequest createStart(Gamer gamer, SymbolList list) throws GdlFormatException
  {
    if (list.size() < 6)
    {
      throw new IllegalArgumentException("Expected at least 5 arguments!");
    }

    SymbolAtom arg1 = (SymbolAtom) list.get(1);
    SymbolAtom arg2 = (SymbolAtom) list.get(2);
    SymbolList arg3 = (SymbolList) list.get(3);
    SymbolAtom arg4 = (SymbolAtom) list.get(4);
    SymbolAtom arg5 = (SymbolAtom) list.get(5);

    String matchId = arg1.getValue();
    GdlConstant roleName = (GdlConstant) GdlFactory.createTerm(arg2);
    String theRulesheet = arg3.toString();
    int startClock = Integer.valueOf(arg4.getValue());
    int playClock = Integer.valueOf(arg5.getValue());

    // For now, there are only five standard arguments. If there are any
    // new standard arguments added to START, they should be added here.

    Game theReceivedGame = Game.createEphemeralGame(theRulesheet);
    return new StartRequest(gamer, matchId, roleName, theReceivedGame, startClock, playClock);
  }

  private StopRequest createStop(Gamer gamer, SymbolList list) throws GdlFormatException
  {
    if (list.size() != 3)
    {
      throw new IllegalArgumentException("Expected exactly 2 arguments!");
    }

    SymbolAtom arg1 = (SymbolAtom) list.get(1);
    Symbol arg2 = list.get(2);

    String matchId = arg1.getValue();
    List<GdlTerm> moves = parseMoves(arg2);

    return new StopRequest(gamer, matchId, moves);
  }

    private AbortRequest createAbort(Gamer gamer, SymbolList list) throws GdlFormatException
    {
        if (list.size() != 2)
        {
            throw new IllegalArgumentException("Expected exactly 1 argument!");
        }

        SymbolAtom arg1 = (SymbolAtom) list.get(1);
        String matchId = arg1.getValue();

        return new AbortRequest(gamer, matchId);
    }

    private InfoRequest createInfo(Gamer gamer, SymbolList list) throws GdlFormatException
    {
        if (list.size() != 1)
        {
            throw new IllegalArgumentException("Expected no arguments!");
        }

        return new InfoRequest(gamer);
    }

    private PreviewRequest createPreview(Gamer gamer, SymbolList list) throws GdlFormatException
    {
    if (list.size() != 3)
    {
      throw new IllegalArgumentException("Expected exactly 2 arguments!");
    }

    SymbolAtom arg1 = (SymbolAtom) list.get(1);
    SymbolAtom arg2 = (SymbolAtom) list.get(2);

    String theRulesheet = arg1.toString();
    int previewClock = Integer.valueOf(arg2.getValue());

    Game theReceivedGame = Game.createEphemeralGame(theRulesheet);
    return new PreviewRequest(gamer, theReceivedGame, previewClock);
    }

  private List<GdlTerm> parseMoves(Symbol symbol) throws GdlFormatException
  {
    if (symbol instanceof SymbolAtom)
    {
      return null;
    }
    else
    {
      List<GdlTerm> moves = new ArrayList<GdlTerm>();
      SymbolList list = (SymbolList) symbol;

      for (int i = 0; i < list.size(); i++)
      {
        moves.add(GdlFactory.createTerm(list.get(i)));
      }

      return moves;
    }
  }
}
TOP

Related Classes of org.ggp.base.player.request.factory.RequestFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.