HibernateUserAdministrationTest now based on the component mechanism.
[utils] / security / src / main / java / org / wamblee / usermgt / UserAdministrationComponent.java
index 9c11c1b4d98c2ab1bb40f49c91985b6b758d544a..d1f6a87ab206099fc86d6180e9eeb20600fdee9d 100644 (file)
@@ -19,42 +19,88 @@ import java.io.IOException;
 
 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 + "'");
     }
 }