001 package org.apache.maven.script.ant;
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
022 import java.io.File;
023 import java.util.Collections;
024 import java.util.HashMap;
025 import java.util.Map;
026 import java.util.Set;
027
028 import org.apache.maven.artifact.Artifact;
029 import org.apache.maven.plugin.logging.Log;
030 import org.apache.maven.project.MavenProject;
031 import org.apache.tools.ant.PropertyHelper;
032 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
033 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
034 import org.codehaus.plexus.util.introspection.ReflectionValueExtractor;
035
036 /**
037 * Makes the ${expressions} used in Maven available to Ant as properties.
038 *
039 * @author <a href="mailto:kenney@apache.org">Kenney Westerhof</a>
040 */
041 public class AntPropertyHelper
042 extends PropertyHelper
043 {
044 private static final String DEPENDENCY_PREFIX = "maven.dependency.";
045 private Log log;
046 private ExpressionEvaluator exprEvaluator;
047 private MavenProject mavenProject;
048 private Map<String, String> artifactMap = new HashMap<String, String>();
049
050 /**
051 * @deprecated use the other constructor
052 * @param project
053 * @param l
054 */
055 public AntPropertyHelper( MavenProject project, Log l )
056 {
057 mavenProject = project;
058 log = l;
059 }
060
061 /**
062 * @deprecated use {@link #AntPropertyHelper(ExpressionEvaluator, Set, Log)} to resolve maven.dependency.* properties
063 * @param exprEvaluator
064 * @param l
065 */
066 public AntPropertyHelper( ExpressionEvaluator exprEvaluator, Log l )
067 {
068 this( exprEvaluator, Collections.<Artifact>emptySet(), l );
069 }
070
071 /**
072 * @param exprEvaluator
073 * @param artifacts
074 * @param l
075 */
076 public AntPropertyHelper( ExpressionEvaluator exprEvaluator, Set<Artifact> artifacts, Log l )
077 {
078 this.mavenProject = null;
079 this.exprEvaluator = exprEvaluator;
080 this.log = l;
081
082 for ( Artifact artifact : artifacts )
083 {
084 String key = DEPENDENCY_PREFIX + artifact.getGroupId() + "." + artifact.getArtifactId()
085 + ( artifact.getClassifier() != null ? "." + artifact.getClassifier() : "" )
086 + ( artifact.getType() != null ? "." + artifact.getType() : "" ) + ".path";
087
088 log.debug( "Storing: " + key + "=" + artifact.getFile().getPath() );
089
090 artifactMap.put( key, artifact.getFile().getPath() );
091 }
092 }
093
094 /**
095 * @see org.apache.tools.ant.PropertyHelper#getPropertyHook(java.lang.String, java.lang.String, boolean)
096 */
097 public synchronized Object getPropertyHook( String ns, String name, boolean user )
098 {
099 if ( log.isDebugEnabled() )
100 {
101 log.debug( "getProperty(ns=" + ns + ", name=" + name + ", user=" + user + ")" );
102 }
103
104 /* keep old behaviour */
105 if ( mavenProject != null )
106 {
107 return getPropertyHook( ns, name, user, mavenProject );
108 }
109
110
111 Object val = null;
112
113 if ( name.startsWith( DEPENDENCY_PREFIX ) )
114 {
115 val = (String) artifactMap.get( name );
116 }
117
118 if ( val == null )
119 {
120 try
121 {
122 val = exprEvaluator.evaluate( "${" + name + "}" );
123 }
124 catch ( ExpressionEvaluationException e )
125 {
126 if ( log.isErrorEnabled() )
127 {
128 log.error( "Failed to evaluate expression", e );
129 }
130 }
131 }
132
133 if ( val == null )
134 {
135 val = super.getPropertyHook( ns, name, user );
136
137 if ( val == null )
138 {
139 val = System.getProperty( name.toString() );
140 }
141 }
142
143 return val;
144 }
145
146 /**
147 * @deprecated added to keep backwards compatibility
148 * @param ns
149 * @param name
150 * @param user
151 * @param mavenProject
152 * @return The property value.
153 */
154 private Object getPropertyHook( String ns, String name, boolean user, MavenProject mavenProject )
155 {
156 Object val = null;
157 try
158 {
159 if ( name.startsWith( DEPENDENCY_PREFIX ) )
160 {
161 val = (String) artifactMap.get( name );
162 }
163 else if ( name.startsWith( "project." ) )
164 {
165 val = ReflectionValueExtractor.evaluate(
166 name,
167 mavenProject,
168 true
169 );
170 }
171 else if ( name.equals( "basedir" ) )
172 {
173 val = ReflectionValueExtractor.evaluate(
174 "basedir.path",
175 mavenProject,
176 false
177 );
178 }
179 }
180 catch ( Exception e )
181 {
182 if ( log.isWarnEnabled() )
183 {
184 log.warn( "Error evaluating expression '" + name + "'", e );
185 }
186 }
187
188 if ( val == null )
189 {
190 val = super.getPropertyHook( ns, name, user );
191 if ( val == null )
192 {
193 val = System.getProperty( name.toString() );
194 }
195 }
196
197 if ( val instanceof File )
198 {
199 val = ( (File) val ).getAbsoluteFile();
200 }
201
202 return val;
203 }
204 }