chamando um programa do cobol

Upload: silas-alves-lima

Post on 08-Apr-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/7/2019 Chamando um programa do Cobol

    1/6

    Chapter 3: Calling Java from COBOL

    This chapter describes how you can access Java objects from COBOL programs.

    3.1 Overview

    Micro Focus Java support enables you to send messages to Java objects from Object COBOL programs and classes. Java issupported through a Java domain in Object COBOL. The Java domain enables you to declare Java classes inside a COBOLprogram. You can then send messages to the Java classes. You can also send messages from Java classes to COBOL - this iscovered in the chapter Calling Object COBOL from Java .

    The Java domain support works by creating a COBOL proxy object for each Java object, as shown in Figure 3-1. The classitself that you declare is a proxy for the static methods of the Java class.

    Figure 3-1: The COBOL Proxy Object

    The COBOL run-time system converts parameters sent with messages from COBOL data types to Java data types. If a methodreturns a parameter, it is converted from a Java data type to a COBOL data type.

    You must have set up your COBOL and Java environments before you can use this technology; see the chapter Before YouStart .

    3.2 Writing the COBOL Program

    This section shows you how to code a COBOL program to call Java methods using the Object COBOL Java domain. Your program needs to have a Class-Control Section, and use the INVOKE verb each time you want to call a Java method, althoughit does not have to be written as an Object COBOL class.

    3.2.1 Declaring Java Classes

    Each Java class you want to use in a COBOL program must be declared in the Class-Control Section. You need to provide thefull name of the package the class is in, prefixed by $java$ . The prefix tells the COBOL run-time system to load the class fromthe Java domain.

    For example:

    class-control.jRectangle is class "$java$java.awt.Rectangle".

    This declares jRectangle as a COBOL proxy object for the Rectangle class in the java.awt package. The package must beavailable on your Java classpath or your program will fail at run time.

    3.2.2 Instantiating Java Objects

    1

    http://www.emunix.emich.edu/info/cobol/books/dpcofjcn.htmhttp://www.emunix.emich.edu/info/cobol/books/dpcofjcn.htmhttp://www.emunix.emich.edu/info/cobol/books/dpintrcn.htmhttp://www.emunix.emich.edu/info/cobol/books/dpintrcn.htmhttp://www.emunix.emich.edu/info/cobol/books/dpintrcn.htmhttp://www.emunix.emich.edu/info/cobol/books/dpcofjcn.htmhttp://www.emunix.emich.edu/info/cobol/books/dpintrcn.htmhttp://www.emunix.emich.edu/info/cobol/books/dpintrcn.htm
  • 8/7/2019 Chamando um programa do Cobol

    2/6

    Each Java class has one or more constructor methods to instantiate objects. In Java, constructor methods have the same name asthe class. To enable you to invoke these methods from COBOL, they are mapped to the "new" method name on the COBOLproxy object.

    The different constructors on a Java class take different numbers and combinations of parameters to initialize the instance youare creating. For example, the Java Rectangle class can be instantiated in several different ways, including the two shown belowin Java code:

    Rectangle r1 = new Rectangle ()// rectangle (x,y) = 0,0, width=0, height=0

    Rectangle r2 = new Rectangle(4, 5, 10, 20)// rectangle (x,y) = (4,5), width=10, height=20

    The equivalent COBOL code is shown below:

    working-storage section.01 r1 object reference.01 r2 object reference....

    procedure division....

    invoke jRectangle "new" returning r1*> rectangle (x,y) = 0,0, width=0, height=0

    invoke jRectangle "new" using 4, 5, 10, 20returning r2

    *> rectangle (x,y) = (4,5), width=10, height=20

    The COBOL run-time system uses the number and type of parameters to call the appropriate constructor on the Java class. Youmust be careful to provide parameters of the types expected by the Java class, as Java is a strongly typed language. The chapter Java Data Types explains how COBOL data types are mapped on to Java data types. The copyfile javatypes.cpy also defines aset of data types for use in COBOL which correspond directly to Java data types; you are recommended to use these for transferring data between Java and COBOL.

    3.2.3 Calling Java Methods

    You can call any of the methods on a Java object by sending it a message with the same name as the method. You can also callthe static methods of a Java class - send the message to the classname declared in the Class-Control paragraph of your program.Method names in Java are case sensitive, so the case of the message name in COBOL must match the case of the method inJava.

    Java allows method overloading - where one method name has different implementations according to the number and type of parameters passed. COBOL handles this transparently for you, so that the correct Java method is always called.

    For example, the Rectangle class has three different add() methods, which take different parameters. The Java code belowshows three different ways you can call the add() method on a rectangle.

    Rectangle r1 = new Rectangle(0,0,0,0) ;Point pt = new Point(6,6) ;Rectangle r2 = new Rectangle(3,4,9,9) ;r1.add(4,5) ; // changes r1 to smallest rectangle

    // containing r1 and point 4,5r1.add(pt) ; // changes r1 to smallest rectangle

    // containing r1 and Point pt.r1.add(r2) ; // changes r1 to union of r1 & r2

    The equivalent code in COBOL looks like this:

    class-control.jRectangle is class "$java$java.awt.Rectangle"jPoint is class "$java$java.awt.Point".

    working-storage section.

    2

    http://www.emunix.emich.edu/info/cobol/books/dpjadtcn.htmhttp://www.emunix.emich.edu/info/cobol/books/dpjadtcn.htmhttp://www.emunix.emich.edu/info/cobol/books/dpjadtcn.htm
  • 8/7/2019 Chamando um programa do Cobol

    3/6

    01 r1 object reference.01 r2 object reference.01 pt object reference.

    procedure division.invoke jRectangle "new" returning r1invoke jPoint "new" using 4 5 returning ptinvoke jRectangle "new" using 3 4 9 9 returning r2invoke r1 "add" using 4 5invoke r1 "add" using ptinvoke r1 "add" using r2

    Although r2 and pt are both data items of type object reference, the COBOL run-time system determines the type of Java objectrepresented and calls the correct Java method.

    3.2.4 Accessing Java Variables

    You can access the public members and static variables of a Java class by invoking "set name " and "get name " methods on theObject COBOL proxy. Variable names are case-sensitive in Java, so the case of name in your COBOL code must match thecase declared in the Java code.

    For example, the Java class below has public variables classVal and instVal:

    public class x {static int classVal;int instVal;

    };

    This sample of COBOL code sets the static variable classVal, and then retrieves the member instVal.

    $set ooctrl(-f+p)class-control.

    x is class "$Java$x".

    working-storage section.copy "javatypes.cpy".01 anX object reference.01 anInt jint.procedure division.

    invoke x "setclassVal" using by value 4invoke x "new" returning anXinvoke anX "getinstVal" returning anInt

    3.2.5 Handling Java Exceptions

    An exception thrown by Java is passed back to COBOL as an Object COBOL exception raised against the javaexpt class. Thedefault exception behavior is for the COBOL run-time system to display a message warning of the exception, and thenterminate. Alternatively, you can trap the exception by adding an exception handler to your COBOL program.

    The instructions below assume you have first read the chapter Exception Handling Frameworks in your OO Programming withObject COBOL .

    To trap Java exceptions:

    1. Declare the Exceptionmanager, JavaExceptionManager, and Callback or EntryCallback classes in the Class-Controlparagraph:

    2. class-control.3. ...4. JavaExceptionManager is class "javaexpt"5. ExceptionManager is class "exptnmgr"6. Callback is class "callback"7. EntryCallback is class "entrycll"

    3

    http://www.emunix.emich.edu/info/cobol/books/opfwexcn.htmhttp://www.emunix.emich.edu/info/cobol/books/opfwexcn.htmhttp://www.emunix.emich.edu/info/cobol/books/opfwexcn.htm
  • 8/7/2019 Chamando um programa do Cobol

    4/6

    ...

    8. Write an exception handler (either a method in a class, or an entry point) and create a Callback or EntryCallback to it.For example, a Callback looks like this:

    9. invoke Callback "new" using anObject z"methodName"returning aHandler

    An EntryCallback looks like this:

    invoke EntryCallback "new" using z"entryPointname"returning aHandler

    10. Register your callback against the JavaExceptionManger class. For example:11. invoke ExceptionManager "register"

    using JavaExceptionManager aHandler

    Now all Java exceptions thrown by classes you are calling through the Object COBOL Java domain get sent to your exceptionhandler.

    This is an example of a COBOL program which catches an exception thrown by a Java program:

    $set ooctrl (+p-f)program-id. ExceptionCatcher.

    class-control.SimpleClass is class "$JAVA$SimpleClass"EntryCallback is class "entrycll"JavaExceptionManager is class "javaexpt"ExceptionManager is class "exptnmgr".

    working-storage section.01 theInstance object reference.01 wsCallback object reference.local-storage section.01 filler pic x. *> dummy storage to allow the local entry

    *> point to be used for the callbacklinkage section.01 lnkException object reference.

    procedure division.*>---Set up Exception handler

    invoke EntryCallback "new" using z"JException"returning wsCallback

    invoke ExceptionManager "register"using javaexceptionmanager

    wsCallback*>---Instantiate the class

    invoke SimpleClass "new" returning theInstance

    display "instantiated"invoke theInstance "TestException"display "excepted"stop run.

    entry "Jexception" using lnkException.invoke lnkException "display".

    The Local-Storage Section in the above program is simply to allow recursion - the COBOL run-time system treats invoking theEntryCallback as a recursive call. Without a Local-Storage Section, this will result in a run-time system error.

    This is the Java code for SimpleClass:

    4

  • 8/7/2019 Chamando um programa do Cobol

    5/6

    import java.lang.* ;

    public class SimpleClass {

    public SimpleClass() {}

    public void TestException() throws Exception{

    Exception e = new Exception ("Test error" );throw e;

    }}

    3.2.6 Accessing Native Java Objects

    Using the Object COBOL Java domain means that you never access Java objects directly - you are always going through aproxy as explained in the section Overview . You can obtain a pointer to the actual Java object using the "getJavaObject"method of the javasup class. You can use this in conjunction with the Java Native Interface (JNI) if you want access to Javafunctionality not provided by the Object COBOL Java domain.

    To get a JNI pointer, invoke "getEnv" on the javasup class. The JNI pointer is a pointer to a table of functions; data typeJNINativeInterface in copyfile javatypes.cpy provides a structure that makes the JNI function table easier to use, as shown inthe example below:

    working-storage section.01 JEnv pointer.01 jobject pointer.linkage section.01 lnk-JNINativeInterface JNINativeInterface.

    *>procedure division.

    invoke javasup "getEnv" returning jEnv*> Map the pointer passed in JEnv to the*> JNINativeInterface structure so that we*> can call JNI functions.

    set address of lnk-JNINativeInterface to JEnv*>

    You can now call JNI functions using the names provided by the JNINativeInterface type definition. You can see an example of this in the section Example of Throwing an Exception in the chapter Calling Procedural COBOL from Java . For moreinformation on JNI, see Sun's Java site.

    For more information on the javasup class, see the section Java Domain Class Library in your Class Library Reference .

    3.2.7 Finalizing Java Objects

    The Java run-time environment includes a garbage collector which automatically destroys unwanted objects. The garbagecollector deletes any object which is not referenced by any other object. Once you have a proxy to a Java object in a COBOLprogram, the COBOL run-time system has a reference to the Java object which prevents the Java garbage collector fromremoving it.

    When you have finished with a Java object, you must release the reference to it so that the garbage collector can delete theobject - otherwise your application has a memory leak. To finalize the object:

    invoke javaobject "finalize" returning javaobject

    The returning parameter is important, as otherwise the COBOL run-time system passes the message on to the actual Java objectinstead of destroying the COBOL proxy. If the message is passed to the Java object, it invokes this method:

    public void finalize()

    5

    http://www.emunix.emich.edu/info/cobol/books/dpjafc.htm#u000%23u000http://www.emunix.emich.edu/info/cobol/books/dpjafc.htm#u000%23u000http://www.emunix.emich.edu/info/cobol/books/dpjacocn.htmhttp://www.emunix.emich.edu/info/cobol/books/dpjacocn.htmhttp://www.microfocus.com/docs/links.asp?sx=javahttp://www.microfocus.com/docs/links.asp?sx=javahttp://www.emunix.emich.edu/info/cobol/books/clpubb.htmhttp://www.emunix.emich.edu/info/cobol/books/dpjafc.htm#u000%23u000http://www.emunix.emich.edu/info/cobol/books/dpjacocn.htmhttp://www.microfocus.com/docs/links.asp?sx=javahttp://www.emunix.emich.edu/info/cobol/books/clpubb.htm
  • 8/7/2019 Chamando um programa do Cobol

    6/6

    This method is either inherited or implemented by all Java classes, and is called by the Java garbage collector before it destroysan object.

    In the unlikely event that your Java class implements a finalize() method which returns a value, use the "delete" method todestroy the Object COBOL proxy instead:

    invoke javaobject "delete" returning javaobject

    6