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.cms.util.ExceptionUtil;
37 import info.magnolia.config.NamedDefinition;
38 import info.magnolia.config.map2bean.Map2BeanTransformer;
39 import info.magnolia.config.registry.DefinitionMetadataBuilder;
40 import info.magnolia.config.registry.DefinitionProvider;
41 import info.magnolia.config.registry.DefinitionProviderBuilder;
42 import info.magnolia.config.registry.DefinitionRawView;
43 import info.magnolia.config.registry.Registry;
44 import info.magnolia.config.source.raw.DefinitionRawViewMapWrapper;
45 import info.magnolia.config.source.yaml.decoration.FilePathBasedYamlDefinitionDecoratorResolver;
46 import info.magnolia.resourceloader.Resource;
47 import info.magnolia.resourceloader.ResourceOrigin;
48
49 import java.util.Map;
50 import java.util.regex.Pattern;
51
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55
56
57
58
59
60 public class YamlConfigurationSource<T> extends AbstractFileResourceConfigurationSource<T> {
61
62 private static Logger log = LoggerFactory.getLogger(YamlConfigurationSource.class);
63
64 private final Map2BeanTransformer map2BeanTransformer;
65
66 private final YamlReader yamlReader;
67
68
69
70
71 public YamlConfigurationSource(ResourceOrigin origin, Map2BeanTransformer map2BeanTransformer, Registry<T> registry, Pattern pathPattern, YamlReader yamlReader) {
72 super(origin, registry, pathPattern);
73 this.map2BeanTransformer = map2BeanTransformer;
74 this.yamlReader = yamlReader;
75 }
76
77 @Override
78 protected void startDecoration() {
79 registerDefinitionDecoratorResolver(new FilePathBasedYamlDefinitionDecoratorResolver(map2BeanTransformer, getRegistry()));
80 super.startDecoration();
81 }
82
83 @Override
84 public void loadAndRegister(Resource resource) {
85 if (resource == null) {
86 throw new IllegalStateException("Resource cannot be null");
87 }
88
89 final DefinitionProviderBuilder<T> builder = DefinitionProviderBuilder.newBuilder();
90 final DefinitionMetadataBuilder metadataBuilder = createMetadata(resource);
91 builder.metadata(metadataBuilder);
92
93 try {
94
95 final Map<String, Object> map = yamlReader.readToMap(resource);
96 final DefinitionRawView raw = new DefinitionRawViewMapWrapper(map);
97 builder.rawView(raw);
98
99
100 final T bean = map2BeanTransformer.toBean(map, getRootType());
101 builder.definition(bean);
102
103
104 if (bean instanceof NamedDefinition) {
105 final String definitionName = ((NamedDefinition) bean).getName();
106 if (definitionName != null) {
107
108 metadataBuilder.name(definitionName);
109 }
110 }
111 } catch (Throwable t) {
112
113 builder.addErrorMessage(ExceptionUtil.exceptionToWords(t));
114 log.warn("Problem while registering {} from {}: {}", getRegistry().type(), resource, ExceptionUtil.exceptionToWords(t), t);
115 }
116
117 final DefinitionProvider<T> provider = builder.build();
118 getRegistry().register(provider);
119
120 log.info("Registered {} from {}", provider.getMetadata(), resource);
121 }
122 }