/*
 * 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:
//     rbarkhouse - 2009-11-16 14:08:13 - initial implementation
package org.eclipse.persistence.testing.oxm.dynamic;

import java.util.ArrayList;

import org.eclipse.persistence.internal.queries.ContainerPolicy;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.mappings.XMLInverseReferenceMapping;
import org.eclipse.persistence.oxm.mappings.XMLCollectionReferenceMapping;
import org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping;
import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
import org.eclipse.persistence.oxm.mappings.XMLObjectReferenceMapping;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.testing.oxm.mappings.collectionreference.reuse.Address;
import org.eclipse.persistence.testing.oxm.mappings.collectionreference.reuse.Employee;
import org.eclipse.persistence.testing.oxm.mappings.collectionreference.reuse.Root;

public class DynamicTestProject extends Project {

    public DynamicTestProject() {
        super();
        addEmployeeDescriptor();
        addAddressDescriptor();
        addPhoneNumberDescriptor();
        addEmailDescriptor();
        addSecurityCredentialDescriptor();
        addRootDescriptor();
    }

    private void addEmployeeDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClassName("org.eclipse.persistence.testing.oxm.dynamic.XEmployee");

        XMLDirectMapping name = new XMLDirectMapping();
        name.setAttributeName("name");
        name.setXPath("name/text()");
        descriptor.addMapping(name);

        XMLCompositeObjectMapping addr = new XMLCompositeObjectMapping();
        addr.setAttributeName("address");
        addr.setXPath("address");
        addr.setReferenceClassName("org.eclipse.persistence.testing.oxm.dynamic.XAddress");
        descriptor.addMapping(addr);

        XMLCompositeCollectionMapping phone = new XMLCompositeCollectionMapping();
        phone.setAttributeName("phoneNumbers");
        phone.setXPath("phone-numbers/number");
        phone.setReferenceClassName("org.eclipse.persistence.testing.oxm.dynamic.XPhoneNumber");
        phone.useCollectionClass(ArrayList.class);
        phone.setContainerPolicy(ContainerPolicy.buildPolicyFor(ArrayList.class));
        descriptor.addMapping(phone);

        XMLCollectionReferenceMapping emails = new XMLCollectionReferenceMapping();
        emails.setAttributeName("emails");
        emails.setReferenceClassName("org.eclipse.persistence.testing.oxm.dynamic.XEmail");
        emails.addSourceToTargetKeyFieldAssociation("email-id/text()", "@id");
        descriptor.addMapping(emails);

        XMLObjectReferenceMapping secCred = new XMLObjectReferenceMapping();
        secCred.setAttributeName("securityCredential");
        secCred.setReferenceClassName("org.eclipse.persistence.testing.oxm.dynamic.XSecurityCredential");
        secCred.addSourceToTargetKeyFieldAssociation("sec-cred-id/text()", "@id");
        descriptor.addMapping(secCred);

        this.addDescriptor(descriptor);
    }

    private void addAddressDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClassName("org.eclipse.persistence.testing.oxm.dynamic.XAddress");

        XMLDirectMapping street = new XMLDirectMapping();
        street.setAttributeName("street");
        street.setXPath("street/text()");
        descriptor.addMapping(street);

        XMLInverseReferenceMapping owningEmployee = new XMLInverseReferenceMapping();
        owningEmployee.setReferenceClassName("org.eclipse.persistence.testing.oxm.dynamic.XEmployee");
        owningEmployee.setMappedBy("address");
        owningEmployee.setAttributeName("owningEmployee");
        owningEmployee.setSetMethodName("setOwningEmployee");
        owningEmployee.setGetMethodName("getOwningEmployee");
        descriptor.addMapping(owningEmployee);

        this.addDescriptor(descriptor);
    }

    private void addPhoneNumberDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClassName("org.eclipse.persistence.testing.oxm.dynamic.XPhoneNumber");

        XMLDirectMapping num = new XMLDirectMapping();
        num.setAttributeName("number");
        num.setXPath("text()");
        descriptor.addMapping(num);

        XMLInverseReferenceMapping owningEmployee = new XMLInverseReferenceMapping();
        owningEmployee.setReferenceClassName("org.eclipse.persistence.testing.oxm.dynamic.XEmployee");
        owningEmployee.setMappedBy("phoneNumbers");
        owningEmployee.setAttributeName("owningEmployee");
        owningEmployee.setSetMethodName("setOwningEmployee");
        owningEmployee.setGetMethodName("getOwningEmployee");
        descriptor.addMapping(owningEmployee);

        this.addDescriptor(descriptor);
    }

    private void addSecurityCredentialDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClassName("org.eclipse.persistence.testing.oxm.dynamic.XSecurityCredential");
        descriptor.addPrimaryKeyFieldName("@id");

        XMLDirectMapping id = new XMLDirectMapping();
        id.setAttributeName("id");
        id.setXPath("@id");
        descriptor.addMapping(id);

        XMLDirectMapping zone = new XMLDirectMapping();
        zone.setAttributeName("zone");
        zone.setXPath("zone/text()");
        descriptor.addMapping(zone);

        XMLDirectMapping keyNumber = new XMLDirectMapping();
        keyNumber.setAttributeName("keyNumber");
        keyNumber.setXPath("key-number/text()");
        descriptor.addMapping(keyNumber);

        XMLInverseReferenceMapping owningEmployee = new XMLInverseReferenceMapping();
        owningEmployee.setReferenceClassName("org.eclipse.persistence.testing.oxm.dynamic.XEmployee");
        owningEmployee.setMappedBy("securityCredential");
        owningEmployee.setAttributeName("owningEmployee");
        owningEmployee.setSetMethodName("setOwningEmployee");
        owningEmployee.setGetMethodName("getOwningEmployee");
        descriptor.addMapping(owningEmployee);

        this.addDescriptor(descriptor);
    }

    private void addEmailDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClassName("org.eclipse.persistence.testing.oxm.dynamic.XEmail");
        descriptor.addPrimaryKeyFieldName("@id");

        XMLDirectMapping id = new XMLDirectMapping();
        id.setAttributeName("id");
        id.setXPath("@id");
        descriptor.addMapping(id);

        XMLDirectMapping username = new XMLDirectMapping();
        username.setAttributeName("username");
        username.setXPath("username/text()");
        descriptor.addMapping(username);

        XMLDirectMapping domain = new XMLDirectMapping();
        domain.setAttributeName("domain");
        domain.setXPath("domain/text()");
        descriptor.addMapping(domain);

        XMLInverseReferenceMapping owningEmployee = new XMLInverseReferenceMapping();
        owningEmployee.setReferenceClassName("org.eclipse.persistence.testing.oxm.dynamic.XEmployee");
        owningEmployee.setMappedBy("emails");
        owningEmployee.setAttributeName("owningEmployee");
        owningEmployee.setSetMethodName("setOwningEmployee");
        owningEmployee.setGetMethodName("getOwningEmployee");
        descriptor.addMapping(owningEmployee);

        this.addDescriptor(descriptor);
    }

    private void addRootDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClassName("org.eclipse.persistence.testing.oxm.dynamic.XRoot");
        descriptor.setDefaultRootElement("root");

        XMLCompositeObjectMapping employee = new XMLCompositeObjectMapping();
        employee.setAttributeName("employee");
        employee.setXPath("employee");
        employee.setReferenceClassName("org.eclipse.persistence.testing.oxm.dynamic.XEmployee");
        descriptor.addMapping(employee);

        XMLCompositeCollectionMapping projects = new XMLCompositeCollectionMapping();
        projects.setAttributeName("emails");
        projects.setXPath("email");
        projects.setReferenceClassName("org.eclipse.persistence.testing.oxm.dynamic.XEmail");
        descriptor.addMapping(projects);

        XMLCompositeObjectMapping secCred = new XMLCompositeObjectMapping();
        secCred.setAttributeName("securityCredential");
        secCred.setXPath("security-credential");
        secCred.setReferenceClassName("org.eclipse.persistence.testing.oxm.dynamic.XSecurityCredential");
        descriptor.addMapping(secCred);

        this.addDescriptor(descriptor);
    }

}
