>>> [EMAIL PROTECTED] 01/10/06 05:35AM >>>
Hello, I am starting to study the use of Commons scxml and I would like
to know how I can install and use it.

Thanks

This a very, very small of amount of sample code that uses SCXML
The application needs to update objects/classes in a certain  seqeunce
I "attach" a listener for a particular state. With the State engine the
objects/classes
are updated in the desired seqeunce

CODE (look for the other text CODE)


This is wrapper class for SCXML
Constructor for this class
        public SCXMLEngines(Configuration lconfig,String pathtoConfig)
{

Configuration comes from jconfig
pathtoConfig points is a category in a jconfig application config file
  <category name="SCXML">
     <category name="GIS">
        <filename>${Project_Directory}\SCXML-Gis.xml</filename>
       
<Events>evGISUpdate1,evGISUpdate2,evGISUpdate3,evGISUpdate4,evGISUpdate5,evGISUpdate6,evGISUpdate7,evGISUpdate8,evGISUpdate9,evGISUpdate10,evGISUpdate11,evGISUpdate12</Events>
     </category>
  </category>

the file SCXML-Gis is below this class


package codetable;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Locale;
import java.util.Map;

import org.apache.commons.scxml.Context;
import org.apache.commons.scxml.Evaluator;
import org.apache.commons.scxml.EventDispatcher;
import org.apache.commons.scxml.SCXMLDigester;
import org.apache.commons.scxml.SCXMLExecutor;
import org.apache.commons.scxml.SCXMLListener;
import org.apache.commons.scxml.TriggerEvent;
import org.apache.commons.scxml.env.SimpleDispatcher;
import org.apache.commons.scxml.env.Tracer;
import org.apache.commons.scxml.env.jsp.ELEvaluator;
import org.apache.commons.scxml.model.ModelException;
import org.apache.commons.scxml.model.SCXML;
import org.apache.commons.scxml.model.State;
import org.apache.log4j.Logger;
import org.jconfig.Configuration;


public class SCXMLEngines {

        private final transient Configuration lconfig;
        static final Logger logger =
Logger.getLogger(SCXMLEngines.class);

        private transient String uri=null;
        private transient SCXML doc=null;
        private transient SCXMLExecutor exec=null;
        private transient String triggers[]=null;       
        
        private static Locale bLocale = new Locale("en", "US");

        private transient String pathtoConfig = null;
        private transient Evaluator engine=null;
        private transient Context rootCtx=null;
        private transient EventDispatcher dispatcher=null;
        private transient Tracer trc=null;
        
/* States used for updating J Drew map numbers update panels
        public static String AllState ="AllStates";
        public static String stGISUpdate ="stGISUpdate";
        public static String stUpdateMatrix ="stUpdateMatrix";
        public static String stUpdateImportPanel
="stUpdateImportPanel";
        D public static String stUpdateEditAbTable
="stUpdateEditAbTable";
        public static String stUpdateEditJTable ="stUpdateEditJTable";
        D public static String stUpdateEditPanel ="stUpdateEditPanel";
        public static String stUpdateLocationMapHandler
="stUpdateLocationMapHandler";
        public static String stUpdateLocationMapLayer
="stUpdateLocationMapLayer";
        public static String stUpdateShapeMapHandler
="stUpdateShapeMapHandler";
        public static String stUpdateShapeMapLayer
="stUpdateShapeMapLayer";
        D public static String stUpdateMapPanel ="stUpdateMapPanel";  
        public static String stGISFinished ="stGISFinished";
        public static String stFinal ="stFinal";
*/
        
        public SCXMLEngines(Configuration lconfig,String pathtoConfig)
{
                super();

                this.lconfig = lconfig;
                this.pathtoConfig = pathtoConfig;
                
                try {
                        uri =
this.getCanonicalURI(this.lconfig.getProperty("filename","None",this.pathtoConfig));
                        
                        triggers = this.lconfig.getArray("Events",
                                                                                
                        new
String[]{"No","No","No","No","No","No","No","No","No","No","No","No"},
                                                                                
                        this.pathtoConfig);
                        
                        engine = new ELEvaluator();
                        rootCtx = engine.newContext(null);
                        dispatcher = new SimpleDispatcher();
                        trc = new Tracer();
                        doc = SCXMLDigester.digest(new URL(uri), 
                                                                                
        trc,

                                                                                
        rootCtx,
                                                                                
        engine);
                        if (doc == null) {
                                logger.info("The SCXML document " + uri
                                                                        +
" can not be parsed!");
                                System.exit(-1);
                        }
                        logger.info(SCXMLDigester.serializeSCXML(doc));
                        exec = new SCXMLExecutor(engine, dispatcher,
trc);
                        doc.addListener(trc);
                        exec.setSuperStep(true);
                        exec.setStateMachine(doc);
                } catch (IOException e) {
                        final  EtoLogger etologger = (EtoLogger)
CodeTable.appContainer.getInstanceOfType( EtoLogger.class );
                        etologger.captureTrace(logger, e);
                } catch (ModelException e) {
                        final  EtoLogger etologger = (EtoLogger)
CodeTable.appContainer.getInstanceOfType( EtoLogger.class );
                        etologger.captureTrace(logger, e);
                }
logger.info(uri.toString()+"   "+triggers);
        }

        public SCXML getDoc() {
                return doc;
        }

        public Map getStates(){
                return doc.getStates();
        }
        
        public void addListener(final SCXMLListener listener, final
String statename) {
                final Map states = this.getStates();
                final State state = (State)states.get(statename);
                state.addListener(listener);
        }
        public void removeListener(final SCXMLListener listener, final
String statename) {
                final Map states = this.getStates();
                final State state = (State)states.get(statename);
                state.removeListener(listener);
        }

        public SCXMLExecutor getExec() {
                return exec;
        }

        public void execGISStates(){
                try {
                        for(int i=0; i<triggers.length; ++i){
                        TriggerEvent[] evts = {new
TriggerEvent(triggers[i], TriggerEvent.SIGNAL_EVENT, null)};
                                exec.triggerEvents(evts);
                        }
                } catch (ModelException e) {
                        final  EtoLogger etologger = (EtoLogger)
CodeTable.appContainer.getInstanceOfType( EtoLogger.class );
                        etologger.captureTrace(logger, e);
                }
        }

    /***
     * @param uri an absolute or relative URL
     * @return java.lang.String canonical URL (absolute)
     * @throws java.io.IOException if a relative URL can not be
resolved
     *         to a local file
     */
    private String getCanonicalURI(final String uri)
    throws IOException {
        if (uri.toLowerCase(bLocale).startsWith("http://";)
            || uri.toLowerCase(bLocale).startsWith("file://")) {
                return uri;
        }
        final File inFile = new File(uri);
        return "file:///" + inFile.getCanonicalPath();
    }
        
        
}


CODE
State Transition File SCXML-Gis


<?xml version="1.0"?>

<scxml        xmlns="http://www.w3.org/2005/01/SCXML";
              version="1.0"
              initialstate="AllStates">

  <state      id="AllStates">  
    <transition  event="evGISUpdate1">  
       <target   next="stGISUpdate"/> 
    </transition>
  </state> 

  <state      id="stGISUpdate">  
    <transition  event="evGISUpdate2">  
       <target   next="stUpdateMatrix"/>
    </transition>
  </state> 

  <state      id="stUpdateMatrix">     
    <transition  event="evGISUpdate3">  
       <target   next="stUpdateImportPanel"/>
    </transition>
  </state>

  <state      id="stUpdateImportPanel">     
    <transition  event="evGISUpdate4">  
       <target   next="stUpdateEditAbTable"/>
    </transition>
  </state>

  <state      id="stUpdateEditAbTable">     
    <transition  event="evGISUpdate5">  
       <target   next="stUpdateEditJTable"/>
    </transition>
  </state>

  <state      id="stUpdateEditJTable">     
    <transition  event="evGISUpdate6">  
       <target   next="stUpdateEditPanel"/>
    </transition>
  </state>

  <state      id="stUpdateEditPanel">     
    <transition  event="evGISUpdate7">  
       <target   next="stUpdateLocationMapHandler"/>
    </transition>
  </state>

  <state      id="stUpdateLocationMapHandler">     
    <transition  event="evGISUpdate8">  
       <target   next="stUpdateLocationMapLayer"/>
    </transition>
  </state>

  <state      id="stUpdateLocationMapLayer">     
    <transition  event="evGISUpdate9">  
       <target   next="stUpdateShapeMapHandler"/>
    </transition>
  </state>

  <state      id="stUpdateShapeMapHandler">     
    <transition  event="evGISUpdate10">
       <target   next="stUpdateShapeMapLayer"/>
    </transition>
  </state>

  <state      id="stUpdateShapeMapLayer">     
    <transition  event="evGISUpdate11">
       <target   next="stUpdateMapPanel"/>
    </transition>
  </state>

  <state      id="stUpdateMapPanel">     
    <transition  event="evGISUpdate12">
       <target   next="stGISFinished"/>
    </transition>
  </state>

  <state      id="stGISFinished">     
    <transition  event="evGISUpdate13">
       <target   next="stFinal"/> 
    </transition>
  </state> 

  <state      id="stFinal"      final="true"/> 

</scxml>

CODE
this is how I create/store references to this class using YAN(IOC
Container)
                        GISDisplayContainer.registerValue("lconfig",
lconfig);
                        ITextMapper places = new PlacetoRowMap(lDAO);
                        ITextMapper interests = new
InteresttoColumnMap();
                        GISDisplayContainer.registerValue("places",
places);
                        GISDisplayContainer.registerValue("interests",
interests);

                        
GISDisplayContainer.registerComponent(Components.ctor(SCXMLEngines.class)
                                                                                
                        .withArgument(1,Components.value("SCXML/GIS")));
                        
GISDisplayContainer.registerComponent(Components.ctor(GIS_Data_Mediator.class)
                                                                                
                        .withArgument(3,
Components.useKey("places"))
                                                                                
                        .withArgument(4,
Components.useKey("interests"))
                                                                                
                        .singleton().label("GIS
Data Mediator")
                                                                                
                        );

CODE
Constructor within GIS_Data_Mediator
        public GIS_Data_Mediator(Configuration lconfig,
                                                                DAO
pvDAO,
                                                                SCXMLEngines
stateEngine,
                                                                ITextMapper
placeMap,
                                                                ITextMapper
interestMap) {
                super();
                this.lconfig = lconfig;
                this.pDAO = pvDAO;
                this.stateEngine = stateEngine; 
                this.placeMap = placeMap;
                this.interestMap = interestMap;
        }


CODE
Code within GIS_Data_Mediator that attaches listeners to the state
Engine
                stateEngine.addListener(gPanel, "stUpdateEditPanel");
                stateEngine.addListener(gTable, "stUpdateEditAbTable");

CODE
Code used by GIS_Data_Grid_JPanel.
public class GIS_Data_Grid_JPanel extends JPanel implements
SCXMLListener{


        public void onEntry(TransitionTarget arg0) {
logger.info("Started by SCML in grid jpanel");          
        }
        public void onExit(TransitionTarget arg0) {
        }
        public void onTransition(TransitionTarget arg0, TransitionTarget
arg1, Transition arg2) {
        }


CODE
Part of build.xml with references to the files required by SCXML
       <pathelement
location="D:/Commons-Scxml/apache-tomcat-5.5.12-embed/lib/servlets-default.jar"/>
        <pathelement
location="D:/Commons-Scxml/apache-tomcat-5.5.12-embed/lib/jsp-api.jar"/>
        <pathelement
location="D:/Commons-Scxml/apache-tomcat-5.5.12-embed/lib/servlet-api.jar"/>
        <pathelement
location="D:/Commons-Scxml/commons-scxml-1.0-SNAPSHOT.jar"/>
        <pathelement
location="D:/commons-digester-1.7/commons-digester-1.7.jar"/>
        <pathelement
location="D:/commons-beanutils-1.7.0/commons-beanutils-core.jar"/>
        <pathelement
location="D:/commons-beanutils-1.7.0/commons-beanutils.jar"/>
        <pathelement
location="D:/commons-beanutils-1.7.0/commons-beanutils-bean-collections.jar"/>
        <pathelement location="D:/commons-el-1.0/commons-el.jar"/>


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to