/**
 * <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:
 * AgilAction.java,v 1.1 2007/03/28 13:58:33 mtaal Exp $
 */

package org.eclipse.emf.teneo.hibernate.test.issues;

import javax.persistence.PersistenceException;

import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.teneo.hibernate.test.stores.HibernateTestStore;
import org.eclipse.emf.teneo.samples.issues.bz398161.Bz398161Factory;
import org.eclipse.emf.teneo.samples.issues.bz398161.Bz398161Package;
import org.eclipse.emf.teneo.samples.issues.bz398161.RefOne;
import org.eclipse.emf.teneo.samples.issues.bz398161.RefTwo;
import org.eclipse.emf.teneo.test.AbstractTestAction;
import org.eclipse.emf.teneo.test.stores.TestStore;
import org.hibernate.exception.ConstraintViolationException;
import org.hibernate.tool.hbm2ddl.SchemaValidator;

/**
 * @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
 * @version $Revision: 1.1 $
 */
public class Bz398161Action extends AbstractTestAction {

	private Bz398161Factory factory = Bz398161Factory.eINSTANCE;

	public Bz398161Action() {
		super(new EPackage[] { Bz398161Package.eINSTANCE });
	}

	@Override
	public void doAction(TestStore store) {
		{
			store.beginTransaction();
			RefOne refOne = factory.createRefOne();
			RefTwo refTwo = factory.createRefTwo();
			refOne.setRefTwo(refTwo);
			refOne.setStringVal("val");
			refTwo.setNumber("abc");
			store.store(refTwo);
			store.store(refOne);
			store.commitTransaction();
		}
		{
			// the not-null in the columndefinition is applied correctly
			try {
				store.beginTransaction();
				RefOne refOne = factory.createRefOne();
				store.store(refOne);
				store.commitTransaction();
				fail();
			} catch (PersistenceException e) {
				assertTrue(e.getCause() instanceof ConstraintViolationException);
			} catch (ConstraintViolationException e) {
			}
		}

		// validate the schema
		final HibernateTestStore hbStore = (HibernateTestStore) store;
		SchemaValidator validator = new SchemaValidator(hbStore.getEmfDataStore()
				.getHibernateConfiguration());
		validator.validate();
	}
}
