code: public static List parseAppliesTo(String appliesTo) {
          List matches = new ArrayList();
  
          if (appliesTo != null) {
              boolean quoted = false;
              int index = 0;
              ProductMatch match = new ProductMatch();
              for (int i = 0; i < appliesTo.length(); i++) {
                  char c = appliesTo.charAt(i);
                  if (c == '"') {
                      quoted = !quoted;
                  }
                  if (!quoted) {
                      if (c == ',') {
                          match.add(appliesTo.substring(index, i));
                          index = i + 1;
                          matches.add(match);
                          match = new ProductMatch();
                      } else if (c == ';') {
                          match.add(appliesTo.substring(index, i));
                          index = i + 1;
                      }
                  }
              }
  
              match.add(appliesTo.substring(index));
              matches.add(match);
          }
          return matches;
      }
docs: <p>This method will parse an applies to string to load a list of {@link ProductMatch} objects. If the applies to string is not a valid applies to string an empty list will
  be returned.</p>
  
  @param appliesTo The string to construct the {@link ProductMatch} objects from. It is a comma separated list of items in the form:</p>
  <code>{product_id}; productVersion={product_version}; productInstallType={product_install_type}; productEdition={product_edition(s)}</code></p>
  Note that the {product_edition(s)} can be either a single edition or a comma separated list of editions enclosed in quotes. For example the following is
  a valid
  applies to string:</p>
  <code>com.ibm.websphere.appserver; productVersion=8.5.next.beta; productInstallType=Archive; productEdition="BASE,DEVELOPERS,EXPRESS,ND"</code>
  @return A list of {@link ProductMatch} objects or an empty list if none are found