/*
 * Copyright (c) 1998, 2021 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.eis.xmlfile;

import java.util.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.eis.interactions.*;
import org.eclipse.persistence.tools.schemaframework.*;
import org.eclipse.persistence.sessions.factories.*;
import org.eclipse.persistence.internal.eis.adapters.xmlfile.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
import org.eclipse.persistence.testing.framework.*;

/**
 * <b>Purpose</b>: To define system behavior.
 *
 * <p>
 * <b>Responsibilities</b>:
 * <ul>
 * <li>
 * Login and return an initialize database session.
 * </li>
 * <li>
 * Create and populate the database.
 * </li>
 * </ul>
 */
public class EmployeeSystem extends TestSystem {

    /**
     * Use the default EmployeeProject.
     */
    public EmployeeSystem() {
        project = XMLProjectReader.read("org/eclipse/persistence/testing/models/employee/eis/xmlfile/employee-project.xml", getClass().getClassLoader());
    }

    @Override
    public void addDescriptors(DatabaseSession session) {
        if (project == null) {
            project = XMLProjectReader.read("org/eclipse/persistence/testing/models/employee/eis/xmlfile/employee-project.xml", getClass().getClassLoader());
        }

        session.addDescriptors(project);
    }

    @Override
    public void createTables(DatabaseSession session) {
        // Drop tables
        XQueryInteraction interaction = new XQueryInteraction();
        interaction.setFunctionName("drop-sequence");
        XMLFileInteractionSpec spec = new XMLFileInteractionSpec();
        spec.setFileName("sequence.xml");
        spec.setInteractionType(XMLFileInteractionSpec.DELETE);
        interaction.setInteractionSpec(spec);
        session.executeNonSelectingCall(interaction);

        interaction = new XQueryInteraction();
        interaction.setFunctionName("drop-EMPLOYEE");
        spec = new XMLFileInteractionSpec();
        spec.setFileName("EMPLOYEE.xml");
        spec.setInteractionType(XMLFileInteractionSpec.DELETE);
        interaction.setInteractionSpec(spec);
        session.executeNonSelectingCall(interaction);

        interaction = new XQueryInteraction();
        interaction.setFunctionName("drop-PROJECT");
        spec = new XMLFileInteractionSpec();
        spec.setFileName("PROJECT.xml");
        spec.setInteractionType(XMLFileInteractionSpec.DELETE);
        interaction.setInteractionSpec(spec);
        session.executeNonSelectingCall(interaction);

        // Create sequences
        DataModifyQuery query = new DataModifyQuery();
        query.addArgument("sequence-name");
        query.addArgument("sequence-count");
        interaction = new XQueryInteraction();
        interaction.setFunctionName("create-sequence");
        spec = new XMLFileInteractionSpec();
        spec.setFileName("sequence.xml");
        spec.setXPath("sequence");
        spec.setInteractionType(XMLFileInteractionSpec.INSERT);
        interaction.setInteractionSpec(spec);
        interaction.setInputRootElementName("sequence");
        interaction.addArgument("sequence-name");
        interaction.addArgument("sequence-count");
        query.setCall(interaction);

        Vector arguments = new Vector(2);
        arguments.add("EMP_SEQ");
        arguments.add(0);
        session.executeQuery(query, arguments);

        arguments = new Vector(2);
        arguments.add("PROJ_SEQ");
        arguments.add(0);
        session.executeQuery(query, arguments);
    }

    /**
     * This method will instantiate all of the example instances and insert them into the database
     * using the given session.
     */
    @Override
    public void populate(DatabaseSession session) {
        EmployeePopulator system = new EmployeePopulator();
        UnitOfWork unitOfWork = session.acquireUnitOfWork();

        system.buildExamples();
        Vector allObjects = new Vector();
        PopulationManager.getDefaultManager().addAllObjectsForClass(Employee.class, allObjects);
        PopulationManager.getDefaultManager().addAllObjectsForAbstractClass(LargeProject.class, session, allObjects);
        PopulationManager.getDefaultManager().addAllObjectsForAbstractClass(SmallProject.class, session, allObjects);
        unitOfWork.registerAllObjects(allObjects);
        unitOfWork.commit();
    }
}
