001 package org.kuali.maven.plugin; 002 003 import java.util.Properties; 004 005 import org.apache.maven.plugin.AbstractMojo; 006 import org.apache.maven.plugin.MojoExecutionException; 007 import org.apache.maven.plugin.MojoFailureException; 008 import org.apache.maven.project.MavenProject; 009 import org.codehaus.plexus.util.StringUtils; 010 011 /** 012 * Stores the major version of the project as a property. The mojo assumes 3 digit versions eg "1.0.1" and counts "1.0" 013 * as the major version 014 * 015 * @goal get-major-version 016 */ 017 public class GetMajorVersionMojo extends AbstractMojo { 018 019 /** 020 * The Maven project this plugin runs in. 021 * 022 * @parameter expression="${project}" 023 * @required 024 * @readonly 025 */ 026 private MavenProject project; 027 028 /** 029 * The property where the major version will be stored 030 * 031 * @parameter expression="${version.majorVersion}" default-value="majorVersion" 032 * @required 033 */ 034 private String majorVersionProperty; 035 036 @Override 037 public void execute() throws MojoExecutionException, MojoFailureException { 038 Properties properties = project.getProperties(); 039 if (properties.getProperty(majorVersionProperty) != null) { 040 getLog().debug(majorVersionProperty + " already set"); 041 return; 042 } 043 String majorVersion = getMajorVersion(project.getVersion()); 044 properties.setProperty(majorVersionProperty, majorVersion); 045 getLog().debug("Major Version: " + majorVersion); 046 } 047 048 protected String getMajorVersion(String version) { 049 if (StringUtils.isEmpty(version)) { 050 return null; 051 } 052 int pos = getPos(version); 053 if (pos == -1) { 054 return version; 055 } else { 056 return version.substring(0, pos); 057 } 058 } 059 060 protected int getPos(String version) { 061 int pos1 = version.indexOf("."); 062 int pos2 = version.indexOf("-"); 063 // No dot or dash 064 if (pos1 == pos2 && pos2 == -1) { 065 return -1; 066 } 067 // Dash but no dot 068 if (pos1 == -1 && pos2 != -1) { 069 return pos1; 070 } 071 // Dot but no dash 072 if (pos1 != -1 && pos2 == -1) { 073 return pos2; 074 } 075 076 // Both a dot and a dash, use the first one 077 int pos = Math.min(pos1, pos2); 078 079 // Attempt to peek ahead one character after the dot/dash 080 int index = pos + 1; 081 082 // If we go past the end of the string, forget it 083 if (index >= version.length()) { 084 return pos; 085 } 086 087 // Is that character an integer? 088 char c = version.charAt(index); 089 090 if (isInteger(c)) { 091 // If so, include it 092 return index + 1; 093 } else { 094 // If not return the original 095 return pos; 096 } 097 098 } 099 100 protected boolean isInteger(char c) { 101 switch (c) { 102 case '0': 103 case '1': 104 case '2': 105 case '3': 106 case '4': 107 case '5': 108 case '6': 109 case '7': 110 case '8': 111 case '9': 112 return true; 113 default: 114 return false; 115 } 116 } 117 118 public MavenProject getProject() { 119 return project; 120 } 121 122 public void setProject(MavenProject project) { 123 this.project = project; 124 } 125 }