/*
 * Copyright (c) 2018, 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
 */

package org.eclipse.persistence.testing.oxm.xmlmarshaller;

import org.eclipse.persistence.internal.oxm.QNameInheritancePolicy;
import org.eclipse.persistence.oxm.NamespaceResolver;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.XMLField;
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
import org.eclipse.persistence.oxm.schema.XMLSchemaClassPathReference;
import org.eclipse.persistence.sessions.Project;

public class MotorcycleProject extends Project {
    NamespaceResolver nsr;

    public MotorcycleProject() {
        nsr = new NamespaceResolver();
        nsr.put("ns2", "http://www.example.com");
        nsr.put("xsi", "http://www.w3.org/2001/XMLSchema-instance");
        addDescriptor(getMotorcycleDescriptor());
        addDescriptor(getSportBikeDescriptor());
    }

    private XMLDescriptor getMotorcycleDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(Motorcycle.class);
        descriptor.setDefaultRootElement("ns2:Motorcycle");

        XMLField classIndicatorField = new XMLField("@xsi:type");
        descriptor.getInheritancePolicy().setClassIndicatorField(classIndicatorField);
        descriptor.getInheritancePolicy().addClassIndicator(SportBike.class, "ns2:SportBike");
        descriptor.getInheritancePolicy().addClassIndicator(Motorcycle.class, "ns2:Motorcycle");
        descriptor.getInheritancePolicy().setShouldReadSubclasses(true);

        descriptor.setNamespaceResolver(nsr);

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

        return descriptor;
    }

    private XMLDescriptor getSportBikeDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(SportBike.class);
        descriptor.getInheritancePolicy().setParentClass(Motorcycle.class);
        descriptor.setDefaultRootElement("ns2:Motorcycle");
        descriptor.setNamespaceResolver(nsr);

        XMLDirectMapping displacementMapping = new XMLDirectMapping();
        displacementMapping.setAttributeName("displacement");
        displacementMapping.setXPath("engine-size/text()");
        descriptor.addMapping(displacementMapping);
        return descriptor;
    }
}
