Implementing Rexx Handlers in NetRexx/Java/Rexx

Similar documents
How To Run A Test File Extension On A Rexx (Unix) On A Microsoft Linux (Amd64) (Orchestra) (For Windows) (

The 2014 Edition of BSF4ooRexx (for Windows, Linux, MacOSX)

New Features in BSF4ooRexx (Camouflaging Java as oorexx)

D-Bus Language Bindings for oorexx

dbusoorexx Bringing the Power of D-Bus to Your Fingertips

An Introduction to Procedural and Object-oriented Programming (Object Rexx) 3 "Automating Windows and Windows Applications"

An Introduction to Procedural and Object-oriented Programming (Object Rexx) 8 "Automating Windows and Windows Applications"

Overview of Web Services API

Introduction to Object-Oriented Programming

Capabilities of a Java Test Execution Framework by Erick Griffin

INTRODUCTION TO OBJECTIVE-C CSCI 4448/5448: OBJECT-ORIENTED ANALYSIS & DESIGN LECTURE 12 09/29/2011

1 Posix API vs Windows API

Unix Scripts and Job Scheduling

IBM SDK, Java Technology Edition Version 1. IBM JVM messages IBM

SQLITE C/C++ TUTORIAL

Textbook: T. Issariyakul and E. Hossain, Introduction to Network Simulator NS2, Springer

PostgreSQL Functions By Example

Konzepte objektorientierter Programmierung

Channel Access Client Programming. Andrew Johnson Computer Scientist, AES-SSG

MULTIPLE CHOICE. Choose the one alternative that best completes the statement or answers the question.

Using the VMRC Plug-In: Startup, Invoking Methods, and Shutdown on page 4

I. INTRODUCTION. International Journal of Computer Science Trends and Technology (IJCST) Volume 3 Issue 2, Mar-Apr 2015

JavaScript. JavaScript: fundamentals, concepts, object model. Document Object Model. The Web Page. The window object (1/2) The document object

How To Use Postgresql With Foreign Data In A Foreign Server In A Multi Threaded Database (Postgres)

CSE 308. Coding Conventions. Reference

bbc Developing Service Providers Adobe Flash Media Rights Management Server November 2008 Version 1.5

Division of Informatics, University of Edinburgh

Scheduling in SAS 9.3

AUTOMATING OPENOFFICE.ORG WITH OOREXX: OOREXX NUTSHELL EXAMPLES FOR WRITE AND CALC

Building and Using Web Services With JDeveloper 11g

Moving from CS 61A Scheme to CS 61B Java

COSC Introduction to Computer Science I Section A, Summer Question Out of Mark A Total 16. B-1 7 B-2 4 B-3 4 B-4 4 B Total 19

StreamServe Persuasion SP4 Service Broker

An Introduction to Procedural and Object-oriented Programming (Object Rexx) 1 "Automating Windows and Windows Applications"

Computer Systems II. Unix system calls. fork( ) wait( ) exit( ) How To Create New Processes? Creating and Executing Processes

Command Line Interface User Guide for Intel Server Management Software

1001ICT Introduction To Programming Lecture Notes

3.5. cmsg Developer s Guide. Data Acquisition Group JEFFERSON LAB. Version

Chapter 2. println Versus print. Formatting Output withprintf. System.out.println for console output. console output. Console Input and Output

Duration Vendor Audience 5 Days Oracle End Users, Developers, Technical Consultants and Support Staff

Creating a Java application using Perfect Developer and the Java Develo...

Scheduling in SAS 9.4 Second Edition

Unix Shell Scripts. Contents. 1 Introduction. Norman Matloff. July 30, Introduction 1. 2 Invoking Shell Scripts 2

Crash Course in Java

Free Java textbook available online. Introduction to the Java programming language. Compilation. A simple java program

ReleaseNotes FormsDataPoller

Java Programming Fundamentals

First Java Programs. V. Paúl Pauca. CSC 111D Fall, Department of Computer Science Wake Forest University. Introduction to Computer Science

ODBC Client Driver Help Kepware, Inc.

Libmonitor: A Tool for First-Party Monitoring

Creating a Simple, Multithreaded Chat System with Java

Linux Syslog Messages in IBM Director

Amazon Glacier. Developer Guide API Version

White Paper BMC Remedy Action Request System Security

Device Management API for Windows* and Linux* Operating Systems

2! Multimedia Programming with! Python and SDL

Tutorial: Getting Started

Demo: Controlling.NET Windows Forms from a Java Application. Version 7.3

Working With Derby. Version 10.2 Derby Document build: December 11, 2006, 7:06:09 AM (PST)

Lecture 5: Java Fundamentals III

Android Developer Fundamental 1

Hadoop Streaming. Table of contents

StreamServe Persuasion SP5 Microsoft SQL Server

How to Program an Android Application to Access and Manage the Wi-Fi Capabilities of a Smartphone

CEBO Programming Reference

Intel Retail Client Manager Audience Analytics

Manual. Programmer's Guide for Java API

Free Java textbook available online. Introduction to the Java programming language. Compilation. A simple java program

Introduction to Logging. Application Logging

Introduction to HP ArcSight ESM Web Services APIs

Developer Guide. Android Printing Framework. ISB Vietnam Co., Ltd. (IVC) Page i

MASTERTAG DEVELOPER GUIDE

Using the Command Line Interface (CLI)

Projektseminar aus Wirtschaftsinformatik

Virtuozzo Virtualization SDK

LICENSE4J FLOATING LICENSE SERVER USER GUIDE

Oracle Database: SQL and PL/SQL Fundamentals

Developing a Web Server Platform with SAPI Support for AJAX RPC using JSON

Install Java Development Kit (JDK) 1.8

Network Detective Client Connector

Automatic Logging of Operating System Effects to Guide Application-Level Architecture Simulation

The HTTP Plug-in. Table of contents

Vim, Emacs, and JUnit Testing. Audience: Students in CS 331 Written by: Kathleen Lockhart, CS Tutor

D06 PROGRAMMING with JAVA. Ch3 Implementing Classes

JAVA - METHODS. Method definition consists of a method header and a method body. The same is shown below:

Practice Fusion API Client Installation Guide for Windows

Java Web Services SDK

Exceptions in MIPS. know the exception mechanism in MIPS be able to write a simple exception handler for a MIPS machine

Introduction to Java

To Java SE 8, and Beyond (Plan B)

OpenCL Static C++ Kernel Language Extension

How To Understand How A Process Works In Unix (Shell) (Shell Shell) (Program) (Unix) (For A Non-Program) And (Shell).Orgode) (Powerpoint) (Permanent) (Processes

HTTP and HTTPS Statistics Services

Freescale MQX USB Device User Guide

Custom Encryption in Siebel & Siebel Web Service Security Test Guide 1.0

HP-UX Essentials and Shell Programming Course Summary

Setting Up the Site Licenses

Transcription:

Institut für Betriebswirtschaftslehre und Wirtschaftsinformatik Implementing Rexx Handlers in NetRexx/Java/Rexx The 2012 International Rexx Symposium Rony G. Flatscher Wirtschaftsuniversität Wien Augasse 2-6 A-1090 Wien Hier The 2012 Vortrags-/Vorlesungstitel Automatisierung International von Rexx Windows Symposium, im Master Anwendungen eintragen RTP, North (3) Carolina 1 Prof. Dr. RonyG. Flatscher

Agenda New BSF4ooRexx 4.1 support for configuring Rexx interpreter instances from Java/NetRexx Setup options for command and exit handlers Writing Rexx (sub)command handlers Nutshell example Writing Rexx exit handlers Nutshell example Roundup Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 2 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

New BSF4ooRexx 4.1 Support for Startup Options, Overview The Java RexxEngine represents an oorexx interpreter instance and is managed by a BSFManager Initialization of the Rexx interpreter instance gets now deferred as long as possible Allows configuring the Rexx interpreter instance A default configuration matching previous BSF4ooRexx options Configuration done via RexxConfiguration object of RexxEngine Rexx interpreter instance gets created upon the first request from Java to execute Rexx code No (re-)configuration possible anymore Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 3 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

New BSF4ooRexx 4.1 Support for Startup Options, RexxConfiguration, 1 Options available in Java/NetRexx EXTERNAL_CALL_PATH EXTERNAL_CALL_EXTENSIONS LOAD_REQUIRED_LIBRARY DIRECT_EXITS DIRECT_ENVIRONMENTS INITIAL_ADDRESS_ENVIRONMENT Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 4 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

New BSF4ooRexx 4.1 Support for Startup Options, RexxConfiguration, 2 To get access to the RexxConfiguration Create a RexxEngine instance Use the public method getrexxconfiguration() Use the RexxConfiguration methods for setting up exit and command handlers Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 5 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

New BSF4ooRexx 4.1 Support for Startup Options, RexxConfiguration, 3 Configuration methods available in RexxConfiguration Rexx option DIRECT_EXITS Exit numbers ("function") defined in interface RexxExitHandler Defined exit handlers can be replaced at runtime! - Defined exits can be temporarily "nullified" at runtime! void addexithandler(int function, RexxExitHandler exithandler) throws BSFException RexxExitHandler setexithandler(int function, RexxExitHandler exithandler) throws BSFException RexxExitHandler getexithandler(int function) BitSet getdefinedexits() Object [] getexithandlers() Object[] contains an int and a RexxExitHandler array object Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 6 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

New BSF4ooRexx 4.1 Support for Startup Options, RexxConfiguration, 4 Configuration methods available in RexxConfiguration Rexx option DIRECT_ENVIRONMENTS Defined command handlers can be replaced at runtime! void addcommandhandler(string name, RexxCommandHandler commandhandler) throws BSFException RexxCommandHandler getcommandhandler(string name) RexxCommandHandler setcommandhandler(string name, RexxCommandHandler commandhandler) throws BSFException Object[] getcommandhandlers() Object[] contains a String and a RexxCommandHandler array object Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 7 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

New BSF4ooRexx 4.1 Support for Startup Options, RexxConfiguration, 5 Configuration methods available in RexxConfiguration Rexx option INITIAL_ADDRESS_ENVIRONMENT void setinitialaddressenvironment(string name) throws BSFException String getinitialaddressenvironment() Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 8 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Rexx Exits and Rexx (Sub-)Command Handlers, 1 "Callbacks" from the Rexx interpreter Rexx (sub-)command handler Invoked by the Rexx interpreter whenever a command has to be carried out A Java implemented Rexx command handler Receives the ADDRESS name Receives the command to carry out and May return any value - A return value can be fetched by the Rexx program by referring to the Rexx variable "RC" (return code) upon return from the command handler Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 9 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Rexx Exits and Rexx (Sub-)Command Handlers, 2 "Callbacks" from the Rexx interpreter Rexx exits Invoked before certain "important" actions are carried out by the Rexx interpreter, e.g. Searching an external function About to write a string to stdout... A Rexx exit handler can choose to Handle the exit itself (RexxExit.RXEXIT_HANDLED) Let Rexx handle the exit (RexxExit.RXEXIT_NOT_HANDLED) Raise an error (RexxExit.RXEXIT_RAISE_ERROR) Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 10 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

org.rexxla.bsf.engines.rexx.rexxhandler A Utility Class for Java Rexx Handlers Java abstract class org.rexxla.bsf.engines.rexx.rexxhandler Must only be used in the same thread that invokes Java Rexx exit and Rexx command handlers! Defines and implements static methods Makes some of the oorexx C++ APIs available to the Java Rexx handlers Fetch and set Rexx variables Set thread and halt conditions Raise Rexx conditions and Rexx exceptions Get access to the Rexx.local, global.environment and.nil objects Must supply the unaltered (opaque) argument "slot" that gets passed to Java Rexx exit and Rexx command handlers as the first argument Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 11 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler Java interface org.rexxla.bsf.engines.rexx.rexxcommandhandler Defines a single method Object handlecommand(object slot, String address, String command) "slot" Opaque value for using the static RexxHandler methods "address" Name of the addressed environment "command" The command to carry out Return value Any value, can be retrieved in Rexx via the variable named "RC" (return code) Returning a Java null will be mapped to the return code number "0" Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 12 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler An Example Command handler name for the Rexx ADDRESS keyword statement: "TEST1" Commands "Hi", should return the string "Hi, but who are you?" "one plus two", should return the number "3" "please panic a little bit", should raise a Rexx exception Any other command should return the string "undefined command # xyz: [command]" where "xyz" represents the current value of an appropriate counter where "command" shows the undefined command Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 13 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler The Java Rexx Command Handler, 1 import org.apache.bsf.*; import org.rexxla.bsf.engines.rexx.*; public class SampleCommandHandler implements RexxCommandHandler { public static void main (String args[]) throws BSFException { BSFManager mgr =new BSFManager(); // create an instance of BSFManager RexxEngine rexxengine=(rexxengine) mgr.loadscriptingengine("rexx"); // load the Rexx engine // Configure the RexxEngine RexxConfiguration rexxconf=rexxengine.getrexxconfiguration(); // add command handler rexxconf.addcommandhandler("test1", new SampleCommandHandler()); System.err.println("edited rexxconf=["+rexxconf+"]\n"); // Rexx code to run String rexxcode= "call 'testsamplecommandhandler.rex' "; // invoke the interpreter and run the Rexx program rexxengine.apply ("SampleCommandHandler.rex", 0, 0, rexxcode, null, null); rexxengine.terminate(); // terminate Rexx interpreter instance }... continued... Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 14 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler The Java Rexx Command Handler, 2... continued... } int counter=0; // count # of undefined commands public Object handlecommand(object slot, String address, String command) { System.err.println("address=["+address+"], command=["+command+"]"); if (command.comparetoignorecase("hi")==0) {return "Hi, who are you?";} else if (command.comparetoignorecase("one plus two")==0) {return "3";} else if (command.comparetoignorecase("please panic a little bit")==0) { RexxHandler.raiseException1(slot, 35900, this+": You asked for this exception!"); return null; } // undefined command counter++; return "Undefined command # "+counter+": ["+command+"]"; } Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 15 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler The NetRexx Rexx Command Handler, 1 class nrxsamplecommandhandler public implements org.rexxla.bsf.engines.rexx.rexxcommandhandler properties private counter=0 -- count # of undefined commands method main(s=string[]) static mgr = org.apache.bsf.bsfmanager() -- create an instance of BSFManager rexxengine = org.rexxla.bsf.engines.rexx.rexxengine mgr.loadscriptingengine("rexx") -- Configure the RexxEngine rexxconf=rexxengine.getrexxconfiguration() -- add command handler rexxconf.addcommandhandler("test1", nrxsamplecommandhandler()) say "nrxsamplecommandhandler.nrx, edited rexxonf=["rexxconf"]\n" -- Rexx code to run (quote filename for Unix filesystems) rexxcode= "call 'testsamplecommandhandler.rex' " -- invoke the interpreter and run the Rexx program rexxengine.apply("nrxsamplecommandhandler.rex", 0, 0, rexxcode, null, null) rexxengine.terminate() -- terminate Rexx engine (Rexx interpreter instance)... continued... Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 16 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler The NetRexx Rexx Command Handler, 2... continued... method handlecommand(slot=object, address=string, command=string) returns Object say "address=["address"], command=["command"]" if command="hi" then return "Hi, who are you?" else if command="one plus two" then return String("3") else if command="please panic a little bit" then do org.rexxla.bsf.engines.rexx.rexxhandler.raiseexception1(slot, 35900, this": You asked for this exception!") return null end -- undefined command counter=counter+1 return "Undefined command #" counter": ["command"]" Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 17 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler The Rexx Program address test1 "hi" say "rc="pp2(rc) say address test1 -- change address permanently one plus two say "rc="pp2(rc) say call testexception "nothing to do?" say "rc="pp2(rc) say ::requires "rgf_util2.rex" -- get public routines pp2(), ppcondition2() ::routine testexception -- send the command that raises an exception signal on any address test1 "please panic a little bit" return any: say ppcondition2(condition('object')) say return Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 18 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler The Rexx Program's Output E:\commandHandler>java SampleCommandHandler edited rexxconf=[org.rexxla.bsf.engines.rexx.rexxconfiguration[initialaddressenvironment=[null], externalcallpath=[null],externalcallextensions=[.rxj,.rxo,.rxjo,.jrexx],loadrequiredlibrary={}, exithandlers={},commandhandlers={test1=samplecommandhandler@4741d6}]] address=[test1], command=[hi] rc=[hi, who are you?] address=[test1], command=[one PLUS TWO] rc=[3] address=[test1], command=[please panic a little bit] [ADDITIONAL] =[an Array (1 items) id#_266374451] [SampleCommandHandler@4741d6: You asked for this exception!] [CODE] =[35.900] [CONDITION] =[SYNTAX] [DESCRIPTION]=[] [ERRORTEXT] =[Invalid expression] [INSTRUCTION]=[SIGNAL] [MESSAGE] =[SampleCommandHandler@4741d6: You asked for this exception!] [PACKAGE] =[a Package id#_266374542] [POSITION] =[20] [PROGRAM] =[E:\commandHandler\testSampleCommandHandler.rex] [PROPAGATED] =[1] [RC] =[35] [TRACEBACK] =[a List (0 items) id#_266374526] address=[test1], command=[nothing to do?] rc=[undefined command # 1: [nothing to do?]] Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 19 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler Teaser: The Rexx Rexx Command Handler, 1 -- prepare another Rexx interpreter instance besides the current one for this Rexx program rexxengine=.bsf~new("org.apache.bsf.bsfmanager")~loadscriptingengine("rexx") rexxconf=rexxengine~getrexxconfiguration proxy=bsfcreaterexxproxy(.samplecommandhandler~new,,"org.rexxla.bsf.engines.rexx.rexxcommandhandler") rexxconf~addcommandhandler("test1", proxy) say "rexsamplecommandhandler.rxj, edited rexxconf="pp(rexxconf~tostring) say -- invoke the interpreter and run the Rexx program rexxcode= "call 'testsamplecommandhandler.rex' " rexxengine~apply("from_rexsamplecommandhandler.rxj", 0, 0, rexxcode,.nil,.nil) rexxengine~terminate -- terminate Rexx engine (Rexx interpreter instance) ::requires BSF.CLS -- get Java support... continued... Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 20 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler Teaser: The Rexx Rexx Command Handler, 2... continued... ::class SampleCommandHandler -- Rexx class implementing the "handlecommand" interface ::method init -- needed to define the "counter" attribute and set it to "0" expose counter counter=0 ::method handlecommand -- Rexx command handler implemented in Rexx! expose counter use arg slot, address, command say "address=["address"], command=["command"]" if command~caselessequals("hi") then return "Hi, who are you?" else if command~caselessequals("one plus two") then return 3 else if command~caselessequals("please panic a little bit") then do raise syntax 35.900 array (self": You asked for this exception!") end -- undefined command counter=counter+1 return "Undefined command #" counter": ["command"]" Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 21 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxExitHandler Java interface org.rexxla.bsf.engines.rexx.rexxexithandler Defines a single method int handleexit(object slot, int exitnumber, int subfunction, Object[] parmblock) "slot" Opaque value for using the static RexxHandler methods "exitnumber" The exit number, cf. the Rexx documentation in "rexxpg.pdf", "9.12.2. Context Exit Definitions" "subfunction" The exit's subfunction number, cf. the Rexx documentation in "rexxpg.pdf" "parmblock" A Java array representing the C "parmblock" structure, depends on the exit and subfunction Return value 0 (RXEXIT_HANDLED), 1 (RXEXIT_NOT_HANDLED), -1 (RXEXIT_RAISE_ERROR) Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 22 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxExitHandler An Example Exit number 14 (RXVALUE) Invoked every time the VALUE()-BIF gets invoked with an unknown selector value Handles only invocations, if selector="rgf" "parmblock" array (cf. JavaDocs for full documentation) First entry: selector (a string) Second entry: variable name (a string) Third entry: value Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 23 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxExitHandler The Java Rexx Exit Handler, 1 import org.apache.bsf.*; import org.rexxla.bsf.engines.rexx.*; public class SampleExitHandler implements RexxExitHandler { public static void main (String args[]) throws BSFException { BSFManager mgr =new BSFManager(); // create an instance of BSFManager RexxEngine rexxengine=(rexxengine) mgr.loadscriptingengine("rexx"); // load the Rexx engine // Rexx code to run String rexxcode= "call 'testsampleexithandler.rex' " ; // Configure the RexxEngine RexxConfiguration rexxconf=rexxengine.getrexxconfiguration(); System.err.println("default rexxconf=["+rexxconf+"]\n"); // add system exits rexxconf.addexithandler(rexxexithandler.rxvalue, new SampleExitHandler() ); System.err.println("edited rexxconf=["+rexxconf+"]\n"); } // invoke the interpreter and run the Rexx program rexxengine.apply ("SampleExitHandler.rex", 0, 0, rexxcode, null, null); rexxengine.terminate(); // terminate Rexx engine instance... continued... Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 24 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxExitHandler The Java Rexx Exit Handler, 2... continued... // implementation of a RXVALUE exit handler, Java arrays are 0-based public int handleexit(object slot, int exitnumber, int subfunction, Object[] parmblock) { System.err.println("(Java side) -> selector=["+parmblock[0]+"], varname=["+parmblock[1]+"]"+ ", value=["+parmblock[2]+"]"); } } String selector=(string) parmblock[0]; if (selector.comparetoignorecase("rgf")==0) // o.k., addressed to us, handle it { if (parmblock[2]==null) // if value is null, give it some value { parmblock[2]="value for variable name ["+parmblock[1]+"] by a Java Rexx exit handler"; } return RexxExitHandler.RXEXIT_HANDLED; } return RexxExitHandler.RXEXIT_NOT_HANDLED; Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 25 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxExitHandler The NetRexx Rexx Exit Handler, 1 import org.rexxla.bsf.engines.rexx.rexxexithandler class nrxsampleexithandler public implements RexxExitHandler method main(s=string[]) static mgr = org.apache.bsf.bsfmanager() -- create an instance of BSFManager rexxengine = org.rexxla.bsf.engines.rexx.rexxengine mgr.loadscriptingengine("rexx") -- Configure the RexxEngine rexxconf=rexxengine.getrexxconfiguration() -- add exit handler rexxconf.addexithandler(rexxexithandler.rxvalue, nrxsampleexithandler() ); say "nrxsampleexithandler.nrx, edited rexxonf=["rexxconf"]\n" -- Rexx code to run (quote filename for Unix filesystems) rexxcode= "call 'testsampleexithandler.rex' " -- invoke the interpreter and run the Rexx program rexxengine.apply("nrxsampleexithandler.rex", 0, 0, rexxcode, null, null) rexxengine.terminate() -- terminate Rexx engine (Rexx interpreter instance)... continued... Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 26 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxExitHandler The NetRexx Rexx Exit Handler, 2... continued... // implementation of a RXVALUE exit handler, NetRexx (Java) arrays are 0-based method handleexit(slot=object, exitnumber=int, subfunction=int, parmblock=object[]) returns int if parmblock[2]=null then say "(NetRexx side) -> selector=["parmblock[0]"], varname=["parmblock[1]"]" else say "(NetRexx side) -> selector=["parmblock[0]"], varname=["parmblock[1]"], value=["parmblock[2]"]" selector=string parmblock[0] if selector="rgf" then -- o.k., addressed to us, handle it do if (parmblock[2]==null) then -- if value is null, give it some value do parmblock[2]="value for variable name ["parmblock[1]"] by a NetRexx Rexx exit handler" end return RexxExitHandler.RXEXIT_HANDLED end return RexxExitHandler.RXEXIT_NOT_HANDLED Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 27 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxExitHandler The Rexx Program say "(Rexx side) value('abc',, 'RGF') say say "(Rexx side) value('def',, 'rgf') say ="pp(value('abc',,'rgf')) ="pp(value('def',,'rgf')) say "(Rexx side) value('ghi', 'na,sowas!', 'RGF')="pp(value('ghi', 'na,sowas!', 'RGF')) ::requires "BSF.CLS" -- get access to public routine pp() Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 28 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxExitHandler The Rexx Program's Output E:\exitHandler>java SampleExitHandler default rexxconf=[org.rexxla.bsf.engines.rexx.rexxconfiguration[initialaddressenvironment=[null], externalcallpath=[null],externalcallextensions=[.rxj,.rxo,.rxjo,.jrexx],loadrequiredlibrary={}, exithandlers={},commandhandlers={}]] edited rexxconf=[org.rexxla.bsf.engines.rexx.rexxconfiguration[initialaddressenvironment=[null], externalcallpath=[null],externalcallextensions=[.rxj,.rxo,.rxjo,.jrexx],loadrequiredlibrary={}, exithandlers={rxvalue/14/sampleexithandler@4741d6},commandhandlers={}]] (Java side) -> selector=[rgf], varname=[abc], value=[null] (Rexx side) value('abc',,'rgf') =[value for variable name [abc] by a Java Rexx exit handler] (Java side) -> selector=[rgf], varname=[def], value=[null] (Rexx side) value('def',,'rgf') =[value for variable name [def] by a Java Rexx exit handler] (Java side) -> selector=[rgf], varname=[ghi], value=[na,sowas!] (Rexx side) value('ghi','na,sowas!','rgf')=[na,sowas!] Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 29 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler Teaser: The Rexx Rexx Exit Handler, 1 -- prepare another Rexx interpreter instance besides the current one for this Rexx program clzname="org.rexxla.bsf.engines.rexx.rexxexithandler" clz=bsf.loadclass(clzname).local~rxexit_handled =clz~rxexit_handled.local~rxexit_not_handled=clz~rxexit_not_handled rexxengine=.bsf~new("org.apache.bsf.bsfmanager")~loadscriptingengine("rexx") rexxconf=rexxengine~getrexxconfiguration proxy=bsfcreaterexxproxy(.sampleexithandler~new,,clzname) rexxconf~addexithandler(clz~rxvalue, proxy) say "rexsampleexithandler.rxj, edited rexxconf="pp(rexxconf~tostring) say -- invoke the interpreter and run the Rexx program rexxcode= "call 'testsampleexithandler.rex' " rexxengine~apply("from_rexsampleexithandler.rxj", 0, 0, rexxcode,.nil,.nil) rexxengine~terminate -- terminate Rexx engine (Rexx interpreter instance) ::requires BSF.CLS -- get Java support... continued... Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 30 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Writing a RexxCommandHandler Teaser: The Rexx Rexx Exit Handler, 2... continued... ::class SampleExitHandler -- Rexx class implementing the "handleexit" interface // implementation of a RXVALUE exit handler, Java array camouflaged as a Rexx array, hence 1-based! ::method handleexit use arg slot, exitnumber, subfunction, parmblock say "(RexxExitHandler side) -> selector=["parmblock[1]"], varname=["parmblock[2]"], value=["parmblock[3]"]" if parmblock[1]~caselessequals("rgf") then -- o.k., addressed to us, handle it do if (parmblock[3]=.nil) then -- if value is null, give it some value parmblock[3]="value for variable name ["parmblock[2]"] by a Java Rexx exit handler" return.rxexit_handled end return.rxexit_not_handled Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 31 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher

Roundup New BSF4ooRexx 4.1 Adds the ability for Java/NetRexx programs to Define (sub-)command and exit handlers for a Rexx interpreter instance Configuration from Java/NetRexx is very easy using the RexxConfiguration class Implementing Java or NetRexx or Rexx (!) (sub-)command handlers is very easy Implementing Java or NetRexx or Rexx (!) exit handlers is very easy Allows any Java/NetRexx application to easily adopt Rexx as its scripting language and exploit every facet of it for its purposes! Hier The 2012 Vortrags-/Vorlesungstitel International Rexx Symposium, im Master eintragen RTP, North Carolina 32 Hier Name des Vortragenden RonyG. im Master eintragen Flatscher