package ru.hflabs.rcd.service.document.dictionary; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import org.springframework.util.StringUtils; import ru.hflabs.rcd.accessor.Accessors; import ru.hflabs.rcd.event.modify.ChangeEvent; import ru.hflabs.rcd.exception.search.document.UnknownDictionaryException; import ru.hflabs.rcd.model.document.Dictionary; import ru.hflabs.rcd.model.document.Group; import ru.hflabs.rcd.model.path.DictionaryNamedPath; import ru.hflabs.rcd.service.document.DocumentServiceTemplate; import ru.hflabs.rcd.service.document.IDictionaryService; import ru.hflabs.rcd.service.document.IGroupService; import ru.hflabs.util.core.Pair; import ru.hflabs.util.spring.Assert; import java.util.Collection; import static ru.hflabs.rcd.accessor.Accessors.linkRelative; import static ru.hflabs.rcd.model.CriteriaUtils.*; import static ru.hflabs.rcd.model.ModelUtils.validateDictionaryNamedPath; import static ru.hflabs.rcd.service.ServiceUtils.findUniqueDocumentBy; import static ru.hflabs.rcd.service.ServiceUtils.injectRelations; /** * Класс <class>DictionaryService</class> реализует сервис работы со справочниками * * @author Nazin Alexander */ public class DictionaryService extends DocumentServiceTemplate<Dictionary> implements IDictionaryService { /** Сервис поиска групп */ private IGroupService groupService; public DictionaryService() { super(Dictionary.class); } public void setGroupService(IGroupService groupService) { this.groupService = groupService; } @Override protected Collection<Dictionary> injectTransitiveDependencies(Collection<Dictionary> objects) { return super.injectTransitiveDependencies(injectRelations(objects, groupService)); } @Override public Pair<Dictionary, Collection<Group>> findMemberGroups(DictionaryNamedPath path, boolean quietly) { // Получаем целевой справочник final Dictionary dictionary = findUniqueByNamedPath(path, quietly); if (dictionary == null && quietly) { return null; } assert dictionary != null : "Unexpected NULL in dictionary instance"; // Получаем коллекцию групп, в которых содержится справочник с таким же названием Collection<Dictionary> dictionariesWithSameName = Collections2.filter( findAllByCriteria(createCriteriaByIDs(Dictionary.NAME, dictionary.getName()), true), new Predicate<Dictionary>() { @Override public boolean apply(Dictionary input) { return !dictionary.getGroupId().equals(input.getGroupId()); } } ); // Возвращаем сформированный результат return Pair.<Dictionary, Collection<Group>>valueOf( dictionary, Lists.newArrayList(Collections2.transform(dictionariesWithSameName, Accessors.GROUP_TO_DICTIONARY_INJECTOR)) ); } @Override public Dictionary findUniqueByRelativeId(String relativeId, String name, boolean fillTransitive, boolean quietly) { Dictionary result = findUniqueDocumentBy(this, createCriteriaByRelative(Dictionary.GROUP_ID, relativeId, Dictionary.NAME, name), fillTransitive); if (result == null && !quietly) { throw new UnknownDictionaryException(name); } return result; } @Override public Collection<Dictionary> findAllByRelativeId(String relativeId, String searchQuery, boolean fillTransitive) { Assert.isTrue(StringUtils.hasText(relativeId), "ID must not be NULL or EMPTY"); return findAllByCriteria(createCriteriaByIDs(Dictionary.GROUP_ID, relativeId).injectSearch(searchQuery), fillTransitive); } @Override public Dictionary findUniqueByNamedPath(DictionaryNamedPath path, boolean quietly) { validateDictionaryNamedPath(path); // Выполняем поиск группы по ее имени Group group = groupService.findUniqueByNamedPath(path.getGroupName(), quietly); if (group == null && quietly) { return null; } assert group != null : "Unexpected NULL in group instance"; // Выполняем поиск справочника по связанной группе Dictionary result = injectHistory(findUniqueByRelativeId(group.getId(), path.getDictionaryName(), false, quietly)); return linkRelative(group, result); } @Override protected void handleOtherCloseEvent(ChangeEvent event) { if (Group.class.equals(event.getChangedClass())) { closeByCriteria(createCriteriaByDocumentIDs(Dictionary.GROUP_ID, event.getChanged(Group.class))); } } }