/*
 * Copyright (c) 1998, 2020 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.models.employee.eis.xmlfile;

import org.eclipse.persistence.descriptors.*;
import org.eclipse.persistence.oxm.XMLField;
import org.eclipse.persistence.eis.mappings.*;
import org.eclipse.persistence.eis.interactions.*;
import org.eclipse.persistence.eis.adapters.xmlfile.*;

/**
 * Amends order project with non-MW supported API.
 */
public class EmployeeNSAmendments {

    public static void addToEmployeeDescriptor(ClassDescriptor descriptor) {
        // Common interaction properties.
        descriptor.setProperty(XMLFilePlatform.FILE_NAME, "EMPLOYEE.xml");

        // Insert
        XQueryInteraction insertCall = new XQueryInteraction();
        insertCall.setFunctionName("insert");
        insertCall.setXQueryString("myns:EMPLOYEE");
        descriptor.getQueryManager().setInsertCall(insertCall);

        // Update
        XQueryInteraction updateCall = new XQueryInteraction();
        updateCall.setFunctionName("update");
        updateCall.setXQueryString("myns:EMPLOYEE[myns:EMP_ID='#myns:EMP_ID/text()']");
        descriptor.getQueryManager().setUpdateCall(updateCall);

        // Delete
        XQueryInteraction deleteCall = new XQueryInteraction();
        deleteCall.setFunctionName("delete");
        deleteCall.setXQueryString("myns:EMPLOYEE[myns:EMP_ID='#myns:EMP_ID/text()']");
        descriptor.getQueryManager().setDeleteCall(deleteCall);

        // Read object
        XQueryInteraction readObjectCall = new XQueryInteraction();
        readObjectCall.setFunctionName("read");
        readObjectCall.setXQueryString("myns:EMPLOYEE[myns:EMP_ID='#myns:EMP_ID/text()']");
        readObjectCall.setOutputResultPath("result");
        descriptor.getQueryManager().setReadObjectCall(readObjectCall);

        // Read all
        XQueryInteraction readAllCall = new XQueryInteraction();
        readAllCall.setFunctionName("read-all");
        readAllCall.setXQueryString("myns:EMPLOYEE");
        readAllCall.setOutputResultPath("result");
        descriptor.getQueryManager().setReadAllCall(readAllCall);

        // Interface properties.
        descriptor.getInterfacePolicy().addParentInterface(org.eclipse.persistence.testing.models.employee.interfaces.Employee.class);

        // EISDescriptor properties.
        descriptor.setSequenceNumberField(new XMLField("myns:EMP_ID/text()"));
        descriptor.setSequenceNumberName("EMP_SEQ");

        EISOneToManyMapping managedEmployeesMapping = (EISOneToManyMapping) descriptor.getMappingForAttributeName("managedEmployees");
        XQueryInteraction managedEmployeesInteraction = new XQueryInteraction();
        managedEmployeesInteraction.setFunctionName("read-managed-employees");
        managedEmployeesInteraction.setProperty("fileName", "EMPLOYEE.xml");
        managedEmployeesInteraction.setXQueryString("myns:EMPLOYEE[myns:MANAGER_ID='#myns:EMP_ID/text()']");
        managedEmployeesInteraction.setOutputResultPath("result");
        managedEmployeesMapping.setSelectionCall(managedEmployeesInteraction);

        EISOneToManyMapping projectsMapping = (EISOneToManyMapping) descriptor.getMappingForAttributeName("projects");
        XQueryInteraction projectsInteraction = new XQueryInteraction();
        projectsInteraction.setFunctionName("read-projects");
        projectsInteraction.setProperty("fileName", "PROJECT.xml");
        projectsInteraction.setXQueryString("myns:PROJECT[myns:PROJ_ID='#myns:PROJ_ID/text()']");
        projectsInteraction.setOutputResultPath("result");
        projectsMapping.setSelectionCall(projectsInteraction);
    }

    public static void addToLargeProjectDescriptor(ClassDescriptor descriptor) {
        // Common interaction properties.
        descriptor.setProperty(XMLFilePlatform.FILE_NAME, "PROJECT.xml");

        // Insert
        XQueryInteraction insertCall = new XQueryInteraction();
        insertCall.setFunctionName("insert");
        insertCall.setXQueryString("myns:PROJECT");
        descriptor.getQueryManager().setInsertCall(insertCall);

        // Update
        XQueryInteraction updateCall = new XQueryInteraction();
        updateCall.setFunctionName("update");
        updateCall.setXQueryString("myns:PROJECT[myns:PROJ_ID='#myns:PROJ_ID/text()']");
        descriptor.getQueryManager().setUpdateCall(updateCall);

        // Delete
        XQueryInteraction deleteCall = new XQueryInteraction();
        deleteCall.setFunctionName("delete");
        deleteCall.setXQueryString("myns:PROJECT[myns:PROJ_ID='#myns:PROJ_ID/text()']");
        descriptor.getQueryManager().setDeleteCall(deleteCall);

        // Read object
        XQueryInteraction readObjectCall = new XQueryInteraction();
        readObjectCall.setFunctionName("read");
        readObjectCall.setXQueryString("myns:PROJECT[myns:PROJ_ID='#myns:PROJ_ID/text()']");
        readObjectCall.setOutputResultPath("result");
        descriptor.getQueryManager().setReadObjectCall(readObjectCall);

        // Read all
        XQueryInteraction readAllCall = new XQueryInteraction();
        readAllCall.setFunctionName("read-all");
        readAllCall.setXQueryString("myns:PROJECT[@TYPE='L']");
        readAllCall.setOutputResultPath("result");
        descriptor.getQueryManager().setReadAllCall(readAllCall);

        // Interface properties.
        descriptor.getInterfacePolicy().addParentInterface(org.eclipse.persistence.testing.models.employee.interfaces.LargeProject.class);
    }

    public static void addToProjectDescriptor(ClassDescriptor descriptor) {
        // Common interaction properties.
        descriptor.setProperty(XMLFilePlatform.FILE_NAME, "PROJECT.xml");

        // Insert
        XQueryInteraction insertCall = new XQueryInteraction();
        insertCall.setXQueryString("myns:PROJECT");
        insertCall.setFunctionName("insert");
        insertCall.setProperty("fileName", "PROJECT.xml");
        descriptor.getQueryManager().setInsertCall(insertCall);

        // Update
        XQueryInteraction updateCall = new XQueryInteraction();
        updateCall.setFunctionName("update");
        updateCall.setXQueryString("myns:PROJECT[myns:PROJ_ID='#myns:PROJ_ID/text()']");
        descriptor.getQueryManager().setUpdateCall(updateCall);

        // Delete
        XQueryInteraction deleteCall = new XQueryInteraction();
        deleteCall.setFunctionName("delete");
        deleteCall.setXQueryString("myns:PROJECT[myns:PROJ_ID='#myns:PROJ_ID/text()']");
        descriptor.getQueryManager().setDeleteCall(deleteCall);

        // Read object
        XQueryInteraction readObjectCall = new XQueryInteraction();
        readObjectCall.setFunctionName("read");
        readObjectCall.setXQueryString("myns:PROJECT[myns:PROJ_ID='#myns:PROJ_ID/text()']");
        readObjectCall.setOutputResultPath("result");
        descriptor.getQueryManager().setReadObjectCall(readObjectCall);

        // Read all
        XQueryInteraction readAllCall = new XQueryInteraction();
        readAllCall.setFunctionName("read-all");
        readAllCall.setXQueryString("myns:PROJECT");
        readAllCall.setOutputResultPath("result");
        descriptor.getQueryManager().setReadAllCall(readAllCall);

        // Interface properties.
        descriptor.getInterfacePolicy().addParentInterface(org.eclipse.persistence.testing.models.employee.interfaces.Project.class);

        // EISDescriptor properties.
        descriptor.setSequenceNumberField(new XMLField("myns:PROJ_ID/text()"));
        descriptor.setSequenceNumberName("PROJ_SEQ");
    }

    public static void addToSmallProjectDescriptor(ClassDescriptor descriptor) {
        // Common interaction properties.
        descriptor.setProperty(XMLFilePlatform.FILE_NAME, "PROJECT.xml");

        // Insert
        XQueryInteraction insertCall = new XQueryInteraction();
        insertCall.setFunctionName("insert");
        insertCall.setXQueryString("myns:PROJECT");
        descriptor.getQueryManager().setInsertCall(insertCall);

        // Update
        XQueryInteraction updateCall = new XQueryInteraction();
        updateCall.setFunctionName("update");
        updateCall.setXQueryString("myns:PROJECT[myns:PROJ_ID='#myns:PROJ_ID/text()']");
        descriptor.getQueryManager().setUpdateCall(updateCall);

        // Delete
        XQueryInteraction deleteCall = new XQueryInteraction();
        deleteCall.setFunctionName("delete");
        deleteCall.setXQueryString("myns:PROJECT[myns:PROJ_ID='#myns:PROJ_ID/text()']");
        descriptor.getQueryManager().setDeleteCall(deleteCall);

        // Read object
        XQueryInteraction readObjectCall = new XQueryInteraction();
        readObjectCall.setFunctionName("read");
        readObjectCall.setXQueryString("myns:PROJECT[myns:PROJ_ID='#myns:PROJ_ID/text()']");
        readObjectCall.setOutputResultPath("result");
        descriptor.getQueryManager().setReadObjectCall(readObjectCall);

        // Read all
        XQueryInteraction readAllCall = new XQueryInteraction();
        readAllCall.setFunctionName("read-all");
        readAllCall.setXQueryString("myns:PROJECT[@TYPE='S']");
        readAllCall.setOutputResultPath("result");
        descriptor.getQueryManager().setReadAllCall(readAllCall);

        // Interface properties.
        descriptor.getInterfacePolicy().addParentInterface(org.eclipse.persistence.testing.models.employee.interfaces.SmallProject.class);
    }
}
