code: protected static Cpe parse22(String cpeString, boolean lenient) throws CpeParsingException {
          if (cpeString == null || cpeString.isEmpty()) {
              throw new CpeParsingException("CPE String is null ir enpty - unable to parse");
          }
          CpeBuilder cb = new CpeBuilder();
          String[] parts = cpeString.split(":");
          if (parts.length <= 1 || parts.length > 8) {
              throw new CpeParsingException("CPE String is invalid - too many components specified: " + cpeString);
          }
          if (parts[1].length() != 2) {
              throw new CpeParsingException("CPE String contains a malformed part: " + cpeString);
          }
          try {
              cb.part(parts[1].substring(1));
              if (parts.length > 2) {
                  cb.wfVendor(Convert.cpeUriToWellFormed(parts[2], lenient));
              }
              if (parts.length > 3) {
                  cb.wfProduct(Convert.cpeUriToWellFormed(parts[3], lenient));
              }
              if (parts.length > 4) {
                  cb.wfVersion(Convert.cpeUriToWellFormed(parts[4], lenient));
              }
              if (parts.length > 5) {
                  cb.wfUpdate(Convert.cpeUriToWellFormed(parts[5], lenient));
              }
              if (parts.length > 6) {
                  unpackEdition(parts[6], cb, lenient);
              }
              if (parts.length > 7) {
                  cb.wfLanguage(Convert.cpeUriToWellFormed(parts[7], lenient));
              }
              return cb.build();
          } catch (CpeValidationException | CpeEncodingException ex) {
              throw new CpeParsingException(ex.getMessage());
          }
      }
docs: Parses a CPE 2.2 URI.
  
  @param cpeString the CPE string to parse
  @param lenient when <code>true</code> the parser will put in lenient mode
  attempting to parse invalid CPE values.
  @return the CPE object represented by the cpeString
  @throws CpeParsingException thrown if the cpeString is invalid