The code

First, here's a simple non-Jtrix application:


package org.jtrix.project.documentation.embeddedapp;

import java.net.*;
import java.io.*;
import java.util.Date;

/**
 * Class that uses ordinary system resources, so we can try to
 * embed it into Jtrix.
 */

public class ResourceUser
{
    private static String _WEB_PAGE = "http://www.jtrix.org/index.htm";

    public static void main(String[] args)
    {
        try
        {
            InputStream is = (new URL(_WEB_PAGE)).openStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            FileWriter file = new FileWriter("/myhome/output."
                                             +(new Date()).getTime()+".html");
            String line;
            while ((line = br.readLine()) != null)
            {
                file.write(line+"\n");
            }
            file.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

    } // main(String[])

} // ResourceUser

It is designed deliberately to use networking and disk space. Note that it also expects to have a directory called /myhome. It could expect anything. We just need to make sure that when we map some disk space onto something called /myhome for our application.

Here is the netlet which embeds the ResourceUser:


package org.jtrix.project.documentation.embeddedapp;

import org.jtrix.base.*;
import org.jtrix.facets1.node.ITrampolineFacet;
import org.jtrix.facets1.node.ISocketFactory;
import org.jtrix.project.nodality.facet.INodeResourceFacet;
import org.jtrix.facets1.util.io.IFileSystem;

/**
 * A netlet which demonstrates use of an external application.
 * Note this is specific to Nodality. Ordinarily an application
 * would expect to have resources provided by its hosting service.
 */

public class EmbeddedAppNetlet implements INetlet
{
    /** Initialise and execute the program. First we get a socket
     * factory and a filesystem which the program is going to use.
     * Then we can just execute the program. */

    public byte[] initialise (INode node, Object bean, byte[] untrusted)
        throws InitialiseException
    {
        try
        {
            String tf_name = ITrampolineFacet.class.getName();
            String fs_name = IFileSystem.class.getName();
            String rf_name = INodeResourceFacet.class.getName();

            // Use sockets

            ITrampolineFacet tf = (ITrampolineFacet) node.bindFacet(tf_name);
            ISocketFactory sf = tf.getDefaultSocketFactory();
            tf.setSocketFactory(sf);

            // Use files. Read-only = false

            INodeResourceFacet rf
                = (INodeResourceFacet) node.bindFacet(rf_name);
            INodeResourceFacet.IAccountedFileSystem tfs
                = rf.createFileSystem("/tmp", false);
            tf.mountFileSystem("/myhome",tfs.getFileSystem());

            // Run external program

            ResourceUser.main(new String[]{});

            tf.unmountFileSystem("/myhome");
            return null;
        }
        catch (Throwable e)
        {
            e.printStackTrace();
            throw new InitialiseException("Couldn't run netlet");
        }

    } // initialise

    /** Terminate; no actions required. We're 100% done as soon as we enter! */

    public void terminate(long expiry, INetlet.IShutdownProgress progress)
    {
        progress.performed(100);
    }

    /** We offer any service connections. */

    public IService bindService(Warrant w, IService s)
        throws ServiceBindException
    {
        throw new ServiceBindException("No services supported");
    }

    /** We offer no facets. */

    public String[] getFacets()
    {
        return new String[]{ };
    }

    public IRemote bindFacet(String facet_name)
        throws FacetBindException
    {
        throw new FacetBindException("Don't support facet "+facet_name);
    }

} // EmbeddedAppNetlet

It simply assigns some resources, making sure the disk space maps to /myhome.

Nik Silver 2002-03-09