001 /** 002 * Copyright 2009-2012 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.codehaus.mojo.properties; 017 018 import java.util.ArrayList; 019 import java.util.Collections; 020 import java.util.List; 021 import java.util.Map; 022 import java.util.Properties; 023 024 import org.apache.maven.plugin.MojoExecutionException; 025 import org.apache.maven.plugin.MojoFailureException; 026 import org.springframework.util.PropertyPlaceholderHelper; 027 028 /** 029 * Write project properties to a file. 030 * 031 * @author Jeff Caddel 032 * 033 * @goal write-project-properties 034 */ 035 public class WriteProjectProperties extends AbstractWritePropertiesMojo { 036 037 /** 038 * If true, the plugin will include system properties when writing the properties file. System properties override both environment 039 * variables and project properties. 040 * 041 * @parameter default-value="false" expression="${properties.includeSystemProperties}" 042 */ 043 private boolean includeSystemProperties; 044 045 /** 046 * If true, the plugin will include environment variables when writing the properties file. Environment variables are prefixed with 047 * "env". Environment variables override project properties. 048 * 049 * @parameter default-value="false" expression="${properties.includeEnvironmentVariables}" 050 */ 051 private boolean includeEnvironmentVariables; 052 053 /** 054 * Comma separated set of properties to exclude when writing the properties file 055 * 056 * @parameter expression="${properties.exclude}" 057 */ 058 private String exclude; 059 060 /** 061 * Comma separated set of properties to write to the properties file. If provided, only the properties matching those supplied here will 062 * be written to the properties file. 063 * 064 * @parameter expression="${properties.include}" 065 */ 066 private String include; 067 068 /** 069 * If true placeholders are resolved before writing properties to the file 070 * 071 * @parameter expression="${properties.resolvePlaceholders}" default-value="false" 072 */ 073 private boolean resolvePlaceholders; 074 075 /** 076 * @parameter expression="${properties.includeStandardMavenProperties}" default-value="false" 077 */ 078 private boolean includeStandardMavenProperties; 079 080 @Override 081 public void execute() throws MojoExecutionException, MojoFailureException { 082 Properties properties = new Properties(); 083 084 // Add project properties 085 properties.putAll(project.getProperties()); 086 087 if (includeStandardMavenProperties) { 088 properties.putAll(getStandardMavenProperties(project)); 089 } 090 091 // Add environment variables, overriding any existing properties with the same key 092 if (includeEnvironmentVariables) { 093 properties.putAll(getEnvironmentVariables()); 094 } 095 096 // Add system properties, overriding any existing properties with the same key 097 if (includeSystemProperties) { 098 properties.putAll(System.getProperties()); 099 } 100 101 // Resolve placeholders 102 if (resolvePlaceholders) { 103 properties = getResolvedProperties(properties); 104 } 105 106 // Remove properties as appropriate 107 trim(properties, exclude, include); 108 109 getLog().info("Creating " + outputFile); 110 111 // Save the properties to a file 112 writeProperties(this.outputFile, properties, this.outputStyle, this.prefix); 113 } 114 115 protected Properties getResolvedProperties(Properties props) { 116 PropertyPlaceholderHelper pph = new PropertyPlaceholderHelper("${", "}"); 117 List<String> keys = new ArrayList<String>(props.stringPropertyNames()); 118 Collections.sort(keys); 119 Properties newProps = new Properties(); 120 for (String key : keys) { 121 String originalValue = props.getProperty(key); 122 String resolvedValue = pph.replacePlaceholders(originalValue, props); 123 newProps.setProperty(key, resolvedValue); 124 } 125 return newProps; 126 127 } 128 129 protected static Properties getEnvironmentVariables() { 130 String prefix = "env"; 131 Map<String, String> map = System.getenv(); 132 Properties props = new Properties(); 133 for (String key : map.keySet()) { 134 String newKey = prefix + "." + key; 135 String value = map.get(key); 136 props.setProperty(newKey, value); 137 } 138 return props; 139 } 140 141 protected void trim(Properties properties, String excludeCSV, String includeCSV) { 142 List<String> excludes = ReadPropertiesMojo.getListFromCSV(excludeCSV); 143 List<String> includes = ReadPropertiesMojo.getListFromCSV(includeCSV); 144 List<String> keys = new ArrayList<String>(properties.stringPropertyNames()); 145 Collections.sort(keys); 146 for (String key : keys) { 147 boolean include = include(key, includes, excludes); 148 if (!include) { 149 properties.remove(key); 150 } 151 } 152 } 153 154 public boolean include(String value, List<String> includes, List<String> excludes) { 155 if (excludes.contains(value)) { 156 return false; 157 } else { 158 return includes.size() == 0 || includes.contains(value); 159 } 160 } 161 162 public boolean isIncludeSystemProperties() { 163 return includeSystemProperties; 164 } 165 166 public void setIncludeSystemProperties(boolean includeSystemProperties) { 167 this.includeSystemProperties = includeSystemProperties; 168 } 169 170 public boolean isIncludeEnvironmentVariables() { 171 return includeEnvironmentVariables; 172 } 173 174 public void setIncludeEnvironmentVariables(boolean includeEnvironmentVariables) { 175 this.includeEnvironmentVariables = includeEnvironmentVariables; 176 } 177 178 public String getExclude() { 179 return exclude; 180 } 181 182 public void setExclude(String exclude) { 183 this.exclude = exclude; 184 } 185 186 public String getInclude() { 187 return include; 188 } 189 190 public void setInclude(String include) { 191 this.include = include; 192 } 193 194 public boolean isResolvePlaceholders() { 195 return resolvePlaceholders; 196 } 197 198 public void setResolvePlaceholders(boolean resolvePlaceholders) { 199 this.resolvePlaceholders = resolvePlaceholders; 200 } 201 202 public boolean isIncludeStandardMavenProperties() { 203 return includeStandardMavenProperties; 204 } 205 206 public void setIncludeStandardMavenProperties(boolean includeStandardMavenProperties) { 207 this.includeStandardMavenProperties = includeStandardMavenProperties; 208 } 209 210 }