This package provides support for communication with Erlang and representation of Erlang datatypes.

Note: By default, jinterface is only guaranteed to be compatible with other Erlang/OTP components from the same release as jinterface itself. For example, jinterface from the OTP R10 release is not compatible with an Erlang emulator from the OTP R9 release by default. jinterface can be set in compatibility mode of an earlier release (not earlier that R7), though. The compatibility mode is set by usage of the OtpCompatRel property. By starting the jvm with the command-line argument -DOtpCompatRel=9, jinterface will be compatible with the R9 release of OTP. Warning! You may run into trouble if this feature is used carelessly. Always make sure that all communicating components are either from the same Erlang/OTP release, or from release X and release Y where all components from release Y are in compatibility mode of release X.

The classes OtpErlangList, OtpErlangTuple, OtpErlangBinary, OtpErlangAtom, OtpErlangBoolean, OtpErlangByte, OtpErlangChar, OtpErlangDouble, OtpErlangFloat, OtpErlangLong, OtpErlangInt, OtpErlangUInt, OtpErlangShort, OtpErlangUShort, OtpErlangString, OtpErlangObject, OtpErlangPid, OtpErlangPort, and OtpErlangRef represent the various Erlang datatypes.

There are two basic mechanisms for communicating with Erlang, described briefly here. Note that the two mechanisms are not intended to be used together. Which mechanism you choose depends on your application and the level of control it needs.

You can use OtpNode, which can manage incoming and outgoing connections for you. With OtpNode a thread is automatically started to listen for incoming connections, make necessary outgoing connections, and dispatch messages to their recipients. OtpNode supports the concept of mailboxes, allowing you to have several Java components communicating independently with Erlang.

  OtpNode node = new OtpNode("bingo");
  OtpMbox mbox = node.createMbox();
  mbox.send("foo@localhost",new OtpErlangAtom("hej"));

If you need more control (but less support from the library), you can manage connections yourself using the OtpSelf and OtpConnection classes, in which case you can control explicitly which connections are made and which messages are sent. Received messages are not dispatched by OtpConnection.

The classes OtpPeer, OtpSelf and OtpServer are used to represent OTP nodes and are necessary in order to set up communication between the Java thread and a remote node. Once a connection has been established, it is represented by an OtpConnection, through which all communication goes.

Setting up a connection with a remote node is straightforward. You create objects representing the local and remote nodes, then call the local node's connect() method:

  OtpSelf self = new OtpSelf("client","cookie");
  OtpPeer other = new OtpPeer("server");
  OtpConnection conn = self.connect(other);

If you wish to be able to accept incoming connections as well as make outgoing ones, you first must register the listen port with EPMD (described in the Erlang documentation). Once that is done, you can accept incoming connections:

  OtpServer self = new OtpSelf("server","cookie");
  OtpConnection conn = self.accept();

Once the connection is established by one of the above methods (connect() or accept()), you can use the resulting OtpConnection to send and receive messages:

  OtpErlangAtom msg = new ErlangOtpAtom("hello");
  conn.send("echoserver", msg);
  OtpErlangObject reply = conn.receive();
  System.out.println("Received " + reply);

Finally, you can get an even greater level of control (and even less support from the library) by subclassing AbstractConnection and implementing the communication primitives needed by your application.