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}" 072 */ 073 private boolean resolvePlaceholders; 074 075 @Override 076 public void execute() throws MojoExecutionException, MojoFailureException { 077 Properties properties = new Properties(); 078 // Add project properties 079 properties.putAll(project.getProperties()); 080 if (includeEnvironmentVariables) { 081 // Add environment variables, overriding any existing properties with the same key 082 properties.putAll(getEnvironmentVariables()); 083 } 084 if (includeSystemProperties) { 085 // Add system properties, overriding any existing properties with the same key 086 properties.putAll(System.getProperties()); 087 } 088 089 // Resolve placeholders 090 if (resolvePlaceholders) { 091 properties = getResolvedProperties(properties); 092 } 093 094 // Remove properties as appropriate 095 trim(properties, exclude, include); 096 097 getLog().info("Creating " + outputFile); 098 099 // Save the properties to a file 100 writeProperties(this.outputFile, properties, this.outputStyle, this.prefix); 101 } 102 103 protected Properties getResolvedProperties(Properties props) { 104 PropertyPlaceholderHelper pph = new PropertyPlaceholderHelper("${", "}"); 105 List<String> keys = new ArrayList<String>(props.stringPropertyNames()); 106 Collections.sort(keys); 107 Properties newProps = new Properties(); 108 for (String key : keys) { 109 String originalValue = props.getProperty(key); 110 String resolvedValue = pph.replacePlaceholders(originalValue, props); 111 newProps.setProperty(key, resolvedValue); 112 } 113 return newProps; 114 115 } 116 117 protected static Properties getEnvironmentVariables() { 118 String prefix = "env"; 119 Map<String, String> map = System.getenv(); 120 Properties props = new Properties(); 121 for (String key : map.keySet()) { 122 String newKey = prefix + "." + key; 123 String value = map.get(key); 124 props.setProperty(newKey, value); 125 } 126 return props; 127 } 128 129 protected void trim(Properties properties, String excludeCSV, String includeCSV) { 130 List<String> excludes = ReadPropertiesMojo.getListFromCSV(excludeCSV); 131 List<String> includes = ReadPropertiesMojo.getListFromCSV(includeCSV); 132 List<String> keys = new ArrayList<String>(properties.stringPropertyNames()); 133 Collections.sort(keys); 134 for (String key : keys) { 135 boolean include = include(key, includes, excludes); 136 if (!include) { 137 properties.remove(key); 138 } 139 } 140 } 141 142 public boolean include(String value, List<String> includes, List<String> excludes) { 143 if (excludes.contains(value)) { 144 return false; 145 } else { 146 return includes.size() == 0 || includes.contains(value); 147 } 148 } 149 150 public boolean isIncludeSystemProperties() { 151 return includeSystemProperties; 152 } 153 154 public void setIncludeSystemProperties(boolean includeSystemProperties) { 155 this.includeSystemProperties = includeSystemProperties; 156 } 157 158 public boolean isIncludeEnvironmentVariables() { 159 return includeEnvironmentVariables; 160 } 161 162 public void setIncludeEnvironmentVariables(boolean includeEnvironmentVariables) { 163 this.includeEnvironmentVariables = includeEnvironmentVariables; 164 } 165 166 public String getExclude() { 167 return exclude; 168 } 169 170 public void setExclude(String exclude) { 171 this.exclude = exclude; 172 } 173 174 public String getInclude() { 175 return include; 176 } 177 178 public void setInclude(String include) { 179 this.include = include; 180 } 181 182 public boolean isResolvePlaceholders() { 183 return resolvePlaceholders; 184 } 185 186 public void setResolvePlaceholders(boolean resolvePlaceholders) { 187 this.resolvePlaceholders = resolvePlaceholders; 188 } 189 190 }