@Override
  public boolean equals(Object obj) {
    if (!super.equals(obj)) {
      return false;
    } else if (obj instanceof OperationData) {
      OperationData data = (OperationData) obj;

      // Check all string preferences
      // -------------------------------
      if (isPreferencesEqual(preference, data.getPreferences()) // Check preconditions
          && isResourceBookingEqual(data.getResourceBooking(), resourceBooking)
          && isPreconditionEqual(
              data.getSequenceCondition(), sequenceCondition) // Check postconditions
          && isResourceBookingEqual(data.getPResourceBooking(), pResourceBooking)
          && isPreconditionEqual(
              data.getPSequenceCondition(), pSequenceCondition) // Check invariant
          && isPreconditionEqual(data.getSeqInvariant(), seqInvariant)
          && isListEqual(data.getActions(), actions)) {

        return true;
      }
    }

    return false;
  }
  /**
   * Clone everything except id that is set to -1.
   *
   * @return
   */
  public Object clone() {
    OperationData ret = new OperationData(this.getName(), getId());

    if (getCopy()) {
      ret.setId(Model.newId());
      ret.setName(ret.getName() + "_" + ret.getId());
    }

    Set<String> keys = preference.keySet();

    for (String key : keys) {
      ret.setValue(key, getValue(key));
    }

    // Copy preconditions
    //        sequenceCondition

    ret.setSequenceCondition(cloneSequenceConditions(sequenceCondition));
    ret.setPSequenceCondition(cloneSequenceConditions(pSequenceCondition));

    ret.setSeqInvariant(cloneSequenceConditions(seqInvariant));

    ret.setResourceBooking(cloneResources(resourceBooking));
    ret.setPResourceBooking(cloneResources(pResourceBooking));

    ret.setActions(cloneActions(actions));
    return ret;
  }