Hi devs,

I'd like to propose the following to implement 
http://jira.xwiki.org/browse/XWIKI-8271:

* Create a new xwiki-platform-store-hibernate module
* Add a Component role: HibernateConfiguration implements Comparable
* API: void HibernateConfiguration.configure(Configuration 
aggregatedConfiguration), where the passed aggregatedConfiguration contains the 
configuration filled by all the HibernateConfiguration.configure() calls 
executed before
* Add a HibernateConfigurationManager.getConfiguration() component that is in 
charge of loading the various HibernateConfiguration in the correct order
* Have an AbstractHibernateConfiguration implements  HibernateConfiguration 
with 1 API: getDatabaseType(Configuration configuration). It gets the DB type 
from the connection URL string and returns a DatabaseType object which 
represents the database type

* CoreHibernateMapping (hint = "xwiki") <==> xwiki.hbm.*.xml - highest 
priority, defines the connection URL among other props
* ActivityStreamHibernateMapping (hint = "activitystream")
* FeedHibernateMapping (hint = "feeds")

Note 1: If a HibernateConfiguration impl needs to load mappings that depend on 
the DB they call AbstractHibernateConfiguration. getDatabaseType() to get the 
DB.
Note 2: If the user wants to use a different HBM file, he/she just has to put a 
file with the same name (e.g. xwiki.hbm.xml) in WEB-INF/classes
Note 3: This means we won't put any mapping anymore in the hibernate.cfg.xml 
file since it's not needed anymore (although it would continue to work if you 
put mappings there).

Usage:

@Inject
HibernateConfigurationManager configurationManager;

Configuration configuration = configurationManager.getConfiguration();
SessionFactory sessionFactory = configuration.buildSessionFactory();

Then all that remains to implement http://jira.xwiki.org/browse/XWIKI-8271 is 
to have a component singleton that will be in charge of returning the 
SessionFactory and which can be asked to rebuild a new SessionFactory (using a 
new Configuration).

We'll just need to decide how we trigger this. 2 options:
* By using an Event Listener listening on HibernateConfiguration registrations 
and recreating automatically a new SessionFactory when it happens. Cons: if an 
extension contributes several HibernateConfiguration then Hibernate will be 
reinitialized several times
* By listening to an Event sent by the Extension Manager when an extension has 
finished loading and somehow find out all the HibernateConfiguration that have 
been added (several ways of doing this) and recreating the SessionFactory

Note: The only issue I can foresee is if a Hibernate call is in progress in one 
thread when an extension is installed and a new SessionFactory is created at 
the same time. Either we don't care or we could implement retry at the DB 
level, or we could introduce some semaphore so that we start the reinit only 
when nobody has a lock on the SessionFactory, or…

WDYT?

Of course, the pros is those listed in http://jira.xwiki.org/browse/XWIKI-8271:
* Ability for a platform module to contribute Hibernate mappings (static)
* Ability for an extension installed at runtime to contribute Hibernate 
mappings (dynamic)

Note that the reason I'm starting all this is because I'd like to implement 
http://jira.xwiki.org/jira/browse/XWIKI-7953 cleanly in a module separate from 
oldcore.

Thanks
-Vincent

_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to