@Override
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      }
      if (o == null || getClass() != o.getClass()) {
        return false;
      }

      TypedDirectionNamedPath that = (TypedDirectionNamedPath) o;

      if (notifyType != that.notifyType) {
        return false;
      }
      if (ruleSetName != null ? !ruleSetName.equals(that.ruleSetName) : that.ruleSetName != null) {
        return false;
      }
      if (!fromDictionaryNamedPath.equals(that.fromDictionaryNamedPath)) {
        return false;
      }
      if (!toDictionaryNamedPath.equals(that.toDictionaryNamedPath)) {
        return false;
      }
      if (fromValue != null ? !fromValue.equals(that.fromValue) : that.fromValue != null) {
        return false;
      }

      return true;
    }
 @Override
 public String toString() {
   return String.format(
       "%s: %s[%s] TO %s",
       notifyType,
       fromDictionaryNamedPath.toString(),
       fromValue,
       toDictionaryNamedPath.toString());
 }
 @Override
 public int hashCode() {
   int result = notifyType.hashCode();
   result = 31 * result + (ruleSetName != null ? ruleSetName.hashCode() : 0);
   result = 31 * result + fromDictionaryNamedPath.hashCode();
   result = 31 * result + toDictionaryNamedPath.hashCode();
   result = 31 * result + (fromValue != null ? fromValue.hashCode() : 0);
   return result;
 }