package ru.hflabs.rcd.model.rule; import lombok.Getter; import lombok.Setter; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import ru.hflabs.rcd.model.Essence; import ru.hflabs.rcd.model.document.DocumentTemplate; import ru.hflabs.rcd.model.path.MetaFieldNamedPath; import javax.validation.constraints.Size; /** * Класс <class>Rule</class> реализует базовый класс, содержащий информацию о именнованных путях источника и назначения правила * * @see MetaFieldNamedPath */ @Getter @Setter public abstract class Rule<NP extends MetaFieldNamedPath, T extends Essence, R extends Rule<NP, T, R>> extends DocumentTemplate { private static final long serialVersionUID = 541728175712087915L; /* * Название полей с идентификаторами */ public static final String FROM_PREFIX = "from"; public static final String TO_PREFIX = "to"; public static final String FIELD_ID = "FieldId"; public static final String FIELD_NAME = "FieldName"; public static final String NAMED_PATH = "NamedPath"; public static final String FROM_PATH = FROM_PREFIX + NAMED_PATH; public static final String FROM_FIELD_ID = FROM_PREFIX + FIELD_ID; public static final String TO_PATH = TO_PREFIX + NAMED_PATH; public static final String TO_FIELD_ID = TO_PREFIX + FIELD_ID; /** Именованный путь, идентифицирующий исходную запись */ private NP fromNamedPath; /** Идентификатор поля исходной записи */ @Size(max = PRIMARY_KEY_MAX_SIZE) private String fromFieldId; /** Значение исходной записи */ private transient T from; /** Именованный путь, идентифицирующий целевую запись */ private NP toNamedPath; /** Идентификатор поля целевой записи */ @Size(max = PRIMARY_KEY_MAX_SIZE) private String toFieldId; /** Значение целевой записи */ private transient T to; @SuppressWarnings("unchecked") public R injectFromNamedPath(NP namedPath) { setFromNamedPath(namedPath); return (R) this; } @SuppressWarnings("unchecked") public R injectFrom(T relativeFrom) { setFrom(relativeFrom); setFromFieldId(relativeFrom != null ? relativeFrom.getId() : null); return (R) this; } @SuppressWarnings("unchecked") public R injectToNamedPath(NP namedPath) { setToNamedPath(namedPath); return (R) this; } @SuppressWarnings("unchecked") public R injectTo(T relativeTo) { setTo(relativeTo); setToFieldId(relativeTo != null ? relativeTo.getId() : null); return (R) this; } @Override @SuppressWarnings("unchecked") public <E> E copy() { Rule<NP, T, R> cloned = super.copy(); cloned.setFromNamedPath(fromNamedPath != null ? (NP) fromNamedPath.copy() : null); cloned.setFrom(from != null ? (T) from.copy() : null); cloned.setToNamedPath(toNamedPath != null ? (NP) toNamedPath.copy() : null); cloned.setTo(to != null ? (T) to.copy() : null); return (E) cloned; } @Override public int hashCode() { int result = super.hashCode(); result = 31 * result + (fromFieldId != null ? fromFieldId.hashCode() : 0); result = 31 * result + (fromNamedPath != null ? fromNamedPath.hashCode() : 0); result = 31 * result + (toFieldId != null ? toFieldId.hashCode() : 0); result = 31 * result + (toNamedPath != null ? toNamedPath.hashCode() : 0); return result; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } if (!super.equals(o)) { return false; } Rule rule = (Rule) o; if (fromFieldId != null ? !fromFieldId.equals(rule.fromFieldId) : rule.fromFieldId != null) { return false; } if (fromNamedPath != null ? !fromNamedPath.equals(rule.fromNamedPath) : rule.fromNamedPath != null) { return false; } if (toFieldId != null ? !toFieldId.equals(rule.toFieldId) : rule.toFieldId != null) { return false; } if (toNamedPath != null ? !toNamedPath.equals(rule.toNamedPath) : rule.toNamedPath != null) { return false; } return true; } @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) .appendSuper(super.toString()) .append(FROM_PREFIX, getFromNamedPath()) .append(TO_PREFIX, getToNamedPath()) .toString(); } }