Author: barrettj Date: Fri Jan 7 15:23:24 2011 New Revision: 1056346 URL: http://svn.apache.org/viewvc?rev=1056346&view=rev Log: Fix the WsGen version number checking, which is used to determine the WebMethod annotation processing rules. Update associated test.
Modified: axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/util/WSToolingUtils.java axis/axis2/java/core/trunk/modules/metadata/test/org/apache/axis2/jaxws/utils/WSToolingUtilsTests.java Modified: axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/util/WSToolingUtils.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/util/WSToolingUtils.java?rev=1056346&r1=1056345&r2=1056346&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/util/WSToolingUtils.java (original) +++ axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/util/WSToolingUtils.java Fri Jan 7 15:23:24 2011 @@ -141,6 +141,13 @@ public class WSToolingUtils { return cl; } + /** + * Answer if the input version number is 2.1.6 or later. Version 2.1.6 is the Sun RI version that changed + * the WebMethod annotation semantics. + * + * @param wsGenVersion A version number separated by "." Up to the first 3 values will be checked. + * @return true if the version number is 2.1.6 or later, false otherwise. + */ public static boolean isValidVersion(String wsGenVersion) { if(log.isDebugEnabled()){ log.debug("Start isValidVersion(String)"); @@ -162,66 +169,98 @@ public class WSToolingUtils { * we return false if version is less that 2.1.6. * possible input version strings could be "JAX-WS RI 2.2-b05-", "2.1.6" "2.1.0" etc. */ - // Beginning of reuseable code - final int VERSION_FIELD_1 = 2; - final int VERSION_FIELD_2 = 1; - final int VERSION_FIELD_3 = 6; + + // Minimum version required is 2.1.6 + final int minimumVersionRequired[] = {2, 1, 6}; String version = wsGenVersion.trim(); StringTokenizer st = new StringTokenizer(version, "."); - if(st.countTokens()<=0){ + if(st.countTokens() <= 0){ if(log.isDebugEnabled()){ log.debug("No Tokens to validate the tooling version, Input version String is invalid."); } return false; } - for(int tokenCnt = 1;st.hasMoreTokens();tokenCnt++){ + + // Check up to as many version values as we have values in the minimum required version + boolean lastCheckEqual = false; + int tokenCnt = 0; + + for( ; tokenCnt < minimumVersionRequired.length && st.hasMoreTokens(); tokenCnt++) { String token = st.nextToken(); if(token == null){ return false; } - int versionNumber = getDigit(token); - if (tokenCnt==1 && versionNumber < VERSION_FIELD_1) { + int versionNumber = getIntegerValue(token); + int minimumVersionNumber = minimumVersionRequired[tokenCnt]; + + if (versionNumber < minimumVersionNumber) { + // The version number is too low, so it is invalid if(log.isDebugEnabled()){ - log.debug("Validation failed of tokenCnt="+tokenCnt); - log.debug("Input VersionNumber ="+versionNumber); + log.debug("Validation failed on tokenCnt = " + tokenCnt); + log.debug("Input VersionNumber =" + versionNumber); + log.debug("Minimum Version Number required = " + minimumVersionNumber); } return false; - } - if(tokenCnt == 2 && versionNumber < VERSION_FIELD_2 ){ + } else if (versionNumber > minimumVersionNumber) { + // The version number is higher than required, so it passes validation. if(log.isDebugEnabled()){ - log.debug("Validation failed of tokenCnt="+tokenCnt); - log.debug("Input VersionNumber ="+versionNumber); + log.debug("Validation passed on tokenCnt = " + tokenCnt); + log.debug("Input VersionNumber = " + versionNumber); + log.debug("Minimum Version Number required = " + minimumVersionNumber); } - return false; - } - if (tokenCnt==3 && versionNumber < VERSION_FIELD_3) { + return true; + } else { + // The version number sub-value matches exactly, so we need to check the next sub-value.s if(log.isDebugEnabled()){ - log.debug("Validation failed of tokenCnt="+tokenCnt); - log.debug("Input VersionNumber ="+versionNumber); + log.debug("Validation unresolved on tokenCnt = " + tokenCnt); + log.debug("Input VersionNumber = " + versionNumber); + log.debug("Minimum Version Number required = " + minimumVersionNumber); } - return false; - } + lastCheckEqual = true; + continue; + } } if(log.isDebugEnabled()){ log.debug("Exit isValidVersion(String)"); } - + // If the version numbers we checked so far were equal to the minimum version BUT it was shorter + // in length, then return false. For example if the input is "2.1", that is actually "2.1.0" + // which would be less than "2.1.6". + if (lastCheckEqual && tokenCnt < minimumVersionRequired.length) { + return false; + } return true; } + /** - * look for first digit in the version token. - * @param s - version token. - * @return a digit or -1 if not digit found in the token. + * Parse the input string and return an integer value based on it. It will look for the first numeric value + * in the string then use all digits up to the next non-numeric value or end of the string as the basis for + * the value. For example "JAX-WS RI 27" will return the value 27. + * @param s - String containing the integer to be returned. + * @return a value or -1 if not integer value was found in the token. */ - private static int getDigit(String s){ - for(int i=0;i<s.length();i++){ + private static int getIntegerValue(String s){ + int returnValue = -1; + + // Build up a buffer containing any digits up to the first non-numeric character. + StringBuffer valueString = new StringBuffer(); + for(int i = 0; i < s.length(); i++){ char ch = s.charAt(i); if(Character.isDigit(ch)){ - return Character.getNumericValue(ch); + valueString.append(Character.getNumericValue(ch)); + } else if (valueString.length() > 0){ + // We've found some numbers then encountered the first non-numeric value, so + // exit the loop and use those numbers as the value + break; } } - return -1; + + // If there were any numeric values found in the string, convert them to the integer return value + if (valueString.length() > 0) { + returnValue = Integer.valueOf(valueString.toString()); + } + return returnValue; } } Modified: axis/axis2/java/core/trunk/modules/metadata/test/org/apache/axis2/jaxws/utils/WSToolingUtilsTests.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/metadata/test/org/apache/axis2/jaxws/utils/WSToolingUtilsTests.java?rev=1056346&r1=1056345&r2=1056346&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/metadata/test/org/apache/axis2/jaxws/utils/WSToolingUtilsTests.java (original) +++ axis/axis2/java/core/trunk/modules/metadata/test/org/apache/axis2/jaxws/utils/WSToolingUtilsTests.java Fri Jan 7 15:23:24 2011 @@ -24,16 +24,51 @@ import junit.framework.TestCase; public class WSToolingUtilsTests extends TestCase { + /** + * Any string containing a version of 2.1.6 or later should return true. + */ public void testisValidVersion(){ + + // Should pass version check String wsGenVersion = "JAX-WS RI 2.2-b05-"; assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); wsGenVersion = "2.1.6"; assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "2.1.6.4"; + assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); + + // Shouldn't pass version check wsGenVersion = "2.1.0"; assertFalse(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "2.1"; + assertFalse(WSToolingUtils.isValidVersion(wsGenVersion)); wsGenVersion = "2.0.6"; assertFalse(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "2.0"; + assertFalse(WSToolingUtils.isValidVersion(wsGenVersion)); wsGenVersion = "1.1.6"; assertFalse(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "2.0-11"; + assertFalse(WSToolingUtils.isValidVersion(wsGenVersion)); + + // Should pass version check + wsGenVersion = "2.7"; + assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "2.10"; + assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "2.1.60"; + assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "2.2.1"; + assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "3"; + assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "3.2"; + assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "2.2.1.7"; + assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "2.2-11"; + assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); + wsGenVersion = "10.2"; + assertTrue(WSToolingUtils.isValidVersion(wsGenVersion)); } }