/*******************************************************************************
 * 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.testing.tests.feature;

import org.eclipse.persistence.internal.databaseaccess.*;
import org.eclipse.persistence.sequencing.Sequence;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.testing.tests.expressions.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.aggregate.AggregateSystem;
import org.eclipse.persistence.testing.models.collections.CollectionsSystem;
import org.eclipse.persistence.testing.models.inheritance.InheritanceSystem;
import org.eclipse.persistence.testing.models.legacy.LegacySystem;
import org.eclipse.persistence.testing.models.mapping.MappingSystem;
import org.eclipse.persistence.testing.models.multipletable.ProjectSystem;
import org.eclipse.persistence.testing.models.ownership.OwnershipSystem;
import org.eclipse.persistence.testing.models.employee.relational.EmployeeSystem;
import org.eclipse.persistence.testing.tests.employee.EmployeeBasicTestModel;
import org.eclipse.persistence.testing.tests.inheritance.InheritanceTestModel;

/**
 * This suite runs the employee basic tests using a table qualifier, native sql and native sequencing.
 */
public class NativeModeCreatorTestModel extends TestModel {
    protected Boolean usesNativeSQL;
    protected Sequence defaultSequence;
    protected Boolean shouldBindAllParameters;
    protected String qualifier;

    /**
     * This sets the table qualifier and native mode.
     */
    public void addForcedRequiredSystems() {
        DatabasePlatform platform = getSession().getPlatform();
        usesNativeSQL = Boolean.valueOf(platform.usesNativeSQL());
        defaultSequence = getSession().getLogin().getDefaultSequence();
        shouldBindAllParameters = Boolean.valueOf(platform.shouldBindAllParameters());

        if (platform.isSybase() || platform.isSQLAnywhere() || platform.isOracle() || platform.isSQLServer() || platform.isInformix() || 
            platform.isMySQL() || platform.isDB2() || platform.isTimesTen() || platform.isSymfoware()) {
            
            platform.setUsesNativeSQL(true);
            getSession().getLogin().useNativeSequencing();
            getDatabaseSession().getSequencingControl().resetSequencing();
        }
        // We need to disable binding for testing native SQL.
        platform.setShouldBindAllParameters(false);

        getExecutor().removeConfigureSystem(new EmployeeSystem());
        // Force the database to be recreated to ensure the sequences are defined.
        addForcedRequiredSystem(new EmployeeNativeModeSystem());
        
        getExecutor().removeConfigureSystem(new InheritanceSystem());
        addForcedRequiredSystem(new InheritanceSystem());
    }

    public void addRequiredSystems() {
        addRequiredSystem(new OwnershipSystem());
        addRequiredSystem(new LegacySystem());
        addRequiredSystem(new ProjectSystem());
        addRequiredSystem(new CollectionsSystem());
        addRequiredSystem(new MappingSystem());
        addRequiredSystem(new AggregateSystem());
    }

    public void addTests() {
        addTest(EmployeeBasicTestModel.getReadObjectTestSuite());
        addTest(EmployeeBasicTestModel.getUpdateObjectTestSuite());
        addTest(EmployeeBasicTestModel.getInsertObjectTestSuite());
        addTest(EmployeeBasicTestModel.getDeleteObjectTestSuite());
        addTest(EmployeeBasicTestModel.getReadAllTestSuite());
        addTest(new ExpressionTestSuite());
        
        addTest(InheritanceTestModel.getDeleteObjectTestSuite());

        TestSuite seqSuite = new TestSuite();
        seqSuite.setName("EmployeeNativeSeqTestSuite");
        seqSuite.setDescription("This suite tests native sequencing in the employee demo.");
        seqSuite.addTest(new OracleNativeSeqInitTest(false, 0));
        seqSuite.addTest(new OracleNativeSeqInitTest(false, 1));
        seqSuite.addTest(new OracleNativeSeqInitTest(false, 2));
        seqSuite.addTest(new OracleNativeSeqInitTest(false, 3));
        addTest(seqSuite);
    }

    /**
     * This sets the table qualifier and native mode.
     */
    public void setup() {
        getSession().getIdentityMapAccessor().initializeIdentityMaps();
        // Set table qualifier for Oracle, assume user name is schema.
        if (getSession().getLogin().getPlatform().isOracle()) {
            String oldUser = null;
            try {
                oldUser = getAbstractSession().getAccessor().getConnection().getMetaData().getUserName();
            } catch (Exception exception) {
                throw new TestErrorException("Meta-data error.", exception);
            }
            getExecutor().swapCleanDatabaseSession();
            getSession().getLogin().setUserName("scott");
            getSession().getLogin().setPassword("tiger");
            qualifier = getSession().getLogin().getTableQualifier();
            getSession().getLogin().setTableQualifier(oldUser);
            getDatabaseSession().logout();

            DatabaseSession newDBSession = getDatabaseSession();
            new EmployeeNativeModeSystem().addDescriptors(newDBSession);
            new InheritanceSystem().addDescriptors(newDBSession);
            new OwnershipSystem().addDescriptors(newDBSession);
            new LegacySystem().addDescriptors(newDBSession);
            new ProjectSystem().addDescriptors(newDBSession);
            new CollectionsSystem().addDescriptors(newDBSession);
            new MappingSystem().addDescriptors(newDBSession);
            new AggregateSystem().addDescriptors(newDBSession);
            
            getDatabaseSession().login();
            
            new EmployeeNativeModeSystem().dropTableConstraints(getSession());
            new InheritanceSystem().dropTableConstraints(getSession());
        }
    }

    /**
     * This unsets the table qualifier and native mode.
     */
    public void reset() {
        getExecutor().resetSession();

        DatabasePlatform platform = getSession().getPlatform();

        if (platform.isSybase() || platform.isSQLAnywhere() || platform.isOracle() || platform.isSQLServer() || platform.isInformix() || 
            platform.isMySQL() || platform.isDB2() || platform.isTimesTen() || platform.isSymfoware()) {
            
            if (usesNativeSQL != null) {
                platform.setUsesNativeSQL(usesNativeSQL.booleanValue());
            }
            if (defaultSequence != null) {
                getSession().getLogin().setDefaultSequence(defaultSequence);
                getDatabaseSession().getSequencingControl().resetSequencing();
            }
        }
        if (shouldBindAllParameters != null) {
            platform.setShouldBindAllParameters(shouldBindAllParameters.booleanValue());
        }
        if (qualifier != null) {
            getSession().getLogin().setTableQualifier(qualifier);
        }
        
        getSession().getIdentityMapAccessor().initializeIdentityMaps();
        getExecutor().removeConfigureSystem(new EmployeeSystem());
        getExecutor().removeConfigureSystem(new InheritanceSystem());

        getDatabaseSession().logout();
        getDatabaseSession().login();
    }
}
