J'ai un système modulaire OSGi dans lequel j'ai les composants suivants :
- Mise en œuvre d'une instance de protocole spécifique, qui représente une connexion via un protocole spécifique à un serveur spécifique (instanciée par service de connexion).
- Un service spécifique de gestion des instances de protocole, créant et préconfigurant des instances à la demande (plusieurs services singletone à partir, normalement, de différents bundles).
- Gestionnaire de connexion qui regroupe les services du gestionnaire de protocole et leur demande de fournir des instances de protocole en cas de besoin (service unique).
Ils sont emballés dans des bundles OSGi comme suit :
`-ConnectionManager
`-ConnectionManager.class
`-IrcProtocol
`-IrcProtocolManagerService.class
`-IrcProtocolInstance.class
`-XMPPProtocol
`-XMPPProtocolManagerService.class
`-XMPPProtocolInstance.class
En ConnectionManager
est annoté avec
@Provides
@Instantiate
@Component
Et met en œuvre Subscriber
qui lui confère la capacité d'envoyer et d'écouter des messages transmis par une sorte d'interface typée. Event Admin
.
Chaque *ProtocolManager
est annoté avec
@Provides
@Instantiate
@Component
Et met en œuvre ProtocolManager
qui lui permet d'être découvert par ConnectionManager
service d'écoute.
Chaque *ProtocolInstance
est annoté avec
@Provides
@Component
Et met en œuvre Subscriber
interface. Il implémente également ProtocolInstance
qui offre des opérations de connexion génériques telles que connect()
y disconnect()
.
Le problème ici est que ProtocolInstance
sont créés à la main, avec new
à l'intérieur de ProtocolManager
et non par @Instantiate
et, pour cette raison, ne participent pas à la publication de services iPOJO, malgré son caractère @Provides
annotation.
La question est la suivante : comment publier correctement (et de préférence de manière déclarative, avec des annotations) ce fichier créé de manière programmatique ? ProtocolListener
sans plonger manuellement dans la publication brute des services OSGi (au moins en dehors d'une sorte de fabrique, peut-être) ? Ou, probablement, comment restructurer mon système pour qu'il respecte mieux les directives tacites de l'iPOJO ?