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 alien4cloud.tosca.parser.MappingTarget;
import alien4cloud.tosca.parser.ParserUtils;
import alien4cloud.tosca.parser.ParsingContextExecution;
import alien4cloud.tosca.parser.impl.base.BaseParserFactory;
import lombok.extern.slf4j.Slf4j;
/**
* Build Mapping target for map.
*/
@Slf4j
@Component
public class MapMappingBuilder implements IMappingBuilder {
private static final String MAP = "map";
private static final String TYPE = "type";
private static final String KEY = "key";
private static final String LIST_TYPE = "list_type";
@Resource
private BaseParserFactory baseParserFactory;
@Override
public String getKey() {
return MAP;
}
@Override
public MappingTarget buildMapping(MappingNode mappingNode, ParsingContextExecution context) {
Map<String, String> map = ParserUtils.parseStringMap(mappingNode, context);
if (map.containsKey(TYPE) && map.containsKey(LIST_TYPE)) {
log.warn("Both field <{}> and <{}> exist in your mapping. If it's defined <{}> will override the <{}>.", TYPE, LIST_TYPE, LIST_TYPE, TYPE);
}
// default mapping for simple type or for a list_type if defined
MappingTarget mappingTarget = new MappingTarget(map.get(MAP),
baseParserFactory.getMapParser(baseParserFactory.getReferencedParser(map.get(TYPE)), "map of " + map.get(TYPE), map.get(KEY)));
if (map.containsKey(LIST_TYPE) && !map.get(LIST_TYPE).isEmpty()) {
mappingTarget = new MappingTarget(map.get(MAP), baseParserFactory.getMapParser(
baseParserFactory.getListParser(baseParserFactory.getReferencedParser(map.get(TYPE)), "list of " + map.get(LIST_TYPE), map.get(KEY)),
"map of " + map.get(LIST_TYPE), map.get(KEY)));
}
return mappingTarget;
}
}