/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* 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.osgi;
import java.util.LinkedHashSet;
import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
/**
* The ClassLoaderService that should be used when running in OSGi;
* this helps for example to load the Services correctly.
*
* @author Sanne Grinovero
*/
public class OSGiClassLoaderServiceImpl extends ClassLoaderServiceImpl implements ClassLoaderService {
private final OsgiServiceUtil osgiServiceUtil;
private final OsgiClassLoader osgiClassLoader;
public OSGiClassLoaderServiceImpl(OsgiClassLoader osgiClassLoader, OsgiServiceUtil osgiServiceUtil) {
super( osgiClassLoader );
this.osgiClassLoader = osgiClassLoader;
this.osgiServiceUtil = osgiServiceUtil;
}
@Override
public <S> LinkedHashSet<S> loadJavaServices(Class<S> serviceContract) {
Iterable<S> parentDiscoveredServices = super.loadJavaServices( serviceContract );
S[] serviceImpls = osgiServiceUtil.getServiceImpls(serviceContract);
LinkedHashSet<S> composite = new LinkedHashSet<S>();
for ( S service : parentDiscoveredServices ) {
composite.add( service );
}
for ( S service : serviceImpls ) {
composite.add( service );
}
return composite;
}
@Override
public void stop() {
super.stop();
osgiClassLoader.stop();
osgiServiceUtil.stop();
}
}