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 org.springframework.util.StringUtils; import ru.hflabs.rcd.model.ManyToOne; import ru.hflabs.rcd.model.Named; import ru.hflabs.rcd.model.annotation.Hashed; import ru.hflabs.rcd.model.annotation.Indexed; import ru.hflabs.rcd.model.document.Dictionary; import ru.hflabs.rcd.model.document.Field; import ru.hflabs.rcd.model.document.MetaField; import ru.hflabs.rcd.model.path.FieldNamedPath; import ru.hflabs.rcd.model.path.MetaFieldNamedPath; import ru.hflabs.util.core.EqualsUtil; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlTransient; import java.util.Collection; import static ru.hflabs.util.core.EqualsUtil.lowerCaseEquals; /** * Класс <class>RecodeRuleSet</class> описывает набор правил перекодирования из одной исходной системы в другую * * @see RecodeRule */ @Getter @Setter @Indexed( id = RecodeRuleSet.PRIMARY_KEY, fields = { @Indexed.Field(RecodeRuleSet.HISTORY_ID), @Indexed.Field(RecodeRuleSet.CHANGE_TYPE), @Indexed.Field(RecodeRuleSet.CHANGE_DATE), @Indexed.Field(RecodeRuleSet.NAME), @Indexed.Field(RecodeRuleSet.DEFAULT_FIELD_ID), // From fields @Indexed.Field(value = RecodeRuleSet.FROM_GROUP_ID, alias = Dictionary.GROUP_ID), @Indexed.Field(value = RecodeRuleSet.FROM_GROUP_NAME, alias = MetaFieldNamedPath.GROUP_NAME), @Indexed.Field(value = RecodeRuleSet.FROM_DICTIONARY_ID, alias = MetaField.DICTIONARY_ID), @Indexed.Field(value = RecodeRuleSet.FROM_DICTIONARY_NAME, alias = MetaFieldNamedPath.DICTIONARY_NAME), @Indexed.Field(value = RecodeRuleSet.FROM_FIELD_ID, alias = RecodeRuleSet.FIELD_ID), @Indexed.Field(value = RecodeRuleSet.FROM_FIELD_NAME, alias = MetaFieldNamedPath.FIELD_NAME), // To fields @Indexed.Field(value = RecodeRuleSet.TO_GROUP_ID, alias = Dictionary.GROUP_ID), @Indexed.Field(value = RecodeRuleSet.TO_GROUP_NAME, alias = MetaFieldNamedPath.GROUP_NAME), @Indexed.Field(value = RecodeRuleSet.TO_DICTIONARY_ID, alias = MetaField.DICTIONARY_ID), @Indexed.Field(value = RecodeRuleSet.TO_DICTIONARY_NAME, alias = MetaFieldNamedPath.DICTIONARY_NAME), @Indexed.Field(value = RecodeRuleSet.TO_FIELD_ID, alias = RecodeRuleSet.FIELD_ID), @Indexed.Field(value = RecodeRuleSet.TO_FIELD_NAME, alias = MetaFieldNamedPath.FIELD_NAME) } ) @Hashed(ignore = {RecodeRuleSet.PRIMARY_KEY, RecodeRuleSet.HISTORY_ID, RecodeRuleSet.FROM_PATH, RecodeRuleSet.TO_PATH, RecodeRuleSet.DEFAULT_PATH}) public class RecodeRuleSet extends Rule<MetaFieldNamedPath, MetaField, RecodeRuleSet> implements ManyToOne<Field>, Named { private static final long serialVersionUID = 888521687570738565L; /* * Постфиксы полей */ private static final String GROUP_ID = "GroupId"; private static final String GROUP_NAME = "GroupName"; private static final String DICTIONARY_ID = "DictionaryId"; private static final String DICTIONARY_NAME = "DictionaryName"; /* * Название полей с идентификаторами */ public static final String FROM_GROUP_ID = FROM_PREFIX + GROUP_ID; public static final String FROM_GROUP_NAME = FROM_PREFIX + GROUP_NAME; public static final String FROM_DICTIONARY_ID = FROM_PREFIX + DICTIONARY_ID; public static final String FROM_DICTIONARY_NAME = FROM_PREFIX + DICTIONARY_NAME; public static final String FROM_FIELD_NAME = FROM_PREFIX + FIELD_NAME; public static final String TO_GROUP_ID = TO_PREFIX + GROUP_ID; public static final String TO_GROUP_NAME = TO_PREFIX + GROUP_NAME; public static final String TO_DICTIONARY_ID = TO_PREFIX + DICTIONARY_ID; public static final String TO_DICTIONARY_NAME = TO_PREFIX + DICTIONARY_NAME; public static final String TO_FIELD_NAME = TO_PREFIX + FIELD_NAME; public static final String DEFAULT_PATH = "defaultPath"; public static final String DEFAULT_FIELD_ID = "default" + FIELD_ID; /** Символическое название набора правил перекодирования */ @Size(min = NAME_MIN_SIZE, max = NAME_MAX_SIZE) private String name; /** Именованный путь значения по умолчанию */ private FieldNamedPath defaultPath; /** Идентификатор поля для перекодировки по умолчанию */ @Size(max = PRIMARY_KEY_MAX_SIZE) private String defaultFieldId; /** Поле перекодировки по умолчанию */ private transient Field relative; /** Коллекция правил перекодирования */ private Collection<RecodeRule> recodeRules; @Override public void injectId(String targetId) { super.injectId(targetId); // Если название набора не заполнено, то устанавливаем его равным идентификатору if (!StringUtils.hasText(getName())) { setName(getId()); } } @XmlTransient public FieldNamedPath getDefaultPath() { return defaultPath; } @Override public String getRelativeId() { return getDefaultFieldId(); } @Override public void setRelative(Field relative) { this.relative = relative; setDefaultFieldId(this.relative != null ? this.relative.getId() : null); } public RecodeRuleSet injectDefaultField(Field relativeDefaultField) { setRelative(relativeDefaultField); return this; } @XmlTransient public Collection<RecodeRule> getRecodeRules() { return recodeRules; } public String getFromGroupId() { return getFrom() != null && getFrom().getRelative() != null ? getFrom().getRelative().getGroupId() : null; } public String getFromGroupName() { return getFromNamedPath() != null ? getFromNamedPath().getGroupName() : null; } public String getFromDictionaryId() { return getFrom() != null ? getFrom().getDictionaryId() : null; } public String getFromDictionaryName() { return getFromNamedPath() != null ? getFromNamedPath().getDictionaryName() : null; } public String getFromFieldName() { return getFromNamedPath() != null ? getFromNamedPath().getFieldName() : null; } public String getToGroupId() { return getTo() != null && getTo().getRelative() != null ? getTo().getRelative().getGroupId() : null; } public String getToGroupName() { return getToNamedPath() != null ? getToNamedPath().getGroupName() : null; } public String getToDictionaryId() { return getTo() != null ? getTo().getDictionaryId() : null; } public String getToDictionaryName() { return getToNamedPath() != null ? getToNamedPath().getDictionaryName() : null; } public String getToFieldName() { return getToNamedPath() != null ? getToNamedPath().getFieldName() : null; } @Override public int hashCode() { int result = super.hashCode(); result = 31 * result + EqualsUtil.lowerCaseHashCode(name); result = 31 * result + (defaultFieldId != null ? defaultFieldId.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; } RecodeRuleSet ruleSet = (RecodeRuleSet) o; if (!lowerCaseEquals(name, ruleSet.name)) { return false; } if (defaultFieldId != null ? !defaultFieldId.equals(ruleSet.defaultFieldId) : ruleSet.defaultFieldId != null) { return false; } if (defaultPath != null ? !defaultPath.equals(ruleSet.defaultPath) : ruleSet.defaultPath != null) { return false; } return true; } @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) .appendSuper(super.toString()) .append(DEFAULT_FIELD_ID, getDefaultFieldId()) .toString(); } }