/*
 * 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:
//     Denise Smith - May 8/2009
package org.eclipse.persistence.testing.oxm.mappings.compositeobject.self.norefclass;

import java.io.ByteArrayOutputStream;
import java.io.StringWriter;

import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.eclipse.persistence.platform.xml.XMLComparer;
import org.eclipse.persistence.testing.oxm.mappings.compositeobject.self.Employee;
import org.w3c.dom.Node;

public class Root {
    Object theObject;

    public Root(){

    }

    public Object getTheObject() {
        return theObject;
    }

    public void setTheObject(Object theObject) {
        this.theObject = theObject;
    }


    public boolean equals(Object object) {
        try {
            Root theRoot  = (Root)object;
            if (this == theRoot) {
                return true;
            }
            if(theObject == null){
                return theRoot.getTheObject() == null;
            }
            if(theObject instanceof Node){
                if(theRoot.getTheObject() instanceof Node){
                    //compare Nodes
                    XMLComparer xmlComparer = new XMLComparer();
                    return xmlComparer.isNodeEqual((Node)theObject, (Node)theRoot.getTheObject());
                }else{
                    return false;
                }
            }
            return theObject.equals(theRoot.getTheObject());
        } catch (ClassCastException e) {
            return false;
        }
    }

    public String toString() {
        if(theObject != null){
            if(theObject instanceof Node){
                DOMSource source = new DOMSource((Node)theObject);
                //String s = new String();
                //StringWriter writer = new StringWriter();
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                StreamResult result = new StreamResult(stream);
                try {
                    TransformerFactory.newInstance().newTransformer().transform(source, result);
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }

                return stream.toString();
            }
            return theObject.toString();
        }
        return null;
    }
}
