public static List<Variant> getPossibleVariants( Product product, Variant variant, String selectedAttribute) { List<Variant> matchingVariantList = new ArrayList<Variant>(); List<Attribute> desiredAttributes = new ArrayList<Attribute>(); for (Attribute attribute : variant.getAttributes()) { if (!selectedAttribute.equals(attribute.getName()) && hasMoreAttributeValues(product, attribute.getName())) { desiredAttributes.add(attribute); } } VariantList variantList = product.getVariants().byAttributes(desiredAttributes); for (Attribute attr : product.getVariants().getAvailableAttributes(selectedAttribute)) { if (variantList.byAttributes(attr).size() < 1) { matchingVariantList.add((product.getVariants().byAttributes(attr).first()).orNull()); } else { matchingVariantList.add((variantList.byAttributes(attr).first()).orNull()); } } matchingVariantList.removeAll(Collections.singleton(null)); return matchingVariantList; }