public String resolveEquals(DataObject dataObject, String indent) {

    StringBuilder head = new StringBuilder();
    // head.append(EOL);
    head.append(indent + "@Override" + EOL);
    head.append(indent + "public boolean equals(Object o) {" + EOL);
    head.append(indent + TAB + "if (this == o) return true;" + EOL);
    head.append(indent + TAB + "if (o == null || getClass() != o.getClass()) return false;" + EOL);
    head.append(
        indent
            + TAB
            + dataObject.getClassName()
            + " that = ("
            + dataObject.getClassName()
            + ")o;"
            + EOL);

    StringBuilder end = new StringBuilder();
    end.append(indent + "}");

    StringBuilder sb = new StringBuilder();
    Map<String, ObjectProperty> props = dataObject.getProperties();

    boolean hasTerms = false;
    if (props != null && props.size() > 0) {
      for (String propName : props.keySet()) {
        ObjectProperty prop = props.get(propName);
        String _propName = toJavaVar(propName);
        if (prop.getAnnotation(org.kie.api.definition.type.Key.class.getName()) != null) {
          // Construction: "if (<_propName> != null ? !<_propName>.equals(that.<_propName>) :
          // that.<_propName> != null) return false;"
          sb.append(indent + TAB + "if (");
          sb.append(_propName)
              .append(" != null ? !")
              .append(_propName)
              .append(".equals(that.")
              .append(_propName)
              .append(")");
          sb.append(" : that.").append(_propName).append(" != null").append(") return false;");
          sb.append(EOL);
          hasTerms = true;
        }
      }
    }

    if (hasTerms) {
      sb.append(indent + TAB + "return true;" + EOL);
      head.append(sb);
      head.append(end);
      return head.toString();
    } else {
      return "";
    }
  }