/*******************************************************************************
 * 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 v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * 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;
	}
}
