/*******************************************************************************
 * 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.lob;

import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.testing.framework.TestModel;
import org.eclipse.persistence.testing.framework.TestSuite;
import org.eclipse.persistence.testing.framework.TestVariation;
import org.eclipse.persistence.testing.framework.TestWarningException;

/**
 * The test model is used to test the TopLink BLOB/CLOB support.
 * Object Model: Image [id(int), script(String), picture(byte[]), audio(byte[]), commentary(char[])]
 * Data Schame: IMAGE [id(NUMBER), SCRIPT(CLOB), PICTURE(BLOB)]
 *              CLIP [id(NUMBER), AUDIO(BLOB), COMMENTARY(CLOB)]
 * Descriptor: Image --> (IMAGE, CLIP). i.e. multiple table.
 * Mappings:  id -> ID (direct-to-field mapping).
 *            script -> SCRIPT (TypeConversionMapping, 'converted type': java.sql.Clob).
 *            picture -> PICTURE (TypeConversionMapping, 'converted type': java.sql.Blob).
 *            audio -> AUDIO (TypeConversionMapping, 'converted type': java.sql.Blob).
 *            Commentary -> COMMENTARY (TypeConversionMapping, 'converted type': java.sql.Clob).
 *
 * NOTE: The main purpose of this test model is to test Oracle Thin driver 4k limits. TopLink overally supports
 * BLOB/CLOB well with the proper JDBC drivers. One exception is Oracle thin driver, which has had a well known 4k limits
 * for LOB INSERT/UPDATE since 8i. (OTN bug number 1273826).
 * TopLink addresss this issue on 5.0, and with the features of: (for Oracle thin driver ONLY)
 * 1. Support on database session, client/server session and theoretically session broker.
 * 2. Support multiple tables.
 * 3. Support nested unite of work.
 * 4. Minimal Locator SELECT statement.
 * 5. Client side locator settings (limits size, turn on/off the locator usage) configurable through DatabaseLogin.
 * 6. Trivial overhead (two if(true) condition calls) for non Oracle thin driver usage. Easy to turn it off if the limits bug is addressed by the driver team later.
 * 7. TypeConversionMapping is now recommended for the LOB mapping and the converted type are java.sql.Clob and java.sql.Blob respectively.
 * 8. Support localization.
 *
 * @author King Wang (Aug. 2002)
 * @since TopLink/Java 5.0
 */
// This is Oracle8 specific test model.
// It won't run on any platform other than Oracle.
// Moreover, this model is Oracle8 specific.
// In setup each test verifies if the current platform is an instance of 
// Oracle9Platform, and will attempt to usePlatform(Oracle8Platform) if not
// (reset returns back the originally used DatabasePlatform).
public class LOBTestModel extends TestModel {
    String str = "shouldBindAllParameters";

    public LOBTestModel() {
        setDescription("This suite tests TopLink LOB support with Oracle thin driver.");
    }

    public void addRequiredSystems() {
        if (!getSession().getPlatform().isOracle()) {
            throw new TestWarningException("WARNING: This model is not supposed to be run on databases other than Oracle.");
        }
        addRequiredSystem(new LOBImageModelSystem());
    }

    public void addTests() {
        addTest(getLOBInsertTestSuite());
        addTest(getLOBUpdateTestSuite());
        addTest(getLOBDeleteTestSuite());
        boolean usesOCI = false;
        try {
            ((AbstractSession)getSession()).getAccessor().incrementCallCount((AbstractSession)getSession());
            java.sql.DatabaseMetaData meta =((AbstractSession)getSession()).getAccessor().getConnection().getMetaData();
            ((AbstractSession)getSession()).getAccessor().decrementCallCount();
            String url = meta.getURL();
            usesOCI = url.startsWith("jdbc:oracle:oci");
        } catch (java.sql.SQLException sqlException) {
        }
        if (usesOCI) {
            addTest(getLOBOCITestSuite());
        }
    }

    protected TestSuite getLOBInsertTestSuite() {
        TestSuite suite = new TestSuite();

        suite.setName("LOB INSERT Test Suite");
        Object obj = getSession().getPlatform();
        suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBInsertTest(ImageSimulator.generateImageNullLOB()))));
        suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBInsertTest(ImageSimulator.generateImage(1000, 800)))));
        String str2 = "usesBatchWriting " + str;
        suite.addTests(TestVariation.get(obj, str2, new LOBTestWrapper(new LOBInsertTest(ImageSimulator.generateImage(100000, 80000)))));
        return suite;
    }

    protected TestSuite getLOBUpdateTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("LOB UPDATE Test Suite");
        Object obj = getSession().getPlatform();
        suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBUpdateTest(ImageSimulator.generateImage(100, 100), 500))));
        String str2 = "usesBatchWriting " + str;
        suite.addTests(TestVariation.get(obj, str2, new LOBTestWrapper(new LOBUpdateTest(ImageSimulator.generateImage(100, 100), 120000))));
        return suite;
    }

    protected TestSuite getLOBDeleteTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("LOB DELETE Test Suite");
        Object obj = getSession().getPlatform();
        suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBDeleteTest(ImageSimulator.generateImage(2800, 900)))));
        suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBDeleteTest(ImageSimulator.generateImage(280000, 90000)))));
        return suite;
    }

    protected TestSuite getLOBOCITestSuite() {
        TestSuite suite = new TestSuite();

        suite.setName("LOB OCI Test Suite");
        Object obj = getSession().getPlatform();
        suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBInsertTest(ImageSimulator.generateImage(240000, 120000)), false)));
        return suite;
    }
}
