package alien4cloud.tosca.parser.impl.base; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import alien4cloud.tosca.parser.INodeParser; /** * Allow to retrieve instances of base parsers from the application context. Allowing to get new instances of beans (prototype scoped) with AOP support. */ @Component public class BaseParserFactory { @Autowired private ApplicationContext applicationContext; /** * Get a new instance of a ReferencedParser. * * @param typeName The name of the type in the parser registry to use for the parsing. * @return a new instance of the ReferencedParser. */ public ReferencedParser getReferencedParser(String typeName) { return applicationContext.getBean(ReferencedParser.class, typeName); } /** * Get a new instance of a TypeNodeParser. * * @param type The type of the object to parse. * @param toscaType The name of the type in tosca. * @param <T> The parsed object type. * @return a new instance of the TypeNodeParser. */ public <T> TypeNodeParser getTypeNodeParser(Class<T> type, String toscaType) { return applicationContext.getBean(TypeNodeParser.class, type, toscaType); } /** * Get a new instance of a KeyDiscriminatorParser with the given parameters for key discrimined parsers and fallback. * * @param parsersByKey The parsers to associate based on key found in the parsed node. * @param fallbackParser The fallback parser in case no key matches. * @return a new instance of the KeyDiscriminatorParser */ public KeyDiscriminatorParser getKeyDiscriminatorParser(Map<String, INodeParser<?>> parsersByKey, INodeParser<?> fallbackParser) { return applicationContext.getBean(KeyDiscriminatorParser.class, parsersByKey, fallbackParser); } /** * Get a new instance of a ListParser. * * @param valueParser The parser to use to parse list values. * @param toscaType The expected type name to generate error messages. * @param <T> The type of the list values. * @return a new instance of the ListParser */ public <T> ListParser<T> getListParser(INodeParser<T> valueParser, String toscaType) { return applicationContext.getBean(ListParser.class, valueParser, toscaType); } /** * Get a new instance of a ListParser. * * @param valueParser The parser to use to parse list values. * @param toscaType The expected type name to generate error messages. * @param keyPath In case the list is created from a map, optional value to inject the key into the value object. * @param <T> The type of the list values. * @return a new instance of the ListParser */ public <T> ListParser<T> getListParser(INodeParser<T> valueParser, String toscaType, String keyPath) { return applicationContext.getBean(ListParser.class, valueParser, toscaType, keyPath); } /** * Get a new instance of a SetParser. * * @param valueParser The parser to use to parse set values. * @param toscaType The tosca type of the set. * @param <T> The type of the set values. * @return a new instance of the SetParser */ public <T> SetParser getSetParser(INodeParser<T> valueParser, String toscaType) { return applicationContext.getBean(SetParser.class, valueParser, toscaType); } /** * Get a new instance of a SetParser. * * @param valueParser The parser to use to parse set values. * @param toscaType The tosca type of the set. * @param keyPath In case the list is created from a map, optional value to inject the key into the value object. * @param <T> The type of the set values. * @return a new instance of the SetParser */ public <T> SetParser getSetParser(INodeParser<T> valueParser, String toscaType, String keyPath) { return applicationContext.getBean(SetParser.class, valueParser, toscaType, keyPath); } /** * Get a new instance of a MapParser. * * @param valueParser The parser to use to parse map values. * @param toscaType The expected type name to generate error messages. * @param <T> The type of the map values. * @return a new instance of the MapParser */ public <T> MapParser getMapParser(INodeParser<T> valueParser, String toscaType) { return (MapParser) applicationContext.getBean("mapParser", valueParser, toscaType); } /** * Get a new instance of a MapParser. * * @param valueParser The parser to use to parse map values. * @param toscaType The expected type name to generate error messages. * @param keyPath Optional value to inject the key into the value object. * @param <T> The type of the map values. * @return a new instance of the MapParser */ public <T> MapParser getMapParser(INodeParser<T> valueParser, String toscaType, String keyPath) { return (MapParser) applicationContext.getBean("mapParser", valueParser, toscaType, keyPath); } /** * Get a new instance of a SequenceToMapParser. * * @param valueParser The parser to use to parse map values. * @param toscaType The tosca type of the map. * @param nodeIsValue If the sequence element mapping node is also the node of the value (both key and value). * @param allowDuplicate Allow duplicate flag to know the the sequence to map parser should trigger errors in case of duplicated elements. * @param <T> The type of the map values. * @return a new instance of the SequenceToMapParser */ public <T> SequenceToMapParser getSequenceToMapParser(INodeParser<T> valueParser, String toscaType, Boolean nodeIsValue, Boolean allowDuplicate) { return applicationContext.getBean(SequenceToMapParser.class, valueParser, toscaType, nodeIsValue, allowDuplicate); } }