file-transformer-docx/core/src/main/java/eu/eudat/file/transformer/services/visibility/VisibilityRuleServiceImpl.java

74 lines
3.2 KiB
Java

package eu.eudat.file.transformer.services.visibility;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import eu.eudat.file.transformer.entities.user.components.commons.Rule;
import eu.eudat.file.transformer.model.descriptionproperties.Field;
import eu.eudat.file.transformer.model.descriptionproperties.PropertyDefinition;
import java.util.*;
/**
* Created by ikalyvas on 3/5/2018.
*/
public class VisibilityRuleServiceImpl implements VisibilityRuleService {
private final Map<String, Boolean> elementVisibility = new HashMap<>();
private PropertyDefinition properties;
private ObjectMapper mapper;
public VisibilityRuleServiceImpl() {
this.mapper = new ObjectMapper();
}
public boolean isElementVisible(String id) {
return !this.elementVisibility.containsKey(id) || this.elementVisibility.get(id);
}
public void setProperties(PropertyDefinition properties) {
this.properties = properties;
/*this.properties.entrySet().stream()
.filter(stringObjectEntry -> stringObjectEntry.getValue() instanceof String && ((String) stringObjectEntry.getValue()).startsWith("[")
&& ((String) stringObjectEntry.getValue()).endsWith("]"))
.forEach(stringObjectEntry -> stringObjectEntry.setValue(parseArray((String) stringObjectEntry.getValue())));*/
}
private List<String> parseArray(String original) {
String parsed = original.replace("[", "").replace("\"", "").replace("]", "");
return Arrays.asList(parsed.split(","));
}
public void buildVisibilityContext(List<Rule> sources) {
VisibilityContext visibilityContext = new VisibilityContext();
visibilityContext.buildVisibilityContext(sources);
visibilityContext.getVisibilityRules().forEach(this::evaluateVisibility);
}
private void evaluateVisibility(VisibilityRule rule) {
List<VisibilityRuleSource> sources = rule.getVisibilityRuleSources();
for(VisibilityRuleSource source: sources){
Field fieldFileModel = properties.getFields().stream().filter(fieldFileModel1 -> fieldFileModel1.getKey().equals(source.getVisibilityRuleSourceId())).findFirst().orElse(null);
if (fieldFileModel != null
&& isContained(fieldFileModel, source.getVisibilityRuleSourceValue())) {
this.elementVisibility.put(rule.getVisibilityRuleTargetId(), true);
} else {
this.elementVisibility.put(rule.getVisibilityRuleTargetId(),
this.elementVisibility.getOrDefault(rule.getVisibilityRuleTargetId(), false));
}
}
}
private Boolean isContained(Field values, String source) {
try {
Object value = mapper.readValue(values.getValue(), Object.class);
if (value instanceof Collection) {
return ((Collection<?>) value).contains(source);
} else {
if (value != null) {
return value.toString().equals(source);
}
return false;
}
} catch (JsonProcessingException e) {
return false;
}
}
}