1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.configuration.internal;
20
21 import java.io.File;
22 import java.util.Objects;
23
24 import org.apache.maven.configuration.BeanConfigurationException;
25 import org.apache.maven.configuration.BeanConfigurationPathTranslator;
26 import org.apache.maven.configuration.BeanConfigurationRequest;
27 import org.apache.maven.configuration.BeanConfigurationValuePreprocessor;
28 import org.apache.maven.configuration.BeanConfigurator;
29 import org.codehaus.plexus.component.annotations.Component;
30 import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
31 import org.codehaus.plexus.component.configurator.converters.composite.ObjectWithFieldsConverter;
32 import org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup;
33 import org.codehaus.plexus.component.configurator.converters.lookup.DefaultConverterLookup;
34 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
35 import org.codehaus.plexus.component.configurator.expression.TypeAwareExpressionEvaluator;
36 import org.codehaus.plexus.configuration.PlexusConfiguration;
37 import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
38 import org.codehaus.plexus.util.xml.Xpp3Dom;
39
40
41
42
43
44
45
46 @Component(role = BeanConfigurator.class)
47 public class DefaultBeanConfigurator implements BeanConfigurator {
48
49 private final ConverterLookup converterLookup = new DefaultConverterLookup();
50
51 public void configureBean(BeanConfigurationRequest request) throws BeanConfigurationException {
52 Objects.requireNonNull(request, "request cannot be null");
53 Objects.requireNonNull(request.getBean(), "request.bean cannot be null");
54
55 Object configuration = request.getConfiguration();
56 if (configuration == null) {
57 return;
58 }
59
60 PlexusConfiguration plexusConfig;
61 if (configuration instanceof PlexusConfiguration) {
62 plexusConfig = (PlexusConfiguration) configuration;
63 } else if (configuration instanceof Xpp3Dom) {
64 plexusConfig = new XmlPlexusConfiguration((Xpp3Dom) configuration);
65 } else {
66 throw new BeanConfigurationException("unsupported bean configuration source ("
67 + configuration.getClass().getName() + ")");
68 }
69
70 if (request.getConfigurationElement() != null) {
71 plexusConfig = plexusConfig.getChild(request.getConfigurationElement());
72 }
73
74 ClassLoader classLoader = request.getClassLoader();
75 if (classLoader == null) {
76 classLoader = request.getBean().getClass().getClassLoader();
77 }
78
79 BeanExpressionEvaluator evaluator = new BeanExpressionEvaluator(request);
80
81 ObjectWithFieldsConverter converter = new ObjectWithFieldsConverter();
82
83 try {
84 converter.processConfiguration(converterLookup, request.getBean(), classLoader, plexusConfig, evaluator);
85 } catch (ComponentConfigurationException e) {
86 throw new BeanConfigurationException(e.getMessage(), e);
87 }
88 }
89
90 static class BeanExpressionEvaluator implements TypeAwareExpressionEvaluator {
91
92 private final BeanConfigurationValuePreprocessor preprocessor;
93
94 private final BeanConfigurationPathTranslator translator;
95
96 BeanExpressionEvaluator(BeanConfigurationRequest request) {
97 preprocessor = request.getValuePreprocessor();
98 translator = request.getPathTranslator();
99 }
100
101 public Object evaluate(String expression, Class<?> type) throws ExpressionEvaluationException {
102 if (preprocessor != null) {
103 try {
104 return preprocessor.preprocessValue(expression, type);
105 } catch (BeanConfigurationException e) {
106 throw new ExpressionEvaluationException(e.getMessage(), e);
107 }
108 }
109 return expression;
110 }
111
112 public Object evaluate(String expression) throws ExpressionEvaluationException {
113 return evaluate(expression, null);
114 }
115
116 public File alignToBaseDirectory(File file) {
117 if (translator != null) {
118 return translator.translatePath(file);
119 }
120 return file;
121 }
122 }
123 }