changeset 118:2a64c13e743a

merge
author kazz
date Wed, 08 Feb 2012 18:02:40 +0900
parents fce61ee25d20 (current diff) 4150c16e93fd (diff)
children 49e7f02f0063 0706e989bc47
files StartFDLindaServ2.py StopProcess.py pexpect.py src/fdl/test/metaTransfer/FDLServWithSend.java src/fdl/test/metaTransfer/MetaProtocolEngine.java src/fdl/test/metaTransfer/MetaProtocolEngine_not.java src/fdl/test/metaTransfer/Ring/FDLServWithSend.java src/fdl/test/metaTransfer/Ring/MetaProtocolEngine.java src/fdl/test/metaTransfer/Ring/Server.java src/fdl/test/metaTransfer/Ring/TestSend.java src/fdl/test/metaTransfer/Ring/TestTransfer.java src/fdl/test/metaTransfer/Ring/TestTransferRing.java src/fdl/test/metaTransfer/Ring/TestTransferThree.java src/fdl/test/metaTransfer/Server.java src/fdl/test/metaTransfer/TestSend.java src/fdl/test/metaTransfer/TestTransfer.java src/fdl/test/transfer/ProtocolEngine.java src/fdl/test/transfer/Server.java src/fdl/test/transfer/TestSend.java src/fdl/test/transfer/TestTransfer.java src/fdl/test/transfer/cluster/FDLServWithSendMeta.java src/fdl/test/transfer/cluster/HostCheck.java src/fdl/test/transfer/cluster/MetaProtocolEngine.java src/fdl/test/transfer/cluster/ProtocolEngine.java src/fdl/test/transfer/cluster/ProtocolEngineMain.java src/fdl/test/transfer/cluster/Server.java src/fdl/test/transfer/cluster/ServerMain.java src/fdl/test/transfer/cluster/TestGet.java src/fdl/test/transfer/cluster/TestSend.java src/fdl/test/transfer/three/ProtocolEngine.java src/fdl/test/transfer/three/Server.java src/fdl/test/transfer/three/TestGet.java src/fdl/test/transfer/three/TestSend.java src/fdl/test/transfer/three/TestTransfer.java src/fdl/test/transfer/two/ProtocolEngine.java src/fdl/test/transfer/two/Server.java src/fdl/test/transfer/two/TestGet.java src/fdl/test/transfer/two/TestSend.java src/fdl/test/transfer/two/TestTransfer.java src/fdl/test2/CountTest.java src/fdl/test2/Server.java src/fdl/test2/TestRead.java src/fdl/test2/TestRing.java src/fdl/test2/client.java src/fdl/test2/nodelist
diffstat 151 files changed, 7533 insertions(+), 3406 deletions(-) [+]
line wrap: on
line diff
--- a/.classpath	Wed Feb 08 18:02:00 2012 +0900
+++ b/.classpath	Wed Feb 08 18:02:40 2012 +0900
@@ -2,6 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/protobuf-java-2.3.0.jar"/>
+	<classpathentry kind="lib" path="lib/junit.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
--- a/StartFDLindaServ2.py	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-#! /usr/bin/env python
-"""start process
-"""
-import pexpect
-import re
-import time
-import sys
-import os
-
-def main(base_port, ldserv_num):
-
-    if not os.environ.has_key('LDSERV'):
-        ldserv = "java -classpath FedLinda.jar fdl.FDLindaServ"
-    else:
-        ldserv = os.environ['LDSERV']
-
-    for num in range(0,ldserv_num):
-        cmd = "".join([ldserv + ' -p ' + str(base_port+num) + ' &'])
-        os.system(cmd)
-        print 'start :', cmd
-
-
-if __name__ == "__main__":
-
-    if (len(sys.argv) != 3):
-        print 'Usage : %s <base_port> <ldserv_number>' % sys.argv[0]
-        sys.exit(1)
-
-    main(int(sys.argv[1]), int(sys.argv[2]))
--- a/StopProcess.py	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-#! /usr/bin/env python
-"""find and kill processes
-"""
-import pexpect
-import re
-import sys
-import os
-
-def main(proc):
-    child = pexpect.spawn('ps aucxwww')
-    child.setwinsize(100,300)
-    child.expect(pexpect.EOF)
-
-    pslist =  child.before.splitlines()
-    # separate string by space
-    fmt = re.split(' +', pslist[0])
-
-    if fmt[-1] == '':
-        fmt.pop()
-    if fmt[0] == '':
-        fmt.pop(0)
-    lenfmt = len(fmt)
-
-    # indexing, key is format of output of ps command, value is number of list
-    index = dict([(k,v) for (k,v) in zip(fmt, range(0,lenfmt))])
-
-    # find ".*<processname>.*" in 'COMMAND' part
-    pars = re.compile(".*"+proc+".*")
-    
-    for l in pslist[1:]:
-        elm = re.split(' +',l ,lenfmt)
-        cmd = elm[index['COMMAND']]
-        result = pars.match(cmd)
-
-        if (result is not None):
-            os.system('kill -KILL ' + elm[index['PID']])
-            print 'stop', elm[index['PID']], ':', cmd
-
-
-if __name__== "__main__":
-    if (len(sys.argv) != 2):
-        print "Usage : %s <process_name>" % sys.argv[0]
-        sys.exit(1)
-
-    main(sys.argv[1])
-
--- a/build.xml	Wed Feb 08 18:02:00 2012 +0900
+++ b/build.xml	Wed Feb 08 18:02:40 2012 +0900
@@ -18,7 +18,9 @@
   <!-- ****ターゲット**** -->
   <!-- jarファイルの作成 -->
   <target name="jar" depends="compile">
-    <jar jarfile="${jar}" basedir="${classes}"></jar>
+    <jar jarfile="${jar}" basedir="${classes}">
+        <zipgroupfileset dir="lib" includes="*.jar" />
+	</jar>
   </target>
 
 
@@ -27,6 +29,10 @@
     <mkdir dir="${classes}" />
     <javac encoding="UTF-8" srcdir="src" destdir="${classes}" fork="yes">
         <compilerarg value="-J-Dfile.encoding=UTF8"/>
+    	<classpath>
+    		<pathelement path="lib/protobuf-java-2.3.0.jar" />
+    		<pathelement path="lib/junit.jar" />
+    	</classpath>
         <sourcepath>
          <pathelement path="src"/>
         </sourcepath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/document/License.txt	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,10 @@
+Entire source code 's license is under
+
+    GNU Lesser General Public License v2 (LGPLv2)
+
+    http://www.gnu.org/licenses/lgpl-2.1.html
+
+Shinji KONO
+    kono@ie.u-ryukyu.ac.jp
+    Sun Oct  2 15:28:13 JST 2011
+
Binary file lib/junit.jar has changed
Binary file lib/protobuf-java-2.3.0.jar has changed
--- a/pexpect.py	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1203 +0,0 @@
-"""Pexpect is a Python module for spawning child applications;
-controlling them; and responding to expected patterns in their output.
-Pexpect can be used for automating interactive applications such as
-ssh, ftp, passwd, telnet, etc. It can be used to a automate setup scripts
-for duplicating software package installations on different servers.
-It can be used for automated software testing. Pexpect is in the spirit of
-Don Libes' Expect, but Pexpect is pure Python. Other Expect-like
-modules for Python require TCL and Expect or require C extensions to
-be compiled. Pexpect does not use C, Expect, or TCL extensions. It
-should work on any platform that supports the standard Python pty
-module. The Pexpect interface focuses on ease of use so that simple
-tasks are easy.
-
-There are two main interfaces to Pexpect. You can call the function:
-        pexpect.run()
-to execute a command and return the output.
-Do no use this on interactive commands that expect input.
-This is a handy replacment for os.system().
-The more useful interface is the class:
-        pexpect.spawn()
-This creates a spawn instance. This will start the command that you specify.
-You can then interact with the child command through the spawn instance.
-Most commands, including ssh, cannot tell that they are being run inside
-of a script. This works even for commands that ask for passwords or
-other input outside of the normal stdio streams.
-
-Pexpect is Open Source, Free, and all that good stuff.
-License: Python Software Foundation License
-         http://www.opensource.org/licenses/PythonSoftFoundation.html
-
-Noah Spurrier
-Richard Holden
-Marco Molteni
-Kimberley Burchett 
-Robert Stone
-Mike Snitzer
-Marti Raudsepp
-Matt <matt (*) corvil.com>
-Hartmut Goebel
-Chad Schroeder
-Erick Tryzelaar
-Dave Kirby
-Ids vander Molen
-George Todd
-Noel Taylor
-Nicolas D. Cesar
-(Let me know if I forgot anyone.)
-
-$Revision: 1.1.1.1 $
-$Date: 2006/04/01 06:03:29 $
-"""
-
-try:
-    import os, sys, time
-    import select
-    import string
-    import re
-    import struct
-    import resource
-    import types
-    import pty
-    import tty
-    import termios
-    import fcntl
-    import errno
-    import traceback
-    import signal
-except ImportError, e:
-    raise ImportError (str(e) + """
-A critical module was not found. Probably this operating system does not support it.
-Pexpect is intended for UNIX-like operating systems.""")
-
-__version__ = '2.0'
-__revision__ = '$Revision: 1.1.1.1 $'
-__all__ = ['ExceptionPexpect', 'EOF', 'TIMEOUT', 'spawn', 'run', 'which', 'split_command_line',
-    '__version__', '__revision__']
-
-# Exception classes used by this module.
-class ExceptionPexpect(Exception):
-    """Base class for all exceptions raised by this module.
-    """
-    def __init__(self, value):
-        self.value = value
-    def __str__(self):
-        return str(self.value)
-    def get_trace(self):
-        """This returns an abbreviated stack trace with lines that only concern the caller.
-        In other words, the stack trace inside the Pexpect module is not included.
-        """
-        tblist = traceback.extract_tb(sys.exc_info()[2])
-        tblist = filter(self.__filter_not_pexpect, tblist)
-        tblist = traceback.format_list(tblist)
-        return ''.join(tblist)
-    def __filter_not_pexpect(self, trace_list_item):
-        if trace_list_item[0].find('pexpect.py') == -1:
-            return 1
-        else:
-            return 0
-class EOF(ExceptionPexpect):
-    """Raised when EOF is read from a child.
-    """
-class TIMEOUT(ExceptionPexpect):
-    """Raised when a read time exceeds the timeout.
-    """
-##class TIMEOUT_PATTERN(TIMEOUT):
-##    """Raised when the pattern match time exceeds the timeout.
-##    This is different than a read TIMEOUT because the child process may
-##    give output, thus never give a TIMEOUT, but the output
-##    may never match a pattern.
-##    """
-##class MAXBUFFER(ExceptionPexpect):
-##    """Raised when a scan buffer fills before matching an expected pattern."""
-
-def run (command, timeout=-1, withexitstatus=0, events=None, extra_args=None):
-    """This function runs the given command; waits for it to finish;
-    then returns all output as a string. STDERR is included in output.
-    If the full path to the command is not given then the path is searched.
-
-    Note that lines are terminated by CR/LF (\\r\\n) combination
-    even on UNIX-like systems because this is the standard for pseudo ttys.
-    If you set withexitstatus to true, then run will return a tuple of
-    (command_output, exitstatus). If withexitstatus is false then this
-    returns just command_output.
-
-    Examples:
-    Start the apache daemon on the local machine:
-        from pexpect import *
-        run ("/usr/local/apache/bin/apachectl start")
-    Check in a file using SVN:
-        from pexpect import *
-        run ("svn ci -m 'automatic commit' my_file.py")
-    Run a command and capture exit status:
-        from pexpect import *
-        (command_output, exitstatus) = run ('ls -l /bin', withexitstatus=1)
-
-    Tricky Examples:   
-    The following will run SSH and execute 'ls -l' on the remote machine.
-    The password 'secret' will be sent if the '(?i)password' pattern is ever seen.
-        run ("ssh username@machine.example.com 'ls -l'", events={'(?i)password':'secret\n'})
-
-    This will start mencoder to rip a video from DVD. This will also display
-    progress ticks every 5 seconds as it runs.
-        from pexpect import *
-        def print_ticks(d):
-            print d['event_count'],
-        run ("mencoder dvd://1 -o video.avi -oac copy -ovc copy", events={TIMEOUT:print_ticks}, timeout=5)
-
-    The 'events' argument should be a dictionary of patterns and responses.
-    Whenever one of the patterns is seen in the command out
-    run() will send the associated response string. Note that you should
-    put newlines in your string if Enter is necessary.
-    The responses may also contain callback functions.
-    Any callback is function that takes a dictionary as an argument.
-    The dictionary contains all the locals from the run() function, so
-    you can access the child spawn object or any other variable defined
-    in run() (event_count, child, and extra_args are the most useful).
-    A callback may return True to stop the current run process otherwise
-    run() continues until the next event.
-    A callback may also return a string which will be sent to the child.
-    'extra_args' is not used by directly run(). It provides a way to pass data to
-    a callback function through run() through the locals dictionary passed to a callback.
-    """
-    if timeout == -1:
-        child = spawn(command, maxread=2000)
-    else:
-        child = spawn(command, timeout=timeout, maxread=2000)
-    if events is not None:
-        patterns = events.keys()
-        responses = events.values()
-    else:
-        patterns=None # We assume that EOF or TIMEOUT will save us.
-        responses=None
-    child_result_list = []
-    event_count = 0
-    while 1:
-        try:
-            index = child.expect (patterns)
-            if type(child.after) is types.StringType:
-                child_result_list.append(child.before + child.after)
-            else: # child.after may have been a TIMEOUT or EOF, so don't cat those.
-                child_result_list.append(child.before)
-            if type(responses[index]) is types.StringType:
-                child.send(responses[index])
-            elif type(responses[index]) is types.FunctionType:
-                callback_result = responses[index](locals())
-                sys.stdout.flush()
-                if type(callback_result) is types.StringType:
-                    child.send(callback_result)
-                elif callback_result:
-                    break
-            else:
-                raise TypeError ('The callback must be a string or function type.')
-            event_count = event_count + 1
-        except TIMEOUT, e:
-            child_result_list.append(child.before)
-            break
-        except EOF, e:
-            child_result_list.append(child.before)
-            break
-    child_result = ''.join(child_result_list)
-    if withexitstatus:
-        child.close()
-        return (child_result, child.exitstatus)
-    else:
-        return child_result
-
-class spawn:
-    """This is the main class interface for Pexpect.
-    Use this class to start and control child applications.
-    """
-
-    def __init__(self, command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None):
-        """This is the constructor. The command parameter may be a string
-        that includes a command and any arguments to the command. For example:
-            p = pexpect.spawn ('/usr/bin/ftp')
-            p = pexpect.spawn ('/usr/bin/ssh user@example.com')
-            p = pexpect.spawn ('ls -latr /tmp')
-        You may also construct it with a list of arguments like so:
-            p = pexpect.spawn ('/usr/bin/ftp', [])
-            p = pexpect.spawn ('/usr/bin/ssh', ['user@example.com'])
-            p = pexpect.spawn ('ls', ['-latr', '/tmp'])
-        After this the child application will be created and
-        will be ready to talk to. For normal use, see expect() and 
-        send() and sendline().
-
-        The maxread attribute sets the read buffer size.
-        This is maximum number of bytes that Pexpect will try to read from a TTY at one time.
-        The default buffer size is 1 (unbuffered). Setting this value higher
-        will help performance in cases where large amounts of output are read back from the child.
-        This feature is useful in conjunction with searchwindowsize.
-        
-        The searchwindowsize attribute sets the how far back in
-        the incomming seach buffer Pexpect will search for pattern matches.
-        Every time Pexpect reads some data from the child it will append the data to
-        the incomming buffer. The default is to search from the beginning of the
-        imcomming buffer each time new data is read from the child.
-        But this is very inefficient if you are running a command that
-        generates a large amount of data where you want to match
-        The searchwindowsize does not effect the size of the incomming data buffer.
-        You will still have access to the full buffer after expect() returns.
-        
-        The logfile member turns on or off logging.
-        All input and output will be copied to the given file object.
-        Set logfile to None to stop logging. This is the default.
-        Set logfile to sys.stdout to echo everything to standard output.
-        The logfile is flushed after each write.
-        Example 1:
-            child = pexpect.spawn('some_command')
-            fout = file('mylog.txt','w')
-            child.logfile = fout
-        Example 2:
-            child = pexpect.spawn('some_command')
-            child.logfile = sys.stdout
-            
-        The delaybeforesend helps overcome weird behavior that many users were experiencing.
-        The typical problem was that a user would expect() a "Password:" prompt and
-        then immediately call sendline() to send the password. The user would then
-        see that their password was echoed back to them. Of course, passwords don't
-        normally echo. The problem is caused by the fact that most applications
-        print out the "Password" prompt and then turn off stdin echo, but if you
-        send your password before the application turned off echo, then you get
-        your password echoed. Normally this wouldn't be a problem when interacting
-        with a human at a real heyboard. If you introduce a slight delay just before 
-        writing then this seems to clear up the problem. This was such a common problem 
-        for many users that I decided that the default pexpect behavior
-        should be to sleep just before writing to the child application.
-        1/10th of a second (100 ms) seems to be enough to clear up the problem.
-        You can set delaybeforesend to 0 to return to the old behavior.
-        
-        Note that spawn is clever about finding commands on your path.
-        It uses the same logic that "which" uses to find executables.
-
-        If you wish to get the exit status of the child you must call
-        the close() method. The exit or signal status of the child will be
-        stored in self.exitstatus or self.signalstatus.
-        If the child exited normally then exitstatus will store the exit return code and
-        signalstatus will be None.
-        If the child was terminated abnormally with a signal then signalstatus will store
-        the signal value and exitstatus will be None.
-        If you need more detail you can also read the self.status member which stores
-        the status returned by os.waitpid. You can interpret this using
-        os.WIFEXITED/os.WEXITSTATUS or os.WIFSIGNALED/os.TERMSIG.
-        """
-        self.STDIN_FILENO = pty.STDIN_FILENO
-        self.STDOUT_FILENO = pty.STDOUT_FILENO
-        self.STDERR_FILENO = pty.STDERR_FILENO
-        self.stdin = sys.stdin
-        self.stdout = sys.stdout
-        self.stderr = sys.stderr
-
-        self.patterns = None
-        self.before = None
-        self.after = None
-        self.match = None
-        self.match_index = None
-        self.terminated = 1
-        self.exitstatus = None
-        self.signalstatus = None
-        self.status = None
-        self.flag_eof = 0
-        self.pid = None
-        self.child_fd = -1 # initially closed
-        self.timeout = timeout
-        self.delimiter = EOF
-        self.logfile = logfile    
-        self.maxread = maxread # Max bytes to read at one time into buffer.
-        self.buffer = '' # This is the read buffer. See maxread.
-        self.searchwindowsize = searchwindowsize # Anything before searchwindowsize point is preserved, but not searched.
-        self.delaybeforesend = 0.1 # Sets sleep time used just before sending data to child.
-        self.softspace = 0 # File-like object.
-        self.name = '<' + repr(self) + '>' # File-like object.
-        self.encoding = None # File-like object.
-        self.closed = 1 # File-like object.
-        
-        if type (args) != type([]):
-            raise TypeError ('The second argument, args, must be a list.')
-
-        if args == []:
-            self.args = split_command_line(command)
-            self.command = self.args[0]
-        else:
-            self.args = args[:] # work with a copy
-            self.args.insert (0, command)
-            self.command = command
-
-        command_with_path = which(self.command)
-        if command_with_path == None:
-            raise ExceptionPexpect ('The command was not found or was not executable: %s.' % self.command)
-        self.command = command_with_path
-        self.args[0] = self.command
-
-        self.name = '<' + ' '.join (self.args) + '>'
-        self.__spawn()
-
-    def __del__(self):
-        """This makes sure that no system resources are left open.
-        Python only garbage collects Python objects. OS file descriptors
-        are not Python objects, so they must be handled explicitly.
-        If the child file descriptor was opened outside of this class
-        (passed to the constructor) then this does not close it.
-        """
-        if self.closed:
-            return
-        self.close()
-
-    def __str__(self):
-        """This returns the current state of the pexpect object as a string.
-        """
-        s = []
-        s.append(repr(self))
-        s.append('version: ' + __version__ + ' (' + __revision__ + ')')
-        s.append('command: ' + str(self.command))
-        s.append('args: ' + str(self.args))
-        if self.patterns is None:
-            s.append('patterns: None')
-        else:
-            s.append('patterns:')
-            for p in self.patterns:
-                if type(p) is type(re.compile('')):
-                    s.append('    ' + str(p.pattern))
-                else:
-                    s.append('    ' + str(p))
-        s.append('buffer (last 100 chars): ' + str(self.buffer)[-100:])
-        s.append('before (last 100 chars): ' + str(self.before)[-100:])
-        s.append('after: ' + str(self.after))
-        s.append('match: ' + str(self.match))
-        s.append('match_index: ' + str(self.match_index))
-        s.append('exitstatus: ' + str(self.exitstatus))
-        s.append('flag_eof: ' + str(self.flag_eof))
-        s.append('pid: ' + str(self.pid))
-        s.append('child_fd: ' + str(self.child_fd))
-        s.append('timeout: ' + str(self.timeout))
-        s.append('delimiter: ' + str(self.delimiter))
-        s.append('logfile: ' + str(self.logfile))
-        s.append('maxread: ' + str(self.maxread))
-        s.append('searchwindowsize: ' + str(self.searchwindowsize))
-        s.append('delaybeforesend: ' + str(self.delaybeforesend))
-        return '\n'.join(s)
-
-    def __spawn(self):
-        """This starts the given command in a child process.
-        This does all the fork/exec type of stuff for a pty.
-        This is called by __init__. 
-        """
-        # The pid and child_fd of this object get set by this method.
-        # Note that it is difficult for this method to fail.
-        # You cannot detect if the child process cannot start.
-        # So the only way you can tell if the child process started
-        # or not is to try to read from the file descriptor. If you get
-        # EOF immediately then it means that the child is already dead.
-        # That may not necessarily be bad because you may haved spawned a child
-        # that performs some task; creates no stdout output; and then dies.
-
-        assert self.pid == None, 'The pid member should be None.'
-        assert self.command != None, 'The command member should not be None.'
-
-        try:
-            self.pid, self.child_fd = pty.fork()
-        except OSError, e:
-            raise ExceptionPexpect('Pexpect: pty.fork() failed: ' + str(e))
-
-        if self.pid == 0: # Child
-            try: # Some platforms do not like setwinsize (Cygwin).
-                self.child_fd = sys.stdout.fileno() # used by setwinsize()
-                self.setwinsize(24, 80)
-            except:
-                pass
-            # Do not allow child to inherit open file descriptors from parent.
-            max_fd = resource.getrlimit(resource.RLIMIT_NOFILE)[0]
-            for i in range (3, max_fd):
-                try:
-                    os.close (i)
-                except OSError:
-                    pass
-
-            # I don't know why this works, but ignoring SIGHUP fixes a
-            # problem when trying to start a Java daemon with sudo
-            # (specifically, Tomcat).
-            signal.signal(signal.SIGHUP, signal.SIG_IGN)
-
-            os.execv(self.command, self.args)
-
-        # Parent
-        self.terminated = 0
-        self.closed = 0
-
-    def fileno (self):   # File-like object.
-        """This returns the file descriptor of the pty for the child.
-        """
-        return self.child_fd
-
-    def close (self, force=0):   # File-like object.
-        """This closes the connection with the child application.
-        Note that calling close() more than once is valid.
-        This emulates standard Python behavior with files.
-        Set force to 1 if you want to make sure that the child is terminated
-        (SIGKILL is sent if the child ignores SIGHUP and SIGINT).
-        """
-        if self.child_fd != -1:
-            self.flush()
-            os.close (self.child_fd)
-            self.child_fd = -1
-            self.closed = 1
-            time.sleep(0.1) # Give kernel time to update process status.
-            if self.isalive():
-                if not self.terminate(force):
-                    raise ExceptionPexpect ('close() could not terminate the child using terminate()')
-
-    def flush (self):   # File-like object.
-        """This does nothing. It is here to support the interface for a File-like object.
-        """
-        pass
-
-    def isatty (self):   # File-like object.
-        """This returns 1 if the file descriptor is open and connected to a tty(-like) device, else 0.
-        """
-        return os.isatty(self.child_fd)
-
-    def setecho (self, on):
-        """This sets the terminal echo mode on or off.
-        Note that anything the child sent before the echo will be lost, so
-        you should be sure that your input buffer is empty before you setecho.
-        For example, the following will work as expected.
-            p = pexpect.spawn('cat')
-            p.sendline ('1234') # We will see this twice (once from tty echo and again from cat).
-            p.expect (['1234'])
-            p.expect (['1234'])
-            p.setecho(0) # Turn off tty echo
-            p.sendline ('abcd') # We will set this only once (echoed by cat).
-            p.sendline ('wxyz') # We will set this only once (echoed by cat)
-            p.expect (['abcd'])
-            p.expect (['wxyz'])
-        The following WILL NOT WORK because the lines sent before the setecho
-        will be lost:
-            p = pexpect.spawn('cat')
-            p.sendline ('1234') # We will see this twice (once from tty echo and again from cat).
-            p.setecho(0) # Turn off tty echo
-            p.sendline ('abcd') # We will set this only once (echoed by cat).
-            p.sendline ('wxyz') # We will set this only once (echoed by cat)
-            p.expect (['1234'])
-            p.expect (['1234'])
-            p.expect (['abcd'])
-            p.expect (['wxyz'])
-        """
-        self.child_fd
-        new = termios.tcgetattr(self.child_fd)
-        if on:
-            new[3] = new[3] | termios.ECHO
-        else:
-            new[3] = new[3] & ~termios.ECHO
-        # I tried TCSADRAIN and TCSAFLUSH, but these were inconsistent
-        # and blocked on some platforms. TCSADRAIN is probably ideal if it worked.
-        termios.tcsetattr(self.child_fd, termios.TCSANOW, new)
-
-    def read_nonblocking (self, size = 1, timeout = -1):
-        """This reads at most size characters from the child application.
-        It includes a timeout. If the read does not complete within the
-        timeout period then a TIMEOUT exception is raised.
-        If the end of file is read then an EOF exception will be raised.
-        If a log file was set using setlog() then all data will
-        also be written to the log file.
-
-        If timeout==None then the read may block indefinitely.
-        If timeout==-1 then the self.timeout value is used.
-        If timeout==0 then the child is polled and 
-            if there was no data immediately ready then this will raise a TIMEOUT exception.
-        
-        The "timeout" refers only to the amount of time to read at least one character.
-        This is not effected by the 'size' parameter, so if you call
-        read_nonblocking(size=100, timeout=30) and only one character is
-        available right away then one character will be returned immediately. 
-        It will not wait for 30 seconds for another 99 characters to come in.
-        
-        This is a wrapper around os.read().
-        It uses select.select() to implement a timeout. 
-        """
-        if self.child_fd == -1:
-            raise ValueError ('I/O operation on closed file in read_nonblocking().')
-
-        if timeout == -1:
-            timeout = self.timeout
-
-        # Note that some systems such as Solaris do not give an EOF when
-        # the child dies. In fact, you can still try to read
-        # from the child_fd -- it will block forever or until TIMEOUT.
-        # For this case, I test isalive() before doing any reading.
-        # If isalive() is false, then I pretend that this is the same as EOF.
-        if not self.isalive():
-            r, w, e = select.select([self.child_fd], [], [], 0) # timeout of 0 means "poll"
-            if not r:
-                self.flag_eof = 1
-                raise EOF ('End Of File (EOF) in read_nonblocking(). Braindead platform.')
-        elif sys.platform.lower().find('irix') >= 0:
-            # This is a hack for Irix. It seems that Irix requires a long delay before checking isalive.
-            # This adds a 2 second delay, but only when the child is terminated
-            r, w, e = select.select([self.child_fd], [], [], 2)
-            if not r and not self.isalive():
-                self.flag_eof = 1
-                raise EOF ('End Of File (EOF) in read_nonblocking(). Pokey platform.')
-            
-        r, w, e = select.select([self.child_fd], [], [], timeout)
-        if not r:
-            if not self.isalive():
-                # Some platforms, such as Irix, will claim that their processes are alive;
-                # then timeout on the select; and then finally admit that they are not alive.
-                self.flag_eof = 1
-                raise EOF ('End of File (EOF) in read_nonblocking(). Very pokey platform.')
-            else:
-                raise TIMEOUT ('Timeout exceeded in read_nonblocking().')
-
-        if self.child_fd in r:
-            try:
-                s = os.read(self.child_fd, size)
-            except OSError, e: # Linux does this
-                self.flag_eof = 1
-                raise EOF ('End Of File (EOF) in read_nonblocking(). Exception style platform.')
-            if s == '': # BSD style
-                self.flag_eof = 1
-                raise EOF ('End Of File (EOF) in read_nonblocking(). Empty string style platform.')
-
-            if self.logfile != None:
-                self.logfile.write (s)
-                self.logfile.flush()
-
-            return s
-
-        raise ExceptionPexpect ('Reached an unexpected state in read_nonblocking().')
-
-    def read (self, size = -1):   # File-like object.
-        """This reads at most "size" bytes from the file 
-        (less if the read hits EOF before obtaining size bytes). 
-        If the size argument is negative or omitted, 
-        read all data until EOF is reached. 
-        The bytes are returned as a string object. 
-        An empty string is returned when EOF is encountered immediately.
-        """
-        if size == 0:
-            return ''
-        if size < 0:
-            self.expect (self.delimiter) # delimiter default is EOF
-            return self.before
-
-        # I could have done this more directly by not using expect(), but
-        # I deliberately decided to couple read() to expect() so that
-        # I would catch any bugs early and ensure consistant behavior.
-        # It's a little less efficient, but there is less for me to
-        # worry about if I have to later modify read() or expect().
-        # Note, it's OK if size==-1 in the regex. That just means it
-        # will never match anything in which case we stop only on EOF.
-        cre = re.compile('.{%d}' % size, re.DOTALL) 
-        index = self.expect ([cre, self.delimiter]) # delimiter default is EOF
-        if index == 0:
-            return self.after ### self.before should be ''. Should I assert this?
-        return self.before
-        
-    def readline (self, size = -1):    # File-like object.
-        """This reads and returns one entire line. A trailing newline is kept in
-        the string, but may be absent when a file ends with an incomplete line. 
-        Note: This readline() looks for a \\r\\n pair even on UNIX because this is 
-        what the pseudo tty device returns. So contrary to what you may be used to
-        you will receive a newline as \\r\\n.
-        An empty string is returned when EOF is hit immediately.
-        Currently, the size agument is mostly ignored, so this behavior is not
-        standard for a file-like object. If size is 0 then an empty string is returned.
-        """
-        if size == 0:
-            return ''
-        index = self.expect (['\r\n', self.delimiter]) # delimiter default is EOF
-        if index == 0:
-            return self.before + '\r\n'
-        else:
-            return self.before
-
-    def __iter__ (self):    # File-like object.
-        """This is to support interators over a file-like object.
-        """
-        return self
-
-    def next (self):    # File-like object.
-        """This is to support iterators over a file-like object.
-        """
-        result = self.readline()
-        if result == "":
-            raise StopIteration
-        return result
-
-    def readlines (self, sizehint = -1):    # File-like object.
-        """This reads until EOF using readline() and returns a list containing 
-        the lines thus read. The optional "sizehint" argument is ignored.
-        """        
-        lines = []
-        while 1:
-            line = self.readline()
-            if not line:
-                break
-            lines.append(line)
-        return lines
-
-    def write(self, str):   # File-like object.
-        """This is similar to send() except that there is no return value.
-        """
-        self.send (str)
-
-    def writelines (self, sequence):   # File-like object.
-        """This calls write() for each element in the sequence.
-        The sequence can be any iterable object producing strings, 
-        typically a list of strings. This does not add line separators
-        There is no return value.
-        """
-        for str in sequence:
-            self.write (str)
-
-    def send(self, str):
-        """This sends a string to the child process.
-        This returns the number of bytes written.
-        If a log file was set then the data is also written to the log.
-        """
-        time.sleep(self.delaybeforesend)
-        if self.logfile != None:
-            self.logfile.write (str)
-            self.logfile.flush()
-        c = os.write(self.child_fd, str)
-        return c
-
-    def sendline(self, str=''):
-        """This is like send(), but it adds a line feed (os.linesep).
-        This returns the number of bytes written.
-        """
-        n = self.send(str)
-        n = n + self.send (os.linesep)
-        return n
-
-    def sendeof(self):
-        """This sends an EOF to the child.
-        This sends a character which causes the pending parent output
-        buffer to be sent to the waiting child program without
-        waiting for end-of-line. If it is the first character of the
-        line, the read() in the user program returns 0, which
-        signifies end-of-file. This means to work as expected 
-        a sendeof() has to be called at the begining of a line. 
-        This method does not send a newline. It is the responsibility
-        of the caller to ensure the eof is sent at the beginning of a line.
-        """
-        ### Hmmm... how do I send an EOF?
-        ###C  if ((m = write(pty, *buf, p - *buf)) < 0)
-        ###C      return (errno == EWOULDBLOCK) ? n : -1;
-        fd = sys.stdin.fileno()
-        old = termios.tcgetattr(fd) # remember current state
-        new = termios.tcgetattr(fd)
-        new[3] = new[3] | termios.ICANON # ICANON must be set to recognize EOF
-        try: # use try/finally to ensure state gets restored
-            termios.tcsetattr(fd, termios.TCSADRAIN, new)
-            if 'CEOF' in dir(termios):
-                os.write (self.child_fd, '%c' % termios.CEOF)
-            else:
-                os.write (self.child_fd, '%c' % 4) # Silly platform does not define CEOF so assume CTRL-D
-        finally: # restore state
-            termios.tcsetattr(fd, termios.TCSADRAIN, old)
-
-    def eof (self):
-        """This returns 1 if the EOF exception was raised at some point.
-        """
-        return self.flag_eof
-
-    def terminate(self, force=0):
-        """This forces a child process to terminate.
-        It starts nicely with SIGHUP and SIGINT. If "force" is 1 then
-        moves onto SIGKILL.
-        This returns true if the child was terminated.
-        This returns false if the child could not be terminated.
-        """
-        if not self.isalive():
-            return 1
-        self.kill(signal.SIGHUP)
-        time.sleep(0.1)
-        if not self.isalive():
-            return 1
-        self.kill(signal.SIGCONT)
-        time.sleep(0.1)
-        if not self.isalive():
-            return 1
-        self.kill(signal.SIGINT)
-        time.sleep(0.1)
-        if not self.isalive():
-            return 1
-        if force:
-            self.kill(signal.SIGKILL)
-            time.sleep(0.1)
-            if not self.isalive():
-                return 1
-            else:
-                return 0
-        return 0
-        #raise ExceptionPexpect ('terminate() could not terminate child process. Try terminate(force=1)?')
-        
-    def isalive(self):
-        """This tests if the child process is running or not.
-        This is non-blocking. If the child was terminated then this
-        will read the exitstatus or signalstatus of the child.
-        This returns 1 if the child process appears to be running or 0 if not.
-        It can take literally SECONDS for Solaris to return the right status.
-        """
-        if self.terminated:
-            return 0
-
-        if self.flag_eof:
-            # This is for Linux, which requires the blocking form of waitpid to get
-            # status of a defunct process. This is super-lame. The flag_eof would have
-            # been set in read_nonblocking(), so this should be safe.
-            waitpid_options = 0
-        else:
-            waitpid_options = os.WNOHANG
-            
-        try:
-            pid, status = os.waitpid(self.pid, waitpid_options)
-        except OSError, e: # No child processes
-            if e[0] == errno.ECHILD:
-                raise ExceptionPexpect ('isalive() encountered condition where "terminated" is 0, but there was no child process. Did someone else call waitpid() on our process?')
-            else:
-                raise e
-
-        # I have to do this twice for Solaris. I can't even believe that I figured this out...
-        # If waitpid() returns 0 it means that no child process wishes to
-        # report, and the value of status is undefined.
-        if pid == 0:
-            try:
-                pid, status = os.waitpid(self.pid, waitpid_options) ### os.WNOHANG) # Solaris!
-            except OSError, e: # This should never happen...
-                if e[0] == errno.ECHILD:
-                    raise ExceptionPexpect ('isalive() encountered condition that should never happen. There was no child process. Did someone else call waitpid() on our process?')
-                else:
-                    raise e
-
-            # If pid is still 0 after two calls to waitpid() then
-            # the process really is alive. This seems to work on all platforms, except
-            # for Irix which seems to require a blocking call on waitpid or select, so I let read_nonblocking
-            # take care of this situation (unfortunately, this requires waiting through the timeout).
-            if pid == 0:
-                return 1
-
-        if pid == 0:
-            return 1
-
-        if os.WIFEXITED (status):
-            self.status = status
-            self.exitstatus = os.WEXITSTATUS(status)
-            self.signalstatus = None
-            self.terminated = 1
-            return 0
-        elif os.WIFSIGNALED (status):
-            self.status = status
-            self.exitstatus = None
-            self.signalstatus = os.WTERMSIG(status)
-            self.terminated = 1
-            return 0
-        elif os.WIFSTOPPED (status):
-            raise ExceptionPexpect ('isalive() encountered condition where child process is stopped. This is not supported. Is some other process attempting job control with our child pid?')
-
-        raise ExceptionPexpect ('isalive() reached unexpected condition where waitpid matched child pid, but status was not matched by WIFEXITED, WIFSIGNALED, or WIFSTOPPED.')
-
-
-    def kill(self, sig):
-        """This sends the given signal to the child application.
-        In keeping with UNIX tradition it has a misleading name.
-        It does not necessarily kill the child unless
-        you send the right signal.
-        """
-        # Same as os.kill, but the pid is given for you.
-        if self.isalive():
-            os.kill(self.pid, sig)
-
-    def compile_pattern_list(self, patterns):
-        """This compiles a pattern-string or a list of pattern-strings.
-        Patterns must be a StringType, EOF, TIMEOUT, SRE_Pattern, or 
-        a list of those. Patterns may also be None which results in
-        an empty list.
-
-        This is used by expect() when calling expect_list().
-        Thus expect() is nothing more than::
-             cpl = self.compile_pattern_list(pl)
-             return self.expect_list(clp, timeout)
-
-        If you are using expect() within a loop it may be more
-        efficient to compile the patterns first and then call expect_list().
-        This avoid calls in a loop to compile_pattern_list():
-             cpl = self.compile_pattern_list(my_pattern)
-             while some_condition:
-                ...
-                i = self.expect_list(clp, timeout)
-                ...
-        """
-        if patterns is None:
-            return []
-        if type(patterns) is not types.ListType:
-            patterns = [patterns]
-
-        compiled_pattern_list = []
-        for p in patterns:
-            if type(p) is types.StringType:
-                compiled_pattern_list.append(re.compile(p, re.DOTALL))
-            elif p is EOF:
-                compiled_pattern_list.append(EOF)
-            elif p is TIMEOUT:
-                compiled_pattern_list.append(TIMEOUT)
-            elif type(p) is type(re.compile('')):
-                compiled_pattern_list.append(p)
-            else:
-                raise TypeError ('Argument must be one of StringType, EOF, TIMEOUT, SRE_Pattern, or a list of those type. %s' % str(type(p)))
-
-        return compiled_pattern_list
- 
-    def expect(self, pattern, timeout = -1, searchwindowsize=None):
-        """This seeks through the stream until a pattern is matched.
-        The pattern is overloaded and may take several types including a list.
-        The pattern can be a StringType, EOF, a compiled re, or
-        a list of those types. Strings will be compiled to re types.
-        This returns the index into the pattern list. If the pattern was
-        not a list this returns index 0 on a successful match.
-        This may raise exceptions for EOF or TIMEOUT.
-        To avoid the EOF or TIMEOUT exceptions add EOF or TIMEOUT to
-        the pattern list.
-
-        After a match is found the instance attributes
-        'before', 'after' and 'match' will be set.
-        You can see all the data read before the match in 'before'.
-        You can see the data that was matched in 'after'.
-        The re.MatchObject used in the re match will be in 'match'.
-        If an error occured then 'before' will be set to all the
-        data read so far and 'after' and 'match' will be None.
-
-        If timeout is -1 then timeout will be set to the self.timeout value.
-
-        Note: A list entry may be EOF or TIMEOUT instead of a string.
-        This will catch these exceptions and return the index
-        of the list entry instead of raising the exception.
-        The attribute 'after' will be set to the exception type.
-        The attribute 'match' will be None.
-        This allows you to write code like this:
-                index = p.expect (['good', 'bad', pexpect.EOF, pexpect.TIMEOUT])
-                if index == 0:
-                    do_something()
-                elif index == 1:
-                    do_something_else()
-                elif index == 2:
-                    do_some_other_thing()
-                elif index == 3:
-                    do_something_completely_different()
-        instead of code like this:
-                try:
-                    index = p.expect (['good', 'bad'])
-                    if index == 0:
-                        do_something()
-                    elif index == 1:
-                        do_something_else()
-                except EOF:
-                    do_some_other_thing()
-                except TIMEOUT:
-                    do_something_completely_different()
-        These two forms are equivalent. It all depends on what you want.
-        You can also just expect the EOF if you are waiting for all output
-        of a child to finish. For example:
-                p = pexpect.spawn('/bin/ls')
-                p.expect (pexpect.EOF)
-                print p.before
-
-        If you are trying to optimize for speed then see expect_list().
-        """
-        compiled_pattern_list = self.compile_pattern_list(pattern)
-        return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
-
-    def expect_list(self, pattern_list, timeout = -1, searchwindowsize = -1):
-        """This takes a list of compiled regular expressions and returns 
-        the index into the pattern_list that matched the child's output.
-        The list may also contain EOF or TIMEOUT (which are not
-        compiled regular expressions). This method is similar to
-        the expect() method except that expect_list() does not
-        recompile the pattern list on every call.
-        This may help if you are trying to optimize for speed, otherwise
-        just use the expect() method.  This is called by expect().
-        If timeout==-1 then the self.timeout value is used.
-        If searchwindowsize==-1 then the self.searchwindowsize value is used.
-        """
-        self.patterns = pattern_list
-
-        if timeout == -1:
-            timeout = self.timeout
-        if timeout != None:
-            end_time = time.time() + timeout 
-        if searchwindowsize == -1:
-            searchwindowsize = self.searchwindowsize
-
-        try:
-            incoming = self.buffer
-            while 1: # Keep reading until exception or return.
-                # Sequence through the list of patterns looking for a match.
-                first_match = -1
-                for cre in pattern_list:
-                    if cre is EOF or cre is TIMEOUT: 
-                        continue # The patterns for PexpectExceptions are handled differently.
-                    if searchwindowsize is None: # search everything
-                        match = cre.search(incoming)
-                    else:
-                        startpos = max(0, len(incoming) - searchwindowsize)
-                        match = cre.search(incoming, startpos)
-                    if match is None:
-                        continue
-                    if first_match > match.start() or first_match == -1:
-                        first_match = match.start()
-                        self.match = match
-                        self.match_index = pattern_list.index(cre)
-                if first_match > -1:
-                    self.buffer = incoming[self.match.end() : ]
-                    self.before = incoming[ : self.match.start()]
-                    self.after = incoming[self.match.start() : self.match.end()]
-                    return self.match_index
-                # No match at this point
-                if timeout < 0 and timeout is not None:
-                    raise TIMEOUT ('Timeout exceeded in expect_list().')
-                # Still have time left, so read more data
-                c = self.read_nonblocking (self.maxread, timeout)
-                incoming = incoming + c
-                if timeout is not None:
-                    timeout = end_time - time.time()
-        except EOF, e:
-            self.buffer = ''
-            self.before = incoming
-            self.after = EOF
-            if EOF in pattern_list:
-                self.match = EOF
-                self.match_index = pattern_list.index(EOF)
-                return self.match_index
-            else:
-                self.match = None
-                self.match_index = None
-                raise EOF (str(e) + '\n' + str(self))
-        except TIMEOUT, e:
-            self.before = incoming
-            self.after = TIMEOUT
-            if TIMEOUT in pattern_list:
-                self.match = TIMEOUT
-                self.match_index = pattern_list.index(TIMEOUT)
-                return self.match_index
-            else:
-                self.match = None
-                self.match_index = None
-                raise TIMEOUT (str(e) + '\n' + str(self))
-        except Exception:
-            self.before = incoming
-            self.after = None
-            self.match = None
-            self.match_index = None
-            raise
-
-    def getwinsize(self):
-        """This returns the window size of the child tty.
-        The return value is a tuple of (rows, cols).
-        """
-        if 'TIOCGWINSZ' in dir(termios):
-            TIOCGWINSZ = termios.TIOCGWINSZ
-        else:
-            TIOCGWINSZ = 1074295912L # Assume
-        s = struct.pack('HHHH', 0, 0, 0, 0)
-        x = fcntl.ioctl(self.fileno(), TIOCGWINSZ, s)
-        return struct.unpack('HHHH', x)[0:2]
-
-    def setwinsize(self, r, c):
-        """This sets the window size of the child tty.
-        This will cause a SIGWINCH signal to be sent to the child.
-        This does not change the physical window size.
-        It changes the size reported to TTY-aware applications like
-        vi or curses -- applications that respond to the SIGWINCH signal.
-        """
-        # Check for buggy platforms. Some Python versions on some platforms
-        # (notably OSF1 Alpha and RedHat 7.1) truncate the value for
-        # termios.TIOCSWINSZ. It is not clear why this happens.
-        # These platforms don't seem to handle the signed int very well;
-        # yet other platforms like OpenBSD have a large negative value for
-        # TIOCSWINSZ and they don't have a truncate problem.
-        # Newer versions of Linux have totally different values for TIOCSWINSZ.
-        # Note that this fix is a hack.
-        if 'TIOCSWINSZ' in dir(termios):
-            TIOCSWINSZ = termios.TIOCSWINSZ
-        else:
-            TIOCSWINSZ = -2146929561
-        if TIOCSWINSZ == 2148037735L: # L is not required in Python >= 2.2.
-            TIOCSWINSZ = -2146929561 # Same bits, but with sign.
-        # Note, assume ws_xpixel and ws_ypixel are zero.
-        s = struct.pack('HHHH', r, c, 0, 0)
-        fcntl.ioctl(self.fileno(), TIOCSWINSZ, s)
-
-    def interact(self, escape_character = chr(29)):
-        """This gives control of the child process to the interactive user
-        (the human at the keyboard).
-        Keystrokes are sent to the child process, and the stdout and stderr
-        output of the child process is printed.
-        When the user types the escape_character this method will stop.
-        The default for escape_character is ^] (ASCII 29).
-        This simply echos the child stdout and child stderr to the real
-        stdout and it echos the real stdin to the child stdin.
-
-        Note that if you change the window size of the parent
-        the SIGWINCH signal will not be passed through to the child.
-        If you want the child window size to change when the parent's
-        window size changes then do something like the following example:
-            import pexpect, struct, fcntl, termios, signal, sys
-            def sigwinch_passthrough (sig, data):
-                s = struct.pack("HHHH", 0, 0, 0, 0)
-                a = struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ , s))
-                global p
-                p.setwinsize(a[0],a[1])
-            p = pexpect.spawn('/bin/bash') # Note this is global
-            signal.signal(signal.SIGWINCH, sigwinch_passthrough)
-            p.interact()
-        """
-        # Flush the buffer.
-        self.stdout.write (self.buffer)
-        self.stdout.flush()
-        self.buffer = ''
-        mode = tty.tcgetattr(self.STDIN_FILENO)
-        tty.setraw(self.STDIN_FILENO)
-        try:
-            self.__interact_copy(escape_character)
-        finally:
-            tty.tcsetattr(self.STDIN_FILENO, tty.TCSAFLUSH, mode)
-
-    def __interact_writen(self, fd, data):
-        """This is used by the interact() method.
-        """
-        while data != '' and self.isalive():
-            n = os.write(fd, data)
-            data = data[n:]
-    def __interact_read(self, fd):
-        """This is used by the interact() method.
-        """
-        return os.read(fd, 1000)
-    def __interact_copy(self, escape_character = None):
-        """This is used by the interact() method.
-        """
-        while self.isalive():
-            try:
-                r, w, e = select.select([self.child_fd, self.STDIN_FILENO], [], [])
-            except select.errno, e:
-                if e[0] != errno.EINTR:
-                    raise
-            if self.child_fd in r:
-                data = self.__interact_read(self.child_fd)
-                if self.logfile != None:
-                    self.logfile.write (data)
-                    self.logfile.flush()
-                os.write(self.STDOUT_FILENO, data)
-            if self.STDIN_FILENO in r:
-                data = self.__interact_read(self.STDIN_FILENO)
-                self.__interact_writen(self.child_fd, data)
-                if escape_character in data:
-                    break
-##############################################################################
-# The following methods are no longer supported or allowed..                
-    def setmaxread (self, maxread):
-        """This method is no longer supported or allowed.
-        I don't like getters and setters without a good reason.
-        """
-        raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the maxread member variable.')
-    def expect_exact (self, pattern_list, timeout = -1):
-        """This method is no longer supported or allowed.
-        It was too hard to maintain and keep it up to date with expect_list.
-        Few people used this method. Most people favored reliability over speed.
-        The implementation is left in comments in case anyone needs to hack this
-        feature back into their copy.
-        If someone wants to diff this with expect_list and make them work
-        nearly the same then I will consider adding this make in.
-        """
-        raise ExceptionPexpect ('This method is no longer supported or allowed.')
-    def setlog (self, fileobject):
-        """This method is no longer supported or allowed.
-        """
-        raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the logfile member variable.')
-
-##############################################################################
-# End of spawn class
-##############################################################################
-
-def which (filename):
-    """This takes a given filename; tries to find it in the environment path; 
-    then checks if it is executable.
-    This returns the full path to the filename if found and executable.
-    Otherwise this returns None.
-    """
-    # Special case where filename already contains a path.
-    if os.path.dirname(filename) != '':
-        if os.access (filename, os.X_OK):
-            return filename
-
-    if not os.environ.has_key('PATH') or os.environ['PATH'] == '':
-        p = os.defpath
-    else:
-        p = os.environ['PATH']
-
-    # Oddly enough this was the one line that made Pexpect
-    # incompatible with Python 1.5.2.
-    #pathlist = p.split (os.pathsep) 
-    pathlist = string.split (p, os.pathsep)
-
-    for path in pathlist:
-        f = os.path.join(path, filename)
-        if os.access(f, os.X_OK):
-            return f
-    return None
-
-def split_command_line(command_line):
-    """This splits a command line into a list of arguments.
-    It splits arguments on spaces, but handles
-    embedded quotes, doublequotes, and escaped characters.
-    It's impossible to do this with a regular expression, so
-    I wrote a little state machine to parse the command line.
-    """
-    arg_list = []
-    arg = ''
-
-    # Constants to name the states we can be in.
-    state_basic = 0
-    state_esc = 1
-    state_singlequote = 2
-    state_doublequote = 3
-    state_whitespace = 4 # The state of consuming whitespace between commands.
-    state = state_basic
-
-    for c in command_line:
-        if state == state_basic or state == state_whitespace:
-            if c == '\\': # Escape the next character
-                state = state_esc
-            elif c == r"'": # Handle single quote
-                state = state_singlequote
-            elif c == r'"': # Handle double quote
-                state = state_doublequote
-            elif c.isspace():
-                # Add arg to arg_list if we aren't in the middle of whitespace.
-                if state == state_whitespace:
-                    None # Do nothing.
-                else:
-                    arg_list.append(arg)
-                    arg = ''
-                    state = state_whitespace
-            else:
-                arg = arg + c
-                state = state_basic
-        elif state == state_esc:
-            arg = arg + c
-            state = state_basic
-        elif state == state_singlequote:
-            if c == r"'":
-                state = state_basic
-            else:
-                arg = arg + c
-        elif state == state_doublequote:
-            if c == r'"':
-                state = state_basic
-            else:
-                arg = arg + c
-
-    if arg != '':
-        arg_list.append(arg)
-    return arg_list
-
--- a/src/fdl/AcceptHandler.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/AcceptHandler.java	Wed Feb 08 18:02:40 2012 +0900
@@ -31,8 +31,11 @@
         // アクセプト処理
         SocketChannel channel = serverChannel.accept();
         channel.configureBlocking(false);
+        //channel.socket().setTcpNoDelay(true);
         fds.log(Level.INFO,"Server: accepted "+channel.socket());
 
+        // TCP N Delay を ServerSocketChannel のオプションに指定する
+        // setTcpNoDelay(boolean on) 
         tupleSpace.newUser();
 
         // 入出力用のハンドラを生成し,アタッチする
--- a/src/fdl/FDLindaServ.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/FDLindaServ.java	Wed Feb 08 18:02:40 2012 +0900
@@ -12,19 +12,19 @@
 import java.util.Iterator;
 import java.util.logging.Level;
 
-
 public class FDLindaServ  {
 	static final int MAX_REQ = 1;
 	static final int FAIL = (-1);
 	static final int DEF_PORT = 10000;
+	public static boolean debug = false;
 	public int port = DEF_PORT;
 	AbstractSelector selector;
 	private ServerSocketChannel ssChannel;
 	public TupleSpace tupleSpace;
 	public MetaEngine me;
 	
-	public static void main(final String[] args) {
-		final String usages = "usage: FDLindaServ [-p port]";
+	public static void main(MetaEngine me, final String[] args) {
+		final String usages = "usage: FDLindaServ [-d] [-p port]";
 		
 		int port = DEF_PORT;
 		//引数判定
@@ -32,7 +32,9 @@
 			for (int i=0; i<args.length; ++i) {
 				if("-p".equals(args[i])) {
 					port = Integer.parseInt(args[++i]);					
-				} 
+				} else if("-d".equals(args[i])) {
+					debug  = true;
+				}
 			}
 		} catch (NumberFormatException e) {
 			System.err.println(usages);
@@ -41,17 +43,21 @@
 		try {
 			FDLindaServ serv;
 			serv = new FDLindaServ(port);
-			serv.mainLoop();
+			serv.mainLoop(me,new MetaLinda(serv.tupleSpace, serv));
 		} catch (IOException e) {
 			System.err.println("Server Communiation Problem.");
 		}
 	}
-	
+
 	public void mainLoop() {
 		MetaLinda ml = new MetaLinda(tupleSpace, this);
-		me = new NullMetaEngine(ml);
+		me = new NullMetaEngine();
 		//me = new MetaLogEngine(ml);
-		me.mainLoop();
+		me.mainLoop(ml);
+	}
+	
+	public void mainLoop(MetaEngine me, MetaLinda ml) {
+		me.mainLoop(ml);
 	}
 
 	public FDLindaServ(int port) throws IOException {
@@ -80,8 +86,25 @@
 	}
 
 	public void checkTuple() {
-		checkTuple(0);
-	}
+		// セレクタによる監視    
+		try {
+			if (selector.selectNow()>0) {
+//              this does not work because #it.remove() is not called.
+//				for(SelectionKey s:selector.selectedKeys()) {
+//					TupleHandler handler = (TupleHandler)s.attachment();
+//					handler.handle(s);
+//				}
+			    for (Iterator<SelectionKey> it = selector.selectedKeys().iterator();it.hasNext(); ) {
+			        SelectionKey s = it.next();
+			        it.remove();
+					TupleHandler handler = (TupleHandler)s.attachment();
+					handler.handle(s);
+				}
+			}
+		} catch (ClosedChannelException e) {
+			// we have to do something...
+		} catch (IOException e) {
+		}}
 	
 	public void checkTuple(long timeout) {
 		// セレクタによる監視    
@@ -92,7 +115,7 @@
 //					TupleHandler handler = (TupleHandler)s.attachment();
 //					handler.handle(s);
 //				}
-			      for (Iterator<SelectionKey> it = selector.selectedKeys().iterator();it.hasNext(); ) {
+			    for (Iterator<SelectionKey> it = selector.selectedKeys().iterator();it.hasNext(); ) {
 			        SelectionKey s = it.next();
 			        it.remove();
 					TupleHandler handler = (TupleHandler)s.attachment();
@@ -107,8 +130,13 @@
 	
 
 	public void log(Level level,String msg) {
+		if (level!=Level.SEVERE && !debug) return;
 		System.err.println(msg);
 		if (level==Level.SEVERE)
 			new IOException().setStackTrace(null);
 	}
+
+	public static void main(final String[] args) {
+		main(new NullMetaEngine(),args);
+	}
 }
--- a/src/fdl/FederatedLinda.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/FederatedLinda.java	Wed Feb 08 18:02:40 2012 +0900
@@ -38,7 +38,7 @@
 
 	FederatedLinda fdl;
 	static int MAX_SEQUENCE = 2048;
-	static boolean debug = false;
+	public static boolean debug = false;
 
 	public int tid;
 	public int seq;
@@ -49,20 +49,28 @@
 
 	public PSXQueue q_top,q_end;
 	public PSXReply r_top,r_end;
-	public Hashtable<Integer,PSXReply> seqHash;
+	public Hashtable<Integer,PSXReply> seqHash = new Hashtable<Integer, PSXReply>();
 
 	public static FederatedLinda init() {
 		FederatedLinda fdl = new FederatedLinda();
 		return fdl;
 	}
 
+	public static FederatedLinda init(Selector selector) {
+		FederatedLinda fdl = new FederatedLinda(selector);
+		return fdl;
+	}
+	
 	private FederatedLinda() {
 		try {
 			selector = Selector.open();
 		} catch (IOException e) {
 			e.printStackTrace();
 		}
-		seqHash =  new Hashtable<Integer, PSXReply>();
+	}
+
+	public FederatedLinda(Selector selector) {
+		this.selector = selector;
 	}
 
 	public PSXLinda open(String _host,int _port) 
@@ -116,9 +124,7 @@
 			}
 			s = new Integer(seq);
 		} while (seqHash.containsKey(s));
-		if (debug) {
-			log(Level.INFO,"hash value = "+s.hashCode());
-		}
+		// log(Level.INFO,"hash value = "+s.hashCode());
 		seqHash.put(s,reply);
 		seq++;
 		return seq-1;
@@ -128,12 +134,47 @@
 		return selector;
 	}
 
-	public int sync() throws IOException {
-		return sync(0);
+	/**
+	 * sync with no wait 
+	 * @return 0
+	 * @throws IOException
+	 */
+	public int sync()  {
+		int key_num = 0;
+		queueExec();
+
+		try {
+			if (selector.selectNow()>0) {
+				for (Iterator<SelectionKey> it = selector.selectedKeys().iterator();it.hasNext(); ) {
+					SelectionKey s = it.next();
+					it.remove();
+					try {
+						if (!s.isReadable()) 
+							throw new IOException();
+						TupleHandler handle = (TupleHandler)s.attachment();
+						handle.handle(s);
+					} catch (IOException e) {
+						s.cancel();
+						log(Level.INFO,""+s.channel()+" is closed.");
+					}
+				}
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (ClosedSelectorException e) {
+			// client should be know
+		}
+
+		return key_num;
 	}
 
-	public int sync(long mtimeout) 
-	throws IOException {
+	/**
+	 * sync with mtimeout msec wait
+	 * @param mtimeout   0 means indifinite wait
+	 * @return 0
+	 * @throws IOException
+	 */
+	public int sync(long mtimeout) {
 		int key_num = 0;
 		queueExec();
 
@@ -162,7 +203,7 @@
 		return key_num;
 	}
 
-	private void queueExec() {
+	public void queueExec() {
 		while (q_top != null){
 			PSXQueue c = q_top;
 			c.send();
@@ -180,10 +221,16 @@
 	}
 
 	public void log(Level level,String msg) {
+		if (level!=Level.SEVERE && !debug) return;
 		System.err.println(msg);
 		if (level==Level.SEVERE)
 			new IOException().setStackTrace(null);
 	}
+
+	public void wakeup() {
+		selector.wakeup();		
+	}
+
 }
 
 /* end */
--- a/src/fdl/IOHandler.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/IOHandler.java	Wed Feb 08 18:02:40 2012 +0900
@@ -9,7 +9,7 @@
 import java.util.logging.Level;
 
 public class IOHandler implements TupleHandler {
-    static final boolean debug = true;
+    static final boolean debug = false;
     public TupleSpace tupleSpace;
     public SocketChannel ch;
     public FDLindaServ fds;
@@ -67,7 +67,9 @@
     	} else if (mode == PSX.PSX_WAIT_RD) {	
 			tupleSpace.Wait_Rd(key, command, mode); 			
     	} else if(mode == PSX.PSX_OUT) {
-	    	tupleSpace.Out(key, command, data);		
+	    	tupleSpace.Out(key, command, data);
+    	} else if (mode == PSX.PSX_UPDATE){
+    		tupleSpace.Update(key, command, data);
 	    } else {
 	    	tupleSpace.hook.closeHook(key);
 		fds.log(Level.SEVERE,"Incorrect tuple operation");
--- a/src/fdl/MetaEngine.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/MetaEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -1,5 +1,6 @@
 package fdl;
 
 public interface MetaEngine {
-	void mainLoop();
+	void mainLoop(MetaLinda ml);
+
 }
\ No newline at end of file
--- a/src/fdl/MetaLinda.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/MetaLinda.java	Wed Feb 08 18:02:40 2012 +0900
@@ -30,13 +30,15 @@
 
 	public TupleSpace ts;
 	public FDLindaServ fds;
-	public FederatedLinda fdl=FederatedLinda.init();
+	public FederatedLinda fdl;
 	public PSXLinda next=null;
-	private LinkedList<MetaReply> replies=new LinkedList<MetaReply>();
+	public LinkedList<MetaReply> replies=new LinkedList<MetaReply>();
 
 	public MetaLinda(TupleSpace ts,FDLindaServ fds) {
 		this.ts = ts;
 		this.fds = fds;
+		// Selector have to be shared with FDLindaServ and FederatedLInda
+		fdl=FederatedLinda.init(fds.selector);
 	}
 
 	public PSXLinda open(String _host,int _port) 
@@ -95,37 +97,70 @@
 		addReply(r);
 	}
 
+
+	public void waitRd(int id, PSXCallback callback) {
+		MetaReply r = new MetaReply(PSX.PSX_WAIT_RD,id,ts,callback);
+		addReply(r);
+	}
+
+	public PSXReply waitRd(int id) {
+		MetaReply r = new MetaReply(PSX.PSX_WAIT_RD,id,ts);
+		return r;
+	}
+	
 	public PSXLinda add(PSXLinda linda) {
 		next = linda;
 		return this;
 	}
 
-
+	/**
+	 * Meta Sync with no wait
+	 */
 	public int sync() {
-		return sync(0);
+		fdl.queueExec();
+		fds.checkTuple(); // fdl sync is also handled here
+		return metaSync();
 	}
 
+	/**
+	 * Meta Sync with wait
+	 * @param timeout wait timeout msec, if 0 wait indefinitely
+	 */
 	public int sync(long timeout) {
+		fdl.queueExec();
 		fds.checkTuple(timeout); // fdl sync is also handled here
+		return metaSync();
+	}
+		
+	public int metaSync() {
 		/*
 		 * r.callback() may call meta.sync() and modifies the
 		 * replies queue. Do current size of queue only. The
 		 * rest is checked on the next sync call including
 		 * the recursive case.
 		 */
-		int count = replies.size();
-		while(count-->0) {
-			MetaReply r = replies.poll();
-			// previous call back may call this sync and make 
-			// replies shorter.
-			if (r==null) break;
-			if (r.ready()) {
-			} else {
-				addReply(r);
+		boolean hasNewReply;
+		do {
+			hasNewReply = false;
+			int count = replies.size();
+			while (count-->0) {
+				MetaReply r = replies.poll();
+				// previous call back may call this sync and make 
+				// replies shorter.
+				if (r==null) break;
+				if (r.ready()) {
+					hasNewReply = true;
+				} else {
+					addReply(r);
+				}
 			}
-		}
+		} while (hasNewReply);
 		return 0;
 	}
+	
+	public void wakeup() {
+		fdl.wakeup();
+	}
 
 	public void send(ByteBuffer command, ByteBuffer data) {
 	}
--- a/src/fdl/MetaLogEngine.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/MetaLogEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -28,7 +28,7 @@
 			do {
 				data = commDebug.getLog();
 				if (data!=null) break;
-				meta.sync();
+				meta.sync(0);
 			} while (running);
 			if (running) {
 				meta.out(PSX.META_MONITOR_DATA, data);
@@ -36,11 +36,11 @@
 			}
 		}};
 	
-	public void mainLoop() {
+	public void mainLoop(MetaLinda meta) {
 		meta.in(PSX.META_MONITOR,monitor_callback_start);
 		meta.in(PSX.META_STOP, new PSXCallback() {public void callback(ByteBuffer reply) {
 			running = false;}});
 		while(running) 
-			meta.sync();
+			meta.sync(0);
 	}
 }
--- a/src/fdl/MetaReply.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/MetaReply.java	Wed Feb 08 18:02:40 2012 +0900
@@ -52,10 +52,14 @@
 			ts.Out(null, command, data);
 			return true;
 		case PSX.PSX_UPDATE:
-			// not implemented
+			// TODO: not implemented
 			break;
 		}
 		return mode==PSX.PSX_ANSWER;
 	}
+	
+	public String toString() {
+		return "MetaReply(mode="+mode+"+id="+id+")";
+	}
 
 }
--- a/src/fdl/NullMetaEngine.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/NullMetaEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -3,17 +3,17 @@
 import java.nio.ByteBuffer;
 
 public class NullMetaEngine implements MetaEngine {
-	public MetaLinda meta;
 	public boolean running=true;
 
-	public NullMetaEngine(MetaLinda meta) {
-		this.meta = meta;
+	public NullMetaEngine() {
 	}
 	
-	public void mainLoop() {
+	public void mainLoop(MetaLinda meta) {
 		meta.in(PSX.META_STOP, new PSXCallback() {public void callback(ByteBuffer reply) {
 			running = false;}});
 		while(running) 
-			meta.sync();
+			meta.sync(0);
 	}
+
+
 }
--- a/src/fdl/PSX.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/PSX.java	Wed Feb 08 18:02:40 2012 +0900
@@ -218,7 +218,7 @@
     		System.err.println("read size mismatch"+readsize+" and "+command.capacity());
 		}
 		while(readsize>0) {
-	    	if(false && IOHandler.debug){
+	    	if(IOHandler.debug){
 	    		System.out.println("reading packet..."+readsize);
 	    	}
 	    	count = channel.read(command);
--- a/src/fdl/PSXLinda.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/PSXLinda.java	Wed Feb 08 18:02:40 2012 +0900
@@ -3,32 +3,129 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
+/**
+ * @author kono
+ *
+ */
 public interface PSXLinda {
 
-
+	
+	/**
+	 * send IN request to the linda
+	 * Tuple with id will be removed, and the value is returned in the reply
+	 * @param id
+	 * @return wait for this request
+	 */
 	public PSXReply in(int id) ;
 
+	/**
+	 * send IN request and set call back for reply
+	 * @param id
+	 * @param callback
+	 */
 	public void in(int id, PSXCallback callback);
 
+	/**
+	 * send Check request to the Linda
+	 * Tuple with id will not be removed, it return even if there is no tuple for
+	 * this id
+	 * @param id
+	 * @return wait for this request
+	 */
 	public PSXReply ck(int id) ;
 
+	/**
+	 * send Check request and set call back for reply
+	 * @param id
+	 * @param callback
+	 */
 	public void ck(int id, PSXCallback callback) ;
 
+	/**
+	 * send a Tuple to the linda
+	 * Tuple may stack in the linda, multiple out is possible.
+	 * No blocking.
+	 * this id
+	 * @param id
+	 * @return wait for this request
+	 */
 	public PSXReply out(int id, ByteBuffer data) ;
 
+	/**
+	 * replace a Tuple in the linda
+	 * the old value is returned in the reply
+	 * @param id
+	 * @return wait for this request
+	 */
 	public PSXReply update(int id, ByteBuffer data) ;
 
+	/**
+	 * send Update request and set call back for reply
+	 * @param id
+	 * @param callback
+	 */
 	public void update(int id, ByteBuffer data,PSXCallback callback) ;
 
+	/**
+	 * Read the tuple in the linda, do not remove the tuple.
+	 * it return it's value
+	 * @param id
+	 * @return wait for this request
+	 */
 	public PSXReply rd(int id) ;
 
+	/**
+	 * send Read request and set call back for reply
+	 * @param id
+	 * @param callback
+	 */
 	public void rd(int id, PSXCallback callback) ;
 
-	public PSXLinda add(PSXLinda linda) ;
+
+	/**
+	 * Wait for newly incoming tuple for this id. 
+	 * Existing tuple is ignored.
+	 * Read the tuple in the linda, do not remove the tuple.
+	 * it return it's value
+	 * @param id
+	 * @return wait for this request
+	 */
+	public PSXReply waitRd(int i);
 
+	/**
+	 * send Read request and set call back for reply
+	 * @param id
+	 * @param callback
+	 */
+	public void waitRd(int i, PSXCallback callback);
+	
+	/**
+	 * Send all registered requests, and read incoming replies.
+	 * No wait
+	 * @return
+	 * @throws IOException
+	 */
 	public int sync() throws IOException ;
 
+	/**
+	 * Send all registered requests, and read incoming replies.
+	 * @param mtime     wait for mtime msec, if 0 this waits indefinitely.
+	 * @return
+	 * @throws IOException
+	 */
 	public int sync(long mtime) throws IOException ;
 
+	/**
+	 * Internal use
+	 * @param linda
+	 * @return
+	 */
+	public PSXLinda add(PSXLinda linda) ;
+	
+	/*
+	 * Intenal use
+	 * sned data for this port
+	 */
 	public void send(ByteBuffer command, ByteBuffer data);
+
 }
--- a/src/fdl/PSXLindaImpl.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/PSXLindaImpl.java	Wed Feb 08 18:02:40 2012 +0900
@@ -65,12 +65,6 @@
 			if (debug) {
 			    fdl.log(Level.INFO,"waiting for connect");
 			}
-			if (false) {
-				try {
-					wait(2000);
-				} catch (InterruptedException e) {
-				}
-			}
 		}
 		fdl.log(Level.INFO,"Linda client connect to "+socketChannel);
         socketChannel.register(selector,SelectionKey.OP_READ,this);
@@ -117,6 +111,15 @@
 		}
 	}
 
+	public void close() {
+		if (socketChannel != null) {
+			try {
+				socketChannel.close();
+			} catch (IOException e) {
+			}
+		}
+	}
+
 	private void checkConnect(String s) {
 		fdl.log(Level.INFO, "Connected:"+ s +": "
 		    +socketChannel.isConnected());
@@ -183,6 +186,15 @@
 	}
 
 
+	public PSXReply waitRd(int id) {
+		PSXReply r = fdl.psx_queue(this, id, null, PSX.PSX_WAIT_RD, null);
+		return r;
+	}
+
+	public void waitRd(int id, PSXCallback callback) {
+		fdl.psx_queue(this, id, null, PSX.PSX_WAIT_RD, callback);
+	}
+
 }
 
 
--- a/src/fdl/TupleSpace.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/TupleSpace.java	Wed Feb 08 18:02:40 2012 +0900
@@ -39,6 +39,8 @@
         ByteBuffer data = ByteBuffer.allocate(10);
         ByteBuffer r = ByteBuffer.allocate(10);
         int value = user;
+        
+        r.put((byte) '\0');
         while(value>0) {
             r.put((byte) (value%10 + '0'));
             value /= 10;
@@ -55,13 +57,18 @@
 	}
 	
 	protected void Out(SelectionKey key,ByteBuffer command, ByteBuffer data) {
-		Tuple tuple;
-		int id;
-		int datasize;
 		char idc = (char)command.getShort(PSX.LINDA_ID_OFFSET);
 		command.rewind();
-		id = (int)idc;
+		int id = (int)idc;
+
+		Out1(key, command, data, id);
+	}
 
+
+	private void Out1(SelectionKey key, ByteBuffer command, ByteBuffer data,
+			int id) {
+		Tuple tuple;
+		int datasize;
 		datasize = command.getInt(PSX.LINDA_DATA_LENGTH_OFFSET);
 		command.rewind();
 		
@@ -75,7 +82,7 @@
 			PSX.setAnserCommand(command, tuple_space[id].getSeq());
 			PSX.send(tuple_space[id].ch, command, data);
 
-			removeTuple(id);
+			tuple_space[id] = tuple_space[id].next;
 			tuple = null;
 		}
 		if(tuple_space[id] != null && tuple_space[id].mode == PSX.PSX_IN) {
@@ -85,7 +92,7 @@
 				if (debug) fds.log(Level.INFO,"send size "+datasize+" : mode = "+(char)'a');
 			}
 			PSX.send(tuple_space[id].ch, command, data);
-			removeTuple(id);
+			tuple_space[id] = tuple_space[id].next;
 			tuple = null;
 			// Incoming Out tuple is consumed here, and wating IN tuple is also removed.
 		} else if ((tuple_space[id] == null)|| (tuple_space[id].getMode() == PSX.PSX_OUT)) {
@@ -111,13 +118,26 @@
 		}
 	}
 
-	private void removeTuple(int id) {
-		Tuple tuple;
-		//後処理
-		tuple = tuple_space[id];
-		tuple_space[id] = tuple.next;
+	protected void Update(SelectionKey key, ByteBuffer command, ByteBuffer data) {
+		char idc = (char)command.getShort(PSX.LINDA_ID_OFFSET);
+		command.rewind();
+		int id = (int)idc;
+
+		Tuple tuple = tuple_space[id];
+		if (tuple != null) {
+			while (tuple.next != null)
+				tuple = tuple.next;
+			tuple.id = id;
+			tuple.setCommand(PSX.PSX_ANSWER, command.getInt(PSX.LINDA_SEQ_OFFSET));
+		} else {
+			tuple = new Tuple();
+			tuple.setCommand(PSX.PSX_ANSWER, id, command.getInt(PSX.LINDA_SEQ_OFFSET), ByteBuffer.allocate(0));
+		}
+		PSX.send(key, tuple.getCommand(), tuple.getData());
+		tuple_space[id] = null; 
+		Out1(key, command, data, id);
 	}
-
+	
 	protected void Wait_Rd(SelectionKey key, ByteBuffer command, int mode) {
 		Tuple tuple;
 		int id;
@@ -291,5 +311,4 @@
 		return data;
 	}
 
-
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/multiengine/MultiEngineServer.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,19 @@
+package fdl.multiengine;
+
+import fdl.FDLindaServ;
+import fdl.multiengine.meta.MetaEngineExecutor;
+import fdl.multiengine.meta.StopServerEngine;
+
+public class MultiEngineServer {
+	static MetaEngineExecutor mee;
+	
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		mee = new MetaEngineExecutor();
+		mee.addMetaEngine(new StopServerEngine(mee));
+		FDLindaServ.main(mee, args); // start server
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/multiengine/TupleClassLoader.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,45 @@
+package fdl.multiengine;
+
+import java.nio.ByteBuffer;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+import fdl.protobuf.TupleClass.ClassFile;
+
+public class TupleClassLoader extends ClassLoader implements MetaEngine {
+	public String name;
+	private byte[] file;
+	private Class<MetaEngine> clazz;
+	
+	@SuppressWarnings("unchecked")
+	public TupleClassLoader(ByteBuffer protoc) {
+		try {
+			ClassFile classFile = ClassFile.parseFrom(protoc.array());
+			name = classFile.getName();
+			file = classFile.getFile().toByteArray();
+			clazz = (Class<MetaEngine>) findClass(name);
+		} catch (InvalidProtocolBufferException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	@Override
+	public Class<?> findClass(String name) {
+		return defineClass(name, file, 0, file.length);
+	}
+
+	public void mainLoop(MetaLinda ml) {
+		@SuppressWarnings("rawtypes")
+		Class[] parameter = { MetaLinda.class };
+		try {
+			clazz.getMethod("mainLoop", parameter);
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/multiengine/TupleId.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,39 @@
+package fdl.multiengine;
+
+import java.util.HashMap;
+
+public enum TupleId {
+	MANAGE (60000),
+	STOP;
+	
+	public int id;
+	public static HashMap<Integer, TupleId> hash = new HashMap<Integer, TupleId>();
+	private static int lastId = 0; 
+
+	private TupleId(int id) {
+		this.id = id;
+		setLastId(id);
+	}
+	
+	private TupleId() {
+		this.id = incrementLastId();
+	}
+	
+	private void setLastId(int id) {
+		lastId = id;
+	}
+	
+	private int incrementLastId() {
+		return ++lastId;
+	}
+	
+	public static TupleId getTupleIdFromId(int id) {
+		return hash.get(id);
+	}
+	
+	static {
+		for (TupleId tid : TupleId.values()) {
+			hash.put(tid.id, tid);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/multiengine/meta/MetaEngineExecutor.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,33 @@
+package fdl.multiengine.meta;
+
+import java.util.LinkedList;
+
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+
+public class MetaEngineExecutor implements MetaEngine {
+	private LinkedList<MetaEngine> engines;
+	public boolean running = true;
+
+	public MetaEngineExecutor() {
+		engines = new LinkedList<MetaEngine>();
+	}
+	
+	public void mainLoop(MetaLinda ml) {
+		while (running) {
+			for (MetaEngine engine : engines) {
+				engine.mainLoop(ml);
+			}
+			ml.sync(0);
+		}
+	}
+	
+	public void addMetaEngine(MetaEngine engine) {
+		engines.add(engine);
+	}
+	
+	public void removeMetaEngine(MetaEngine engine) {
+		engines.remove(engine);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/multiengine/meta/StopServerEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,24 @@
+package fdl.multiengine.meta;
+
+import java.nio.ByteBuffer;
+
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+import fdl.PSXCallback;
+import fdl.multiengine.TupleId;
+
+public class StopServerEngine implements MetaEngine {
+	MetaEngineExecutor mee;
+
+	public StopServerEngine(MetaEngineExecutor mee) {
+		this.mee = mee;
+	}
+	
+	public void mainLoop(MetaLinda ml) {
+		ml.in(TupleId.STOP.id,
+				new PSXCallback() { public void callback(ByteBuffer reply) {
+					mee.running = false; }});
+		mee.removeMetaEngine(this);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/FDLServWithSend.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,23 @@
+package fdl.old.test.metaTransfer;
+
+import java.io.IOException;
+
+import fdl.FDLindaServ;
+import fdl.MetaLinda;
+
+
+public class FDLServWithSend extends FDLindaServ {
+	int port1;
+	public FDLServWithSend(int port,int port1) throws IOException {
+		super(port);
+		this.port1 = port1;
+	}
+
+	@Override public void mainLoop() {
+		System.out.println("change mainloop");
+		MetaLinda ml = new MetaLinda(this.tupleSpace,this);
+		MetaProtocolEngine mpe = new MetaProtocolEngine(ml,"MetaEngine", port1);
+		mpe.mainLoop(ml);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/MetaProtocolEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,95 @@
+package fdl.old.test.metaTransfer;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+public class MetaProtocolEngine implements MetaEngine {
+	private int id = 10;
+	private boolean running = true;
+	
+	private PSXLinda psx;
+	private String name;
+	MetaLinda fdl1;
+	String host = "127.0.0.1";
+	int port1;
+	private PSXLinda psx1;
+	private ByteBuffer data2 = ByteBuffer.allocate(10);
+	private int count = 1;
+
+	
+	public MetaProtocolEngine(MetaLinda ml, String string, int port1) {
+		this.name = string;
+		this.port1 = port1;
+		this.fdl1 = ml;
+	}
+
+	public void mainLoop(MetaLinda ml){
+		boolean connect = true;
+		System.out.println("MetaEngine Start");
+		while(connect){
+		try {
+			initConnect();
+			transfer();
+			connect = false;
+		} catch (IOException e) {
+			try {
+				Thread.sleep(40);
+			} catch (InterruptedException e1) {
+			}
+		}
+		}
+	}
+
+	private void initConnect(){
+		System.out.println(name);
+		boolean connectpsx = true;
+		while(connectpsx){
+		try {
+			psx = fdl1.open(host,port1);
+			connectpsx = false;
+		} catch (IOException e) {
+			try {
+				Thread.sleep(40);
+			} catch (InterruptedException e1) {
+				e1.printStackTrace();
+			}
+		}
+		}
+		System.out.println("Connect "+port1);
+		psx1 = fdl1;
+	}
+
+	private void transfer() throws IOException {
+		PSXReply in = psx.in(id);
+		System.out.println("PSXReply "+port1);
+		while (running) {
+			if(in.ready()){
+				data2 = in.getData();
+				int i = data2.getInt();
+				data2.rewind();
+				//outしたbytebufferの変更をこれ以降やっちゃいけない
+				psx1.out(id,data2);
+				
+				System.out.println("IntData0 "+port1 +i);
+				fdl1.sync(0);
+				if (count++>3) {
+					running = false;
+					break;
+				}
+				System.out.println("IntData1 "+port1 +i);
+			}
+			fdl1.sync(0);
+		}
+		assertEquals(4,count);
+	}
+
+	
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/MetaProtocolEngine_not.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,69 @@
+package fdl.old.test.metaTransfer;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+
+public class MetaProtocolEngine_not implements MetaEngine {
+	private FederatedLinda fdlmeta;
+	private ByteBuffer data = ByteBuffer.allocate(1024);
+	private int id = 10;
+	private boolean running = true;
+	
+	//ここからsend用宣言
+	private PSXLinda sendpsx,getpsx;
+	private String host = "127.0.0.1";
+	private int port;
+			
+	public MetaProtocolEngine_not(MetaLinda fdlmeta, int port) {
+		this.port = port;
+	}
+	
+	public void metaOpen(int sendport){
+		try{
+		sendpsx = fdlmeta.open(host, sendport);
+		}catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	//meta部分のデータ取得
+	public void metaTrans() {
+		try {
+			getpsx = fdlmeta.open(host, 10001);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		PSXReply in = getpsx.in(id);
+		while (running) {
+			System.out.println(in);
+			System.out.println(in.ready());
+		if(in.ready()) {
+			data = in.getData();
+			sendpsx.out(id, data);
+			running = false;
+			break;
+		}
+		}
+	}
+
+	
+	public void mainLoop(MetaLinda ml) {
+		System.out.println("MetaProtocolEngine Start");
+		fdlmeta = FederatedLinda.init();
+		if( port == 10002 ) {
+			metaOpen(10003);
+			metaTrans();
+			fdlmeta.sync();
+			System.out.println("MetaProtocolEngine Connect");
+		}
+
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/Ring/FDLServWithSend.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,22 @@
+package fdl.old.test.metaTransfer.Ring;
+
+import java.io.IOException;
+
+import fdl.FDLindaServ;
+import fdl.MetaLinda;
+
+public class FDLServWithSend extends FDLindaServ {
+	int port1;
+	public FDLServWithSend(int port,int port1) throws IOException {
+		super(port);
+		this.port1 = port1;
+	}
+	
+	@Override public void mainLoop() {
+		System.out.println("change mainloop");
+		MetaLinda ml = new MetaLinda(this.tupleSpace,this);
+		MetaProtocolEngine mpe = new MetaProtocolEngine(ml,"MetaEngine", port1, port1);
+		mpe.mainLoop(ml);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/Ring/MetaProtocolEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,100 @@
+package fdl.old.test.metaTransfer.Ring;
+
+//import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+public class MetaProtocolEngine implements MetaEngine {
+	int id = 10;
+	private boolean running = true;
+	
+	private PSXLinda psx;
+	private String name;
+	MetaLinda fdl1;
+	String host = "127.0.0.1";
+	int port1;
+	private PSXLinda psx1;
+	private ByteBuffer data = ByteBuffer.allocate(10);
+//	private int count = 1;
+	int port;
+
+	
+	public MetaProtocolEngine(MetaLinda ml, String string, int port1, int port) {
+		this.name = string;
+		this.port1 = port1;
+		this.fdl1 = ml;
+		this.port = port;
+	}
+
+	public void mainLoop(MetaLinda ml){
+		boolean connect = true;
+		System.out.println("MetaEngine Start");
+		while(connect){
+		try {
+			initConnect();
+			transfer(psx, psx1);
+			connect = false;
+		} catch (IOException e) {
+			try {
+				Thread.sleep(40);
+			} catch (InterruptedException e1) {
+			}
+		}
+		}
+	}
+
+	private void initConnect() throws IOException{
+		System.out.println(name);
+		//自分
+		psx = fdl1;
+		if (port == 10001){
+			sendData();
+			}
+		//相手
+		psx1 = fdl1.open(host,port1);
+		System.out.println("Connect "+port1);
+	}
+
+	private void sendData() throws IOException{
+		boolean connectSend = true;
+		ByteBuffer send = ByteBuffer.allocate(1024);
+		send.putInt(12);
+		send.flip();
+		while(connectSend){
+		psx.out(id, send);
+		fdl1.sync(1);
+		System.out.println("Send Data 10001");
+		connectSend = false;
+		}
+	}
+	
+	private void transfer(PSXLinda getpsx, PSXLinda sendpsx) throws IOException {
+		PSXReply in = getpsx.in(id);
+		System.out.println("PSXReply "+port1);
+		while (running) {
+			if(in.ready()){
+				data = in.getData();
+				int i = data.getInt();
+				data.rewind();
+				//outしたbytebufferの変更をこれ以降やっちゃいけない
+				sendpsx.out(id,data);
+				
+				System.out.println("IntData0 "+port1 +i);
+				fdl1.sync(1);
+				running = false;
+				System.out.println("IntData1 "+port1 +i);
+				break;
+			}
+			fdl1.sync(0);
+			}
+//		assertEquals(4,count);
+	}
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/Ring/Server.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,39 @@
+package fdl.old.test.metaTransfer.Ring;
+
+import java.io.IOException;
+
+import fdl.FDLindaServ;
+
+public class Server extends Thread {
+	int port1;
+	int port2;
+	int set;
+	private String name;
+	
+	public Server(String string, int i, int t, int s) {
+		port1 = i;
+		port2 = t;
+		name = string;
+		set = s;
+	}
+
+	public void run(){
+		String[] args = {"-p",Integer.toString(port1)};
+		System.out.println(name);
+		switch (set){
+		case 0:
+		try {
+			FDLServWithSend send = new FDLServWithSend(port1,port2);
+			send.mainLoop();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		break;
+		
+		case 1:
+		FDLindaServ.main(args);
+		break;
+		}
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/Ring/TestSend.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,47 @@
+package fdl.old.test.metaTransfer.Ring;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+
+public class TestSend extends Thread {
+	PSXLinda psxsend;
+	FederatedLinda fdlsend;
+	
+	public void run(){
+		int id = 10;
+		int port = 10001;
+		boolean connect = true;
+		String host = "127.0.0.1";
+		ByteBuffer send = ByteBuffer.allocate(1024);
+		send.putInt(12);
+		send.flip();
+		while(connect){
+		try {
+		sendData(id, port, host, send);
+		connect = false;
+		} catch(IOException e) {
+			try {
+				Thread.sleep(40);
+			} catch (InterruptedException e1) {
+				e1.printStackTrace();
+			}
+		}
+		
+		}
+	}
+
+	private void sendData(int id, int port, String host, ByteBuffer send) throws IOException {
+		fdlsend = FederatedLinda.init();
+
+			psxsend = fdlsend.open(host,port);
+			System.out.println("Connect Host1");
+			psxsend.out(id, send);
+			fdlsend.sync(1);
+			System.out.println("Send Data");
+
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/Ring/TestTransfer.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,29 @@
+package fdl.old.test.metaTransfer.Ring;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+public class TestTransfer {
+	@Test
+	public void testTransfer() throws IOException {
+		int port1 = 10001;
+		int port2 = 10002;
+		
+		Server server1 = new Server("Server1",port1, port2,0);
+		server1.start();
+
+		Server server2 = new Server("Server2",port2, port1,1);
+		server2.start();
+		
+		try {
+			server2.join();
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		
+		assertEquals(1,1);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/Ring/TestTransferRing.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,40 @@
+package fdl.old.test.metaTransfer.Ring;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class TestTransferRing {
+	Server[] servers;
+	final int serverCount = 3;
+	final int startPort = 10001;
+	@Test
+	public void testTransfer() {
+		int port = startPort;
+		
+		servers = new Server[serverCount];
+		
+		for (int i = 0; i < serverCount; i++) {
+			servers[i] = new Server("Server"+(i+1),port+i,netporot(port+i),0);
+			servers[i].start();
+		}
+		
+//		try {
+//			servers[3].join();
+//		} catch (InterruptedException e) {
+//			e.printStackTrace();
+//		}
+		
+
+		assertEquals(1,1);
+	}
+	private int netporot(int i) {
+		i++;
+		if(i >= startPort+serverCount) {
+			return startPort;
+		}
+		
+		return i;
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/Ring/TestTransferThree.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,22 @@
+package fdl.old.test.metaTransfer.Ring;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class TestTransferThree {
+	@Test
+	public void testTransfer() {
+		
+		Server server1 = new Server("Server1", 10001, 10002, 0);
+		server1.start();
+		Server server2 = new Server("Server2", 10002, 10001, 0);
+		server2.start();
+//		Server server3 = new Server("Server3", 10003, 10001, 0);
+//		server3.start();
+
+		assertEquals(1,1);
+	}
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/Server.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,20 @@
+package fdl.old.test.metaTransfer;
+
+import fdl.FDLindaServ;
+
+public class Server extends Thread {
+	int port;
+	private String name;
+	
+	public Server(String string, int i) {
+		port = i;
+		name = string;
+	}
+
+	public void run(){
+		String[] args = {"-p",Integer.toString(port)};
+		System.out.println(name);
+		FDLindaServ.main(args);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/TestSend.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,47 @@
+package fdl.old.test.metaTransfer;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+
+public class TestSend extends Thread {
+	PSXLinda psxsend;
+	FederatedLinda fdlsend;
+	
+	public void run(){
+		int id = 10;
+		int port = 10001;
+		boolean connect = true;
+		String host = "127.0.0.1";
+		ByteBuffer send = ByteBuffer.allocate(1024);
+		send.putInt(12);
+		send.flip();
+		while(connect){
+		try {
+		sendData(id, port, host, send);
+		connect = false;
+		} catch(IOException e) {
+			try {
+				Thread.sleep(40);
+			} catch (InterruptedException e1) {
+				e1.printStackTrace();
+			}
+		}
+		
+		}
+	}
+
+	private void sendData(int id, int port, String host, ByteBuffer send) throws IOException {
+		fdlsend = FederatedLinda.init();
+
+			psxsend = fdlsend.open(host,port);
+			System.out.println("Connect Host1");
+			psxsend.out(id, send);
+			fdlsend.sync(1);
+			System.out.println("Send Data");
+
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/metaTransfer/TestTransfer.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,27 @@
+package fdl.old.test.metaTransfer;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+public class TestTransfer {
+	@Test
+	public void testTransfer() throws IOException {
+		int port1 = 10001;
+		int port2 = 10002;
+		
+//		Server server1 = new Server("Server1",port1);
+//		server1.start();
+//
+		Server server2 = new Server("Server2",port2);
+		server2.start();
+		
+
+		FDLServWithSend send = new FDLServWithSend(port1, port2);
+		send.mainLoop();
+		
+		assertEquals(1,1);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/ProtocolEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,74 @@
+package fdl.old.test.transfer;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+
+public class ProtocolEngine extends Thread{
+	private PSXLinda psx;
+	private String name;
+	FederatedLinda fdl1;
+	String host = "127.0.0.1";
+	int port1 = 10001;
+	int port2 = 10002;
+	private int id = 10;
+	private PSXLinda psx1;
+	private boolean running = true;
+	private ByteBuffer data2 = ByteBuffer.allocate(10);
+
+	public ProtocolEngine(String string, int port1, int port2) {
+		this.name = string;
+		this.port1 = port1;
+		this.port2 = port2;
+	}
+
+	public void run(){
+		fdl1 = FederatedLinda.init();
+		try {
+			System.out.println(name);
+			psx = fdl1.open(host,port1);
+			System.out.println("Connect Host1");
+			psx1 = fdl1.open(host,port2);
+			System.out.println("Connect Host2");
+			// Host1にデータを送信する。
+			testSend(psx);
+			// psxにデータを用意
+			transfer(psx,psx1);
+			
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private void testSend(PSXLinda psx2) throws IOException {
+		ByteBuffer send = ByteBuffer.allocate(10);
+		send.putInt(12);
+		send.flip();
+		psx2.out(id, send);
+		psx2.sync(1);
+	}
+	
+
+	private void transfer(PSXLinda getpsx, PSXLinda sendpsx) throws IOException {
+		PSXReply in = getpsx.in(id);
+		while (running) {
+			System.out.println(in.ready());
+			if(in.ready()){
+				//psx1にデータを書き出し
+				data2 = in.getData();
+				sendpsx.out(id,data2);
+				//runningフラグをfalseする
+				running = false;
+				fdl1.sync(0);
+				break;
+			}
+			fdl1.sync();
+		}
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/Server.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,20 @@
+package fdl.old.test.transfer;
+
+import fdl.FDLindaServ;
+
+public class Server extends Thread{
+	int port;
+	private String name;
+
+	public Server(String string, int i) {
+		port = i;
+		name = string;
+	}
+
+	public void run(){
+		String[] args = {"-p",Integer.toString(port)};
+		System.out.println(name);
+		FDLindaServ.main(args);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/TestSend.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,33 @@
+package fdl.old.test.transfer;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+
+public class TestSend extends Thread {
+	PSXLinda psxsend;
+	FederatedLinda fdlsend;
+	
+	public void run(){
+		int id = 10;
+		int port = 10001;
+		String host = "127.0.0.1";
+		ByteBuffer send = ByteBuffer.allocate(1024);
+		send.putInt(12);
+		send.flip();
+		fdlsend = FederatedLinda.init();
+		try{
+			psxsend = fdlsend.open(host,port);
+			System.out.println("Connect Host1");
+			psxsend.out(id, send);
+			fdlsend.sync();
+			System.out.println("Send Data");
+		}catch (IOException e) {
+			System.out.println("例外:" + e);
+		}
+		
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/TestTransfer.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,25 @@
+package fdl.old.test.transfer;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class TestTransfer {
+	@Test
+	public void testTransfer() {
+		int port1 = 10001;
+		int port2 = 10002;
+		Server server1 = new Server("Server1",port1);
+		server1.start();
+		Server server2 = new Server("Server2",port2);
+		server2.start();
+		ProtocolEngine pe = new ProtocolEngine("ProtocolEngine",port1,port2);
+		pe.start();
+		try {
+			pe.join();
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		assertEquals(1,1);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/cluster/FDLServWithSendMeta.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,91 @@
+package fdl.old.test.transfer.cluster;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import fdl.FDLindaServ;
+import fdl.MetaLinda;
+
+
+public class FDLServWithSendMeta extends FDLindaServ {
+
+	public FDLServWithSendMeta(int port) throws IOException {
+		super(port);
+	}
+	
+	static String nextHost = null;
+	private static int localport = 10000;
+	static int chknum;
+	private static String bufstring;
+	private static int bufsize;
+	private static String txt;
+	private static int ring;
+	
+	@Override public void mainLoop() {
+		MetaLinda ml = new MetaLinda(tupleSpace, this);
+		MetaProtocolEngine mpe = new MetaProtocolEngine(ml, nextHost, chknum, bufsize, txt);
+		mpe.mainLoop(ml);
+	}
+	
+	public static void main(String[] args){
+		for (int k=0; k<args.length; ++k) {
+			if("-bufsize".equals(args[k])){
+				bufstring = args[++k];
+			} else if("-ring".equals(args[k])){
+				txt = args[++k];
+				ring = Integer.valueOf(txt);
+			} else {
+				System.err.println("引数指定の誤り:未知の引数が指定されました");
+            }
+		}
+		bufsize = Integer.parseInt(bufstring);
+		try {
+			chkhost();
+			FDLServWithSendMeta serv = new FDLServWithSendMeta(localport);
+			serv.mainLoop();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private static void chkhost() throws UnknownHostException{
+		String localhost = null;
+		BufferedReader br = null;
+		String hostTable[] = new String[ring+1];
+		try {
+			br = new BufferedReader(new FileReader("nodelist"));
+			int i = 0;
+			while (br.ready()) {
+				String line = br.readLine();
+				hostTable[i] = line;
+				i++;
+			}
+			localhost = InetAddress.getLocalHost().getHostName();
+			for (int j=0; j<hostTable.length; j++) {
+				if(localhost.equals(hostTable[j])){
+					nextHost = hostTable[++j];
+					if(j == ring) {
+						nextHost = hostTable[0];
+					}
+				}
+			}
+			
+			if(localhost.equals(hostTable[0])) {
+				chknum = 1;
+			}
+				
+			System.out.println("localhost:"+localhost);
+			System.out.println("nexthost:"+nextHost);
+		
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e){
+			e.printStackTrace();
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/cluster/HostCheck.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,64 @@
+package fdl.old.test.transfer.cluster;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.InetAddress;
+
+public class HostCheck {
+	private static String bufstring;
+	private static String txt;
+	private static Integer ring;
+	private static int bufsize;
+	private static String nextHost;
+	private static int chknum;
+
+	public static void main(String[] args) {
+		String localhost = null;
+		BufferedReader br = null;
+		for (int k=0; k<args.length; ++k) {
+			if("-bufsize".equals(args[k])){
+				bufstring = args[++k];
+			} else if("-ring".equals(args[k])){
+				txt = args[++k];
+				ring = Integer.valueOf(txt);
+			} else {
+	        System.err.println("引数指定の誤り:未知の引数が指定されました");
+            }
+		}
+		String hostTable[] = new String[ring+1];
+		bufsize = Integer.parseInt(bufstring);
+		try {
+			br = new BufferedReader(new FileReader("nodelist"));
+			int i = 0;
+			while (br.ready()) {
+				String line = br.readLine();
+				hostTable[i] = line;
+				i++;
+			}
+			localhost = InetAddress.getLocalHost().getHostName();
+			for (int j=0; j<hostTable.length; j++){
+				if(localhost.equals(hostTable[j])){
+				nextHost = hostTable[++j];
+				if(j == ring) {
+					nextHost = hostTable[0];
+				}
+			}
+			}
+			if(localhost.equals(hostTable[0])) {
+				chknum = 1;
+			}
+			
+			System.out.println("localhost:"+localhost);
+			System.out.println("nexthost:"+nextHost);
+
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e){
+			e.printStackTrace();
+		}
+		ProtocolEngine pe = new ProtocolEngine(localhost, nextHost,chknum, bufsize, txt);
+		pe.start();
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/cluster/MetaProtocolEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,177 @@
+package fdl.old.test.transfer.cluster;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+public class MetaProtocolEngine implements MetaEngine {
+	private int id = 10;
+
+	private PSXLinda psxget;
+	MetaLinda fdlmeta;
+	String host;
+	int port = 10000;
+	private PSXLinda psxsend;
+	private int chknum;
+
+	SimpleDateFormat DF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
+
+	private int bufsize;
+
+	private String time;
+	private long timelong;
+	private String start;
+	private String txt;
+	private String transfer;
+	private long transferlong;
+
+	public MetaProtocolEngine(MetaLinda ml, String host, int chknum, int bufsize, String txt) {
+		this.host = host;
+		this.fdlmeta = ml;
+		this.chknum = chknum;
+		this.bufsize = bufsize;
+		this.txt = txt;
+	}
+
+	public void mainLoop(MetaLinda ml){
+		psxget = fdlmeta;
+		if (chknum == 1) {
+			try {
+				sendData();
+				start = DF.format(new Date());
+				System.out.println("Start Time => "+start);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		boolean connect = true;
+		while(connect){
+			try {
+				initConnect();
+				transfer = DF.format(new Date());
+				transferlong = new Date().getTime();
+				System.out.println("transfer Time => "+transfer);
+				for(int l = 0; l < 1000; l++) {
+					transfer();
+				}
+				dataChk();
+				write();
+				connect = false;
+			} catch (IOException e) {
+				try {
+					Thread.sleep(40);
+				} catch (InterruptedException e1) {
+				}
+			}
+		}
+	}
+
+	private void initConnect(){
+		boolean connectpsx = true;
+		while(connectpsx){
+			try {
+				psxsend = fdlmeta.open(host, port);
+				connectpsx = false;
+			} catch (IOException e) {
+				try {
+					Thread.sleep(40);
+				} catch (InterruptedException e1) {
+					e1.printStackTrace();
+				}
+			}
+		}
+	}
+
+	private void sendData() throws IOException{
+		boolean connectSend = true;
+		ByteBuffer send = ByteBuffer.allocate(bufsize);
+		byte[] fdata = new byte[bufsize];
+		//		fdata = InetAddress.getLocalHost().getAddress();
+		for(int n=0; n < fdata.length; n++ ){
+			fdata[n] = 1;
+		}
+		send.put(fdata);
+		send.flip();
+		while(connectSend){
+			psxget.out(id, send);
+			psxget.sync(1);
+			System.out.println("Send Data");
+			connectSend = false;
+		}
+	}
+
+	public void transfer() throws IOException {
+		ByteBuffer data = ByteBuffer.allocate(bufsize);
+		boolean running = true;
+		PSXReply in = psxget.in(id);
+		while (running) {
+			if(in.ready()){
+				data = in.getData();
+				psxsend.out(id,data);
+				System.out.println("connect to => "+host);
+				psxsend.sync(1);
+				running = false;
+				break;
+			}
+			fdlmeta.sync(0);
+		}
+	}
+
+	public void dataChk() throws IOException{
+		fdlmeta.sync(1);
+		boolean running2 = true;
+		//		ByteBuffer data2 = ByteBuffer.allocate(bufsize);
+		PSXReply in2 = psxget.in(id);
+		//		byte[] fdata2 = new byte[bufsize];
+		//		byte[] fdata3 = new byte[bufsize];
+		//		fdata = InetAddress.getLocalHost().getAddress();
+		//		for(int n=0; n < fdata2.length; n++ ){
+		//			fdata2[n] = 1;
+		//		}
+		while (running2) {
+			psxget.sync(1);
+			if(in2.ready()) {
+				//				data2 = in2.getData();
+				//				data2.get(fdata3);
+				//				if (fdata2 == fdata3){
+				time = DF.format(new Date());
+				timelong = new Date().getTime();
+				System.out.println("Around Time => "+time);
+				//				}
+				running2 = false;
+				break;
+			}
+		}
+	}
+
+
+	public void write() throws IOException{
+		long result = (timelong - transferlong);
+		String diff = String.valueOf(result);
+		File read = new File("resultTime"+bufsize+"_"+txt+".txt");
+		read.createNewFile();
+		FileWriter filewrite = new FileWriter(read);
+		if (start != "null"){
+			filewrite.write("ServerStart => "+start+"\r\n");
+		}
+		if (transfer != "null") {
+			filewrite.write("TransferTime => "+transfer+"\r\n");
+		}
+		if (time != "null"){
+			filewrite.write("AroundTime => "+time+"\r\n");
+		}
+		if (diff != "null"){
+			filewrite.write("DiffTime => "+diff+"\r\n");
+		}
+		filewrite.close();
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/cluster/ProtocolEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,147 @@
+package fdl.old.test.transfer.cluster;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.nio.ByteBuffer;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+
+public class ProtocolEngine extends Thread{
+	static int id = 10;
+	static FederatedLinda fdl;
+	static PSXLinda getpsx;
+	static PSXLinda sendpsx;
+	static int port = 10000;
+	String getHost = null;
+	String sendHost = null;
+	private int chknum;
+	private int bufsize;
+	private String txt;
+	SimpleDateFormat DF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
+	private String time;
+	private long timelong;
+	private String start;
+	private String transfer;
+	private long transferlong;
+	
+	public ProtocolEngine(String gethost, String sendhost, int chknum, int bufsize, String txt) {
+		this.getHost = gethost;
+		this.sendHost = sendhost;
+		this.chknum = chknum;
+		this.bufsize = bufsize;
+		this.txt = txt;
+	}
+
+	public void run(){
+		fdl = FederatedLinda.init();
+		try {
+			getpsx = fdl.open(getHost,port);
+			System.out.println("Connect Host1");
+			sendpsx = fdl.open(sendHost,port);
+			System.out.println("Connect Host2");
+			// Host1にデータを送信する。
+			if(chknum == 1){
+			testSend(getpsx);
+			start = DF.format(new Date());
+			System.out.println("Start Time => "+start);
+			}
+			// psxにデータを用意
+			transfer(getpsx,sendpsx);
+			dataChk();
+			write();
+			
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private void write() throws IOException {
+		long result = (timelong - transferlong);
+		String diff = String.valueOf(result);
+		File read = new File("resultTime"+bufsize+"_"+txt+".txt");
+		read.createNewFile();
+		FileWriter filewrite = new FileWriter(read);
+		if (start != "null"){
+		filewrite.write("ServerStart => "+start+"\r\n");
+		}
+		if (transfer != "null") {
+		filewrite.write("TransferTime => "+transfer+"\r\n");
+		}
+		if (time != "null"){
+		filewrite.write("AroundTime => "+time+"\r\n");
+		}
+		if (diff != "null"){
+		filewrite.write("DiffTime => "+diff+"\r\n");
+		}
+		filewrite.close();
+	}
+
+	private void dataChk() throws IOException {
+		fdl.sync(1);
+		boolean running2 = true;
+		ByteBuffer data3 = ByteBuffer.allocate(bufsize);
+		PSXReply in2 = getpsx.in(id);
+		int localhost2 = InetAddress.getLocalHost().hashCode();
+		while (running2) {
+			getpsx.sync(1);
+			if(in2.ready()) {
+			data3 = in2.getData();
+			int i = data3.getInt();
+			if (i == localhost2){
+				time = DF.format(new Date());
+				timelong = new Date().getTime();
+				System.out.println("Around Time => "+time);
+			}
+			running2 = false;
+			break;
+			}
+		}
+		
+	}
+
+	private void testSend(PSXLinda psx2) throws IOException {
+		boolean connectSend = true;
+		ByteBuffer send = ByteBuffer.allocate(bufsize);
+		int localhost = InetAddress.getLocalHost().hashCode();
+		send.putInt(localhost);
+		send.flip();
+		while(connectSend){
+		psx2.out(id, send);
+		psx2.sync(1);
+		System.out.println("Send Data");
+		connectSend = false;
+		}
+	}
+	
+
+	private void transfer(PSXLinda getpsx, PSXLinda sendpsx) throws IOException {
+		ByteBuffer data2 = ByteBuffer.allocate(bufsize);
+		PSXReply in = getpsx.in(id);
+		boolean running = true;
+		while (running) {
+			if(in.ready()){
+				//psx1にデータを書き出し
+				data2 = in.getData();
+				sendpsx.out(id,data2);
+				//runningフラグをfalseする
+				running = false;
+				transfer = DF.format(new Date());
+				transferlong = new Date().getTime();
+				System.out.println("transfer Time => "+transfer);
+				System.out.println("connect to => "+sendHost);
+				sendpsx.sync(1);
+				break;
+			}
+			fdl.sync();
+		}
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/cluster/ProtocolEngineMain.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,72 @@
+package fdl.old.test.transfer.cluster;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+public class ProtocolEngineMain {
+	static int id = 10;
+	static FederatedLinda fdl;
+	static PSXLinda getpsx;
+	static PSXLinda sendpsx;
+	static int port = 10000;
+	private static String getHost = null;
+	private static String sendHost = null;
+	
+	public static void main(String[] args) {
+		for (int i=0; i<args.length; ++i) {
+			if("-get".equals(args[i])){
+				getHost = args[++i];
+			} else if("-send".equals(args[i])){
+				sendHost = args[++i];
+			} else {
+	        System.err.println("引数指定の誤り:未知の引数が指定されました");
+            }
+		}
+		fdl = FederatedLinda.init();
+		try {
+			getpsx = fdl.open(getHost,port);
+			System.out.println("Connect Host1");
+			sendpsx = fdl.open(sendHost,port);
+			System.out.println("Connect Host2");
+			// Host1にデータを送信する。
+//			ByteBuffer send = ByteBuffer.allocate(10);
+//			send.putInt(12);
+//			send.flip();
+//			getpsx.out(id , send);
+//			fdl.sync(1);
+//			System.out.println("Send Data");
+			// psxにデータを用意
+			boolean running = true;
+			ByteBuffer data2 = ByteBuffer.allocate(10);
+			PSXReply in = getpsx.in(id);
+			while (running) {
+				if(in.ready()){
+					//psx1にデータを書き出し
+					data2 = in.getData();
+					sendpsx.out(id,data2);
+					int i = data2.getInt();
+					data2.rewind();
+					System.out.println("transfer Data => "+i);
+					//runningフラグをfalseする
+					running = false;
+					sendpsx.sync(1);
+					System.out.println("Transfer Data");
+					break;
+				}
+				SimpleDateFormat DF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
+				System.out.println(DF.format(new Date()));
+				fdl.sync();
+			}
+			
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/cluster/Server.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,16 @@
+package fdl.old.test.transfer.cluster;
+
+import fdl.FDLindaServ;
+
+public class Server extends Thread{
+	int port;
+
+	public Server() {
+	}
+
+	public void run(){
+		String[] args = {"-p",Integer.toString(port)};
+		FDLindaServ.main(args);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/cluster/ServerMain.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,12 @@
+package fdl.old.test.transfer.cluster;
+
+import fdl.FDLindaServ;
+
+public class ServerMain{	
+	public static void main(String[] args){
+		int port = 10000;
+		String[] args1 = {"-p",Integer.toString(port)};
+		FDLindaServ.main(args1);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/cluster/TestGet.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,48 @@
+package fdl.old.test.transfer.cluster;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+
+public class TestGet extends Thread {
+	private PSXLinda psxget;
+	private FederatedLinda fdlget;
+	private int port;
+	String host = "127.0.0.1";
+	private ByteBuffer data = ByteBuffer.allocate(1024);
+	
+	public TestGet(int port1) {
+		this.port = port1;
+	}
+	
+	public void run(){
+		int id = 10;
+		int i;
+		fdlget = FederatedLinda.init();
+		try {
+			System.out.println("TestGet Start");
+			psxget = fdlget.open(host, port);
+			System.out.println("Host1 connected");
+			//getにidのタプルを取り出す
+			PSXReply dataGet = psxget.in(id);
+			System.out.println("dataget");
+			System.out.println(dataGet.ready());
+			if(dataGet.ready()){
+				System.out.println(dataGet);
+				data = dataGet.getData();
+				fdlget.sync(1);
+				i = data.getInt();
+				System.out.println(i);
+			}
+		} catch (IOException e) {
+			try {
+				Thread.sleep(10);
+			} catch (InterruptedException e1) {
+			}
+		}
+		}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/cluster/TestSend.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,46 @@
+package fdl.old.test.transfer.cluster;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+
+public class TestSend {
+	static PSXLinda psxsend;
+	static FederatedLinda fdlsend;
+	private static int port = 10000;
+
+	public static void main(String[] args){
+		int id = 10;
+		int i;
+		String host = "cls001.cs.ie.u-ryukyu.ac.jp";
+		ByteBuffer send = ByteBuffer.allocate(1024);
+		send.putInt(12);
+		send.flip();
+		i = send.getInt();
+		send.rewind();
+		fdlsend = FederatedLinda.init();
+		boolean connect = true;
+		while(connect) {
+		try{
+			System.out.println("TestSend Start");
+			psxsend = fdlsend.open(host,port);
+			System.out.println("Set Data = " +i);
+			System.out.println("Connect Host1");
+			psxsend.out(id, send);
+			System.out.println("regist Que");
+			fdlsend.sync();
+			System.out.println("Send Data");
+			connect = false;
+		}catch (IOException e) {
+			try {
+				Thread.sleep(40);
+			} catch (InterruptedException e1) {
+			}
+		}
+		}
+	}
+
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/three/ProtocolEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,82 @@
+package fdl.old.test.transfer.three;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+
+public class ProtocolEngine extends Thread{
+	private PSXLinda psx;
+	private String name;
+	FederatedLinda fdl1;
+	String host = "127.0.0.1";
+	int port1;
+	int port2;
+	private int id = 10;
+	private PSXLinda psx1;
+	private boolean running = true;
+	private ByteBuffer data2 = ByteBuffer.allocate(10);
+	private int count = 1;
+
+	public ProtocolEngine(String string, int port1, int port2) {
+		this.name = string;
+		this.port1 = port1;
+		this.port2 = port2;
+	}
+
+	public void run(){
+		fdl1 = FederatedLinda.init();
+		boolean connect = true;
+		while(connect){
+		try {
+			initConnect();
+			transfer();
+			connect = false;
+		} catch (IOException e) {
+			try {
+				Thread.sleep(40);
+			} catch (InterruptedException e1) {
+			}
+		}
+		}
+	}
+
+	private void initConnect() throws IOException {
+		System.out.println(name);
+		psx = fdl1.open(host,port1);
+		System.out.println("Connect "+port1);
+		psx1 = fdl1.open(host,port2);
+		System.out.println("Connect "+port2);
+	}
+
+	private void transfer() throws IOException {
+		PSXReply in = psx.in(id);
+		System.out.println("PSXReply "+port1 +": "+port2 +": ");
+		while (running) {
+			if(in.ready()){
+				data2 = in.getData();
+				int i = data2.getInt();
+				data2.rewind();
+				//outしたbytebufferの変更をこれ以降やっちゃいけない
+				psx1.out(id,data2);
+				
+				System.out.println("IntData0 "+port1 +": "+port2 +": " +i);
+				fdl1.sync(1);
+				if (count++>3) {
+					running = false;
+					break;
+				}
+				System.out.println("IntData1 "+port1 +": "+port2 +": " +i);
+			}
+			fdl1.sync();
+		}
+		assertEquals(4,count);
+	}
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/three/Server.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,20 @@
+package fdl.old.test.transfer.three;
+
+import fdl.FDLindaServ;
+
+public class Server extends Thread {
+	int port;
+	private String name;
+
+	public Server(String string, int i) {
+		port = i;
+		name = string;
+	}
+
+	public void run(){
+		String[] args = {"-p",Integer.toString(port)};
+		System.out.println(name+"start");
+		FDLindaServ.main(args);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/three/TestGet.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,55 @@
+package fdl.old.test.transfer.three;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+
+public class TestGet extends Thread {
+	PSXLinda psxget;
+	FederatedLinda fdlget;
+	private int port;
+	String host = "127.0.0.1";
+	private ByteBuffer data = ByteBuffer.allocate(10);
+	
+	public TestGet(int port1) {
+		this.port = port1;
+	}
+	
+	public void run(){
+		int id = 10;
+		int i;
+		fdlget = FederatedLinda.init();
+		boolean connecttest = true;
+		while(connecttest){
+		try {
+			getData(id);
+			i = data.getInt();
+			System.out.println(i);
+			connecttest = false;
+		} catch (IOException e) {
+				e.printStackTrace();
+				connecttest = true;
+		}
+		}
+	}
+
+	private void getData(int id) throws IOException {
+		psxget = fdlget.open(host, port);
+		PSXReply get = psxget.in(id);
+		boolean running = false;
+		while(running){
+			if(get.ready()){
+				data = get.getData();
+				running = false;
+				fdlget.sync(0);
+				break;
+			}
+		fdlget.sync();
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/three/TestSend.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,48 @@
+package fdl.old.test.transfer.three;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+
+public class TestSend extends Thread {
+	PSXLinda psxsend;
+	FederatedLinda fdlsend;
+	private int port;
+	
+	public TestSend(int port1) {
+		this.port = port1;
+	}
+
+	public void run(){
+		int id = 10;
+		int i;
+		String host = "127.0.0.1";
+		ByteBuffer send = ByteBuffer.allocate(1024);
+		send.putInt(12);
+		send.flip();
+		i = send.getInt();
+		send.rewind();
+		fdlsend = FederatedLinda.init();
+		boolean connect = true;
+		while(connect) {
+		try{
+			psxsend = fdlsend.open(host,port);
+			System.out.println("Set Data = " +i);
+			System.out.println("Connect Host1");
+			psxsend.out(id, send);
+			System.out.println("regist Que");
+			fdlsend.sync(1);
+			System.out.println("Send Data");
+			connect = false;
+		}catch (IOException e) {
+			try {
+				Thread.sleep(20);
+			} catch (InterruptedException e1) {
+			}
+		}
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/three/TestTransfer.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,52 @@
+package fdl.old.test.transfer.three;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+
+public class TestTransfer {
+	Server[] servers;
+	ProtocolEngine[] engines;
+	final int serverCount = 3;
+	final int startPort = 10011;
+	@Test
+	public void testTransfer() {
+		int port = startPort;
+		servers = new Server[serverCount];
+		engines = new ProtocolEngine[serverCount];
+		
+		for (int i = 0; i < serverCount; i++) {
+			servers[i] = new Server("Server"+(i+1),port+i);
+			servers[i].start();
+		}
+		
+		TestSend send = new TestSend(startPort);
+		send.start();
+		try{
+			send.join();
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		
+		for (int i = 0; i < serverCount; i++) {
+			engines[i] = new ProtocolEngine("ProtocolEngine "+(i+1) +":port " +(port+i) +":port "+(netporot(port+i)),port+i,netporot(port+i));
+			engines[i].start();
+		}
+		try {
+			for (ProtocolEngine e: engines){
+				e.join();
+			}
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		assertEquals(1,1);
+	}
+	private int netporot(int i) {
+		i++;
+		if(i >= startPort+serverCount) {
+			return startPort;
+		}
+		return i;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/two/ProtocolEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,67 @@
+package fdl.old.test.transfer.two;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+
+public class ProtocolEngine extends Thread{
+	private static PSXLinda psx;
+	private static String name;
+	static FederatedLinda fdl1;
+	static String host = "127.0.0.1";
+	static int port1 = 10001;
+	static int port2 = 10002;
+	private static int id = 10;
+	private static PSXLinda psx1;
+	private static boolean running;
+	private static ByteBuffer data2 = ByteBuffer.allocate(10);
+
+	public static void main(String[] args){
+		fdl1 = FederatedLinda.init();
+		try {
+			System.out.println(name);
+			psx = fdl1.open(host,port1);
+			System.out.println("Connect Host1");
+			psx1 = fdl1.open(host,port2);
+			System.out.println("Connect Host2");
+			// Host1にデータを送信する。
+			testSend(psx);
+			// psxにデータを用意
+			transfer(psx,psx1);
+			
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private static void testSend(PSXLinda psx2) throws IOException {
+		ByteBuffer send = ByteBuffer.allocate(10);
+		send.putInt(12);
+		send.flip();
+		psx2.out(id, send);
+		psx2.sync(0);
+	}
+	
+
+	private static void transfer(PSXLinda psx2, PSXLinda psx12) throws IOException {
+		PSXReply in = psx2.in(id);
+		while (running) {
+			if(in.ready()){
+				//psx1にデータを書き出し
+				data2 = in.getData();
+				psx12.out(id,data2);
+				//runningフラグをfalseする
+				running = false;
+				fdl1.sync(0);
+				break;
+			}
+			fdl1.sync();
+		}
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/two/Server.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,20 @@
+package fdl.old.test.transfer.two;
+
+import fdl.FDLindaServ;
+
+public class Server extends Thread {
+	int port;
+	private String name;
+
+	public Server(String string, int i) {
+		port = i;
+		name = string;
+	}
+
+	public void run(){
+		String[] args = {"-p",Integer.toString(port)};
+		System.out.println(name);
+		FDLindaServ.main(args);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/two/TestGet.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,44 @@
+package fdl.old.test.transfer.two;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+
+public class TestGet extends Thread {
+	private static PSXLinda psxget;
+	private static FederatedLinda fdlget;
+	private static int port = 10001;
+	static String host = "127.0.0.1";
+	private static ByteBuffer data = ByteBuffer.allocate(1024);
+	
+	public static void main(String[] args){
+		int id = 10;
+		int i;
+		fdlget = FederatedLinda.init();
+		try {
+			System.out.println("TestGet Start");
+			psxget = fdlget.open(host, port);
+			System.out.println("Host1 connected");
+			//getにidのタプルを取り出す
+			PSXReply dataGet = psxget.in(id);
+			System.out.println("dataget");
+			System.out.println(dataGet.ready());
+			if(dataGet.ready()){
+				System.out.println(dataGet);
+				data = dataGet.getData();
+				fdlget.sync(1);
+				i = data.getInt();
+				System.out.println(i);
+			}
+		} catch (IOException e) {
+			try {
+				Thread.sleep(10);
+			} catch (InterruptedException e1) {
+			}
+		}
+		}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/two/TestSend.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,50 @@
+package fdl.old.test.transfer.two;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+
+public class TestSend extends Thread {
+	PSXLinda psxsend;
+	FederatedLinda fdlsend;
+	private int port;
+	
+	public TestSend(int port1) {
+		this.port = port1;
+	}
+
+	public void run(){
+		int id = 10;
+		int i;
+		String host = "127.0.0.1";
+		ByteBuffer send = ByteBuffer.allocate(1024);
+		send.putInt(12);
+		send.flip();
+		i = send.getInt();
+		send.rewind();
+		fdlsend = FederatedLinda.init();
+		boolean connect = true;
+		while(connect) {
+		try{
+			System.out.println("TestSend Start");
+			psxsend = fdlsend.open(host,port);
+			System.out.println("Set Data = " +i);
+			System.out.println("Connect Host1");
+			psxsend.out(id, send);
+			System.out.println("regist Que");
+			fdlsend.sync(1);
+			System.out.println("Send Data");
+			connect = false;
+		}catch (IOException e) {
+			try {
+				Thread.sleep(40);
+			} catch (InterruptedException e1) {
+			}
+		}
+		}
+	}
+
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test/transfer/two/TestTransfer.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,21 @@
+package fdl.old.test.transfer.two;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class TestTransfer {
+	@Test
+	public void testTransfer() throws InterruptedException {
+		int port = 10001;
+		Server server = new Server("Server1",port);
+		server.start();
+		server.join();
+		TestSend send = new TestSend(port);
+		send.start();
+
+		send.join();
+
+		assertEquals(1,1);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test2/CountTest.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,42 @@
+package fdl.old.test2;
+
+class CountA implements Runnable {
+
+	public void run() {
+		for (int i=0; i <= 5; i++) {
+			System.out.println("A: " + i);
+		}
+	}
+}
+
+class CountB implements Runnable {
+
+	public void run() {
+		for (int i=5; i >= 0; i--) {
+			System.out.println("	B: " + i);
+		}
+	}
+}
+
+class CountTest {
+	public static void main(String[] args) {
+		// ランナブルクラスのインスタンス化
+		CountA runA = new CountA();
+		CountB runB = new CountB();
+		System.out.println("Runnable Class のインスタンス化終了");
+
+		// スレッドのインスタンス化
+		Thread threadA = new Thread(runA);
+		Thread threadB = new Thread(runB);
+		System.out.println("Thread へ受け渡し終了");
+
+		// スレッドの開始
+		threadA.start();
+		threadB.start();
+		System.out.println("Thread の start() 終了");
+		System.out.println("適時自動的に run() が実行される");
+
+
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test2/Server.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,35 @@
+package fdl.old.test2;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.Date;
+
+public class Server extends Thread{
+	static int Port = 10007;
+    
+	public void run(){
+		try {
+		ServerSocket server = new ServerSocket(Port);
+		Socket sock =null;
+		System.out.println("Server Start");
+		sock = server.accept();
+		System.out.println("Connect");
+		PrintWriter ps = new PrintWriter(sock.getOutputStream());
+		Date d = new Date();
+		ps.print(d + "\r\n");
+		ps.flush();
+		sock.close(); // クライアントからの接続を切断
+	    System.out.println("Connection Closed");
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	} 
+
+    public static void main(String[] args) {
+    	Server sv = new Server();
+    	sv.start();
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test2/TestRead.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,26 @@
+package fdl.old.test2;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class TestRead {
+
+	    public static void main(String[] args) {
+	        try {
+	        	File inputFile = new File(args[0]);
+	        	FileReader in = new FileReader(inputFile);
+	            BufferedReader br = new BufferedReader(in);
+	            String line;
+	            while ((line = br.readLine()) != null) {
+	                System.out.println(line);
+	            }
+	            br.close();
+	            in.close();
+	        } catch (IOException e) {
+	            System.out.println(e);
+	        }
+	    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test2/TestRing.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,51 @@
+package fdl.old.test2;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.FederatedLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+public class TestRing {
+	static int id;
+	public static void main(String args[]){
+		
+		try{
+		FederatedLinda fdl;
+		PSXLinda psx;
+		String host = "127.0.0.1";
+		PSXReply r;
+
+		FileReader in = new FileReader("nodelist");
+		BufferedReader br = new BufferedReader(in);
+		String line;
+		
+		while ((line = br.readLine()) != null) {
+		int i1 = Integer.parseInt(line);
+		fdl = FederatedLinda.init();
+		psx = fdl.open(host,i1);
+		r = psx.in(65535);
+		fdl.sync(1);
+		
+		ByteBuffer data = ByteBuffer.allocate(10);
+		data.putInt(10);
+		data.flip();
+
+		psx.out(1,data);
+		while(!r.ready()){
+		psx.sync(0);
+		}
+		}
+        br.close();
+        in.close();
+
+
+		}catch (IOException e) {
+			System.err.println("Communication failure.");
+		}
+	
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test2/client.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,26 @@
+package fdl.old.test2;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.Socket;
+
+public class client {
+	public static void main(String arg[]) throws IOException{
+		String www = arg[0];
+		int port = 10007;
+		Socket sock;
+		BufferedReader dis;
+//		PrintWriter ps;
+		sock = new Socket(www,port);
+		dis = new BufferedReader(new InputStreamReader(sock.getInputStream()));
+//		ps = new PrintWriter(sock.getOutputStream(),true);
+//		ps.println("Get"+arg[1]);
+//		String s = null;
+//		while((s = dis.readLine()) != null){
+			System.out.println(dis);
+//		}
+		sock.close();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/old/test2/nodelist	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,2 @@
+10000
+10001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/protobuf/Aqua.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,758 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: aquarium.proto
+
+package fdl.protobuf;
+
+public final class Aqua {
+  private Aqua() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public static final class Width extends
+      com.google.protobuf.GeneratedMessage {
+    // Use Width.newBuilder() to construct.
+    private Width() {
+      initFields();
+    }
+    private Width(boolean noInit) {}
+    
+    private static final Width defaultInstance;
+    public static Width getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public Width getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return fdl.protobuf.Aqua.internal_static_aqua_Width_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return fdl.protobuf.Aqua.internal_static_aqua_Width_fieldAccessorTable;
+    }
+    
+    // required int32 width = 1;
+    public static final int WIDTH_FIELD_NUMBER = 1;
+    private boolean hasWidth;
+    private int width_ = 0;
+    public boolean hasWidth() { return hasWidth; }
+    public int getWidth() { return width_; }
+    
+    private void initFields() {
+    }
+    public final boolean isInitialized() {
+      if (!hasWidth) return false;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (hasWidth()) {
+        output.writeInt32(1, getWidth());
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (hasWidth()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(1, getWidth());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    public static fdl.protobuf.Aqua.Width parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Width parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Width parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Width parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Width parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Width parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Width parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static fdl.protobuf.Aqua.Width parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static fdl.protobuf.Aqua.Width parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Width parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(fdl.protobuf.Aqua.Width prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder> {
+      private fdl.protobuf.Aqua.Width result;
+      
+      // Construct using fdl.protobuf.Aqua.Width.newBuilder()
+      private Builder() {}
+      
+      private static Builder create() {
+        Builder builder = new Builder();
+        builder.result = new fdl.protobuf.Aqua.Width();
+        return builder;
+      }
+      
+      protected fdl.protobuf.Aqua.Width internalGetResult() {
+        return result;
+      }
+      
+      public Builder clear() {
+        if (result == null) {
+          throw new IllegalStateException(
+            "Cannot call clear() after build().");
+        }
+        result = new fdl.protobuf.Aqua.Width();
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(result);
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return fdl.protobuf.Aqua.Width.getDescriptor();
+      }
+      
+      public fdl.protobuf.Aqua.Width getDefaultInstanceForType() {
+        return fdl.protobuf.Aqua.Width.getDefaultInstance();
+      }
+      
+      public boolean isInitialized() {
+        return result.isInitialized();
+      }
+      public fdl.protobuf.Aqua.Width build() {
+        if (result != null && !isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return buildPartial();
+      }
+      
+      private fdl.protobuf.Aqua.Width buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        if (!isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return buildPartial();
+      }
+      
+      public fdl.protobuf.Aqua.Width buildPartial() {
+        if (result == null) {
+          throw new IllegalStateException(
+            "build() has already been called on this Builder.");
+        }
+        fdl.protobuf.Aqua.Width returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof fdl.protobuf.Aqua.Width) {
+          return mergeFrom((fdl.protobuf.Aqua.Width)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(fdl.protobuf.Aqua.Width other) {
+        if (other == fdl.protobuf.Aqua.Width.getDefaultInstance()) return this;
+        if (other.hasWidth()) {
+          setWidth(other.getWidth());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              setWidth(input.readInt32());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // required int32 width = 1;
+      public boolean hasWidth() {
+        return result.hasWidth();
+      }
+      public int getWidth() {
+        return result.getWidth();
+      }
+      public Builder setWidth(int value) {
+        result.hasWidth = true;
+        result.width_ = value;
+        return this;
+      }
+      public Builder clearWidth() {
+        result.hasWidth = false;
+        result.width_ = 0;
+        return this;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:aqua.Width)
+    }
+    
+    static {
+      defaultInstance = new Width(true);
+      fdl.protobuf.Aqua.internalForceInit();
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:aqua.Width)
+  }
+  
+  public static final class Position extends
+      com.google.protobuf.GeneratedMessage {
+    // Use Position.newBuilder() to construct.
+    private Position() {
+      initFields();
+    }
+    private Position(boolean noInit) {}
+    
+    private static final Position defaultInstance;
+    public static Position getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public Position getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return fdl.protobuf.Aqua.internal_static_aqua_Position_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return fdl.protobuf.Aqua.internal_static_aqua_Position_fieldAccessorTable;
+    }
+    
+    // required float x = 1;
+    public static final int X_FIELD_NUMBER = 1;
+    private boolean hasX;
+    private float x_ = 0F;
+    public boolean hasX() { return hasX; }
+    public float getX() { return x_; }
+    
+    // required float y = 2;
+    public static final int Y_FIELD_NUMBER = 2;
+    private boolean hasY;
+    private float y_ = 0F;
+    public boolean hasY() { return hasY; }
+    public float getY() { return y_; }
+    
+    // required float angle_x = 3;
+    public static final int ANGLE_X_FIELD_NUMBER = 3;
+    private boolean hasAngleX;
+    private float angleX_ = 0F;
+    public boolean hasAngleX() { return hasAngleX; }
+    public float getAngleX() { return angleX_; }
+    
+    // required float angle_y = 4;
+    public static final int ANGLE_Y_FIELD_NUMBER = 4;
+    private boolean hasAngleY;
+    private float angleY_ = 0F;
+    public boolean hasAngleY() { return hasAngleY; }
+    public float getAngleY() { return angleY_; }
+    
+    private void initFields() {
+    }
+    public final boolean isInitialized() {
+      if (!hasX) return false;
+      if (!hasY) return false;
+      if (!hasAngleX) return false;
+      if (!hasAngleY) return false;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (hasX()) {
+        output.writeFloat(1, getX());
+      }
+      if (hasY()) {
+        output.writeFloat(2, getY());
+      }
+      if (hasAngleX()) {
+        output.writeFloat(3, getAngleX());
+      }
+      if (hasAngleY()) {
+        output.writeFloat(4, getAngleY());
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (hasX()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(1, getX());
+      }
+      if (hasY()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(2, getY());
+      }
+      if (hasAngleX()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(3, getAngleX());
+      }
+      if (hasAngleY()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(4, getAngleY());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    public static fdl.protobuf.Aqua.Position parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Position parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Position parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Position parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Position parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Position parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Position parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static fdl.protobuf.Aqua.Position parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static fdl.protobuf.Aqua.Position parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static fdl.protobuf.Aqua.Position parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(fdl.protobuf.Aqua.Position prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder> {
+      private fdl.protobuf.Aqua.Position result;
+      
+      // Construct using fdl.protobuf.Aqua.Position.newBuilder()
+      private Builder() {}
+      
+      private static Builder create() {
+        Builder builder = new Builder();
+        builder.result = new fdl.protobuf.Aqua.Position();
+        return builder;
+      }
+      
+      protected fdl.protobuf.Aqua.Position internalGetResult() {
+        return result;
+      }
+      
+      public Builder clear() {
+        if (result == null) {
+          throw new IllegalStateException(
+            "Cannot call clear() after build().");
+        }
+        result = new fdl.protobuf.Aqua.Position();
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(result);
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return fdl.protobuf.Aqua.Position.getDescriptor();
+      }
+      
+      public fdl.protobuf.Aqua.Position getDefaultInstanceForType() {
+        return fdl.protobuf.Aqua.Position.getDefaultInstance();
+      }
+      
+      public boolean isInitialized() {
+        return result.isInitialized();
+      }
+      public fdl.protobuf.Aqua.Position build() {
+        if (result != null && !isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return buildPartial();
+      }
+      
+      private fdl.protobuf.Aqua.Position buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        if (!isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return buildPartial();
+      }
+      
+      public fdl.protobuf.Aqua.Position buildPartial() {
+        if (result == null) {
+          throw new IllegalStateException(
+            "build() has already been called on this Builder.");
+        }
+        fdl.protobuf.Aqua.Position returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof fdl.protobuf.Aqua.Position) {
+          return mergeFrom((fdl.protobuf.Aqua.Position)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(fdl.protobuf.Aqua.Position other) {
+        if (other == fdl.protobuf.Aqua.Position.getDefaultInstance()) return this;
+        if (other.hasX()) {
+          setX(other.getX());
+        }
+        if (other.hasY()) {
+          setY(other.getY());
+        }
+        if (other.hasAngleX()) {
+          setAngleX(other.getAngleX());
+        }
+        if (other.hasAngleY()) {
+          setAngleY(other.getAngleY());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                return this;
+              }
+              break;
+            }
+            case 13: {
+              setX(input.readFloat());
+              break;
+            }
+            case 21: {
+              setY(input.readFloat());
+              break;
+            }
+            case 29: {
+              setAngleX(input.readFloat());
+              break;
+            }
+            case 37: {
+              setAngleY(input.readFloat());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // required float x = 1;
+      public boolean hasX() {
+        return result.hasX();
+      }
+      public float getX() {
+        return result.getX();
+      }
+      public Builder setX(float value) {
+        result.hasX = true;
+        result.x_ = value;
+        return this;
+      }
+      public Builder clearX() {
+        result.hasX = false;
+        result.x_ = 0F;
+        return this;
+      }
+      
+      // required float y = 2;
+      public boolean hasY() {
+        return result.hasY();
+      }
+      public float getY() {
+        return result.getY();
+      }
+      public Builder setY(float value) {
+        result.hasY = true;
+        result.y_ = value;
+        return this;
+      }
+      public Builder clearY() {
+        result.hasY = false;
+        result.y_ = 0F;
+        return this;
+      }
+      
+      // required float angle_x = 3;
+      public boolean hasAngleX() {
+        return result.hasAngleX();
+      }
+      public float getAngleX() {
+        return result.getAngleX();
+      }
+      public Builder setAngleX(float value) {
+        result.hasAngleX = true;
+        result.angleX_ = value;
+        return this;
+      }
+      public Builder clearAngleX() {
+        result.hasAngleX = false;
+        result.angleX_ = 0F;
+        return this;
+      }
+      
+      // required float angle_y = 4;
+      public boolean hasAngleY() {
+        return result.hasAngleY();
+      }
+      public float getAngleY() {
+        return result.getAngleY();
+      }
+      public Builder setAngleY(float value) {
+        result.hasAngleY = true;
+        result.angleY_ = value;
+        return this;
+      }
+      public Builder clearAngleY() {
+        result.hasAngleY = false;
+        result.angleY_ = 0F;
+        return this;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:aqua.Position)
+    }
+    
+    static {
+      defaultInstance = new Position(true);
+      fdl.protobuf.Aqua.internalForceInit();
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:aqua.Position)
+  }
+  
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_aqua_Width_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_aqua_Width_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_aqua_Position_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_aqua_Position_fieldAccessorTable;
+  
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\016aquarium.proto\022\004aqua\"\026\n\005Width\022\r\n\005width" +
+      "\030\001 \002(\005\"B\n\010Position\022\t\n\001x\030\001 \002(\002\022\t\n\001y\030\002 \002(\002" +
+      "\022\017\n\007angle_x\030\003 \002(\002\022\017\n\007angle_y\030\004 \002(\002B\024\n\014fd" +
+      "l.protobufB\004Aqua"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_aqua_Width_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_aqua_Width_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_aqua_Width_descriptor,
+              new java.lang.String[] { "Width", },
+              fdl.protobuf.Aqua.Width.class,
+              fdl.protobuf.Aqua.Width.Builder.class);
+          internal_static_aqua_Position_descriptor =
+            getDescriptor().getMessageTypes().get(1);
+          internal_static_aqua_Position_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_aqua_Position_descriptor,
+              new java.lang.String[] { "X", "Y", "AngleX", "AngleY", },
+              fdl.protobuf.Aqua.Position.class,
+              fdl.protobuf.Aqua.Position.Builder.class);
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+  
+  public static void internalForceInit() {}
+  
+  // @@protoc_insertion_point(outer_class_scope)
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/protobuf/TupleClass.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,385 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: classloader.proto
+
+package fdl.protobuf;
+
+public final class TupleClass {
+  private TupleClass() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public static final class ClassFile extends
+      com.google.protobuf.GeneratedMessage {
+    // Use ClassFile.newBuilder() to construct.
+    private ClassFile() {
+      initFields();
+    }
+    private ClassFile(boolean noInit) {}
+    
+    private static final ClassFile defaultInstance;
+    public static ClassFile getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public ClassFile getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return fdl.protobuf.TupleClass.internal_static_tupleclassloader_ClassFile_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return fdl.protobuf.TupleClass.internal_static_tupleclassloader_ClassFile_fieldAccessorTable;
+    }
+    
+    // required string name = 1;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private boolean hasName;
+    private java.lang.String name_ = "";
+    public boolean hasName() { return hasName; }
+    public java.lang.String getName() { return name_; }
+    
+    // required bytes file = 2;
+    public static final int FILE_FIELD_NUMBER = 2;
+    private boolean hasFile;
+    private com.google.protobuf.ByteString file_ = com.google.protobuf.ByteString.EMPTY;
+    public boolean hasFile() { return hasFile; }
+    public com.google.protobuf.ByteString getFile() { return file_; }
+    
+    private void initFields() {
+    }
+    public final boolean isInitialized() {
+      if (!hasName) return false;
+      if (!hasFile) return false;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (hasName()) {
+        output.writeString(1, getName());
+      }
+      if (hasFile()) {
+        output.writeBytes(2, getFile());
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (hasName()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeStringSize(1, getName());
+      }
+      if (hasFile()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(2, getFile());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    public static fdl.protobuf.TupleClass.ClassFile parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static fdl.protobuf.TupleClass.ClassFile parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static fdl.protobuf.TupleClass.ClassFile parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static fdl.protobuf.TupleClass.ClassFile parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static fdl.protobuf.TupleClass.ClassFile parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static fdl.protobuf.TupleClass.ClassFile parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static fdl.protobuf.TupleClass.ClassFile parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static fdl.protobuf.TupleClass.ClassFile parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static fdl.protobuf.TupleClass.ClassFile parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static fdl.protobuf.TupleClass.ClassFile parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(fdl.protobuf.TupleClass.ClassFile prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder> {
+      private fdl.protobuf.TupleClass.ClassFile result;
+      
+      // Construct using fdl.protobuf.TupleClass.ClassFile.newBuilder()
+      private Builder() {}
+      
+      private static Builder create() {
+        Builder builder = new Builder();
+        builder.result = new fdl.protobuf.TupleClass.ClassFile();
+        return builder;
+      }
+      
+      protected fdl.protobuf.TupleClass.ClassFile internalGetResult() {
+        return result;
+      }
+      
+      public Builder clear() {
+        if (result == null) {
+          throw new IllegalStateException(
+            "Cannot call clear() after build().");
+        }
+        result = new fdl.protobuf.TupleClass.ClassFile();
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(result);
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return fdl.protobuf.TupleClass.ClassFile.getDescriptor();
+      }
+      
+      public fdl.protobuf.TupleClass.ClassFile getDefaultInstanceForType() {
+        return fdl.protobuf.TupleClass.ClassFile.getDefaultInstance();
+      }
+      
+      public boolean isInitialized() {
+        return result.isInitialized();
+      }
+      public fdl.protobuf.TupleClass.ClassFile build() {
+        if (result != null && !isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return buildPartial();
+      }
+      
+      private fdl.protobuf.TupleClass.ClassFile buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        if (!isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return buildPartial();
+      }
+      
+      public fdl.protobuf.TupleClass.ClassFile buildPartial() {
+        if (result == null) {
+          throw new IllegalStateException(
+            "build() has already been called on this Builder.");
+        }
+        fdl.protobuf.TupleClass.ClassFile returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof fdl.protobuf.TupleClass.ClassFile) {
+          return mergeFrom((fdl.protobuf.TupleClass.ClassFile)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(fdl.protobuf.TupleClass.ClassFile other) {
+        if (other == fdl.protobuf.TupleClass.ClassFile.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          setName(other.getName());
+        }
+        if (other.hasFile()) {
+          setFile(other.getFile());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              setName(input.readString());
+              break;
+            }
+            case 18: {
+              setFile(input.readBytes());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // required string name = 1;
+      public boolean hasName() {
+        return result.hasName();
+      }
+      public java.lang.String getName() {
+        return result.getName();
+      }
+      public Builder setName(java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasName = true;
+        result.name_ = value;
+        return this;
+      }
+      public Builder clearName() {
+        result.hasName = false;
+        result.name_ = getDefaultInstance().getName();
+        return this;
+      }
+      
+      // required bytes file = 2;
+      public boolean hasFile() {
+        return result.hasFile();
+      }
+      public com.google.protobuf.ByteString getFile() {
+        return result.getFile();
+      }
+      public Builder setFile(com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasFile = true;
+        result.file_ = value;
+        return this;
+      }
+      public Builder clearFile() {
+        result.hasFile = false;
+        result.file_ = getDefaultInstance().getFile();
+        return this;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:tupleclassloader.ClassFile)
+    }
+    
+    static {
+      defaultInstance = new ClassFile(true);
+      fdl.protobuf.TupleClass.internalForceInit();
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:tupleclassloader.ClassFile)
+  }
+  
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_tupleclassloader_ClassFile_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_tupleclassloader_ClassFile_fieldAccessorTable;
+  
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\021classloader.proto\022\020tupleclassloader\"\'\n" +
+      "\tClassFile\022\014\n\004name\030\001 \002(\t\022\014\n\004file\030\002 \002(\014B\032" +
+      "\n\014fdl.protobufB\nTupleClass"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_tupleclassloader_ClassFile_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_tupleclassloader_ClassFile_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_tupleclassloader_ClassFile_descriptor,
+              new java.lang.String[] { "Name", "File", },
+              fdl.protobuf.TupleClass.ClassFile.class,
+              fdl.protobuf.TupleClass.ClassFile.Builder.class);
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+  
+  public static void internalForceInit() {}
+  
+  // @@protoc_insertion_point(outer_class_scope)
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/protobuf/classloader.proto	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,8 @@
+package tupleclassloader;
+option java_package = "fdl.protobuf";
+option java_outer_classname = "TupleClass";
+
+message ClassFile {
+  required string name = 1;
+  required bytes file = 2;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/protobuf/gen.sh	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,2 @@
+#!/bin/sh
+protoc --java_out=../../ classloader.proto
--- a/src/fdl/test/TestPSXLinda.java	Wed Feb 08 18:02:00 2012 +0900
+++ b/src/fdl/test/TestPSXLinda.java	Wed Feb 08 18:02:40 2012 +0900
@@ -69,7 +69,7 @@
 			int cnt=0;
 			while(!r.ready()) {
 				// psx.sync(1000);
-				psx.sync();
+				psx.sync(0);
 				System.out.println("Waiting...."+(cnt++));
 			}
 
@@ -77,18 +77,17 @@
 			
 			data.clear();
 			psx.out(PSX.META_STOP, data);
-			psx.sync();
+			psx.sync(0);
 			
 		} catch (IOException e) {
 			System.err.println("Communication failure.");
 		}
 	}
 
-	public static void print_id (PSXReply ans) {
+	public static void print_id (PSXReply ans) throws IOException {
 		ByteBuffer r = ans.getData();
-		id = r.getShort();
 		System.out.print("ID = ");
-		System.out.println(id);
+		System.out.write(r.array());
 	}
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/TestTree.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,493 @@
+package fdl.test;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.LinkedList;
+
+import fdl.FDLindaServ;
+import fdl.FederatedLinda;
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+import fdl.PSX;
+import fdl.PSXCallback;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+
+public class TestTree {
+	/**
+	 * Tree Walk Example
+	 *    configure tree structured federated Linda
+	 *    run message from tree root
+	 *    sum up data from the leaves
+	 */
+	public static final int PORT = 10000;
+	/**
+	 * Tuple id for the Protocol
+	 */
+	public static final int ConnectReuest = 100;
+	private static final int Down = 101;
+	public static final int Up = 102;
+	/**
+	 * Configuration binary format separator
+	 */
+	private static final int NO_HOST = -1;
+	private static final int HOST_LIST_END_MARK = -2;
+	private static final int CONNECT_LIST_END_MARK = -3;
+	/**
+	 * Global 
+	 */
+	public LinkedList<Thread> lindas = new LinkedList<Thread>(); // not used.
+	public  int id = 0;
+	public boolean debug = true;
+	
+	class TreeNode implements Runnable {
+		/**
+		 * Linda Server Thread
+		 */
+		public int id, port;
+		public TreeNode(int id, int port) { this.id = id; this.port = port; }
+		public void run() {
+			String[] args = {
+					// "-d",  // Debug Message Flag
+					"-p",Integer.toString(port)};
+			FDLindaServ.main(new TreeMetaProtocolEngine(id,port), args);
+		}
+	}
+	
+	/**
+	 * @author kono
+	 *   Tuple transfer engine for a federated linda node   
+	 *   MetaLinda is passed to mainLoop in this class
+	 */
+	class TreeMetaProtocolEngine implements MetaEngine {
+		/**
+		 * Meta Engine for Configuration and Tree Walk
+		 */
+		boolean running = true;
+		LinkedList<ByteBuffer> leftWaiter = new LinkedList<ByteBuffer>();
+		LinkedList<ByteBuffer> rightWaiter = new LinkedList<ByteBuffer>();
+		PSXLinda parent, left, right;
+		String parentHost, leftHost,rightHost;
+		int parentPort=0, leftPort=0, rightPort=0;
+		public int nodeId = 0;
+		public int nodePort  = 0;
+		public MetaLinda ml;
+
+		public TreeMetaProtocolEngine(int id, int port) {
+			nodeId = id;
+			nodePort = port;
+		}
+
+		/**
+		 *  Meta Engine Main Loop 
+		 */
+		public void mainLoop(MetaLinda meta) {
+			ml = meta;
+			/* handler of Server STOP command */
+			ml.in(PSX.META_STOP, new PSXCallback() {public void callback(ByteBuffer reply) {
+				running = false;}});
+			/* handler of Configuration */
+			ml.in(ConnectReuest, new PSXCallback() {public void callback(ByteBuffer reply) {
+				configureConnection(reply);
+				engineStart();
+				}
+			});
+			while(running) {
+				ml.sync(0);  // Wait forever
+			}
+		}
+
+		/**
+		 * Configuration of node according to configuration packet
+		 * @param reply
+		 */
+		private void configureConnection(ByteBuffer reply) {
+			parentPort = reply.getInt();
+			leftPort = reply.getInt();
+			rightPort = reply.getInt();
+			if (parentPort!=0) parentHost = getString(reply);
+			if (leftPort!=0) leftHost = getString(reply);
+			if (rightPort!=0) rightHost = getString(reply);
+		}
+
+		/**
+		 * 
+		 * Open Inter-Server Connections and start tuple communication Engine
+		 * 
+		 *       parent
+		 *          |
+		 *       self = ml (Meta Linda Server)
+		 *       /    \
+		 *    left    right
+		 *    
+		 * @param ml        Meta Linda Server
+		 * @param reply     a contents of configuration packet
+		 */
+		private void engineStart() {
+			try {
+				/**
+				 * connect to neighbors
+				 */
+				if (parentPort!=0) parent = ml.fdl.open(parentHost, parentPort);
+				if (leftPort!=0) left = ml.fdl.open(leftHost, leftPort);
+				if (rightPort!=0) right = ml.fdl.open(rightHost, rightPort);
+
+				if (debug) System.out.println("Connect this port="+nodePort+" parent="+parentPort+" left="+leftPort+" right="+rightPort);
+				/*
+				 *   Handle Downward tree walk
+				 */
+				ml.in(Down, new PSXCallback() {public void callback(ByteBuffer reply) {
+					ml.in(Down,this); // start this call back again for next packet
+					if (left==null) {
+						if (debug) System.out.println("Reached in Leaf "+nodeId+" value = "+parentPort);
+						// Leaf case
+						ByteBuffer answer = ByteBuffer.allocate(10);
+						answer.putInt(parentPort);
+						answer.flip();
+						ml.out(Up, answer);
+						return;
+					}
+					// intermediate node
+					if (debug) System.out.println("Pass it to the children from "+nodeId + " to "+ leftPort + " and " + rightPort + ".");
+					ByteBuffer copy = reply.duplicate();
+					left.out(Down, reply);
+					right.out(Down, copy);
+				}
+
+				});
+				/**
+				 *  Handle upward tree walk
+				 */
+				if (leftPort!=0)
+					left.in(Up, new PSXCallback() {public void callback(ByteBuffer reply) {
+						if (debug) System.out.println("Up from left at"+nodeId);
+						left.in(Up,this);
+						leftWaiter.add(reply);
+						checkSend(ml);
+					}
+
+					});
+				if (rightPort!=0)
+					right.in(Up, new PSXCallback() {public void callback(ByteBuffer reply) {
+						if (debug) System.out.println("Up from right at"+nodeId);
+						right.in(Up,this);
+						rightWaiter.add(reply);
+						checkSend(ml);
+					}
+					});
+			} catch (IOException e) {
+			}
+		}
+
+		/**
+		 * Wait for all message from the sub node and 
+		 * calc sum and pass it to the parent.
+		 * @param ml
+		 */
+		private void checkSend(MetaLinda ml) {
+			if (leftWaiter.isEmpty()||rightWaiter.isEmpty()) return;
+			ByteBuffer out = ByteBuffer.allocate(10);
+			int value = leftWaiter.poll().getInt()+rightWaiter.poll().getInt();
+			if (parent!=null) {
+				// intermediate node
+				if (debug) System.out.println("Up the vluae "+value+" from "+nodeId);
+				out.putInt(value);
+				out.flip();
+				ml.out(Up, out);
+			} else {
+				// Top node case
+				System.out.println("Top level node gets "+value);
+			}
+		}
+	}
+
+
+	/**
+	 * @author kono
+	 *   Configuration Manager
+	 *   Read Configuration
+	 *      start linda servers
+	 *      send connect message to the servers
+	 *      then send start message
+	 *   stop all the server with Meta stop message
+	 */
+	class Configure implements Runnable {
+		public String id;
+		public ByteBuffer config;
+		public FederatedLinda fdl;
+		public LinkedList<PSXLinda> psxs = new LinkedList<PSXLinda>();
+		private LinkedList<String> hosts = new LinkedList<String>();
+		private LinkedList<Integer> ports = new LinkedList<Integer>();
+		public Configure(int id,ByteBuffer config) { this.id = "Configure"+id; 
+		   this.config = config;
+		   }
+		public void run() {
+			String[] args = {id};
+			main(args);
+		}
+
+		/**
+		 * Configuration main
+		 * @param arg
+		 */
+		public void main(String[] arg) {
+			final String name = arg[0];
+			try {
+				fdl = FederatedLinda.init();
+				readConfigure();
+				fdl.sync(1000);
+				startTest();
+				stop();
+			} catch (IOException e) {
+				System.err.println(name+": Communication failure.");
+			}
+		}
+
+
+		/**
+		 * Send start messages to configured servers
+		 */
+		public void startTest() {
+			System.out.println("StartTest");
+			try {
+				PSXLinda psx = psxs.get(0);
+				for(int i=3;i<10;i++) {
+					sendData(psx,Down,i);
+					psx.sync(1000);
+				}
+				sleep(1000);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		
+		/**
+		 * Send Server Stop message
+		 * @throws IOException
+		 */
+		public void stop() throws IOException {
+			ByteBuffer data = ByteBuffer.allocate(10);
+			for(PSXLinda psx:psxs) {
+				psx.out(PSX.META_STOP, data.duplicate());
+				psx.sync(1);
+			}
+		}
+
+		/**
+		 * This is not used. Open with connection id
+		 * @param host
+		 * @param port
+		 * @throws IOException
+		 */
+		public void openLinda(String host, int port) throws IOException {
+			FederatedLinda fdl;
+			PSXLinda psx;
+			PSXReply r;
+			fdl = FederatedLinda.init();
+			psx = fdl.open(host,port);
+			r = psx.in(65535);
+			fdl.sync(1);
+			System.out.println(host+" port "+port +": Connected.");
+			int cnt=0;
+			while(!r.ready()) {
+				// psx.sync(1000);
+				psx.sync(10);
+				System.out.println(host+" port "+port +": Waiting...."+(cnt++));
+			}
+			print_id(r);
+			
+			return ;
+		}
+
+		/**
+		 * Read connection p configuation in a ByteBuffer
+		 * @throws IOException
+		 * 
+		 * Easy binary format, we should use more general format such as
+		 * XML or messagePack.
+		 */
+		public void readConfigure() throws IOException {
+			int mode = 0;
+			int host = 0;
+			while(config.hasRemaining()) {
+				int port = config.getInt();
+				if (mode==0) {
+					// Former part
+					// List of host and server name
+					if (port==HOST_LIST_END_MARK) { 
+						mode = 1;
+						continue;
+					}
+					String hostname = getString(config);
+					
+					psxs.add(fdl.open(hostname,port));
+					hosts.add(hostname);
+					ports.add(port);
+
+				} else {
+					// Later part
+					//    create interconnection configuration packet
+					//    send it to the server
+					if (port == CONNECT_LIST_END_MARK) return;
+					// connect this, it's parent, left and right
+					connect(host++, port,config.getInt(),config.getInt());
+				}
+			}
+		}
+		
+		/**
+		 * Make a configuration packet for a federated linda node
+		 * @param host       No. of host to configure
+		 * @param parent
+		 * @param left
+		 * @param right
+		 */
+		private void connect(int host, int parent, int left, int right) {
+			PSXLinda p = psxs.get(host);
+			ByteBuffer out = ByteBuffer.allocate(4096);
+			
+			out.putInt(parent!=NO_HOST? ports.get(parent):0);
+			out.putInt(left!=NO_HOST? ports.get(left):0);
+			out.putInt(right!=NO_HOST? ports.get(right):0);
+			if (parent!=NO_HOST) putString(out,hosts.get(parent));
+			if (left!=NO_HOST) putString(out,hosts.get(left));
+			if (right!=NO_HOST) putString(out,hosts.get(right));
+			out.flip();
+			p.out(ConnectReuest, out);
+		}
+		
+	}
+	
+	public synchronized void sleep(int time) {
+		try {
+			wait(time);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void read_wait(PSXLinda psx, PSXReply reply, String mesg) throws IOException {
+		while(!reply.ready()) psx.sync(10);
+		System.out.println(mesg);
+		System.out.println(reply.getData().getInt());
+		System.out.println("");
+	}
+
+	public ByteBuffer sendData(PSXLinda psx,int id, int n) {
+		ByteBuffer data = ByteBuffer.allocate(10);
+		data.putInt(n);
+		data.flip();
+		psx.out(id,data);
+		return data;
+	}
+
+	public void in_wait(PSXLinda psx, int i) throws IOException {
+		PSXReply r = psx.in(i);
+		while(! r.ready()) { 
+			psx.sync(10); 
+		}
+		return;
+	}
+
+	public void print_id (PSXReply ans) throws IOException {
+		ByteBuffer r = ans.getData();
+		System.out.print("ID = ");
+		System.out.write(r.array());
+		System.out.println("");
+	}
+
+
+	/**
+	 * read null terminated String in ByteBuffer
+	 * @param reply
+	 * @return
+	 */
+	public String getString(ByteBuffer reply) {
+		byte c;
+		int position = reply.position();
+		int len = 0;
+		while(reply.hasRemaining()) {
+			c = reply.get();
+			len ++;
+			if (c== 0) break;
+		}
+		return new String(reply.array(),position,len-1);
+
+	}
+	
+	/**
+	 * put String in ByteBuffer with null
+	 * @param reply 
+	 * @param s
+	 */
+	public void putString(ByteBuffer reply,String s) {
+		reply.put(s.getBytes());
+		reply.put((byte)0);
+	}
+
+	public static void main(String[] arg) throws InterruptedException {
+		TestTree me = new TestTree();
+		me.test1();
+	}
+
+	public void test1() throws InterruptedException {
+		// Make Configuration First
+		ByteBuffer config = makeConfig();
+		sleep(2000); // Wait for servers' start
+		System.out.println("Start Configure");
+		// Start configuration server and start test
+		Thread r1 = new Thread(new Configure(1,config));
+		r1.start();
+		r1.join();
+	}
+
+	/**
+	 * Make Configuration
+	 *     start servers now
+	 *     No connections yet
+	 * @return
+	 */
+	private ByteBuffer makeConfig() {
+		ByteBuffer config = ByteBuffer.allocate(4096);
+		putHostRun(config,"127.0.0.1",PORT);
+		putHostRun(config,"127.0.0.1",PORT+1);
+		putHostRun(config,"127.0.0.1",PORT+2);
+		putHostRun(config,"127.0.0.1",PORT+3);
+		putHostRun(config,"127.0.0.1",PORT+4);
+		putHostRun(config,"127.0.0.1",PORT+5);
+		putHostRun(config,"127.0.0.1",PORT+6);
+		config.putInt(HOST_LIST_END_MARK);
+		putTree(config,NO_HOST,1,2);
+		putTree(config,0,3,4);
+		putTree(config,0,5,6);
+		putTree(config,1,NO_HOST,NO_HOST);
+		putTree(config,1,NO_HOST,NO_HOST);
+		putTree(config,2,NO_HOST,NO_HOST);
+		putTree(config,2,NO_HOST,NO_HOST);
+		config.putInt(CONNECT_LIST_END_MARK);
+		config.flip();
+		return config;
+	}
+
+	private void putHostRun(ByteBuffer config, String host, int port2) {
+		putHost(config,host,port2);
+		// should run on specified host using ssh 
+		Thread s = new Thread(new TreeNode(id ++, port2));
+		s.start();
+		lindas.add(s);
+	}
+	
+	private void putHost(ByteBuffer config, String s, int port2) {
+		config.putInt(port2);
+		putString(config, s);		
+	}
+
+	private void putTree(ByteBuffer config, int p, int l, int r) {
+		config.putInt(p);
+		config.putInt(l);
+		config.putInt(r);
+	}
+}
+
+/* end */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/TestWaitRd.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,187 @@
+package fdl.test;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+
+import fdl.FDLindaServ;
+import fdl.FederatedLinda;
+import fdl.PSX;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+
+public class TestWaitRd {
+
+	public FederatedLinda fdl;
+	public FDLindaServ fds;
+	public static final int PORT = 10000;
+
+	class LindaServer implements Runnable {
+		public int id;
+		public LindaServer(int id) { this.id = id; }
+		public void run() {
+			String[] args = {/* "-d",*/"-p",Integer.toString(PORT)};
+			FDLindaServ.main(args);
+		}
+	}
+
+	class Sender implements Runnable {
+		public String id;
+		public Sender(int id) { this.id = "Sender"+id; }
+		public void run() {
+			String[] args = {id};
+			sleep(2000);
+			main(args);
+		}
+
+		public void main(String[] arg) {
+			try {
+				PSXLinda psx = openLinda(id);
+				sleep(1000);
+				sendData(psx,1,0);
+				psx.sync(1000);
+				in_wait(psx,1);
+				sendData(psx,1,1);
+				psx.sync(1000);
+				in_wait(psx,1);
+				sendData(psx,1,2);
+				psx.sync(1000);
+				in_wait(psx,1);
+
+				for(int i=3;i<10;i++) {
+					sendData(psx,1,i);
+					psx.sync(1000);
+					in_wait(psx,1);
+				}
+				sleep(1000);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	class Reader implements Runnable {
+		public String id;
+		public Reader(int id) { this.id = "Reader"+id; }
+		public void run() {
+			String[] args = {id};
+			sleep(2000);
+			main(args);
+		}
+
+		public void main(String[] arg) {
+			final String name = arg[0];
+			try {
+				PSXLinda psx = openLinda(id);
+
+				PSXReply reply = psx.waitRd(1);
+				read_wait(psx, reply,name+": First read");
+				PSXReply reply1 = psx.waitRd(1);
+				read_wait(psx, reply1,name+": 2nd read");
+
+				for(int i=3;i<10;i++) {
+					PSXReply replyn = psx.waitRd(1);
+					read_wait(psx, replyn,name+": "+i+"th read");
+				}
+
+				ByteBuffer data = ByteBuffer.allocate(10);
+				psx.out(PSX.META_STOP, data);
+				psx.sync(1);
+
+			} catch (IOException e) {
+				System.err.println(name+": Communication failure.");
+			}
+		}
+	}
+
+	public synchronized void sleep(int time) {
+		try {
+			wait(time);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void read_wait(PSXLinda psx, PSXReply reply, String mesg) throws IOException {
+		while(!reply.ready()) psx.sync(10);
+		System.out.println(mesg);
+		System.out.println(reply.getData().getInt());
+		System.out.println("");
+	}
+
+	public PSXLinda openLinda(String name) throws IOException {
+		FederatedLinda fdl;
+		PSXLinda psx;
+		PSXReply r;
+		String host;
+		InetSocketAddress localAddress;
+		int port = PORT;
+		try {
+			localAddress = new InetSocketAddress(InetAddress.getLocalHost(), port);
+			host = localAddress.getHostName();
+		} catch (UnknownHostException e) {
+			host = "localhost";
+		}
+		fdl = FederatedLinda.init();
+		psx = fdl.open(host,port);
+		r = psx.in(65535);
+		fdl.sync(1);
+		System.out.println(name+": Connected.");
+		int cnt=0;
+		while(!r.ready()) {
+			// psx.sync(1000);
+			psx.sync(10);
+			System.out.println(name+": Waiting...."+(cnt++));
+		}
+		print_id(r);
+		return psx;
+	}
+
+	public ByteBuffer sendData(PSXLinda psx,int id, int n) {
+		ByteBuffer data = ByteBuffer.allocate(10);
+		data.putInt(n);
+		data.flip();
+		psx.out(id,data);
+		return data;
+	}
+
+	public void in_wait(PSXLinda psx, int i) throws IOException {
+		PSXReply r = psx.in(i);
+		while(! r.ready()) { 
+			psx.sync(10); 
+		}
+		return;
+	}
+
+	public void print_id (PSXReply ans) throws IOException {
+		ByteBuffer r = ans.getData();
+		System.out.print("ID = ");
+		System.out.write(r.array());
+		System.out.println("");
+	}
+
+
+	public static void main(String[] arg) throws InterruptedException {
+		TestWaitRd me = new TestWaitRd();
+		me.test1();
+	}
+
+	public void test1() throws InterruptedException {
+		Thread l1 = new Thread(new LindaServer(1));
+		Thread r1 = new Thread(new Reader(1));
+		Thread r2 = new Thread(new Reader(2));
+		Thread s1 = new Thread(new Sender(1));
+		l1.start();
+		s1.start();
+		r1.start();
+		r2.start();
+		s1.join();
+		r1.join();
+		r2.join();
+		l1.join();
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/api/inout/InOutClient.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,40 @@
+package fdl.test.api.inout;
+
+import java.io.IOException;
+import fdl.test.topology.FDLindaNode;
+
+public class InOutClient {
+	private static int localPort = 10001;
+	private static String host = "localhost";
+	private static int port = 10000;
+	private static int count = 1;
+	private static String usageString = "Usage: InOutClient [-host hostname] [-port portnum] [-count countnum]";
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		for (int i = 0; i < args.length; i++) {
+			if ("-host".equals(args[i])) {
+				host  = args[++i];
+			} else if ("-port".equals(args[i])) {
+				port = Integer.parseInt(args[++i]);
+			} else if ("-count".equals(args[i])) {
+				count = Integer.parseInt(args[++i]);
+			} else if ("-d".equals(args[i])) {
+				FDLindaNode.debug = true;
+			} else {
+				System.err.println(usageString);
+			}
+		}
+		
+		try {
+			FDLindaNode node = new FDLindaNode(localPort);
+			InOutMetaEngine me = InOutMetaEngine.create(node.getMetaLinda(), host, port, count);
+			node.setMetaEngine(me);
+			node.mainLoop();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/api/inout/InOutMetaEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,75 @@
+package fdl.test.api.inout;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Date;
+
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+import fdl.PSX;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+public class InOutMetaEngine implements MetaEngine {
+	private final static int targetId = 1000;
+
+	private String host;
+	private int port;
+	private int maxCount, count = 0;
+	private MetaLinda ml;
+	private PSXLinda linda;
+	private PSXReply reply;
+	private Date startTime, endTime;
+	
+	private InOutMetaEngine(MetaLinda metaLinda, String host, int port, int count) {
+		this.ml = metaLinda;
+		this.host = host;
+		this.port = port;
+		this.maxCount = count;
+	}
+
+	private void connect() {
+		try {
+			linda = ml.open(host, port);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public void mainLoop(MetaLinda ml) {
+		if (count >= maxCount) {
+			endTime = new Date();
+			Long resultTime = new Long(endTime.getTime() - startTime.getTime()); 
+			linda.out(PSX.META_STOP, ByteBuffer.wrap("".getBytes()));
+			try {
+				linda.sync();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			System.out.println(maxCount + " " + resultTime);
+			System.exit(0);
+		}
+		if (reply == null) {
+			reply = linda.in(targetId);
+			linda.out(targetId, ByteBuffer.wrap("test".getBytes()));
+			return;
+		}
+		if (reply.ready()) {
+			reply = null;
+			count++;
+		}
+	}
+	
+	public static InOutMetaEngine create(MetaLinda metaLinda, String host, int port, int count) {
+		InOutMetaEngine iome = new InOutMetaEngine(metaLinda, host, port, count);
+		iome.connect();
+		iome.linda.out(targetId, ByteBuffer.wrap("test".getBytes()));
+		try {
+			iome.linda.sync();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		iome.startTime = new Date();
+		return iome;
+	} 
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/api/update/UpdateClient.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,40 @@
+package fdl.test.api.update;
+
+import java.io.IOException;
+import fdl.test.topology.FDLindaNode;
+
+public class UpdateClient {
+	private static int localPort = 10001;
+	private static String host = "localhost";
+	private static int port = 10000;
+	private static int count = 1;
+	private static String usageString = "Usage: UpdateClient [-host hostname] [-port portnum] [-count countnum]";
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		for (int i = 0; i < args.length; i++) {
+			if ("-host".equals(args[i])) {
+				host  = args[++i];
+			} else if ("-port".equals(args[i])) {
+				port = Integer.parseInt(args[++i]);
+			} else if ("-count".equals(args[i])) {
+				count = Integer.parseInt(args[++i]);
+			} else if ("-d".equals(args[i])) {
+				FDLindaNode.debug = true;
+			} else {
+				System.err.println(usageString);
+			}
+		}
+		
+		try {
+			FDLindaNode node = new FDLindaNode(localPort);
+			UpdateMetaEngine me = UpdateMetaEngine.create(node.getMetaLinda(), host, port, count);
+			node.setMetaEngine(me);
+			node.mainLoop();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/api/update/UpdateMetaEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,74 @@
+package fdl.test.api.update;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Date;
+
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+import fdl.PSX;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+public class UpdateMetaEngine implements MetaEngine {
+	private final static int targetId = 1001;
+
+	private String host;
+	private int port;
+	private int maxCount, count = 0;
+	private MetaLinda ml;
+	private PSXLinda linda;
+	private PSXReply reply;
+	private Date startTime, endTime;
+	
+	private UpdateMetaEngine(MetaLinda metaLinda, String host, int port, int count) {
+		this.ml = metaLinda;
+		this.host = host;
+		this.port = port;
+		this.maxCount = count;
+	}
+
+	private void connect() {
+		try {
+			linda = ml.open(host, port);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public void mainLoop(MetaLinda ml) {
+		if (count >= maxCount) {
+			endTime = new Date();
+			Long resultTime = new Long(endTime.getTime() - startTime.getTime());
+			linda.out(PSX.META_STOP, ByteBuffer.wrap("".getBytes()));
+			try {
+				linda.sync();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			System.out.println(maxCount + " " + resultTime);
+			System.exit(0);
+		}
+		if (reply == null) {
+			reply = linda.update(targetId, ByteBuffer.wrap("test".getBytes()));
+			return;
+		}
+		if (reply.ready()) {
+			reply = null;
+			count++;
+		}
+	}
+	
+	public static UpdateMetaEngine create(MetaLinda metaLinda, String host, int port, int count) {
+		UpdateMetaEngine iome = new UpdateMetaEngine(metaLinda, host, port, count);
+		iome.connect();
+		iome.linda.out(targetId, ByteBuffer.wrap("test".getBytes()));
+		try {
+			iome.linda.sync();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		iome.startTime = new Date();
+		return iome;
+	} 
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/AcceptXMLCallback.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,117 @@
+package fdl.test.debug;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.nio.ByteBuffer;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import fdl.PSXCallback;
+import fdl.PSXLindaImpl;
+
+class AcceptXMLCallback implements PSXCallback {
+	TupleId tid;
+	NodeProperty np;
+	TreeProperty tp;
+	DebugProperty dp;
+	
+	private DocumentBuilderFactory dbFactory = null;
+	private DocumentBuilder docBuilder = null;
+	
+	public AcceptXMLCallback(TupleId tid, NodeProperty np) {
+		this.tid = tid;
+		this.np = np;
+		dbFactory = DocumentBuilderFactory.newInstance();
+		try {
+			docBuilder = dbFactory.newDocumentBuilder();
+		} catch (ParserConfigurationException e) {
+			e.printStackTrace();
+		}
+
+	}
+	public void callback(ByteBuffer reply) {
+		String xml = new String(reply.array());
+		Debug.print(xml);
+		parseXML(xml);
+		
+		np.ml.in(tid.id, this);
+	}
+	protected void parseXML(String xml) {
+		Document doc = null;
+		try {
+			doc = docBuilder.parse(new InputSource(new StringReader(xml)));
+		} catch (SAXException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+		Element root = doc.getDocumentElement();
+		if(root.getTagName().equals("connections")) {
+			np.nodeId = Integer.parseInt(root.getAttribute("id"));
+			if (np.nodeId == 0) {
+				np.ml.in(TupleId.START.id, new StartCallback(np, tp = new TreeProperty(np)));
+				np.ml.in(TupleId.DEBUGSTART.id, new DebugStartCallback(np, dp = new DebugProperty()));
+			}
+			NodeList connections = root.getElementsByTagName("connection");
+			makeConnections(connections);
+		} else if (root.getTagName().equals("routing")) {
+			Debug.print("Routing xml received!");
+
+			NodeList routing = root.getElementsByTagName("source");
+			for (int i = 0; i < routing.getLength(); i++) {
+				Element src = (Element) routing.item(i);
+				Integer srcId = Integer.parseInt(src.getAttribute("id"));
+				Routing r = np.nodes.get(TupleId.getTupleIdFromId(srcId));
+				NodeList dest = src.getElementsByTagName("dest");
+				for (int j = 0; j < dest.getLength(); j++) {
+					Element dst = (Element) dest.item(j);
+					r.route.add(Integer.parseInt(dst.getAttribute("id")));
+				}
+			}
+			
+		}
+		switch (tid) {
+		case MANAGE:
+			np.connected = true;
+			break;
+		case DEBUG:
+			np.debugConnected = true;
+			break;
+		}
+		if (np.connected && np.debugConnected) {
+			np.sendLocalHostName();
+			Debug.print("Send local host name");
+			np.connected = np.debugConnected = false;
+		}
+	}
+	private void makeConnections(NodeList connections) {
+		for (int i = 0; i < connections.getLength(); i++) {
+			Element connection = (Element)connections.item(i);
+			Element host = (Element)connection.getElementsByTagName("host").item(0);
+			Element port = (Element)connection.getElementsByTagName("port").item(0);
+			Element t = (Element)connection.getElementsByTagName("tid").item(0);
+			int srcId = Integer.parseInt(connection.getAttribute("id"));
+			String dstHostName = host.getTextContent();
+			int dstPort = Integer.parseInt(port.getAttribute("id"));
+			int dstId = Integer.parseInt(t.getAttribute("id"));
+			try {
+				PSXLindaImpl linda = (PSXLindaImpl) np.ml.open(dstHostName, dstPort);
+				Routing r = new Routing(linda, dstId);
+				np.nodes.put(TupleId.getTupleIdFromId(srcId), r);
+				np.ml.in(srcId, new RoutingCallback(TupleId.getTupleIdFromId(srcId), r, np, tp, dp));
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+} 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/ConfigurationManager.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,45 @@
+package fdl.test.debug;
+
+import java.io.IOException;
+
+import fdl.MetaEngine;
+
+/**
+* ConfigurationManager
+*
+* @author Kazuki Akamine
+*
+* FDLindaNode を管理する Server
+*  
+*/
+
+public class ConfigurationManager {
+	private static int nodeNum = 2;
+	private static int relayNum = 1;
+	private static int relaySize = 1024;
+	private static String usageString
+		= "ConfigurationManager -nodes NODENUM -relay RELAYNUM -size RELAYSIZE";
+	
+	public static void main(String[] args) {
+		for (int i = 0; i < args.length; i++) {
+			if ("-nodes".equals(args[i])) {
+				nodeNum = Integer.parseInt(args[++i]);
+			} else if ("-relay".equals(args[i])) {
+				relayNum = Integer.parseInt(args[++i]);
+			} else if ("-size".equals(args[i])) {
+				relaySize = Integer.parseInt(args[++i]);
+			} else {
+				System.err.println(usageString);
+			}
+		}
+		try {
+			FDLindaNode manager = new FDLindaNode(FDLindaNode.DEFAULTPORT);
+			MetaEngine me = new ConfigurationManagerEngine(manager.getMetaLinda(), nodeNum, relayNum, relaySize);
+			manager.setMetaEngine(me);
+			manager.mainLoop();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/ConfigurationManagerEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,173 @@
+package fdl.test.debug;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.*;
+
+public class ConfigurationManagerEngine implements MetaEngine {
+	public static final int DEFAULTPORT = 10000;
+	
+	public int nodeNum = 0;
+	public int relayNum = 0;
+	public int relaySize = 1;
+	private MetaLinda ml;
+	private NodeInfo[] nodes;
+	private boolean running = true;
+	
+	private class AcceptNewNode implements PSXCallback {
+		int count = 0;
+		public void callback(ByteBuffer reply) {
+			String[] hostData = new String(reply.array()).split(":");
+			String hostName = hostData[0];
+			int	port = DEFAULTPORT;
+			if (hostData.length > 1)
+				port = Integer.parseInt(hostData[1]);
+			nodes[count] = new NodeInfo(hostName, port);
+			try {
+				nodes[count].linda = ml.open(hostName, port);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			if (++count < nodeNum) {
+				ml.in(TupleId.MANAGE.id, this);
+			} else {
+				linkNodes();
+				ml.in(TupleId.MANAGE.id, new ConfirmConnectionNode());
+			}
+		}
+	}
+	
+	private class ConfirmConnectionNode implements PSXCallback {
+		int count = 0;
+		public void callback(ByteBuffer reply) {
+			if (++count < nodeNum) {
+				ml.in(TupleId.MANAGE.id, this);
+			} else {
+				routingNodes();
+				ml.in(TupleId.MANAGE.id, new ConfirmRoutingNode());
+			}
+		}
+
+	}
+
+	private class ConfirmRoutingNode implements PSXCallback {
+		int count = 0;
+		public void callback(ByteBuffer reply) {
+			if (++count < nodeNum) {
+				ml.in(TupleId.MANAGE.id, this);
+			} else {
+				print("All link configured!");
+				// TREE実験開始を通知
+				nodes[0].linda.out(TupleId.START.id, ByteBuffer.wrap("0".getBytes()));
+				// DebugRing 開始を通知
+				//nodes[0].linda.out(DEBUGSTART, ByteBuffer.wrap(("print," + BODY + ",").getBytes()));
+				ml.in(TupleId.START.id, new ConfirmFinish());
+			}
+		}
+
+	}
+	
+	private class ConfirmFinish implements PSXCallback {
+		public void callback(ByteBuffer reply) {
+			System.out.println(new String(reply.array()));
+			nodes[0].linda.out(TupleId.DEBUGSTART.id, ByteBuffer.wrap("shutdown".getBytes()));
+			print("Finish token");
+			try {
+				nodes[0].linda.sync(1);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			running = false;
+		}
+
+	}
+
+	private class RingLoop implements PSXCallback {
+		int counter = 0;
+		public void callback(ByteBuffer reply) {
+			nodes[0].linda.out(TupleId.DEBUGSTART.id, ByteBuffer.wrap(("print," + TupleId.BODY.id + ",").getBytes()));
+			print("ring=" + counter + ": \n" + new String(reply.array()));
+			counter++;
+			ml.in(TupleId.DEBUG.id, this);
+		}
+
+	}
+	
+	public ConfigurationManagerEngine(MetaLinda metaLinda, int nodeNum, int relayNum, int relaySize) {
+		// initialize
+		this.ml = metaLinda;
+		this.nodeNum = nodeNum;
+		this.relayNum = relayNum;
+		this.relaySize = relaySize;
+		nodes = new NodeInfo[nodeNum];
+	}
+
+	public void mainLoop(MetaLinda ml1) {
+		// resist poll tuple id
+		ml.in(TupleId.MANAGE.id, new AcceptNewNode());
+		ml.in(TupleId.DEBUG.id, new RingLoop());
+		while (running)
+			ml.sync(0);
+	}
+	
+	private void linkNodes() {
+		for (int i = 0; i < nodes.length; i++) {
+			// XML for Tree Topology
+			ConnectionXMLBuilder tree = new ConnectionXMLBuilder(i);
+			int k;
+			if (i != 0) { // TOP
+				k = (i-1)/2;
+				tree.appendConnection(TupleId.TREETOP, nodes[k].host, nodes[k].port, (i%2 == 0) ? TupleId.TREERIGHT : TupleId.TREELEFT);
+			}
+			if ((k = 2*i+1) < nodes.length) // LEFT
+				tree.appendConnection(TupleId.TREELEFT, nodes[k].host, nodes[k].port, TupleId.TREETOP);
+			if ((k = 2*i+2) < nodes.length) // RIGHT
+				tree.appendConnection(TupleId.TREERIGHT, nodes[k].host, nodes[k].port, TupleId.TREETOP);
+			nodes[i].connectionXML = tree.createXML();
+			nodes[i].linda.out(TupleId.MANAGE.id, ByteBuffer.wrap(nodes[i].connectionXML.getBytes()));
+			print(nodes[i].connectionXML);
+			
+			// XML for Ring Debug Topology
+			ConnectionXMLBuilder debug = new ConnectionXMLBuilder(i);
+			int left = (nodes.length + i - 1) % nodes.length;
+			int right = (i + 1) % nodes.length;
+			debug.appendConnection(TupleId.RINGLEFT, nodes[left].host, nodes[left].port, TupleId.RINGRIGHT);
+			debug.appendConnection(TupleId.RINGRIGHT, nodes[right].host, nodes[right].port, TupleId.RINGLEFT);
+			nodes[i].debugConnectionXML = debug.createXML();
+			nodes[i].linda.out(TupleId.DEBUG.id, ByteBuffer.wrap(nodes[i].debugConnectionXML.getBytes()));
+			print(nodes[i].debugConnectionXML);
+		}
+	}
+	
+	private void routingNodes() {
+		for (int i = 0; i < nodes.length; i++) {
+			RoutingXMLBuilder tree = new RoutingXMLBuilder();
+			if (i != 0) { // TOP
+				if (2*i+1 < nodes.length) { // LEFT
+					tree.appendRoutingTable(TupleId.TREETOP, TupleId.TREELEFT);
+					tree.appendRoutingTable(TupleId.TREELEFT, TupleId.TREETOP);
+				}
+				if (2*i+2 < nodes.length) { // RIGHT
+					tree.appendRoutingTable(TupleId.TREETOP, TupleId.TREERIGHT);
+					tree.appendRoutingTable(TupleId.TREERIGHT, TupleId.TREETOP);
+				}
+			}
+			nodes[i].routingXML = tree.createXML();
+			nodes[i].linda.out(TupleId.MANAGE.id, ByteBuffer.wrap(nodes[i].routingXML.getBytes()));
+			print(nodes[i].routingXML);
+			
+			RoutingXMLBuilder debug = new RoutingXMLBuilder();
+			debug.appendRoutingTable(TupleId.RINGLEFT, TupleId.RINGRIGHT);
+			debug.appendRoutingTable(TupleId.RINGRIGHT, TupleId.RINGLEFT);
+			nodes[i].debugRoutingXML = debug.createXML();
+			nodes[i].linda.out(TupleId.DEBUG.id, ByteBuffer.wrap(nodes[i].debugRoutingXML.getBytes()));
+			print(nodes[i].debugRoutingXML);
+		}
+	}
+	
+	void print(String str) {
+		System.err.println("[DEBUG] ConfigurationManager: " + str);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/ConnectionXMLBuilder.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,31 @@
+package fdl.test.debug;
+
+import org.w3c.dom.*;
+
+public class ConnectionXMLBuilder extends XMLBuilder {
+	private Element connections;
+	
+	public ConnectionXMLBuilder(int id) {
+		super();
+		connections = document.createElement("connections");
+		connections.setAttribute("id", new Integer(id).toString());
+		document.appendChild(connections);
+	}
+	
+	public void appendConnection(TupleId mytid, String host, int port, TupleId tid){
+		Element connection = document.createElement("connection");
+		connection.setAttribute("id", new Integer(mytid.id).toString());
+		Element h = document.createElement("host");
+		h.setTextContent(host);
+		Element p = document.createElement("port");
+		p.setAttribute("id", new Integer(port).toString());
+		Element t = document.createElement("tid");
+		t.setAttribute("id", new Integer(tid.id).toString());
+
+		connections.appendChild(connection);
+		connection.appendChild(h);
+		connection.appendChild(p);
+		connection.appendChild(t);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/Debug.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,21 @@
+package fdl.test.debug;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+public class Debug {
+	private static Debug d = new Debug(); // Singleton
+	private String localHostName;
+	private Debug() {
+		try {
+			localHostName = InetAddress.getLocalHost().getHostName();
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		}
+	}
+	static void print(String str) {
+		System.err.println("[DEBUG] " + d.localHostName + ": " + str);
+		System.err.flush();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/DebugProperty.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,5 @@
+package fdl.test.debug;
+
+public class DebugProperty {
+	public int relayNum, relaySize, relayCounter;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/DebugStartCallback.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,39 @@
+package fdl.test.debug;
+
+import java.nio.ByteBuffer;
+//import java.util.Date;
+
+import fdl.PSXCallback;
+
+class DebugStartCallback implements PSXCallback {
+	public NodeProperty np;
+	public DebugProperty dp;
+	public DebugStartCallback(NodeProperty np, DebugProperty dp) {
+			this.np = np;
+			this.dp = dp;
+	}
+	public void callback(ByteBuffer reply) {
+		String[] commands = new String(reply.array()).split(",");
+		String command = commands[0];
+		if (command.equals("relay")) {
+			dp.relayNum = Integer.parseInt(commands[1]);
+			dp.relaySize = Integer.parseInt(commands[2]);
+			dp.relayCounter = 0;
+			Debug.print("relay num=" + dp.relayNum + " size=" + dp.relaySize);
+			Routing r = np.nodes.get(TupleId.RINGRIGHT);
+			// 実験開始
+			// TODO: startTime?
+			//startTime = new Date();
+			r.linda.out(r.dstId, ByteBuffer.wrap(new byte[dp.relaySize]));
+			np.ml.in(TupleId.DEBUGSTART.id, this);
+		} else if (command.equals("print")) {
+			Routing r = np.nodes.get(TupleId.RINGRIGHT);
+			r.linda.out(r.dstId, reply);
+			Debug.print("Send Debug Message: print");
+			np.ml.in(TupleId.DEBUGSTART.id, this);
+		} else if (command.equals("shutdown")) {
+			Routing r = np.nodes.get(TupleId.RINGRIGHT);
+			r.linda.out(r.dstId, ByteBuffer.wrap("shutdown".getBytes()));
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/FDLindaNode.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,75 @@
+package fdl.test.debug;
+
+import java.io.IOException;
+
+import fdl.FDLindaServ;
+import fdl.MetaLinda;
+import fdl.MetaEngine;
+
+/**
+* FDLindaNode
+*
+* @author Kazuki Akamine
+*
+* Federated Linda の Topology Node
+* 接続する機能までを実装 MetaEngine は外部から提供される
+*  
+*/
+
+public class FDLindaNode extends FDLindaServ {
+	// Fields
+	private MetaLinda ml;
+	public static final int DEFAULTPORT = 10000;
+	private static String manager;
+	private final static String usageString
+		= "Usage: FDLindaNode -manager SERVERNAME:PORT";
+
+	// Constructor
+	public FDLindaNode(int port) throws IOException {
+		super(port);
+		this.ml = new MetaLinda(tupleSpace, this);
+	}
+	
+	@Override public void mainLoop() {
+		me.mainLoop(ml);
+	}
+	public void setMetaEngine(MetaEngine me) {
+		this.me = me; 
+	}
+	public MetaLinda getMetaLinda() {
+		return ml;
+	}
+	
+	// main routine
+	public static void main(String[] args) {
+		int port = DEFAULTPORT;
+		for (int i = 0; i < args.length; i++) {
+			if ("-manager".equals(args[i])) {
+				manager = args[++i];
+			} else if ("-p".equals(args[i])) {
+				port = new Integer(args[++i]).intValue();
+			} else {
+				System.err.println(usageString);
+			}
+		}
+		
+		String[] managerData = manager.split(":");
+		String managerHostName = managerData[0];
+		int managerPort;
+		if (managerData.length > 1) {
+			managerPort = new Integer(managerData[1]).intValue();
+		} else {
+			managerPort = DEFAULTPORT; 
+		}
+		
+		try {
+			FDLindaNode node = new FDLindaNode(DEFAULTPORT);
+			MetaEngine me = new MetaProtocolEngine(port, node.getMetaLinda(), managerHostName, managerPort);
+			node.setMetaEngine(me);
+			node.mainLoop();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/MetaProtocolEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,42 @@
+package fdl.test.debug;
+
+import java.nio.ByteBuffer;
+
+import fdl.*;
+
+/**
+* MetaProtocolEngine
+*
+* @author Kazuki Akamine
+* 
+* 接続する機能までを実装した MetaEngine
+* これを継承して、具体的な処理を書く
+*  
+*/
+
+public class MetaProtocolEngine implements MetaEngine {
+	// Fields
+	private NodeProperty np;
+	
+	// Constructor
+	public MetaProtocolEngine(int port, MetaLinda ml, String managerHostName, int managerPort) {
+		this.np = new NodeProperty(port, ml, managerHostName, managerPort);
+		ml.out(TupleId.BODY.id, ByteBuffer.wrap("dummy".getBytes()));
+	}
+
+	public void mainLoop(MetaLinda ml) {
+		initPoller();
+		while (np.running) {
+			np.ml.sync(0);
+		}
+		Debug.print("Terminated" + np.nodeId
+				+ " replies=" + np.ml.replies.size()
+				+ " qsize=" + np.ml.fdl.qsize);
+	}
+	
+	protected void initPoller() {
+		np.ml.in(TupleId.MANAGE.id, new AcceptXMLCallback(TupleId.MANAGE, np));
+		np.ml.in(TupleId.DEBUG.id, new AcceptXMLCallback(TupleId.DEBUG, np));
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/NodeInfo.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,17 @@
+package fdl.test.debug;
+
+import fdl.PSXLinda;
+
+public class NodeInfo {
+	public String host;
+	public int port;
+	public PSXLinda linda;
+	public String connectionXML, debugConnectionXML;
+	public String routingXML, debugRoutingXML;
+	
+	public NodeInfo(String host, int port) {
+		this.host = host;
+		this.port = port;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/NodeProperty.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,66 @@
+package fdl.test.debug;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+
+import fdl.MetaLinda;
+import fdl.PSXLinda;
+
+public class NodeProperty {
+	public static int DEFAULTPORT = 10000;
+	
+	public String localHostName;
+	public int localPort;
+	public PSXLinda manager;
+	public String managerHostName;
+	public int managerPort = DEFAULTPORT;
+
+	public int nodeId;
+	public boolean running = true;
+	public boolean connected = false;
+	public boolean debugConnected = false;
+	public HashMap<TupleId, Routing> nodes = new HashMap<TupleId, Routing>();
+	public MetaLinda ml;
+	
+	public NodeProperty(int port, MetaLinda ml, String managerHostName, int managerPort) {
+		this.ml = ml;
+		this.localPort = port;
+		this.managerHostName = managerHostName;
+		this.managerPort = managerPort;
+		try {
+			this.localHostName = InetAddress.getLocalHost().getHostName();
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		}
+		manager = connectServer(this.managerHostName, this.managerPort);
+		sendLocalHostName();
+	}
+	
+	protected void sendLocalHostName() {
+		// TopologyManager に自分のホストネームを送信して、起動を伝える
+		ByteBuffer local = ByteBuffer.wrap((localHostName + ":" + localPort).getBytes());
+		manager.out(TupleId.MANAGE.id, local);
+	}
+	
+	protected PSXLinda connectServer(String hostName, int port) {
+		PSXLinda linda = null;
+		boolean connectPSX = true;
+		while (connectPSX) {
+			try {
+				linda = ml.open(hostName, port);
+				connectPSX = false;
+			} catch (IOException e) {
+				try {
+					Thread.sleep(40);
+				} catch (InterruptedException e1) {
+				}
+			}
+		}
+		Debug.print("Connect to " + hostName);
+		return linda;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/Routing.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,17 @@
+package fdl.test.debug;
+
+import java.util.LinkedList;
+
+import fdl.*;
+
+public class Routing {
+	PSXLinda linda;
+	int dstId;
+	LinkedList<Integer> route;
+	
+	public Routing(PSXLinda linda, int dstId) {
+		this.linda = linda;
+		this.dstId = dstId;
+		this.route = new LinkedList<Integer>();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/RoutingCallback.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,141 @@
+package fdl.test.debug;
+
+import java.nio.ByteBuffer;
+import java.util.Date;
+
+import fdl.PSXCallback;
+import fdl.PSXReply;
+
+class RoutingCallback implements PSXCallback {
+	TupleId tid;
+	Routing routing;
+	NodeProperty np;
+	TreeProperty tp;
+	DebugProperty dp;
+	
+	public RoutingCallback(TupleId tid, Routing routing, NodeProperty np, TreeProperty tp, DebugProperty dp) {
+		this.tid = tid;
+		this.routing = routing;
+		this.np = np;
+		this.tp = tp;
+		this.dp = dp;
+	}
+
+	public void callback(ByteBuffer reply) {
+		Debug.print("get: " + new String(reply.array()));
+		String str = new String(reply.array());
+		String[] commands= str.split(",");
+		switch (tid) {
+		case TREETOP:
+		case TREELEFT:
+		case TREERIGHT:
+			np.ml.in(TupleId.BODY.id);
+			np.ml.out(TupleId.BODY.id, reply);
+			Debug.print("Update body: " + new String(reply.array()));
+			switch (tid) {
+			case TREETOP:
+				Routing r = np.nodes.get(tid);
+				if (r.route.isEmpty()) {
+					// TREE末端の処理
+					r.linda.out(r.dstId, reply); // 送ってきた方に送り返す
+					np.ml.in(tid.id, this);
+					Debug.print("UP! " + np.nodeId);
+					return;
+				}
+				break;
+			default:
+				switch (tid) {
+				case TREELEFT:
+					tp.leftFlag = true;
+					break;
+				case TREERIGHT:
+					tp.rightFlag = true;
+					break;
+				}
+				if (tp.leftFlag && tp.rightFlag) {
+					Debug.print("UP");
+					if (np.nodeId == 0) {
+						if (tp.treeCounter++ < tp.treeLoopNum) {
+							// int num = Integer.parseInt(new String(reply.array()));
+							tp.startTree(ByteBuffer.wrap((""+tp.treeCounter).getBytes()));
+						} else {
+							tp.endTime = new Date();
+							Double resultTime = new Double(((tp.endTime.getTime() - tp.startTime.getTime()) / (double)tp.treeLoopNum)); 
+							ByteBuffer data = ByteBuffer.wrap(resultTime.toString().getBytes());
+							np.manager.out(TupleId.START.id, data);
+							Debug.print("Finish Tree");
+						}
+					} else {
+						Routing r1 = np.nodes.get(TupleId.TREETOP);
+						r1.linda.out(r1.dstId, reply);
+					}
+				}
+				np.ml.in(tid.id, this);
+				return;
+			}
+			break;
+		case RINGLEFT:
+		case RINGRIGHT:
+			if (str.equals("shutdown")) {
+				Debug.print("get shutdown command id: " + np.nodeId);
+				if (np.nodeId != 0) {
+					Routing r = null;
+					r = np.nodes.get(tid.getMirrorId());
+					r.linda.out(r.dstId, ByteBuffer.wrap("shutdown".getBytes()));
+					np.ml.fdl.queueExec();
+				} else {
+					Debug.print("shutdown reaches last node!");
+				}
+				np.running = false;
+				return;
+			} else if (commands[0].equals("print")) {
+				Debug.print("Get Debug Message: print");
+				int printId = Integer.parseInt(commands[1]);
+				PSXReply rep = np.ml.rd(printId);
+				np.ml.sync(1);
+				str += "<debug id=\""
+					+ np.nodeId + "\"><host>"
+					+ np.localHostName + ":" + np.localPort
+					+ "</host><data id=\""
+					+ printId + "\">";
+				if (rep.ready())
+					str += new String(rep.data.array());
+				str += "</data></debug>\n";
+				np.ml.in(tid.id, this);
+				if (np.nodeId == 0) {
+					// 実験終了
+					np.manager.out(TupleId.DEBUG.id, ByteBuffer.wrap(str.getBytes()));
+				} else {
+					Routing r = np.nodes.get(tid.getMirrorId());
+					r.linda.out(r.dstId, ByteBuffer.wrap(str.getBytes()));
+				}
+				return;
+			}
+			break;
+		default:
+			if (np.nodeId == 0 && tid == TupleId.RINGLEFT) {
+				dp.relayCounter++;
+				Debug.print("" + dp.relayCounter + " relay");
+				if (dp.relayCounter >= dp.relayNum) {
+					// 実験終了
+					tp.endTime = new Date();
+					Double resultTime = new Double(((tp.endTime.getTime() - tp.startTime.getTime()) / (double)dp.relayNum)); 
+					ByteBuffer data = ByteBuffer.wrap(resultTime.toString().getBytes());
+					np.manager.out(TupleId.DEBUG.id, data);
+					np.ml.in(tid.id, this);
+					return;
+				}
+			}
+		}
+		for (Integer dstId : routing.route) {
+			if (dstId == TupleId.TREELEFT.id)
+				tp.leftFlag = false;
+			else if (dstId == TupleId.TREERIGHT.id)
+				tp.rightFlag = false;
+			Routing r = np.nodes.get(TupleId.getTupleIdFromId(dstId));
+			r.linda.out(r.dstId, reply);
+		}
+		np.ml.in(tid.id, this);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/RoutingXMLBuilder.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,36 @@
+package fdl.test.debug;
+
+import java.util.*;
+
+import org.w3c.dom.Element;
+
+public class RoutingXMLBuilder extends XMLBuilder {
+	private Element routing;
+	private HashMap<Integer, Element> routingTable;
+	
+	public RoutingXMLBuilder() {
+		super();
+		routing = document.createElement("routing");
+		document.appendChild(routing);
+		routingTable = new HashMap<Integer, Element>();
+	}
+	
+	private Element createRoutingTable(TupleId src) {
+		Integer tupleId = new Integer(src.id);
+		Element source = document.createElement("source");
+		source.setAttribute("id", tupleId.toString());
+		routing.appendChild(source);
+		routingTable.put(tupleId, source);
+		return source;
+	}
+	
+	public void appendRoutingTable(TupleId src, TupleId dst) {
+		Element source = routingTable.get(new Integer(src.id));
+		if (source == null)
+			source = createRoutingTable(src);
+		Element dest = document.createElement("dest");
+		dest.setAttribute("id", new Integer(dst.id).toString());
+		source.appendChild(dest);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/StartCallback.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,27 @@
+package fdl.test.debug;
+
+import java.nio.ByteBuffer;
+import java.util.Date;
+
+import fdl.PSXCallback;
+
+class StartCallback implements PSXCallback {
+	NodeProperty np;
+	TreeProperty tp;
+	
+	public StartCallback(NodeProperty np, TreeProperty tp) {
+		this.np = np;
+		this.tp = tp;
+	}
+	
+	public void callback(ByteBuffer reply) {
+		Debug.print("Start Tree");
+		tp.startTime = new Date();
+		tp = new TreeProperty(np);
+		tp.startTree(reply);
+		np.ml.in(TupleId.BODY.id);
+		np.ml.out(TupleId.BODY.id, reply);
+		np.ml.in(TupleId.START.id, this);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/TreeProperty.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,30 @@
+package fdl.test.debug;
+
+import java.nio.ByteBuffer;
+import java.util.Date;
+
+public class TreeProperty {
+	public boolean  rightFlag = true, leftFlag = true;
+	public int treeCounter = 0, treeLoopNum = 100;
+	public Date startTime, endTime;
+	public NodeProperty np;
+	
+	public TreeProperty(NodeProperty np) {
+		this.np = np;
+	}
+	
+	public void startTree(ByteBuffer reply) {
+		Routing r;
+		// 子があるならば、子にタプルを伝搬
+		if (np.nodes.containsKey(TupleId.TREERIGHT)) {
+			r = np.nodes.get(TupleId.TREERIGHT);
+			r.linda.out(r.dstId, reply);
+			rightFlag = false;
+		}
+		if (np.nodes.containsKey(TupleId.TREELEFT)) {
+			r = np.nodes.get(TupleId.TREELEFT);
+			r.linda.out(r.dstId, reply);
+			leftFlag = false;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/TupleId.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,42 @@
+package fdl.test.debug;
+
+import java.util.HashMap;
+
+public enum TupleId {
+	BODY		(100),
+	START		(BODY.id+1),
+	FINISH		(BODY.id+2),
+	MANAGE		(60000),
+	TREETOP		(MANAGE.id+1),
+	TREELEFT	(MANAGE.id+2) { public TupleId getMirrorId() { return TREERIGHT; } },
+	TREERIGHT	(MANAGE.id+3) { public TupleId getMirrorId() { return TREELEFT; } },
+	DEBUG		(61000),
+	RINGLEFT	(DEBUG.id+1) { public TupleId getMirrorId() { return RINGRIGHT; } },
+	RINGRIGHT	(DEBUG.id+2) { public TupleId getMirrorId() { return RINGLEFT; } },
+	DEBUGSTART	(DEBUG.id+3);
+	
+	public int id;
+	public static HashMap<Integer, TupleId> hash = new HashMap<Integer, TupleId>();
+	
+	private TupleId(int id) {
+		this.id = id;
+	}
+	public TupleId getMirrorId() {
+		return this;
+	}
+	public static TupleId getTupleIdFromId(int id) {
+//		for (TupleId tid : TupleId.values()) {
+//			if (tid.id == id) {
+//				return tid;
+//			}
+//		}
+		return hash.get(id);
+	}
+	
+	static {
+		for (TupleId tid : TupleId.values()) {
+			hash.put(tid.id, tid);
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/debug/XMLBuilder.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,40 @@
+package fdl.test.debug;
+
+import java.io.*;
+import javax.xml.parsers.*;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import org.w3c.dom.*;
+
+public class XMLBuilder {
+	protected Document document;
+	protected Transformer transformer;
+	public XMLBuilder() {
+		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+		DocumentBuilder docBuilder = null;
+		try {
+			docBuilder = dbFactory.newDocumentBuilder();
+		} catch (ParserConfigurationException e) {
+			e.printStackTrace();
+		}
+		document = docBuilder.newDocument();
+		TransformerFactory tFactory = TransformerFactory.newInstance();
+		try {
+			transformer = tFactory.newTransformer();
+			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+		} catch (TransformerConfigurationException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public String createXML() {
+		StringWriter sw = new StringWriter();
+		try {
+			transformer.transform(new DOMSource(document), new StreamResult(sw));
+		} catch (TransformerException e) {
+			e.printStackTrace();
+		}
+		return sw.toString();
+	}
+}
--- a/src/fdl/test/metaTransfer/FDLServWithSend.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-package fdl.test.metaTransfer;
-
-import java.io.IOException;
-
-import fdl.FDLindaServ;
-import fdl.MetaLinda;
-
-
-public class FDLServWithSend extends FDLindaServ {
-	int port1;
-	public FDLServWithSend(int port,int port1) throws IOException {
-		super(port);
-		this.port1 = port1;
-	}
-
-	@Override public void mainLoop() {
-		System.out.println("change mainloop");
-		MetaLinda ml = new MetaLinda(tupleSpace, this);
-		MetaProtocolEngine mpe = new MetaProtocolEngine(ml,"MetaEngine", port1);
-		mpe.mainLoop();
-	}
-
-}
--- a/src/fdl/test/metaTransfer/MetaProtocolEngine.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-package fdl.test.metaTransfer;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.MetaEngine;
-import fdl.MetaLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-public class MetaProtocolEngine implements MetaEngine {
-	private int id = 10;
-	private boolean running = true;
-	
-	private PSXLinda psx;
-	private String name;
-	MetaLinda fdl1;
-	String host = "127.0.0.1";
-	int port1;
-	private PSXLinda psx1;
-	private ByteBuffer data2 = ByteBuffer.allocate(10);
-	private int count = 1;
-
-	
-	public MetaProtocolEngine(MetaLinda ml, String string, int port1) {
-		this.name = string;
-		this.port1 = port1;
-		this.fdl1 = ml;
-	}
-
-	public void mainLoop(){
-		boolean connect = true;
-		System.out.println("MetaEngine Start");
-		while(connect){
-		try {
-			initConnect();
-			transfer();
-			connect = false;
-		} catch (IOException e) {
-			try {
-				Thread.sleep(40);
-			} catch (InterruptedException e1) {
-			}
-		}
-		}
-	}
-
-	private void initConnect(){
-		System.out.println(name);
-		boolean connectpsx = true;
-		while(connectpsx){
-		try {
-			psx = fdl1.open(host,port1);
-			connectpsx = false;
-		} catch (IOException e) {
-			try {
-				Thread.sleep(40);
-			} catch (InterruptedException e1) {
-				e1.printStackTrace();
-			}
-		}
-		}
-		System.out.println("Connect "+port1);
-		psx1 = fdl1;
-	}
-
-	private void transfer() throws IOException {
-		PSXReply in = psx.in(id);
-		System.out.println("PSXReply "+port1);
-		while (running) {
-			if(in.ready()){
-				data2 = in.getData();
-				int i = data2.getInt();
-				data2.rewind();
-				//outしたbytebufferの変更をこれ以降やっちゃいけない
-				psx1.out(id,data2);
-				
-				System.out.println("IntData0 "+port1 +i);
-				fdl1.sync();
-				if (count++>3) {
-					running = false;
-					break;
-				}
-				System.out.println("IntData1 "+port1 +i);
-			}
-			fdl1.sync();
-		}
-		assertEquals(4,count);
-	}
-
-	
-}
-
--- a/src/fdl/test/metaTransfer/MetaProtocolEngine_not.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-package fdl.test.metaTransfer;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.MetaEngine;
-import fdl.MetaLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-
-public class MetaProtocolEngine_not implements MetaEngine {
-	private FederatedLinda fdlmeta;
-	private ByteBuffer data = ByteBuffer.allocate(1024);
-	private int id = 10;
-	private boolean running = true;
-	
-	//ここからsend用宣言
-	private PSXLinda sendpsx,getpsx;
-	private String host = "127.0.0.1";
-	private int port;
-			
-	public MetaProtocolEngine_not(MetaLinda fdlmeta, int port) {
-		this.port = port;
-	}
-	
-	public void metaOpen(int sendport){
-		try{
-		sendpsx = fdlmeta.open(host, sendport);
-		}catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-	
-	//meta部分のデータ取得
-	public void metaTrans() {
-		try {
-			getpsx = fdlmeta.open(host, 10001);
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		PSXReply in = getpsx.in(id);
-		while (running) {
-			System.out.println(in);
-			System.out.println(in.ready());
-		if(in.ready()) {
-			data = in.getData();
-			sendpsx.out(id, data);
-			running = false;
-			break;
-		}
-		}
-	}
-
-	
-	public void mainLoop() {
-		System.out.println("MetaProtocolEngine Start");
-		fdlmeta = FederatedLinda.init();
-		if( port == 10002 ) {
-			metaOpen(10003);
-			metaTrans();
-			try {
-				fdlmeta.sync();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-			System.out.println("MetaProtocolEngine Connect");
-		}
-
-	}
-
-}
--- a/src/fdl/test/metaTransfer/Ring/FDLServWithSend.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-package fdl.test.metaTransfer.Ring;
-
-import java.io.IOException;
-
-import fdl.FDLindaServ;
-import fdl.MetaLinda;
-
-public class FDLServWithSend extends FDLindaServ {
-	int port1;
-	public FDLServWithSend(int port,int port1) throws IOException {
-		super(port);
-		this.port1 = port1;
-	}
-	
-	@Override public void mainLoop() {
-		System.out.println("change mainloop");
-		MetaLinda ml = new MetaLinda(tupleSpace, this);
-		MetaProtocolEngine mpe = new MetaProtocolEngine(ml,"MetaEngine", port1, port1);
-		mpe.mainLoop();
-	}
-
-}
--- a/src/fdl/test/metaTransfer/Ring/MetaProtocolEngine.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-package fdl.test.metaTransfer.Ring;
-
-//import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.MetaEngine;
-import fdl.MetaLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-public class MetaProtocolEngine implements MetaEngine {
-	int id = 10;
-	private boolean running = true;
-	
-	private PSXLinda psx;
-	private String name;
-	MetaLinda fdl1;
-	String host = "127.0.0.1";
-	int port1;
-	private PSXLinda psx1;
-	private ByteBuffer data = ByteBuffer.allocate(10);
-//	private int count = 1;
-	int port;
-
-	
-	public MetaProtocolEngine(MetaLinda ml, String string, int port1, int port) {
-		this.name = string;
-		this.port1 = port1;
-		this.fdl1 = ml;
-		this.port = port;
-	}
-
-	public void mainLoop(){
-		boolean connect = true;
-		System.out.println("MetaEngine Start");
-		while(connect){
-		try {
-			initConnect();
-			transfer(psx, psx1);
-			connect = false;
-		} catch (IOException e) {
-			try {
-				Thread.sleep(40);
-			} catch (InterruptedException e1) {
-			}
-		}
-		}
-	}
-
-	private void initConnect() throws IOException{
-		System.out.println(name);
-		//自分
-		psx = fdl1;
-		if (port == 10001){
-			sendData();
-			}
-		//相手
-		psx1 = fdl1.open(host,port1);
-		System.out.println("Connect "+port1);
-	}
-
-	private void sendData() throws IOException{
-		boolean connectSend = true;
-		ByteBuffer send = ByteBuffer.allocate(1024);
-		send.putInt(12);
-		send.flip();
-		while(connectSend){
-		psx.out(id, send);
-		fdl1.sync(1);
-		System.out.println("Send Data 10001");
-		connectSend = false;
-		}
-	}
-	
-	private void transfer(PSXLinda getpsx, PSXLinda sendpsx) throws IOException {
-		PSXReply in = getpsx.in(id);
-		System.out.println("PSXReply "+port1);
-		while (running) {
-			if(in.ready()){
-				data = in.getData();
-				int i = data.getInt();
-				data.rewind();
-				//outしたbytebufferの変更をこれ以降やっちゃいけない
-				sendpsx.out(id,data);
-				
-				System.out.println("IntData0 "+port1 +i);
-				fdl1.sync(1);
-				running = false;
-				System.out.println("IntData1 "+port1 +i);
-				break;
-			}
-			fdl1.sync();
-			}
-//		assertEquals(4,count);
-	}
-
-}
-
--- a/src/fdl/test/metaTransfer/Ring/Server.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-package fdl.test.metaTransfer.Ring;
-
-import java.io.IOException;
-
-import fdl.FDLindaServ;
-
-public class Server extends Thread {
-	int port1;
-	int port2;
-	int set;
-	private String name;
-	
-	public Server(String string, int i, int t, int s) {
-		port1 = i;
-		port2 = t;
-		name = string;
-		set = s;
-	}
-
-	public void run(){
-		String[] args = {"-p",Integer.toString(port1)};
-		System.out.println(name);
-		switch (set){
-		case 0:
-		try {
-			FDLServWithSend send = new FDLServWithSend(port1,port2);
-			send.mainLoop();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		break;
-		
-		case 1:
-		FDLindaServ.main(args);
-		break;
-		}
-	}
-
-}
\ No newline at end of file
--- a/src/fdl/test/metaTransfer/Ring/TestSend.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-package fdl.test.metaTransfer.Ring;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-
-public class TestSend extends Thread {
-	PSXLinda psxsend;
-	FederatedLinda fdlsend;
-	
-	public void run(){
-		int id = 10;
-		int port = 10001;
-		boolean connect = true;
-		String host = "127.0.0.1";
-		ByteBuffer send = ByteBuffer.allocate(1024);
-		send.putInt(12);
-		send.flip();
-		while(connect){
-		try {
-		sendData(id, port, host, send);
-		connect = false;
-		} catch(IOException e) {
-			try {
-				Thread.sleep(40);
-			} catch (InterruptedException e1) {
-				e1.printStackTrace();
-			}
-		}
-		
-		}
-	}
-
-	private void sendData(int id, int port, String host, ByteBuffer send) throws IOException {
-		fdlsend = FederatedLinda.init();
-
-			psxsend = fdlsend.open(host,port);
-			System.out.println("Connect Host1");
-			psxsend.out(id, send);
-			fdlsend.sync(1);
-			System.out.println("Send Data");
-
-	}
-	
-}
--- a/src/fdl/test/metaTransfer/Ring/TestTransfer.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-package fdl.test.metaTransfer.Ring;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-
-import org.junit.Test;
-
-public class TestTransfer {
-	@Test
-	public void testTransfer() throws IOException {
-		int port1 = 10001;
-		int port2 = 10002;
-		
-		Server server1 = new Server("Server1",port1, port2,0);
-		server1.start();
-
-		Server server2 = new Server("Server2",port2, port1,1);
-		server2.start();
-		
-		try {
-			server2.join();
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-		
-		assertEquals(1,1);
-	}
-}
--- a/src/fdl/test/metaTransfer/Ring/TestTransferRing.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-package fdl.test.metaTransfer.Ring;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class TestTransferRing {
-	Server[] servers;
-	final int serverCount = 3;
-	final int startPort = 10001;
-	@Test
-	public void testTransfer() {
-		int port = startPort;
-		
-		servers = new Server[serverCount];
-		
-		for (int i = 0; i < serverCount; i++) {
-			servers[i] = new Server("Server"+(i+1),port+i,netporot(port+i),0);
-			servers[i].start();
-		}
-		
-//		try {
-//			servers[3].join();
-//		} catch (InterruptedException e) {
-//			e.printStackTrace();
-//		}
-		
-
-		assertEquals(1,1);
-	}
-	private int netporot(int i) {
-		i++;
-		if(i >= startPort+serverCount) {
-			return startPort;
-		}
-		
-		return i;
-	}
-}
-
--- a/src/fdl/test/metaTransfer/Ring/TestTransferThree.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-package fdl.test.metaTransfer.Ring;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class TestTransferThree {
-	@Test
-	public void testTransfer() {
-		
-		Server server1 = new Server("Server1", 10001, 10002, 0);
-		server1.start();
-		Server server2 = new Server("Server2", 10002, 10001, 0);
-		server2.start();
-//		Server server3 = new Server("Server3", 10003, 10001, 0);
-//		server3.start();
-
-		assertEquals(1,1);
-	}
-
-}
-
--- a/src/fdl/test/metaTransfer/Server.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-package fdl.test.metaTransfer;
-
-import fdl.FDLindaServ;
-
-public class Server extends Thread {
-	int port;
-	private String name;
-	
-	public Server(String string, int i) {
-		port = i;
-		name = string;
-	}
-
-	public void run(){
-		String[] args = {"-p",Integer.toString(port)};
-		System.out.println(name);
-		FDLindaServ.main(args);
-	}
-
-}
\ No newline at end of file
--- a/src/fdl/test/metaTransfer/TestSend.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-package fdl.test.metaTransfer;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-
-public class TestSend extends Thread {
-	PSXLinda psxsend;
-	FederatedLinda fdlsend;
-	
-	public void run(){
-		int id = 10;
-		int port = 10001;
-		boolean connect = true;
-		String host = "127.0.0.1";
-		ByteBuffer send = ByteBuffer.allocate(1024);
-		send.putInt(12);
-		send.flip();
-		while(connect){
-		try {
-		sendData(id, port, host, send);
-		connect = false;
-		} catch(IOException e) {
-			try {
-				Thread.sleep(40);
-			} catch (InterruptedException e1) {
-				e1.printStackTrace();
-			}
-		}
-		
-		}
-	}
-
-	private void sendData(int id, int port, String host, ByteBuffer send) throws IOException {
-		fdlsend = FederatedLinda.init();
-
-			psxsend = fdlsend.open(host,port);
-			System.out.println("Connect Host1");
-			psxsend.out(id, send);
-			fdlsend.sync(1);
-			System.out.println("Send Data");
-
-	}
-	
-}
--- a/src/fdl/test/metaTransfer/TestTransfer.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-package fdl.test.metaTransfer;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-
-import org.junit.Test;
-
-public class TestTransfer {
-	@Test
-	public void testTransfer() throws IOException {
-		int port1 = 10001;
-		int port2 = 10002;
-		
-//		Server server1 = new Server("Server1",port1);
-//		server1.start();
-//
-		Server server2 = new Server("Server2",port2);
-		server2.start();
-		
-
-		FDLServWithSend send = new FDLServWithSend(port1, port2);
-		send.mainLoop();
-		
-		assertEquals(1,1);
-	}
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/topology/FDLindaNode.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,64 @@
+package fdl.test.topology;
+
+import java.io.IOException;
+
+import fdl.FDLindaServ;
+import fdl.MetaLinda;
+import fdl.MetaEngine;
+
+/**
+* FDLindaNode
+*
+* @author Kazuki Akamine
+*
+* Federated Linda の Topology Node
+* 接続する機能までを実装 MetaEngine は外部から提供される
+*  
+*/
+
+public class FDLindaNode extends FDLindaServ {
+	// Fields
+	private MetaLinda ml;
+	private static int localPort = 10000;
+	private static String managerHostName;
+	private final static String usageString
+		= "Usage: FDLindaNode -manager SERVERNAME";
+	
+	// Constructor
+	public FDLindaNode(int port) throws IOException {
+		super(port);
+		this.ml = new MetaLinda(tupleSpace, this);
+	}
+	
+	@Override public void mainLoop() {
+		while (true) { // loop
+			me.mainLoop(ml);
+			ml.sync();
+		}
+	}
+	public void setMetaEngine(MetaEngine me) {
+		this.me = me; 
+	}
+	public MetaLinda getMetaLinda() {
+		return ml;
+	}
+	// main routine
+	public static void main(String[] args) {
+		for (int i = 0; i < args.length; i++) {
+			if ("-manager".equals(args[i])) {
+				managerHostName = args[++i];
+			} else {
+				System.err.println(usageString);
+			}
+		}
+		try {
+			FDLindaNode node = new FDLindaNode(localPort);
+			MetaEngine me = new MetaProtocolEngine(node.getMetaLinda(), managerHostName);
+			node.setMetaEngine(me);
+			node.mainLoop();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/topology/MetaProtocolEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,117 @@
+package fdl.test.topology;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+/**
+* MetaProtocolEngine
+*
+* @author Kazuki Akamine
+* 
+* 接続する機能までを実装した MetaEngine
+* これを継承して、具体的な処理を書く
+*  
+*/
+
+public class MetaProtocolEngine implements MetaEngine {
+	// Fields
+	protected static String lastToken = "null";
+	protected static int port = 10000;
+	protected static int manageId = 60000;
+	protected PSXLinda manager, psxLocal;
+	protected ArrayList<PSXLinda> psxSendServers;
+	protected MetaLinda fdlMeta;
+	protected String managerHostName;
+	protected String localHostName;
+	
+	// Constructor
+	public MetaProtocolEngine(MetaLinda ml, String managerHostName) {
+		this.fdlMeta = ml;
+		this.managerHostName = managerHostName;
+		try {
+			this.localHostName = InetAddress.getLocalHost().getHostName();
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		}
+		this.psxSendServers = new ArrayList<PSXLinda>();
+	}
+	public void mainLoop(MetaLinda ml) {}
+
+	public void mainLoop() {
+		psxLocal = fdlMeta;
+		initTopologyManager();
+		initSendServer();
+	}
+	
+	protected void initSendServer() {
+		sendLocalHostName();
+		connectSendServers();
+		sendLocalHostName();
+	}
+
+	protected void initTopologyManager() {
+		// Connect to TopologyManager Server
+		try {
+			manager = fdlMeta.open(managerHostName, port);
+		} catch (IOException e) {
+			// manager は先に立ち上げてから実行する。
+			// while で回して再接続 loop にすべき?
+			e.printStackTrace();
+		}
+	}
+	
+	protected void sendLocalHostName() {
+		// TopologyManager に自分のホストネームを送信して、起動を伝える
+		ByteBuffer local;
+		local = ByteBuffer.wrap(localHostName.getBytes());
+		manager.out(manageId, local);
+		try {
+			manager.sync(1);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	protected void connectSendServers() {
+		// TopologyManager から、送られてくる ConnectServer の hostName を取得して接続
+		System.out.println("[DEBUG] MethodCall connectSendServers()");
+		while (true) {
+			PSXReply reply;
+			reply = psxLocal.in(manageId);
+			do {
+				try {
+					psxLocal.sync(1);
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			} while (!reply.ready());
+			ByteBuffer data = reply.getData();
+			String hostName = new String(data.array());
+			System.out.println("[DEBUG] GetReply " + hostName);
+			if (hostName.equals(lastToken))
+				break;
+			connectSendServer(hostName);
+		}
+	}
+	
+	protected void connectSendServer(String hostName) {
+		PSXLinda linda;
+		try {
+			linda = fdlMeta.open(hostName, port);
+			psxSendServers.add(linda);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		System.out.println("Connect to " + hostName);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/topology/NodeManager.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,93 @@
+package fdl.test.topology;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+
+import fdl.PSXLinda;
+import fdl.MetaLinda;
+
+public class NodeManager {
+	public String hostName;
+	public PSXLinda linda;
+	private MetaLinda mLinda;
+	private int port;
+	private int manageId;
+	private ArrayList<NodeManager> waitingNodes;
+	private ArrayList<NodeManager> waitedNodes;
+//	private ArrayList<NodeManager> sendNodes;
+
+	public NodeManager(MetaLinda ml, int port, int manageId) {
+		this.port = port;
+		this.manageId = manageId;
+		this.mLinda = ml;
+		hostName = null;
+		waitingNodes = new ArrayList<NodeManager>();
+		waitedNodes = new ArrayList<NodeManager>();
+//		sendNodes = new ArrayList<NodeManager>();
+	}
+	
+	public void addConnection(NodeManager node) {
+		waitingNodes.add(node);
+		node.waitedNodes.add(this);
+	}
+	
+	public void finishConnection(NodeManager node) {
+		waitingNodes.remove(node);
+		node.waitedNodes.remove(this);
+//		sendNodes.add(node);
+	}
+	
+	public void startUp(String hostName) {
+		// 起動
+		this.hostName = hostName;
+		try {
+			linda = mLinda.open(hostName, port);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		// 起動待ちのノードに通知
+		connectWaitedNodes();
+	}
+	
+	public void connectWaitedNodes() {
+		for (int i = 0; i < waitedNodes.size(); i++) {
+			NodeManager node = waitedNodes.get(i);
+			if (node.isRunning()) {
+				node.connect(this);
+				node.finishConnection(this);
+				if (waitingNodes.contains(node)) {
+					connect(node);
+					finishConnection(node);
+				}
+			}
+		}
+		for (int i = 0; i < waitingNodes.size(); i++) {
+			NodeManager node = waitingNodes.get(i);
+			if (node.isRunning()) {
+				connect(node);
+				finishConnection(node);
+				if (node.waitingNodes.contains(this)) {
+					node.connect(this);
+					node.finishConnection(this);
+				}
+			}
+		}
+	}
+	
+	public void connect(NodeManager node) {
+		ByteBuffer data = ByteBuffer.wrap(node.hostName.getBytes());
+		linda.out(manageId, data);
+		try {
+			linda.sync(1);
+			System.out.println("[DEBUG] SendConnectTo: " + hostName + " to " + node.hostName);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public boolean isRunning() {
+		return hostName != null;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/topology/TopologyManager.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,40 @@
+package fdl.test.topology;
+
+import java.io.IOException;
+
+import fdl.MetaEngine;
+
+/**
+* TopologyManager
+*
+* @author Kazuki Akamine
+*
+* FDLindaNode の Topology を管理する Server
+*  
+*/
+
+public class TopologyManager {
+	private static int localPort = 10000;
+	private static int nodeNum = 2;
+	private static String usageString
+		= "TopologyManager -nodes NODENUM";
+	
+	public static void main(String[] args) {
+		for (int i = 0; i < args.length; i++) {
+			if ("-nodes".equals(args[i])) {
+				nodeNum = Integer.parseInt(args[++i]);
+			} else {
+				System.err.println(usageString);
+			}
+		}
+		try {
+			FDLindaNode manager = new FDLindaNode(localPort);
+			MetaEngine me = new TopologyManagerEngine(manager.getMetaLinda(), nodeNum);
+			manager.setMetaEngine(me);
+			manager.mainLoop();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/topology/TopologyManagerEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,115 @@
+package fdl.test.topology;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.MetaEngine;
+import fdl.MetaLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+
+/**
+* TopologyManagerEngine
+*
+* @author Kazuki Akamine
+*
+* FDLindaNode の Topology を管理する Server の MetaEngine
+* TopologyManager の具体的な実装
+*  
+*/
+
+public class TopologyManagerEngine implements MetaEngine {
+	protected static String lastToken = "null";
+	protected static int port = 10000;
+	protected static int manageId = 60000;
+	protected PSXLinda manager;
+	protected MetaLinda fdlMeta;
+	protected int nodeNum; // 後々は、nodelist から自動で取得したい
+	protected NodeManager[] nodes;
+		
+	// Constructor
+	public TopologyManagerEngine(MetaLinda ml, int nodeNum) {
+		this.fdlMeta = ml;
+		this.nodeNum = nodeNum;
+		this.nodes = new NodeManager[this.nodeNum];
+		for (int i = 0; i < nodes.length; i++) {
+			this.nodes[i] = new NodeManager(fdlMeta, port, manageId);
+		}
+	}
+	
+	public void mainLoop(MetaLinda ml) {}
+
+	public void mainLoop() {
+		manager = fdlMeta;
+		makeTopology();
+	}
+	
+	protected void makeTopology() {
+		makeConnection();
+		acceptNewNode();
+		sendLastToken();
+		checkConnection();
+	}
+	
+	// これを継承して、 Topology を形成
+	// 最終的には外部XMLを読み込んで接続するようにする
+	protected void makeConnection() {
+		// 接続を定義
+		nodes[0].addConnection(nodes[1]);
+		nodes[1].addConnection(nodes[0]);
+	}
+	
+	protected void acceptNewNode() {
+		// 起動状況を確認しつつ、接続命令を送信
+		// nodes の数だけ新規参入 node を待つ。
+		for (int i = 0; i < nodes.length; i++) {
+			PSXReply reply;
+			reply = manager.in(manageId);
+			do {
+				try {
+					manager.sync(1);
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			} while (!reply.ready());
+			ByteBuffer data = reply.getData();
+			String hostName = new String(data.array());
+			System.out.println("[DEBUG] GetNodeName: " + hostName);
+			nodes[i].startUp(hostName);
+		}	
+	}
+		
+	protected void sendLastToken() {
+		ByteBuffer lastTokenBB = ByteBuffer.wrap(lastToken.getBytes());
+		for (int i = 0; i < nodes.length; i++) {
+			// 参加ノードに実験開始を告知する ("null"を送る)
+			nodes[i].linda.out(manageId, lastTokenBB);
+			System.out.println("[DEBUG] SendMsg: " + lastToken + " to " + nodes[i].hostName);
+
+			try {
+				nodes[i].linda.sync(1);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	protected void checkConnection() {
+		for (int i = 0; i < nodes.length; i++) {
+			PSXReply reply;
+			reply = manager.in(manageId);
+			do {
+				try {
+					manager.sync(1);
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			} while (!reply.ready());
+			ByteBuffer data = reply.getData();
+			String ack = new String(data.array());
+			System.out.println("[DEBUG] ConnectedHost: " + ack);
+		}
+		System.out.println("[DEBUG] AllConnected");
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/topology/ring/FDLindaRingNode.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,49 @@
+package fdl.test.topology.ring;
+
+import java.io.IOException;
+import fdl.MetaEngine;
+import fdl.test.topology.*;
+
+/**
+* FDLindaRingNode
+*
+* @author Kazuki Akamine
+*
+* Federated Linda の Ring 用 Node
+* Ring 用の MetaEngine を持たせる。
+*  
+*/
+
+public class FDLindaRingNode {
+	// Fields
+	private static int localPort = 10000;
+	private static String managerHostName;
+	private static String relayNumString;
+	private static int relayNum;
+	private final static String usageString
+		= "Usage: FDLindaRingNode -manager SERVERNAME";
+
+	// main routine
+	public static void main(String[] args) {
+		for (int i = 0; i < args.length; i++) {
+			if ("-manager".equals(args[i])) {
+				managerHostName = args[++i];
+			} else if ("-relay".equals(args[i])) {
+				relayNumString = args[++i];
+			} else {
+				System.err.println(usageString);
+			}
+		}
+		relayNum = Integer.parseInt(relayNumString);
+		
+		try {
+			FDLindaNode node = new FDLindaNode(localPort);
+			MetaEngine me = new RingMetaProtocolEngine(node.getMetaLinda(), managerHostName, relayNum);
+			node.setMetaEngine(me);
+			node.mainLoop();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/topology/ring/RingMetaProtocolEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,102 @@
+package fdl.test.topology.ring;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+//import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import fdl.MetaLinda;
+import fdl.PSXLinda;
+import fdl.PSXReply;
+import fdl.test.topology.MetaProtocolEngine;
+
+/**
+* RingMetaProtocolEngine
+*
+* @author Kazuki Akamine
+* 
+* Ring 接続実験用の MetaProtocolEngine
+* Ring 接続実験の具体的な処理を記述する。
+*  
+*/
+
+public class RingMetaProtocolEngine extends MetaProtocolEngine {
+	private int relayNum;
+	private static int relayId = 10;
+	private Date startTime, endTime;
+	//private SimpleDateFormat DF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
+	public RingMetaProtocolEngine(MetaLinda ml, String managerHostName, int relayNum) {
+		super(ml, managerHostName);
+		this.relayNum = relayNum;
+		startTime = null;
+		endTime = null;
+	}
+	
+	@Override public void mainLoop() {
+		// 接続処理
+		super.mainLoop();
+		// Ring 実験開始
+		relayTuple(relayId);
+	}
+	
+	private void relayTuple(int tupleId) {
+		while (true) {
+			ByteBuffer data = receiveToken(tupleId);
+			if (startTime == null) {
+				startTime = new Date(); 
+			}
+			if (relayNum == 0) {
+				String token = new String(data.array());
+				if (!token.equals(lastToken)) {
+					// TODO: 実験結果をManagerに伝えるなどの処理
+					sendResult();
+					System.out.println("[Ring] relay finished: " + token);
+					// 実験終了を各ノードにリレーで伝える
+					sendToken(tupleId, ByteBuffer.wrap(lastToken.getBytes()));
+				}
+				return;
+			}
+			sendToken(tupleId, data);
+			System.out.println("[DEBUG] Relay...");
+			relayNum--;
+		}
+	}
+	
+	private void sendResult() {
+		this.endTime = new Date();
+		Long resultTime = new Long(endTime.getTime() - startTime.getTime()); 
+		ByteBuffer data = ByteBuffer.wrap(resultTime.toString().getBytes());
+		manager.out(relayId, data);
+		try {
+			manager.sync(1);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private ByteBuffer receiveToken(int tupleId) {
+		PSXReply reply = psxLocal.in(tupleId);
+		do {
+			try {
+				psxLocal.sync(1);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		} while (!reply.ready());
+		ByteBuffer data = reply.getData();
+		return data;
+	}
+	
+	private void sendToken(int tupleId, ByteBuffer data) {
+		for (int i = 0; i < psxSendServers.size(); i++) {
+			PSXLinda linda = psxSendServers.get(i);
+			linda.out(tupleId, data);
+			try {
+				linda.sync(1);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/topology/ring/RingTopologyManager.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,41 @@
+package fdl.test.topology.ring;
+
+import java.io.IOException;
+
+import fdl.MetaEngine;
+import fdl.test.topology.FDLindaNode;
+
+/**
+* RingTopologyManager
+*
+* @author Kazuki Akamine
+*
+* FDLindaNode の Topology を管理する Server
+* Ring 実験用の Main Class
+*  
+*/
+
+public class RingTopologyManager {
+	private static int localPort = 10000;
+	private static int nodeNum;
+	private static String usageString
+		= "RingTopologyManager -nodes NODENUM";
+	
+	public static void main(String[] args) {
+		for (int i = 0; i < args.length; i++) {
+			if ("-nodes".equals(args[i])) {
+				nodeNum = Integer.parseInt(args[++i]);
+			} else {
+				System.err.println(usageString);
+			}
+		}
+		try {
+			FDLindaNode manager = new FDLindaNode(localPort);
+			MetaEngine me = new RingTopologyManagerEngine(manager.getMetaLinda(), nodeNum);
+			manager.setMetaEngine(me);
+			manager.mainLoop();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fdl/test/topology/ring/RingTopologyManagerEngine.java	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,61 @@
+package fdl.test.topology.ring;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import fdl.MetaLinda;
+import fdl.PSXReply;
+import fdl.test.topology.TopologyManagerEngine;
+
+public class RingTopologyManagerEngine extends TopologyManagerEngine {
+	private int relayId = 10;
+
+	// Constructor
+	public RingTopologyManagerEngine(MetaLinda ml, int nodeNum) {
+		super(ml, nodeNum);
+	}
+	
+	public void mainLoop() {
+		super.mainLoop();
+		startRelay();
+		endRelay();
+	}
+	
+	protected void makeTopology() {
+		super.makeTopology();
+	}
+	
+	@Override protected void makeConnection() {
+		// Ring 状の接続を定義
+		for (int i = 0; i < nodes.length; i++) {
+			nodes[i].addConnection(nodes[(i+1)%nodes.length]);
+		}
+	}
+	
+	private void startRelay() {
+		String relayString = "test";
+		ByteBuffer data = ByteBuffer.wrap(relayString.getBytes());
+		nodes[0].linda.out(relayId, data);
+		try {
+			nodes[0].linda.sync(1);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private void endRelay() {
+		PSXReply reply;
+		reply = manager.in(relayId);
+		do {
+			try {
+				manager.sync(1);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		} while (!reply.ready());
+		ByteBuffer data = reply.getData();
+		String resultData = new String(data.array());
+		System.out.println("[DEBUG] RelayTime: " + resultData);
+	}
+
+}
--- a/src/fdl/test/transfer/ProtocolEngine.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-package fdl.test.transfer;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-
-public class ProtocolEngine extends Thread{
-	private PSXLinda psx;
-	private String name;
-	FederatedLinda fdl1;
-	String host = "127.0.0.1";
-	int port1 = 10001;
-	int port2 = 10002;
-	private int id = 10;
-	private PSXLinda psx1;
-	private boolean running = true;
-	private ByteBuffer data2 = ByteBuffer.allocate(10);
-
-	public ProtocolEngine(String string, int port1, int port2) {
-		this.name = string;
-		this.port1 = port1;
-		this.port2 = port2;
-	}
-
-	public void run(){
-		fdl1 = FederatedLinda.init();
-		try {
-			System.out.println(name);
-			psx = fdl1.open(host,port1);
-			System.out.println("Connect Host1");
-			psx1 = fdl1.open(host,port2);
-			System.out.println("Connect Host2");
-			// Host1にデータを送信する。
-			testSend(psx);
-			// psxにデータを用意
-			transfer(psx,psx1);
-			
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-	
-	private void testSend(PSXLinda psx2) throws IOException {
-		ByteBuffer send = ByteBuffer.allocate(10);
-		send.putInt(12);
-		send.flip();
-		psx2.out(id, send);
-		psx2.sync(1);
-	}
-	
-
-	private void transfer(PSXLinda getpsx, PSXLinda sendpsx) throws IOException {
-		PSXReply in = getpsx.in(id);
-		while (running) {
-			System.out.println(in.ready());
-			if(in.ready()){
-				//psx1にデータを書き出し
-				data2 = in.getData();
-				sendpsx.out(id,data2);
-				//runningフラグをfalseする
-				running = false;
-				fdl1.sync(0);
-				break;
-			}
-			fdl1.sync();
-		}
-		
-	}
-
-}
--- a/src/fdl/test/transfer/Server.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-package fdl.test.transfer;
-
-import fdl.FDLindaServ;
-
-public class Server extends Thread{
-	int port;
-	private String name;
-
-	public Server(String string, int i) {
-		port = i;
-		name = string;
-	}
-
-	public void run(){
-		String[] args = {"-p",Integer.toString(port)};
-		System.out.println(name);
-		FDLindaServ.main(args);
-	}
-
-}
\ No newline at end of file
--- a/src/fdl/test/transfer/TestSend.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-package fdl.test.transfer;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-
-public class TestSend extends Thread {
-	PSXLinda psxsend;
-	FederatedLinda fdlsend;
-	
-	public void run(){
-		int id = 10;
-		int port = 10001;
-		String host = "127.0.0.1";
-		ByteBuffer send = ByteBuffer.allocate(1024);
-		send.putInt(12);
-		send.flip();
-		fdlsend = FederatedLinda.init();
-		try{
-			psxsend = fdlsend.open(host,port);
-			System.out.println("Connect Host1");
-			psxsend.out(id, send);
-			fdlsend.sync();
-			System.out.println("Send Data");
-		}catch (IOException e) {
-			System.out.println("例外:" + e);
-		}
-		
-	}
-	
-}
--- a/src/fdl/test/transfer/TestTransfer.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-package fdl.test.transfer;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class TestTransfer {
-	@Test
-	public void testTransfer() {
-		int port1 = 10001;
-		int port2 = 10002;
-		Server server1 = new Server("Server1",port1);
-		server1.start();
-		Server server2 = new Server("Server2",port2);
-		server2.start();
-		ProtocolEngine pe = new ProtocolEngine("ProtocolEngine",port1,port2);
-		pe.start();
-		try {
-			pe.join();
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-		assertEquals(1,1);
-	}
-}
--- a/src/fdl/test/transfer/cluster/FDLServWithSendMeta.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-package fdl.test.transfer.cluster;
-
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-import fdl.FDLindaServ;
-import fdl.MetaLinda;
-
-
-public class FDLServWithSendMeta extends FDLindaServ {
-
-	public FDLServWithSendMeta(int port) throws IOException {
-		super(port);
-	}
-	
-	static String nextHost = null;
-	private static int localport = 10000;
-	static int chknum;
-	private static String bufstring;
-	private static int bufsize;
-	private static String txt;
-	private static int ring;
-	
-	@Override public void mainLoop() {
-		MetaLinda ml = new MetaLinda(tupleSpace, this);
-		MetaProtocolEngine mpe = new MetaProtocolEngine(ml, nextHost, chknum, bufsize, txt);
-		mpe.mainLoop();
-	}
-	
-	public static void main(String[] args){
-		for (int k=0; k<args.length; ++k) {
-			if("-bufsize".equals(args[k])){
-				bufstring = args[++k];
-			} else if("-ring".equals(args[k])){
-				txt = args[++k];
-				ring = Integer.valueOf(txt);
-			} else {
-	        System.err.println("引数指定の誤り:未知の引数が指定されました");
-            }
-		}
-		bufsize = Integer.parseInt(bufstring);
-		try {
-			chkhost();
-			FDLServWithSendMeta serv;
-			serv = new FDLServWithSendMeta(localport);
-			serv.mainLoop();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-	
-	private static void chkhost() throws UnknownHostException{
-		String localhost = null;
-		BufferedReader br = null;
-		String hostTable[] = new String[ring+1];
-		try {
-			br = new BufferedReader(new FileReader("nodelist"));
-			int i = 0;
-			while (br.ready()) {
-				String line = br.readLine();
-				hostTable[i] = line;
-				i++;
-			}
-			localhost = InetAddress.getLocalHost().getHostName();
-			for (int j=0; j<hostTable.length; j++) {
-				if(localhost.equals(hostTable[j])){
-					nextHost = hostTable[++j];
-					if(j == ring) {
-						nextHost = hostTable[0];
-					}
-				}
-			}
-			
-			if(localhost.equals(hostTable[0])) {
-				chknum = 1;
-			}
-				
-			System.out.println("localhost:"+localhost);
-			System.out.println("nexthost:"+nextHost);
-		
-		} catch (FileNotFoundException e) {
-			e.printStackTrace();
-		} catch (IOException e){
-			e.printStackTrace();
-		}
-	}
-	
-}
--- a/src/fdl/test/transfer/cluster/HostCheck.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-package fdl.test.transfer.cluster;
-
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.InetAddress;
-
-public class HostCheck {
-	private static String bufstring;
-	private static String txt;
-	private static Integer ring;
-	private static int bufsize;
-	private static String nextHost;
-	private static int chknum;
-
-	public static void main(String[] args) {
-		String localhost = null;
-		BufferedReader br = null;
-		for (int k=0; k<args.length; ++k) {
-			if("-bufsize".equals(args[k])){
-				bufstring = args[++k];
-			} else if("-ring".equals(args[k])){
-				txt = args[++k];
-				ring = Integer.valueOf(txt);
-			} else {
-	        System.err.println("引数指定の誤り:未知の引数が指定されました");
-            }
-		}
-		String hostTable[] = new String[ring+1];
-		bufsize = Integer.parseInt(bufstring);
-		try {
-			br = new BufferedReader(new FileReader("nodelist"));
-			int i = 0;
-			while (br.ready()) {
-				String line = br.readLine();
-				hostTable[i] = line;
-				i++;
-			}
-			localhost = InetAddress.getLocalHost().getHostName();
-			for (int j=0; j<hostTable.length; j++){
-				if(localhost.equals(hostTable[j])){
-				nextHost = hostTable[++j];
-				if(j == ring) {
-					nextHost = hostTable[0];
-				}
-			}
-			}
-			if(localhost.equals(hostTable[0])) {
-				chknum = 1;
-			}
-			
-			System.out.println("localhost:"+localhost);
-			System.out.println("nexthost:"+nextHost);
-
-		} catch (FileNotFoundException e) {
-			e.printStackTrace();
-		} catch (IOException e){
-			e.printStackTrace();
-		}
-		ProtocolEngine pe = new ProtocolEngine(localhost, nextHost,chknum, bufsize, txt);
-		pe.start();
-	}
-}
\ No newline at end of file
--- a/src/fdl/test/transfer/cluster/MetaProtocolEngine.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,177 +0,0 @@
-package fdl.test.transfer.cluster;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import fdl.MetaEngine;
-import fdl.MetaLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-public class MetaProtocolEngine implements MetaEngine {
-	private int id = 10;
-	
-	private PSXLinda psxget;
-	MetaLinda fdlmeta;
-	String host;
-	int port = 10000;
-	private PSXLinda psxsend;
-	private int chknum;
-	
-	SimpleDateFormat DF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
-
-	private int bufsize;
-
-	private String time;
-	private long timelong;
-	private String start;
-	private String txt;
-	private String transfer;
-	private long transferlong;
-	
-	public MetaProtocolEngine(MetaLinda ml, String host, int chknum, int bufsize, String txt) {
-		this.host = host;
-		this.fdlmeta = ml;
-		this.chknum = chknum;
-		this.bufsize = bufsize;
-		this.txt = txt;
-	}
-
-	public void mainLoop(){
-		psxget = fdlmeta;
-		if(chknum == 1){
-			try {
-				sendData();
-				start = DF.format(new Date());
-				System.out.println("Start Time => "+start);
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-			}
-		boolean connect = true;
-		while(connect){
-		try {
-			initConnect();
-			transfer = DF.format(new Date());
-			transferlong = new Date().getTime();
-			System.out.println("transfer Time => "+transfer);
-			for(int l=0; l<1000; l++){
-			transfer();
-			}
-			dataChk();
-			write();
-			connect = false;
-		} catch (IOException e) {
-			try {
-				Thread.sleep(40);
-			} catch (InterruptedException e1) {
-			}
-		}
-		}
-	}
-
-	private void initConnect(){
-		boolean connectpsx = true;
-		while(connectpsx){
-		try {
-			psxsend = fdlmeta.open(host,port);
-			connectpsx = false;
-		} catch (IOException e) {
-			try {
-				Thread.sleep(40);
-			} catch (InterruptedException e1) {
-				e1.printStackTrace();
-			}
-		}
-		}
-	}
-	
-	private void sendData() throws IOException{
-		boolean connectSend = true;
-		ByteBuffer send = ByteBuffer.allocate(bufsize);
-		byte[] fdata = new byte[bufsize];
-//		fdata = InetAddress.getLocalHost().getAddress();
-		for(int n=0; n < fdata.length; n++ ){
-			fdata[n] = 1;
-		}
-		send.put(fdata);
-		send.flip();
-		while(connectSend){
-		psxget.out(id, send);
-		psxget.sync(1);
-		System.out.println("Send Data");
-		connectSend = false;
-		}
-	}
-
-	public void transfer() throws IOException {
-		ByteBuffer data = ByteBuffer.allocate(bufsize);
-		boolean running = true;
-		PSXReply in = psxget.in(id);
-		while (running) {
-			if(in.ready()){
-				data = in.getData();
-				psxsend.out(id,data);
-				System.out.println("connect to => "+host);
-				psxsend.sync(1);
-				running = false;
-				break;
-			}
-			fdlmeta.sync();
-		}
-	}
-	
-	public void dataChk() throws IOException{
-		fdlmeta.sync(1);
-		boolean running2 = true;
-//		ByteBuffer data2 = ByteBuffer.allocate(bufsize);
-		PSXReply in2 = psxget.in(id);
-//		byte[] fdata2 = new byte[bufsize];
-//		byte[] fdata3 = new byte[bufsize];
-//		fdata = InetAddress.getLocalHost().getAddress();
-//		for(int n=0; n < fdata2.length; n++ ){
-//			fdata2[n] = 1;
-//		}
-		while (running2) {
-			psxget.sync(1);
-			if(in2.ready()) {
-//				data2 = in2.getData();
-//				data2.get(fdata3);
-//				if (fdata2 == fdata3){
-				time = DF.format(new Date());
-				timelong = new Date().getTime();
-				System.out.println("Around Time => "+time);
-//				}
-			running2 = false;
-			break;
-			}
-		}
-	}
-	
-	
-	public void write() throws IOException{
-		long result = (timelong - transferlong);
-		String diff = String.valueOf(result);
-		File read = new File("resultTime"+bufsize+"_"+txt+".txt");
-		read.createNewFile();
-		FileWriter filewrite = new FileWriter(read);
-		if (start != "null"){
-		filewrite.write("ServerStart => "+start+"\r\n");
-		}
-		if (transfer != "null") {
-		filewrite.write("TransferTime => "+transfer+"\r\n");
-		}
-		if (time != "null"){
-		filewrite.write("AroundTime => "+time+"\r\n");
-		}
-		if (diff != "null"){
-		filewrite.write("DiffTime => "+diff+"\r\n");
-		}
-		filewrite.close();
-	}
-}
-
--- a/src/fdl/test/transfer/cluster/ProtocolEngine.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-package fdl.test.transfer.cluster;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.nio.ByteBuffer;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-
-public class ProtocolEngine extends Thread{
-	static int id = 10;
-	static FederatedLinda fdl;
-	static PSXLinda getpsx;
-	static PSXLinda sendpsx;
-	static int port = 10000;
-	String getHost = null;
-	String sendHost = null;
-	private int chknum;
-	private int bufsize;
-	private String txt;
-	SimpleDateFormat DF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
-	private String time;
-	private long timelong;
-	private String start;
-	private String transfer;
-	private long transferlong;
-	
-	public ProtocolEngine(String gethost, String sendhost, int chknum, int bufsize, String txt) {
-		this.getHost = gethost;
-		this.sendHost = sendhost;
-		this.chknum = chknum;
-		this.bufsize = bufsize;
-		this.txt = txt;
-	}
-
-	public void run(){
-		fdl = FederatedLinda.init();
-		try {
-			getpsx = fdl.open(getHost,port);
-			System.out.println("Connect Host1");
-			sendpsx = fdl.open(sendHost,port);
-			System.out.println("Connect Host2");
-			// Host1にデータを送信する。
-			if(chknum == 1){
-			testSend(getpsx);
-			start = DF.format(new Date());
-			System.out.println("Start Time => "+start);
-			}
-			// psxにデータを用意
-			transfer(getpsx,sendpsx);
-			dataChk();
-			write();
-			
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-	
-	private void write() throws IOException {
-		long result = (timelong - transferlong);
-		String diff = String.valueOf(result);
-		File read = new File("resultTime"+bufsize+"_"+txt+".txt");
-		read.createNewFile();
-		FileWriter filewrite = new FileWriter(read);
-		if (start != "null"){
-		filewrite.write("ServerStart => "+start+"\r\n");
-		}
-		if (transfer != "null") {
-		filewrite.write("TransferTime => "+transfer+"\r\n");
-		}
-		if (time != "null"){
-		filewrite.write("AroundTime => "+time+"\r\n");
-		}
-		if (diff != "null"){
-		filewrite.write("DiffTime => "+diff+"\r\n");
-		}
-		filewrite.close();
-	}
-
-	private void dataChk() throws IOException {
-		fdl.sync(1);
-		boolean running2 = true;
-		ByteBuffer data3 = ByteBuffer.allocate(bufsize);
-		PSXReply in2 = getpsx.in(id);
-		int localhost2 = InetAddress.getLocalHost().hashCode();
-		while (running2) {
-			getpsx.sync(1);
-			if(in2.ready()) {
-			data3 = in2.getData();
-			int i = data3.getInt();
-			if (i == localhost2){
-				time = DF.format(new Date());
-				timelong = new Date().getTime();
-				System.out.println("Around Time => "+time);
-			}
-			running2 = false;
-			break;
-			}
-		}
-		
-	}
-
-	private void testSend(PSXLinda psx2) throws IOException {
-		boolean connectSend = true;
-		ByteBuffer send = ByteBuffer.allocate(bufsize);
-		int localhost = InetAddress.getLocalHost().hashCode();
-		send.putInt(localhost);
-		send.flip();
-		while(connectSend){
-		psx2.out(id, send);
-		psx2.sync(1);
-		System.out.println("Send Data");
-		connectSend = false;
-		}
-	}
-	
-
-	private void transfer(PSXLinda getpsx, PSXLinda sendpsx) throws IOException {
-		ByteBuffer data2 = ByteBuffer.allocate(bufsize);
-		PSXReply in = getpsx.in(id);
-		boolean running = true;
-		while (running) {
-			if(in.ready()){
-				//psx1にデータを書き出し
-				data2 = in.getData();
-				sendpsx.out(id,data2);
-				//runningフラグをfalseする
-				running = false;
-				transfer = DF.format(new Date());
-				transferlong = new Date().getTime();
-				System.out.println("transfer Time => "+transfer);
-				System.out.println("connect to => "+sendHost);
-				sendpsx.sync(1);
-				break;
-			}
-			fdl.sync();
-		}
-		
-	}
-
-}
--- a/src/fdl/test/transfer/cluster/ProtocolEngineMain.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-package fdl.test.transfer.cluster;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-public class ProtocolEngineMain {
-	static int id = 10;
-	static FederatedLinda fdl;
-	static PSXLinda getpsx;
-	static PSXLinda sendpsx;
-	static int port = 10000;
-	private static String getHost = null;
-	private static String sendHost = null;
-	
-	public static void main(String[] args) {
-		for (int i=0; i<args.length; ++i) {
-			if("-get".equals(args[i])){
-				getHost = args[++i];
-			} else if("-send".equals(args[i])){
-				sendHost = args[++i];
-			} else {
-	        System.err.println("引数指定の誤り:未知の引数が指定されました");
-            }
-		}
-		fdl = FederatedLinda.init();
-		try {
-			getpsx = fdl.open(getHost,port);
-			System.out.println("Connect Host1");
-			sendpsx = fdl.open(sendHost,port);
-			System.out.println("Connect Host2");
-			// Host1にデータを送信する。
-//			ByteBuffer send = ByteBuffer.allocate(10);
-//			send.putInt(12);
-//			send.flip();
-//			getpsx.out(id , send);
-//			fdl.sync(1);
-//			System.out.println("Send Data");
-			// psxにデータを用意
-			boolean running = true;
-			ByteBuffer data2 = ByteBuffer.allocate(10);
-			PSXReply in = getpsx.in(id);
-			while (running) {
-				if(in.ready()){
-					//psx1にデータを書き出し
-					data2 = in.getData();
-					sendpsx.out(id,data2);
-					int i = data2.getInt();
-					data2.rewind();
-					System.out.println("transfer Data => "+i);
-					//runningフラグをfalseする
-					running = false;
-					sendpsx.sync(1);
-					System.out.println("Transfer Data");
-					break;
-				}
-				SimpleDateFormat DF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
-				System.out.println(DF.format(new Date()));
-				fdl.sync();
-			}
-			
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-
-}
--- a/src/fdl/test/transfer/cluster/Server.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-package fdl.test.transfer.cluster;
-
-import fdl.FDLindaServ;
-
-public class Server extends Thread{
-	int port;
-
-	public Server() {
-	}
-
-	public void run(){
-		String[] args = {"-p",Integer.toString(port)};
-		FDLindaServ.main(args);
-	}
-
-}
\ No newline at end of file
--- a/src/fdl/test/transfer/cluster/ServerMain.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-package fdl.test.transfer.cluster;
-
-import fdl.FDLindaServ;
-
-public class ServerMain{	
-	public static void main(String[] args){
-		int port = 10000;
-		String[] args1 = {"-p",Integer.toString(port)};
-		FDLindaServ.main(args1);
-	}
-
-}
\ No newline at end of file
--- a/src/fdl/test/transfer/cluster/TestGet.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-package fdl.test.transfer.cluster;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-
-public class TestGet extends Thread {
-	private PSXLinda psxget;
-	private FederatedLinda fdlget;
-	private int port;
-	String host = "127.0.0.1";
-	private ByteBuffer data = ByteBuffer.allocate(1024);
-	
-	public TestGet(int port1) {
-		this.port = port1;
-	}
-	
-	public void run(){
-		int id = 10;
-		int i;
-		fdlget = FederatedLinda.init();
-		try {
-			System.out.println("TestGet Start");
-			psxget = fdlget.open(host, port);
-			System.out.println("Host1 connected");
-			//getにidのタプルを取り出す
-			PSXReply dataGet = psxget.in(id);
-			System.out.println("dataget");
-			System.out.println(dataGet.ready());
-			if(dataGet.ready()){
-				System.out.println(dataGet);
-				data = dataGet.getData();
-				fdlget.sync(1);
-				i = data.getInt();
-				System.out.println(i);
-			}
-		} catch (IOException e) {
-			try {
-				Thread.sleep(10);
-			} catch (InterruptedException e1) {
-			}
-		}
-		}
-}
--- a/src/fdl/test/transfer/cluster/TestSend.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-package fdl.test.transfer.cluster;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-
-public class TestSend {
-	static PSXLinda psxsend;
-	static FederatedLinda fdlsend;
-	private static int port = 10000;
-
-	public static void main(String[] args){
-		int id = 10;
-		int i;
-		String host = "cls001.cs.ie.u-ryukyu.ac.jp";
-		ByteBuffer send = ByteBuffer.allocate(1024);
-		send.putInt(12);
-		send.flip();
-		i = send.getInt();
-		send.rewind();
-		fdlsend = FederatedLinda.init();
-		boolean connect = true;
-		while(connect) {
-		try{
-			System.out.println("TestSend Start");
-			psxsend = fdlsend.open(host,port);
-			System.out.println("Set Data = " +i);
-			System.out.println("Connect Host1");
-			psxsend.out(id, send);
-			System.out.println("regist Que");
-			fdlsend.sync();
-			System.out.println("Send Data");
-			connect = false;
-		}catch (IOException e) {
-			try {
-				Thread.sleep(40);
-			} catch (InterruptedException e1) {
-			}
-		}
-		}
-	}
-
-	
-}
--- a/src/fdl/test/transfer/three/ProtocolEngine.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-package fdl.test.transfer.three;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-
-public class ProtocolEngine extends Thread{
-	private PSXLinda psx;
-	private String name;
-	FederatedLinda fdl1;
-	String host = "127.0.0.1";
-	int port1;
-	int port2;
-	private int id = 10;
-	private PSXLinda psx1;
-	private boolean running = true;
-	private ByteBuffer data2 = ByteBuffer.allocate(10);
-	private int count = 1;
-
-	public ProtocolEngine(String string, int port1, int port2) {
-		this.name = string;
-		this.port1 = port1;
-		this.port2 = port2;
-	}
-
-	public void run(){
-		fdl1 = FederatedLinda.init();
-		boolean connect = true;
-		while(connect){
-		try {
-			initConnect();
-			transfer();
-			connect = false;
-		} catch (IOException e) {
-			try {
-				Thread.sleep(40);
-			} catch (InterruptedException e1) {
-			}
-		}
-		}
-	}
-
-	private void initConnect() throws IOException {
-		System.out.println(name);
-		psx = fdl1.open(host,port1);
-		System.out.println("Connect "+port1);
-		psx1 = fdl1.open(host,port2);
-		System.out.println("Connect "+port2);
-	}
-
-	private void transfer() throws IOException {
-		PSXReply in = psx.in(id);
-		System.out.println("PSXReply "+port1 +": "+port2 +": ");
-		while (running) {
-			if(in.ready()){
-				data2 = in.getData();
-				int i = data2.getInt();
-				data2.rewind();
-				//outしたbytebufferの変更をこれ以降やっちゃいけない
-				psx1.out(id,data2);
-				
-				System.out.println("IntData0 "+port1 +": "+port2 +": " +i);
-				fdl1.sync(1);
-				if (count++>3) {
-					running = false;
-					break;
-				}
-				System.out.println("IntData1 "+port1 +": "+port2 +": " +i);
-			}
-			fdl1.sync();
-		}
-		assertEquals(4,count);
-	}
-	
-
-}
--- a/src/fdl/test/transfer/three/Server.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-package fdl.test.transfer.three;
-
-import fdl.FDLindaServ;
-
-public class Server extends Thread {
-	int port;
-	private String name;
-
-	public Server(String string, int i) {
-		port = i;
-		name = string;
-	}
-
-	public void run(){
-		String[] args = {"-p",Integer.toString(port)};
-		System.out.println(name+"start");
-		FDLindaServ.main(args);
-	}
-
-}
\ No newline at end of file
--- a/src/fdl/test/transfer/three/TestGet.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-package fdl.test.transfer.three;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-
-public class TestGet extends Thread {
-	PSXLinda psxget;
-	FederatedLinda fdlget;
-	private int port;
-	String host = "127.0.0.1";
-	private ByteBuffer data = ByteBuffer.allocate(10);
-	
-	public TestGet(int port1) {
-		this.port = port1;
-	}
-	
-	public void run(){
-		int id = 10;
-		int i;
-		fdlget = FederatedLinda.init();
-		boolean connecttest = true;
-		while(connecttest){
-		try {
-			getData(id);
-			i = data.getInt();
-			System.out.println(i);
-			connecttest = false;
-		} catch (IOException e) {
-				e.printStackTrace();
-				connecttest = true;
-		}
-		}
-	}
-
-	private void getData(int id) throws IOException {
-		psxget = fdlget.open(host, port);
-		PSXReply get = psxget.in(id);
-		boolean running = false;
-		while(running){
-			if(get.ready()){
-				data = get.getData();
-				running = false;
-				fdlget.sync(0);
-				break;
-			}
-		fdlget.sync();
-		}
-	}
-	
-}
--- a/src/fdl/test/transfer/three/TestSend.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-package fdl.test.transfer.three;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-
-public class TestSend extends Thread {
-	PSXLinda psxsend;
-	FederatedLinda fdlsend;
-	private int port;
-	
-	public TestSend(int port1) {
-		this.port = port1;
-	}
-
-	public void run(){
-		int id = 10;
-		int i;
-		String host = "127.0.0.1";
-		ByteBuffer send = ByteBuffer.allocate(1024);
-		send.putInt(12);
-		send.flip();
-		i = send.getInt();
-		send.rewind();
-		fdlsend = FederatedLinda.init();
-		boolean connect = true;
-		while(connect) {
-		try{
-			psxsend = fdlsend.open(host,port);
-			System.out.println("Set Data = " +i);
-			System.out.println("Connect Host1");
-			psxsend.out(id, send);
-			System.out.println("regist Que");
-			fdlsend.sync(1);
-			System.out.println("Send Data");
-			connect = false;
-		}catch (IOException e) {
-			try {
-				Thread.sleep(20);
-			} catch (InterruptedException e1) {
-			}
-		}
-		}
-	}
-	
-}
--- a/src/fdl/test/transfer/three/TestTransfer.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-package fdl.test.transfer.three;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-
-public class TestTransfer {
-	Server[] servers;
-	ProtocolEngine[] engines;
-	final int serverCount = 3;
-	final int startPort = 10011;
-	@Test
-	public void testTransfer() {
-		int port = startPort;
-		servers = new Server[serverCount];
-		engines = new ProtocolEngine[serverCount];
-		
-		for (int i = 0; i < serverCount; i++) {
-			servers[i] = new Server("Server"+(i+1),port+i);
-			servers[i].start();
-		}
-		
-		TestSend send = new TestSend(startPort);
-		send.start();
-		try{
-			send.join();
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-		
-		for (int i = 0; i < serverCount; i++) {
-			engines[i] = new ProtocolEngine("ProtocolEngine "+(i+1) +":port " +(port+i) +":port "+(netporot(port+i)),port+i,netporot(port+i));
-			engines[i].start();
-		}
-		try {
-			for (ProtocolEngine e: engines){
-				e.join();
-			}
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-		assertEquals(1,1);
-	}
-	private int netporot(int i) {
-		i++;
-		if(i >= startPort+serverCount) {
-			return startPort;
-		}
-		return i;
-	}
-}
--- a/src/fdl/test/transfer/two/ProtocolEngine.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-package fdl.test.transfer.two;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-
-public class ProtocolEngine extends Thread{
-	private static PSXLinda psx;
-	private static String name;
-	static FederatedLinda fdl1;
-	static String host = "127.0.0.1";
-	static int port1 = 10001;
-	static int port2 = 10002;
-	private static int id = 10;
-	private static PSXLinda psx1;
-	private static boolean running;
-	private static ByteBuffer data2 = ByteBuffer.allocate(10);
-
-	public static void main(String[] args){
-		fdl1 = FederatedLinda.init();
-		try {
-			System.out.println(name);
-			psx = fdl1.open(host,port1);
-			System.out.println("Connect Host1");
-			psx1 = fdl1.open(host,port2);
-			System.out.println("Connect Host2");
-			// Host1にデータを送信する。
-			testSend(psx);
-			// psxにデータを用意
-			transfer(psx,psx1);
-			
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-	
-	private static void testSend(PSXLinda psx2) throws IOException {
-		ByteBuffer send = ByteBuffer.allocate(10);
-		send.putInt(12);
-		send.flip();
-		psx2.out(id, send);
-		psx2.sync();
-	}
-	
-
-	private static void transfer(PSXLinda psx2, PSXLinda psx12) throws IOException {
-		PSXReply in = psx2.in(id);
-		while (running) {
-			if(in.ready()){
-				//psx1にデータを書き出し
-				data2 = in.getData();
-				psx12.out(id,data2);
-				//runningフラグをfalseする
-				running = false;
-				fdl1.sync(0);
-				break;
-			}
-			fdl1.sync();
-		}
-		
-	}
-
-}
--- a/src/fdl/test/transfer/two/Server.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-package fdl.test.transfer.two;
-
-import fdl.FDLindaServ;
-
-public class Server extends Thread {
-	int port;
-	private String name;
-
-	public Server(String string, int i) {
-		port = i;
-		name = string;
-	}
-
-	public void run(){
-		String[] args = {"-p",Integer.toString(port)};
-		System.out.println(name);
-		FDLindaServ.main(args);
-	}
-
-}
\ No newline at end of file
--- a/src/fdl/test/transfer/two/TestGet.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-package fdl.test.transfer.two;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-
-public class TestGet extends Thread {
-	private static PSXLinda psxget;
-	private static FederatedLinda fdlget;
-	private static int port = 10001;
-	static String host = "127.0.0.1";
-	private static ByteBuffer data = ByteBuffer.allocate(1024);
-	
-	public static void main(String[] args){
-		int id = 10;
-		int i;
-		fdlget = FederatedLinda.init();
-		try {
-			System.out.println("TestGet Start");
-			psxget = fdlget.open(host, port);
-			System.out.println("Host1 connected");
-			//getにidのタプルを取り出す
-			PSXReply dataGet = psxget.in(id);
-			System.out.println("dataget");
-			System.out.println(dataGet.ready());
-			if(dataGet.ready()){
-				System.out.println(dataGet);
-				data = dataGet.getData();
-				fdlget.sync(1);
-				i = data.getInt();
-				System.out.println(i);
-			}
-		} catch (IOException e) {
-			try {
-				Thread.sleep(10);
-			} catch (InterruptedException e1) {
-			}
-		}
-		}
-}
--- a/src/fdl/test/transfer/two/TestSend.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-package fdl.test.transfer.two;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-
-public class TestSend extends Thread {
-	PSXLinda psxsend;
-	FederatedLinda fdlsend;
-	private int port;
-	
-	public TestSend(int port1) {
-		this.port = port1;
-	}
-
-	public void run(){
-		int id = 10;
-		int i;
-		String host = "127.0.0.1";
-		ByteBuffer send = ByteBuffer.allocate(1024);
-		send.putInt(12);
-		send.flip();
-		i = send.getInt();
-		send.rewind();
-		fdlsend = FederatedLinda.init();
-		boolean connect = true;
-		while(connect) {
-		try{
-			System.out.println("TestSend Start");
-			psxsend = fdlsend.open(host,port);
-			System.out.println("Set Data = " +i);
-			System.out.println("Connect Host1");
-			psxsend.out(id, send);
-			System.out.println("regist Que");
-			fdlsend.sync(1);
-			System.out.println("Send Data");
-			connect = false;
-		}catch (IOException e) {
-			try {
-				Thread.sleep(40);
-			} catch (InterruptedException e1) {
-			}
-		}
-		}
-	}
-
-	
-}
--- a/src/fdl/test/transfer/two/TestTransfer.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-package fdl.test.transfer.two;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class TestTransfer {
-	@Test
-	public void testTransfer() throws InterruptedException {
-		int port = 10001;
-		Server server = new Server("Server1",port);
-		server.start();
-		server.join();
-		TestSend send = new TestSend(port);
-		send.start();
-
-		send.join();
-
-		assertEquals(1,1);
-	}
-}
--- a/src/fdl/test2/CountTest.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-package fdl.test2;
-
-class CountA implements Runnable {
-
-	public void run() {
-		for (int i=0; i <= 5; i++) {
-			System.out.println("A: " + i);
-		}
-	}
-}
-
-class CountB implements Runnable {
-
-	public void run() {
-		for (int i=5; i >= 0; i--) {
-			System.out.println("	B: " + i);
-		}
-	}
-}
-
-class CountTest {
-	public static void main(String[] args) {
-		// ランナブルクラスのインスタンス化
-		CountA runA = new CountA();
-		CountB runB = new CountB();
-		System.out.println("Runnable Class のインスタンス化終了");
-
-		// スレッドのインスタンス化
-		Thread threadA = new Thread(runA);
-		Thread threadB = new Thread(runB);
-		System.out.println("Thread へ受け渡し終了");
-
-		// スレッドの開始
-		threadA.start();
-		threadB.start();
-		System.out.println("Thread の start() 終了");
-		System.out.println("適時自動的に run() が実行される");
-
-
-	}
-}
-
--- a/src/fdl/test2/Server.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-package fdl.test2;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.Date;
-
-public class Server extends Thread{
-	static int Port = 10007;
-    
-	public void run(){
-		try {
-		ServerSocket server = new ServerSocket(Port);
-		Socket sock =null;
-		System.out.println("Server Start");
-		sock = server.accept();
-		System.out.println("Connect");
-		PrintWriter ps = new PrintWriter(sock.getOutputStream());
-		Date d = new Date();
-		ps.print(d + "\r\n");
-		ps.flush();
-		sock.close(); // クライアントからの接続を切断
-	    System.out.println("Connection Closed");
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-	} 
-
-    public static void main(String[] args) {
-    	Server sv = new Server();
-    	sv.start();
-    }
-}
\ No newline at end of file
--- a/src/fdl/test2/TestRead.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-package fdl.test2;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-public class TestRead {
-
-	    public static void main(String[] args) {
-	        try {
-	        	File inputFile = new File(args[0]);
-	        	FileReader in = new FileReader(inputFile);
-	            BufferedReader br = new BufferedReader(in);
-	            String line;
-	            while ((line = br.readLine()) != null) {
-	                System.out.println(line);
-	            }
-	            br.close();
-	            in.close();
-	        } catch (IOException e) {
-	            System.out.println(e);
-	        }
-	    }
-
-}
--- a/src/fdl/test2/TestRing.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-package fdl.test2;
-
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import fdl.FederatedLinda;
-import fdl.PSXLinda;
-import fdl.PSXReply;
-
-public class TestRing {
-	static int id;
-	public static void main(String args[]){
-		
-		try{
-		FederatedLinda fdl;
-		PSXLinda psx;
-		String host = "127.0.0.1";
-		PSXReply r;
-
-		FileReader in = new FileReader("nodelist");
-		BufferedReader br = new BufferedReader(in);
-		String line;
-		
-		while ((line = br.readLine()) != null) {
-		int i1 = Integer.parseInt(line);
-		fdl = FederatedLinda.init();
-		psx = fdl.open(host,i1);
-		r = psx.in(65535);
-		fdl.sync(1);
-		
-		ByteBuffer data = ByteBuffer.allocate(10);
-		data.putInt(10);
-		data.flip();
-
-		psx.out(1,data);
-		while(!r.ready()){
-		psx.sync();
-		}
-		}
-        br.close();
-        in.close();
-
-
-		}catch (IOException e) {
-			System.err.println("Communication failure.");
-		}
-	
-	}
-}
--- a/src/fdl/test2/client.java	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-package fdl.test2;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.Socket;
-
-public class client {
-	public static void main(String arg[]) throws IOException{
-		String www = arg[0];
-		int port = 10007;
-		Socket sock;
-		BufferedReader dis;
-//		PrintWriter ps;
-		sock = new Socket(www,port);
-		dis = new BufferedReader(new InputStreamReader(sock.getInputStream()));
-//		ps = new PrintWriter(sock.getOutputStream(),true);
-//		ps.println("Get"+arg[1]);
-//		String s = null;
-//		while((s = dis.readLine()) != null){
-			System.out.println(dis);
-//		}
-		sock.close();
-	}
-
-}
--- a/src/fdl/test2/nodelist	Wed Feb 08 18:02:00 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-10000
-10001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/StartFDLindaServ2.py	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,29 @@
+#! /usr/bin/env python
+"""start process
+"""
+import pexpect
+import re
+import time
+import sys
+import os
+
+def main(base_port, ldserv_num):
+
+    if not os.environ.has_key('LDSERV'):
+        ldserv = "java -classpath FedLinda.jar fdl.FDLindaServ"
+    else:
+        ldserv = os.environ['LDSERV']
+
+    for num in range(0,ldserv_num):
+        cmd = "".join([ldserv + ' -p ' + str(base_port+num) + ' &'])
+        os.system(cmd)
+        print 'start :', cmd
+
+
+if __name__ == "__main__":
+
+    if (len(sys.argv) != 3):
+        print 'Usage : %s <base_port> <ldserv_number>' % sys.argv[0]
+        sys.exit(1)
+
+    main(int(sys.argv[1]), int(sys.argv[2]))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/StopProcess.py	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,46 @@
+#! /usr/bin/env python
+"""find and kill processes
+"""
+import pexpect
+import re
+import sys
+import os
+
+def main(proc):
+    child = pexpect.spawn('ps aucxwww')
+    child.setwinsize(100,300)
+    child.expect(pexpect.EOF)
+
+    pslist =  child.before.splitlines()
+    # separate string by space
+    fmt = re.split(' +', pslist[0])
+
+    if fmt[-1] == '':
+        fmt.pop()
+    if fmt[0] == '':
+        fmt.pop(0)
+    lenfmt = len(fmt)
+
+    # indexing, key is format of output of ps command, value is number of list
+    index = dict([(k,v) for (k,v) in zip(fmt, range(0,lenfmt))])
+
+    # find ".*<processname>.*" in 'COMMAND' part
+    pars = re.compile(".*"+proc+".*")
+    
+    for l in pslist[1:]:
+        elm = re.split(' +',l ,lenfmt)
+        cmd = elm[index['COMMAND']]
+        result = pars.match(cmd)
+
+        if (result is not None):
+            os.system('kill -KILL ' + elm[index['PID']])
+            print 'stop', elm[index['PID']], ':', cmd
+
+
+if __name__== "__main__":
+    if (len(sys.argv) != 2):
+        print "Usage : %s <process_name>" % sys.argv[0]
+        sys.exit(1)
+
+    main(sys.argv[1])
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/pexpect.py	Wed Feb 08 18:02:40 2012 +0900
@@ -0,0 +1,1203 @@
+"""Pexpect is a Python module for spawning child applications;
+controlling them; and responding to expected patterns in their output.
+Pexpect can be used for automating interactive applications such as
+ssh, ftp, passwd, telnet, etc. It can be used to a automate setup scripts
+for duplicating software package installations on different servers.
+It can be used for automated software testing. Pexpect is in the spirit of
+Don Libes' Expect, but Pexpect is pure Python. Other Expect-like
+modules for Python require TCL and Expect or require C extensions to
+be compiled. Pexpect does not use C, Expect, or TCL extensions. It
+should work on any platform that supports the standard Python pty
+module. The Pexpect interface focuses on ease of use so that simple
+tasks are easy.
+
+There are two main interfaces to Pexpect. You can call the function:
+        pexpect.run()
+to execute a command and return the output.
+Do no use this on interactive commands that expect input.
+This is a handy replacment for os.system().
+The more useful interface is the class:
+        pexpect.spawn()
+This creates a spawn instance. This will start the command that you specify.
+You can then interact with the child command through the spawn instance.
+Most commands, including ssh, cannot tell that they are being run inside
+of a script. This works even for commands that ask for passwords or
+other input outside of the normal stdio streams.
+
+Pexpect is Open Source, Free, and all that good stuff.
+License: Python Software Foundation License
+         http://www.opensource.org/licenses/PythonSoftFoundation.html
+
+Noah Spurrier
+Richard Holden
+Marco Molteni
+Kimberley Burchett 
+Robert Stone
+Mike Snitzer
+Marti Raudsepp
+Matt <matt (*) corvil.com>
+Hartmut Goebel
+Chad Schroeder
+Erick Tryzelaar
+Dave Kirby
+Ids vander Molen
+George Todd
+Noel Taylor
+Nicolas D. Cesar
+(Let me know if I forgot anyone.)
+
+$Revision: 1.1.1.1 $
+$Date: 2006/04/01 06:03:29 $
+"""
+
+try:
+    import os, sys, time
+    import select
+    import string
+    import re
+    import struct
+    import resource
+    import types
+    import pty
+    import tty
+    import termios
+    import fcntl
+    import errno
+    import traceback
+    import signal
+except ImportError, e:
+    raise ImportError (str(e) + """
+A critical module was not found. Probably this operating system does not support it.
+Pexpect is intended for UNIX-like operating systems.""")
+
+__version__ = '2.0'
+__revision__ = '$Revision: 1.1.1.1 $'
+__all__ = ['ExceptionPexpect', 'EOF', 'TIMEOUT', 'spawn', 'run', 'which', 'split_command_line',
+    '__version__', '__revision__']
+
+# Exception classes used by this module.
+class ExceptionPexpect(Exception):
+    """Base class for all exceptions raised by this module.
+    """
+    def __init__(self, value):
+        self.value = value
+    def __str__(self):
+        return str(self.value)
+    def get_trace(self):
+        """This returns an abbreviated stack trace with lines that only concern the caller.
+        In other words, the stack trace inside the Pexpect module is not included.
+        """
+        tblist = traceback.extract_tb(sys.exc_info()[2])
+        tblist = filter(self.__filter_not_pexpect, tblist)
+        tblist = traceback.format_list(tblist)
+        return ''.join(tblist)
+    def __filter_not_pexpect(self, trace_list_item):
+        if trace_list_item[0].find('pexpect.py') == -1:
+            return 1
+        else:
+            return 0
+class EOF(ExceptionPexpect):
+    """Raised when EOF is read from a child.
+    """
+class TIMEOUT(ExceptionPexpect):
+    """Raised when a read time exceeds the timeout.
+    """
+##class TIMEOUT_PATTERN(TIMEOUT):
+##    """Raised when the pattern match time exceeds the timeout.
+##    This is different than a read TIMEOUT because the child process may
+##    give output, thus never give a TIMEOUT, but the output
+##    may never match a pattern.
+##    """
+##class MAXBUFFER(ExceptionPexpect):
+##    """Raised when a scan buffer fills before matching an expected pattern."""
+
+def run (command, timeout=-1, withexitstatus=0, events=None, extra_args=None):
+    """This function runs the given command; waits for it to finish;
+    then returns all output as a string. STDERR is included in output.
+    If the full path to the command is not given then the path is searched.
+
+    Note that lines are terminated by CR/LF (\\r\\n) combination
+    even on UNIX-like systems because this is the standard for pseudo ttys.
+    If you set withexitstatus to true, then run will return a tuple of
+    (command_output, exitstatus). If withexitstatus is false then this
+    returns just command_output.
+
+    Examples:
+    Start the apache daemon on the local machine:
+        from pexpect import *
+        run ("/usr/local/apache/bin/apachectl start")
+    Check in a file using SVN:
+        from pexpect import *
+        run ("svn ci -m 'automatic commit' my_file.py")
+    Run a command and capture exit status:
+        from pexpect import *
+        (command_output, exitstatus) = run ('ls -l /bin', withexitstatus=1)
+
+    Tricky Examples:   
+    The following will run SSH and execute 'ls -l' on the remote machine.
+    The password 'secret' will be sent if the '(?i)password' pattern is ever seen.
+        run ("ssh username@machine.example.com 'ls -l'", events={'(?i)password':'secret\n'})
+
+    This will start mencoder to rip a video from DVD. This will also display
+    progress ticks every 5 seconds as it runs.
+        from pexpect import *
+        def print_ticks(d):
+            print d['event_count'],
+        run ("mencoder dvd://1 -o video.avi -oac copy -ovc copy", events={TIMEOUT:print_ticks}, timeout=5)
+
+    The 'events' argument should be a dictionary of patterns and responses.
+    Whenever one of the patterns is seen in the command out
+    run() will send the associated response string. Note that you should
+    put newlines in your string if Enter is necessary.
+    The responses may also contain callback functions.
+    Any callback is function that takes a dictionary as an argument.
+    The dictionary contains all the locals from the run() function, so
+    you can access the child spawn object or any other variable defined
+    in run() (event_count, child, and extra_args are the most useful).
+    A callback may return True to stop the current run process otherwise
+    run() continues until the next event.
+    A callback may also return a string which will be sent to the child.
+    'extra_args' is not used by directly run(). It provides a way to pass data to
+    a callback function through run() through the locals dictionary passed to a callback.
+    """
+    if timeout == -1:
+        child = spawn(command, maxread=2000)
+    else:
+        child = spawn(command, timeout=timeout, maxread=2000)
+    if events is not None:
+        patterns = events.keys()
+        responses = events.values()
+    else:
+        patterns=None # We assume that EOF or TIMEOUT will save us.
+        responses=None
+    child_result_list = []
+    event_count = 0
+    while 1:
+        try:
+            index = child.expect (patterns)
+            if type(child.after) is types.StringType:
+                child_result_list.append(child.before + child.after)
+            else: # child.after may have been a TIMEOUT or EOF, so don't cat those.
+                child_result_list.append(child.before)
+            if type(responses[index]) is types.StringType:
+                child.send(responses[index])
+            elif type(responses[index]) is types.FunctionType:
+                callback_result = responses[index](locals())
+                sys.stdout.flush()
+                if type(callback_result) is types.StringType:
+                    child.send(callback_result)
+                elif callback_result:
+                    break
+            else:
+                raise TypeError ('The callback must be a string or function type.')
+            event_count = event_count + 1
+        except TIMEOUT, e:
+            child_result_list.append(child.before)
+            break
+        except EOF, e:
+            child_result_list.append(child.before)
+            break
+    child_result = ''.join(child_result_list)
+    if withexitstatus:
+        child.close()
+        return (child_result, child.exitstatus)
+    else:
+        return child_result
+
+class spawn:
+    """This is the main class interface for Pexpect.
+    Use this class to start and control child applications.
+    """
+
+    def __init__(self, command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None):
+        """This is the constructor. The command parameter may be a string
+        that includes a command and any arguments to the command. For example:
+            p = pexpect.spawn ('/usr/bin/ftp')
+            p = pexpect.spawn ('/usr/bin/ssh user@example.com')
+            p = pexpect.spawn ('ls -latr /tmp')
+        You may also construct it with a list of arguments like so:
+            p = pexpect.spawn ('/usr/bin/ftp', [])
+            p = pexpect.spawn ('/usr/bin/ssh', ['user@example.com'])
+            p = pexpect.spawn ('ls', ['-latr', '/tmp'])
+        After this the child application will be created and
+        will be ready to talk to. For normal use, see expect() and 
+        send() and sendline().
+
+        The maxread attribute sets the read buffer size.
+        This is maximum number of bytes that Pexpect will try to read from a TTY at one time.
+        The default buffer size is 1 (unbuffered). Setting this value higher
+        will help performance in cases where large amounts of output are read back from the child.
+        This feature is useful in conjunction with searchwindowsize.
+        
+        The searchwindowsize attribute sets the how far back in
+        the incomming seach buffer Pexpect will search for pattern matches.
+        Every time Pexpect reads some data from the child it will append the data to
+        the incomming buffer. The default is to search from the beginning of the
+        imcomming buffer each time new data is read from the child.
+        But this is very inefficient if you are running a command that
+        generates a large amount of data where you want to match
+        The searchwindowsize does not effect the size of the incomming data buffer.
+        You will still have access to the full buffer after expect() returns.
+        
+        The logfile member turns on or off logging.
+        All input and output will be copied to the given file object.
+        Set logfile to None to stop logging. This is the default.
+        Set logfile to sys.stdout to echo everything to standard output.
+        The logfile is flushed after each write.
+        Example 1:
+            child = pexpect.spawn('some_command')
+            fout = file('mylog.txt','w')
+            child.logfile = fout
+        Example 2:
+            child = pexpect.spawn('some_command')
+            child.logfile = sys.stdout
+            
+        The delaybeforesend helps overcome weird behavior that many users were experiencing.
+        The typical problem was that a user would expect() a "Password:" prompt and
+        then immediately call sendline() to send the password. The user would then
+        see that their password was echoed back to them. Of course, passwords don't
+        normally echo. The problem is caused by the fact that most applications
+        print out the "Password" prompt and then turn off stdin echo, but if you
+        send your password before the application turned off echo, then you get
+        your password echoed. Normally this wouldn't be a problem when interacting
+        with a human at a real heyboard. If you introduce a slight delay just before 
+        writing then this seems to clear up the problem. This was such a common problem 
+        for many users that I decided that the default pexpect behavior
+        should be to sleep just before writing to the child application.
+        1/10th of a second (100 ms) seems to be enough to clear up the problem.
+        You can set delaybeforesend to 0 to return to the old behavior.
+        
+        Note that spawn is clever about finding commands on your path.
+        It uses the same logic that "which" uses to find executables.
+
+        If you wish to get the exit status of the child you must call
+        the close() method. The exit or signal status of the child will be
+        stored in self.exitstatus or self.signalstatus.
+        If the child exited normally then exitstatus will store the exit return code and
+        signalstatus will be None.
+        If the child was terminated abnormally with a signal then signalstatus will store
+        the signal value and exitstatus will be None.
+        If you need more detail you can also read the self.status member which stores
+        the status returned by os.waitpid. You can interpret this using
+        os.WIFEXITED/os.WEXITSTATUS or os.WIFSIGNALED/os.TERMSIG.
+        """
+        self.STDIN_FILENO = pty.STDIN_FILENO
+        self.STDOUT_FILENO = pty.STDOUT_FILENO
+        self.STDERR_FILENO = pty.STDERR_FILENO
+        self.stdin = sys.stdin
+        self.stdout = sys.stdout
+        self.stderr = sys.stderr
+
+        self.patterns = None
+        self.before = None
+        self.after = None
+        self.match = None
+        self.match_index = None
+        self.terminated = 1
+        self.exitstatus = None
+        self.signalstatus = None
+        self.status = None
+        self.flag_eof = 0
+        self.pid = None
+        self.child_fd = -1 # initially closed
+        self.timeout = timeout
+        self.delimiter = EOF
+        self.logfile = logfile    
+        self.maxread = maxread # Max bytes to read at one time into buffer.
+        self.buffer = '' # This is the read buffer. See maxread.
+        self.searchwindowsize = searchwindowsize # Anything before searchwindowsize point is preserved, but not searched.
+        self.delaybeforesend = 0.1 # Sets sleep time used just before sending data to child.
+        self.softspace = 0 # File-like object.
+        self.name = '<' + repr(self) + '>' # File-like object.
+        self.encoding = None # File-like object.
+        self.closed = 1 # File-like object.
+        
+        if type (args) != type([]):
+            raise TypeError ('The second argument, args, must be a list.')
+
+        if args == []:
+            self.args = split_command_line(command)
+            self.command = self.args[0]
+        else:
+            self.args = args[:] # work with a copy
+            self.args.insert (0, command)
+            self.command = command
+
+        command_with_path = which(self.command)
+        if command_with_path == None:
+            raise ExceptionPexpect ('The command was not found or was not executable: %s.' % self.command)
+        self.command = command_with_path
+        self.args[0] = self.command
+
+        self.name = '<' + ' '.join (self.args) + '>'
+        self.__spawn()
+
+    def __del__(self):
+        """This makes sure that no system resources are left open.
+        Python only garbage collects Python objects. OS file descriptors
+        are not Python objects, so they must be handled explicitly.
+        If the child file descriptor was opened outside of this class
+        (passed to the constructor) then this does not close it.
+        """
+        if self.closed:
+            return
+        self.close()
+
+    def __str__(self):
+        """This returns the current state of the pexpect object as a string.
+        """
+        s = []
+        s.append(repr(self))
+        s.append('version: ' + __version__ + ' (' + __revision__ + ')')
+        s.append('command: ' + str(self.command))
+        s.append('args: ' + str(self.args))
+        if self.patterns is None:
+            s.append('patterns: None')
+        else:
+            s.append('patterns:')
+            for p in self.patterns:
+                if type(p) is type(re.compile('')):
+                    s.append('    ' + str(p.pattern))
+                else:
+                    s.append('    ' + str(p))
+        s.append('buffer (last 100 chars): ' + str(self.buffer)[-100:])
+        s.append('before (last 100 chars): ' + str(self.before)[-100:])
+        s.append('after: ' + str(self.after))
+        s.append('match: ' + str(self.match))
+        s.append('match_index: ' + str(self.match_index))
+        s.append('exitstatus: ' + str(self.exitstatus))
+        s.append('flag_eof: ' + str(self.flag_eof))
+        s.append('pid: ' + str(self.pid))
+        s.append('child_fd: ' + str(self.child_fd))
+        s.append('timeout: ' + str(self.timeout))
+        s.append('delimiter: ' + str(self.delimiter))
+        s.append('logfile: ' + str(self.logfile))
+        s.append('maxread: ' + str(self.maxread))
+        s.append('searchwindowsize: ' + str(self.searchwindowsize))
+        s.append('delaybeforesend: ' + str(self.delaybeforesend))
+        return '\n'.join(s)
+
+    def __spawn(self):
+        """This starts the given command in a child process.
+        This does all the fork/exec type of stuff for a pty.
+        This is called by __init__. 
+        """
+        # The pid and child_fd of this object get set by this method.
+        # Note that it is difficult for this method to fail.
+        # You cannot detect if the child process cannot start.
+        # So the only way you can tell if the child process started
+        # or not is to try to read from the file descriptor. If you get
+        # EOF immediately then it means that the child is already dead.
+        # That may not necessarily be bad because you may haved spawned a child
+        # that performs some task; creates no stdout output; and then dies.
+
+        assert self.pid == None, 'The pid member should be None.'
+        assert self.command != None, 'The command member should not be None.'
+
+        try:
+            self.pid, self.child_fd = pty.fork()
+        except OSError, e:
+            raise ExceptionPexpect('Pexpect: pty.fork() failed: ' + str(e))
+
+        if self.pid == 0: # Child
+            try: # Some platforms do not like setwinsize (Cygwin).
+                self.child_fd = sys.stdout.fileno() # used by setwinsize()
+                self.setwinsize(24, 80)
+            except:
+                pass
+            # Do not allow child to inherit open file descriptors from parent.
+            max_fd = resource.getrlimit(resource.RLIMIT_NOFILE)[0]
+            for i in range (3, max_fd):
+                try:
+                    os.close (i)
+                except OSError:
+                    pass
+
+            # I don't know why this works, but ignoring SIGHUP fixes a
+            # problem when trying to start a Java daemon with sudo
+            # (specifically, Tomcat).
+            signal.signal(signal.SIGHUP, signal.SIG_IGN)
+
+            os.execv(self.command, self.args)
+
+        # Parent
+        self.terminated = 0
+        self.closed = 0
+
+    def fileno (self):   # File-like object.
+        """This returns the file descriptor of the pty for the child.
+        """
+        return self.child_fd
+
+    def close (self, force=0):   # File-like object.
+        """This closes the connection with the child application.
+        Note that calling close() more than once is valid.
+        This emulates standard Python behavior with files.
+        Set force to 1 if you want to make sure that the child is terminated
+        (SIGKILL is sent if the child ignores SIGHUP and SIGINT).
+        """
+        if self.child_fd != -1:
+            self.flush()
+            os.close (self.child_fd)
+            self.child_fd = -1
+            self.closed = 1
+            time.sleep(0.1) # Give kernel time to update process status.
+            if self.isalive():
+                if not self.terminate(force):
+                    raise ExceptionPexpect ('close() could not terminate the child using terminate()')
+
+    def flush (self):   # File-like object.
+        """This does nothing. It is here to support the interface for a File-like object.
+        """
+        pass
+
+    def isatty (self):   # File-like object.
+        """This returns 1 if the file descriptor is open and connected to a tty(-like) device, else 0.
+        """
+        return os.isatty(self.child_fd)
+
+    def setecho (self, on):
+        """This sets the terminal echo mode on or off.
+        Note that anything the child sent before the echo will be lost, so
+        you should be sure that your input buffer is empty before you setecho.
+        For example, the following will work as expected.
+            p = pexpect.spawn('cat')
+            p.sendline ('1234') # We will see this twice (once from tty echo and again from cat).
+            p.expect (['1234'])
+            p.expect (['1234'])
+            p.setecho(0) # Turn off tty echo
+            p.sendline ('abcd') # We will set this only once (echoed by cat).
+            p.sendline ('wxyz') # We will set this only once (echoed by cat)
+            p.expect (['abcd'])
+            p.expect (['wxyz'])
+        The following WILL NOT WORK because the lines sent before the setecho
+        will be lost:
+            p = pexpect.spawn('cat')
+            p.sendline ('1234') # We will see this twice (once from tty echo and again from cat).
+            p.setecho(0) # Turn off tty echo
+            p.sendline ('abcd') # We will set this only once (echoed by cat).
+            p.sendline ('wxyz') # We will set this only once (echoed by cat)
+            p.expect (['1234'])
+            p.expect (['1234'])
+            p.expect (['abcd'])
+            p.expect (['wxyz'])
+        """
+        self.child_fd
+        new = termios.tcgetattr(self.child_fd)
+        if on:
+            new[3] = new[3] | termios.ECHO
+        else:
+            new[3] = new[3] & ~termios.ECHO
+        # I tried TCSADRAIN and TCSAFLUSH, but these were inconsistent
+        # and blocked on some platforms. TCSADRAIN is probably ideal if it worked.
+        termios.tcsetattr(self.child_fd, termios.TCSANOW, new)
+
+    def read_nonblocking (self, size = 1, timeout = -1):
+        """This reads at most size characters from the child application.
+        It includes a timeout. If the read does not complete within the
+        timeout period then a TIMEOUT exception is raised.
+        If the end of file is read then an EOF exception will be raised.
+        If a log file was set using setlog() then all data will
+        also be written to the log file.
+
+        If timeout==None then the read may block indefinitely.
+        If timeout==-1 then the self.timeout value is used.
+        If timeout==0 then the child is polled and 
+            if there was no data immediately ready then this will raise a TIMEOUT exception.
+        
+        The "timeout" refers only to the amount of time to read at least one character.
+        This is not effected by the 'size' parameter, so if you call
+        read_nonblocking(size=100, timeout=30) and only one character is
+        available right away then one character will be returned immediately. 
+        It will not wait for 30 seconds for another 99 characters to come in.
+        
+        This is a wrapper around os.read().
+        It uses select.select() to implement a timeout. 
+        """
+        if self.child_fd == -1:
+            raise ValueError ('I/O operation on closed file in read_nonblocking().')
+
+        if timeout == -1:
+            timeout = self.timeout
+
+        # Note that some systems such as Solaris do not give an EOF when
+        # the child dies. In fact, you can still try to read
+        # from the child_fd -- it will block forever or until TIMEOUT.
+        # For this case, I test isalive() before doing any reading.
+        # If isalive() is false, then I pretend that this is the same as EOF.
+        if not self.isalive():
+            r, w, e = select.select([self.child_fd], [], [], 0) # timeout of 0 means "poll"
+            if not r:
+                self.flag_eof = 1
+                raise EOF ('End Of File (EOF) in read_nonblocking(). Braindead platform.')
+        elif sys.platform.lower().find('irix') >= 0:
+            # This is a hack for Irix. It seems that Irix requires a long delay before checking isalive.
+            # This adds a 2 second delay, but only when the child is terminated
+            r, w, e = select.select([self.child_fd], [], [], 2)
+            if not r and not self.isalive():
+                self.flag_eof = 1
+                raise EOF ('End Of File (EOF) in read_nonblocking(). Pokey platform.')
+            
+        r, w, e = select.select([self.child_fd], [], [], timeout)
+        if not r:
+            if not self.isalive():
+                # Some platforms, such as Irix, will claim that their processes are alive;
+                # then timeout on the select; and then finally admit that they are not alive.
+                self.flag_eof = 1
+                raise EOF ('End of File (EOF) in read_nonblocking(). Very pokey platform.')
+            else:
+                raise TIMEOUT ('Timeout exceeded in read_nonblocking().')
+
+        if self.child_fd in r:
+            try:
+                s = os.read(self.child_fd, size)
+            except OSError, e: # Linux does this
+                self.flag_eof = 1
+                raise EOF ('End Of File (EOF) in read_nonblocking(). Exception style platform.')
+            if s == '': # BSD style
+                self.flag_eof = 1
+                raise EOF ('End Of File (EOF) in read_nonblocking(). Empty string style platform.')
+
+            if self.logfile != None:
+                self.logfile.write (s)
+                self.logfile.flush()
+
+            return s
+
+        raise ExceptionPexpect ('Reached an unexpected state in read_nonblocking().')
+
+    def read (self, size = -1):   # File-like object.
+        """This reads at most "size" bytes from the file 
+        (less if the read hits EOF before obtaining size bytes). 
+        If the size argument is negative or omitted, 
+        read all data until EOF is reached. 
+        The bytes are returned as a string object. 
+        An empty string is returned when EOF is encountered immediately.
+        """
+        if size == 0:
+            return ''
+        if size < 0:
+            self.expect (self.delimiter) # delimiter default is EOF
+            return self.before
+
+        # I could have done this more directly by not using expect(), but
+        # I deliberately decided to couple read() to expect() so that
+        # I would catch any bugs early and ensure consistant behavior.
+        # It's a little less efficient, but there is less for me to
+        # worry about if I have to later modify read() or expect().
+        # Note, it's OK if size==-1 in the regex. That just means it
+        # will never match anything in which case we stop only on EOF.
+        cre = re.compile('.{%d}' % size, re.DOTALL) 
+        index = self.expect ([cre, self.delimiter]) # delimiter default is EOF
+        if index == 0:
+            return self.after ### self.before should be ''. Should I assert this?
+        return self.before
+        
+    def readline (self, size = -1):    # File-like object.
+        """This reads and returns one entire line. A trailing newline is kept in
+        the string, but may be absent when a file ends with an incomplete line. 
+        Note: This readline() looks for a \\r\\n pair even on UNIX because this is 
+        what the pseudo tty device returns. So contrary to what you may be used to
+        you will receive a newline as \\r\\n.
+        An empty string is returned when EOF is hit immediately.
+        Currently, the size agument is mostly ignored, so this behavior is not
+        standard for a file-like object. If size is 0 then an empty string is returned.
+        """
+        if size == 0:
+            return ''
+        index = self.expect (['\r\n', self.delimiter]) # delimiter default is EOF
+        if index == 0:
+            return self.before + '\r\n'
+        else:
+            return self.before
+
+    def __iter__ (self):    # File-like object.
+        """This is to support interators over a file-like object.
+        """
+        return self
+
+    def next (self):    # File-like object.
+        """This is to support iterators over a file-like object.
+        """
+        result = self.readline()
+        if result == "":
+            raise StopIteration
+        return result
+
+    def readlines (self, sizehint = -1):    # File-like object.
+        """This reads until EOF using readline() and returns a list containing 
+        the lines thus read. The optional "sizehint" argument is ignored.
+        """        
+        lines = []
+        while 1:
+            line = self.readline()
+            if not line:
+                break
+            lines.append(line)
+        return lines
+
+    def write(self, str):   # File-like object.
+        """This is similar to send() except that there is no return value.
+        """
+        self.send (str)
+
+    def writelines (self, sequence):   # File-like object.
+        """This calls write() for each element in the sequence.
+        The sequence can be any iterable object producing strings, 
+        typically a list of strings. This does not add line separators
+        There is no return value.
+        """
+        for str in sequence:
+            self.write (str)
+
+    def send(self, str):
+        """This sends a string to the child process.
+        This returns the number of bytes written.
+        If a log file was set then the data is also written to the log.
+        """
+        time.sleep(self.delaybeforesend)
+        if self.logfile != None:
+            self.logfile.write (str)
+            self.logfile.flush()
+        c = os.write(self.child_fd, str)
+        return c
+
+    def sendline(self, str=''):
+        """This is like send(), but it adds a line feed (os.linesep).
+        This returns the number of bytes written.
+        """
+        n = self.send(str)
+        n = n + self.send (os.linesep)
+        return n
+
+    def sendeof(self):
+        """This sends an EOF to the child.
+        This sends a character which causes the pending parent output
+        buffer to be sent to the waiting child program without
+        waiting for end-of-line. If it is the first character of the
+        line, the read() in the user program returns 0, which
+        signifies end-of-file. This means to work as expected 
+        a sendeof() has to be called at the begining of a line. 
+        This method does not send a newline. It is the responsibility
+        of the caller to ensure the eof is sent at the beginning of a line.
+        """
+        ### Hmmm... how do I send an EOF?
+        ###C  if ((m = write(pty, *buf, p - *buf)) < 0)
+        ###C      return (errno == EWOULDBLOCK) ? n : -1;
+        fd = sys.stdin.fileno()
+        old = termios.tcgetattr(fd) # remember current state
+        new = termios.tcgetattr(fd)
+        new[3] = new[3] | termios.ICANON # ICANON must be set to recognize EOF
+        try: # use try/finally to ensure state gets restored
+            termios.tcsetattr(fd, termios.TCSADRAIN, new)
+            if 'CEOF' in dir(termios):
+                os.write (self.child_fd, '%c' % termios.CEOF)
+            else:
+                os.write (self.child_fd, '%c' % 4) # Silly platform does not define CEOF so assume CTRL-D
+        finally: # restore state
+            termios.tcsetattr(fd, termios.TCSADRAIN, old)
+
+    def eof (self):
+        """This returns 1 if the EOF exception was raised at some point.
+        """
+        return self.flag_eof
+
+    def terminate(self, force=0):
+        """This forces a child process to terminate.
+        It starts nicely with SIGHUP and SIGINT. If "force" is 1 then
+        moves onto SIGKILL.
+        This returns true if the child was terminated.
+        This returns false if the child could not be terminated.
+        """
+        if not self.isalive():
+            return 1
+        self.kill(signal.SIGHUP)
+        time.sleep(0.1)
+        if not self.isalive():
+            return 1
+        self.kill(signal.SIGCONT)
+        time.sleep(0.1)
+        if not self.isalive():
+            return 1
+        self.kill(signal.SIGINT)
+        time.sleep(0.1)
+        if not self.isalive():
+            return 1
+        if force:
+            self.kill(signal.SIGKILL)
+            time.sleep(0.1)
+            if not self.isalive():
+                return 1
+            else:
+                return 0
+        return 0
+        #raise ExceptionPexpect ('terminate() could not terminate child process. Try terminate(force=1)?')
+        
+    def isalive(self):
+        """This tests if the child process is running or not.
+        This is non-blocking. If the child was terminated then this
+        will read the exitstatus or signalstatus of the child.
+        This returns 1 if the child process appears to be running or 0 if not.
+        It can take literally SECONDS for Solaris to return the right status.
+        """
+        if self.terminated:
+            return 0
+
+        if self.flag_eof:
+            # This is for Linux, which requires the blocking form of waitpid to get
+            # status of a defunct process. This is super-lame. The flag_eof would have
+            # been set in read_nonblocking(), so this should be safe.
+            waitpid_options = 0
+        else:
+            waitpid_options = os.WNOHANG
+            
+        try:
+            pid, status = os.waitpid(self.pid, waitpid_options)
+        except OSError, e: # No child processes
+            if e[0] == errno.ECHILD:
+                raise ExceptionPexpect ('isalive() encountered condition where "terminated" is 0, but there was no child process. Did someone else call waitpid() on our process?')
+            else:
+                raise e
+
+        # I have to do this twice for Solaris. I can't even believe that I figured this out...
+        # If waitpid() returns 0 it means that no child process wishes to
+        # report, and the value of status is undefined.
+        if pid == 0:
+            try:
+                pid, status = os.waitpid(self.pid, waitpid_options) ### os.WNOHANG) # Solaris!
+            except OSError, e: # This should never happen...
+                if e[0] == errno.ECHILD:
+                    raise ExceptionPexpect ('isalive() encountered condition that should never happen. There was no child process. Did someone else call waitpid() on our process?')
+                else:
+                    raise e
+
+            # If pid is still 0 after two calls to waitpid() then
+            # the process really is alive. This seems to work on all platforms, except
+            # for Irix which seems to require a blocking call on waitpid or select, so I let read_nonblocking
+            # take care of this situation (unfortunately, this requires waiting through the timeout).
+            if pid == 0:
+                return 1
+
+        if pid == 0:
+            return 1
+
+        if os.WIFEXITED (status):
+            self.status = status
+            self.exitstatus = os.WEXITSTATUS(status)
+            self.signalstatus = None
+            self.terminated = 1
+            return 0
+        elif os.WIFSIGNALED (status):
+            self.status = status
+            self.exitstatus = None
+            self.signalstatus = os.WTERMSIG(status)
+            self.terminated = 1
+            return 0
+        elif os.WIFSTOPPED (status):
+            raise ExceptionPexpect ('isalive() encountered condition where child process is stopped. This is not supported. Is some other process attempting job control with our child pid?')
+
+        raise ExceptionPexpect ('isalive() reached unexpected condition where waitpid matched child pid, but status was not matched by WIFEXITED, WIFSIGNALED, or WIFSTOPPED.')
+
+
+    def kill(self, sig):
+        """This sends the given signal to the child application.
+        In keeping with UNIX tradition it has a misleading name.
+        It does not necessarily kill the child unless
+        you send the right signal.
+        """
+        # Same as os.kill, but the pid is given for you.
+        if self.isalive():
+            os.kill(self.pid, sig)
+
+    def compile_pattern_list(self, patterns):
+        """This compiles a pattern-string or a list of pattern-strings.
+        Patterns must be a StringType, EOF, TIMEOUT, SRE_Pattern, or 
+        a list of those. Patterns may also be None which results in
+        an empty list.
+
+        This is used by expect() when calling expect_list().
+        Thus expect() is nothing more than::
+             cpl = self.compile_pattern_list(pl)
+             return self.expect_list(clp, timeout)
+
+        If you are using expect() within a loop it may be more
+        efficient to compile the patterns first and then call expect_list().
+        This avoid calls in a loop to compile_pattern_list():
+             cpl = self.compile_pattern_list(my_pattern)
+             while some_condition:
+                ...
+                i = self.expect_list(clp, timeout)
+                ...
+        """
+        if patterns is None:
+            return []
+        if type(patterns) is not types.ListType:
+            patterns = [patterns]
+
+        compiled_pattern_list = []
+        for p in patterns:
+            if type(p) is types.StringType:
+                compiled_pattern_list.append(re.compile(p, re.DOTALL))
+            elif p is EOF:
+                compiled_pattern_list.append(EOF)
+            elif p is TIMEOUT:
+                compiled_pattern_list.append(TIMEOUT)
+            elif type(p) is type(re.compile('')):
+                compiled_pattern_list.append(p)
+            else:
+                raise TypeError ('Argument must be one of StringType, EOF, TIMEOUT, SRE_Pattern, or a list of those type. %s' % str(type(p)))
+
+        return compiled_pattern_list
+ 
+    def expect(self, pattern, timeout = -1, searchwindowsize=None):
+        """This seeks through the stream until a pattern is matched.
+        The pattern is overloaded and may take several types including a list.
+        The pattern can be a StringType, EOF, a compiled re, or
+        a list of those types. Strings will be compiled to re types.
+        This returns the index into the pattern list. If the pattern was
+        not a list this returns index 0 on a successful match.
+        This may raise exceptions for EOF or TIMEOUT.
+        To avoid the EOF or TIMEOUT exceptions add EOF or TIMEOUT to
+        the pattern list.
+
+        After a match is found the instance attributes
+        'before', 'after' and 'match' will be set.
+        You can see all the data read before the match in 'before'.
+        You can see the data that was matched in 'after'.
+        The re.MatchObject used in the re match will be in 'match'.
+        If an error occured then 'before' will be set to all the
+        data read so far and 'after' and 'match' will be None.
+
+        If timeout is -1 then timeout will be set to the self.timeout value.
+
+        Note: A list entry may be EOF or TIMEOUT instead of a string.
+        This will catch these exceptions and return the index
+        of the list entry instead of raising the exception.
+        The attribute 'after' will be set to the exception type.
+        The attribute 'match' will be None.
+        This allows you to write code like this:
+                index = p.expect (['good', 'bad', pexpect.EOF, pexpect.TIMEOUT])
+                if index == 0:
+                    do_something()
+                elif index == 1:
+                    do_something_else()
+                elif index == 2:
+                    do_some_other_thing()
+                elif index == 3:
+                    do_something_completely_different()
+        instead of code like this:
+                try:
+                    index = p.expect (['good', 'bad'])
+                    if index == 0:
+                        do_something()
+                    elif index == 1:
+                        do_something_else()
+                except EOF:
+                    do_some_other_thing()
+                except TIMEOUT:
+                    do_something_completely_different()
+        These two forms are equivalent. It all depends on what you want.
+        You can also just expect the EOF if you are waiting for all output
+        of a child to finish. For example:
+                p = pexpect.spawn('/bin/ls')
+                p.expect (pexpect.EOF)
+                print p.before
+
+        If you are trying to optimize for speed then see expect_list().
+        """
+        compiled_pattern_list = self.compile_pattern_list(pattern)
+        return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
+
+    def expect_list(self, pattern_list, timeout = -1, searchwindowsize = -1):
+        """This takes a list of compiled regular expressions and returns 
+        the index into the pattern_list that matched the child's output.
+        The list may also contain EOF or TIMEOUT (which are not
+        compiled regular expressions). This method is similar to
+        the expect() method except that expect_list() does not
+        recompile the pattern list on every call.
+        This may help if you are trying to optimize for speed, otherwise
+        just use the expect() method.  This is called by expect().
+        If timeout==-1 then the self.timeout value is used.
+        If searchwindowsize==-1 then the self.searchwindowsize value is used.
+        """
+        self.patterns = pattern_list
+
+        if timeout == -1:
+            timeout = self.timeout
+        if timeout != None:
+            end_time = time.time() + timeout 
+        if searchwindowsize == -1:
+            searchwindowsize = self.searchwindowsize
+
+        try:
+            incoming = self.buffer
+            while 1: # Keep reading until exception or return.
+                # Sequence through the list of patterns looking for a match.
+                first_match = -1
+                for cre in pattern_list:
+                    if cre is EOF or cre is TIMEOUT: 
+                        continue # The patterns for PexpectExceptions are handled differently.
+                    if searchwindowsize is None: # search everything
+                        match = cre.search(incoming)
+                    else:
+                        startpos = max(0, len(incoming) - searchwindowsize)
+                        match = cre.search(incoming, startpos)
+                    if match is None:
+                        continue
+                    if first_match > match.start() or first_match == -1:
+                        first_match = match.start()
+                        self.match = match
+                        self.match_index = pattern_list.index(cre)
+                if first_match > -1:
+                    self.buffer = incoming[self.match.end() : ]
+                    self.before = incoming[ : self.match.start()]
+                    self.after = incoming[self.match.start() : self.match.end()]
+                    return self.match_index
+                # No match at this point
+                if timeout < 0 and timeout is not None:
+                    raise TIMEOUT ('Timeout exceeded in expect_list().')
+                # Still have time left, so read more data
+                c = self.read_nonblocking (self.maxread, timeout)
+                incoming = incoming + c
+                if timeout is not None:
+                    timeout = end_time - time.time()
+        except EOF, e:
+            self.buffer = ''
+            self.before = incoming
+            self.after = EOF
+            if EOF in pattern_list:
+                self.match = EOF
+                self.match_index = pattern_list.index(EOF)
+                return self.match_index
+            else:
+                self.match = None
+                self.match_index = None
+                raise EOF (str(e) + '\n' + str(self))
+        except TIMEOUT, e:
+            self.before = incoming
+            self.after = TIMEOUT
+            if TIMEOUT in pattern_list:
+                self.match = TIMEOUT
+                self.match_index = pattern_list.index(TIMEOUT)
+                return self.match_index
+            else:
+                self.match = None
+                self.match_index = None
+                raise TIMEOUT (str(e) + '\n' + str(self))
+        except Exception:
+            self.before = incoming
+            self.after = None
+            self.match = None
+            self.match_index = None
+            raise
+
+    def getwinsize(self):
+        """This returns the window size of the child tty.
+        The return value is a tuple of (rows, cols).
+        """
+        if 'TIOCGWINSZ' in dir(termios):
+            TIOCGWINSZ = termios.TIOCGWINSZ
+        else:
+            TIOCGWINSZ = 1074295912L # Assume
+        s = struct.pack('HHHH', 0, 0, 0, 0)
+        x = fcntl.ioctl(self.fileno(), TIOCGWINSZ, s)
+        return struct.unpack('HHHH', x)[0:2]
+
+    def setwinsize(self, r, c):
+        """This sets the window size of the child tty.
+        This will cause a SIGWINCH signal to be sent to the child.
+        This does not change the physical window size.
+        It changes the size reported to TTY-aware applications like
+        vi or curses -- applications that respond to the SIGWINCH signal.
+        """
+        # Check for buggy platforms. Some Python versions on some platforms
+        # (notably OSF1 Alpha and RedHat 7.1) truncate the value for
+        # termios.TIOCSWINSZ. It is not clear why this happens.
+        # These platforms don't seem to handle the signed int very well;
+        # yet other platforms like OpenBSD have a large negative value for
+        # TIOCSWINSZ and they don't have a truncate problem.
+        # Newer versions of Linux have totally different values for TIOCSWINSZ.
+        # Note that this fix is a hack.
+        if 'TIOCSWINSZ' in dir(termios):
+            TIOCSWINSZ = termios.TIOCSWINSZ
+        else:
+            TIOCSWINSZ = -2146929561
+        if TIOCSWINSZ == 2148037735L: # L is not required in Python >= 2.2.
+            TIOCSWINSZ = -2146929561 # Same bits, but with sign.
+        # Note, assume ws_xpixel and ws_ypixel are zero.
+        s = struct.pack('HHHH', r, c, 0, 0)
+        fcntl.ioctl(self.fileno(), TIOCSWINSZ, s)
+
+    def interact(self, escape_character = chr(29)):
+        """This gives control of the child process to the interactive user
+        (the human at the keyboard).
+        Keystrokes are sent to the child process, and the stdout and stderr
+        output of the child process is printed.
+        When the user types the escape_character this method will stop.
+        The default for escape_character is ^] (ASCII 29).
+        This simply echos the child stdout and child stderr to the real
+        stdout and it echos the real stdin to the child stdin.
+
+        Note that if you change the window size of the parent
+        the SIGWINCH signal will not be passed through to the child.
+        If you want the child window size to change when the parent's
+        window size changes then do something like the following example:
+            import pexpect, struct, fcntl, termios, signal, sys
+            def sigwinch_passthrough (sig, data):
+                s = struct.pack("HHHH", 0, 0, 0, 0)
+                a = struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ , s))
+                global p
+                p.setwinsize(a[0],a[1])
+            p = pexpect.spawn('/bin/bash') # Note this is global
+            signal.signal(signal.SIGWINCH, sigwinch_passthrough)
+            p.interact()
+        """
+        # Flush the buffer.
+        self.stdout.write (self.buffer)
+        self.stdout.flush()
+        self.buffer = ''
+        mode = tty.tcgetattr(self.STDIN_FILENO)
+        tty.setraw(self.STDIN_FILENO)
+        try:
+            self.__interact_copy(escape_character)
+        finally:
+            tty.tcsetattr(self.STDIN_FILENO, tty.TCSAFLUSH, mode)
+
+    def __interact_writen(self, fd, data):
+        """This is used by the interact() method.
+        """
+        while data != '' and self.isalive():
+            n = os.write(fd, data)
+            data = data[n:]
+    def __interact_read(self, fd):
+        """This is used by the interact() method.
+        """
+        return os.read(fd, 1000)
+    def __interact_copy(self, escape_character = None):
+        """This is used by the interact() method.
+        """
+        while self.isalive():
+            try:
+                r, w, e = select.select([self.child_fd, self.STDIN_FILENO], [], [])
+            except select.errno, e:
+                if e[0] != errno.EINTR:
+                    raise
+            if self.child_fd in r:
+                data = self.__interact_read(self.child_fd)
+                if self.logfile != None:
+                    self.logfile.write (data)
+                    self.logfile.flush()
+                os.write(self.STDOUT_FILENO, data)
+            if self.STDIN_FILENO in r:
+                data = self.__interact_read(self.STDIN_FILENO)
+                self.__interact_writen(self.child_fd, data)
+                if escape_character in data:
+                    break
+##############################################################################
+# The following methods are no longer supported or allowed..                
+    def setmaxread (self, maxread):
+        """This method is no longer supported or allowed.
+        I don't like getters and setters without a good reason.
+        """
+        raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the maxread member variable.')
+    def expect_exact (self, pattern_list, timeout = -1):
+        """This method is no longer supported or allowed.
+        It was too hard to maintain and keep it up to date with expect_list.
+        Few people used this method. Most people favored reliability over speed.
+        The implementation is left in comments in case anyone needs to hack this
+        feature back into their copy.
+        If someone wants to diff this with expect_list and make them work
+        nearly the same then I will consider adding this make in.
+        """
+        raise ExceptionPexpect ('This method is no longer supported or allowed.')
+    def setlog (self, fileobject):
+        """This method is no longer supported or allowed.
+        """
+        raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the logfile member variable.')
+
+##############################################################################
+# End of spawn class
+##############################################################################
+
+def which (filename):
+    """This takes a given filename; tries to find it in the environment path; 
+    then checks if it is executable.
+    This returns the full path to the filename if found and executable.
+    Otherwise this returns None.
+    """
+    # Special case where filename already contains a path.
+    if os.path.dirname(filename) != '':
+        if os.access (filename, os.X_OK):
+            return filename
+
+    if not os.environ.has_key('PATH') or os.environ['PATH'] == '':
+        p = os.defpath
+    else:
+        p = os.environ['PATH']
+
+    # Oddly enough this was the one line that made Pexpect
+    # incompatible with Python 1.5.2.
+    #pathlist = p.split (os.pathsep) 
+    pathlist = string.split (p, os.pathsep)
+
+    for path in pathlist:
+        f = os.path.join(path, filename)
+        if os.access(f, os.X_OK):
+            return f
+    return None
+
+def split_command_line(command_line):
+    """This splits a command line into a list of arguments.
+    It splits arguments on spaces, but handles
+    embedded quotes, doublequotes, and escaped characters.
+    It's impossible to do this with a regular expression, so
+    I wrote a little state machine to parse the command line.
+    """
+    arg_list = []
+    arg = ''
+
+    # Constants to name the states we can be in.
+    state_basic = 0
+    state_esc = 1
+    state_singlequote = 2
+    state_doublequote = 3
+    state_whitespace = 4 # The state of consuming whitespace between commands.
+    state = state_basic
+
+    for c in command_line:
+        if state == state_basic or state == state_whitespace:
+            if c == '\\': # Escape the next character
+                state = state_esc
+            elif c == r"'": # Handle single quote
+                state = state_singlequote
+            elif c == r'"': # Handle double quote
+                state = state_doublequote
+            elif c.isspace():
+                # Add arg to arg_list if we aren't in the middle of whitespace.
+                if state == state_whitespace:
+                    None # Do nothing.
+                else:
+                    arg_list.append(arg)
+                    arg = ''
+                    state = state_whitespace
+            else:
+                arg = arg + c
+                state = state_basic
+        elif state == state_esc:
+            arg = arg + c
+            state = state_basic
+        elif state == state_singlequote:
+            if c == r"'":
+                state = state_basic
+            else:
+                arg = arg + c
+        elif state == state_doublequote:
+            if c == r'"':
+                state = state_basic
+            else:
+                arg = arg + c
+
+    if arg != '':
+        arg_list.append(arg)
+    return arg_list
+