/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.datastore.infinispan.persistencestrategy.impl;
import java.io.InputStream;
import org.infinispan.configuration.parsing.ConfigurationBuilderHolder;
import org.infinispan.configuration.parsing.ParserRegistry;
/**
*
* @author Sanne Grinovero
*/
public class InfinispanConfigurationParser {
private final ParserRegistry configurationParser;
private final ClassLoader ispnClassLoadr;
public InfinispanConfigurationParser() {
ispnClassLoadr = ParserRegistry.class.getClassLoader();
configurationParser = new ParserRegistry( ispnClassLoadr );
}
ConfigurationBuilderHolder parseFile(InputStream configuration) {
//Infinispan requires the context ClassLoader to have full visibility on all
//its components and eventual extension points even *during* configuration parsing.
final Thread currentThread = Thread.currentThread();
final ClassLoader originalContextClassLoader = currentThread.getContextClassLoader();
try {
currentThread.setContextClassLoader( ispnClassLoadr );
ConfigurationBuilderHolder builderHolder = configurationParser.parse( configuration );
//Workaround Infinispan's ClassLoader strategies to bend to our will:
fixClassLoaders( builderHolder );
return builderHolder;
}
finally {
currentThread.setContextClassLoader( originalContextClassLoader );
}
}
private void fixClassLoaders(ConfigurationBuilderHolder builderHolder) {
//Global section:
builderHolder.getGlobalConfigurationBuilder().classLoader( ispnClassLoadr );
}
}