DISTRIBUTED ARRAYS

Frans Coenen

1. INTRODUCTION

Distributed data structures are similar to their standard counter parts except that the elements comprise entries. The simplest distributed data structure we can create is the shared variable (use of such a variable was described in the extended "Hello World" program.

A distributed array comprises a sequence of entries each describing a shared variable. Because the elements are entries they can be accessed independently, i.e. we do not need to take the entire array out of the space to change an element, but only the element in question.




2. DISTRRIBUTED ARRAY ENTRY CLASSES

Table 1 shows an appropriatly defined distributed integer array entry class. The entry comprises three fields:

  1. name: The name of the distributed array (we may have more than one).
  2. : The index for the element.
  3. : The contents/value of the element.
import net.jini.core.entry.*;

/* ------------------------------------------------ */
/*                                                  */
/*                ARRAY ELEMENT CLASS               */
/*                                                  */
/* ------------------------------------------------ */

public class Element implements Entry {

    /* --- FIELDS --- */

    public String  name;
    public Integer index;
    public Integer value;
    
    /* --- CONSTRUCTORS --- */

    public Element() {
        }

    public Element(String name) {
    	this.name  = name;
	}
	
    public Element(String name, int index, int startValue) {
    	this.name  = name;
	this.index = new Integer(index);
	this.value = new Integer(startValue);
	}
    }

Table 1: Element entry class (based on that contained in Freeman et al., 1999).

Traditionally we also have some meta knoqwledge to hand describing things such as the length of the array. The entry class in Table 2 defines an entry that describes meta knowledge about distributed arrays.

	
import net.jini.core.entry.*;

/* -------------------------------------------- */
/*                                              */
/*                META DATA CLASS               */
/*                                              */
/* -------------------------------------------- */

/* Class to store meta information about an array. */

public class ArrayMetaData implements Entry {

    /* --- FIELDS --- */

    public String  name;
    public Integer length;
    
    /* --- CONSTRUCTORS --- */
    
    public ArrayMetaData() {
        }

    public ArrayMetaData(String name) {
    	this.name       = name;
	}
	
    public ArrayMetaData(String name, int len) {
    	this.name       = name;
	this.length     = new Integer(len);
	}
    }

Table 2: ArrayMetaData entry classes




3. DISTRIBUTED ARRAY APPLICATION

The code presented in Table 3 creates two distributed arrays, one called data1 and one called data2 of lengths 5 and 10 respectively. Some output is presented in Table 4.

/* ---------------------------------------------------------- */
/*                                                            */
/*                 DISTRIBUTED ARRAY APPLICATION              */
/*                                                            */
/* ---------------------------------------------------------- */

// JavaSpacesUtil package

import JavaSpacesUtils.SpaceAccessor;

// Jini core packages

import net.jini.core.lease.*;
import net.jini.core.entry.*;
import net.jini.core.transaction.*;

// RMI packages

import java.rmi.*;

// Jini extension package

import net.jini.space.JavaSpace;

public class DistribArrayApp {

    /* ------ FIELDS ------ */
    
    public static final int ARRAY_LENGTH  = 10;
    public static final String ARRAY_NAME = "data_array";
    public static JavaSpace space;
    	
    /* ------ METHODS ------ */
        
    /* MAIN */
    
    public static void main(String[] args) {
        System.out.println("START");
		 
        // try block
        try {
	    // Get JavaSpace     
	    SpaceAccessor newSpaceAccessor = new 
	    		SpaceAccessor("/home/staff5/ra/frans/JavaProgs/" +
				"JavaSpaces/JavaSpacesUtils/frans_space.prop");
	    space = newSpaceAccessor.getSpace();
	    // Create distributed array objects and write into space
	    createArray("data1",5);
	    createArray("data2",10);
	    // Read distributed arrays
	    readArray("data1");
	    readArray("data2");
	    }
	// Catch block
	catch(Exception e) {
	    e.printStackTrace();
	    }
        
	// End
	System.out.println("END");
	System.exit(0);
	}
        
    /* CREATE ARRAY */
    
    private static void createArray(String name, int length) throws 
    			TransactionException,RemoteException {
    
        // Create distributed array object entry and write into space
	
	System.out.print("Create ArrayMetaData entry: ");
	ArrayMetaData newMetaData = new ArrayMetaData(name,length);
	System.out.println("name = " + newMetaData.name +
			", length = " + newMetaData.length);
	space.write(newMetaData,null,Lease.FOREVER);
	
	// Create data elements
	
	for (int index=0;index < length;index++) {
	    System.out.println("Create Element entry " + index);
	    Element newElement = new Element(name,index,index);
	    space.write(newElement,null,Lease.FOREVER);
	    }
	}
    
    /* READ ARRAY */
    
    public static void readArray(String name) throws UnusableEntryException,
    		TransactionException, InterruptedException, RemoteException {
        
	System.out.println("Read array " + name);
	
	// Get array length
	
	ArrayMetaData template1 = new ArrayMetaData(name);
	ArrayMetaData result1 = (ArrayMetaData) space.read(template1,null,
		Long.MAX_VALUE);
	
	// Read elements
	
	Element template2 = new Element(name);
        for (int index=0;index < result1.length.intValue();index++) {
	    template2.index = new Integer(index);
	    Element result2 = (Element) space.read(template2,null,
	    			Long.MAX_VALUE);
	    System.out.println("Element (" + index + ") = " + result2.value);
	    }
 	}
    }

Table 3: Distributed array application

$ ./javaRun DistribArrayApp
START
jiniURL   = jini://linux10
spaceName = frans_space
Create ArrayMetaData entry: name = data1, length = 5
Create Element entry 0
Create Element entry 1
Create Element entry 2
Create Element entry 3
Create Element entry 4
Create ArrayMetaData entry: name = data2, length = 10
Create Element entry 0
Create Element entry 1
Create Element entry 2
Create Element entry 3
Create Element entry 4
Create Element entry 5
Create Element entry 6
Create Element entry 7
Create Element entry 8
Create Element entry 9
Read array data1
Element (0) = 0
Element (1) = 1
Element (2) = 2
Element (3) = 3
Element (4) = 4
Read array data2
Element (0) = 0
Element (1) = 1
Element (2) = 2
Element (3) = 3
Element (4) = 4
Element (5) = 5
Element (6) = 6
Element (7) = 7
Element (8) = 8
Element (9) = 9
END

Table 4: Result if running the code presented in Table 3