//------------------------------------------------------------------------------
// Copyright (c) 2005, 2008 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.tests;

import java.io.File;

import junit.framework.TestCase;

import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.LibraryServiceException;
import org.eclipse.epf.library.xmi.XMILibraryUtil;
import org.eclipse.epf.persistence.MultiFileSaveUtil;
import org.eclipse.epf.uma.MethodLibrary;

/**
 * The abstract base class for all JUnit test cases that needs to open a method library
 * 
 * @author Phong Nguyen Le
 * @since 1.0
 */
public abstract class AbstractLibraryTestCase extends TestCase {

	protected MethodLibrary library;

	protected boolean deleteLibraryOnExit = false;

	public AbstractLibraryTestCase(String name) {
		super(name);
	}

	/**
	 * @see junit.framework.TestCase#setUp()
	 */
	protected void setUp() throws Exception {
		super.setUp();
		
		openLibrary();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see junit.framework.TestCase#tearDown()
	 */
	protected void tearDown() throws Exception {
		if (deleteLibraryOnExit) {
			LibraryTestHelper.closeLibrary();
		} else {
			LibraryService.getInstance().closeCurrentMethodLibrary();
		}
		super.tearDown();
	}

	protected MethodLibrary openLibrary() throws LibraryServiceException {
		String libPath = System.getProperty("epf.library");
		libPath = "E:\\Root\\a_Rmc7.5.1.2\\prototypes\\Config\\QueryConfigBuilderTestLib";
		if(libPath == null) {
			String path = TestsPlugin.getDefault().getInstallPath() + File.separator + "Libraries" + File.separator + "OpenUP";
			if(new File(path, MultiFileSaveUtil.DEFAULT_LIBRARY_MODEL_FILENAME).exists()) {
				libPath = path;
			}
		}
		if (libPath != null) {
			library = XMILibraryUtil.openMethodLibrary(libPath);
			LibraryService.getInstance().setCurrentMethodLibrary(library);
		} else {
			library = LibraryTestHelper.createTestMethodLibrary();
			deleteLibraryOnExit = true;
		}
		return library;
	}

	protected MethodLibrary reopenLibrary() throws LibraryServiceException {
		return LibraryService.getInstance().reopenCurrentMethodLibrary();
	}

}
