Sorry for the "timeout" before answering your comment but it took me some
time to have a look at all solutions that were proposed. What strikes me is
that, as you already stated, it is difficult to select a solution that is
simple, well documented and seen as a standard. It's a bit annoying as osgi
doesn't seem to be a young solution. By browsing the web, looking for
solutions, it seems to go in every directions.
To be more concrete, I tried to combine 2 solutions to my need : blueprint
and DS.
I'm not sure we can mix several solutions. I probably need to spend some
more time :)
First, I use blueprint solution to deploy a persistence bundle and Christian
tutorial site has been of a great help with that. Thanks to you.
Then I tried to add declarative service in the loop, using annotations as it
seemed practical to me.
For the moment, I'm not able to make this working so I hope you might take a
little bit more time to evangelize 
Can I do this?
In the persistence bundle, after having installed hibernate feature:

@Component(immediate = true)
@Transactional
public class RepositoryImpl implements IRepository {

        private EntityManager manager;  

        @PersistenceContext(unitName="db")
        public void setEntityManager(EntityManager manager) {
                this.manager = manager;
        }

        private UniqueIdManagerItf uniqueIdManager;

        @Reference
        public void setUniqueIdManager(UniqueIdManagerItf uniqueIdManager) {
                this.uniqueIdManager = uniqueIdManager;
        }

        @Override
        public void removeAll() {
                ArrayList<String> uniqueIdList = new ArrayList<>();

                uniqueIdList = uniqueIdManager.getUniqueIdList();
                for (String id: uniqueIdList) {
                        uniqueIdManager.setIdAsAvailable(id);
                }
                manager.createQuery("DELETE FROM MyEntity").executeUpdate();
        }

with a pom like this:
                                <configuration>
                                        <instructions>
                                                
<Bundle-SymbolicName>${project.artifactId}</Bundle-symbolicName>
                                                
<Bundle-Version>${project.version}</Bundle-Version>
                                                <supportedProjectTypes>
                                                        
<supportedProjectType>bundle</supportedProjectType>
                                                </supportedProjectTypes>
                                                <Export-Package>
                                                
com.example.persistence.entity.*;version=${project.version}
                                                </Export-Package>
                                                <Import-Package>
                                                        *
                                                </Import-Package>
                                                
<Meta-Persistence>META-INF/persistence.xml</Meta-Persistence>
                                                <Dynamic-Import-Package>
                                                        *,
                                                        org.hibernate.proxy,
                                                        javassist.util.proxy
                                                </Dynamic-Import-Package>
                                                
<_dsannotations>*</_dsannotations>
                                        </instructions>
                                </configuration>

a persistence.xml :
<persistence xmlns="http://java.sun.com/xml/ns/persistence";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"; version="2.0">

  <persistence-unit name="db" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
   
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=db)</jta-data-source>
        <class>com.example.persistence.entity.MyEntity</class>
        
    <properties>
      <property name="hibernate.dialect"
value="org.hibernate.dialect.H2Dialect"/>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
      <property name="hibernate.archive.autodetection" value="class"/>
    </properties>

  </persistence-unit>

</persistence>

and what might be unnecessary :
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"; 
                   xmlns:jpa="http://aries.apache.org/xmlns/jpa/v2.0.0"; 
                   xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.2.0"; 
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
                   
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0
https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd";>
        <jpa:enable/>
        <tx:enable-annotations/>
</blueprint>

In the consumer bundle (something like a REST api):

@Path("")
@Component
public class EndPoint {

        private IRepository repository;
        @Reference
        public void setRepository(IRepository repository) {
                this.repository = repository;
        }

        @DELETE
        @Path("removeAll")
        public void  clearDB() {
                repository.removeAll();

        }

With a third bundle API:
public interface IRepository {
        void removeAll();

in this example, I think i'm missing something that will instantiate the
IRepository although I thought it will be done by the declarative service. I
also think that I probably didn't understand well how it works internally.

On karaf side:
scr:details com.example.persistence.JPAResourceRepositoryImpl
Component Details
  Name                : com.example.persistence.JPAResourceRepositoryImpl
  State               : ACTIVE
References
  Reference           : UniqueIdManager
    State             : satisfied
    Multiple          : single
    Optional          : mandatory
    Policy            : static
    Service Reference : Bound Service ID 556
(com.example.persistence.UniqueIdManager)

As you can understand, I really need more reading sessions of the chapter 5
inside OSGi Core document!




--
View this message in context: 
http://karaf.922171.n3.nabble.com/Multiple-bundles-dependencies-injection-pax-cdi-or-blueprint-tp4049756p4049823.html
Sent from the Karaf - User mailing list archive at Nabble.com.

Reply via email to