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 }