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 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   * <strong>Warning:</strong> This is an internal class that is only public for technical reasons, it is not part of the
44   * public API. In particular, this class can be changed or deleted without prior notice.
45   *
46   * @author Benjamin Bentmann
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 }