import cornell.slk.jkernel.core.Capability;
import cornell.slk.jkernel.core.Task;
import cornell.slk.jkernel.core.SharedClass;
import cornell.slk.jkernel.core.Resolver;
import cornell.slk.jkernel.std.Start;
import cornell.slk.jkernel.util.TableResolver;
import cornell.slk.jkernel.util.CompoundResolver;

public class Hello
{
    public static void main(String[] args)
        throws Exception
    {
        System.out.println("Hello.");

        Counter target = new CounterImpl();
        Capability cap = Capability.create(target);

        // Share the classes Counter, IntHolder, and ArgTest:
        TableResolver sharedResolver = new TableResolver()
            .setMapping("Counter", Task.shareClass("Counter"))
            .setMapping("IntHolder", Task.shareClass("IntHolder"))
            .setMapping("ArgTest", Task.shareClass("ArgTest"))
            ;

        // Create a resolver for the new task:
        Resolver childResolver = new CompoundResolver(
            new Resolver[] {
                Start.data.standardResolver,
                sharedResolver,
                Start.data.mainResolver
            });

        // Create the child task:
        Task child = new Task(childResolver);

        // Seed the child task with an ArgTestImpl object,
        // and get the capability for this object:
        ArgTest argTest = (ArgTest) child.seed("ArgTestImpl");

        // Create a Counter capability:
        CounterImpl counterImpl = new CounterImpl();
        Counter counter = (Counter) Capability.create(counterImpl);

        // Create an IntHolder object:
        IntHolder intHolder = new IntHolder();

        // Make a cross-task call into argTest:
        argTest.invoke(counter, intHolder);

        // See what effect argTest had on counter:
        System.out.println("counter:");
        System.out.println(counter.incrementCount());
        System.out.println(counter.incrementCount());
        System.out.println(counter.incrementCount());

        // See what effect argTest had on intHolder:
        System.out.println("intHolder:");
        System.out.println(intHolder.incrementCount());
        System.out.println(intHolder.incrementCount());
        System.out.println(intHolder.incrementCount());
    }
}
