Below is the note I posted a few weeks ago about what the JSON-RPC binding
does, which is to support entryPoints which enabled web pages in a browser
to make RPC style calls into SCA components on the server. (The code has
moved from the sandbox now so those links below are wrong)
I'd like to also add support for externalServices which would enable the
server to push events asynchronously out to the browser client. It would
work something like the following:
As before the HTML page includes the SCA system script "scripts/sca.js"
which gets initialised when the page is loaded. That makes the SCA. object
available in the script environment which is used to make RPC calls to the
SCA entryPoints as before, but now it also supports registering handlers for
the methods on any SCA externalServices. For example:
SCA.myExternalService.foo(fooHandler);
The fooHandler here is a JavaScipt function, such as:
function fooHandler(s) {
alert(s);
}
So that would pop up an alert box on the browser every time the server side
externalService received a foo message.
The act of registering the handler establishes the channel back to the
server. It could be closed by the client making the call with null to remove
the handler:
SCA.myExternalService.foo(null);
There are various techniques for doing these asynchronous communications,
HTTP streaming, periodic refresh, etc, there's a lot of info about the
techniques at: http://ajaxpatterns.org/HTTP_Streaming.
Exactly how its done is completely transparent to the web client. There
would be configuration parameters on the SCA binding to configure which ever
technique is most appropriate for that application and the options that may
require such as timeout or heartbeat intervals.
This seems way cool to me, but there wasn't any comments on the original
post so maybe I'm missing something, what do others think about this?
...ant
---------- Forwarded message ----------
From: ant elder <[EMAIL PROTECTED]>
Date: Mar 8, 2006 8:59 PM
Subject: Re: How do you register SCDL for a new binding?
To: [email protected]
Thanks to Jeremy and Sebastien for helping with this, I have it going now
and I've updated the sandbox with code that works:
http://svn.apache.org/repos/asf/incubator/tuscany/sandbox/ant/jsonrpc/
It enables JavaScript running in a browser to access SCA components defined
in the web app with an entryPoint using the new binding. All you have to do
is add one extra script definition line to the HTML:
<script type="text/javascript" src="scripts/sca.js"></script>
and then user scripts can access all the entryPoints from an SCA variable
that gets automatically defined:
var result = SCA.HelloWorldService.getGreetings(name);
There's a sample helloworld app that demonstrates it:
http://svn.apache.org/repos/asf/incubator/tuscany/sandbox/ant/jsonrpc/helloworldajax/
...ant
On 3/6/06, ant elder <[EMAIL PROTECTED]> wrote:
> You're a star, thanks!
>
>
> On 3/6/06, Jean-Sebastien Delfino <[EMAIL PROTECTED]> wrote:
> >
> > ant elder wrote:
> > > I'm messing about trying to add a new binding to Tuscany but can't get
> > it to
> > > work. There must be something I'm missing to register the new binding
> > SCDL
> > > as all I get is the exception below saying "Feature ' binding.ajax'
> > not
> > > found". Could someone have a quick look if its something obvious? The
> > > code's up at
> > > http://svn.apache.org/repos/asf/incubator/tuscany/sandbox/ant/
> > ,
> > > the AJAXAssemblyLoaderTestCase shows the problem.
> > >
> > > Thanks,
> > >
> > > ...ant
> > >
> > > java.lang.RuntimeException:
> > >
> > file:/C:/SCA/SVN/WORK/sca/binding.ajax/bin/org/apache/tuscany/binding/ajax/assembly/tests/sca.module
> >
> > > at
> > org.apache.tuscany.model.scdl.loader.impl.SCDLXMLReader.getRootObject
> > > (SCDLXMLReader.java:103)
> > > at
> > org.apache.tuscany.model.scdl.loader.impl.SCDLXMLReader.getModule(
> > > SCDLXMLReader.java :61)
> > > at
> > >
> > org.apache.tuscany.model.scdl.loader.impl.SCDLAssemblyModelLoaderImpl.loadModule
> > > (SCDLAssemblyModelLoaderImpl.java:101)
> > > at
> > >
> > org.apache.tuscany.binding.ajax.assembly.tests.AJAXAssemblyLoaderTestCase.testLoader
> > > (AJAXAssemblyLoaderTestCase.java:63)
> > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> > > at sun.reflect.DelegatingMethodAccessorImpl.invoke (Unknown
> > Source)
> > > at java.lang.reflect.Method.invoke(Unknown Source)
> > > at junit.framework.TestCase.runTest(TestCase.java:154)
> > > at junit.framework.TestCase.runBare(TestCase.java:127)
> > > at junit.framework.TestResult$1.protect(TestResult.java:106)
> > > at junit.framework.TestResult.runProtected(TestResult.java:124)
> > > at junit.framework.TestResult.run(TestResult.java:109)
> > > at junit.framework.TestCase.run (TestCase.java:118)
> > > at junit.framework.TestSuite.runTest(TestSuite.java:208)
> > > at junit.framework.TestSuite.run(TestSuite.java:203)
> > > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(
> > > RemoteTestRunner.java:478)
> > > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(
> > > RemoteTestRunner.java:344)
> > > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (
> > > RemoteTestRunner.java:196)
> > > Caused by:
> > org.eclipse.emf.ecore.resource.Resource$IOWrappedException:Feature '
> > > binding.ajax' not found. ( http:///temp.xml, 23, 24)
> > > at org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl.load(
> > XMLLoadImpl.java:283)
> > > at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doLoad(
> > > XMLResourceImpl.java:646)
> > > at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.load (
> > > XMLResourceImpl.java:614)
> > > at org.apache.tuscany.sdo.helper.XMLDocumentImpl.load(
> > > XMLDocumentImpl.java:246)
> > > at org.apache.tuscany.sdo.helper.XMLDocumentImpl.load(
> > > XMLDocumentImpl.java :225)
> > > at org.apache.tuscany.sdo.helper.XMLHelperImpl.load(
> > XMLHelperImpl.java
> > > :72)
> > > at org.apache.tuscany.sdo.helper.XMLHelperImpl.load(
> > XMLHelperImpl.java
> > > :66)
> > > at
> > org.apache.tuscany.model.scdl.loader.impl.SCDLXMLReader.getRootObject
> > > (SCDLXMLReader.java:100)
> > > ... 18 more
> > >
> > >
> > Ant,
> >
> > Good news, I took a look at your AJAX binding in your sandbox and was
> > able to get your test case working... You just had a few minor problems
> > in your XSD, missing a namespace prefix declaration, and some left-over
> > references to axis2.
> >
> > I am committing the fixes for you. Here are the details:
> > - In sca-binding-ajax.xsd, removed the <include
> > location="sca-core.xsd"/> which actually included a copy of the whole
> > SCDL schema in your Ajax binding namespace. This is not necessary,
> > instead the base SCDL XSD needs to be correctly imported so that your
> > AJAXBinding can extend the correct base SCDL Binding type.
> > - Fixed the location attribute in the <import location="....
> > sca-core.xsd"> to a correct relative location pointing to sca-core.xsd
> > in the java/sca/model project from your sandbox/ant/binding.ajax.
> > - In sca.module, added an ajax namespace prefix declaration for your
> > Ajax binding namespace and changed <binding.ajax/> to <ajax:binding.ajax
> > />.
> > - Changed the left over references to axis2 to ajax in sca.module and
> > the test case itself.
> >
> > Hope this helps...
> >
> > --
> > Jean-Sebastien
> >
> >
>