/*
 * Copyright (c) 2016, 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:
//     Dmitry Kornilov - initial implementation
package org.eclipse.persistence.testing.osgi;

import org.ops4j.pax.exam.Option;

import static org.ops4j.pax.exam.CoreOptions.bundle;
import static org.ops4j.pax.exam.CoreOptions.cleanCaches;
import static org.ops4j.pax.exam.CoreOptions.junitBundles;
import static org.ops4j.pax.exam.CoreOptions.options;
import static org.ops4j.pax.exam.CoreOptions.systemPackage;

/**
 * Helper class with PAX options for different kind of OSGi tests.
 *
 * @author Dmitry Kornilov
 * @since 2.7.0
 */
public class OSGITestHelper {
    // Environment variables defined in antbuild.properties/antbuild.xml
    private static final String PLUGINS_DIR = System.getProperty("plugins.dir","target/osgi-test-plugins/");
    private static final String ACTIVATION_JAR = System.getProperty("activation.jar", "jakarta.activation.jar");
    private static final String JAXB_API_JAR = System.getProperty("jaxb-api.jar", "jakarta.xml.bind-api.jar");
    private static final String JAXB_OSGI = System.getProperty("jaxb-osgi.jar", "jaxb-xjc.jar");
    private static final String JAXRS_JAR = System.getProperty("jaxrs.jar", "jakarta.ws.rs-api.jar");
    private static final String ASM_JAR = System.getProperty("asm.jar", "org.eclipse.persistence.asm.jar");

    public static Option[] getDefaultOptions() {

        return options(
                // JAXB API
                bundle("file:" + PLUGINS_DIR + ACTIVATION_JAR),
                bundle("file:" + PLUGINS_DIR + JAXB_API_JAR),
                //JAXB_OSGI
                bundle("file:" + PLUGINS_DIR + JAXB_OSGI),

                systemPackage("javax.rmi"),
                systemPackage("javax.rmi.CORBA"),
                systemPackage("org.omg.CORBA"),
                systemPackage("org.omg.CORBA.portable"),
                systemPackage("org.omg.CORBA_2_3.portable"),
                // JAX-RS API
                bundle("file:" + PLUGINS_DIR + JAXRS_JAR),

                // EclipseLink bundles
                bundle("file:" + PLUGINS_DIR + "org.eclipse.persistence.moxy.jar"),
                bundle("file:" + PLUGINS_DIR + "org.eclipse.persistence.core.jar"),
                bundle("file:" + PLUGINS_DIR + ASM_JAR),

                cleanCaches(),
                junitBundles());
    }

    public static Option[] getOptionsWithBeanValidation() {
        return options(
                // JAXB API
                bundle("file:" + PLUGINS_DIR + ACTIVATION_JAR),
                bundle("file:" + PLUGINS_DIR + JAXB_API_JAR),

                // JAX-RS API
                bundle("file:" + PLUGINS_DIR + JAXRS_JAR),

                // EclipseLink bundles
                bundle("file:" + PLUGINS_DIR + "org.eclipse.persistence.moxy.jar"),
                bundle("file:" + PLUGINS_DIR + "org.eclipse.persistence.core.jar"),
                bundle("file:" + PLUGINS_DIR + ASM_JAR),

                bundle("file:" + PLUGINS_DIR + "jakarta.validation-api.jar"),
                bundle("file:" + PLUGINS_DIR + "hibernate-validator.jar"),
                bundle("file:" + PLUGINS_DIR + "classmate.jar"),
                bundle("file:" + PLUGINS_DIR + "jakarta.el-api.jar"),
                bundle("file:" + PLUGINS_DIR + "jakarta.el.jar"),
                bundle("file:" + PLUGINS_DIR + "jboss-logging.jar"),
                cleanCaches(),
                junitBundles()
        );
    }
}
