#    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.

Bundle-Activator: org.apache.aries.tx.control.jpa.xa.impl.Activator

# Export the APIs we use so that this is an easily deployable bundle 
# We keep the dual versions provided by Geronimo to keep things maximally happy

Export-Package: org.osgi.service.transaction.control.jpa, \
                org.osgi.service.cm, \
                org.osgi.service.jdbc, \
                org.osgi.service.jpa, \
                javax.persistence;version=1.2;jpa=2.1, \
                javax.persistence.criteria;version=1.2;jpa=2.1, \
                javax.persistence.metamodel;version=1.2;jpa=2.1,  \
                javax.persistence.spi;version=1.2;jpa=2.1,  \
                javax.persistence;version=2.1,  \
                javax.persistence.criteria;version=2.1, \
                javax.persistence.metamodel;version=2.1,  \
                javax.persistence.spi;version=2.1


# We repackage the JPA API internals and we also embed Hikari CP 
# to avoid dependency fanout

Private-Package: org.apache.aries.tx.control.jdbc.common.impl, \
                 org.apache.aries.tx.control.jdbc.xa.connection.impl, \
                 org.apache.aries.tx.control.jpa.*, \
                 org.apache.geronimo.osgi.locator, \
                 org.apache.geronimo.specs.jpa, \
                 com.zaxxer.hikari, \
                 com.zaxxer.hikari.metrics, \
                 com.zaxxer.hikari.pool, \
                 com.zaxxer.hikari.util

# Ensure that the API is exported substitutably, and that we don't pull
# in any unused pieces of Hikari

Import-Package: !com.codahale.*, \
                !com.zaxxer.hikari.metrics.dropwizard, \
                !javassist.*, \
                !javax.transaction, \
                !org.apache.geronimo.osgi.registry.api, \
                !org.apache.openjpa.*, \
                !org.eclipse.*, \
                !org.hibernate.*, \
                javax.persistence;version="0.0.0", \
                javax.persistence.criteria;version="0.0.0", \
                javax.persistence.metamodel;version="0.0.0", \
                javax.persistence.spi;version="0.0.0", \
                org.osgi.service.transaction.control, \
                org.osgi.service.transaction.control.jpa, \
                org.osgi.service.cm, \
                org.osgi.service.jdbc, \
                org.osgi.service.jpa, \
                *

Provide-Capability: osgi.contract;osgi.contract="JavaJPA";version:List<Version>="1.0,2.0,2.1";uses:="javax.persistence,javax.persistence.criteria,javax.persistence.metamodel,javax.persistence.spi", \
                    osgi.service;objectClass="org.osgi.service.transaction.control.jpa.JPAEntityManagerProvider";osgi.xa.enabled="true";uses:="org.osgi.service.transaction.control.jpa", \
                    osgi.service;objectClass="org.osgi.service.transaction.control.jpa.JPAEntityManagerProviderFactory";osgi.xa.enabled="true";uses:="org.osgi.service.transaction.control.jpa"
                    
Require-Capability: osgi.contract;filter:="(&(osgi.contract=JavaJPA)(version=2.1))", \
                    osgi.service;filter:="(objectClass=org.osgi.service.jdbc.DataSourceFactory)";resolution:="optional";effective:="active", \
                    osgi.service;filter:="(objectClass=org.osgi.service.jpa.EntityManagerFactoryBuilder)";resolution:="optional";effective:="active"
