001    /**
002     * Copyright 2009-2013 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.List;
019    import java.util.Properties;
020    
021    import org.apache.maven.plugin.MojoExecutionException;
022    import org.apache.maven.plugin.MojoFailureException;
023    import org.kuali.common.util.CollectionUtils;
024    import org.kuali.common.util.PropertyUtils;
025    
026    /**
027     * Write project properties to a file.
028     *
029     * @author Jeff Caddel
030     *
031     * @goal write-project-properties
032     */
033    public class WriteProjectProperties extends AbstractWritePropertiesMojo {
034    
035            /**
036             * If true, the plugin will include system properties when writing the properties file. System properties override both environment
037             * variables and project properties.
038             *
039             * @parameter default-value="false" expression="${properties.includeSystemProperties}"
040             */
041            private boolean includeSystemProperties;
042    
043            /**
044             * If true, the plugin will include environment variables when writing the properties file. Environment variables are prefixed with
045             * "env". Environment variables override project properties.
046             *
047             * @parameter default-value="false" expression="${properties.includeEnvironmentVariables}"
048             */
049            private boolean includeEnvironmentVariables;
050    
051            /**
052             * CSV list of properties to exclude. A single wildcard character <code>*</code> is supported.
053             *
054             * @parameter expression="${properties.exclude}"
055             */
056            private String exclude;
057    
058            /**
059             * CSV list of properties to include. A single wildcard character <code>*</code> is supported.
060             *
061             * @parameter expression="${properties.include}"
062             */
063            private String include;
064    
065            /**
066             * List of properties to include. A single wildcard character <code>*</code> is supported.
067             *
068             * @parameter
069             */
070            private List<String> includes;
071    
072            /**
073             * List of properties to exclude. A single wildcard character <code>*</code> is supported.
074             *
075             * @parameter
076             */
077            private List<String> excludes;
078    
079            /**
080             * If true placeholders are resolved before writing properties to the file
081             *
082             * @parameter expression="${properties.resolvePlaceholders}" default-value="false"
083             */
084            private boolean resolvePlaceholders;
085    
086            /**
087             * If true, these Maven properties are added to the properties file:
088             *
089             * <pre>
090             *   project.groupId
091             *   project.artifactId
092             *   project.version
093             *   project.basedir
094             *   project.build.directory
095             * </pre>
096             *
097             * @parameter expression="${properties.includeStandardMavenProperties}" default-value="false"
098             */
099            private boolean includeStandardMavenProperties;
100    
101            @Override
102            public void execute() throws MojoExecutionException, MojoFailureException {
103                    Properties properties = new Properties();
104    
105                    // Add project properties
106                    properties.putAll(project.getProperties());
107    
108                    if (includeStandardMavenProperties) {
109                            properties.putAll(MavenUtils.getInternalMavenProperties(project));
110                    }
111    
112                    // Add environment variables, overriding any existing properties with the same key
113                    if (includeEnvironmentVariables) {
114                            properties.putAll(PropertyUtils.getEnvAsProperties());
115                    }
116    
117                    // Add system properties, overriding any existing properties with the same key
118                    if (includeSystemProperties) {
119                            properties.putAll(System.getProperties());
120                    }
121    
122                    // Merge the lists with the csv values
123                    List<String> includeList = CollectionUtils.sortedMerge(includes, include);
124                    List<String> excludeList = CollectionUtils.sortedMerge(excludes, exclude);
125    
126                    // Override any properties from the includes list with their equivalent system/env value
127                    override(properties, includeList);
128    
129                    // Resolve placeholders
130                    if (resolvePlaceholders) {
131                            Properties resolved = PropertyUtils.getResolvedProperties(properties);
132                            getLog().info("Resolved " + resolved.size() + " properties");
133                            properties.putAll(resolved);
134                    }
135    
136                    // Remove properties as appropriate
137                    PropertyUtils.trim(properties, includeList, excludeList);
138    
139                    // Save the properties to a file
140                    writeProperties(outputFile, properties, outputStyle, prefix, encoding, comment);
141            }
142    
143            protected void override(Properties properties, List<String> includes) {
144                    List<String> keys = PropertyUtils.getSortedKeys(properties, includes, null);
145                    Properties global = PropertyUtils.getGlobalProperties(properties);
146                    properties.clear();
147                    for (String key : keys) {
148                            String value = global.getProperty(key);
149                            if (value != null) {
150                                    properties.setProperty(key, value);
151                            }
152                    }
153            }
154    
155            public boolean isIncludeSystemProperties() {
156                    return includeSystemProperties;
157            }
158    
159            public void setIncludeSystemProperties(boolean includeSystemProperties) {
160                    this.includeSystemProperties = includeSystemProperties;
161            }
162    
163            public boolean isIncludeEnvironmentVariables() {
164                    return includeEnvironmentVariables;
165            }
166    
167            public void setIncludeEnvironmentVariables(boolean includeEnvironmentVariables) {
168                    this.includeEnvironmentVariables = includeEnvironmentVariables;
169            }
170    
171            public String getExclude() {
172                    return exclude;
173            }
174    
175            public void setExclude(String exclude) {
176                    this.exclude = exclude;
177            }
178    
179            public String getInclude() {
180                    return include;
181            }
182    
183            public void setInclude(String include) {
184                    this.include = include;
185            }
186    
187            public boolean isResolvePlaceholders() {
188                    return resolvePlaceholders;
189            }
190    
191            public void setResolvePlaceholders(boolean resolvePlaceholders) {
192                    this.resolvePlaceholders = resolvePlaceholders;
193            }
194    
195            public boolean isIncludeStandardMavenProperties() {
196                    return includeStandardMavenProperties;
197            }
198    
199            public void setIncludeStandardMavenProperties(boolean includeStandardMavenProperties) {
200                    this.includeStandardMavenProperties = includeStandardMavenProperties;
201            }
202    
203            public List<String> getIncludes() {
204                    return includes;
205            }
206    
207            public void setIncludes(List<String> includes) {
208                    this.includes = includes;
209            }
210    
211            public List<String> getExcludes() {
212                    return excludes;
213            }
214    
215            public void setExcludes(List<String> excludes) {
216                    this.excludes = excludes;
217            }
218    
219    }