Integration de spring osgi, spring-security et spring-mvc dans equinox osgi

NOTE de l'auteur, depuis la version alpha/beta que j'ai testé, springsource serveur est devenu dm-server version 1.0 stable. Il implémente de nouvelles fonctionnalités que je ne connais pas encore.

Est-il possible de développer une application web en utilisant le modèle proposé par eclipse RCP (orienté fonctionnalités)?
Une application qu'on le veuille ou non, part souvent d'une simple idée qu'il faut être capable de développer en 2 mois et fini par une pyramide monolithique bourrée de fonctionnalités inter-dépendantes dont le développement 5 ans après n'est toujours pas terminé.

Problème... 1) le projet devient ingerrable 2) la motivation pour les techniciens et le support est en voie de disparition 3) la modification de l'équipe de projet est ultra délicate.

Une Solution... Aborder le projet autrement. 1) considérer qu'il y a de forte chance que l'on développe un gros produit pleins de fonctionnalités, même si l'on croit que non. 2) utiliser une plate-forme magique, Equinox OSGI.

Sans entrer dans la description de OSGI il faut retenir quelque chose d'important. OSGI (couplé à eclipse) permet de diviser une application en fonctionnalités sans en faire l'effort. Chaque fonctionnalité est un projet à part entière, «physiquement» séparé des autres fonctionnalité et pouvant être dépendant d'une autre fonctionnalité, etc. Chaque fonctionnalité, est constituée de plusieurs «plugins» qui peuvent être mis à jour automatiquement ou manuellement depuis une adresse URL (file://, http://, ftp://). Bref, vous pouvez développer un projet complexe sans vous trimbaler des cadavres qui pourrirons les fonctionnalités futur.
Une autre grande implémentation OSGI existe, je vais parler deux minutes de SpringSource qui semle être le graal du graal . SpringSource est parfait car il intègre les outils spring depuis sa conception. Malheureusement pour nous, (enfin avec la version beta que j'ai testé) il n'est pas possible d'atteindre les objectifs fixés par l'équipe d'eclipse; une vrai séparation des fonctionnalités. SpringSource utilise OSGI pour pluginisé les services (servlets et jars) mais les ressources, les descriptions, etc. sont centralisé dans une «webapp» - un container centralisé. Ce qui pose un problème car on ne peut pas mettre la des ressources (jsp, html, js) dans chaque plugins. Il faut lire et essayer les deux système pour comprendre la nuance.

Mais avec equinox on a un autre problème. Comme avec Java, rien n'est jamais simple, on trouve dans son projet «moderne» les fossiles des débuts, les traces de l'évolution, la preuve qu'il n'a pas été créé en 7 jours (hic.) Et cette évolution malheureusement nous empêche de passer de jboss/tomcat à equinox – car souvent les framework sont incompatibles entre eux.

Le chalenge

Utiliser l'implémentation OSGI d'equinox avec les spécifications d'eclipse ET l'integration de spring-dm, spring-mvc et spring-security.

Hallelujah

DONE. Quelques nuits difficiles, scrutage de tous les forums, quelques posts, et après l'effort de guerre, le repos bien mérité. La complète intégration de spring-dm, spring-security et spring-mvc dans equinox d'ecplise. Ce qui me permet de faire un ajout de nouvelle fonctionnalité via le web avec des updates automatiques, efin comme eclipse mais dans une application web.

Et en plus le résultat est élégant ;)

1) créer un projet equinox
2) votre projet dépend de mes plugins

    1.org.springframework.equinox
    2.org.springframework.equinox.acegi
    3.org.springframework.equinox.deployer

3)inclure dans un dossier web toutes vos ressources + jsp
4)inclure dans un dossier lib les services spring
5)décrire le plugin dans le fichier META-INF/spring/plugin.xml

<beans>
  <!-- describe serlvets -->
  <bean id="serviceA" class="org.eclipse.equinox.spring.osgi.Servlet">
         <property name="url" ref="/hello/world"/>
    <property name="config">
      <map>
        <entry key="debug" value="3" />
        <entry key="key" value="value" />
      </map>
    </property>
  </bean> 

  <!-- describe spring entry -->
  <bean id="serviceRegistrator"
    class="org.eclipse.equinox.spring.osgi.ServiceRegistrator">
    <constructor-arg value="org.eclipse.equinox.spring.osgi.deployer.OsgiSpringServiceTracker"/>
    <property name="contextConfig">
      <map>
        <entry key="webapp" value="/a" />
        <entry key="webapp.dir" value="/web" />
        <entry key="dispatcher.uri" value="/*.go" />
        <entry key="dispatcher.config" value="META-INF/spring/dispatcher/plugin.xml" />
        <!-- activate spring security on this plugin -->
        <entry key="acegi.url" value="/*" />
      </map>
    </property>

    <!-- load servlets -->
    <property name="servlets">
      <list>
        <value>serviceA</value>
      </list>
    </property>
  </bean>
</beans>

Ici un exemple concret téléchargeable (c'est le minimum pour l'instant, la doc et le project set suivra ASAP).

Olivier

La convergence

Interessant.

OSGI le Saint Graal du packaging JEE

Très bon article qui met l'eau à la bouche.
Par contre un extrait commenté de votre exemple aurait été un must pour décrire l'interet futur d'osgi dans les applications web.
Pouvez vous en attente nous envoyer le lien de téléchargement de votre exemple ?
En vous remerciant.
Karim

OSGI + Spring

Bonjour Karim,
Merci pour votre intérêt, je vais publier l'exemple cité dans un projet google-code. Il sera détaillé ici ces prochains jours.

Olivier