/*
 * Copyright (c) 2011, 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 - 04 October 2011 - 2.4 - Initial implementation
package org.eclipse.persistence.testing.jaxb.sun.xmllocation;

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlTransient;

import org.glassfish.jaxb.core.annotation.XmlLocation;
import org.xml.sax.Locator;

@XmlAccessorType(XmlAccessType.PROPERTY)
public class SubData {

    @XmlElement
    public String info;

    private Locator loc;

    public Locator getLoc() {
        return loc;
    }

    @XmlLocation
    @XmlTransient
    public void setLoc(Locator locator) {
        this.loc = locator;
    }

    @Override
    public String toString() {
        String sloc = " noLoc";
        if (loc != null) {
            sloc = " L" + loc.getLineNumber() + " C" + loc.getColumnNumber() + " " + loc.getSystemId();
        }

        return "SubData(" + info + ")" + sloc;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof SubData)) {
            return false;
        }

        SubData d = (SubData) obj;

        if (!(d.info.equals(this.info))) {
            return false;
        }

        if (d.loc == null && this.loc != null) {
            return false;
        }
        if (d.loc != null && this.loc == null) {
            return false;
        }

        if (this.loc != null && d.loc != null) {
            if (!(this.loc.equals(d.loc))) {
                return false;
            }
        }

        return true;
    }

}
