#
# Copyright 2006-2013 the original author or authors.
#
# Licensed 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.
#
# Licensed 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.
#
# START OF EDITION
# This file is loaded by org.springframework.osgi.test.AbstractDependencyManagerTests. The
# original file is located in spring-osgi-test-1.2.1.jar. Changes to the original are tagged
# with "EDITED"
# END OF EDITION
#
# Properties file indicating the boot (or mandatory) bundles that are loaded
# by the testing framework.
#
# Normally, this file should not be edited since it is used by the testing infrastructure.
# Users that want to install bundles before starting a test, should use #bundles() method.
#

#
# format: <groupId,artifactId,version>=+/-15
# - the optional value is used to install/remove bundles if running on JDK >= 1.5
# - see Spring org.springframework.core.JdkVersion for jdk major version codes.

# elements that have to be ignored should star with
# ignore

# Note: inner placeholders are not supported. 

#
# common properties
#

# versioning
ignore.backport.version=3.1.0
ignore.junit.version=3.8.2
# EDITED: Upgrade the version from 1.2.15-SNAPSHOT to ${log4j.version}
ignore.log4j.version=${log4j.version}

ignore.spring.version=2.5.6.SEC01
# EDITED: Filter the version to match the pom
ignore.spring.osgi.version=${spring.osgi.version}
# EDITED: Upgraded from 1.5.0
ignore.slf4j.version=${slf4j.version}
ignore.asm.version=2.2.3

# groupIds
ignore.spring.groupId=org.springframework
ignore.spring.osgi.groupId=org.springframework.osgi
ignore.slf4j.groupId=org.slf4j
# EDITED: Switch from org.springframework.osgi to log4j 
ignore.log4j.groupId=log4j

#
# actual libraries
#
# listed in dependency order to ease deployment


# dependencies

# junit
org.junit,com.springsource.junit,${ignore.junit.version}=
# log4j
# EDITED: Change the groupId for log4j
${ignore.log4j.groupId},log4j,${ignore.log4j.version}=
# slf4j (commons-logging API)
#${ignore.slf4j.groupId},slf4j-api,${ignore.slf4j.version}=
#${ignore.slf4j.groupId},slf4j-log4j12,${ignore.slf4j.version}=
#${ignore.slf4j.groupId},jcl104-over-slf4j,${ignore.slf4j.version}=
# slf4j (BRITS)
# EDITED: Change the groupId for and artifactId
${ignore.slf4j.groupId},slf4j-api,${ignore.slf4j.version}=
${ignore.slf4j.groupId},slf4j-log4j12,${ignore.slf4j.version}=
${ignore.slf4j.groupId},jcl-over-slf4j,${ignore.slf4j.version}=
# aop alliance
org.aopalliance,com.springsource.org.aopalliance,1.0.0=
# asm
org.objectweb.asm,com.springsource.org.objectweb.asm,${ignore.asm.version}=
# backport concurrent
edu.emory.mathcs.backport,com.springsource.edu.emory.mathcs.backport,${ignore.backport.version}=-15

# spring libs
${ignore.spring.groupId},org.springframework.beans,${ignore.spring.version}=
${ignore.spring.groupId},org.springframework.core,${ignore.spring.version}=
${ignore.spring.groupId},org.springframework.context,${ignore.spring.version}=
${ignore.spring.groupId},org.springframework.aop,${ignore.spring.version}=
${ignore.spring.groupId},org.springframework.test,${ignore.spring.version}=


# spring osgi libs
${ignore.spring.osgi.groupId},spring-osgi-io,${ignore.spring.osgi.version}=
${ignore.spring.osgi.groupId},spring-osgi-core,${ignore.spring.osgi.version}=
${ignore.spring.osgi.groupId},spring-osgi-annotation,${ignore.spring.osgi.version}=+15
${ignore.spring.osgi.groupId},spring-osgi-extender,${ignore.spring.osgi.version}=
${ignore.spring.osgi.groupId},spring-osgi-test,${ignore.spring.osgi.version}=
