content: package alien4cloud.tosca.parser.impl.base;
  
  import org.springframework.beans.factory.config.ConfigurableBeanFactory;
  import org.springframework.context.annotation.Scope;
  import org.springframework.stereotype.Component;
  import org.yaml.snakeyaml.nodes.Node;
  
  import alien4cloud.tosca.parser.INodeParser;
  import alien4cloud.tosca.parser.ParsingContextExecution;
  import alien4cloud.tosca.parser.ParsingError;
  import alien4cloud.tosca.parser.impl.ErrorCode;
  import lombok.extern.slf4j.Slf4j;
  
  /**
   * Parser implementation that delegates parsing to a parser referenced in the parser registry based on the type key.
   */
  @Slf4j
  @Component
  @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  public class ReferencedParser<T> implements INodeParser<T> {
      private String typeName;
  
      public ReferencedParser(String typeName) {
          this.typeName = typeName;
      }
  
      @Override
      public T parse(Node node, ParsingContextExecution context) {
          INodeParser<?> delegate = context.getRegistry().get(typeName);
          if (delegate == null) {
              log.error("No parser found for yaml type {}", typeName);
              context.getParsingErrors().add(
                      new ParsingError(ErrorCode.ALIEN_MAPPING_ERROR, "No parser found for yaml type", node.getStartMark(), "", node.getEndMark(), typeName));
              return null;
          }
          return (T) delegate.parse(node, context);
      }
  }
  