#    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.9,2.1.10)',\
	io.swagger.core.v3.swagger-core;version='[2.1.9,2.1.10)',\
	io.swagger.core.v3.swagger-integration;version='[2.1.9,2.1.10)',\
	io.swagger.core.v3.swagger-jaxrs2;version='[2.1.9,2.1.10)',\
	io.swagger.core.v3.swagger-models;version='[2.1.9,2.1.10)',\
	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.1,2.0.2)',\
	org.apache.aries.jax.rs.rest.management;version='[2.0.1,2.0.2)',\
	org.apache.aries.jax.rs.rest.management.itest;version='[2.0.1,2.0.2)',\
	org.apache.aries.jax.rs.whiteboard;version='[2.0.1,2.0.2)',\
	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.11,1.2.12)',\
	org.apache.johnzon.mapper;version='[1.2.11,1.2.12)',\
	org.apache.ws.xmlschema.core;version='[2.2.5,2.2.6)',\
	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
