@Test
 public void testGetEffector() throws Exception {
   TestEntity entity2 = app.createAndManageChild(EntitySpecs.spec(TestEntity.class));
   Effector<?> effector = entity2.getEntityType().getEffector("myEffector");
   Effector<?> effector2 = entity2.getEntityType().getEffector("identityEffector", Object.class);
   assertEquals(effector.getName(), "myEffector");
   assertEquals(effector2.getName(), "identityEffector");
 }
  /** Invokes the effector so that its progress is tracked. */
  public static <T> T invokeEffector(Entity entity, Effector<T> eff, Object[] args) {
    String id = entity.getId();
    String name = eff.getName();

    try {
      if (log.isDebugEnabled())
        log.debug("Invoking effector {} on {}", new Object[] {name, entity});
      if (log.isTraceEnabled())
        log.trace("Invoking effector {} on {} with args {}", new Object[] {name, entity, args});
      EntityManagementSupport mgmtSupport = ((EntityInternal) entity).getManagementSupport();
      if (!mgmtSupport.isDeployed()) {
        mgmtSupport.attemptLegacyAutodeployment(name);
      }
      ManagementContextInternal mgmtContext =
          (ManagementContextInternal) ((EntityInternal) entity).getManagementContext();

      mgmtSupport.getEntityChangeListener().onEffectorStarting(eff);
      try {
        return mgmtContext.invokeEffectorMethodSync(entity, eff, args);
      } finally {
        mgmtSupport.getEntityChangeListener().onEffectorCompleted(eff);
      }
    } catch (CancellationException ce) {
      log.info("Execution of effector {} on entity {} was cancelled", name, id);
      throw ce;
    } catch (ExecutionException ee) {
      log.info("Execution of effector {} on entity {} failed with {}", new Object[] {name, id, ee});
      // Exceptions thrown in Futures are wrapped
      // FIXME Shouldn't pretend exception came from this thread?! Should we remove this unwrapping?
      if (ee.getCause() != null) throw Exceptions.propagate(ee.getCause());
      else throw Exceptions.propagate(ee);
    }
  }
 public static Effector<?> findEffectorMatching(
     Set<Effector<?>> effectors, String effectorName, Map<String, ?> parameters) {
   // TODO Support overloading: check parameters as well
   for (Effector<?> effector : effectors) {
     if (effector.getName().equals(effectorName)) {
       return effector;
     }
   }
   return null;
 }
 public static Effector<?> findEffectorMatching(Entity entity, Method method) {
   effector:
   for (Effector<?> effector : entity.getEntityType().getEffectors()) {
     if (!effector.getName().equals(entity)) continue;
     if (effector.getParameters().size() != method.getParameterTypes().length) continue;
     for (int i = 0; i < effector.getParameters().size(); i++) {
       if (effector.getParameters().get(i).getParameterClass() != method.getParameterTypes()[i])
         continue effector;
     }
     return effector;
   }
   return null;
 }
  public static <T> Task<T> invokeEffectorAsync(
      AbstractEntity entity, Effector<T> eff, Map<String, ?> parameters) {
    String id = entity.getId();
    String name = eff.getName();

    if (log.isDebugEnabled())
      log.debug("Invoking-async effector {} on {}", new Object[] {name, entity});
    if (log.isTraceEnabled())
      log.trace(
          "Invoking-async effector {} on {} with args {}", new Object[] {name, entity, parameters});
    EntityManagementSupport mgmtSupport = ((EntityInternal) entity).getManagementSupport();
    if (!mgmtSupport.isDeployed()) {
      mgmtSupport.attemptLegacyAutodeployment(name);
    }
    ManagementContextInternal mgmtContext =
        (ManagementContextInternal) ((EntityInternal) entity).getManagementContext();

    mgmtSupport.getEntityChangeListener().onEffectorStarting(eff);
    try {
      return mgmtContext.invokeEffector(entity, eff, parameters);
    } finally {
      mgmtSupport.getEntityChangeListener().onEffectorCompleted(eff);
    }
  }
 @Override
 public boolean apply(@Nullable Effector<?> input) {
   return name.equals(input.getName());
 }