@Test
 public void testDistributeEjbApp() throws Exception {
   ProgressObject progress = jsr88Deploy(getEjbArchive());
   TargetModuleID[] targetModules = progress.getResultTargetModuleIDs();
   try {
     DeploymentStatus state = progress.getDeploymentStatus();
     assertEquals(StateType.COMPLETED, state.getState());
   } finally {
     jsr88Undeploy(targetModules);
   }
 }
 @Test
 public void testDistributeEARApp() throws Exception {
   ProgressObject progress = jsr88Deploy(getEarArchive());
   TargetModuleID[] targetModules = progress.getResultTargetModuleIDs();
   try {
     DeploymentStatus state = progress.getDeploymentStatus();
     assertEquals(StateType.COMPLETED, state.getState());
     assertServletAccess("custom-context");
   } finally {
     jsr88Undeploy(targetModules);
   }
   try {
     assertServletAccess("custom-context");
     fail("Test deployment not undeployed");
   } catch (Exception e) {
     // ignore
   }
 }
  private StateType awaitCompletion(ProgressObject progress, long timeout)
      throws InterruptedException {
    DeploymentStatus status = progress.getDeploymentStatus();
    if (status.isCompleted()) return null;

    final CountDownLatch latch = new CountDownLatch(1);
    progress.addProgressListener(
        new ProgressListener() {
          public void handleProgressEvent(ProgressEvent event) {
            DeploymentStatus status = event.getDeploymentStatus();
            if (status.isCompleted() || status.isFailed()) {
              latch.countDown();
            }
          }
        });

    if (latch.await(timeout, TimeUnit.MILLISECONDS) == false)
      throw new IllegalStateException("Deployment timeout: " + progress);

    return status.getState();
  }
  public void handleProgressEvent(ProgressEvent progressEvent) {
    DeploymentStatus deploymentStatus = progressEvent.getDeploymentStatus();

    if (_log.isInfoEnabled()) {
      _log.info(deploymentStatus.getMessage());
    }

    if (deploymentStatus.isCompleted()) {
      try {
        TargetModuleID[] targetModuleIDs =
            _deploymentManager.getNonRunningModules(
                ModuleType.WAR, _deploymentManager.getTargets());

        if ((targetModuleIDs != null) && (targetModuleIDs.length > 0)) {
          for (TargetModuleID targetModuleID : targetModuleIDs) {
            if (!_warContext.equals(targetModuleID.getModuleID())) {
              continue;
            }

            ProgressObject startProgress =
                _deploymentManager.start(new TargetModuleID[] {targetModuleID});

            startProgress.addProgressListener(new StartProgressListener(_deploymentHandler));

            _deploymentHandler.setError(false);
            _deploymentHandler.setStarted(true);

            break;
          }
        } else {
          targetModuleIDs =
              _deploymentManager.getAvailableModules(
                  ModuleType.WAR, _deploymentManager.getTargets());

          for (TargetModuleID targetModuleID : targetModuleIDs) {
            if (!_warContext.equals(targetModuleID.getModuleID())) {
              continue;
            }

            ProgressObject startProgress =
                _deploymentManager.start(new TargetModuleID[] {targetModuleID});

            startProgress.addProgressListener(new StartProgressListener(_deploymentHandler));

            _deploymentHandler.setError(false);
            _deploymentHandler.setStarted(true);

            break;
          }
        }
      } catch (Exception e) {
        _log.error(e, e);

        _deploymentHandler.setError(true);
        _deploymentHandler.setStarted(false);
      }
    } else if (deploymentStatus.isFailed()) {
      _deploymentHandler.setError(true);
      _deploymentHandler.setStarted(false);
    }
  }