code: public URL getRevocationURL() throws MalformedURLException {
          final var revocationURLTemplate = license.get(REVOCATION_URL) == null ? null : license.get(REVOCATION_URL).getString();
          final String revocationURL;
          if (revocationURLTemplate != null) {
              final var id = Optional.ofNullable(license.getLicenseId()).orElse(license.fingerprint());
              if (id != null) {
                  return new URL(revocationURLTemplate.replaceAll("\\$\\{licenseId}", id.toString()));
              } else {
                  return new URL(revocationURLTemplate);
              }
          } else {
              return null;
          }
      }
docs: Get the revocation URL of the license. This feature is stored in the
  license under the name {@code revocationUrl}. This URL may contain the
  string <code>${licenseId}</code> which is replaced by the actual license
  ID. Thus there is no need to wire into the revocation URL the license ID.
  <p>
  If there is no license id defined in the license then the place holder
  will be replaced using the fingerprint of the license.
  
  @return the revocation URL with the license id place holder filled in, or {@code null} if there is no
  revocation URL template defined in the license.
  @throws MalformedURLException when the revocation url is not well formatted