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

import org.eclipse.persistence.internal.oxm.XMLSetting;
import org.eclipse.persistence.oxm.mappings.XMLMapping;
import commonj.sdo.Property;

/**
  * <p><b>Purpose</b>: A setting encapsulates a Property and a corresponding single value of the property's type.
* <p>As a Setting used by a Sequence object, this class Implements the XMLSetting interface and provides a container
 * for a Property/Value pair as part of the sequence.
 * <p><b>Responsibilities:</b><ul>
 * <li>Provide get/set access to the property and value instance variables of a {@link javax.sound.midi.Sequence sequence} object.</li>
 * </ul>
   *
  * @see org.eclipse.persistence.sdo.SDOChangeSummary
  * @see org.eclipse.persistence.internal.oxm.XMLSetting
  * @since Oracle TopLink 11.1.1.0.0
  */
public class SDOSetting implements commonj.sdo.ChangeSummary.Setting, XMLSetting {
    private SDOProperty property;
    private Object value;
    private boolean isSet;

    public SDOSetting() {
    }

    public SDOSetting(Property aProperty, Object aValue) {
        property = (SDOProperty) aProperty;
        value = aValue;
        // isSet is false by default
    }

    /**
     * @return The TopLink OXM mapping associated with this setting
     */
    @Override
    public XMLMapping getMapping() {
        return (XMLMapping)property.getXmlMapping();
    }

    /**
     * Returns the property of the setting.
     * @return the setting property.
     */
    @Override
    public SDOProperty getProperty() {
        return property;
    }

    /**
     * INTERNAL:
     * Set the property of this setting.
     * @param property     The property to set on this setting.
     */
    public void setProperty(Property property) {
        this.property = (SDOProperty) property;
    }

    /**
     * Returns the value of the setting.
     * @return the setting value.
     */
    @Override
    public Object getValue() {
        return value;
    }

    /**
     * INTERNAL:
     * Set the value of this setting.
     * @param object     The value to set on this setting.
     */
    public void setValue(Object object) {
        value = object;
    }

    /**
     * Returns whether or not the property is set.
     * @return <code>true</code> if the property is set.
     */
    @Override
    public boolean isSet() {
        return isSet;
    }

    /**
     * INTERNAL:
     * Set if the value of this setting is set.
     * @param isSet If the value is set on this Setting.
     */
    public void setIsSet(boolean isSet) {
        this.isSet = isSet;
    }

    /**
     * INTERNAL:
     * Print out a String representation of this object
     */
    @Override
    public String toString() {
        StringBuffer aBuffer = new StringBuffer();
        aBuffer.append(getClass().getName());
        aBuffer.append("@");
        aBuffer.append(hashCode());
        aBuffer.append("(");
        aBuffer.append(property);
        aBuffer.append(",");
        aBuffer.append(value);
        aBuffer.append(")");
        return aBuffer.toString();
    }
}
