A. Przykład wykorzystania biblioteki JODL

Najprostszy sposób wykorzystania biblioteki JODL wymaga użycia jedynie dwóch klas. Zadanie realizowane w tym przykładzie to generowanie dużych liczb pierwszych. Tworzone liczby są zadanej długości oraz są pierwsze z prawdopodobieństwem nie mniejszym od zadanego[*]. Klasa GenerateAPrime realizująca zadanie jest przedstawiona na wydruku A.1. Ponieważ dziedziczy ona po klasie TaskAdapter, zamiast bezpośrednio implementować interfejs Task, są w niej zdefiniowane jedynie metody doIt() oraz size().

Metoda doIt() wczytuje z bazy danych parametry generowanej liczby (wartości bits i certainty), w pętli tworzy kolejne liczby o zadanej długości, aż utworzona liczba będzie pierwsza z zadanym prawdopodobieństwem, po czym zapisuje wygenerowaną liczbę do bazy danych. Metoda przekazuje wartość false, jeśli wystąpił jakiś błąd (klauzula catch), w przeciwnym wypadku przekazuje wartość true.

Metoda size() przekazuje iloczyn długości liczby oraz prawdopodobieństwa, że jest ona pierwsza. Spodziewany czas wygenerowania odpowiedniej liczby rośnie wraz z wartością tego iloczynu.

Wydruk A.1: Klasa GenerateAPrime
package jodl.example.prime;

import jodl.task.TaskAdapter;
import jodl.db.SQL;
import jodl.util.*;

import java.sql.Connection;
import java.math.BigInteger;
import java.util.*;

public class GenerateAPrime extends TaskAdapter {

  int bits = 1;
  int certainty = 1;

  public boolean doIt()
  {
    try {
      String[] val = SQL.getRow(dbConnection,
        "select bits, certainty from prime where prime_id = " + taskId);

      bits = Conv.string2int(val[0]);
      certainty = Conv.string2int(val[1]);

      BigInteger bigint;

      do {
        bigint = new BigInteger(bits,
          new Random((new Date()).getTime()));
      } while (!bigint.isProbablePrime(certainty));

      SQL.execute(dbConnection,
        "update prime set number = '" + bigint +
        "' where prime_id = " + taskId);

      return true;
    } catch (Exception e) {
      return false;
    }
  }

  public int size()
  {
    return bits*certainty;
  }

}

Drugą klasą niezbędną do uruchomienia przykładu jest klasa Primes (wydruk A.2). Pokazuje ona sposób zainicjowania i uruchomienia biblioteki JODL i jej głównego elementu, klasy Server. Wywołanie metody run() powoduje wykonanie wszystkich zadań z rodziny jodl_example_prime. Po zakończeniu jej działania wyświetlane są wygenerowane przez klasę GenerateAPrime liczby.

Wydruk A.2: Klasa Primes
package jodl.example.prime;

import jodl.server.*;
import jodl.task.*;
import jodl.db.*;

import java.sql.*;

public class Primes {

  public static void main(String[] args)
  {
    try {

      Server server = new Server(args);
      Family primes = server.getFamilyInstance("jodl_example_prime");
      server.run(primes);

      String[] numbers = SQL.getArray(server.getDBConnection(),
        "select number from prime");
      for (int i = 0; i < numbers.length; i++)
        System.out.println(numbers[i]);

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Aby uruchomić zaprezentowany w tym dodatku przykład, należy między innymi odpowiednio skonfigurować bazę danych, tak aby zawierała informacje o zadaniach z rodziny jodl_example_prime. Szczegółowe instrukcje uruchomienia tego przykładu oraz niezbędne pliki można znaleźć na stronie biblioteki JODL pod adresem http://www.cern.ch/slopiens/jodl.
Sebastian Łopieński