/*
 * 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.jaxb.xmlmarshaller;

import java.net.URL;
import org.eclipse.persistence.oxm.NamespaceResolver;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.XMLField;
import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
import org.eclipse.persistence.oxm.schema.XMLSchemaReference;
import org.eclipse.persistence.oxm.schema.XMLSchemaURLReference;
import org.eclipse.persistence.oxm.schema.XMLSchemaFileReference;
import org.eclipse.persistence.sessions.Project;

public class EmployeeProject extends Project {

    private NamespaceResolver namespaceResolver;

    public EmployeeProject() {
        namespaceResolver = new NamespaceResolver();
        namespaceResolver.put("xsi", "http://www.w3.org/2001/XMLSchema-instance");

        addDescriptor(getEmployeeDescriptor());
        addDescriptor(getAddressDescriptor());
        addDescriptor(getPOBoxAddressDescriptor());
        addDescriptor(getPhoneDescriptor());
        addDescriptor(getBadgeDescriptor());

        addDescriptor(getJobDescriptor());
        addDescriptor(getJob2Descriptor());
    }

    private XMLDescriptor getEmployeeDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(Employee.class);
        descriptor.setDefaultRootElement("employee");

        XMLDirectMapping idMapping = new XMLDirectMapping();
        idMapping.setAttributeName("id");
        idMapping.setGetMethodName("getID");
        idMapping.setSetMethodName("setID");
        idMapping.setXPath("id/text()");
        descriptor.addMapping(idMapping);

        XMLDirectMapping nameMapping = new XMLDirectMapping();
        nameMapping.setAttributeName("name");
        nameMapping.setGetMethodName("getName");
        nameMapping.setSetMethodName("setName");
        nameMapping.setXPath("name/text()");
        descriptor.addMapping(nameMapping);

        XMLCompositeObjectMapping homeAddressMapping = new XMLCompositeObjectMapping();
        homeAddressMapping.setReferenceClass(Address.class);
        homeAddressMapping.setAttributeName("home-address");
        homeAddressMapping.setGetMethodName("getHomeAddress");
        homeAddressMapping.setSetMethodName("setHomeAddress");
        homeAddressMapping.setXPath("home-address");
        descriptor.addMapping(homeAddressMapping);

        XMLCompositeObjectMapping workAddressMapping = new XMLCompositeObjectMapping();
        workAddressMapping.setReferenceClass(Address.class);
        workAddressMapping.setAttributeName("work-address");
        workAddressMapping.setGetMethodName("getWorkAddress");
        workAddressMapping.setSetMethodName("setWorkAddress");
        workAddressMapping.setXPath("work-address");
        descriptor.addMapping(workAddressMapping);

        XMLCompositeObjectMapping phoneMapping = new XMLCompositeObjectMapping();
        phoneMapping.setReferenceClass(Phone.class);
        phoneMapping.setAttributeName("phone");
        phoneMapping.setGetMethodName("getPhone");
        phoneMapping.setSetMethodName("setPhone");
        phoneMapping.setXPath("phone");
        descriptor.addMapping(phoneMapping);

        XMLCompositeObjectMapping badgeMapping = new XMLCompositeObjectMapping();
        badgeMapping.setReferenceClass(Badge.class);
        badgeMapping.setAttributeName("badge");
        badgeMapping.setGetMethodName("getBadge");
        badgeMapping.setSetMethodName("setBadge");
        badgeMapping.setXPath("badge-id");
        descriptor.addMapping(badgeMapping);

        XMLDirectMapping empCodeMapping = new XMLDirectMapping();
        empCodeMapping.setAttributeName("empCode");
        empCodeMapping.setGetMethodName("getEmpCode");
        empCodeMapping.setSetMethodName("setEmpCode");
        empCodeMapping.setXPath("@empCode");
        descriptor.addMapping(empCodeMapping);

        URL schemaURL = ClassLoader.getSystemResource("org/eclipse/persistence/testing/oxm/jaxb/Employee.xsd");
        XMLSchemaURLReference schemaRef = new XMLSchemaURLReference(schemaURL);
        schemaRef.setType(XMLSchemaReference.ELEMENT);
        schemaRef.setSchemaContext("/employee");
        descriptor.setSchemaReference(schemaRef);

        return descriptor;
    }

    private XMLDescriptor getAddressDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(Address.class);

        descriptor.setNamespaceResolver(namespaceResolver);
        XMLField classIndicatorField = new XMLField("@xsi:type");
        descriptor.getInheritancePolicy().setClassIndicatorField(classIndicatorField);
        descriptor.getInheritancePolicy().addClassIndicator(Address.class, "address-type");
        descriptor.getInheritancePolicy().addClassIndicator(POBoxAddress.class, "po-box-address-type");

        XMLDirectMapping streetMapping = new XMLDirectMapping();
        streetMapping.setAttributeName("street");
        streetMapping.setGetMethodName("getStreet");
        streetMapping.setSetMethodName("setStreet");
        streetMapping.setXPath("street/text()");
        descriptor.addMapping(streetMapping);

        XMLDirectMapping cityMapping = new XMLDirectMapping();
        cityMapping.setAttributeName("city");
        cityMapping.setGetMethodName("getCity");
        cityMapping.setSetMethodName("setCity");
        cityMapping.setXPath("city/text()");
        descriptor.addMapping(cityMapping);

        XMLDirectMapping stateMapping = new XMLDirectMapping();
        stateMapping.setAttributeName("state");
        stateMapping.setGetMethodName("getState");
        stateMapping.setSetMethodName("setState");
        stateMapping.setXPath("state/text()");
        descriptor.addMapping(stateMapping);

        XMLDirectMapping zipCodeMapping = new XMLDirectMapping();
        zipCodeMapping.setAttributeName("zip-code");
        zipCodeMapping.setGetMethodName("getZipCode");
        zipCodeMapping.setSetMethodName("setZipCode");
        zipCodeMapping.setXPath("zip-code/text()");
        descriptor.addMapping(zipCodeMapping);

        URL schemaURL = ClassLoader.getSystemResource("org/eclipse/persistence/testing/oxm/jaxb/Employee.xsd");
        XMLSchemaURLReference schemaRef = new XMLSchemaURLReference(schemaURL);
        schemaRef.setType(XMLSchemaReference.COMPLEX_TYPE);
        schemaRef.setSchemaContext("/address-type");
        descriptor.setSchemaReference(schemaRef);

        return descriptor;
    }

    private XMLDescriptor getPOBoxAddressDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(POBoxAddress.class);
        descriptor.setNamespaceResolver(namespaceResolver);
        descriptor.getInheritancePolicy().setParentClass(Address.class);

        XMLDirectMapping rrMapping = new XMLDirectMapping();
        rrMapping.setAttributeName("rrnumber");
        rrMapping.setGetMethodName("getRRNumber");
        rrMapping.setSetMethodName("setRRNumber");
        rrMapping.setXPath("rrnum/text()");
        descriptor.addMapping(rrMapping);

        XMLDirectMapping poboxMapping = new XMLDirectMapping();
        poboxMapping.setAttributeName("pobox");
        poboxMapping.setGetMethodName("getPOBox");
        poboxMapping.setSetMethodName("setPOBox");
        poboxMapping.setXPath("po-box/text()");
        descriptor.addMapping(poboxMapping);

        URL schemaURL = ClassLoader.getSystemResource("org/eclipse/persistence/testing/oxm/jaxb/Employee.xsd");
        XMLSchemaURLReference schemaRef = new XMLSchemaURLReference(schemaURL);
        schemaRef.setType(XMLSchemaReference.COMPLEX_TYPE);
        schemaRef.setSchemaContext("/po-box-address-type");
        descriptor.setSchemaReference(schemaRef);

        return descriptor;
    }

    private XMLDescriptor getPhoneDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(Phone.class);

        XMLDirectMapping numberMapping = new XMLDirectMapping();
        numberMapping.setAttributeName("number");
        numberMapping.setGetMethodName("getNumber");
        numberMapping.setSetMethodName("setNumber");
        numberMapping.setXPath("text()");
        descriptor.addMapping(numberMapping);

        URL schemaURL = ClassLoader.getSystemResource("org/eclipse/persistence/testing/oxm/jaxb/Employee.xsd");
        XMLSchemaURLReference schemaRef = new XMLSchemaURLReference(schemaURL);
        schemaRef.setType(XMLSchemaReference.SIMPLE_TYPE);
        schemaRef.setSchemaContext("/phone-type");
        descriptor.setSchemaReference(schemaRef);

        return descriptor;
    }

    private XMLDescriptor getBadgeDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setDefaultRootElement("badge-id");
        descriptor.setJavaClass(Badge.class);

        XMLDirectMapping numberMapping = new XMLDirectMapping();
        numberMapping.setAttributeName("number");
        numberMapping.setGetMethodName("getNumber");
        numberMapping.setSetMethodName("setNumber");
        numberMapping.setXPath("text()");
        descriptor.addMapping(numberMapping);

        URL schemaURL = ClassLoader.getSystemResource("org/eclipse/persistence/testing/oxm/jaxb/Employee.xsd");
        XMLSchemaURLReference schemaRef = new XMLSchemaURLReference(schemaURL);
        schemaRef.setType(XMLSchemaReference.ELEMENT);
        schemaRef.setSchemaContext("/employee/badge-id");
        descriptor.setSchemaReference(schemaRef);

        return descriptor;
    }

    private XMLDescriptor getJobDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(Job.class);
        descriptor.setDefaultRootElement("job");

        XMLDirectMapping titleMapping = new XMLDirectMapping();
        titleMapping.setAttributeName("title");
        titleMapping.setGetMethodName("getTitle");
        titleMapping.setSetMethodName("setTitle");
        titleMapping.setXPath("title/text()");
        descriptor.addMapping(titleMapping);

        URL schemaURL = ClassLoader.getSystemResource("org/eclipse/persistence/testing/oxm/jaxb/Employee.xsd");
        XMLSchemaURLReference schemaRef = new XMLSchemaURLReference(schemaURL);
        schemaRef.setType(XMLSchemaReference.ELEMENT);
        schemaRef.setSchemaContext("/employee/job");
        descriptor.setSchemaReference(schemaRef);

        return descriptor;
    }

    private XMLDescriptor getJob2Descriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(Job2.class);
        descriptor.setDefaultRootElement("job2");

        XMLDirectMapping titleMapping = new XMLDirectMapping();
        titleMapping.setAttributeName("title");
        titleMapping.setGetMethodName("getTitle");
        titleMapping.setSetMethodName("setTitle");
        titleMapping.setXPath("title/text()");
        descriptor.addMapping(titleMapping);

        URL schemaURL = ClassLoader.getSystemResource("org/eclipse/persistence/testing/oxm/jaxb/Employee.xsd");
        XMLSchemaURLReference schemaRef = new XMLSchemaURLReference(schemaURL);
        schemaRef.setType(XMLSchemaReference.ELEMENT);
        schemaRef.setSchemaContext("/employee/job2");
        descriptor.setSchemaReference(schemaRef);

        return descriptor;
    }

}
