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.decoration;
35
36 import static info.magnolia.config.converters.RawDefinitionViewToMapConverter.rawViewToMap;
37 import static info.magnolia.config.maputil.ToMap.toMap;
38
39 import info.magnolia.config.map2bean.Map2BeanTransformer;
40 import info.magnolia.config.maputil.ConfigurationMapOverlay;
41 import info.magnolia.config.registry.DefinitionProvider;
42 import info.magnolia.config.registry.DefinitionReferenceIdResolver;
43 import info.magnolia.config.registry.decoration.DefinitionDecorator;
44 import info.magnolia.config.source.MapBasedDefinitionProviderWrapper;
45 import info.magnolia.config.source.yaml.YamlReader;
46 import info.magnolia.resourceloader.Resource;
47
48 import java.io.IOException;
49 import java.util.Collections;
50 import java.util.List;
51 import java.util.Map;
52
53 import org.slf4j.Logger;
54 import org.slf4j.LoggerFactory;
55
56 import com.google.common.collect.ImmutableList;
57
58
59
60
61
62
63
64 public class YamlDefinitionDecorator<T> extends AbstractFileDefinitionDecorator<T> {
65
66 private static final Logger log = LoggerFactory.getLogger(YamlDefinitionDecorator.class);
67
68 private final YamlReader yamlReader;
69
70 private final Resource yamlFile;
71
72
73 @Override
74 public Resource getDecoratorFile() {
75 return yamlFile;
76 }
77
78 protected final Map<String, Object> parseYamlFile() {
79 final Object yamlConversionResult;
80 try {
81 yamlConversionResult = yamlReader.read(getDecoratorFile());
82 } catch (IOException e) {
83 log.warn("Failed to read decorator from Yaml file: {}", e.getMessage(), e);
84 return Collections.emptyMap();
85 }
86
87 return toMap(yamlConversionResult);
88 }
89
90 private final YamlDefinitionDecoratorMetadata metadata;
91
92 private final DefinitionReferenceIdResolver referenceIdResolver;
93
94 private final Map2BeanTransformer map2BeanTransformer;
95
96 public YamlDefinitionDecorator(
97 YamlDefinitionDecoratorMetadata metadata,
98 DefinitionReferenceIdResolver referenceIdResolver,
99 Resource decoratorYamlFile,
100 Map2BeanTransformer map2BeanTransformer) {
101 this.yamlFile = decoratorYamlFile;
102 this.yamlReader = new YamlReader();
103 this.metadata = metadata;
104 this.referenceIdResolver = referenceIdResolver;
105 this.map2BeanTransformer = map2BeanTransformer;
106 }
107
108 @Override
109 public YamlDefinitionDecoratorMetadata metadata() {
110 return metadata;
111 }
112
113 @Override
114 public boolean appliesTo(DefinitionProvider<T> definitionProvider) {
115 return definitionProvider.getMetadata().getReferenceId().equals(referenceIdResolver.getReferenceId(metadata.getDecoratedDefinitionReference()));
116 }
117
118 @Override
119 public DefinitionProvider<T> decorate(final DefinitionProvider<T> definitionProvider) {
120 final Map<String, Object> decoratedMapRepresentation = ConfigurationMapOverlay.
121 of(rawViewToMap(definitionProvider.getRaw())).
122 by(parseYamlFile()).
123 at(metadata.getDecoratedPath()).
124 overlay();
125
126 return new MapBasedDefinitionProviderWrapper<T>(definitionProvider, map2BeanTransformer, decoratedMapRepresentation) {
127 @Override
128 public List<DefinitionDecorator<T>> getDecorators() {
129
130 return ImmutableList.<DefinitionDecorator<T>>builder().
131 addAll(super.getDecorators()).
132 add(YamlDefinitionDecorator.this).
133 build();
134 }
135 };
136 }
137
138 @Override
139 public String toString() {
140 return String.format("Yaml based decorator from %s", getDecoratorFile().getPath());
141 }
142 }