#    Licensed to the Apache Software Foundation (ASF) under one
#    or more contributor license agreements.  See the NOTICE file
#    distributed with this work for additional information
#    regarding copyright ownership.  The ASF licenses this file
#    to you under the Apache License, Version 2.0 (the
#    "License"); you may not use this file except in compliance
#    with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing,
#    software distributed under the License is distributed on an
#    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#    KIND, either express or implied.  See the License for the
#    specific language governing permissions and limitations
#    under the License.

-tester: biz.aQute.tester.junit-platform

-runpath: \
    ch.qos.logback.classic,\
    ch.qos.logback.core,\
    org.apache.felix.logback,\
    slf4j.api
-runsystempackages: \
    org.slf4j;version=${slf4j.version},\
    org.slf4j.event;version=${slf4j.version},\
    org.slf4j.helpers;version=${slf4j.version},\
    org.slf4j.spi;version=${slf4j.version},\
    com.sun.net.httpserver

-runfw: org.eclipse.osgi

#-runjdb: 8000
#-runtrace: true

-resolve.effective: resolve, active

-runrequires: \
    osgi.identity;filter:='(osgi.identity=org.apache.aries.jax.rs.rest.management)',\
    osgi.identity;filter:='(osgi.identity=org.apache.aries.jax.rs.rest.management.itest)',\
    osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)',\
    osgi.identity;filter:='(osgi.identity=org.apache.johnzon.mapper)',\
    bnd.identity;id='junit-jupiter-engine',\
    bnd.identity;id='junit-platform-launcher'

-runsystemcapabilities: ${native_capability}
-runproperties: \
    logback.configurationFile=${fileuri;${.}/logback.xml},\
    osgi.console=, \
    org.apache.cxf.osgi.http.transport.disable=true,\
    org.apache.felix.http.host=localhost,\
    org.osgi.service.http.port=*,\
    org.apache.aries.spifly.auto.consumers=jakarta.*,\
    org.apache.aries.spifly.auto.providers=com.sun.*

-runbundles: \
	assertj-core;version='[3.19.0,3.19.1)',\
	com.fasterxml.jackson.core.jackson-annotations;version='[2.12.1,2.12.2)',\
	com.fasterxml.jackson.core.jackson-core;version='[2.12.1,2.12.2)',\
	com.fasterxml.jackson.core.jackson-databind;version='[2.12.1,2.12.2)',\
	com.fasterxml.jackson.dataformat.jackson-dataformat-yaml;version='[2.12.1,2.12.2)',\
	com.fasterxml.jackson.datatype.jackson-datatype-jsr310;version='[2.12.1,2.12.2)',\
	com.fasterxml.jackson.jaxrs.jackson-jaxrs-base;version='[2.12.1,2.12.2)',\
	com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider;version='[2.12.1,2.12.2)',\
	com.fasterxml.woodstox.woodstox-core;version='[6.2.4,6.2.5)',\
	com.jayway.jsonpath.json-path;version='[2.4.0,2.4.1)',\
	com.sun.istack.commons-runtime;version='[3.0.11,3.0.12)',\
	com.sun.xml.bind.jaxb-osgi;version='[2.3.3,2.3.4)',\
	io.github.classgraph.classgraph;version='[4.8.95,4.8.96)',\
	io.swagger.core.v3.swagger-annotations;version='[2.1.7,2.1.8)',\
	io.swagger.core.v3.swagger-core;version='[2.1.7,2.1.8)',\
	io.swagger.core.v3.swagger-integration;version='[2.1.7,2.1.8)',\
	io.swagger.core.v3.swagger-jaxrs2;version='[2.1.7,2.1.8)',\
	io.swagger.core.v3.swagger-models;version='[2.1.7,2.1.8)',\
	jakarta.validation.jakarta.validation-api;version='[2.0.2,2.0.3)',\
	jakarta.xml.bind-api;version='[2.3.3,2.3.4)',\
	junit-jupiter-api;version='[5.7.1,5.7.2)',\
	junit-jupiter-engine;version='[5.7.1,5.7.2)',\
	junit-platform-commons;version='[1.7.1,1.7.2)',\
	junit-platform-engine;version='[1.7.1,1.7.2)',\
	junit-platform-launcher;version='[1.7.1,1.7.2)',\
	net.javacrumbs.json-unit.json-unit-assertj;version='[2.25.0,2.25.1)',\
	net.javacrumbs.json-unit.json-unit-core;version='[2.25.0,2.25.1)',\
	net.javacrumbs.json-unit.json-unit-json-path;version='[2.25.0,2.25.1)',\
	net.minidev.accessors-smart;version='[1.2.0,1.2.1)',\
	net.minidev.json-smart;version='[2.3.0,2.3.1)',\
	org.apache.aries.component-dsl.component-dsl;version='[1.2.2,1.2.3)',\
	org.apache.aries.jax.rs.openapi.resource;version='[2.0.0,2.0.1)',\
	org.apache.aries.jax.rs.rest.management;version='[2.0.0,2.0.1)',\
	org.apache.aries.jax.rs.rest.management.itest;version='[2.0.0,2.0.1)',\
	org.apache.aries.jax.rs.whiteboard;version='[2.0.0,2.0.1)',\
	org.apache.aries.spifly.dynamic.framework.extension;version='[1.3.3,1.3.4)',\
	org.apache.commons.lang3;version='[3.12.0,3.12.1)',\
	org.apache.cxf.cxf-core;version='[3.4.3,3.4.4)',\
	org.apache.cxf.cxf-rt-frontend-jaxrs;version='[3.4.3,3.4.4)',\
	org.apache.cxf.cxf-rt-rs-client;version='[3.4.3,3.4.4)',\
	org.apache.cxf.cxf-rt-rs-sse;version='[3.4.3,3.4.4)',\
	org.apache.cxf.cxf-rt-security;version='[3.4.3,3.4.4)',\
	org.apache.cxf.cxf-rt-transports-http;version='[3.4.3,3.4.4)',\
	org.apache.felix.configadmin;version='[1.9.20,1.9.21)',\
	org.apache.felix.gogo.command;version='[1.1.2,1.1.3)',\
	org.apache.felix.gogo.runtime;version='[1.1.4,1.1.5)',\
	org.apache.felix.gogo.shell;version='[1.1.4,1.1.5)',\
	org.apache.felix.http.jetty;version='[4.1.6,4.1.7)',\
	org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
	org.apache.geronimo.specs.geronimo-annotation_1.3_spec;version='[1.3.0,1.3.1)',\
	org.apache.geronimo.specs.geronimo-jaxrs_2.1_spec;version='[1.1.0,1.1.1)',\
	org.apache.geronimo.specs.geronimo-json_1.1_spec;version='[1.5.0,1.5.1)',\
	org.apache.johnzon.core;version='[1.2.10,1.2.11)',\
	org.apache.johnzon.mapper;version='[1.2.10,1.2.11)',\
	org.apache.ws.xmlschema.core;version='[2.2.5,2.2.6)',\
	org.glassfish.jaxb.runtime;version='[2.3.3,2.3.4)',\
	org.hamcrest;version='[2.2.0,2.2.1)',\
	org.objectweb.asm;version='[5.0.4,5.0.5)',\
	org.opentest4j;version='[1.2.0,1.2.1)',\
	org.osgi.service.jaxrs;version='[1.0.0,1.0.1)',\
	org.osgi.service.rest;version='[1.0.0,1.0.1)',\
	org.osgi.test.assertj.framework;version='[0.10.0,0.10.1)',\
	org.osgi.test.common;version='[0.10.0,0.10.1)',\
	org.osgi.test.junit5;version='[0.10.0,0.10.1)',\
	org.osgi.util.function;version='[1.1.0,1.1.1)',\
	org.osgi.util.promise;version='[1.1.1,1.1.2)',\
	org.xmlunit.xmlunit-assertj3;version='[2.8.2,2.8.3)',\
	org.xmlunit.xmlunit-core;version='[2.8.2,2.8.3)',\
	org.yaml.snakeyaml;version='[1.27.0,1.27.1)',\
	stax2-api;version='[4.2.1,4.2.2)'

-runstartlevel: \
    order=sortbynameversion,\
    begin=-1

-include: -personal.bnd
