public RestartCrashedService(ActivationID id, MarshalledObject mobj)
      throws ActivationException, RemoteException {
    this.id = id;
    Activatable.exportObject(this, id, 0);
    ActivateMe obj;
    String responder;
    try {
      Object[] stuff = (Object[]) mobj.get();
      responder = (String) stuff[0];
      System.err.println(responder + " service started");
      obj = (ActivateMe) stuff[1];
    } catch (Exception e) {
      System.err.println("unable to obtain stub from marshalled object");
      return;
    }

    obj.ping(responder);
  }
  public static void main(String[] args) {

    System.out.println("\nRegression test for bug 4095165, 4140736\n");

    TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");

    RMID rmid = null;
    RestartCrashedService unicastObj = null;

    try {
      RMID.removeLog();
      rmid = RMID.createRMID();
      rmid.start();

      /* Cause activation groups to have a security policy that will
       * allow security managers to be downloaded and installed
       */
      final Properties p = new Properties();
      // this test must always set policies/managers in its
      // activation groups
      p.put("java.security.policy", TestParams.defaultGroupPolicy);
      p.put("java.security.manager", TestParams.defaultSecurityManager);

      /*
       * Create unicast object to be contacted when service is activated.
       */
      unicastObj = new RestartCrashedService();
      /*
       * Create and register descriptors for a restartable and
       * non-restartable service (respectively) in a group other than
       * this VM's group.
       */
      System.err.println("Creating descriptors");

      Object[] stuff = new Object[] {RESTARTABLE, unicastObj};
      MarshalledObject restartMobj = new MarshalledObject(stuff);
      ActivationGroupDesc groupDesc = new ActivationGroupDesc(p, null);

      stuff[0] = ACTIVATABLE;
      MarshalledObject activateMobj = new MarshalledObject(stuff);
      ActivationGroupID groupID = ActivationGroup.getSystem().registerGroup(groupDesc);
      ActivationDesc restartableDesc =
          new ActivationDesc(groupID, "RestartCrashedService", null, restartMobj, true);

      ActivationDesc activatableDesc =
          new ActivationDesc(groupID, "RestartCrashedService", null, activateMobj, false);

      System.err.println("Registering descriptors");
      ActivateMe restartableObj = (ActivateMe) Activatable.register(restartableDesc);

      ActivateMe activatableObj = (ActivateMe) Activatable.register(activatableDesc);

      /*
       * Restart rmid; it should start up the restartable service
       */
      rmid.restart();

      /*
       * Wait for service to be automatically restarted.
       */
      int repeat = 1;

      do {

        for (int i = 0; i < 15; i++) {
          synchronized (lock) {
            if (unicastObj.receivedPing(RESTARTABLE) != true) {
              lock.wait(5000);
              if (unicastObj.receivedPing(RESTARTABLE) == true) {
                System.err.println("Test1 passed: rmid " + "restarted service");
                break;
              }
            } else {
              break;
            }
          }
        }

        if (unicastObj.receivedPing(RESTARTABLE) != true)
          TestLibrary.bomb("Test1 failed: service not restarted by timeout", null);

        /*
         * Make sure activatable services wasn't automatically
         * restarted.
         */
        synchronized (lock) {
          if (unicastObj.receivedPing(ACTIVATABLE) != true) {
            lock.wait(5000);
            if (unicastObj.receivedPing(ACTIVATABLE) != true) {
              System.err.println("Test2 passed: rmid did not " + "restart activatable service");
            } else {
              TestLibrary.bomb("Test2 failed: activatable service restarted", null);
            }
          } else {
            TestLibrary.bomb("Test2 failed: activatable service restarted!", null);
          }
        }

        if (repeat > 0) {
          try {
            System.err.println("\nCrash restartable object");
            unicastObj.resetResponders();
            restartableObj.crash();
          } catch (Exception e) {
          }
        }

      } while (repeat-- > 0);

    } catch (Exception e) {
      TestLibrary.bomb("test failed", e);
    } finally {
      ActivationLibrary.rmidCleanup(rmid);
      TestLibrary.unexport(unicastObj);
    }
  }