package ru.hflabs.rcd.service.document.recodeRuleSet;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import ru.hflabs.rcd.accessor.Accessors;
import ru.hflabs.rcd.accessor.FieldAccessor;
import ru.hflabs.rcd.model.Essence;
import ru.hflabs.rcd.model.document.Dictionary;
import ru.hflabs.rcd.model.document.Field;
import ru.hflabs.rcd.model.document.Group;
import ru.hflabs.rcd.model.document.MetaField;
import ru.hflabs.rcd.model.path.MetaFieldNamedPath;
import ru.hflabs.rcd.model.rule.RecodeRuleSet;
import ru.hflabs.rcd.service.IMergeService;
import ru.hflabs.rcd.service.document.RuleActualizeService;
import java.util.Collection;
import java.util.Map;
import static ru.hflabs.rcd.accessor.Accessors.*;
import static ru.hflabs.rcd.model.ModelUtils.ID_FUNCTION;
/**
* Класс <class>RecodeRuleSetActualizeService</class> реализует сервис актуализации наборов правил перекодирования по изменившимся зависимостям
*
* @author Nazin Alexander
* @see Accessors
*/
public class RecodeRuleSetActualizeService<T extends Essence> extends RuleActualizeService<T, MetaFieldNamedPath, MetaField, RecodeRuleSet> {
/** Сервис обновления правил перекодирования по изменившимся группам справочников */
public static final RecodeRuleSetActualizeService<Group> BY_GROUP = new RecodeRuleSetActualizeService<>(
GROUP_TO_META_FIELD_INJECTOR
);
/** Сервис обновления правил перекодирования по изменившимся справочникам */
public static final RecodeRuleSetActualizeService<Dictionary> BY_DICTIONARY = new RecodeRuleSetActualizeService<>(
DICTIONARY_TO_META_FIELD_INJECTOR
);
/** Сервис обновления правил перекодирования по изменившимся МЕТА-полям */
public static final RecodeRuleSetActualizeService<MetaField> BY_META_FIELD = new RecodeRuleSetActualizeService<>(
Accessors.<MetaField>identity()
);
/** Сервис обновления полей перекодирования по умолчанию */
public static final ByFieldActualizeService BY_DEFAULT_FIELD = new ByFieldActualizeService();
public RecodeRuleSetActualizeService(FieldAccessor<T, MetaField> dependencyAccessor) {
super(dependencyAccessor, FROM_SET_INJECTOR, TO_SET_INJECTOR);
}
/**
* Класс <class>ByFieldActualizeService</class> реализует сервис актуализации полей перекодирования по умолчанию для наборов правил
*
* @author Nazin Alexander
*/
private static class ByFieldActualizeService implements IMergeService<Collection<Field>, Collection<RecodeRuleSet>, Collection<RecodeRuleSet>> {
@Override
public Collection<RecodeRuleSet> merge(Collection<Field> fields, Collection<RecodeRuleSet> rules) {
// Выполняем построение карты зависимых сущностей к их идентификаторам
Map<String, Field> id2fields = Maps.uniqueIndex(fields, ID_FUNCTION);
// Выполняем значений по умолчанию для правил
ImmutableList.Builder<RecodeRuleSet> result = ImmutableList.builder();
for (RecodeRuleSet ruleSet : rules) {
RecodeRuleSet changed = shallowClone(ruleSet);
// Актуализируем правило
changed = DEFAULT_SET_INJECTOR.inject(changed, id2fields.get(ruleSet.getDefaultFieldId()));
// Сохраняем обновленное значение
result.add(changed);
}
// Возвращаем обновленные правила
return result.build();
}
}
}