/**
  * Considers variant1 greater then other if, for the same variant category level, the value of the
  * {@link VariantValueCategoryModel} belonging to variant1 has a bigger sequence then the {@link
  * VariantValueCategoryModel} belonging to variant2.
  */
 @Override
 public int compare(
     final GenericVariantProductModel variant1, final GenericVariantProductModel variant2) {
   if ((variant1 != null) && (variant2 != null)) {
     // get sorted list of VariantValueCategories
     final List<VariantValueCategoryModel> variantValueCategories1 =
         getVariantValuesCategories(variant1);
     final List<VariantValueCategoryModel> variantValueCategories2 =
         getVariantValuesCategories(variant2);
     if (variantValueCategories1.size() == variantValueCategories2.size()) {
       int compare = 0;
       for (int i = 0; i < variantValueCategories1.size(); i++) {
         final VariantValueCategoryModel valueCategory1 = variantValueCategories1.get(i);
         final VariantValueCategoryModel valueCategory2 = variantValueCategories2.get(i);
         compare = Integer.compare(valueCategory1.getSequence(), valueCategory2.getSequence());
         if (compare != 0) {
           break;
         }
       }
       return compare;
     } else {
       throw new IllegalArgumentException(
           "Variants should have the same number of category levels to be compared!");
     }
   } else {
     throw new IllegalArgumentException("Cannot compare null variants!");
   }
 }
  @Override
  public void populate(
      final VariantValueCategoryModel variantValueCategory,
      final VariantMatrixElementData variantMatrixElementData)
      throws ConversionException {
    final VariantCategoryData parent = new VariantCategoryData();

    final VariantCategoryModel variantCategoryModel =
        (VariantCategoryModel) variantValueCategory.getSupercategories().get(0);
    parent.setName(variantCategoryModel.getName());
    parent.setHasImage(variantCategoryModel.getHasImage());

    final VariantValueCategoryData data = new VariantValueCategoryData();
    data.setName(variantValueCategory.getName());
    data.setSequence(variantValueCategory.getSequence());

    variantMatrixElementData.setVariantValueCategory(data);
    variantMatrixElementData.setParentVariantCategory(parent);

    final VariantOptionData variantOptionData = new VariantOptionData();
    final VariantOptionQualifierData variantOptionQualifierData = new VariantOptionQualifierData();
    variantOptionQualifierData.setImage(new ImageData());
    variantOptionData.setVariantOptionQualifiers(
        Arrays.asList(new VariantOptionQualifierData[] {variantOptionQualifierData}));

    variantMatrixElementData.setVariantOption(variantOptionData);
  }