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.resourceloader.Resource;
46 import info.magnolia.resourceloader.ResourceOrigin;
47
48 import java.io.IOException;
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) throws IOException {
72 super(origin, registry, pathPattern);
73 this.map2BeanTransformer = map2BeanTransformer;
74 this.yamlReader = yamlReader;
75 }
76
77 @Override
78 public void loadAndRegister(Resource resource) {
79 if (resource == null) {
80 throw new IllegalStateException("Resource path cannot be null");
81 }
82
83 final DefinitionProviderBuilder<T> builder = DefinitionProviderBuilder.newBuilder();
84 final DefinitionMetadataBuilder metadataBuilder = createMetadata(resource);
85 builder.metadata(metadataBuilder);
86
87 try {
88
89 final Map<String, Object> map = yamlReader.readToMap(resource);
90 final DefinitionRawView raw = new DefinitionRawViewMapWrapper(map);
91 builder.rawView(raw);
92
93
94 final T bean = map2BeanTransformer.toBean(map, getRootType());
95 builder.definition(bean);
96
97
98 if (bean instanceof NamedDefinition) {
99 final String definitionName = ((NamedDefinition) bean).getName();
100 if (definitionName != null) {
101
102 metadataBuilder.name(definitionName);
103 }
104 }
105 } catch (Throwable t) {
106
107 builder.addErrorMessage(ExceptionUtil.exceptionToWords(t));
108 log.warn("Problem while registering {} from {}: {}", getRegistry().type(), resource, ExceptionUtil.exceptionToWords(t), t);
109 }
110
111 final DefinitionProvider<T> provider = builder.build();
112 getRegistry().register(provider);
113 log.info("Registered {} from {}", provider.getMetadata(), resource);
114 }
115
116 }