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.dependency;
35
36 import static info.magnolia.config.registry.DefinitionProvider.Problem;
37
38 import info.magnolia.cms.util.ExceptionUtil;
39 import info.magnolia.config.source.yaml.MgnlYamlConstructor.YamlConfigurationDependencyAggregator;
40 import info.magnolia.config.source.yaml.YamlReader;
41 import info.magnolia.config.source.yaml.YamlReader.YamlConversionResult;
42 import info.magnolia.resourceloader.Resource;
43 import info.magnolia.resourceloader.ResourceOrigin;
44
45 import java.io.IOException;
46 import java.util.Collections;
47 import java.util.Optional;
48 import java.util.function.Consumer;
49
50 import org.apache.commons.lang3.exception.ExceptionUtils;
51
52
53
54
55
56
57 public class YamlFileDependency extends AbstractYamlConfigurationDependency {
58
59 private final ResourceOrigin resourceOrigin;
60 private final String resourcePath;
61 private final YamlReader yamlReader;
62 private final YamlConfigurationDependencyAggregator dependencyAggregator;
63
64 public YamlFileDependency(ResourceOrigin resourceOrigin, String resourcePath, YamlReader yamlReader, YamlConfigurationDependencyAggregator dependencyAggregator, Consumer<Problem> problemCollector) {
65 super(problemCollector);
66 this.resourceOrigin = resourceOrigin;
67 this.resourcePath = resourcePath;
68 this.yamlReader = yamlReader;
69 this.dependencyAggregator = dependencyAggregator;
70 }
71
72 @Override
73 public boolean exists() {
74 return this.resourceOrigin.hasPath(this.resourcePath);
75 }
76
77 @Override
78 public long getLastModified() {
79 return getLastModified(() -> getResource().getLastModified());
80 }
81
82 @Override
83 public Object readData() {
84 try {
85 final YamlConversionResult dependencyConversionResult = yamlReader.readWithDependencies(getResource());
86 dependencyConversionResult.getDependencies().forEach(dependencyAggregator::addDependency);
87 return dependencyConversionResult.getResult();
88 } catch (IOException e) {
89 reportProblem(Problem.major()
90 .withType(Problem.DefaultTypes.RESOLUTION)
91 .withTitle(String.format("Unable to open resource [%s]", this.resourcePath))
92 .withRelatedException(e)
93 .withDetails(ExceptionUtil.exceptionToWords(
94 Optional
95 .ofNullable(ExceptionUtils.getRootCause(e))
96 .orElse(e)))
97 .build());
98 return Collections.emptyMap();
99 }
100 }
101
102 private Resource getResource() {
103 return this.resourceOrigin.getByPath(this.resourcePath);
104 }
105
106 @Override
107 public String toString() {
108 return String.format("YAML file dependency at [%s]", this.resourcePath);
109 }
110 }