/**
 * <copyright>
 *
 * Copyright (c) 2005, 2006, 2007, 2008 Springsite BV (The Netherlands) 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:
 *   Martin Taal
 * </copyright>
 *
 * $Id: AbstractActionTest.java,v 1.8 2008/02/28 07:08:16 mtaal Exp $
 */

package org.eclipse.emf.teneo.test;

import java.util.Properties;

import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.teneo.Constants;
import org.eclipse.emf.teneo.PersistenceOptions;
import org.eclipse.emf.teneo.extension.ExtensionManager;

/**
 * Hibernate test based on abstract action.
 * 
 * @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
 * @version $Revision: 1.8 $
 */
public class AbstractActionTest extends AbstractTest {
	/** The action contains the real test */
	protected AbstractTestAction itsTestAction;

	private Properties properties;

	/** Constructor */
	public AbstractActionTest(Class<?> testActionClass) {
		super("testAction");
		try {
			itsTestAction = (AbstractTestAction) testActionClass.newInstance();
		} catch (Exception e) {
			throw new StoreTestException("Exception while instantiating " + testActionClass.getName(), e);
		}
	}

	/** Constructor */
	public AbstractActionTest(AbstractTestAction itsTestAction) {
		this(itsTestAction, null);
	}

	/**
	 * Constructs an instance with additional OR-mapping properties.
	 * 
	 * @param itsTestAction
	 * @param properties
	 */
	public AbstractActionTest(AbstractTestAction itsTestAction, Properties properties) {
		super("testAction");
		this.itsTestAction = itsTestAction;
		this.properties = properties;
	}

	/** returns the underlying test action */
	public AbstractTestAction getTestAction() {
		return itsTestAction;
	}

	/** The actual test run */
	public void testAction() {
		getTestAction().doAction(getStore());
	}

	/** Return the epackages for which this test is done */
	@Override
	public EPackage[] getEPackages() {
		return getTestAction().getEPackages();
	}

	/** Return the test package name */
	@Override
	public String getTestPackageName() {
		return getTestAction().getTestPackageName();
	}

	public Properties getProperties() {
		return properties;
	}

	public void setProperties(Properties props) {
		properties = props;
	}

	/** Return the test package name */
	@Override
	public Package getTestPackage() {
		return getTestAction().getClass().getPackage();
	}

	/** Returns extra properties which are passed to the or layer for additional configuration */
	@Override
	public Properties getExtraConfigurationProperties() {
		Properties allProperties = getTestAction().getExtraConfigurationProperties();

		if (!getTestAction().supportAuditing()) {
			allProperties.setProperty(Constants.ANNOTATION_AUDITING_NOT, "true");
		}

		allProperties.setProperty(PersistenceOptions.HIBERNATE_VERSION, "4.2.7SP1");
		
		// override some defaults
		if (allProperties.get(PersistenceOptions.SET_DEFAULT_CASCADE_ON_NON_CONTAINMENT) == null) {
			allProperties.setProperty(PersistenceOptions.SET_DEFAULT_CASCADE_ON_NON_CONTAINMENT, "true");
		}

		if (allProperties.get(PersistenceOptions.JOIN_TABLE_NAMING_STRATEGY) == null) {
			allProperties.setProperty(PersistenceOptions.JOIN_TABLE_NAMING_STRATEGY, "ejb3");
		}

		if (this.properties != null) {
			allProperties.putAll(this.properties);
		}
		
		return allProperties;
	}

	/** Add extensions if you want */
	@Override
	public void setExtensions(ExtensionManager extensionManager) {
		getTestAction().setExtensions(extensionManager);
	}

	/** Returns a unique name based on the class name of the testAction class */
	@Override
	public String getName() {
		return itsTestAction.getClass().getName();
	}

	/** Returns a simple name based on the class name of the testAction class. */
	@Override
	public String getSimpleName() {
		final String name = getName();
		return name.substring(name.lastIndexOf(".") + 1);
	}
}