/*******************************************************************************
 * 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:
 *     John Vandale - initial API and implementation.
 ******************************************************************************/  
package org.eclipse.persistence.testing.tests.history;


import java.util.ArrayList;
import java.util.List;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.testing.models.mapping.Baby;
import org.eclipse.persistence.testing.models.mapping.BabyMonitor;
import org.eclipse.persistence.testing.models.mapping.BiDirectionInserOrderTestProject;
import org.eclipse.persistence.testing.models.mapping.BiDirectionInsertOrderTableMaker;
import org.eclipse.persistence.tools.history.HistoryFacade;
import org.eclipse.persistence.tools.schemaframework.SchemaManager;
import org.eclipse.persistence.exceptions.DatabaseException;


// Bug 319276
public class InsertWithHistoryPolicyTest extends TestCase {
    
    DatabaseSession dbSession;
    protected DatabaseException caughtException = null;
    protected static boolean isHistoryFirstCreation = true;
    
    public InsertWithHistoryPolicyTest() {
        setDescription("Tests insert for bi-directional 1 - 1 mapping with history policy.");
    }

    protected void setup() {
        if(getSession().getPlatform().isMySQL() || getSession().getPlatform().isSybase()) {
            throwWarning("This test will not work with MySQL or Sybase because it doesn't support millisecond granularity.");
        }
        
        org.eclipse.persistence.sessions.Project project = new BiDirectionInserOrderTestProject();
        DatabaseLogin databaseLogin = (DatabaseLogin)getSession().getLogin().clone();
        project.setLogin(databaseLogin);
        dbSession = project.createDatabaseSession();
        dbSession.setSessionLog(getSession().getSessionLog());
        HistoryFacade.generateHistoryPolicies(dbSession);
        BiDirectionInsertOrderTableMaker creator = new BiDirectionInsertOrderTableMaker();
        dbSession.login();
        // create or delete original tables
        creator.replaceTables(dbSession);

        List origTableDefs = new ArrayList(creator.getTableDefinitions());
        HistoryFacade.generateHistoricalTableDefinitions(creator, dbSession);
        // remove entries of tables already dealt with; only history tables remain
        creator.getTableDefinitions().removeAll(origTableDefs);
        boolean org_FAST_TABLE_CREATOR = false;
        if (isHistoryFirstCreation && creator.isFastTableCreator()) {
            // clear the flag that was set for the original tables
            creator.resetFastTableCreator();
            org_FAST_TABLE_CREATOR = SchemaManager.FAST_TABLE_CREATOR;
            SchemaManager.FAST_TABLE_CREATOR = false;
        }
        try {
            // create or delete history tables
            creator.replaceTables(dbSession);
        } finally {
            if (org_FAST_TABLE_CREATOR) {
                SchemaManager.FAST_TABLE_CREATOR = true;
            }
        }
        isHistoryFirstCreation = false;
    }
    
    protected void test() {
        UnitOfWork uow = dbSession.acquireUnitOfWork();
        Baby baby = new Baby();
        BabyMonitor monitor = new BabyMonitor();
        baby.setBabyMonitor(monitor);
        monitor.setBaby(baby);
        uow.registerObject(baby);
        
        try {
            uow.commit();
        } catch (DatabaseException dbe) {
            caughtException = dbe;
        }    
    }
    
    protected void verify() {
        if (caughtException != null) {
            if (caughtException.getDatabaseErrorCode() == 1400) {//SQLException: cannot insert NULL into (non-null defined column)
                throwError("Invalid attempt to insert null value into history table for non-null defined field.", caughtException);
            } else {
                throwError(caughtException.getMessage(), caughtException);
            }
        }
    }
}
