Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EDT:Accessing a service"

Line 1: Line 1:
 
This page contains code snippets for service access.  
 
This page contains code snippets for service access.  
  
You can access a service from a Rich UI application.&nbsp; <!--
+
You can access services from a Rich UI application.&nbsp; If the logic for a given service is written in EGL, you might access that logic in the form of a dedicated service, in some cases, and might access the logic in the form of an EGL REST-RPC service at another. Here is one way to accomplish the task: <br>  
'''''The details have changed in the days after version 0.81 Milestone 2.&nbsp;''''' The current details are outlined here:<br>  
+
  
::[[EDT:Resource Binding Services|Resource Binding for Services]]
+
#In your code, declare a binding variable and embed it in a call statement.  
 
+
#In the EGL deployment descriptor, define an entry.&nbsp; To switch between accessing the logic in one form and accessing the logic in another, you can vary the entry in the same deployment descriptor or, more likely, can use a different deployment descriptor with a same-named entry.
= EDT version 0.80  =
+
 
+
In EDT version 0.80, your task is to code a '''call''' statement such as this one:
+
 
+
<source lang="java">
+
myBindingVar IHTTP? = Resources.getResource("binding:myResource");
+
call MyInterface.myOperation() using myBindingVar
+
returning to myCallBackFunction
+
onException myExceptionHandler;
+
</source>
+
 
+
Your '''call''' statement typically has the following aspects:
+
 
+
*Invokes a specific operation by referring either to a function in a Service type or to a function prototype in an Interface type.
+
*Identifies service-access details by referring to a ''binding variable'', which is specific to a kind of service binding.&nbsp; That variable includes service-access details. You might have retrieved the details from the EGL deployment descriptor and then customized them; or you might have created the details from scratch, in your code.
+
 
+
Otherwise, the '''call''' statement operates as follows:
+
 
+
*In a Rich UI application, the statement causes an asynchronous invocation and identifies a callback function and an exception handler.
+
*Outside of Rich UI (in the future), the statement causes a synchronous invocation and does not identify a callback function or exception handler. If a returned value is expected, the statement identifies a variable to receive the returned value.<br>The synchronous '''call''' statement is now supported for accessing an IBM i called or service program, as described here: <br>&nbsp;&nbsp;&nbsp;&nbsp; [[EDT:Support for IBM i|Support for IBM i]].<br>
+
 
+
<br>
+
 
+
== Accessing a dedicated service (version 0.80)  ==
+
 
+
You can reference a Service type... <source lang="java">
+
myBindingVar HttpProxy;
+
 
+
call MyService.functionName(InField.text)
+
using myBindingVar
+
returning to handleResponse
+
onException serviceExceptionHandler;
+
</source>
+
 
+
...in one step: <source lang="java">
+
call MyService.functionName(InField.text)
+
using new HttpProxy
+
returning to handleResponse
+
onException serviceExceptionHandler;
+
</source>
+
 
+
You can reference an Interface type...<source lang="java">
+
myBindingVar HttpProxy = new HttpProxy("server.MyService");
+
 
+
call IMyService.functionName(InField.text)
+
using myBindingVar
+
returning to handleResponse
+
onException serviceExceptionHandler;
+
</source>
+
 
+
...in one step:<source lang="java">
+
call IMyService.functionName(InField.text)
+
using new HttpProxy("server.MyService")
+
returning to handleResponse
+
onException serviceExceptionHandler;
+
</source>
+
 
+
== Accessing an EGL REST-RPC service (version 0.80)  ==
+
 
+
<source lang="java">
+
myBindingVar httpRest{@Resource {uri="binding:myEntry"}};
+
call IMyServiceType.calculate(myList)
+
using myBindingVar
+
returning to theCallBack
+
onException theExceptionHandler;
+
</source>
+
 
+
== Accessing a third-party REST service (version 0.80)  ==
+
 
+
<source lang="java">
+
 
+
</source>
+
 
+
== Accessing a called or service program on IBM i (version 0.80 or beyond)  ==
+
 
+
See [[EDT:Support for IBM i|Support for IBM i]].
+
 
+
= EDT version 0.8.1  =
+
-->You might set up the application to access a dedicated service at one time or an EGL REST-RPC service at another. The task is as follows:<br>
+
 
+
#In your code, declare a binding variable and use it in a call statement.  
+
#Define an entry in the EGL deployment descriptor.&nbsp; To change from accessing one kind of service to another, you can vary the entry in the same deployment descriptor or, more likely, can use a same-named entry in a different deployment descriptor.
+
  
 
== Accessing a dedicated service  ==
 
== Accessing a dedicated service  ==

Revision as of 13:55, 28 August 2012

This page contains code snippets for service access.

You can access services from a Rich UI application.  If the logic for a given service is written in EGL, you might access that logic in the form of a dedicated service, in some cases, and might access the logic in the form of an EGL REST-RPC service at another. Here is one way to accomplish the task:

  1. In your code, declare a binding variable and embed it in a call statement.
  2. In the EGL deployment descriptor, define an entry.  To switch between accessing the logic in one form and accessing the logic in another, you can vary the entry in the same deployment descriptor or, more likely, can use a different deployment descriptor with a same-named entry.

Accessing a dedicated service

/********************************************************
 * Declare the binding variable                         * 
 ********************************************************/
   myBinding IHttp? = Resources.getResource("binding:myBinding");
 
/********************************************************
 * Call the service                                     * 
 ********************************************************/
   call MyServiceType.calculate(myList) 
      using myBinding
      returning to theCallBack 
      onException theExceptionHandler;
 
/********************************************************
 * Example: create a new EGL project for                *
 * "Web 2.0 client application with services". Add the  *
 * the Service type shown next to the server package,   * 
 * and add the Handler type to the client package.      *
 *                                                      *
 * Test the example in the Rich UI Preview tab          * 
 * by typing valid input into the first text box;       * 
 * for example: 5, 12, 4                                * 
 ********************************************************/
 
/********************************************************
 * The file with a Service type                         *
 ********************************************************/
package server;
 
service MyServiceType
 
   // variables and constants can be here
   function calculate(myScores Int[] in) returns(Decimal(4, 2))
      numberOfScores, i, mySum Int;
      numberOfScores = myScores.getSize();
 
      for(i from 1 to numberOfScores)
         mySum = myScores[i] + mySum;
      end
 
      return(mySum/numberOfScores);
   end 
end
 
/********************************************************
 * The file with a Handler type                         *
 ********************************************************/
package client;
 
import server.MyServiceType;
import org.eclipse.edt.rui.widgets.GridLayout;
import org.eclipse.edt.rui.widgets.GridLayoutData;
import org.eclipse.edt.rui.widgets.TextField;
import dojo.widgets.DojoButton;
import dojo.widgets.DojoTextField;
 
handler MyHandler type RUIhandler{initialUI =[ui], onConstructionFunction = start, 
                                  cssFile = "css/MyClientAppWithService.css", title = "MyHandler"}
 
   ui GridLayout{columns = 3, rows = 4, cellPadding = 4, children =[myResult, myButton, scores]};
 
   scores TextField{layoutData = new GridLayoutData{row = 2, column = 2}};
 
   myButton DojoButton{layoutData = 
      new GridLayoutData{row = 4, column = 2}, text = "Calculate", onClick ::= ui_onClick};
 
   myResult DojoTextField{layoutData = new GridLayoutData{row = 4, column = 3}};
 
   function start()
 
   end
 
   function theExceptionHandler(exp AnyException in)
 
      SysLib.writeStdOut(exp.messageID + " " + exp.message);
 
      if(exp isa ServiceInvocationException)
         SysLib.writeStdOut((exp as ServiceInvocationException).detail1);
         SysLib.writeStdOut((exp as ServiceInvocationException).detail2);
         SysLib.writeStdOut((exp as ServiceInvocationException).detail3);
      end
   end
 
   function theCallBack(retResult decimal(4, 2) in)
      myResult.text = retResult;
   end
 
   function ui_onClick(event Event in)
 
      inputLength int = scores.text.length();
 
      myDelimiters string = ", ";
      myPosition int = 1;
      myToken string;
      myList int[];
 
      while(myPosition < inputLength)
         myToken = StringLib.getNextToken(scores.text, myPosition, myDelimiters);
 
            if(myToken != null)
               myList.appendElement(myToken as int);
            end
      end
 
      /************ Service access statements ***************************/
 
      myBinding IHttp? = Resources.getResource("binding:myBinding");
      call MyServiceType.calculate(myList) 
         using myBinding
         returning to theCallBack 
         onException theExceptionHandler;
 
      /*******************************************************************/
 
   end
end

Accessing an EGL REST-RPC service (version .7)

Access of an EGL REST-RPC function is similar to accessing a dedicated service, but typically involves coding the variable declaration to reference an entry in the EGL deployment descriptor.

For example, you might change the previous handler to reference a deployment descriptor entry named myService. You can change the related variable declaration in one of two ways:

myService MyServiceType?{@Resource};
 
// or 
 
myService MyServiceType?{@Resource{bindingKey="myService"}};

You can demonstrate the access of a Service type under development only after you update two aspects of your deployment descriptor: Service Deployment and Resource Bindings. For details and a look at the version .8 code syntax, see Service bindings.

To retrieve the details from the HTTP response, add a parameter of type IHTTP to the callback function:
function theCallBack(retResult decimal(4, 2) in, myHttp IHTTP in)
 myResult.text = retResult;
 
 // display the response in JSON format
 SysLib.writeStdOut(myHttp.getResponse().body);
end

Accessing a third-party REST service (version .7)

 




Code snippets main page

Back to the top