package jsbook.chapter11.crypt;

import jsbook.util.SpaceAccessor;

import java.applet.Applet;
import java.rmi.RemoteException;

import net.jini.core.entry.*;
import net.jini.core.lease.Lease;
import net.jini.core.transaction.*;
import net.jini.space.JavaSpace;

public abstract class GenericMaster extends Applet {
    protected JavaSpace space;

    public void init() {
        space = SpaceAccessor.getSpace();
        
        GenerateThread gThread = new GenerateThread();
        gThread.start();
        CollectThread cThread = new CollectThread();
        cThread.start();
    }

    protected abstract void generateTasks();

    protected abstract void collectResults();


        protected void writeTask(TaskEntry task) {
            try {
                    space.write(task, null, Lease.FOREVER);
            } catch (RemoteException e) {
                    e.printStackTrace();
            } catch (TransactionException e) {
                    e.printStackTrace();
            }
        }
        
        protected Entry takeTask(Entry template) {
            try {
                    Entry result =
                        (Entry) space.take(template, null, Long.MAX_VALUE);
                    return result;
            } catch (RemoteException e) {
                    e.printStackTrace();
            } catch (TransactionException e) {
                    e.printStackTrace();
            } catch (UnusableEntryException e) {
                    e.printStackTrace();
            } catch (InterruptedException e) {
                    System.out.println("Task cancelled");
            }
            return null;
        }
    
    private class GenerateThread extends Thread {
        public void run() {
            generateTasks();
        }
    }
    
    private class CollectThread extends Thread {
        public void run() {
            collectResults();
        }
    }   
}
