commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Saurabh Agarwal <sagarwal1...@gmail.com>
Subject Re: [SCXML] Context not visible ( Picking up values ) in the StateMachine.
Date Sun, 08 Feb 2009 18:04:42 GMT
Hi Rahul ,

Thanks for such a quick reply:

1. Yeah I had come code to print context in constructor but actually I am
testing it in reset() method of StopClock before which I had set the
constructor. But alas then also I am not able to get the context Please help
.

2. About the second thing I am not much clear , What I understand is thar
you dont want me to use StopClock ( extending AbstractStateMachine ) . I
dont understand the reason .

What I want that when a event is fired , I want to do some functionality ,
Which I can do via extending AbstractStateMachine  , Is my understanding
wrong .

Please help clarifying the above .

Thanks for your time .

Thanks & Regards
Saurabh

On Sun, Feb 8, 2009 at 11:01 PM, Rahul Akolkar <rahul.akolkar@gmail.com>wrote:

> On Sun, Feb 8, 2009 at 11:56 AM, Saurabh Agarwal <sagarwal1981@gmail.com>
> wrote:
> > Hi All ,
> >
> > I need your help in getting the Context in my Custom Action Class.
> >
> > Here is the scenario:
> > 1. I have a SIP Servlet (MainPOCAS) , In the servlet I am parsing a SCXML
> > file and making a SCXML object out of that file .
> >    Then  I make the Context ( tried SImpleContext , JexlContext )  and
> set
> > it using
> >       StopClock clock=new StopClock(scxml);
> <snip/>
>
> At a quick glance it seems you are trying to retrieve the values in
> the context in the constructor above, but these are set in the line
> below.
>
> There are several other, more important things that jump out. I'm
> afraid I don't have much time ATM (you can take a deeper dive into the
> guide on the website), but the higher order bit is that it isn't
> necessary to create a AbstractStateMachine subclass and also
> instantiate SCXMLExecutor instances -- they are mutually exclusive
> patterns. The AbstractStateMachine class is meant for simple or
> introductory usecases, follows a specific usage pattern and doesn't
> require much knowledge of the Commons SCXML API. I wouldn't use it for
> any kind of SIP integration.
>
> -Rahul
>
>
> >       clock.getEngine().setRootContext((Context) jc);
> > If I try retrieving the Context variable in the same class I can vey well
> > retrieve it .
> >
> > 2. But when I try to retrieve the contest i my StateMachine Class , I get
> > the value NULL , I am not able to understand why .
> >
> > What i think is that since I had set the root context of the scxml object
> I
> > should be able to retrieve the context .
> >
> > Please let me know if there is any gap in my understanding .
> >
> > I am attaching the source code ( copy pasted from various examples from
> > commons-scxml site )
> > MainPocAS ( SipServlet ) , StopClock.java ( StateMachine Class)
>  Hello.java
> > ( Custom Action class ).
> >
> >
> > /*
> >  * To change this template, choose Tools | Templates
> >  * and open the template in the editor.
> >  */
> >
> > package PocAS;
> > import java.io.IOException;
> > import java.util.Map;
> > import java.util.Set;
> > import java.util.logging.Level;
> > import java.util.logging.Logger;
> > import javax.servlet.Servlet;
> > import javax.servlet.ServletException;
> > import javax.servlet.sip.Proxy;
> > import javax.servlet.sip.SipErrorEvent;
> > import javax.servlet.sip.SipErrorListener;
> > import javax.servlet.sip.SipServlet;
> > import javax.servlet.sip.SipServletRequest;
> > import javax.servlet.sip.SipServletResponse;
> >
> > import java.io.IOException;
> > import java.net.URL;
> > import java.util.AbstractMap;
> > import java.util.ArrayList;
> > import java.util.HashMap;
> > import java.util.List;
> > import org.apache.commons.jexl.JexlContext;
> > import org.apache.commons.jexl.JexlHelper;
> > import org.apache.commons.scxml.Context;
> > import org.apache.commons.scxml.PathResolver;
> > import org.apache.commons.scxml.SCXMLExecutor;
> > import org.apache.commons.scxml.env.SimpleContext;
> > import org.apache.commons.scxml.env.SimpleErrorHandler;
> > import org.apache.commons.scxml.env.servlet.ServletContextResolver;
> > import org.apache.commons.scxml.io.SCXMLParser;
> > import org.apache.commons.scxml.model.CustomAction;
> > import org.apache.commons.scxml.model.Event;
> > import org.apache.commons.scxml.model.ModelException;
> > import org.apache.commons.scxml.model.SCXML;
> > import org.xml.sax.ErrorHandler;
> > import org.xml.sax.SAXException;
> > import org.xml.sax.ext.DefaultHandler2;
> > import org.xml.sax.helpers.DefaultHandler;
> >
> >
> >
> > /**
> >  *
> >  * @author sauragar
> >  */
> > @javax.servlet.sip.annotation.SipServlet
> > public class MainPocAS extends javax.servlet.sip.SipServlet implements
> > SipErrorListener,Servlet {
> >
> >
> >    private static final long serialVersionUID = 3978425801979081269L;
> >    //Reference to context - The ctx Map is used as a central storage for
> > this app
> >    javax.servlet.ServletContext ctx = null;
> >
> >    protected void doInvite(SipServletRequest request)
> >        throws ServletException, IOException {
> >
> >
> >
> >         log(" $$$    ############################ SimpleProxyServlet: Got
> > request:\n" + request+" TO::"+request.getTo());
> >         log (" New log To::"+request.getTo().toString());
> >         HashMap aMap=new HashMap() ;
> >         aMap.put("SipMessage","Saurabh" );
> >         SimpleContext sc=new SimpleContext(aMap);
> >         JexlContext jc = JexlHelper.createContext();
> >
> >
> >        jc.setVars(aMap);
> >
> >         // (1) Create a list of custom actions, add as many as are needed
> >      List customActions = new ArrayList();
> >      CustomAction ca =
> >            new CustomAction("http://my.custom-actions.domain/CUSTOM1",
> >                             "hello", Hello.class);
> >       CustomAction ca1 =
> >            new CustomAction("http://my.custom-actions.domain/CUSTOM2",
> >                             "bar", Hello.class);
> >      customActions.add(ca);
> >  customActions.add(ca1);
> >      // (2) Parse the SCXML document containing the custom action(s)
> >      SCXML scxml = null;
> >        try {
> >            // try {URL url=new URL
> > (StopClock.class.getClassLoader().getResource("PocAS/stopwatch.xml"));
> >            scxml =
> >
> SCXMLParser.parse(StopClock.class.getClassLoader().getResource("PocAS/stopwatch.xml"),
> > new SimpleErrorHandler(), customActions);
> >
> >            // Also see other methods in SCXMLParser API
> >            // "url" points to SCXML document
> >            // "errorHandler" is SAX ErrorHandler
> >        } catch (SAXException ex) {
> >            Logger.getLogger(MainPocAS.class.getName()).log(Level.SEVERE,
> > null, ex);
> >        } catch (ModelException ex) {
> >            Logger.getLogger(MainPocAS.class.getName()).log(Level.SEVERE,
> > null, ex);
> >        }
> >          // Also see other methods in SCXMLParser API
> >          // "url" points to SCXML document
> >          // "errorHandler" is SAX ErrorHandler
> >
> >         StopClock clock=new StopClock(scxml);
> >
> >         clock.getEngine().setRootContext((Context) jc);
> >
> >
> >         Context RCtx= clock.getEngine().getRootContext();
> >
> >         System.out.println(" In Main Root Context ::"+ RCtx.toString());
> >         System.out.println(" In Main Root Context Msg ::"+
> > RCtx.get("SipMessage"));
> >         System.out.println(" In Main Root Context ::"+ RCtx.getVars());
> >        // if(request.getTo().toString().equals("Alice1"))
> >            clock.fireEvent(StopClock.EVENT_RESET);
> >        // else
> >          //   clock.fireEvent(StopClock.EVENT_STOP);
> >         /*SCXML scxml = null;
> >
> >        try {
> >            try {
> >
> >                scxml = SCXMLParser.parse(new URL("
> >
> http://svn.apache.org/repos/asf/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/stopwatch.xml
> "),
> > new DefaultHandler2());
> >                log("SimpleProxyServlet: Children::"+scxml.getChildren());
> >            } catch (ModelException ex) {
> >
> > Logger.getLogger(MainPocAS.class.getName()).log(Level.SEVERE, null, ex);
> >            }
> >        } catch (IOException ioe) {
> >            log("SimpleProxyServlet: err"+ioe.getMessage());
> >          // IOException while parsing
> >        } catch (SAXException se) {
> >          // SAXException while parsing
> >            log("SimpleProxyServlet: ERR::"+se.getMessage());
> >        }
> >
> >
> >
> >        if (scxml == null) {
> >          log("SimpleProxyServlet: Parsing Failed::");
> >        }
> >
> >
> >                 SCXMLExecutor exec = null;
> >        try {
> >            exec = new SCXMLExecutor();
> >            exec.setStateMachine(scxml);
> >
> >            //exec.addListener(scxml, <SCXMLListener>);
> >            //exec.setRootContext(<Context>);
> >            log("SimpleProxyServlet: Going to start the state machine");
> >            exec.go();
> >
> >        } catch (ModelException me) {
> >            // Executor initialization failed, because the
> >            // state machine specified has inconsistencies
> >        }*/
> >
> >
> >        /*if (request.isInitial()) {
> >
> >           Proxy proxy = request.getProxy();
> >           proxy.setRecordRoute(true);
> >       proxy.setSupervised(true);
> >       proxy.proxyTo(request.getRequestURI()); // bobs uri
> >
> >        }*/
> >
> >        System.out.println("SimpleProxyServlet: Got request:\n" +
> request);
> >    }
> >
> >
> >    protected void doBye(SipServletRequest request) throws
> ServletException,
> > IOException {
> >
> >        System.out.println("SimpleProxyServlet: Got BYE request:\n" +
> > request);
> >        super.doBye(request);
> >    }
> >
> >
> >    protected void doResponse(SipServletResponse response)
> >        throws ServletException, IOException {
> >
> >        System.out.println("SimpleProxyServlet: Got response:\n" +
> > response);
> >     super.doResponse(response);
> >    }
> >
> >
> >    // SipErrorListener
> >
> >    public void noAckReceived(SipErrorEvent ee) {
> >
> >        System.out.println("SimpleProxyServlet: Error: noAckReceived.");
> >    }
> >
> >    public void noPrackReceived(SipErrorEvent ee) {
> >
> >    System.out.println("SimpleProxyServlet: Error: noPrackReceived.");
> >    }
> >
> >    @Override
> >    public void init(javax.servlet.ServletConfig config) throws
> > javax.servlet.ServletException {
> >        super.init(config);
> >        ctx = config.getServletContext();
> >    }
> > }
> >
> >
> >
> >
> >
> >
> >
> > /*
> >  * To change this template, choose Tools | Templates
> >  * and open the template in the editor.
> >  */
> >
> > package PocAS;
> > import java.net.MalformedURLException;
> > import java.net.URL;
> >  import java.util.Set;
> >  import java.util.Timer;
> >  import java.util.TimerTask;
> >  import java.util.logging.Level;
> > import java.util.logging.Logger;
> >
> >
> > import javax.servlet.sip.SipServlet;
> > import org.apache.commons.jexl.JexlContext;
> > import org.apache.commons.scxml.Context;
> >  import org.apache.commons.scxml.env.AbstractStateMachine;
> > import org.apache.commons.scxml.model.SCXML;
> >
> >  /**
> > 26   * A SCXML document driven stop watch.
> > 27   *
> > 28   * Using SCXML makes the StopWatch class simplistic; you are neither
> > 29   * managing the stopwatch "lifecycle" nor coding any "transitions",
> > 30   * that information is pulled in straight from the behavioral model
> >   * of the stop watch, which is encapsulated in the SCXML document
> >   * the constructor points to (which in turn may be generated straight
> >   * from the UML model).
> >   */
> >  public class StopClock extends AbstractStateMachine {
> >
> >     /** The events for the stop watch. */
> >      public static final String EVENT_START = "watch.start",
> >          EVENT_STOP = "watch.stop", EVENT_SPLIT = "watch.split",
> >          EVENT_UNSPLIT = "watch.unsplit", EVENT_RESET = "watch.reset";
> >
> >      /** The fragments of the elapsed time. */
> >      private int hr, min, sec, fract;
> >      /** The fragments of the display time. */
> >      private int dhr, dmin, dsec, dfract;
> >      /** The stopwatch "split" (display freeze). */
> >      private boolean split;
> >      /** The Timer to keep time. */
> >      private Timer timer;
> >     /** The display decorations. */
> >      private static final String DELIM = ":", DOT = ".", EMPTY = "", ZERO
> =
> > "0";
> >
> >      public StopClock(SCXML scxml) throws MalformedURLException {
> >        // super(StopClock.class.getClassLoader().
> >         //     getResource("PocAS/stopwatch.xml"));
> >         // super(new URL ("
> >
> http://svn.apache.org/repos/asf/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/stopwatch.xml
> > "));
> >          super(scxml);
> >         System.out.println("### $$$$$$$$ CONTEXT
> > "+this.getEngine().getRootContext().toString());
> >         System.out.println("### Context
> > Val::"+this.getEngine().getRootContext().get("SipMessage"));
> >         //javax.servlet.sip.SipServlet ss=(SipServlet)
> > this.getEngine().getRootContext().get("SipMessage");
> >
> >         //log("$$$$$$$$ CONTEXT
> > "+this.getEngine().getRootContext().toString());
> >
> >      }
> >
> >      // Each method below is the activity corresponding to a state in the
> >      // SCXML document (see class constructor for pointer to the
> document).
> >      public void reset() {
> >                 System.out.println(" In constructor of stop clock ");
> >                 System.out.println("RESET ### $$$$$$$$ CONTEXT
> > "+this.getEngine().getRootContext().toString());
> >                 System.out.println("RESET  VARS
> > ::"+this.getEngine().getRootContext().getVars());
> >                 System.out.println("RESET ### Context
> > Val::"+this.getEngine().getRootContext().get("SipMessage"));
> >
> >                 JexlContext ctx=(JexlContext)
> > this.getEngine().getRootContext();
> >
> >                 System.out.println("RESET ### JEXL Context
> > ::"+ctx.getVars());
> >
> >
> >                 //javax.servlet.sip.SipServlet ss=(SipServlet)
> > this.getEngine().getRootContext().get("SipMessage");
> >
> >
> >          hr = min = sec = fract = dhr = dmin = dsec = dfract = 0;
> >         split = false;
> >      }
> >
> >     public void running() {
> >         System.out.println (" Running");
> >         split = false;
> >          if (timer == null) {
> >              timer = new Timer(true);
> >              timer.scheduleAtFixedRate(new TimerTask() {
> >                  public void run() {
> >                      increment();
> >                  }
> >              }, 100, 100);
> >          }
> >     }
> >
> >      public void paused() {
> >          split = true;
> >      }
> >
> >     public void stopped() {
> >          timer.cancel();
> >          timer = null;
> >      }
> >
> >      public String getDisplay() {
> >          String padhr = dhr > 9 ? EMPTY : ZERO;
> >          String padmin = dmin > 9 ? EMPTY : ZERO;
> >          String padsec = dsec > 9 ? EMPTY : ZERO;
> >         return new
> StringBuffer().append(padhr).append(dhr).append(DELIM).
> >              append(padmin).append(dmin).append(DELIM).append(padsec).
> >              append(dsec).append(DOT).append(dfract).toString();
> >     }
> >
> >     // used by the demonstration (see StopWatchDisplay usecase)
> >     public String getCurrentState() {
> >         Set states = getEngine().getCurrentStatus().getStates();
> >         return ((org.apache.commons.scxml.model.State) states.iterator().
> >             next()).getId();
> >     }
> >
> >     private void increment() {
> >         if (fract < 9) {
> >             fract++;
> >         } else {
> >             fract = 0;
> >             if (sec < 59) {
> >                 sec++;
> >             } else {
> >                 sec = 0;
> >                 if (min < 59) {
> >                     min++;
> >                 } else {
> >                     min = 0;
> >                     if (hr < 99) {
> >                         hr++;
> >                     } else {
> >                         hr = 0; //wrap
> >                     }
> >                 }
> >             }
> >         }
> >         if (!split) {
> >             dhr = hr;
> >             dmin = min;
> >             dsec = sec;
> >             dfract = fract;
> >         }
> >     }
> >
> >  }
> >
> >
> >
> >
> >
> >
> >
> >
> > /*
> >  * To change this template, choose Tools | Templates
> >  * and open the template in the editor.
> >  */
> >
> > package PocAS;
> > import java.util.Collection;
> >
> > import java.util.List;
> >  import org.apache.commons.logging.Log;
> >  import org.apache.commons.scxml.ErrorReporter;
> >  import org.apache.commons.scxml.EventDispatcher;
> >  import org.apache.commons.scxml.SCInstance;
> >  import org.apache.commons.scxml.SCXMLExpressionException;
> >  import org.apache.commons.scxml.TriggerEvent;
> > import org.apache.commons.scxml.model.Action;
> > import org.apache.commons.scxml.model.ExternalContent;
> > import org.apache.commons.scxml.model.ModelException;
> >
> >  /**
> >   * Our custom &quot;hello world&quot; action.
> >   */
> >  public class Hello extends Action  {
> >
> >      /** Serial version UID. */
> >      private static final long serialVersionUID = 1L;
> >      /** This is who we say hello to. */
> >     private String name;
> >     /** We count callbacks to execute() as part of the test suite. */
> >      public static int callbacks = 0;
> >
> >      /** Public constructor is needed for the I in SCXML IO. */
> >      public Hello() {
> >          super();
> >          System.out.println("Hello: Got in Hello constructor...");
> >      }
> >
> >      /**
> >       * Get the name.
> >       *
> >       * @return Returns the name.
> >       */
> >      public String getName() {
> >          System.out.println("Hello: getName");
> >         return name;
> >     }
> >
> >     /**
> >      * Set the name.
> >      *
> >      * @param name The name to set.
> >       */
> >      public void setName(String name) {
> >         this.name = name;
> >         System.out.println("Hello:  setName");
> >     }
> >
> >      /**
> >       * @inheritDoc
> >       */
> >      public void execute(final EventDispatcher evtDispatcher,
> >              final ErrorReporter errRep, final SCInstance scInstance,
> >              final Log appLog, final Collection derivedEvents)
> >     throws ModelException, SCXMLExpressionException {
> >
> >          System.out.println("Hello: execute");
> >          if (appLog.isInfoEnabled()) {
> >              appLog.info("Hello " + name);
> >          }
> >          // For derived events payload testing
> >          TriggerEvent event =
> >              new TriggerEvent("helloevent", TriggerEvent.TIME_EVENT,
> name);
> >          derivedEvents.add(event);
> >          callbacks++;
> >      }
> >
> >
> >  }
> >
> >
> >
> >
> > Please try to help me .
> >
> > Thanks & Regards
> > Saurabh
> >
> >
> >
> >
> > --
> >
> > "Successful people make more mistakes because they do more "
> > Thanks
> > Saurabh Agarwal
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
> For additional commands, e-mail: user-help@commons.apache.org
>
>


-- 

"Successful people make more mistakes because they do more "
Thanks
Saurabh Agarwal

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message