package rocks.inspectit.server.diagnosis.engine.rule.store;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
import rocks.inspectit.server.diagnosis.engine.rule.RuleOutput;
import rocks.inspectit.server.diagnosis.engine.tag.Tag;
import rocks.inspectit.server.diagnosis.engine.tag.TagState;
/**
* The default implementation of {@link IRuleOutputStorage}.
*
* @author Claudio Waldvogel, Alexander Wert
*/
public class DefaultRuleOutputStorage implements IRuleOutputStorage {
/**
* The backing Multimap to store all {@link RuleOutput}s.
*/
private final Multimap<String, RuleOutput> allOutputs = LinkedHashMultimap.create();
/**
* The backing Multimap to store all {@link RuleOutput}s where one or more condition failed.
*/
private final Multimap<String, RuleOutput> conditionFailures = ArrayListMultimap.create();
// -------------------------------------------------------------
// Interface Implementation: IRuleOutputStorage
// -------------------------------------------------------------
/**
* {@inheritDoc}
*/
@Override
public void store(Collection<RuleOutput> output) {
for (RuleOutput single : output) {
store(single);
}
}
/**
* {@inheritDoc}
*/
@Override
public void store(RuleOutput output) {
if (output.hasConditionFailures()) {
conditionFailures.put(output.getEmbeddedTagType(), output);
} else {
allOutputs.put(output.getEmbeddedTagType(), output);
}
}
/**
* {@inheritDoc}
*/
@Override
public Set<String> getAvailableTagTypes() {
return allOutputs.keySet();
}
/**
* {@inheritDoc}
*/
@Override
public Multimap<String, RuleOutput> getAllOutputsWithConditionFailures() {
return conditionFailures;
}
/**
* {@inheritDoc}
*/
@Override
public Multimap<String, RuleOutput> getAllOutputs() {
return allOutputs;
}
/**
* {@inheritDoc}
*/
@Override
public Multimap<String, Tag> mapTags(TagState state) {
Multimap<String, Tag> tags = ArrayListMultimap.create();
for (Map.Entry<String, RuleOutput> entry : allOutputs.entries()) {
if (entry.getValue().hasResultTags()) {
for (Tag tag : entry.getValue().getTags()) {
if (tag.getState().equals(state)) {
tags.put(tag.getType(), tag);
}
}
}
}
return tags;
}
/**
* {@inheritDoc}
*/
@Override
public Collection<RuleOutput> findLatestResultsByTagType(Set<String> tagTypes) {
List<RuleOutput> result = null;
Set<String> keys = allOutputs.keySet();
ListIterator<String> iterator = new ArrayList<>(keys).listIterator(keys.size());
while (iterator.hasPrevious()) {
String previous = iterator.previous();
if (tagTypes.contains(previous)) {
if (null == result) {
result = new ArrayList<>();
}
result.addAll(allOutputs.get(previous));
}
}
return null == result ? Collections.<RuleOutput> emptyList() : result;
}
/**
* {@inheritDoc}
*/
@Override
public void clear() {
this.allOutputs.clear();
this.conditionFailures.clear();
}
}