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()