You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2006/07/21 16:43:26 UTC

svn commit: r424338 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/internal/ioc/ main/java/org/apache/tapestry/internal/util/ test/conf/ test/java/org/apache/tapestry/internal/ioc/

Author: hlship
Date: Fri Jul 21 07:43:25 2006
New Revision: 424338

URL: http://svn.apache.org/viewvc?rev=424338&view=rev
Log:
Add in code allowing the Registry and Module to work together to build ordered lists of decorators.

Modified:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/Module.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ModuleImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/RegistryImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/util/Orderer.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ModuleImplTest.java

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/Module.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/Module.java?rev=424338&r1=424337&r2=424338&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/Module.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/Module.java Fri Jul 21 07:43:25 2006
@@ -16,8 +16,11 @@
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.tapestry.ioc.ServiceDecorator;
+import org.apache.tapestry.ioc.def.DecoratorDef;
+import org.apache.tapestry.ioc.def.ServiceDef;
 
 /**
  * A module within the Tapestry IoC registry. Each Module is constructed around a corresponding
@@ -74,4 +77,14 @@
      * Returns the instantiated module builder instance.
      */
     Object getModuleBuilder();
+
+    /**
+     * Iterates over any decorator definitions defined by the module and returns those that apply to
+     * the provided service definition.
+     * 
+     * @param serviceDef
+     *            for which decorators are being assembled
+     * @return set of decorators, possibly empty (but not null)
+     */
+    Set<DecoratorDef> findMatchingDecoratorDefs(ServiceDef serviceDef);
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ModuleImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ModuleImpl.java?rev=424338&r1=424337&r2=424338&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ModuleImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ModuleImpl.java Fri Jul 21 07:43:25 2006
@@ -16,6 +16,7 @@
 
 import static org.apache.tapestry.util.CollectionFactory.newList;
 import static org.apache.tapestry.util.CollectionFactory.newMap;
+import static org.apache.tapestry.util.CollectionFactory.newSet;
 import static org.apache.tapestry.util.Defense.notBlank;
 import static org.apache.tapestry.util.Defense.notNull;
 
@@ -23,6 +24,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.logging.Log;
 import org.apache.hivemind.service.BodyBuilder;
@@ -32,6 +34,7 @@
 import org.apache.tapestry.ioc.ServiceDecorator;
 import org.apache.tapestry.ioc.ServiceLifecycle;
 import org.apache.tapestry.ioc.ServiceResources;
+import org.apache.tapestry.ioc.def.DecoratorDef;
 import org.apache.tapestry.ioc.def.ModuleDef;
 import org.apache.tapestry.ioc.def.ServiceDef;
 import org.apache.tapestry.ioc.services.ClassFab;
@@ -94,6 +97,19 @@
             throw new RuntimeException(IOCMessages.serviceWrongInterface(serviceId, def
                     .getServiceInterface(), serviceInterface));
         }
+    }
+
+    public Set<DecoratorDef> findMatchingDecoratorDefs(ServiceDef serviceDef)
+    {
+        Set<DecoratorDef> result = newSet();
+
+        for (DecoratorDef def : _moduleDef.getDecoratorDefs())
+        {
+            if (def.matches(serviceDef))
+                result.add(def);
+        }
+
+        return result;
     }
 
     private boolean notVisible(ServiceDef def, Module module)

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/RegistryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/RegistryImpl.java?rev=424338&r1=424337&r2=424338&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/RegistryImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/RegistryImpl.java Fri Jul 21 07:43:25 2006
@@ -21,14 +21,18 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.logging.Log;
 import org.apache.tapestry.internal.annotations.SuppressNullCheck;
+import org.apache.tapestry.internal.util.Orderer;
 import org.apache.tapestry.ioc.IdUtils;
 import org.apache.tapestry.ioc.LogSource;
 import org.apache.tapestry.ioc.Registry;
 import org.apache.tapestry.ioc.ServiceDecorator;
 import org.apache.tapestry.ioc.ServiceLifecycle;
+import org.apache.tapestry.ioc.ServiceResources;
+import org.apache.tapestry.ioc.def.DecoratorDef;
 import org.apache.tapestry.ioc.def.ModuleDef;
 import org.apache.tapestry.ioc.def.ServiceDef;
 import org.apache.tapestry.util.CollectionFactory;
@@ -145,7 +149,83 @@
     // TODO: Real implementation
     public List<ServiceDecorator> findDecoratorsForService(ServiceDef serviceDef)
     {
-        return newList();
+        Log log = getLog(serviceDef.getServiceId());
+
+        Orderer<DecoratorDef> orderer = new Orderer<DecoratorDef>(log);
+
+        addDecoratorDefsToOrderer(orderer, serviceDef);
+
+        List<DecoratorDef> ordered = orderer.getOrdered();
+
+        return convertDecoratorDefsToServiceDecorators(ordered, serviceDef, log);
+    }
+
+    private List<ServiceDecorator> convertDecoratorDefsToServiceDecorators(
+            List<DecoratorDef> ordered, ServiceDef serviceDef, Log log)
+    {
+        List<ServiceDecorator> result = newList();
+
+        Object moduleBuilder = null;
+        ServiceResources resources = null;
+        String moduleId = null;
+
+        for (DecoratorDef dd : ordered)
+        {
+            String decoratorModuleId = IdUtils.extractModule(dd.getDecoratorId());
+
+            // Whenever the module id containing the decorator changes,
+            // "refresh" the resources, etc., to point to the (new) module.
+            // This means that the ServiceResources will identify services within
+            // the decorators module (important in terms of service visibility
+            // and abbreviated service ids).
+
+            if (!moduleId.equals(decoratorModuleId))
+            {
+                Module module = _modules.get(moduleId);
+                moduleBuilder = module.getModuleBuilder();
+                resources = new ServiceResourcesImpl(this, module, serviceDef, log);
+                moduleId = decoratorModuleId;
+            }
+
+            ServiceDecorator decorator = dd.createDecorator(moduleBuilder, resources);
+
+            result.add(decorator);
+        }
+
+        return result;
+    }
+
+    private void addDecoratorDefsToOrderer(Orderer<DecoratorDef> orderer, ServiceDef serviceDef)
+    {
+        if (serviceDef.isPrivate())
+        {
+            Set<DecoratorDef> privateDecorators = findDecoratorsDefsForPrivateService(serviceDef);
+            addToOrderer(orderer, privateDecorators);
+        }
+        else
+        {
+            for (Module m : _modules.values())
+            {
+                Set<DecoratorDef> moduleDecorators = m.findMatchingDecoratorDefs(serviceDef);
+                addToOrderer(orderer, moduleDecorators);
+            }
+        }
+    }
+
+    private void addToOrderer(Orderer<DecoratorDef> orderer, Set<DecoratorDef> decorators)
+    {
+        for (DecoratorDef df : decorators)
+        {
+            orderer.add(df.getDecoratorId(), df.getAfter(), df.getBefore(), df);
+        }
+    }
+
+    private Set<DecoratorDef> findDecoratorsDefsForPrivateService(ServiceDef serviceDef)
+    {
+        String moduleId = IdUtils.extractModule(serviceDef.getServiceId());
+        Module module = _modules.get(moduleId);
+
+        return module.findMatchingDecoratorDefs(serviceDef);
     }
 
     public Log getLog(Class clazz)

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/util/Orderer.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/util/Orderer.java?rev=424338&r1=424337&r2=424338&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/util/Orderer.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/util/Orderer.java Fri Jul 21 07:43:25 2006
@@ -22,15 +22,17 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.hivemind.util.StringUtils;
+import org.apache.tapestry.internal.annotations.OneShot;
 import org.apache.tapestry.internal.annotations.SuppressNullCheck;
 import org.apache.tapestry.ioc.Orderable;
 
 /**
- * Used to order objects into an "execution" order. Each object must have a name. It may specify a
- * list of pre-requisites and a list of post-requisites.
- * 
- * @author Howard Lewis Ship
+ * Used to order objects into an "execution" order. Each object must have a unique id. It may
+ * specify a list of pre-requisites (objects that must preceded it in the ordered list, i.e.,
+ * "after") and a list of post-requisites (objects which must follow it in the ordered list, i.e.,
+ * "before").
  */
+@OneShot
 public class Orderer<T>
 {
     private final Log _log;
@@ -77,10 +79,9 @@
         add(new Orderable(id, prereqs, postreqs, target));
     }
 
+    @OneShot.Lockdown
     public List<T> getOrdered()
     {
-        // TODO: Prevent method from being invoked twice!
-
         initializeGraph();
 
         List<T> result = newList();

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml?rev=424338&r1=424337&r2=424338&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml Fri Jul 21 07:43:25 2006
@@ -18,19 +18,20 @@
 <suite name="Tapestry 5">
   <test verbose="2" name="General" annotations="1.5">
     <packages>
+      <package name="org.apache.tapestry.internal.aspects"/>
       <package name="org.apache.tapestry.internal.ioc"/>
       <package name="org.apache.tapestry.internal.ioc.services"/>
-      <package name="org.apache.tapestry.transform"/>
-      <package name="org.apache.tapestry.internal.transform"/>
+      <package name="org.apache.tapestry.internal.pageload"/>
+      <package name="org.apache.tapestry.internal.parser"/>
+      <package name="org.apache.tapestry.internal.services"/>      
+      <package name="org.apache.tapestry.internal.transform"/>      
+      <package name="org.apache.tapestry.internal.transform.pages"/>      
       <package name="org.apache.tapestry.internal.transform.worker"/>
-      <package name="org.apache.tapestry.internal.aspects"/>
       <package name="org.apache.tapestry.internal.util"/>
-      <package name="org.apache.tapestry.internal.parser"/>
-      <package name="org.apache.tapestry.internal.pageload"/>
-      <package name="org.apache.tapestry.internal.test"/>      
-      <package name="org.apache.tapestry.util"/>
       <package name="org.apache.tapestry.ioc"/>      
       <package name="org.apache.tapestry.ioc.services"/>        
+      <package name="org.apache.tapestry.transform"/>
+      <package name="org.apache.tapestry.util"/>
     </packages>
   </test>
 </suite>

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ModuleImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ModuleImplTest.java?rev=424338&r1=424337&r2=424338&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ModuleImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ModuleImplTest.java Fri Jul 21 07:43:25 2006
@@ -17,14 +17,19 @@
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
+import java.util.Set;
 
 import org.apache.commons.logging.Log;
 import org.apache.tapestry.internal.ioc.services.ClassFactoryImpl;
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
 import org.apache.tapestry.ioc.Registry;
 import org.apache.tapestry.ioc.RegistryBuilder;
+import org.apache.tapestry.ioc.def.DecoratorDef;
 import org.apache.tapestry.ioc.def.ModuleDef;
+import org.apache.tapestry.ioc.def.ServiceDef;
 import org.apache.tapestry.ioc.services.ClassFactory;
 import org.testng.annotations.Test;
 
@@ -32,7 +37,6 @@
  * @author Howard M. Lewis Ship
  */
 public class ModuleImplTest extends InternalBaseTestCase
-
 {
     @Test
     public void get_service_by_id_exists()
@@ -160,6 +164,54 @@
         assertTrue(ids.contains("ioc.test.Upcase"));
 
         verify();
+    }
+
+    @Test
+    public void find_decorator_defs_for_service()
+    {
+        InternalRegistry registry = newMock(InternalRegistry.class);
+        ServiceDef serviceDef = newServiceDef();
+        DecoratorDef def1 = newDecoratorDef();
+        DecoratorDef def2 = newDecoratorDef();
+        Set<DecoratorDef> rawDefs = newMock(Set.class);
+
+        ModuleDef moduleDef = newModuleDef();
+
+        moduleDef.getDecoratorDefs();
+        setReturnValue(rawDefs);
+
+        rawDefs.iterator();
+        setReturnValue(Arrays.asList(def1, def2).iterator());
+
+        trainMatches(def1, serviceDef, false);
+        trainMatches(def2, serviceDef, true);
+
+        replay();
+
+        Module module = new ModuleImpl(registry, moduleDef);
+
+        Set<DecoratorDef> defs = module.findMatchingDecoratorDefs(serviceDef);
+
+        assertEquals(defs.size(), 1);
+        assertTrue(defs.contains(def2));
+
+        verify();
+    }
+
+    protected ModuleDef newModuleDef()
+    {
+        return newMock(ModuleDef.class);
+    }
+
+    protected void trainMatches(DecoratorDef decoratorDef, ServiceDef serviceDef, boolean matches)
+    {
+        decoratorDef.matches(serviceDef);
+        setReturnValue(matches);
+    }
+
+    protected final DecoratorDef newDecoratorDef()
+    {
+        return newMock(DecoratorDef.class);
     }
 
     private Registry buildRegistry()