private TestResult executeRemote(
      Test event, DeploymentDescription deployment, Container container) throws Exception {
    ProtocolRegistry protoReg = protocolRegistry.get();

    // if no default marked or specific protocol defined in the registry, use the
    // DeployableContainers defaultProtocol.
    ProtocolDefinition protocol = protoReg.getProtocol(deployment.getProtocol());
    if (protocol == null) {
      protocol = protoReg.getProtocol(container.getDeployableContainer().getDefaultProtocol());
    }

    ProtocolConfiguration protocolConfiguration;

    if (container.hasProtocolConfiguration(protocol.getProtocolDescription())) {
      protocolConfiguration =
          protocol.createProtocolConfiguration(
              container
                  .getProtocolConfiguration(protocol.getProtocolDescription())
                  .getProtocolProperties());
    } else {
      protocolConfiguration = protocol.createProtocolConfiguration();
    }
    // TODO: cast to raw type to get away from generic issue..
    ContainerMethodExecutor executor =
        ((Protocol) protocol.getProtocol())
            .getExecutor(protocolConfiguration, protocolMetadata.get());
    return executor.invoke(event.getTestMethodExecutor());
  }
  public void execute(@Observes Test event) throws Exception {
    ContainerContext containerContext = containerContextProvider.get();
    DeploymentContext deploymentContext = deploymentContextProvider.get();

    // TODO : move as a abstract/SPI on TestMethodExecutor
    DeploymentTargetDescription target = null;
    if (event.getTestMethod().isAnnotationPresent(DeploymentTarget.class)) {
      target =
          new DeploymentTargetDescription(
              event.getTestMethod().getAnnotation(DeploymentTarget.class).value());
    } else {
      target = DeploymentTargetDescription.DEFAULT;
    }

    DeploymentScenario scenario = deploymentScenario.get();

    try {
      DeploymentDescription deployment = scenario.getDeployment(target);

      Container container = containerRegistry.get().getContainer(deployment.getTarget());
      containerContext.activate(container.getName());

      try {
        // TODO: split up local vs remote execution in two handlers, fire a new set of events
        // LocalExecute RemoteExecute
        deploymentContext.activate(deployment);
        if (scenario.getRunMode()
            == RunModeType
                .AS_CLIENT) // TODO: DeploymentScenario should not depend on RunModeType API
        {
          testResult.set(executeLocal(event));
        } else {
          testResult.set(executeRemote(event, deployment, container));
        }
      } finally {
        deploymentContext.deactivate();
      }
    } finally {
      containerContext.deactivate();
    }
  }
 public void verifyExpectedExceptionDuringDeploy(@Observes EventContext<DeployDeployment> context)
     throws Exception {
   DeploymentDescription deployment = context.getEvent().getDeployment();
   boolean deploymentExceptionThrown = true;
   try {
     context.proceed();
     if (deployment.getExpectedException() != null) {
       deploymentExceptionThrown = false;
       throw new RuntimeException(
           "Expected exception of type "
               + deployment.getExpectedException().getName()
               + " during deployment of "
               + deployment.getName()
               + ", but no exception was thrown.");
     }
   } catch (Exception e) {
     // if exception is not thrown from the deployment, rethrow it (we threw it).
     if (!deploymentExceptionThrown) {
       throw e;
     }
     if (deployment.getExpectedException() != null) {
       if (!containsType(transform(e), deployment.getExpectedException())) {
         throw e;
       }
     } else {
       throw e;
     }
   }
 }