package alien4cloud.tosca.parser.mapping.generator;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import org.yaml.snakeyaml.nodes.MappingNode;
import org.yaml.snakeyaml.nodes.NodeTuple;
import com.google.common.collect.Maps;
import alien4cloud.tosca.parser.INodeParser;
import alien4cloud.tosca.parser.MappingTarget;
import alien4cloud.tosca.parser.ParserUtils;
import alien4cloud.tosca.parser.ParsingContextExecution;
import alien4cloud.tosca.parser.impl.base.BaseParserFactory;
/**
* Build Mapping target for map.
*/
@Component
public class DiscriminatorMappingBuilder implements IMappingBuilder {
private static final String DISCRIMINATOR = "discriminator";
private static final String KEYS = "keys";
private static final String DEFAULT = "default";
@Resource
private BaseParserFactory baseParserFactory;
@Override
public String getKey() {
return DISCRIMINATOR;
}
@Override
public MappingTarget buildMapping(MappingNode mappingNode, ParsingContextExecution context) {
String mappingTarget = "";
Map<String, INodeParser<?>> parsersByKey = Maps.newHashMap();
INodeParser<?> fallbackParser = null;
for (NodeTuple tuple : mappingNode.getValue()) {
String tupleKey = ParserUtils.getScalar(tuple.getKeyNode(), context);
if (DISCRIMINATOR.equals(tupleKey)) {
mappingTarget = ParserUtils.getScalar(tuple.getValueNode(), context);
} else if (KEYS.equals(tupleKey)) {
MappingNode keys = (MappingNode) tuple.getValueNode();
for (NodeTuple keyMappingTuple : keys.getValue()) {
parsersByKey.put(ParserUtils.getScalar(keyMappingTuple.getKeyNode(), context),
baseParserFactory.getReferencedParser(ParserUtils.getScalar(keyMappingTuple.getValueNode(), context)));
}
} else if (DEFAULT.equals(tupleKey)) {
fallbackParser = baseParserFactory.getReferencedParser(ParserUtils.getScalar(tuple.getValueNode(), context));
}
}
return new MappingTarget(mappingTarget, baseParserFactory.getKeyDiscriminatorParser(parsersByKey, fallbackParser));
}
}