code: public void upsert(final AbstractHtml tag, final String key,
              final WffBMObject bmObject)
              throws InvalidTagException, NullValueException {
          if (tag == null) {
              throw new NullValueException("tag cannot be null");
          }
          if (tag instanceof NoTag) {
              throw new InvalidTagException(
                      "NoTag and Blank tag are not allowed to use");
          }
          if (key == null) {
              throw new NullValueException("key cannot be null");
          }
          if (bmObject == null) {
              throw new NullValueException("bmObject cannot be null");
          }
  
          if (!browserPage.contains(tag)) {
              throw new InvalidTagException(
                      "The given tag is not available in the corresponding browserPage instance.");
          }
  
          AbstractHtmlRepository.addWffData(tag, key, bmObject);
      }
docs: Inserts or replaces (if already exists) the key bmObject pair in the
  wffObjects property of tag. The conventional JavaScript object of
  {@code WffBMObject} will be set to the {@code wffObjects} property of the
  given tag at client side.
  
  @param tag
  the tag object on which the given bmObject to be set.
  @param key
  key to set in wffObjects property of the tag.
  @param bmObject
  @throws InvalidTagException
  if the given instance is of NoTag / Blank
  @throws NullValueException
  if tag, key or bmObject is null
  @since 2.1.8
  @author WFF