On Mon, Jul 12, 2010 at 3:18 PM, qin ding <qindi...@yahoo.com> wrote: > Thank you, Rahaul, for your quick response. > > If I do the following: > > Player p = ... // POJO from game client > getEngine().getRootContext().set("player", p); > > then in the states, I should do this to get it out, right? > Player p = (Player) getEngine().getRootContext().get("player"); > > Somehow, when I do this, I get null out of the RootContext(). Any idea? > <snip/>
You should certainly get back what you've last set it to. I assume its not null before the set, in which case its being modified elsewhere, so we'll need more details. -Rahul > I will study the link you sent to me. > > > > ----- Original Message ---- > From: Rahul Akolkar <rahul.akol...@gmail.com> > To: Commons Users List <user@commons.apache.org> > Sent: Mon, July 12, 2010 1:02:04 PM > Subject: Re: [scxml] passing data to the state > > On Mon, Jul 12, 2010 at 12:49 PM, qin ding <qindi...@yahoo.com> wrote: >> I am learning commons scxml. I am experimenting writing a poker game using >> activemq and scxml. >> >> >> So, I have my config xml defined as follows: >> >> <?xml version="1.0"?> >> <scxml xmlns="http://www.w3.org/2005/07/scxml" >> version="1.0" >> initialstate="waitingRound"> >> <datamodel> >> <data name="inputPlayer"> >> <!-- Note namespace declaration in line below --> >> <player xmlns="com.mgt.lottery.poker.domain"> >> <id/> >> <name/> >> <chips/> >> <sitin/> >> <winner/> >> <betOption/> >> <gainedChips/> >> <popocketCards/> >> <description/> >> <bestHand/> >> </player> >> </data> >> </datamodel> >> <state id="waitingRound"> >> <!-- shuffle deck and check players and empty pot --> >> <transition event="game.start" target="preflopRound"/> >> </state> >> <state id="preflopRound"> >> <!-- place small/big blinds in pot and deal each player two hole >> cards >> --> >> <transition target="firstBettingRound"/> >> </state> >> <state id="firstBettingRound"> >> <transition event="game.flop" target="flopRound"/> >> <transition event="game.showdown" target="showdownRound"/> >> </state> >> <state id="flopRound"> >> <!-- deal three cards in the community --> >> <transition target="secondBettingRound"/> >> </state> >> <state id="secondBettingRound"> >> <onentry> >> <var name="inputPlayer" expr="#{request$player}" /> >> </onentry> >> <transition event="game.turn" target="turnRound"/> >> <transition event="game.showdown" target="showdownRound"/> >> </state> >> <state id="turnRound"> >> <!-- deal a 4th card in the community --> >> <transition target="thirdBettingRound"/> >> </state> >> <state id="thirdBettingRound"> >> <!-- deal a 4th card in the community --> >> <onentry> >> <var name="inputPlayer" expr="#{request$player}" /> >> </onentry> >> <transition event="game.final" target="finalRound"/> >> <transition event="game.showdown" target="showdownRound"/> >> </state> >> <state id="finalRound"> >> <!-- deal a 5th card in the community --> >> <transition target="finalBettingRound"/> >> </state> >> <state id="finalBettingRound"> >> <!-- bet, check, call, raise, or fold --> >> <onentry> >> <var name="inputPlayer" expr="#{request$player}" /> >> </onentry> >> <transition event="game.showdown" target="showdownRound"/> >> </state> >> <state id="showdownRound"> >> <transition event="game.reset" target="waitingRound"/> >> </state> >> </scxml> >> >> My questions: >> How can I pass my pojo "Player" to the firstBettingRound, secondBettingRound >>and >> etc? This player object is coming from game client with betting information. >> > <snip/> > > Data (including POJOs) can be passed into an executor either via an > external event's payload or via procedural injection to the executor's > root context. > > So, as an example of the latter, the following will create a variable > "player" in the executor's root context and bind the POJO to it: > > Player p = ... // POJO from game client > getEngine().getRootContext().set("player", p); > > Subsequently, the variable "player" may be used in expressions in the > state machine. > > In the above state machine, the variable "inputPlayer" doesn't seem to > be accessed anywhere, so unless the player information is needed for > the state machine logic, it can perhaps stay out of the state > machine's root context altogether (given the pattern of use you > mention below). > > >> After the activemq delivers it to the server end, how can I know which >> method >> to call? I think scxml handles the the state of game, so I have to say >> >> >> Set states = getEngine().getCurrentStatus().getStates(); >> return ((org.apache.commons.scxml.model.State) states.iterator(). >> next()).getId(); >> >> if the current state is firstBettingRound, I do >> game.firstBettingRound(player); Is it correct >> > <snap/> > > If you wanted to map states to activities that way. There are a few > patterns that are commonly used, see: > > http://commons.apache.org/scxml/guide/using-commons-scxml.html > > -Rahul > > >> I seem unable to find the example to show me how to pass pojo to the state >> correcponded method. If I am completely wrong with my approach, Please > advise. >> Thank you very much. >> >> QD >> --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@commons.apache.org For additional commands, e-mail: user-h...@commons.apache.org