View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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   * <strong>Warning:</strong> This is an internal class that is only public for technical reasons, it is not part of the
42   * public API. In particular, this class can be changed or deleted without prior notice.
43   *
44   * @author Benjamin Bentmann
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 }