package org.openntf.domino.xsp.helpers;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.FactoryFinder;
import javax.faces.application.ApplicationFactory;
import org.openntf.service.IServiceLocator;
import org.openntf.service.IServiceLocatorFactory;
import com.ibm.commons.extension.ExtensionManager;
import com.ibm.xsp.application.ApplicationEx;
public class OsgiServiceLocatorFactory implements IServiceLocatorFactory {
@Override
public IServiceLocator createServiceLocator() {
return AccessController.doPrivileged(new PrivilegedAction<IServiceLocator>() {
@Override
public IServiceLocator run() {
ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder.getFactory("javax.faces.application.ApplicationFactory");
final ApplicationEx app_ = aFactory == null ? null : (ApplicationEx) aFactory.getApplication();
if (app_ == null) {
return new IServiceLocator() {
final Map<Class<?>, List<?>> cache = new HashMap<Class<?>, List<?>>();
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public <T> List<T> findApplicationServices(final Class<T> serviceClazz) {
List<T> ret = (List<T>) cache.get(serviceClazz);
if (ret == null) {
ret = AccessController.doPrivileged(new PrivilegedAction<List<T>>() {
@Override
public List<T> run() {
return (List<T>) ExtensionManager.findApplicationServices(null, Thread.currentThread()
.getContextClassLoader(), serviceClazz.getName());
}
});
if (Comparable.class.isAssignableFrom(serviceClazz)) {
Collections.sort((List<? extends Comparable>) ret);
}
cache.put(serviceClazz, ret);
}
return ret;
}
};
} else {
return new IServiceLocator() {
final Map<Class<?>, List<?>> cache = new HashMap<Class<?>, List<?>>();
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public <T> List<T> findApplicationServices(final Class<T> serviceClazz) {
List<T> ret = (List<T>) cache.get(serviceClazz);
if (ret == null) {
ret = AccessController.doPrivileged(new PrivilegedAction<List<T>>() {
@Override
public List<T> run() {
return app_.findServices(serviceClazz.getName());
}
});
if (Comparable.class.isAssignableFrom(serviceClazz)) {
Collections.sort((List<? extends Comparable>) ret);
}
cache.put(serviceClazz, ret);
}
return ret;
}
};
}
}
});
}
}