import javax.sql.DataSource;
-import org.hibernate.cache.EhCacheProvider;
+import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.transaction.PlatformTransactionManager;
+import org.wamblee.cache.EhCache;
import org.wamblee.system.adapters.DefaultContainer;
import org.wamblee.system.core.Component;
import org.wamblee.system.core.DefaultProvidedInterface;
import org.wamblee.system.core.DefaultRequiredInterface;
+import org.wamblee.system.core.ProvidedInterface;
+import org.wamblee.system.core.Scope;
import org.wamblee.usermgt.hibernate.UsermgtHibernateMappingFiles;
public class UserAdministrationComponent extends DefaultContainer {
+ private ProvidedInterface TRANSACTION_MGR = new DefaultProvidedInterface(
+ "transactionManager", PlatformTransactionManager.class);
+ private ProvidedInterface USER_CACHE = new DefaultProvidedInterface(
+ "userCache", EhCache.class);
+ private ProvidedInterface HIBERNATE_TEMPLATE = new DefaultProvidedInterface(
+ "hibernateTemplate", HibernateTemplate.class);
+ private ProvidedInterface USER_MGT = new DefaultProvidedInterface(
+ "usermgt", UserAdministration.class);
+
+ private Component<?> _hibernate;
+ private Component<?> _repository;
+ private Component<?> _usermgt;
+
+ private boolean _exposeInternals;
+
public UserAdministrationComponent(String aName, boolean aExposeInternals)
throws IOException {
super(aName);
+ _exposeInternals = aExposeInternals;
+
addComponent("mappingFiles", new UsermgtHibernateMappingFiles());
- Component<?> hibernate = new HibernateComponent("hibernate");
- addComponent(hibernate);
- Component<?> repository = new UserGroupRepositoryComponent(
- "usersgroups");
- addComponent(repository);
+ _hibernate = new HibernateComponent("hibernate");
+ addComponent(_hibernate);
+
+ _repository = new UserGroupRepositoryComponent("usersgroups");
+ addComponent(_repository);
- Component<?> usermgt = new UserAdministrationLightComponent(
- "usermgtlight");
- addComponent(usermgt);
+ _usermgt = new UserAdministrationLightComponent("usermgtlight");
+ addComponent(_usermgt);
addRequiredInterface(new DefaultRequiredInterface("datasource",
DataSource.class));
if (aExposeInternals) {
- addProvidedInterface(new DefaultProvidedInterface(
- "transactionManager", PlatformTransactionManager.class));
- addProvidedInterface(new DefaultProvidedInterface("userCache",
- EhCacheProvider.class));
+ addProvidedInterface(TRANSACTION_MGR);
+ addProvidedInterface(USER_CACHE);
+ addProvidedInterface(HIBERNATE_TEMPLATE);
+ }
+ addProvidedInterface(USER_MGT);
+ }
+
+ @Override
+ protected Scope doStart(Scope aExternalScope) {
+
+ Scope scope = super.doStart(aExternalScope);
+ if (_exposeInternals) {
+ addInterface(TRANSACTION_MGR, getInterfaceImplementation(
+ TRANSACTION_MGR, _hibernate, scope), aExternalScope);
+ addInterface(USER_CACHE, getInterfaceImplementation(USER_CACHE,
+ _repository, scope), aExternalScope);
+ addInterface(HIBERNATE_TEMPLATE, getInterfaceImplementation(
+ HIBERNATE_TEMPLATE, _hibernate, scope), aExternalScope);
}
- addProvidedInterface(new DefaultProvidedInterface("usermgt",
- UserAdministration.class));
+ addInterface(USER_MGT, getInterfaceImplementation(USER_MGT, _usermgt,
+ scope), aExternalScope);
+ return scope;
+ }
+
+ private Object getInterfaceImplementation(ProvidedInterface aInterface,
+ Component aSource, Scope aScope) {
+ for (ProvidedInterface provided : aSource.getProvidedInterfaces()) {
+ if (provided.equals(aInterface)) {
+ return aScope
+ .getInterfaceImplementation(provided, Object.class);
+ }
+ }
+ throw new IllegalArgumentException("Provided interface '" + aInterface
+ + "' not found in component '" + aSource + "'");
}
}