/*******************************************************************************
 * 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.sequencing.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.sequencing.*;

/**
 * Bug 5703242 - REGRESSION: IN 10.1.3 TABLESEQUENCE IGNORES TABLE QUALIFIER
 * Test configuring a table qualifier for different sequencing types.
 * A sequencing object should use the table qualifier set on the DatasourcePlatform.
 */
public class SequencingTableQualifierTest extends AutoVerifyTestCase {

    public static final int TABLE_SEQUENCE = 1;
    public static final int UNARY_TABLE_SEQUENCE = 2;
    
    private int sequenceType = -1;
    private Sequence oldSequence;
    private String oldTableQualifier;
    private Exception storedException;

    public SequencingTableQualifierTest(int sequenceType) {
        super();
        this.sequenceType = sequenceType; 
        setDescription("Test to check that setting a sequencing table qualifier works correctly");
    }
    
    public void setup() {
        // cache existing sequence
        this.oldSequence = getDatabaseSession().getLogin().getDefaultSequence();
        this.oldTableQualifier = getDatabaseSession().getLogin().getTableQualifier();
        
        // need to log out of session
        getDatabaseSession().logout();
        
        // create new Sequence object
        Sequence newSequence = null;
        if (this.sequenceType == TABLE_SEQUENCE) {
            newSequence = createTableSequence();
        } else if (this.sequenceType == UNARY_TABLE_SEQUENCE) {
            newSequence = createUnaryTableSequence();
        }
        
        // set new Sequence
        getDatabaseSession().getLogin().setDefaultSequence(newSequence);

        // reset the table qualifier
        getDatabaseSession().getLogin().setTableQualifier("INVALID_QUALIFIER");

        getDatabaseSession().login();
    }
    
    public Sequence createUnaryTableSequence() {
        return new UnaryTableSequence("ADDRESS_SEQ", 40, "COUNTER");
    }
    
    public Sequence createTableSequence() {
        String sequenceTableName = "SEQUENCE";
        if (getSession().getPlatform().getDefaultSequence().isTable()) {
            sequenceTableName = getSession().getPlatform().getQualifiedSequenceTableName();
        }
        return new TableSequence("", 50, sequenceTableName, "SEQ_NAME", "SEQ_COUNT"); 
    }
    
    public void test() {
        UnitOfWork uow = getDatabaseSession().acquireUnitOfWork();
        try {
            SeqTestClass2 testObject = new SeqTestClass2();
            testObject.setTest1("Sequence Test Object");
            testObject.setTest2("test2");
            
            uow.registerObject(testObject);
            uow.writeChanges();
        } catch (Exception e) {
            // we expect that the sequence table will not exist (INVALID_QUALIFIER.SEQUENCE)
            this.storedException = e;
        } finally {
            uow.release();
        }
    }
    
    public void verify() {
        if (this.storedException == null) {
            throw new TestErrorException("No exception thrown - sequencing table qualifier was not used");
        }
        // might as well do an additional Oracle error code check
        if (getSession().getPlatform().isOracle()) {
            if (storedException.getMessage().indexOf("ORA-00942") == -1) {
                throw new TestErrorException("Unexpected Oracle exception: " + storedException.getMessage());
            }
        }
    }
    
    public void reset() {
        getDatabaseSession().logout();
        getDatabaseSession().getLogin().setDefaultSequence(this.oldSequence);
        getDatabaseSession().getLogin().setTableQualifier(this.oldTableQualifier);
        getDatabaseSession().login();
    }

}
