/*******************************************************************************
 * 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.remote;

import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.testing.tests.employee.EmployeeBasicTestModel;
import org.eclipse.persistence.testing.tests.insurance.InsuranceBasicTestModel;
import org.eclipse.persistence.testing.tests.writing.*;
import org.eclipse.persistence.testing.tests.queries.*;
import org.eclipse.persistence.testing.models.readonly.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.transparentindirection.*;
import org.eclipse.persistence.testing.tests.transparentindirection.*;
import org.eclipse.persistence.testing.models.inheritance.InheritanceSystem;

public abstract class RemoteModel extends TestModel {
    public static Session originalSession;
    protected static Session serverSession;

    public RemoteModel() {
        setDescription("It tests TopLink three tier model.");
    }

    public void addRequiredSystems() {
        addRequiredSystem(new org.eclipse.persistence.testing.models.employee.relational.EmployeeSystem());
        addRequiredSystem(new org.eclipse.persistence.testing.models.insurance.InsuranceSystem());
        addRequiredSystem(new org.eclipse.persistence.testing.tests.unitofwork.UOWSystem());
        addRequiredSystem(new org.eclipse.persistence.testing.models.mapping.MappingSystem());
        addRequiredSystem(new org.eclipse.persistence.testing.models.ownership.OwnershipSystem());
        addRequiredSystem(new InheritanceSystem());
        addRequiredSystem(new IndirectListSystem());
        addRequiredSystem(new IndirectMapSystem());
        addRequiredSystem(new MasterSlaveSystem());
        addRequiredSystem(new ReadOnlySystem());
        addRequiredSystem(new org.eclipse.persistence.testing.tests.queries.options.QueryOptionSystem());
        addRequiredSystem(new org.eclipse.persistence.testing.tests.queries.report.ReportQuerySystem());
    }

    public void addTests() {
        addTest(getBasicReadTestSuite());
        addTest(getBasicUnitOfWorkTestSuite());
        addTest(getUnitOfWorkEventTestSuite());
        addTest(getFeatureTestSuite());
        addTest(getQueryTestSuite());
        addTest(getRefreshObjectTestSuite());
        addTest(new org.eclipse.persistence.testing.tests.queries.report.ReportQueryTestSuite());
        addTest(getTransparentIndirectionTestSuite());
        addTest(new RemoteValueHolderGarbageCollectedOriginalTest(getSession()));
    }

    public Session buildServerSession() {
        org.eclipse.persistence.sessions.server.ServerSession server = (org.eclipse.persistence.sessions.server.ServerSession)((org.eclipse.persistence.sessions.Project)getSession().getProject().clone()).createServerSession();
        server.setSessionLog(getSession().getSessionLog());

        server.login();

        // Explicitly add a default read-only class to the server session since the default read-only
        // classes are not transferred at set up time in the test framework.
        getSession().getProject().addDefaultReadOnlyClass(DefaultReadOnlyTestClass.class);

        serverSession = server.acquireClientSession();
        return serverSession;
    }

    public static TestSuite getBasicReadTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("BasicReadTestSuite");
        suite.setDescription("This suite tests the reading of objects remotely.");

        suite.addTest(EmployeeBasicTestModel.getReadObjectTestSuite());
        suite.addTest(EmployeeBasicTestModel.getReadAllTestSuite());

        suite.addTest(InsuranceBasicTestModel.getReadObjectTestSuite());
        suite.addTest(InsuranceBasicTestModel.getReadAllTestSuite());

        return suite;
    }

    public static TestSuite getBasicUnitOfWorkTestSuite() {
        return ComplexUpdateAndUnitOfWorkTestModel.getUnitOfWorkTestSuite();
    }

    public static TestSuite getFeatureTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("FeatureTestSuite");
        suite.setDescription("This suite tests the features on the remote model.");

        suite.addTest(new CursoredStreamTest(org.eclipse.persistence.testing.models.employee.domain.Employee.class, new org.eclipse.persistence.expressions.ExpressionBuilder().get("address").get("city").notEqual("Tuck chu")));
        suite.addTest(new ScrollableCursorTest(org.eclipse.persistence.testing.models.employee.domain.Employee.class, new org.eclipse.persistence.expressions.ExpressionBuilder().get("firstName").like("B%")));
        suite.addTest(new ScrollableCursorTest(org.eclipse.persistence.testing.models.employee.domain.LargeProject.class, new org.eclipse.persistence.expressions.ExpressionBuilder().get("teamLeader").get("firstName").like("Sarah%")));
        suite.addTest(new ScrollableCursorAPITest());
        suite.addTest(new ScrollableCursorBackwardReadingTest());
        suite.addTest(new ScrollableCursorNavigationAPITest());
        suite.addTest(new PredefinedQueryReadObjectTest(org.eclipse.persistence.tools.schemaframework.PopulationManager.getDefaultManager().getObject(org.eclipse.persistence.testing.models.employee.domain.Employee.class, "0001")));
        suite.addTest(new PredefinedInQueryReadAllTest(org.eclipse.persistence.testing.models.employee.domain.Employee.class, 1));
        suite.addTest(new PessimisticLockTest(org.eclipse.persistence.queries.ObjectLevelReadQuery.LOCK));
        suite.addTest(new PessimisticLockTest(org.eclipse.persistence.queries.ObjectLevelReadQuery.LOCK_NOWAIT));
        suite.addTest(new org.eclipse.persistence.testing.tests.feature.PrintIdentityMapTest(org.eclipse.persistence.testing.models.employee.domain.Employee.class));
        suite.addTest(new org.eclipse.persistence.testing.tests.feature.PrintIdentityMapTest());
        suite.addTest(new DefaultReadOnlyClassTest());
        suite.addTest(new RemoteSessionReadTimeTransferTest());
        suite.addTest(new CacheExpiryRemoteTest());
        return suite;
    }

    public static TestSuite getQueryTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("QueryTestSuite");
        suite.setDescription("This suite tests features of queries (cascading, cache updating).");
        suite.addTest(new RefreshTest());
        suite.addTest(new RefreshCascadeNonPrivateTest());
        suite.addTest(new CascadeWithoutIMOnRemote());

        /** Test cascaded read queries */
        suite.addTest(new CascadingAllCacheTest());
        suite.addTest(new CascadingAllNoCacheTest());
        suite.addTest(new CascadingNoneCacheTest());
        suite.addTest(new CascadingNoneNoCacheTest());
        suite.addTest(new CascadingPrivateCacheTest());
        suite.addTest(new CascadingPrivateNoCacheTest());
        suite.addTest(new ReadingThroughRemoteScrollableCursor());
        suite.addTest(new BatchReadingForDirectCollectionMapping());

        suite.addTest(new PredefinedQueryFromRemoteSessionTest());

        suite.addTest(new QueryCacheHitEnabledAndDescriptorDisabledOnRemoteTest());
        suite.addTest(new QueryCacheHitUndefinedAndDescriptorEnabledOnRemoteTest());
        suite.addTest(new QueryCacheHitUndefinedAndDescriptorDisabledOnRemoteTest());
        suite.addTest(new QueryCacheTest());
        return suite;
    }

    public static TestSuite getRefreshObjectTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("RefreshObjectTestSuite");
        suite.setDescription("This suite tests remote refreshing: Checks if null pointer exception is thrown.");
        suite.addTest(new RefreshObjectTest());
        suite.addTest(new DescriptorRefreshCacheOnRemoteTest());
        suite.addTest(new RefreshMaintainIdentityTest());
        suite.addTest(new RefreshRemoteIdentityMapResultsTest());

        return suite;
    }

    public static Session getServerSession() {
        return serverSession;
    }

    public static TestSuite getTransparentIndirectionTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("TransparentIndirectionTestSuite");
        suite.setDescription("Test remote Transparent Indirection");

        suite.addTest(new ZTestSuite(IndirectListTestDatabaseRemote.class));
        suite.addTest(new ZTestSuite(IndirectMapTestDatabaseRemote.class));
        suite.addTest(new RemoteDataReadQueryTest());

        return suite;
    }

    public TestSuite getUnitOfWorkEventTestSuite() {
        TestSuite suite = new org.eclipse.persistence.testing.tests.unitofwork.UnitOfWorkEventTestSuite();
        return suite;
    }

    public void reset() {
        // Setup might not be run yet.
        if (originalSession != null) {
            getExecutor().getSession().release();
            getExecutor().setSession(originalSession);
        }
        getServerSession().release();
        ((org.eclipse.persistence.sessions.server.ClientSession)getServerSession()).getParent().logout();
    }

    public static void setServerSession(Session session) {
        serverSession = session;
    }

    public abstract void setup();
}
