/*******************************************************************************
 * Copyright (c) 2006 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.galileo.tests;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class FullJarNameParser {

	private static final boolean DEBUG = false;
	// simplified pattern: (ID) '_' (N '.' M '.' O '.' S) '.jar'
	private String START_GROUP = "(";
	private String END_GROUP = ")";
	private String UNDERSCORE = "_";
	private String BACKSLASH = "\\";
	private String LITERAL_PERIOD = BACKSLASH + ".";
	private String ANYDIGITS = BACKSLASH + "d" + "*";
	private String ANY = ".*";
	private Pattern pattern = Pattern.compile(START_GROUP + ANY + END_GROUP + UNDERSCORE + START_GROUP + START_GROUP + ANYDIGITS + END_GROUP + LITERAL_PERIOD + START_GROUP + ANYDIGITS + END_GROUP + LITERAL_PERIOD + START_GROUP + ANYDIGITS + END_GROUP + START_GROUP + LITERAL_PERIOD + ANY + END_GROUP + "?" + END_GROUP);

	private String projectString;
	private String versionString;



	public FullJarNameParser() {
		super();
	}

	public boolean parse(String line) {
		boolean result = false;
		projectString = "";
		versionString = "";
		Matcher matcher = pattern.matcher(line);

		if (!matcher.matches()) {
			result = false;
			if (DEBUG) {
				System.out.println();
				System.out.println("\tthe line did not match parse rule: ");
				System.out.println("\t" + line);
				System.out.println();
			}
		}
		else {
			projectString = matcher.group(1);
			versionString = matcher.group(2);
			result = true;
			if (DEBUG) {
				System.out.println(projectString);
				System.out.println(versionString);
				System.out.println();
			}
		}
		return result;
	}


	public String getProjectString() {
		return projectString;
	}



	public String getVersionString() {
		return versionString;
	}
}