// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.maint;

public class Version {
    /**
     * Compares two version strings and see which one is higher version.
     * @param ver1
     * @param ver2
     * @return positive if ver1 is higher.  negative if ver1 is lower; zero if the same.
     */
    public static int compare(String ver1, String ver2) {
        String[] tokens1 = ver1.split("[.]");
        String[] tokens2 = ver2.split("[.]");
//        assert(tokens1.length <= tokens2.length);
        
        int compareLength = Math.min(tokens1.length, tokens2.length);
        for (int i = 0; i < compareLength; i++) {
        	long version1 = Long.parseLong(tokens1[i]);
        	long version2 = Long.parseLong(tokens2[i]);
            if (version1 != version2) {
                return version1 < version2 ? -1 : 1;
            }
        }
        
        if (tokens1.length > tokens2.length) {
            return 1;
        } else if (tokens1.length < tokens2.length) {
            return -1;
        }
        
        return 0;
    }
    
    public static String trimToPatch(String version) {
    	int index = version.indexOf("-");
    	
    	if ( index > 0 )
    		version = version.substring(0, index);

        String[] tokens = version.split("[.]");

        if ( tokens.length < 3  )
        	return "0";
        return tokens[0] + "." + tokens[1]+ "." + tokens[2];
    }
    
    public static void main(String[] args) {
    	System.out.println("Result is " + compare(args[0], args[1]));
    }

}
