/*
 * Copyright (c) 1998, 2021 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.testing.sdo.helper.xmlhelper.threadsafety;

import org.eclipse.persistence.oxm.XMLMarshaller;
import org.eclipse.persistence.oxm.XMLUnmarshaller;
import org.eclipse.persistence.sdo.helper.SDOXMLHelper;
import org.eclipse.persistence.sdo.helper.delegates.SDOXMLHelperDelegator;
import org.eclipse.persistence.testing.sdo.SDOTestCase;

public class SDOXMLHelperThreadSafetyTestCases extends SDOTestCase {

    public SDOXMLHelperThreadSafetyTestCases(String name) {
        super(name);
    }

    /*
     * If a single thread calls getXmlMarshaller() multiple times, it should
     * be returned the same XMLMarshaller object every time.
     */
    public void testMarshallerSingleThreadedAccess() {
        SDOXMLHelperDelegator xmlHelper = (SDOXMLHelperDelegator) SDOXMLHelper.INSTANCE;

        XMLMarshaller marshaller1 = xmlHelper.getXmlMarshaller();
        XMLMarshaller marshaller2 = xmlHelper.getXmlMarshaller();

        assertSame(marshaller1, marshaller2);
    }

    /*
     * If a single thread calls getXmlUnarshaller() multiple times, it should
     * be returned the same XMLUnmarshaller object every time.
     */
    public void testUnmarshallerSingleThreadedAccess() {
        SDOXMLHelperDelegator xmlHelper = (SDOXMLHelperDelegator) SDOXMLHelper.INSTANCE;

        XMLUnmarshaller unmarshaller1 = xmlHelper.getXmlUnmarshaller();
        XMLUnmarshaller unmarshaller2 = xmlHelper.getXmlUnmarshaller();

        assertSame(unmarshaller1, unmarshaller2);
    }

    /*
     * If multiple threads call getXmlMarshaller(), they should each
     * be returned a unique XMLMarshaller object.
     */
    public void testMarshallerMultiThreadedAccess() {
        GetMarshallersRunnable thread1 = new GetMarshallersRunnable();
        GetMarshallersRunnable thread2 = new GetMarshallersRunnable();

        try {
            thread1.start();
            thread1.join();

            thread2.start();
            thread2.join();
        } catch (Exception e) {
            e.printStackTrace();
        }

        XMLMarshaller marshaller1 = thread1.marshaller;
        XMLMarshaller marshaller2 = thread2.marshaller;


        assertNotSame(marshaller1, marshaller2);
    }

    /*
     * If multiple threads call getXmlUnmarshaller(), they should each
     * be returned a unique XMLUnmarshaller object.
     */
    public void testUnmarshallerMultiThreadedAccess() {
        GetMarshallersRunnable thread1 = new GetMarshallersRunnable();
        GetMarshallersRunnable thread2 = new GetMarshallersRunnable();

        try {
            thread1.start();
            thread1.join();

            thread2.start();
            thread2.join();
        } catch (Exception e) {
            e.printStackTrace();
        }

        XMLUnmarshaller unmarshaller1 = thread1.unmarshaller;
        XMLUnmarshaller unmarshaller2 = thread2.unmarshaller;

        assertNotSame(unmarshaller1, unmarshaller2);
    }

    //=========================================================================

    public class GetMarshallersRunnable extends Thread {
        public XMLMarshaller marshaller;
        public XMLUnmarshaller unmarshaller;

        @Override
        public void run() {
            System.out.println(Thread.currentThread());
            SDOXMLHelperDelegator xmlHelper = (SDOXMLHelperDelegator) SDOXMLHelper.INSTANCE;
            marshaller = xmlHelper.getXmlMarshaller();
            unmarshaller = xmlHelper.getXmlUnmarshaller();
        }
    }

}
