1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.config.source.yaml;
35
36 import info.magnolia.config.registry.DefinitionProvider;
37 import info.magnolia.config.registry.DefinitionProviderProblemLogger;
38 import info.magnolia.config.registry.Registry;
39 import info.magnolia.config.source.yaml.decoration.FilePathBasedYamlDefinitionDecoratorResolver;
40 import info.magnolia.init.MagnoliaConfigurationProperties;
41 import info.magnolia.map2bean.Map2BeanTransformer;
42 import info.magnolia.module.ModuleRegistry;
43 import info.magnolia.objectfactory.Components;
44 import info.magnolia.resourceloader.Resource;
45 import info.magnolia.resourceloader.ResourceOrigin;
46
47 import java.util.HashMap;
48 import java.util.Map;
49 import java.util.function.Consumer;
50 import java.util.function.Function;
51 import java.util.regex.Pattern;
52
53 import org.slf4j.Logger;
54 import org.slf4j.LoggerFactory;
55 import org.yaml.snakeyaml.constructor.Construct;
56
57
58
59
60
61
62 public class YamlConfigurationSource<T> extends AbstractFileResourceConfigurationSource<T> {
63
64 private static Logger log = LoggerFactory.getLogger(YamlConfigurationSource.class);
65
66 private final Map2BeanTransformer map2BeanTransformer;
67
68 private final YamlReader yamlReader;
69
70 private final MagnoliaConfigurationProperties magnoliaConfigurationProperties;
71
72 private final ModuleRegistry moduleRegistry;
73 private final Map<String, Function<Consumer<DefinitionProvider.Problem>, Construct>> customConstructs;
74 private final Map<String, Function<Consumer<DefinitionProvider.Problem>, Construct>> customMultiConstructs;
75
76
77
78
79 public YamlConfigurationSource(ResourceOrigin origin,
80 Map2BeanTransformer map2BeanTransformer,
81 Registry<T> registry, Pattern pathPattern,
82 YamlReader yamlReader,
83 MagnoliaConfigurationProperties magnoliaConfigurationProperties,
84 ModuleRegistry moduleRegistry,
85 Map<String, Function<Consumer<DefinitionProvider.Problem>, Construct>> customConstructs,
86 Map<String, Function<Consumer<DefinitionProvider.Problem>, Construct>> customMultiConstructs) {
87 super(origin, registry, pathPattern, moduleRegistry);
88 this.map2BeanTransformer = map2BeanTransformer;
89 this.yamlReader = yamlReader;
90 this.magnoliaConfigurationProperties = magnoliaConfigurationProperties;
91 this.moduleRegistry = moduleRegistry;
92 this.customConstructs = customConstructs;
93 this.customMultiConstructs = customMultiConstructs;
94 }
95
96
97
98
99 @Deprecated
100 public YamlConfigurationSource(ResourceOrigin origin, info.magnolia.config.map2bean.Map2BeanTransformer map2BeanTransformer, Registry<T> registry, Pattern pathPattern, YamlReader yamlReader) {
101 this(origin, map2BeanTransformer, registry, pathPattern, yamlReader, Components.getComponent(MagnoliaConfigurationProperties.class), Components.getComponent(ModuleRegistry.class));
102 }
103
104
105
106
107 @Deprecated
108 public YamlConfigurationSource(ResourceOrigin origin, Map2BeanTransformer map2BeanTransformer, Registry<T> registry, Pattern pathPattern, YamlReader yamlReader, MagnoliaConfigurationProperties magnoliaConfigurationProperties) {
109 this(origin, map2BeanTransformer, registry, pathPattern, yamlReader, magnoliaConfigurationProperties, Components.getComponent(ModuleRegistry.class));
110 }
111
112
113
114
115 @Deprecated
116 public YamlConfigurationSource(ResourceOrigin origin, Map2BeanTransformer map2BeanTransformer, Registry<T> registry, Pattern pathPattern, YamlReader yamlReader, MagnoliaConfigurationProperties magnoliaConfigurationProperties, ModuleRegistry moduleRegistry) {
117 this(origin, map2BeanTransformer, registry, pathPattern, yamlReader, magnoliaConfigurationProperties, moduleRegistry, new HashMap<>(), new HashMap<>());
118 }
119
120 @Override
121 protected void startDecoration() {
122 registerDefinitionDecoratorResolver(new FilePathBasedYamlDefinitionDecoratorResolver(map2BeanTransformer, getRegistry(), magnoliaConfigurationProperties));
123 super.startDecoration();
124 }
125
126 @Override
127 public void loadAndRegister(Resource resource) {
128 if (resource == null) {
129 throw new IllegalStateException("Resource cannot be null");
130 }
131
132 final YamlDefinitionProvider<T> definitionProvider = new YamlDefinitionProvider<>(
133 this,
134 resource,
135 map2BeanTransformer,
136 yamlReader,
137 moduleRegistry,
138 customConstructs,
139 customMultiConstructs
140 );
141
142 getRegistry().register(definitionProvider);
143
144 log.info("Registered definition from YAML file [{}]: {}", resource.getPath(), definitionProvider.getMetadata());
145
146 DefinitionProviderProblemLogger
147 .withLoggingContext(log, magnoliaConfigurationProperties.getBooleanProperty("magnolia.develop"))
148 .logProblems(definitionProvider);
149 }
150 }