Initial load
diff --git a/test/java/rmi/testlibrary/ActivationLibrary.java b/test/java/rmi/testlibrary/ActivationLibrary.java
new file mode 100644
index 0000000..bc8edd8
--- /dev/null
+++ b/test/java/rmi/testlibrary/ActivationLibrary.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ *
+ */
+
+import java.io.File;
+import java.rmi.Naming;
+import java.rmi.NoSuchObjectException;
+import java.rmi.NotBoundException;
+import java.rmi.Remote;
+import java.rmi.activation.Activatable;
+import java.rmi.activation.ActivationID;
+import java.rmi.activation.ActivationSystem;
+import java.rmi.registry.LocateRegistry;
+
+/**
+ * Class of test utility/library methods related to Activatable
+ * objects.
+ */
+public class ActivationLibrary {
+    /** time safeDestroy should wait before failing on shutdown rmid */
+    private static final int SAFE_WAIT_TIME;
+    static {
+        int slopFactor = 1;
+        try {
+            slopFactor = Integer.valueOf(
+                TestLibrary.getExtraProperty("jcov.sleep.multiplier","1"));
+        } catch (NumberFormatException ignore) {}
+        SAFE_WAIT_TIME = 60000 * slopFactor;
+    }
+
+    private static final String SYSTEM_NAME =
+        ActivationSystem.class.getName();
+
+    private static void mesg(Object mesg) {
+        System.err.println("ACTIVATION_LIBRARY: " + mesg.toString());
+    }
+
+    /**
+     * Deactivate an activated Activatable
+     */
+    public static void deactivate(Remote remote,
+                                  ActivationID id) {
+        for (int i = 0; i < 5; i ++) {
+            try {
+                if (Activatable.inactive(id) == true) {
+                    mesg("inactive successful");
+                    return;
+                } else {
+                    Thread.sleep(1000);
+                }
+            } catch (InterruptedException e) {
+                continue;
+            } catch (Exception e) {
+                try {
+                    // forcibly unexport the object
+                    Activatable.unexportObject(remote, true);
+                } catch (NoSuchObjectException ex) {
+                }
+                return;
+            }
+        }
+
+        mesg("unable to inactivate after several attempts");
+        mesg("unexporting object forcibly instead");
+
+        try {
+            Activatable.unexportObject(remote, true);
+        } catch (NoSuchObjectException e) {
+        }
+    }
+
+    /**
+     * Simple method call to see if rmid is running.
+     *
+     * This method intentionally avoids performing a lookup on the
+     * activation system.
+     */
+    public static boolean rmidRunning(int port) {
+        int allowedNotReady = 10;
+        int connectionRefusedExceptions = 0;
+
+        for (int i = 0; i < 15 ; i++) {
+
+            try {
+                Thread.sleep(500);
+                LocateRegistry.getRegistry(port).lookup(SYSTEM_NAME);
+                return true;
+
+            } catch (java.rmi.ConnectException e) {
+                // ignore connect exceptions until we decide rmid is not up
+
+                if ((connectionRefusedExceptions ++) >= allowedNotReady) {
+                    return false;
+                }
+
+            } catch (NotBoundException e) {
+
+                return false;
+
+            } catch (Exception e) {
+                // print out other types of exceptions as an FYI.
+                // test should not fail as rmid is likely to be in an
+                // undetermined state at this point.
+
+                mesg("caught an exception trying to" +
+                     " start rmid, last exception was: " +
+                     e.getMessage());
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Check to see if an arry of Strings contains a given string.
+     */
+    private static boolean
+        containsString(String[] strings, String contained)
+    {
+        if (strings == null) {
+            if (contained == null) {
+                return true;
+            }
+            return false;
+        }
+
+        for (int i = 0 ; i < strings.length ; i ++ ) {
+            if ((strings[i] != null) &&
+                (strings[i].indexOf(contained) >= 0))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /** cleanup after rmid */
+    public static void rmidCleanup(RMID rmid) {
+        rmidCleanup(rmid, TestLibrary.RMID_PORT);
+    }
+
+    public static void rmidCleanup(RMID rmid, int port) {
+        if (rmid != null) {
+            if (!ActivationLibrary.safeDestroy(rmid, port, SAFE_WAIT_TIME)) {
+                TestLibrary.bomb("rmid not destroyed in: " +
+                                 SAFE_WAIT_TIME +
+                                 " milliseconds");
+            }
+        }
+        RMID.removeLog();
+    }
+
+    /**
+     * Invoke shutdown on rmid in a way that will not cause a test
+     * to hang.
+     *
+     * @return whether or not shutdown completed succesfully in the
+     *         timeAllowed
+     */
+    private static boolean safeDestroy(RMID rmid, int port, long timeAllowed) {
+        DestroyThread destroyThread = new DestroyThread(rmid, port);
+        destroyThread.start();
+
+        try {
+            destroyThread.join(timeAllowed);
+        } catch (InterruptedException ie) {
+            Thread.currentThread().interrupt();
+        }
+
+        return destroyThread.shutdownSucceeded();
+    }
+
+    /**
+     * Thread class to handle the destruction of rmid
+     */
+    private static class DestroyThread extends Thread {
+        private final RMID rmid;
+        private final int port;
+        private boolean succeeded = false;
+
+        DestroyThread(RMID rmid, int port) {
+            this.rmid = rmid;
+            this.port = port;
+            this.setDaemon(true);
+        }
+
+        public void run() {
+            if (ActivationLibrary.rmidRunning(port)) {
+                rmid.destroy();
+                synchronized (this) {
+                    // flag that the test was able to shutdown rmid
+                    succeeded = true;
+                }
+                mesg("finished destroying rmid");
+            } else {
+                mesg("tried to shutdown when rmid was not running");
+            }
+        }
+
+        public synchronized boolean shutdownSucceeded() {
+            return succeeded;
+        }
+    }
+}