001package org.apache.maven.configuration.internal; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022import java.io.File; 023 024import org.apache.maven.configuration.BeanConfigurationException; 025import org.apache.maven.configuration.BeanConfigurationPathTranslator; 026import org.apache.maven.configuration.BeanConfigurationRequest; 027import org.apache.maven.configuration.BeanConfigurationValuePreprocessor; 028import org.apache.maven.configuration.BeanConfigurator; 029import org.codehaus.plexus.component.annotations.Component; 030import org.codehaus.plexus.component.configurator.ComponentConfigurationException; 031import org.codehaus.plexus.component.configurator.converters.composite.ObjectWithFieldsConverter; 032import org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup; 033import org.codehaus.plexus.component.configurator.converters.lookup.DefaultConverterLookup; 034import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; 035import org.codehaus.plexus.component.configurator.expression.TypeAwareExpressionEvaluator; 036import org.codehaus.plexus.configuration.PlexusConfiguration; 037import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration; 038import org.codehaus.plexus.util.xml.Xpp3Dom; 039 040/** 041 * <strong>Warning:</strong> This is an internal class that is only public for technical reasons, it is not part of the 042 * public API. In particular, this class can be changed or deleted without prior notice. 043 * 044 * @author Benjamin Bentmann 045 */ 046@Component( role = BeanConfigurator.class ) 047public class DefaultBeanConfigurator 048 implements BeanConfigurator 049{ 050 051 private final ConverterLookup converterLookup = new DefaultConverterLookup(); 052 053 public void configureBean( BeanConfigurationRequest request ) 054 throws BeanConfigurationException 055 { 056 if ( request == null ) 057 { 058 throw new IllegalArgumentException( "bean configuration request not specified" ); 059 } 060 061 if ( request.getBean() == null ) 062 { 063 throw new IllegalArgumentException( "bean to be configured not specified" ); 064 } 065 066 Object configuration = request.getConfiguration(); 067 if ( configuration == null ) 068 { 069 return; 070 } 071 072 PlexusConfiguration plexusConfig; 073 if ( configuration instanceof PlexusConfiguration ) 074 { 075 plexusConfig = (PlexusConfiguration) configuration; 076 } 077 else if ( configuration instanceof Xpp3Dom ) 078 { 079 plexusConfig = new XmlPlexusConfiguration( (Xpp3Dom) configuration ); 080 } 081 else 082 { 083 throw new BeanConfigurationException( "unsupported bean configuration source (" 084 + configuration.getClass().getName() + ")" ); 085 } 086 087 if ( request.getConfigurationElement() != null ) 088 { 089 plexusConfig = plexusConfig.getChild( request.getConfigurationElement() ); 090 } 091 092 ClassLoader classLoader = request.getClassLoader(); 093 if ( classLoader == null ) 094 { 095 classLoader = request.getBean().getClass().getClassLoader(); 096 } 097 098 BeanExpressionEvaluator evaluator = new BeanExpressionEvaluator( request ); 099 100 ObjectWithFieldsConverter converter = new ObjectWithFieldsConverter(); 101 102 try 103 { 104 converter.processConfiguration( converterLookup, request.getBean(), classLoader, plexusConfig, evaluator ); 105 } 106 catch ( ComponentConfigurationException e ) 107 { 108 throw new BeanConfigurationException( e.getMessage(), e ); 109 } 110 } 111 112 static class BeanExpressionEvaluator 113 implements TypeAwareExpressionEvaluator 114 { 115 116 private final BeanConfigurationValuePreprocessor preprocessor; 117 118 private final BeanConfigurationPathTranslator translator; 119 120 public BeanExpressionEvaluator( BeanConfigurationRequest request ) 121 { 122 preprocessor = request.getValuePreprocessor(); 123 translator = request.getPathTranslator(); 124 } 125 126 public Object evaluate( String expression, Class<?> type ) 127 throws ExpressionEvaluationException 128 { 129 if ( preprocessor != null ) 130 { 131 try 132 { 133 return preprocessor.preprocessValue( expression, type ); 134 } 135 catch ( BeanConfigurationException e ) 136 { 137 throw new ExpressionEvaluationException( e.getMessage(), e ); 138 } 139 } 140 return expression; 141 } 142 143 public Object evaluate( String expression ) 144 throws ExpressionEvaluationException 145 { 146 return evaluate( expression, null ); 147 } 148 149 public File alignToBaseDirectory( File file ) 150 { 151 if ( translator != null ) 152 { 153 return translator.translatePath( file ); 154 } 155 return file; 156 } 157 158 } 159 160}