code: static public Clauses parse(String header) {
          if (Strings.isNullOrEmpty(header)) {
              return new Clauses();
          }
  
          Clauses result = new Clauses();
          QuotedTokenizer qt = new QuotedTokenizer(header, ";=,");
          char del;
          do {
              boolean hadAttribute = false;
              Map<String, String> clause = new LinkedHashMap<>();
              List<String> aliases = new ArrayList<String>();
              aliases.add(qt.nextToken());
              del = qt.getSeparator();
              while (del == ';') {
                  String name = qt.nextToken();
                  if ((del = qt.getSeparator()) != '=') {
                      // Found an ; or , - it's valid if we didn't find an attribute.
                      if (hadAttribute) {
                          throw new IllegalArgumentException("Header contains name field after " +
                                  "attribute or directive: " + name + " from " + header);
                      }
                      aliases.add(name);
                  } else {
                      // Parse attribute or directive.
                      String value = qt.nextToken();
                      clause.put(name, value);
                      del = qt.getSeparator();
                      hadAttribute = true;
                  }
              }
              for (String packageName : aliases) {
                  if (result.containsKey(packageName)) {
                      LOGGER.warn("Duplicate package name in header: " + packageName
                              + ". Multiple package names in one clause are supported.");
                  } else {
                      result.put(packageName, clause);
                  }
              }
          } while (del == ',');
          return result;
      }
docs: Standard OSGi header parser. This parser can handle the format:
  <ul>
  <li>clauses ::= clause ( ',' clause ) +</li>
  <li>clause ::= name ( ';' name ) (';' key '=' value )</li>
  </ul>
  <p>
  The return structure is a Map of Map: <code>Map {name => Map {attribute | directive} => value}</code>.
  
  @param header the header to parse
  @return the clauses