Hi,
Not long ago I've written a PBNI (PBX) library that enables closely integration of Java and PB languages. The library allows to make communication of this languages in both directions: PB can create Java objects and call its methods and Java in turn can do the exact same things with PB objects in the same shared session. Unlike from PB EJB approach to call Java methods, this library may not use PB Proxy objects at all (although it may) - sufficient to indicate required signature for Java method when calling it from PB. On Java side the same approach has being applied but only with PB method signatures. For further simplicity such calls was wrapped into methods with names that matches to the counterpart on PB side.
Stop talking and consider some simple example. Suppose we have some PB window:
We have created and initialized PB global variable with name jvm tentatively and connection to DemoEAS DB was established via SQLCA object. To DataWindow control's (dw_main) property with name DataObject was assigned a reference to dw-object "d_customers" (grid-style). Next, in the open event of our window object we will create and initialize inv_jobject instance variable of java_object class that will present some Java Controller class. Then I receive a reference to java_method object by its Java signature, set it argument/s (if any) and at last call/invoke it.
dw_main.SetTransObject(SQLCA) dw_main.SetFocus() any params[] java_method jm //try inv_jobject = jvm.CreateJavaObject("Controller") jm = inv_jobject.getMethod("open", "(Lcom/powerbuilder/runtime/classes/PBDatawindow;)V") params[1] = dw_main jm.Invoke( params ) //catch (RunTimeError err) // MessageBox("Error", err.GetMessage(), Exclamation!) //end try
The source of Controller.java file is follow:
import java.util.Date;
import com.powerbuilder.runtime.*;
import com.powerbuilder.runtime.enums.*;
import com.powerbuilder.runtime.classes.*;
import com.powerbuilder.utils.*;
public class Controller
{
protected PBDatawindow dwo;
public void open(PBDatawindow dw)
{
dwo = dw;
int rows = dwo.retrieve();
}
public String getProperties(String expr)
{
return dwo.describe(expr);
}
public void enumFirst(int rows)
{
int i;
String txt = "";
int nCount = dwo.rowCount();
for (i = 1; i <= Math.min(rows, nCount); i++) {
txt += (int)dwo.getItemNumber(i, 1)+ ".\t" +
dwo.getItemString(i, "fname") + "\t" +
dwo.getItemString(i, "lname") + "\n";
}
Dialog.info("First "+rows+" records are:", txt);
}
public int setFilter(String filter)
{
dwo.setFilter(filter);
return dwo.filter();
}
public void close()
{
Dialog.messageBox("Close", "ByBy", Icon.Exclamation);
}
}
As we can see on Java side we'll work with the same instance of PB DataWindow object But its type (class) in Java is PBDatawindow - mirrored class for work with any dw-objects.
Other event sources of PB Window are follows:
close event:
any params[]
inv_jobject.getMethod("close", "()V").Invoke(params)
NY'ers button clicked event:
inv_jobject &
.getmethod("setFilter", "(Ljava/lang/String;)I") &
.invoke({"state='NY'"})
dw_main.POST SetFocus()
Top 20 button clicked event
inv_jobject &
.getmethod("enumFirst", "(I)V") &
.invoke({20})
As a result First 20 records are message box was displayed
This library is in beta testing mode yet. So if anybody has some practical interest to this functionality I can give a reference to download pbx/pbd files and source of Java package with a purpose of collaborative testing this library and obtaining its fully workable version. Naturally you will have all rights to use it freely in any projects in future.