On Fri, Jan 7, 2011 at 8:53 PM, <[email protected]> wrote:

> 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));
>     }
>

Why don't you replace all those lines of code with;
String[] versions = new String[] {"2.7","2.10","2.6", ... };
for(String wsGenVersion: versions){
      assertTrue(WSToolingUtils.isValidVersion(wsGenVersion))
}

You can do the same for assertFalse checks. Makes the code much more
readable & maintainable.


>  }
>
>
>


-- 
*Afkham Azeez*
Senior Software Architect & Senior Manager; WSO2, Inc.; http://wso2.com,
*
*
*Member; Apache Software Foundation;
**http://www.apache.org/*<http://www.apache.org/>
*
email: **[email protected]* <[email protected]>* cell: +94 77 3320919
blog: **http://blog.afkham.org* <http://blog.afkham.org>*
twitter: **http://twitter.com/afkham_azeez*<http://twitter.com/afkham_azeez>
*
linked-in: **http://lk.linkedin.com/in/afkhamazeez*
*
*
*Lean . Enterprise . Middleware*
*
*

Reply via email to