/*******************************************************************************
 * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.tools.workbench.test.ant;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

import junit.framework.TestCase;

import org.eclipse.persistence.tools.workbench.mappingsio.ProjectIOManager;
import org.eclipse.persistence.tools.workbench.mappingsmodel.project.MWProject;
import org.eclipse.persistence.tools.workbench.utility.io.FileTools;
/**
 * Test the Ant extension project runners.
 * Generates an Employee project in resource, tests the project validation routine
 * exports the deployment descriptor for the generated MWP.
 * resource/ant/build.xml will perform the real Ant extension test, and will
 * rely on the MWP project and on the TopLink deployment descriptor XML 
 * generated by this test suite.
 */
public abstract class ProjectRunnerTests extends TestCase {
    protected File tempDir;
    protected String projectFileName;
    protected PrintStream log;
	private FileOutputStream logFile;
	
	public final static String MW = "mw";
	
	public ProjectRunnerTests( String name) {
        super( name);
    }
	/**
	 * Setup the temp directory in resource.
	 * Generates a MWP.
	 */
	protected void setUp() throws Exception {
		super.setUp();

		File resourceDir = FileTools.resourceFile( "/ant");
		this.tempDir = emptyTemporaryDirectory( resourceDir.getAbsolutePath() + "/temp");
		this.logFile =  new FileOutputStream( tempDir.getAbsolutePath() + "/log.txt");
		this.log = new PrintStream( logFile);
		
		MWProject project =  this.buildProject();
		this.postBuildProject( project);
		projectFileName= this.buildAndWriteProject( project);
	}

	protected void tearDown() throws Exception {
		super.tearDown();

		this.log.close();
		this.logFile.close();
	}
	/**
	 * Generates a MWP.
	 */
	private String buildAndWriteProject( MWProject project) throws Exception {

		project.setSaveDirectory( new File( this.tempDir, MW));
		
		new ProjectIOManager().write( project);
		
		return project.saveFile().getAbsolutePath();
	}
	
	protected abstract MWProject buildProject() throws Exception;

	/**
	 * Post building MW project.
	 */
	protected abstract void postBuildProject( MWProject project);
	
	private File emptyTemporaryDirectory( String baseDir) {
		File dir = new File( baseDir);
		if( dir.exists())
		    FileTools.deleteDirectoryContents( dir);
		else
			dir.mkdirs();
		return dir;
	}
}
