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.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] and [trimmed]. The version parsing 027 * logic is crudely simple. It splits the version string into tokens using both "." and "-" as delimiters. It assumes 028 * the first token is "major", the second token is "minor" the third token is "incremental" and any tokens after that 029 * are "qualifier". "SNAPSHOT" is always omitted from qualifier. 030 * 031 * [trimmed] is the full version minus "-SNAPSHOT" 032 * 033 * @goal parse-version-properties 034 */ 035 public class ParseVersionPropertiesMojo extends AbstractMojo { 036 public static final String MAVEN_SNAPSHOT_TOKEN = "SNAPSHOT"; 037 038 /** 039 * @parameter default-value="${project}" 040 * @required 041 * @readonly 042 */ 043 private MavenProject project; 044 045 /** 046 * The list of properties containing version numbers to parse 047 * 048 * @parameter 049 * @required 050 */ 051 private String[] properties; 052 053 /** 054 * If true, the plugin will emit no logging messages 055 * 056 * @parameter expression="${properties.silent}" default-value="false" 057 * @required 058 */ 059 private boolean silent; 060 061 @Override 062 public void execute() throws MojoExecutionException { 063 Properties props = project.getProperties(); 064 for (String key : properties) { 065 String value = getProperty(key); 066 if (StringUtils.isBlank(value)) { 067 continue; 068 } 069 Version version = parseVersion(value); 070 setProjectProperty(key, "major", version.getMajor(), props); 071 setProjectProperty(key, "minor", version.getMinor(), props); 072 setProjectProperty(key, "incremental", version.getIncremental(), props); 073 setProjectProperty(key, "qualifier", version.getQualifier(), props); 074 setProjectProperty(key, "trimmed", trimSnapshot(value), props); 075 } 076 } 077 078 protected String trimSnapshot(String version) { 079 if (version.toUpperCase().endsWith("-" + MAVEN_SNAPSHOT_TOKEN)) { 080 int length = MAVEN_SNAPSHOT_TOKEN.length() + 1; 081 return StringUtils.left(version, version.length() - length); 082 } else { 083 return version; 084 } 085 } 086 087 protected void setProjectProperty(String key, String suffix, String value, Properties props) { 088 if (StringUtils.isBlank(value)) { 089 return; 090 } 091 props.setProperty(key + "." + suffix, value); 092 if (!silent) { 093 getLog().info("Setting " + key + "." + suffix + "=" + value); 094 } 095 } 096 097 protected Version parseVersion(String s) { 098 boolean snapshot = s.toUpperCase().endsWith("-" + MAVEN_SNAPSHOT_TOKEN); 099 Version version = new Version(); 100 version.setSnapshot(snapshot); 101 String[] tokens = StringUtils.split(s, ".-"); 102 if (tokens.length > 0) { 103 version.setMajor(tokens[0]); 104 } 105 if (tokens.length > 1) { 106 version.setMinor(tokens[1]); 107 } 108 if (tokens.length > 2) { 109 version.setIncremental(tokens[2]); 110 } 111 String qualifier = getQualifier(tokens); 112 version.setQualifier(qualifier); 113 return version; 114 } 115 116 protected String getQualifier(String[] tokens) { 117 if (tokens.length <= 3) { 118 return null; 119 } 120 StringBuilder sb = new StringBuilder(); 121 for (int i = 3; i < tokens.length; i++) { 122 if (tokens[i].toUpperCase().equals(MAVEN_SNAPSHOT_TOKEN)) { 123 break; 124 } 125 if (i != 3) { 126 sb.append("-"); 127 } 128 sb.append(tokens[i]); 129 } 130 return sb.toString(); 131 } 132 133 protected String getProperty(String key) { 134 String sys = System.getProperty(key); 135 String proj = project.getProperties().getProperty(key); 136 if (!StringUtils.isBlank(sys)) { 137 return sys; 138 } else { 139 return proj; 140 } 141 142 } 143 144 public String[] getProperties() { 145 return properties; 146 } 147 148 public void setProperties(String[] properties) { 149 this.properties = properties; 150 } 151 152 public boolean isSilent() { 153 return silent; 154 } 155 156 public void setSilent(boolean silent) { 157 this.silent = silent; 158 } 159 }