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    }