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.Properties;
019    
020    import org.apache.commons.lang.StringUtils;
021    import org.apache.maven.plugin.AbstractMojo;
022    import org.apache.maven.plugin.MojoExecutionException;
023    import org.apache.maven.project.MavenProject;
024    
025    /**
026     * Parse version number properties into [major].[minor].[incremental].[qualifier]. The version parsing logic is crudely
027     * simple. It splits the version string into tokens using both "." and "-" as delimiters. It assumes the first token is
028     * "major", the second token is "minor" the third token is "incremental" and the fourth token is "qualifier".
029     *
030     * @goal parse-version-properties
031     */
032    public class ParseVersionPropertiesMojo extends AbstractMojo {
033    
034        /**
035         * @parameter default-value="${project}"
036         * @required
037         * @readonly
038         */
039        private MavenProject project;
040    
041        /**
042         * The list of properties containing version numbers to parse
043         *
044         * @parameter
045         * @required
046         */
047        private String[] properties;
048    
049        @Override
050        public void execute() throws MojoExecutionException {
051            Properties props = project.getProperties();
052            for (String key : properties) {
053                String value = getProperty(key);
054                if (StringUtils.isBlank(value)) {
055                    continue;
056                }
057                Version version = parseVersion(value);
058                setProjectProperty(key, "major", version.getMajor(), props);
059                setProjectProperty(key, "minor", version.getMinor(), props);
060                setProjectProperty(key, "incremental", version.getIncremental(), props);
061                setProjectProperty(key, "qualifier", version.getQualifier(), props);
062            }
063        }
064    
065        protected void setProjectProperty(String key, String suffix, String value, Properties props) {
066            if (StringUtils.isBlank(value)) {
067                return;
068            }
069            props.setProperty(key + "." + suffix, value);
070            getLog().info("Setting " + key + "." + suffix + "=" + value);
071        }
072    
073        protected Version parseVersion(String s) {
074            Version version = new Version();
075            String[] tokens = StringUtils.split(s, ".-");
076            if (tokens.length > 0) {
077                version.setMajor(tokens[0]);
078            }
079            if (tokens.length > 1) {
080                version.setMinor(tokens[1]);
081            }
082            if (tokens.length > 2) {
083                version.setIncremental(tokens[2]);
084            }
085            if (tokens.length > 3) {
086                version.setQualifier(tokens[3]);
087            }
088            return version;
089        }
090    
091        protected String getProperty(String key) {
092            String sys = System.getProperty(key);
093            String proj = project.getProperties().getProperty(key);
094            if (!StringUtils.isBlank(sys)) {
095                return sys;
096            } else {
097                return proj;
098            }
099    
100        }
101    
102        public String[] getProperties() {
103            return properties;
104        }
105    
106        public void setProperties(String[] properties) {
107            this.properties = properties;
108        }
109    }