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