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

svn commit: r424016 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/internal/ioc/ main/java/org/apache/tapestry/ioc/ main/java/org/apache/tapestry/test/ main/resources/org/apache/tapestry/internal/ioc/ site/apt/ioc/ test...

Author: hlship
Date: Thu Jul 20 11:36:23 2006
New Revision: 424016

URL: http://svn.apache.org/viewvc?rev=424016&view=rev
Log:
Move IdUtils from HiveMind to Tapestry 5 and refactor.
Extract ServiceLocator interface from shared methods of Registry and ServiceResources.
Add debug logging output when invoking a service builder method.
Rename BasicServiceCreator to ServiceBuilderMethodInvoker.

Added:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceBuilderMethodInvoker.java
      - copied, changed from r423932, tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/BasicServiceCreator.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdUtils.java   (contents, props changed)
      - copied, changed from r386879, jakarta/hivemind/trunk/framework/src/java/org/apache/hivemind/util/IdUtils.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/ServiceLocator.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ServiceBuilderMethodInvokerTest.java
      - copied, changed from r423932, tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/BasicServiceCreatorTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/TestIdUtils.java   (contents, props changed)
      - copied, changed from r386879, jakarta/hivemind/trunk/framework/src/test/org/apache/hivemind/util/TestIdUtils.java
Removed:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/BasicServiceCreator.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/BasicServiceCreatorTest.java
Modified:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/DefaultModuleDefImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCMessages.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/ioc/ServiceDefImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceResourcesImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/Registry.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/ServiceResources.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TestBase.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/ioc/IOCStrings.properties
    tapestry/tapestry5/tapestry-core/trunk/src/site/apt/ioc/index.apt
    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
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/RegistryBuilderTest.java

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/DefaultModuleDefImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/DefaultModuleDefImpl.java?rev=424016&r1=424015&r2=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/DefaultModuleDefImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/DefaultModuleDefImpl.java Thu Jul 20 11:36:23 2006
@@ -29,8 +29,8 @@
 import java.util.Set;
 
 import org.apache.commons.logging.Log;
-import org.apache.hivemind.util.IdUtils;
 import org.apache.tapestry.ioc.IOCConstants;
+import org.apache.tapestry.ioc.IdUtils;
 import org.apache.tapestry.ioc.annotations.After;
 import org.apache.tapestry.ioc.annotations.Before;
 import org.apache.tapestry.ioc.annotations.Id;

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCMessages.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCMessages.java?rev=424016&r1=424015&r2=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCMessages.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCMessages.java Thu Jul 20 11:36:23 2006
@@ -22,6 +22,7 @@
 import org.apache.hivemind.Messages;
 import org.apache.hivemind.impl.MessageFormatter;
 import org.apache.tapestry.internal.annotations.Utility;
+import org.apache.tapestry.ioc.IOCUtilities;
 
 /**
  * @author Howard M. Lewis Ship
@@ -148,5 +149,15 @@
     {
         return MESSAGES.format("decorator-returned-wrong-type", new Object[]
         { asString(method), serviceId, returned, serviceInterface.getName() });
+    }
+
+    static Object creatingService(String serviceId)
+    {
+        return MESSAGES.format("creating-service", serviceId);
+    }
+
+    static Object invokingMethod(Method method)
+    {
+        return MESSAGES.format("invoking-method", asString(method));
     }
 }

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=424016&r1=424015&r2=424016&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 Thu Jul 20 11:36:23 2006
@@ -24,6 +24,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.logging.Log;
 import org.apache.hivemind.service.BodyBuilder;
 import org.apache.tapestry.internal.annotations.SuppressNullCheck;
 import org.apache.tapestry.ioc.IOCConstants;
@@ -162,13 +163,20 @@
     {
         ensureModuleBuilderExists();
 
+        String serviceId = def.getServiceId();
+
+        Log log = _registry.getLog(serviceId);
+
+        if (log.isDebugEnabled())
+            log.debug(IOCMessages.creatingService(serviceId));
+
         // TODO: Check for recursive service build? This could happen if the
         // builder method for the service (or a decorator method applied to the service)
         // takes the service as a parameter.
 
         ServiceLifecycle lifecycle = _registry.getServiceLifecycle(def.getServiceLifeycle());
 
-        ServiceResources resources = new ServiceResourcesImpl(_registry, this, def);
+        ServiceResources resources = new ServiceResourcesImpl(_registry, this, def, log);
 
         // Build up a stack of operations that will be needed to instantiate the service
         // (by the proxy, at a later date).
@@ -180,7 +188,7 @@
         // Built in services are not decorated, ever.
 
         if (!_moduleDef.getModuleId().equals(INTERNAL_MODULE_ID))
-            creator = new InterceptorStackBuilder(this, def.getServiceId(), creator);
+            creator = new InterceptorStackBuilder(this, serviceId, creator);
 
         // TODO: Add a creator that checks to prevent recursive construction of the service.
         // What would be a scenario where this could occur? I guess builder method for A
@@ -192,7 +200,7 @@
         Object service = lifecycle.getCreateProxy() ? createProxy(resources, creator) : creator
                 .createService();
 
-        _services.put(def.getServiceId(), service);
+        _services.put(serviceId, service);
 
         return service;
     }

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=424016&r1=424015&r2=424016&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 Thu Jul 20 11:36:23 2006
@@ -23,8 +23,8 @@
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
-import org.apache.hivemind.util.IdUtils;
 import org.apache.tapestry.internal.annotations.SuppressNullCheck;
+import org.apache.tapestry.ioc.IdUtils;
 import org.apache.tapestry.ioc.LogSource;
 import org.apache.tapestry.ioc.Registry;
 import org.apache.tapestry.ioc.ServiceDecorator;

Copied: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceBuilderMethodInvoker.java (from r423932, tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/BasicServiceCreator.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceBuilderMethodInvoker.java?p2=tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceBuilderMethodInvoker.java&p1=tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/BasicServiceCreator.java&r1=423932&r2=424016&rev=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/BasicServiceCreator.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceBuilderMethodInvoker.java Thu Jul 20 11:36:23 2006
@@ -31,7 +31,7 @@
  * 
  * @author Howard M. Lewis Ship
  */
-public class BasicServiceCreator implements ServiceCreator
+public class ServiceBuilderMethodInvoker implements ServiceCreator
 {
     private final Object _moduleBuilder;
 
@@ -43,16 +43,20 @@
 
     private final Method _builderMethod;
 
-    public BasicServiceCreator(Method method, Object moduleBuilder, ServiceResources resources)
+    private final Log _log;
+
+    public ServiceBuilderMethodInvoker(Method method, Object moduleBuilder,
+            ServiceResources resources)
     {
         _serviceId = resources.getServiceId();
         _builderMethod = method;
         _moduleBuilder = moduleBuilder;
         _resources = resources;
+        _log = resources.getServiceLog();
 
         _parameterDefaults.put(String.class, _serviceId);
         _parameterDefaults.put(ServiceResources.class, resources);
-        _parameterDefaults.put(Log.class, resources.getServiceLog());
+        _parameterDefaults.put(Log.class, _log);
         _parameterDefaults.put(Class.class, resources.getServiceInterface());
     }
 
@@ -65,6 +69,9 @@
                 _builderMethod,
                 _resources,
                 _parameterDefaults);
+
+        if (_log.isDebugEnabled())
+            _log.debug(IOCMessages.invokingMethod(_builderMethod));
 
         Object result = null;
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceDefImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceDefImpl.java?rev=424016&r1=424015&r2=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceDefImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceDefImpl.java Thu Jul 20 11:36:23 2006
@@ -55,7 +55,7 @@
 
     public ServiceCreator createServiceCreator(Object moduleBuilder, ServiceResources resources)
     {
-        return new BasicServiceCreator(_builderMethod, moduleBuilder, resources);
+        return new ServiceBuilderMethodInvoker(_builderMethod, moduleBuilder, resources);
     }
 
     public String getServiceId()

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceResourcesImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceResourcesImpl.java?rev=424016&r1=424015&r2=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceResourcesImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ServiceResourcesImpl.java Thu Jul 20 11:36:23 2006
@@ -33,12 +33,12 @@
 
     private Log _log;
 
-    public ServiceResourcesImpl(InternalRegistry registry, Module module, ServiceDef serviceDef)
+    public ServiceResourcesImpl(InternalRegistry registry, Module module, ServiceDef serviceDef, Log log)
     {
         _registry = registry;
         _module = module;
         _serviceDef = serviceDef;
-        _log = registry.getLog(serviceDef.getServiceId());
+        _log = log;
     }
 
     public String getServiceId()

Copied: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdUtils.java (from r386879, jakarta/hivemind/trunk/framework/src/java/org/apache/hivemind/util/IdUtils.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdUtils.java?p2=tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdUtils.java&p1=jakarta/hivemind/trunk/framework/src/java/org/apache/hivemind/util/IdUtils.java&r1=386879&r2=424016&rev=424016&view=diff
==============================================================================
--- jakarta/hivemind/trunk/framework/src/java/org/apache/hivemind/util/IdUtils.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdUtils.java Thu Jul 20 11:36:23 2006
@@ -12,16 +12,18 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.hivemind.util;
+package org.apache.tapestry.ioc;
 
-import org.apache.hivemind.HiveMind;
+import org.apache.tapestry.internal.annotations.SuppressNullCheck;
+import org.apache.tapestry.internal.annotations.Utility;
 
 /**
  * A collection of utilities for handling qualified and unqualified ids.
  * 
  * @author Howard Lewis Ship
  */
-public class IdUtils
+@Utility
+public final class IdUtils
 {
 
     /**
@@ -40,17 +42,25 @@
      * Qualifies a list of interceptor service ids provided for an interceptor contribution. The
      * special value "*" is not qualified.
      */
+    @SuppressNullCheck
     public static String qualifyList(String sourceModuleId, String list)
     {
-        if (HiveMind.isBlank(list) || list.equals("*"))
+        if (list == null || list.equals("") || list.equals("*"))
             return list;
 
-        String[] items = StringUtils.split(list);
+        String[] items = list.split("\\s*,\\s*");
+
+        StringBuffer buffer = new StringBuffer();
 
         for (int i = 0; i < items.length; i++)
-            items[i] = qualify(sourceModuleId, items[i]);
+        {
+            if (i > 0)
+                buffer.append(",");
+
+            buffer.append(qualify(sourceModuleId, items[i]));
+        }
 
-        return StringUtils.join(items, ',');
+        return buffer.toString();
     }
 
     /**

Propchange: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdUtils.java
------------------------------------------------------------------------------
    cvs2svn:cvs-rev = 1.3

Propchange: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdUtils.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/Registry.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/Registry.java?rev=424016&r1=424015&r2=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/Registry.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/Registry.java Thu Jul 20 11:36:23 2006
@@ -19,36 +19,6 @@
  * 
  * @author Howard M. Lewis Ship
  */
-public interface Registry
+public interface Registry extends ServiceLocator
 {
-    /**
-     * Obtains a service via its fully qualified service id. Returns the service's proxy. The
-     * service proxy implements the same interface as the actual service, and is used to instantiate
-     * the actual service only as needed.
-     * 
-     * @param <T>
-     * @param serviceId
-     *            fully qualified service id, used to locate the service object
-     * @param serviceInterface
-     *            the interface implemented by the service (or an interface extended by the service
-     *            interface)
-     * @return the service instance
-     * @throws RuntimeException
-     *             if the service is not defined, or if an error occurs instantitating it
-     */
-    <T> T getService(String serviceId, Class<T> serviceInterface);
-
-    /**
-     * Locates a service given just a service interface. A single service must implement the service
-     * interface (which can be hard to guarantee).
-     * 
-     * @param <T>
-     * @param serviceInterface
-     *            the interface the service implements
-     * @return the service's proxy
-     * @throws RuntimeException
-     *             if the service does not exist (this is considered programmer error), or multiple
-     *             services implement the service interface
-     */
-    <T> T getService(Class<T> serviceInterface);
 }

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/ServiceLocator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/ServiceLocator.java?rev=424016&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/ServiceLocator.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/ServiceLocator.java Thu Jul 20 11:36:23 2006
@@ -0,0 +1,59 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.ioc;
+
+/**
+ * Defines an object which can provide access to services defined within a
+ * {@link org.apache.hivemind.Registry}. Services are accessed via service id, or (when
+ * appropriate) by just service interface. The Registry itself implements this interface, as does
+ * {@link org.apache.tapestry.ioc.ServiceResources}.
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public interface ServiceLocator
+{
+
+    /**
+     * Obtains a service via its fully qualified service id. Returns the service's proxy. The
+     * service proxy implements the same interface as the actual service, and is used to instantiate
+     * the actual service only as needed.
+     * 
+     * @param <T>
+     * @param serviceId
+     *            fully qualified service id, used to locate the service object
+     * @param serviceInterface
+     *            the interface implemented by the service (or an interface extended by the service
+     *            interface)
+     * @return the service instance
+     * @throws RuntimeException
+     *             if the service is not defined, or if an error occurs instantitating it
+     */
+    <T> T getService(String serviceId, Class<T> serviceInterface);
+
+    /**
+     * Locates a service given just a service interface. A single service must implement the service
+     * interface (which can be hard to guarantee).
+     * 
+     * @param <T>
+     * @param serviceInterface
+     *            the interface the service implements
+     * @return the service's proxy
+     * @throws RuntimeException
+     *             if the service does not exist (this is considered programmer error), or multiple
+     *             services implement the service interface
+     */
+    <T> T getService(Class<T> serviceInterface);
+
+}
\ No newline at end of file

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/ServiceResources.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/ServiceResources.java?rev=424016&r1=424015&r2=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/ServiceResources.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/ServiceResources.java Thu Jul 20 11:36:23 2006
@@ -18,11 +18,17 @@
 
 /**
  * Contains resources that may be provided to a service when it initializes, which includes other
- * services visible to the service.
+ * services visible to the service. ServiceResources provides access to other services (it extends
+ * {@link org.apache.tapestry.ioc.ServiceLocator}), however service ids (when used with
+ * {@link org.apache.tapestry.ioc.ServiceLocator#getService(String, Class)}) may be unqualified (to
+ * access another service within the same containing module). Futher,
+ * {@link org.apache.tapestry.ioc.ServiceLocator#getService(Class)} will take into account private
+ * services visible only within the module, as well as public services from both the containing
+ * module and from other modules.
  * 
  * @author Howard M. Lewis Ship
  */
-public interface ServiceResources
+public interface ServiceResources extends ServiceLocator
 {
     /** Returns the fully qualified id of the service. */
     String getServiceId();
@@ -31,45 +37,10 @@
     Class getServiceInterface();
 
     /**
-     * Locates a service given a service id and the corresponding service interface type. The
-     * service id may be simple (just an id), in which case it is evaluated as a reference to
-     * another service within the same module. Alternately, it can be a fully qualified id, in which
-     * case the service may be provided by any module.
-     * 
-     * @param <T>
-     * @param serviceId
-     *            the simple or fully qualified service id
-     * @param serviceInterface
-     *            the interface the service implements
-     * @return the service instance (or proxy)
-     * @throws RuntimeException
-     *             if the service does not exist (this is considered programmer error), or if there
-     *             is an error instantiating the service
+     * Returns a Log object appropriate for logging messages. This includes debug level messages
+     * about the creation and configuration of the underlying service, as well as debug, warning, or
+     * error level messages from the service itself. Often service interceptors will make use of the
+     * service's log.
      */
-    <T> T getService(String serviceId, Class<T> serviceInterface);
-
-    /**
-     * Locates a service by its service interface. This will work only if there's exactly one
-     * service in the entire registry that implements the service interface. If there's zero, or
-     * more than one, this is an error. However, service visibility should be taken into account as
-     * well. Generally, this should only be used at the top level, the application level. If a
-     * framework depends on this functionality to operate, it work out that it does not in some
-     * cases, depending on all sort of runtime configuration.
-     * 
-     * @param <T>
-     * @param serviceInterface
-     *            the interface the service must implement
-     * @return the lone service found
-     * @throws RuntimeException
-     *             if no such service can be found, or there is an error instantiating the service
-     */
-    <T> T getService(Class<T> serviceInterface);
-
-    /**
-     * Returns a Log object appropriate for logging messages. Use of {@link #getErrorLog()} is
-     * better, but that's only for error situations, not ordinary logging (for debug of
-     * informational purposes).
-     */
-
     Log getServiceLog();
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TestBase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TestBase.java?rev=424016&r1=424015&r2=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TestBase.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TestBase.java Thu Jul 20 11:36:23 2006
@@ -115,4 +115,10 @@
     {
         return newMock(Log.class);
     }
+
+    protected final void trainIsDebugEnabled(Log log, boolean debugEnabled)
+    {
+        log.isDebugEnabled();
+        setReturnValue(debugEnabled);
+    }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/ioc/IOCStrings.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/ioc/IOCStrings.properties?rev=424016&r1=424015&r2=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/ioc/IOCStrings.properties (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/ioc/IOCStrings.properties Thu Jul 20 11:36:23 2006
@@ -39,4 +39,5 @@
  Method {0} does not include such a parameter, and has been ignored.
 decorator-returned-wrong-type=Decorator method {0} (invoked for service ''{1}'') returned {2}, \
   which is not assignable to the {3} service interface.
-  
\ No newline at end of file
+creating-service=Creating service ''{0}''.
+invoking-method=Invoking method {0}.
\ No newline at end of file

Modified: tapestry/tapestry5/tapestry-core/trunk/src/site/apt/ioc/index.apt
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/ioc/index.apt?rev=424016&r1=424015&r2=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/apt/ioc/index.apt (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/apt/ioc/index.apt Thu Jul 20 11:36:23 2006
@@ -18,8 +18,8 @@
   specifically for use as the IoC container for Tapestry 4.  Tapestry 4 has met its goals for extensibility and configurability, largely
   because of HiveMind's flexibility.
   
-  Tapestry 5 extends on this, replacing HiveMind with a new container built into the framework,
-  designed for greater ease of use and expressiveness.
+  Tapestry 5 extends on this, replacing HiveMind with a new container directly built into the framework,
+  designed for greater ease of use, expressiveness and performance.
   
 * Why Not Spring?
 
@@ -30,7 +30,18 @@
   * Spring does not have the concept of a <namespace>.  The names of beans are simple and unqualified, which could lead to naming conflicts.
   
   * Spring beans can be wired together by name (or id), but it is not possible to introduce additional naming abstractions. Tapestry 4's 
-    "infrastructure:" abstraction was the key to allowing easy spot overrides of internal Tapestry services.
+    "infrastructure:" abstraction was the key to allowing easy spot overrides of internal Tapestry services without having to
+    duplicate the large web of interrelated services (nearly 200 in Tapestry 4.0).
+    
+  * Spring doesn't have a concept of <visibility>, whereby some service implementations are internal to a module (Spring doesn't
+    have modules), which makes it easier to create service facades.
+    
+  * Although Spring allows beans to be intercepted, it does so in the form of a new bean, leaving the un-intercepted bean visible
+    (and subject to misuse).  HiveMind and Tapestry IoC "wrap" the service inside interceptors, preventing unintercepted access
+    to the core service implementation.
+  
+  * Spring's XML configuration files are quite verbose, often more so than equivalent HiveMind XML files. This has improved with
+    Spring 2.0.
     
   * Spring has a simple map/list/value configuration scheme, but it is not distributed; it is part of a single bean definition. 
     HiveMind and Tapestry 5 IoC allow service configuration to be assembled from multiple modules. This is very important
@@ -39,7 +50,8 @@
 * Why Not HiveMind?
 
   The difficulty of managing the release schedules of two complex frameworks has proven to be an issue. HiveMind's 2.0 release will
-  incorporate similar ideas to Tapestry 5 IoC, but will also maintain legacy support for the existing XML-driven approach.
+  incorporate ideas similar to those present in Tapestry 5 IoC, 
+  but will also maintain legacy support for the existing XML-driven approach.
   
   The use of HiveMind is also related to one of the common criticisms of Tapestry 4: startup time. The time it takes to parse and
   organize all that XML shows up as several seconds of startup time. It is <hoped> that creating a streamlined IoC container that is not
@@ -54,31 +66,57 @@
   dependencies into the instantiated instances).  The central concept in Tapestry IoC is to eliminate XML and build an equivalent
   system around simple objects and methods.
   
+  Tapestry IoC also represents many simplifications of HiveMind, representing lessons learned while creating both
+  HiveMind and Tapestry 4.
+  
 Goals
 
   As with Tapestry 5 in general, the goal of Tapestry IoC is greater simplicity, greater power, and an avoidance of XML.
   
-  The Java language is the easiest and most succinct way to describe object creation and method invocation. Any approximation in
-  XML is ultimately more verbose and unwieldy.  As the {{{service.html#injection}}} show, a small amount of Java code is simpler
+  Existing IoC containers such as HiveMind and Spring contain large amounts of XML configuration that exists to
+  describe how and when to instantiate a particular JavaBean, and how to provide that bean with its dependencies (either
+  by constructor injection, or by property injection).  Other XML is used to hook objects into some form of lifecycle ... 
+  typically callback methods invoked when the object is instantiated and configured, or when it is being discarded.
+
+  The core concept of Tapestry IoC is that
+  the Java language itself 
+  is the easiest and most succinct way to describe object creation and method invocation. Any approximation in
+  XML is ultimately more verbose and unwieldy.  As the {{{service.html#injection} examples}} show, a small amount of Java code and a
+  handful of naming conventions and annotations is far simpler
   and easier than a big chunk of XML.
 
-  In addition, moving from XML to Java code makes things easier to test; you can unit test the 
+  In addition, moving from XML to Java code encourages testing; you can unit test the 
   service builder methods of your
   module builder class, but you can't realistically unit test an XML descriptor.
   
-  Modules should be easily packaged into JAR files and should be zero-configuration (just drop the JAR onto the classpath).
+  Tapestry IOC modules are easily packaged into JAR files, supporting 
+  zero-configuration usage: ust drop the JAR onto the classpath.
   
   Another goal is "developer friendliness". This is a true cross-cutting concern, and one not likely to be packaged
   into an aspect any time soon. The Tapestry IoC framework is designed to be easy to use and easy to understand.
   Further, when things go wrong, it actively attempts to help you by careful checks and careful error messages. Further,
-  all user-visible objects implements {{{http://howardlewisship.com/blog/2003/08/importance-of-tostring.html}a reasonable toString() method}},
+  all user-visible objects implement
+  {{{http://howardlewisship.com/blog/2003/08/importance-of-tostring.html}a reasonable toString() method}},
   to help you understand what's going when you inevitably try to figure things out in the debugger. 
   
   In terms of building services using Tapestry IoC ... the objective here is "lightness", a term borrowed from the board
-  game {{{http://boardgamegeek.com/game/188}Go}}.  In Go, groups of playing stones are "light" (or have "good shape")
+  game {{{http://boardgamegeek.com/game/188}Go}}. In Go, two players place stones on an initially empty board, 
+  creating walls to enclose territory or eliminate the encroaching stones player by the opponent. The winner at the
+  end of the game controls the most territory, and it is the constant tension between taking territory and defending
+  existing territory that drives the game.   In Go, groups of playing stones are "light" (or have "good shape")
   when the minimum number of them control the maximum area on the board.  Playing "heavy" just gives your opponent a free
   chance to take control of another section of the board.
   
+   In software development, we are also attempting to create complex systems
+  from simple pieces, but our tension is derived from the need to add functionality balanced against the need
+  to test and maintain existing code.  Too often in the world of software development, the need to add functionality
+  trumps all, and testing and maintenance is deferred ... until too late.
+  
+  IoC containers is general, and Tapestry IoC very specifically, exist to address this issue, to provide the foundations
+  for balancing the need to quickly add functionality against the need to test new functionality and maintain
+  existing functionality.  IoC containers provide the means to break large, complex, monolithic blocks into light, small, testable
+  pieces.   
+  
   When building a registry of services, lightness refers to the proper division of responsibility, the seperation of
   concerns, and the limiting of dependencies between different parts of the system. This style is often
   called {{{http://www.ccs.neu.edu/research/demeter/demeter-method/LawOfDemeter/general-formulation.html}Law of Demeter}}.
@@ -137,7 +175,7 @@
   <<interceptor>> objects that wrap around core service implementations, adding behavior such
   as logging, security access, or transaction management.  Interceptors implement the same
   service interface as the service.
-  Control is given over the order in which interceptors are applied to a service.
+  Control is given over the order in which decorators are applied to a service.
   
   A service may have a <<configuration>>. The configuration is either a map, a collection, or an ordered list. The configuration is contructed
   from <<contributions>> provided by one or more modules. 

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=424016&r1=424015&r2=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml Thu Jul 20 11:36:23 2006
@@ -27,6 +27,7 @@
       <package name="org.apache.tapestry.internal.parser"/>
       <package name="org.apache.tapestry.internal.pageload"/>
       <package name="org.apache.tapestry.util"/>
+      <package name="org.apache.tapestry.ioc"/>      
     </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=424016&r1=424015&r2=424016&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 Thu Jul 20 11:36:23 2006
@@ -44,10 +44,13 @@
 
         Module module = new ModuleImpl(registry, moduleDef);
 
-        trainGetLifecycle(registry, "singleton", new SingletonServiceLifecycle());
-
         trainGetLog(registry, "ioc.test.Upcase", log);
 
+        trainIsDebugEnabled(log, true);
+        log.debug("Creating service 'ioc.test.Upcase'.");
+
+        trainGetLifecycle(registry, "singleton", new SingletonServiceLifecycle());
+
         trainGetService(
                 registry,
                 "tapestry.ioc.ClassFactory",
@@ -55,6 +58,8 @@
                 module,
                 new ClassFactoryImpl());
 
+        trainIsDebugEnabled(log, false);
+
         trainFindDecoratorsForService(registry);
 
         replay();
@@ -76,16 +81,20 @@
 
         Module module = new ModuleImpl(registry, moduleDef);
 
-        trainGetLifecycle(registry, "singleton", new SingletonServiceLifecycle());
-
         trainGetLog(registry, "ioc.test.PrivateUpcase", log);
 
+        trainIsDebugEnabled(log, false);
+
+        trainGetLifecycle(registry, "singleton", new SingletonServiceLifecycle());
+
         trainGetService(
                 registry,
                 "tapestry.ioc.ClassFactory",
                 ClassFactory.class,
                 module,
                 new ClassFactoryImpl());
+
+        trainIsDebugEnabled(log, false);
 
         trainFindDecoratorsForService(registry);
 

Copied: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ServiceBuilderMethodInvokerTest.java (from r423932, tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/BasicServiceCreatorTest.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ServiceBuilderMethodInvokerTest.java?p2=tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ServiceBuilderMethodInvokerTest.java&p1=tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/BasicServiceCreatorTest.java&r1=423932&r2=424016&rev=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/BasicServiceCreatorTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ServiceBuilderMethodInvokerTest.java Thu Jul 20 11:36:23 2006
@@ -21,7 +21,6 @@
 import java.lang.reflect.Method;
 
 import org.apache.commons.logging.Log;
-import org.apache.hivemind.ErrorLog;
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
 import org.apache.tapestry.ioc.ServiceCreator;
 import org.apache.tapestry.ioc.ServiceResources;
@@ -32,7 +31,7 @@
 /**
  * @author Howard M. Lewis Ship
  */
-public class BasicServiceCreatorTest extends InternalBaseTestCase
+public class ServiceBuilderMethodInvokerTest extends InternalBaseTestCase
 {
     private static final String SERVICE_ID = "ioc.Fie";
 
@@ -74,9 +73,12 @@
 
         trainForConstructor(resources, log);
 
+        trainIsDebugEnabled(log, false);
+
         replay();
 
-        ServiceCreator sc = new BasicServiceCreator(findMethod("build_noargs"), this, resources);
+        ServiceCreator sc = new ServiceBuilderMethodInvoker(findMethod("build_noargs"), this,
+                resources);
 
         Object actual = sc.createService();
 
@@ -97,7 +99,9 @@
     @Test
     public void method_with_args()
     {
+        Method method = findMethod("build_args");
         ServiceResources resources = newServiceResources();
+
         Log log = newLog();
 
         _expectedServiceId = SERVICE_ID;
@@ -109,9 +113,13 @@
 
         trainForConstructor(resources, log);
 
+        trainIsDebugEnabled(log, true);
+
+        log.debug(IOCMessages.invokingMethod(method));
+
         replay();
 
-        ServiceCreator sc = new BasicServiceCreator(findMethod("build_args"), this, resources);
+        ServiceCreator sc = new ServiceBuilderMethodInvoker(method, this, resources);
 
         Object actual = sc.createService();
 
@@ -133,9 +141,12 @@
 
         trainGetService(resources, "Foe", FoeService.class, _expectedFoe);
 
+        trainIsDebugEnabled(log, false);
+
         replay();
 
-        ServiceCreator sc = new BasicServiceCreator(findMethod("build_injected"), this, resources);
+        ServiceCreator sc = new ServiceBuilderMethodInvoker(findMethod("build_injected"), this,
+                resources);
 
         Object actual = sc.createService();
 
@@ -159,9 +170,12 @@
 
         trainForConstructor(resources, log);
 
+        trainIsDebugEnabled(log, false);
+
         replay();
 
-        ServiceCreator sc = new BasicServiceCreator(findMethod("build_noargs"), this, resources);
+        ServiceCreator sc = new ServiceBuilderMethodInvoker(findMethod("build_noargs"), this,
+                resources);
 
         try
         {
@@ -170,9 +184,8 @@
         }
         catch (RuntimeException ex)
         {
-            Assert.assertEquals(ex.getMessage(), "Builder method "
-                    + "org.apache.tapestry.internal.ioc.BasicServiceCreatorTest.build_noargs() "
-                    + "(for service 'ioc.Fie') returned null.");
+            Assert.assertEquals(ex.getMessage(), "Builder method " + getClass().getName()
+                    + ".build_noargs() " + "(for service 'ioc.Fie') returned null.");
         }
 
         verify();
@@ -188,9 +201,12 @@
 
         trainForConstructor(resources, log);
 
+        trainIsDebugEnabled(log, false);
+
         replay();
 
-        ServiceCreator sc = new BasicServiceCreator(findMethod("build_fail"), this, resources);
+        ServiceCreator sc = new ServiceBuilderMethodInvoker(findMethod("build_fail"), this,
+                resources);
 
         try
         {
@@ -200,7 +216,7 @@
         catch (RuntimeException ex)
         {
             assertEquals(ex.getMessage(), "Error invoking service builder method "
-                    + "org.apache.tapestry.internal.ioc.BasicServiceCreatorTest.build_fail() "
+                    + getClass().getName() + ".build_fail() "
                     + "(for service 'ioc.Fie'): java.lang.reflect.InvocationTargetException");
 
             InvocationTargetException inner1 = (InvocationTargetException) ex.getCause();
@@ -215,6 +231,8 @@
     @Test
     public void auto_dependency()
     {
+        Method method = findMethod("build_auto");
+
         ServiceResources resources = newServiceResources();
         Log log = newLog();
 
@@ -223,13 +241,13 @@
 
         trainForConstructor(resources, log);
 
-        Method method = findMethod("build_auto");
-
         trainGetService(resources, FoeService.class, _expectedFoe);
 
+        trainIsDebugEnabled(log, false);
+
         replay();
 
-        ServiceCreator sc = new BasicServiceCreator(method, this, resources);
+        ServiceCreator sc = new ServiceBuilderMethodInvoker(method, this, resources);
 
         Object actual = sc.createService();
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/RegistryBuilderTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/RegistryBuilderTest.java?rev=424016&r1=424015&r2=424016&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/RegistryBuilderTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/RegistryBuilderTest.java Thu Jul 20 11:36:23 2006
@@ -79,6 +79,6 @@
 
         assertEquals(
                 service.toString(),
-                "<Singleton proxy for ioc.test.Square(org.apache.tapestry.ioc.Square)>");
+                "<Proxy for ioc.test.Square(org.apache.tapestry.ioc.Square)>");
     }
 }

Copied: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/TestIdUtils.java (from r386879, jakarta/hivemind/trunk/framework/src/test/org/apache/hivemind/util/TestIdUtils.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/TestIdUtils.java?p2=tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/TestIdUtils.java&p1=jakarta/hivemind/trunk/framework/src/test/org/apache/hivemind/util/TestIdUtils.java&r1=386879&r2=424016&rev=424016&view=diff
==============================================================================
--- jakarta/hivemind/trunk/framework/src/test/org/apache/hivemind/util/TestIdUtils.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/TestIdUtils.java Thu Jul 20 11:36:23 2006
@@ -12,41 +12,52 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.hivemind.util;
+package org.apache.tapestry.ioc;
 
-import org.apache.hivemind.test.HiveMindTestCase;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+
+import org.testng.annotations.Test;
 
 /**
- * Tests for {@link org.apache.hivemind.util.IdUtils}.
+ * Tests for {@link org.apache.tapestry.ioc.IdUtils}.
+ * 
+ * @author Howard M. Lewis Ship
  */
-public class TestIdUtils extends HiveMindTestCase
+public class TestIdUtils
 {
-    public void testQualifyId()
+
+    @Test
+    public void qualify_single_simple_id()
     {
-        assertEquals("module.Fred", IdUtils.qualify("module", "Fred"));
+        assertEquals(IdUtils.qualify("module", "Fred"), "module.Fred");
     }
 
-    public void testQualifiedId()
+    @Test
+    public void qualify_single_qualified_id()
     {
-        assertEquals("module.Fred", IdUtils.qualify("zaphod", "module.Fred"));
+        assertEquals(IdUtils.qualify("zaphod", "module.Fred"), "module.Fred");
     }
 
-    public void testQualifyList()
+    @Test
+    public void qualify_id_list()
     {
         assertEquals(
-            "module.Fred,othermodule.Barney,module.Wilma",
-            IdUtils.qualifyList("module", "Fred,othermodule.Barney,module.Wilma"));
+                IdUtils.qualifyList("module", "Fred,othermodule.Barney,module.Wilma"),
+                "module.Fred,othermodule.Barney,module.Wilma");
     }
 
-    public void testQualifyListStar()
+    @Test
+    public void qualify_list_as_star()
     {
-        assertEquals("*", IdUtils.qualifyList("module", "*"));
+        assertEquals(IdUtils.qualifyList("module", "*"), "*");
     }
 
-    public void testQualifyListNull()
+    @Test
+    public void qualify_blank_or_null_list()
     {
         assertNull(IdUtils.qualifyList("module", null));
 
-        assertEquals("", IdUtils.qualifyList("module", ""));
+        assertEquals(IdUtils.qualifyList("module", ""), "");
     }
 }

Propchange: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/TestIdUtils.java
------------------------------------------------------------------------------
    cvs2svn:cvs-rev = 1.3

Propchange: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/TestIdUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/TestIdUtils.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision