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 writeProperties(this.outputFile, properties, this.outputStyle, this.prefix); 099 } 100 101 protected Properties getResolvedProperties(Properties props) { 102 PropertyPlaceholderHelper pph = new PropertyPlaceholderHelper("${", "}"); 103 List<String> keys = new ArrayList<String>(props.stringPropertyNames()); 104 Collections.sort(keys); 105 Properties newProps = new Properties(); 106 for (String key : keys) { 107 String originalValue = props.getProperty(key); 108 String resolvedValue = pph.replacePlaceholders(originalValue, props); 109 newProps.setProperty(key, resolvedValue); 110 } 111 return newProps; 112 113 } 114 115 protected static Properties getEnvironmentVariables() { 116 String prefix = "env"; 117 Map<String, String> map = System.getenv(); 118 Properties props = new Properties(); 119 for (String key : map.keySet()) { 120 String newKey = prefix + "." + key; 121 String value = map.get(key); 122 props.setProperty(newKey, value); 123 } 124 return props; 125 } 126 127 protected void trim(Properties properties, String excludeCSV, String includeCSV) { 128 List<String> excludes = ReadPropertiesMojo.getListFromCSV(excludeCSV); 129 List<String> includes = ReadPropertiesMojo.getListFromCSV(includeCSV); 130 List<String> keys = new ArrayList<String>(properties.stringPropertyNames()); 131 Collections.sort(keys); 132 for (String key : keys) { 133 boolean include = include(key, includes, excludes); 134 if (!include) { 135 properties.remove(key); 136 } 137 } 138 } 139 140 public boolean include(String value, List<String> includes, List<String> excludes) { 141 if (excludes.contains(value)) { 142 return false; 143 } else { 144 return includes.size() == 0 || includes.contains(value); 145 } 146 } 147 148 public boolean isIncludeSystemProperties() { 149 return includeSystemProperties; 150 } 151 152 public void setIncludeSystemProperties(boolean includeSystemProperties) { 153 this.includeSystemProperties = includeSystemProperties; 154 } 155 156 public boolean isIncludeEnvironmentVariables() { 157 return includeEnvironmentVariables; 158 } 159 160 public void setIncludeEnvironmentVariables(boolean includeEnvironmentVariables) { 161 this.includeEnvironmentVariables = includeEnvironmentVariables; 162 } 163 164 public String getExclude() { 165 return exclude; 166 } 167 168 public void setExclude(String exclude) { 169 this.exclude = exclude; 170 } 171 172 public String getInclude() { 173 return include; 174 } 175 176 public void setInclude(String include) { 177 this.include = include; 178 } 179 180 public boolean isResolvePlaceholders() { 181 return resolvePlaceholders; 182 } 183 184 public void setResolvePlaceholders(boolean resolvePlaceholders) { 185 this.resolvePlaceholders = resolvePlaceholders; 186 } 187 }