hekailiang / squirrel

squirrel-foundation is a State Machine library, which provided a lightweight, easy use, type safe and programmable state machine implementation for Java.
http://hekailiang.github.io/squirrel/
Other
2.18k stars 538 forks source link

Dynamically creating state machines #57

Open pbhadauria opened 8 years ago

pbhadauria commented 8 years ago

Hi There, I love this framework & have been using them to define static state machines & it works great. We now want to extend our framework to let users define conversations dynamically using state machine. So there will be UI through which users can define state transition & associated logic (predefined) with the machine events. We want those newly defined state machines to be persisted in the data store which subsequently user can use without restarting server. I have read the documentation but I am confused about the right way to accomplish this. Any suggestion would be helpful.

Thanks in advance.

Pawan

PS - I was not sure where to put this question, hence its here. Let me know if there is a better place to put this.

hekailiang commented 8 years ago

Hi,

I am glad you like the framework. I think you can refer to these two classes for dynamic creating state machine instance. One is SCXMLVisitorImpl which can export state machine definition to SCXML-like format. The other is StateMachineImporterImpl which will then import the SCXML definition and return a state machine builder. So if you can generate correct SCXML definition, it is possible to dynamic create the state machine builder. However, there will be some restriction on Condition object. It cannot by anonymous class and its constructor cannot take any parameters. If you want to achieve maximum dynamics, mvel condition and mvel action would be a good choice for you.

alexjost commented 8 years ago

I have problems exporting/importing SCXML on machines with MVEL conditions and "&&" operator. If I try to import I receive an Exception from the XMLSchemaReader: java.lang.IllegalArgumentException: Incorrect content format. at org.squirrelframework.foundation.fsm.impl.StateMachineImporterImpl.importFromInputStream(StateMachineImporterImpl.java:311) at org.squirrelframework.foundation.fsm.impl.StateMachineImporterImpl.importFromFile(StateMachineImporterImpl.java:323) at org.squirrelframework.foundation.fsm.UntypedStateMachineImporter.importDefinition(UntypedStateMachineImporter.java:21) at de.mercateo.statemachine.purchase.PurchaseOrderStatemachineTests.definitionSaveAndRestoreTest(PurchaseOrderStatemachineTests.java:82) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:239) at org.junit.rules.RunRules.evaluate(RunRules.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Caused by: org.xml.sax.SAXParseException; lineNumber: 35; columnNumber: 156; Auf "&" in der Entitätsreferenz muss umgehend der Entitätsname folgen. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327) at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1437) at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:886) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(XMLNSDocumentScannerImpl.java:440) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:256) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2787) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327) at javax.xml.parsers.SAXParser.parse(SAXParser.java:195) at org.squirrelframework.foundation.fsm.impl.StateMachineImporterImpl.importFromInputStream(StateMachineImporterImpl.java:308) ... 29 more