private void computeRemedyDetails(Remedy remedy) {
    ArrayList<String> updateIds = new ArrayList<String>();
    for (IInstallableUnit addedIU : remedy.getRequest().getAdditions()) {
      for (IInstallableUnit removedIU : remedy.getRequest().getRemovals()) {
        if (removedIU.getId().equals(addedIU.getId())) {
          createModificationRemedyDetail(addedIU, removedIU, remedy);
          updateIds.add(addedIU.getId());
          break;
        }
      }
      if (!updateIds.contains(addedIU.getId())) {
        createAdditionRemedyDetail(addedIU, remedy);
      }
    }

    for (IInstallableUnit removedIU : remedy.getRequest().getRemovals()) {
      if (!updateIds.contains(removedIU.getId())) {
        createRemovalRemedyDetail(removedIU, remedy);
      }
    }

    for (IInstallableUnit addedIUinOriginalRequest : originalRequest.getAdditions()) {
      boolean found = false;
      for (IInstallableUnit addedIU : remedy.getRequest().getAdditions()) {
        if (addedIU.getId().equals(addedIUinOriginalRequest.getId())) {
          found = true;
          break;
        }
      }
      if (!found) {
        createNotAddedRemedyDetail(addedIUinOriginalRequest, remedy);
        found = false;
      }
    }
  }
 @Override
 protected void computeProfileChangeRequest(MultiStatus status, IProgressMonitor monitor) {
   SubMonitor sub = SubMonitor.convert(monitor, 1);
   if (currentRemedy != null) {
     request = currentRemedy.getRequest();
     sub.worked(1);
     return;
   }
   try {
     status.add(computeAllRemediations(sub.newChild(1)));
   } catch (OperationCanceledException e) {
     status.add(Status.CANCEL_STATUS);
   }
   determineBestSolutions();
 }
 private void determineBestSolutions() {
   int beingInstalledWeight = 0;
   int installationWeight = 0;
   for (Iterator<Remedy> iterator = remedies.iterator(); iterator.hasNext(); ) {
     Remedy remedy = iterator.next();
     if (remedy.getRequest() != null) {
       if (remedy.getBeingInstalledRelaxedWeight() > beingInstalledWeight
           && remedy.getInstallationRelaxedWeight() == 0) {
         bestSolutionChangingTheRequest = remedy;
         beingInstalledWeight = remedy.getBeingInstalledRelaxedWeight();
         continue;
       }
       if (remedy.getInstallationRelaxedWeight() > installationWeight
           && remedy.getBeingInstalledRelaxedWeight() == 0) {
         bestSolutionChangingWhatIsInstalled = remedy;
         installationWeight = remedy.getInstallationRelaxedWeight();
         continue;
       }
     }
   }
 }
  private Remedy computeRemedy(RemedyConfig configuration, IProgressMonitor monitor) {
    Remedy remedy = new Remedy(originalRequest);
    remedy.setConfig(configuration);
    IPlanner planner = session.getPlanner();
    RequestFlexer av = new RequestFlexer(planner);
    av.setAllowDifferentVersion(configuration.allowDifferentVersion);
    av.setAllowInstalledElementChange(configuration.allowInstalledUpdate);
    av.setAllowInstalledElementRemoval(configuration.allowInstalledRemoval);
    av.setAllowPartialInstall(configuration.allowPartialInstall);
    av.setProvisioningContext(getProvisioningContext());
    remedy.setRequest(
        (ProfileChangeRequest)
            av.getChangeRequest(
                originalRequest, ((ProfileChangeRequest) originalRequest).getProfile(), monitor));
    if (remedy.getRequest() == null) return null;

    if (configuration.allowInstalledUpdate && !configuration.allowInstalledRemoval) {
      remedy.setInstallationRelaxedWeight(HIGH_WEIGHT);
    } else if (!configuration.allowInstalledUpdate && configuration.allowInstalledRemoval) {
      remedy.setInstallationRelaxedWeight(MEDIUM_WEIGHT);
    } else if (configuration.allowInstalledUpdate && configuration.allowInstalledRemoval) {
      remedy.setInstallationRelaxedWeight(LOW_WEIGHT);
    } else remedy.setInstallationRelaxedWeight(ZERO_WEIGHT);

    if (configuration.allowDifferentVersion && !configuration.allowPartialInstall) {
      remedy.setBeingInstalledRelaxedWeight(HIGH_WEIGHT);
    } else if (!configuration.allowDifferentVersion && configuration.allowPartialInstall) {
      remedy.setBeingInstalledRelaxedWeight(MEDIUM_WEIGHT);
    } else if (configuration.allowDifferentVersion && configuration.allowPartialInstall) {
      remedy.setBeingInstalledRelaxedWeight(LOW_WEIGHT);
    } else {
      remedy.setBeingInstalledRelaxedWeight(ZERO_WEIGHT);
    }
    computeRemedyDetails(remedy);
    return remedy;
  }
 public void setCurrentRemedy(Remedy currentRemedy) {
   this.currentRemedy = currentRemedy;
   request = currentRemedy == null ? null : currentRemedy.getRequest();
 }