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