Version 44

    How to port JGroups J2SE to work on J2ME (with bluetooth consideration)

     

    Much of JGroups can be used on CLDC devices.  You'll need to obtain Sun

    Microsystems WTK (wireless toolkit) from here.  Maybe you know this already, maybe

    not... I'm just trying to be complete so you can get started without

    problems.  To be honest you don't even need real devices to test everything since you can run multiple instances of the WTK emulator and test your

    code like that.  You may even be testing with the emulator more often

    than on real devices.  It is (of course) nice to have real

    devices available since the rubber needs to meet the road at some

    point.

     

    I've played with version 2.5.1 of the wireless toolkit a little and it's important to note that if you

    are going to use the Linux version you should have a Linux that uses

    GLIBC 2.4.  Otherwise, you better get the Windows version.  I've

    learned this from experience (the Debian

    Etch system I use doesn't have GLIBC 2.4 on it yet).  Well, I mostly use WTK 2.2 on FreeBSD and to be honest 2.2 should suffice -

    after all... there are bluetooth samples provided with WTK 2.2.

     

    Also, you should be aware that JGroups-ME is distributed as a patch to

    JGroups, no matter which platform you'll be using (Windows or Linux)

    you should have the 'patch' program available.  Most Linux

    distributions include 'patch'; on Windows you can install

    'patch' by way of cygwin.  If you prefer, you can use a unix machine to

    patch the sources and then copy the patched code onto your Windows

    computer.  In addition you'll need to have a 'cvs' client program and apache 'ant' too.

     

    Now, after you've got your WTK installed you can start playing with

    JGroups-ME.  Let me give you some background...  there is no

    JGroups-ME code per se.  Wait, that doesn't make sense!!!  Yes, there

    is JGroups-ME code... but it may not be what you think it is.  The

    JGroups-ME code can be thought of as a 'portability' or 'compatibility' layer that

    enables JGroups code to work with J2ME.

     

    I'm not sure if you are aware of this, but J2ME is somewhat different

    from J2SE.  That is, J2ME does not provide all the goodies that

    regular Java (i.e. J2SE) does... after all it's meant to run on rather

    limited systems (e.g. cell-phones, set-top boxes, microwave ovens and

    toasters) not on full blown general purpose computers.  As such,

    most of Bela's JGroups code won't work on your cell-phone

    without a little help, that's where JGroups-ME steps in.

     

    In a nutshell, all that JGroups-ME does is provide an infrastructure of the objects and interfaces of J2SE that are not available or differ in J2ME.  For

    example, the 'vector' class in J2ME is more limited than that of

    J2SE.  So, JGroups-ME provides its own vector class...

    'bridge.java.util.Vector' that more closely resembles the Vector

    provided by J2SE.  The JGroups code is then patched to import

    'bridge.java.util.Vector' rather than 'java.util.Vector' and viola, all

    of a sudden the JGroups code works on J2ME.  The vast majority of

    JGroups-ME consists of these kinds of infrastructure wrappers.

     

    Now, back to getting you started...  okay, you've got the WTK and you

    have SUN's JDK installed as well as having 'cvs', 'patch' and

    finally apache 'ant'.

     

    We're basically ready to roll.  You should start by reading the JGroups-ME readme.txt located here.  As the readme.txt file indicates, the first thing you want to do is get a version of JGroups from cvs.  JGroups-ME is known to work with a number of JGroups versions, but you should probably stick with the version recommended by the readme.txt file.

     

    Grab the JGroups code from cvs, e.g. to get version 2.3 you can use the following command:

     

    cvs -z3 -d:pserver:anonymous@javagroups.cvs.sourceforge.net:/cvsroot/javagroups co -rJGroups_2_3 -P JGroups

     

    Yes, you'll need the 'cvs' program available.  You could download

    JGroups from the sourceforge download area but JGroups-ME is only

    available via cvs... sorry.  Again, cvs can be installed via cygwin.  Or, you can use a unix machine that has cvs installed to obtain the

    code and then copy the code to your Windows computer.

     

    Now grab the latest JGroups-ME/CLCD11 code, e.g.:

     

    cvs -z3 -d:pserver:anonymous@javagroups.cvs.sourceforge.net:/cvsroot/javagroups co -P JGroups-ME/CLDC11

     

    Since you just grabbed the code, you can skip the

    first two steps listed in the readme.txt and continue by removing the

    class mappings.  JGroups-ME doesn't use class mappings so you should

    build both the J2SE and J2ME binaries with an empty jg-magic-map.xml

    file, i.e. delete everything in between "<magic-number-class-mapping>"

    and "</magic-number-class-mapping>" from the jg-magic-map.xml file

    before building your programs.  Proceed by performing the remaining steps outlined in the readme.txt.

     

    Since bluetooth is not yet supported by JGroups, the next step is to figure out how to incorporate it.  As I understand it, getting JGroups-ME working with

    bluetooth will consist of at least two things....

     

    First off, you'll need to make sure that the J2ME device can act as a

    'GossipRouter' (I don't think this is the case right now since

    JGroups-ME devices always act as a 'client' and the GossipRouter always

    resides on a 'central' J2SE enabled server).

     

    Then, you'll need to provide a mechanism to initialize JGroups-ME in

    a bluetooth context.  My best guess is that the protocol string which

    initializes a JChannel will need some specifier to indicate bluetooth

    parameters.  The underlying code will need to handle that

    specifier so that the connection is created using JSR-82.  It seems to

    me that in order to use JGroups-ME over bluetooth there will be more

    code written to prepare the protocol string and just a bit of code

    that will reside in JGroups to handle that protocol string.

     

    Of course this is were the real work begins and I'm sure you'll

    discover more as you work towards your goal.  Once you're comfortable

    with the overall process you can begin to think about adding bluetooth support.

     

    If you are feeling overwhelmed, concentrate on familiarizing yourself with how JGroups and JGroups-ME work together.  It's really not as daunting as it may seem.  Then, when you've tried the chat sample and you are comfortable with JGroups-ME, you can consider how bluetooth will fit into the picture.

     

    In summary, the requirements to get started are:

     

    • Sun's JDK

    • Sun's WTK

    • cvs

    • patch

    • apache ant

     

    Then:

     

    • grab JGroups from cvs

    • grab JGroups-ME/CLDC11 from cvs

    • remove class mappings from jg-magic-map.xml

    • build J2SE version (i.e. 'ant jar' from command prompt)

    • link/copy J2SE files into JGroups-ME using JGroups-ME/CLDC11/src/org/jgroups/link_src.pl as a guide

    • patch J2SE code using 'patch' with one of the patches available from JGroups-ME/CLDC11/src/org/jgroups

    • change the initProt method in aMidlet.java to match your network setup (that is, you may need to change the sample code to use IP address(es) from your network, rather than 'localhost' which is hardcoded in the chat demo)

    • build the J2ME version of JGroups from the newly patched code (using the wireless toolkit)

    • start the J2SE GossipRouter

    • increase the heap size in the WTK emulator

    • try out the JGroups-ME chat demo (i.e. aMidlet.java) using the wireless emulator

     

    Now real work begins:

     

    • get a J2ME GossipRouter working

    • crow-bar bluetooth in somehow

     

    If you have questions or need help, let me know.