/*
 * 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:
// mmacivor - October 16th 2009 - 2.0 - Initial implementation
package org.eclipse.persistence.oxm.mappings;

import org.eclipse.persistence.internal.descriptors.InstanceVariableAttributeAccessor;
import org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor;
import org.eclipse.persistence.internal.queries.ContainerPolicy;
import org.eclipse.persistence.mappings.AttributeAccessor;

/**
 * <p><b>Purpose:</b> Provides a means to configure bidirectional relationship
 * maintenance for OXM mappings.
 * ant
 * @author mmacivor
 */
public class BidirectionalPolicy {
    private AttributeAccessor bidirectionalTargetAccessor;
    private ContainerPolicy bidirectionalTargetContainerPolicy;

    /**
     * Sets the AttributeAccessor that is used to get and set the value of the
     * container on the target object.
     *
     * @param anAttributeAccessor - the accessor to be used.
     */
    public void setBidirectionalTargetAccessor(AttributeAccessor anAttributeAccessor) {
        this.bidirectionalTargetAccessor = anAttributeAccessor;
    }

    /**
     * Sets the name of the backpointer attribute on the target object. Used to
     * populate the backpointer. If the specified attribute doesn't exist on
     * the reference class of this mapping, a DescriptorException will be thrown
     * during initialize.
     *
     * @param attributeName - the name of the backpointer attribute to be populated
     */
    public void setBidirectionalTargetAttributeName(String attributeName) {
        if(attributeName != null) {
            if(this.bidirectionalTargetAccessor == null) {
                this.bidirectionalTargetAccessor = new InstanceVariableAttributeAccessor();
            }
            this.getBidirectionalTargetAccessor().setAttributeName(attributeName);
        }
    }

    /**
     * Gets the name of the backpointer attribute on the target object. Used to
     * populate the backpointer.
     */
    public String getBidirectionalTargetAttributeName() {
        if(this.bidirectionalTargetAccessor == null) {
            return null;
        }
        return this.getBidirectionalTargetAccessor().getAttributeName();
    }

    /**
     * Sets the method name to be used when accessing the value of the back pointer
     * on the target object of this mapping. If the specified method doesn't exist
     * on the reference class of this mapping, a DescriptorException will be thrown
     * during initialize.
     *
     * @param methodName - the getter method to be used.
     */
    public void setBidirectionalTargetGetMethodName(String methodName) {
        if (methodName == null) {
            return;
        }

        if(this.bidirectionalTargetAccessor == null) {
            bidirectionalTargetAccessor = new MethodAttributeAccessor();
        }

        // This is done because setting attribute name by defaults create InstanceVariableAttributeAccessor
        if (!getBidirectionalTargetAccessor().isMethodAttributeAccessor()) {
            String attributeName = this.bidirectionalTargetAccessor.getAttributeName();
            setBidirectionalTargetAccessor(new MethodAttributeAccessor());
            getBidirectionalTargetAccessor().setAttributeName(attributeName);
        }

        ((MethodAttributeAccessor)getBidirectionalTargetAccessor()).setGetMethodName(methodName);
    }

    /**
     * Sets the name of the method to be used when setting the value of the back pointer
     * on the target object of this mapping. If the specified method doesn't exist
     * on the reference class of this mapping, a DescriptorException will be thrown
     * during initialize.
     *
     * @param methodName - the setter method to be used.
     */
    public void setBidirectionalTargetSetMethodName(String methodName) {
        if (methodName == null) {
            return;
        }

        if(this.bidirectionalTargetAccessor == null) {
            this.bidirectionalTargetAccessor = new MethodAttributeAccessor();
        }
        // This is done because setting attribute name by defaults create InstanceVariableAttributeAccessor
        if (!getBidirectionalTargetAccessor().isMethodAttributeAccessor()) {
            String attributeName = this.bidirectionalTargetAccessor.getAttributeName();
            setBidirectionalTargetAccessor(new MethodAttributeAccessor());
            getBidirectionalTargetAccessor().setAttributeName(attributeName);
        }

        ((MethodAttributeAccessor)getBidirectionalTargetAccessor()).setSetMethodName(methodName);
    }

    /**
     * Gets the name of the method to be used when accessing the value of the
     * back pointer on the target object of this mapping.
     */
    public String getBidirectionalTargetGetMethodName() {
        if (getBidirectionalTargetAccessor() == null || !getBidirectionalTargetAccessor().isMethodAttributeAccessor()) {
            return null;
        }
        return ((MethodAttributeAccessor)getBidirectionalTargetAccessor()).getGetMethodName();
    }

    /**
     * Gets the name of the method to be used when setting the value of the
     * back pointer on the target object of this mapping.
     */
    public String getBidirectionalTargetSetMethodName() {
        if (getBidirectionalTargetAccessor() == null || !getBidirectionalTargetAccessor().isMethodAttributeAccessor()) {
            return null;
        }
        return ((MethodAttributeAccessor)getBidirectionalTargetAccessor()).getSetMethodName();
    }

    public ContainerPolicy getBidirectionalTargetContainerPolicy() {
        return this.bidirectionalTargetContainerPolicy;
    }

    public void setBidirectionalTargetContainerPolicy(ContainerPolicy cp) {
        this.bidirectionalTargetContainerPolicy = cp;
    }

    public void setBidirectionalTargetContainerClass(Class cls) {
        if(this.bidirectionalTargetContainerPolicy == null) {
            this.bidirectionalTargetContainerPolicy = ContainerPolicy.buildPolicyFor(cls);
        } else {
            this.bidirectionalTargetContainerPolicy.setContainerClass(cls);
        }
    }

    /**
     * Gets the AttributeAccessor that is used to get and set the value of the
     * container on the target object.
     */
    public AttributeAccessor getBidirectionalTargetAccessor() {
        return this.bidirectionalTargetAccessor;
    }


}
