/*
  * (non-Javadoc)
  *
  * @see org.jboss.forge.addon.deltaspike.facets.DeltaSpikeFacet#install(org.jboss.forge.addon.deltaspike.DeltaSpikeModule)
  */
 @Override
 public DeltaSpikeFacet install(DeltaSpikeModule deltaSpikeModule) {
   for (Dependency dependency : deltaSpikeModule.getDependencies()) {
     installDependency(getFaceted(), dependency);
   }
   return this;
 }
 /*
  * (non-Javadoc)
  *
  * @see org.jboss.forge.addon.deltaspike.facets.DeltaSpikeFacet#remove(org.jboss.forge.addon.deltaspike.DeltaSpikeModule)
  */
 @Override
 public DeltaSpikeFacet remove(DeltaSpikeModule deltaSpikeModule) {
   DependencyFacet dependencyFacet = getFaceted().getFacet(DependencyFacet.class);
   for (Dependency dependency : deltaSpikeModule.getDependencies()) {
     dependencyFacet.removeManagedDependency(dependency);
     dependencyFacet.removeDependency(dependency);
   }
   return this;
 }
  @Override
  public Result execute(UIExecutionContext context) throws Exception {
    Project project = getSelectedProject(context);
    DeltaSpikeFacet deltaSpikeFacet = project.getFacet(DeltaSpikeFacet.class);

    Iterable<DeltaSpikeModule> selectedModules = dsModules.getValue();
    Set<DeltaSpikeModule> modulesInstalled = new HashSet<DeltaSpikeModule>();
    Set<DeltaSpikeModule> modulesRemoved = new HashSet<DeltaSpikeModule>();
    for (DeltaSpikeModule dsModule : DeltaSpikeModules.values()) {
      boolean selected = false;
      for (DeltaSpikeModule selectedModule : selectedModules) {
        if (selectedModule.equals(dsModule)) {
          selected = true;
        }
      }
      // Modules to Install
      if (selected && !deltaSpikeFacet.isModuleInstalled(dsModule)) {
        modulesInstalled.add(dsModule);
        deltaSpikeFacet.install(dsModule);
        if (dsModule.getInstallationExtraStep() != null) {
          dsModule.getInstallationExtraStep().install(project);
        }
      }
      // Modules to Remove
      if (!selected && deltaSpikeFacet.isModuleInstalled(dsModule)) {
        modulesRemoved.add(dsModule);
        deltaSpikeFacet.remove(dsModule);
        if (dsModule.getInstallationExtraStep() != null) {
          dsModule.getInstallationExtraStep().remove(project);
        }
      }
    }

    return Results.success(
        "DeltaSpike modules installed:"
            + modulesInstalled
            + "\nDeltaSpike modules removed:"
            + modulesRemoved);
  }
 /*
  * (non-Javadoc)
  *
  * @see
  * org.jboss.forge.addon.deltaspike.facets.DeltaSpikeFacet#isModuleInstalled(org.jboss.forge.addon.deltaspike.DeltaSpikeModule
  * )
  */
 @Override
 public boolean isModuleInstalled(DeltaSpikeModule deltaSpikeModule) {
   return dependencyInstaller.isInstalled(getFaceted(), deltaSpikeModule.getDependencies()[0]);
 }