/**
  * Get string representation of the constraint
  *
  * @param constraint
  * @return
  */
 public static String getConstraintString(IConstraint constraint) {
   String type = constraint.getType();
   // only this two supported for the moment
   if (type.equals(IConstraint.REQUIRES) || type.equals(IConstraint.MUTUALLY_EXCLUDES)) {
     String text = validFeatureName(constraint.getBlock1().getName()) + " implies ";
     if (type.equals(IConstraint.MUTUALLY_EXCLUDES)) {
       text += "not ";
     }
     text += validFeatureName(constraint.getBlock2().getName());
     return text;
   }
   return constraint.getText();
 }
 public static int getNumberOfReasonsOfRequiresConstraint(
     List<IConstraint> constraints, Feature f1, Feature f2) {
   for (IConstraint constraint : constraints) {
     if (constraint.getType().equals(IConstraint.REQUIRES)) {
       if (f1.getName().equals(FeatureIDEUtils.validFeatureName(constraint.getBlock1().getName()))
           && f2.getName()
               .equals(FeatureIDEUtils.validFeatureName(constraint.getBlock2().getName()))) {
         return constraint.getNumberOfReasons();
       }
     }
   }
   return -1;
 }
 public static boolean existsRequiresConstraint(
     List<IConstraint> constraints, Feature f1, Feature f2) {
   for (IConstraint constraint : constraints) {
     if (constraint.getType().equals(IConstraint.REQUIRES)) {
       if (f1.getName().equals(FeatureIDEUtils.validFeatureName(constraint.getBlock1().getName()))
           && f2.getName()
               .equals(FeatureIDEUtils.validFeatureName(constraint.getBlock2().getName()))) {
         return true;
       }
     }
   }
   return false;
 }
 public static List<Feature> getFeatureRequiredFeatures(
     FeatureModel fm, List<IConstraint> constraints, Feature f1) {
   List<Feature> required = new ArrayList<Feature>();
   for (IConstraint constraint : constraints) {
     if (constraint.getType().equals(IConstraint.REQUIRES)) {
       if (f1.getName()
           .equals(FeatureIDEUtils.validFeatureName(constraint.getBlock1().getName()))) {
         required.add(
             fm.getFeature(FeatureIDEUtils.validFeatureName(constraint.getBlock2().getName())));
       }
     }
   }
   return required;
 }
 public static boolean existsExcludeConstraint(
     List<IConstraint> constraints, Feature f1, Feature f2) {
   for (IConstraint constraint : constraints) {
     if (constraint.getType().equals(IConstraint.MUTUALLY_EXCLUDES)) {
       // check f1 excludes f2 and viceversa
       if (f1.getName().equals(FeatureIDEUtils.validFeatureName(constraint.getBlock1().getName()))
           && f2.getName()
               .equals(FeatureIDEUtils.validFeatureName(constraint.getBlock2().getName()))) {
         return true;
       } else if (f2.getName()
               .equals(FeatureIDEUtils.validFeatureName(constraint.getBlock1().getName()))
           && f1.getName()
               .equals(FeatureIDEUtils.validFeatureName(constraint.getBlock2().getName()))) {
         return true;
       }
     }
   }
   return false;
 }