1 package org.apache.maven.plugin.coreit; 2 3 /* 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 22 import org.apache.maven.plugin.AbstractMojo; 23 import org.apache.maven.plugin.MojoExecutionException; 24 import org.apache.maven.plugin.MojoFailureException; 25 26 import java.io.File; 27 import java.io.IOException; 28 import java.util.HashMap; 29 import java.util.Map; 30 import java.util.Properties; 31 32 /** 33 * Creates a properties file with the effective values of some user-defined expressions. Unlike Maven's built-in 34 * expression syntax for interpolation, these expressions use forward slashes to navigate down the object graph and 35 * support access to individual collection/array elements. Furthermore, the result of an expression need not be a scalar 36 * value but can also be a collection/array or a bean-like object (from the Maven model). For example, the expression 37 * "project/dependencies/0" would extract the first project dependency. In more detail, this example expression could 38 * output the following keys to the properties file: 39 * 40 * <pre> 41 * project.dependencies.0.groupId = org.apache.maven 42 * project.dependencies.0.artifactId = maven-project 43 * project.dependencies.0.type = jar 44 * project.dependencies.0.version = 2.0 45 * project.dependencies.0.optional = false 46 * project.dependencies.0.exclusions = 2 47 * project.dependencies.0.exclusions.0.groupId = plexus 48 * project.dependencies.0.exclusions.0.artifactId = plexus-utils 49 * project.dependencies.0.exclusions.1.groupId = plexus 50 * project.dependencies.0.exclusions.1.artifactId = plexus-container-default 51 * </pre> 52 * 53 * Expressions that reference non-existing objects or use invalid collection/array indices silently resolve to 54 * <code>null</code>. For collections and arrays, the special index "*" can be used to iterate all elements. 55 * 56 * @author Benjamin Bentmann 57 * 58 * @goal eval 59 * @phase initialize 60 */ 61 public class EvalMojo 62 extends AbstractMojo 63 { 64 65 /** 66 * The project's base directory, used for manual path translation. 67 * 68 * @parameter default-value="${basedir}" 69 * @readonly 70 */ 71 private File basedir; 72 73 /** 74 * The path to the output file for the properties with the expression values. For each expression given by the 75 * parameter {@link #expressions} an similar named properties key will be used to save the expression value. If an 76 * expression evaluated to <code>null</code>, there will be no corresponding key in the properties file. 77 * 78 * @parameter property="expression.outputFile" 79 */ 80 private File outputFile; 81 82 /** 83 * The set of expressions to evaluate. 84 * 85 * @parameter 86 */ 87 private String[] expressions; 88 89 /** 90 * The comma separated set of expressions to evaluate. 91 * 92 * @parameter property="expression.expressions" 93 */ 94 private String expressionList; 95 96 /** 97 * The current Maven project against which expressions are evaluated. 98 * 99 * @parameter default-value="${project}" 100 * @readonly 101 */ 102 private Object project; 103 104 /** 105 * The forked Maven project against which expressions are evaluated. 106 * 107 * @parameter default-value="${executedProject}" 108 * @readonly 109 */ 110 private Object executedProject; 111 112 /** 113 * The merged user/global settings of the current build against which expressions are evaluated. 114 * 115 * @parameter default-value="${settings}" 116 * @readonly 117 */ 118 private Object settings; 119 120 /** 121 * The session context of the current build against which expressions are evaluated. 122 * 123 * @parameter default-value="${session}" 124 * @readonly 125 */ 126 private Object session; 127 128 /** 129 * The local repository of the current build against which expressions are evaluated. 130 * 131 * @parameter default-value="${localRepository}" 132 * @readonly 133 */ 134 private Object localRepository; 135 136 /** 137 * Runs this mojo. 138 * 139 * @throws MojoExecutionException If the output file could not be created. 140 * @throws MojoFailureException If the output file has not been set. 141 */ 142 public void execute() 143 throws MojoExecutionException, MojoFailureException 144 { 145 if ( outputFile == null ) 146 { 147 throw new MojoFailureException( "Path name for output file has not been specified" ); 148 } 149 150 /* 151 * NOTE: We don't want to test path translation here. 152 */ 153 if ( !outputFile.isAbsolute() ) 154 { 155 outputFile = new File( basedir, outputFile.getPath() ).getAbsoluteFile(); 156 } 157 158 getLog().info( "[MAVEN-CORE-IT-LOG] Creating output file: " + outputFile ); 159 160 Properties expressionProperties = new Properties(); 161 162 if ( expressionList != null && expressionList.length() > 0 ) 163 { 164 expressions = expressionList.split( "," ); 165 } 166 if ( expressions != null && expressions.length > 0 ) 167 { 168 Map contexts = new HashMap(); 169 contexts.put( "project", project ); 170 contexts.put( "executedProject", executedProject ); 171 contexts.put( "pom", project ); 172 contexts.put( "settings", settings ); 173 contexts.put( "session", session ); 174 contexts.put( "localRepository", localRepository ); 175 176 for ( String expression : expressions ) 177 { 178 Map values = ExpressionUtil.evaluate( expression, contexts ); 179 for ( Object key : values.keySet() ) 180 { 181 Object value = values.get( key ); 182 PropertyUtil.store( expressionProperties, key.toString().replace( '/', '.' ), value ); 183 } 184 } 185 } 186 187 try 188 { 189 PropertyUtil.write( expressionProperties, outputFile ); 190 } 191 catch ( IOException e ) 192 { 193 throw new MojoExecutionException( "Output file could not be created: " + outputFile, e ); 194 } 195 196 getLog().info( "[MAVEN-CORE-IT-LOG] Created output file: " + outputFile ); 197 } 198 199 public void setOutputFile( File outputFile ) 200 { 201 this.outputFile = outputFile; 202 } 203 } 204