/*******************************************************************************
 * Copyright (c) 2006, 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.server.ui.internal.viewers;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Version {
	private static final String SEPARATOR = ".";

	private String[] version;

	public Version(String s) {
		StringTokenizer st = new StringTokenizer(s, SEPARATOR);
		List<String> list = new ArrayList<String>();
		
		while (st.hasMoreTokens()) {
			String str = st.nextToken();
			int size = str.length();
			for (int i = 0; i < size; i++) {
				if (!Character.isLetterOrDigit(str.charAt(i)))
					throw new NumberFormatException("Version strings cannot contain '" + str.charAt(i) + "'");
			}
			list.add(str);
		}
		
		version = new String[list.size()];
		list.toArray(version);
	}

	public static Version parseVersion(String s) {
		return new Version(s);
	}

	public static int compare(Version v1, Version v2) {
		int v1l = v1.version.length;
		int v2l = v2.version.length;
		
		int size = Math.min(v1l, v2l);
		for (int i = 0; i < size; i++) {
			try {
				double d1 = Double.parseDouble(v1.version[i]);
				double d2 = Double.parseDouble(v2.version[i]);
				
				int c = Double.compare(d1, d2);
				if (c != 0)
					return c;
			} catch (NumberFormatException nfe) {
				// ignore
			}
			
			int c = v1.version[i].compareTo(v2.version[i]);
			if (c != 0)
				return c;
		}
		if (v1l == v2l)
			return 0;
		if (v1l > v2l)
			return 1;
		return -1;
	}
}
