/*
* This files shows an idea of how
* Java code could look like that
* implements foreign classes.
* These are only ideas, nothing is fixed yet.\
*/
package example;
// imports interfaces defined in the FLDefs ABS module
// in the Example.abs file.
// As interfaces generated from ABS are identical to
// Java interfaces, this is no problem at all.
import ABS.StdLib.List;
import ABS.StdLib.List_Cons;
import ABS.StdLib.isEmpty_f;
import FLDefs.*;
// Import classes and interface to interact with ABS
// from Java
import abs.backend.java.fli.*;
import abs.backend.java.lib.runtime.ABSFut;
import abs.backend.java.lib.types.ABSString;
import abs.backend.java.lib.types.ABSUnit;
/* one idea to specify the connection between
* Java classes and ABS classes is to use Annotations.
*
*/
//@RealizesABSClass("FLDefs.ForeignClass")
/*
* also possible is to directly inherit from the foreign
* class and implement the corresponding methods
*/
public class ForeignClassImpl extends ForeignClass_c {
@Override
public ABSUnit fli_m(ABSString s) {
System.out.println("Hello ABS, just got "+s+ " from you!");
return ABSUnit.UNIT;
}
@Override
public ABSString fli_foo(Test t) {
if (t.isBar()) {
System.out.println("Found a Bar with argument "+t.toBar().getArg0());
return t.toBar().getArg0();
}
return ABSString.fromString("This is Java");
}
@Override
public ABSUnit fli_visit(List<ABSString> planets) {
if (planets.isNil())
System.out.println("Planet list is Empty");
else {
List_Cons<ABSString> cons = planets.toCons();
ABSString s = cons.getArg0();
System.out.println("Found planet "+s);
}
return null;
}
@Override
public ABSUnit fli_aPing(Ping_i p) {
ABSFut<ABSString> fut = p.async_ping(ABSString.fromString("Hi Ping!!!"));
System.out.println("Waiting for future....");
System.out.println("Got future: "+fut.get());
return ABSUnit.UNIT;
}
}