/*
 * 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.tests.xdb;

import org.eclipse.persistence.mappings.*;
import org.eclipse.persistence.descriptors.RelationalDescriptor;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.mappings.xdb.DirectToXMLTypeMapping;

public class Employee_XMLProject extends Project {
    public Employee_XMLProject() {
        super();
        initializeLogin();
        initializeProject();
        addDescriptor(new EmployeeDescriptor());
    }

    public Employee_XMLProject(DatabaseLogin databaseLogin) {
        super(databaseLogin);
        initializeLogin();
        addDescriptor(new EmployeeDescriptor());
    }

    public void initializeProject() {
    }

    private void initializeLogin() {
        DatabaseLogin login = new DatabaseLogin();
        login.setPlatform(new org.eclipse.persistence.platform.database.oracle.Oracle9Platform());
        login.setConnectionString("jdbc:oracle:oci8:@matt");
        login.setDriverClassName("oracle.jdbc.OracleDriver");
        login.setUserName("System");
        login.setPassword("qwerty");
        setLogin(login);
    }

    class EmployeeDescriptor extends RelationalDescriptor {
        public EmployeeDescriptor() {
            super();
            setJavaClass(Employee_XML.class);
            addPrimaryKeyFieldName("ID");
            addTableName("EMPLOYEE_XML");
            setSequenceNumberName("EMP_SEQ");
            setSequenceNumberFieldName("ID");

            DirectToFieldMapping idMapping = new DirectToFieldMapping();
            idMapping.setAttributeName("id");
            idMapping.setFieldName("ID");
            idMapping.setIsReadOnly(false);
            addMapping(idMapping);

            DirectToFieldMapping firstNameMapping = new DirectToFieldMapping();
            firstNameMapping.setAttributeName("firstName");
            firstNameMapping.setFieldName("FIRST_NAME");
            firstNameMapping.setIsReadOnly(false);
            addMapping(firstNameMapping);

            DirectToFieldMapping lastNameMapping = new DirectToFieldMapping();
            lastNameMapping.setAttributeName("lastName");
            lastNameMapping.setFieldName("LAST_NAME");
            lastNameMapping.setIsReadOnly(false);
            addMapping(lastNameMapping);

            DirectToFieldMapping genderMapping = new DirectToFieldMapping();
            genderMapping.setAttributeName("gender");
            genderMapping.setFieldName("GENDER");
            genderMapping.setIsReadOnly(false);
            addMapping(genderMapping);

            DirectToXMLTypeMapping resumeMapping = new DirectToXMLTypeMapping();
            resumeMapping.setAttributeName("resume");
            resumeMapping.setFieldName("RESUME_XML");
            resumeMapping.setShouldReadWholeDocument(true);
            resumeMapping.setIsReadOnly(false);
            addMapping(resumeMapping);

            DirectToXMLTypeMapping payrollMapping = new DirectToXMLTypeMapping();
            payrollMapping.setAttributeName("payroll_xml");
            payrollMapping.setFieldName("PAYROLL_XML");
            payrollMapping.setShouldReadWholeDocument(true);
            payrollMapping.setIsReadOnly(false);
            addMapping(payrollMapping);

            OneToOneMapping managerMapping = new OneToOneMapping();
            managerMapping.setAttributeName("manager");
            managerMapping.addForeignKeyFieldName("MANAGER_ID", "ID");
            managerMapping.setUsesIndirection(false);
            managerMapping.setIsReadOnly(false);
            managerMapping.setReferenceClass(Employee_XML.class);
            addMapping(managerMapping);

            OneToManyMapping managedEmployees = new OneToManyMapping();
            managedEmployees.setAttributeName("managedEmployees");
            managedEmployees.addTargetForeignKeyFieldName("MANAGER_ID", "ID");
            managedEmployees.setUsesIndirection(false);
            managedEmployees.setIsReadOnly(false);
            managedEmployees.setReferenceClass(Employee_XML.class);
            addMapping(managedEmployees);
        }
    }
}
