package ru.hflabs.rcd.model;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import ru.hflabs.rcd.model.change.ChangeType;
import ru.hflabs.rcd.model.change.History;
import ru.hflabs.rcd.model.document.Dictionary;
import ru.hflabs.rcd.model.document.*;
import ru.hflabs.rcd.model.rule.RecodeRule;
import ru.hflabs.rcd.model.rule.RecodeRuleSet;
import ru.hflabs.rcd.model.task.TaskDescriptor;
import ru.hflabs.rcd.model.task.TaskResultStatus;
import ru.hflabs.util.core.Pair;
import java.util.*;
import static ru.hflabs.rcd.accessor.Accessors.*;
import static ru.hflabs.rcd.model.ModelUtils.*;
/**
* Класс <class>MockFactory</class> реализует фабрику создания <i>mock</i> объектов
*/
public abstract class MockFactory {
protected MockFactory() {
}
public static History createMockHistory() {
final History history = new History();
history.setId(UUID.randomUUID().toString());
history.setEventType(ChangeType.IGNORE);
history.setEventDate(new Date());
return history;
}
private static <T extends DocumentTemplate> T generateDocumentTemplate(T document) {
document.injectId(UUID.randomUUID().toString());
document.setHistory(createMockHistory());
return document;
}
public static Group createMockGroup() {
final Group group = generateDocumentTemplate(new Group());
group.setName(UUID.randomUUID().toString());
group.setDescription(UUID.randomUUID().toString());
group.setOwner(UUID.randomUUID().toString());
return group;
}
public static Dictionary createMockDictionary(Group group) {
final Dictionary dictionary = generateDocumentTemplate(new Dictionary());
dictionary.setName(UUID.randomUUID().toString());
dictionary.setDescription(UUID.randomUUID().toString());
return linkRelative(group, dictionary);
}
public static MetaField createMockMetaField(Dictionary dictionary) {
final MetaField metaField = generateDocumentTemplate(new MetaField());
metaField.setName(UUID.randomUUID().toString());
metaField.setDescription(UUID.randomUUID().toString());
return linkRelative(dictionary, metaField);
}
public static Pair<Collection<MetaField>, Collection<Record>> createMockRecords(Dictionary dictionary, int metaFieldCount, int recordCount) {
Collection<MetaField> metaFields = new ArrayList<>(metaFieldCount);
for (int i = 0; i < metaFieldCount; i++) {
metaFields.add(createMockMetaField(dictionary));
}
Collection<Field> fields = new ArrayList<>(metaFieldCount * recordCount);
for (int i = 0; i < recordCount; i++) {
for (MetaField metaField : metaFields) {
Field field = createMockField(metaField);
field.setName(String.valueOf(i));
fields.add(field);
}
}
return Pair.valueOf(metaFields, createRecords(dictionary.getId(), metaFields, fields));
}
public static Field createMockField(MetaField metaField) {
final Field field = generateDocumentTemplate(new Field());
field.setName(UUID.randomUUID().toString());
field.setValue(UUID.randomUUID().toString());
return linkRelative(metaField, field);
}
public static Group generateMockGroup(String groupName, int dictionaryCount, int metaFieldCount, int rowCount) {
Group group = createMockGroup();
group.setName(groupName);
{
Collection<Dictionary> dictionaries = new ArrayList<>(dictionaryCount);
for (int i = 0; i < dictionaryCount; i++) {
Dictionary dictionary = createMockDictionary(group);
dictionary = injectName(dictionary, groupName + "_" + i);
Pair<Collection<MetaField>, Collection<Record>> records = createMockRecords(dictionary, metaFieldCount, rowCount);
dictionary.setDescendants(records.first);
dictionary.setRecords(records.second);
dictionaries.add(dictionary);
}
group = linkDescendants(group, dictionaries);
}
return group;
}
public static RecodeRuleSet createMockRecodeRuleSet() {
MetaField fromMetaField = createMockMetaField(createMockDictionary(createMockGroup()));
MetaField toMetaField = createMockMetaField(createMockDictionary(createMockGroup()));
Field defaultField = createMockField(toMetaField);
return createMockRecodeRuleSet(fromMetaField, toMetaField, defaultField);
}
public static RecodeRuleSet createMockRecodeRuleSet(MetaField fromMetaField, MetaField toMetaField, Field defaultField) {
return generateDocumentTemplate(new RecodeRuleSet())
.injectFromNamedPath(createMetaFieldNamedPath(fromMetaField))
.injectFrom(fromMetaField)
.injectToNamedPath(createMetaFieldNamedPath(toMetaField))
.injectTo(toMetaField)
.injectDefaultField(defaultField);
}
public static RecodeRule createMockRecodeRule(RecodeRuleSet ruleSet, Field fromField, Field toField) {
return generateDocumentTemplate(new RecodeRule())
.injectRecodeRuleSet(ruleSet)
.injectFromNamedPath(createFieldNamedPath(fromField))
.injectFrom(fromField)
.injectToNamedPath(createFieldNamedPath(toField))
.injectTo(toField);
}
public static Map<String, Object> createMockTaskParameters() {
return Maps.newLinkedHashMap(
ImmutableMap.<String, Object>builder()
.put("stringValue", "string")
.put("longValue", 0L)
.put("integerValue", 0)
.put("dateValue", new Date().getTime())
.put("enumValue", TaskResultStatus.UNKNOWN.name())
.build()
);
}
public static TaskDescriptor createMockTaskDescriptor() {
final TaskDescriptor taskDescriptor = generateDocumentTemplate(new TaskDescriptor());
taskDescriptor.setName("mockTaskPerformer");
taskDescriptor.setDescription(UUID.randomUUID().toString());
taskDescriptor.setCron("* * * * *");
taskDescriptor.setNextScheduledDate(new Date());
taskDescriptor.setParameters(createMockTaskParameters());
return taskDescriptor;
}
}