/*
 * Copyright (c) 2014, 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:
//     Marcel Valovy - 2.6 - initial implementation
package org.eclipse.persistence.testing.perf.moxy.referenceresolver;

import org.eclipse.persistence.jaxb.JAXBContext;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import org.eclipse.persistence.jaxb.JAXBMarshaller;
import org.eclipse.persistence.jaxb.JAXBUnmarshaller;
import org.eclipse.persistence.testing.perf.moxy.referenceresolver.ClassicMoxyContainer;
import org.eclipse.persistence.testing.perf.moxy.referenceresolver.Component;
import org.eclipse.persistence.testing.perf.moxy.referenceresolver.Layer;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.TearDown;
import org.openjdk.jmh.infra.Blackhole;

import jakarta.xml.bind.Marshaller;
import jakarta.xml.bind.Unmarshaller;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.StringWriter;
import java.util.HashMap;

/**
 * Performance test case which measures running time of Marshalling and Unmarshalling a huge container.
 *
 * @author Marcel Valovy - marcel.valovy@oracle.com
 * @see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=437920">EclipseLink Forum, Bug 437920.</a>
 */
@State(Scope.Benchmark)
public class ReferenceResolverBenchmark {

    private ClassicMoxyContainer c;
    private JAXBMarshaller marshaller;
    private JAXBUnmarshaller unmarshaller;
    private Unmarshaller unmarshallerJaxb;
    private Marshaller marshallerJaxb;

    @Benchmark
    public void testReferenceResolverMarshal(Blackhole bh) throws Exception {
        StringWriter writer = new StringWriter();
        marshaller.marshal(c, writer);

        bh.consume(writer);
    }

    @Benchmark
    public void testReferenceResolverUnmarshal(Blackhole bh) throws Exception {
        ClassicMoxyContainer cmc = ClassicMoxyContainer.class.cast(unmarshaller.unmarshal(new FileReader("fc.xml")));

        bh.consume(cmc);
    }

    public void testReferenceResolverMarshalJAXBRI(Blackhole bh) throws Exception {
        StringWriter writer = new StringWriter();
        marshallerJaxb.marshal(c, writer);

        bh.consume(writer);
    }

    @Benchmark
    public void testReferenceResolverUnmarshalJAXBRI(Blackhole bh) throws Exception {
        ClassicMoxyContainer cmc = ClassicMoxyContainer.class.cast(unmarshallerJaxb.unmarshal(new FileReader("fc.xml")));
        bh.consume(cmc);
    }

    /**
     * Initial setup.
     */
    @Setup
    public void prepare() throws Exception {
        /* Create and assign case-sensitive unmarshaller */
        c = ClassicMoxyContainer.createHugeContainer();
        JAXBContext context = (JAXBContext) JAXBContextFactory.createContext(
                new Class[]{ClassicMoxyContainer.class, Layer.class, Component.class}, new HashMap());
        jakarta.xml.bind.JAXBContext contextJaxb = JAXBContext.newInstance(
                ClassicMoxyContainer.class, Layer.class, Component.class);
        marshaller = context.createMarshaller();
        marshaller.setProperty(JAXBMarshaller.JAXB_FORMATTED_OUTPUT, true);
        unmarshaller = context.createUnmarshaller();
        marshallerJaxb = contextJaxb.createMarshaller();
        marshallerJaxb.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        unmarshallerJaxb = contextJaxb.createUnmarshaller();

        marshaller.marshal(c, new FileWriter("fc.xml"));
    }

    /**
     * Clean-up.
     */
    @TearDown
    public void tearDown() throws Exception {
        //noinspection ResultOfMethodCallIgnored
        new File("fc.xml").delete();
    }

}
