code: public void clearUserMetadata() {
          // Copy keys into array to avoid concurrent modification exceptions
          // if any PropertyChangeListeners should modify user metadata during
          // clear operation.
          final Object[] keys = userMetadata.keySet().toArray();
          for(int i = keys.length - 1;i >= 0;i--) {
              final Object old = userMetadata.remove(keys[i]);
              if(old != null) {
                  firePropertyChange((String)keys[i], old, null);
              }
          }
      }
docs: Clears all custom metadata associated with this property.  A property
  change event will be fired for every <code>key</code> that contained a
  non-null value before this method was invoked.  It is possible for a
  PropertyChangeListener to mutate user metadata, by setting a key value
  for example, in response to one of these property change events fired
  during the course of the clear operation.  Because of this, there is
  no guarantee that all user metadata is in fact completely clear and
  empty by the time this method returns.