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"

(EDT version .8)
(EDT version .8)
Line 21: Line 21:
  
 
*In a Rich UI application, the statement causes an asynchronous invocation and identifies a callback function.  
 
*In a Rich UI application, the statement causes an asynchronous invocation and identifies a callback function.  
*Outside of Rich UI (in the future), the statement causes a synchronous invocation and so does not identify a callback function. If a returned value is expected, the statement identifies a variable to receive the returned value.
+
*Outside of Rich UI (in the future), the statement causes a synchronous invocation and does not identify a callback function. If a returned value is expected, the statement identifies a variable to receive the returned value.
  
 
In either case, the '''call''' statement can identify an exception handler.  
 
In either case, the '''call''' statement can identify an exception handler.  

Revision as of 19:48, 13 February 2012

You can access a service from a Rich UI application or (in the future) from code generated to Java.

EDT version .8

In EDT version .8, your task is to code a call statement such as this one:

call MyInterface.myOperation() using "binding.myService" 
                               returning to myCallBackFunction
                               onException myExceptionHandler;

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 in one of two ways:
    • By a string or string-type variable that refers to a service binding in an EGL deployment descriptor.
    • By a variable that is specific to a kind of service binding and that provides service-access details directly. 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.
  • Outside of Rich UI (in the future), the statement causes a synchronous invocation and does not identify a callback function. If a returned value is expected, the statement identifies a variable to receive the returned value.

In either case, the call statement can identify an exception handler.

Accessing a dedicated service (version .8)

 

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

 

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

 

Accessing a called or service program on IBM i (version .8 only)

 

EDT version .7

In EDT version .7, your task follows this pattern:  declare a service-access variable and use it in a call statement.

Accessing a dedicated service (version .7)

// 1. declare the service-access variable
myService MyServiceType?{@dedicatedService}
 
// 2. call the service
call myService.theFunction() returning to theCallBack
                onException theExceptionHandler;
 
/*
 * Example: create a new EGL project for 
 * "Web 2.0 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 by 1)
         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.TextField;
import org.eclipse.edt.rui.widgets.GridLayoutData;
import dojo.widgets.DojoButton;
import dojo.widgets.DojoTextField;
 
handler MyHandler type RUIhandler{initialUI =[ui], 
             onConstructionFunction = start, 
             cssFile = "css/ProjectInEDT.7.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
        myService MyServiceType?{@DedicatedService};
        call myService.calculate(myList) 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