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/30 22:07:46 UTC

svn commit: r426929 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/aspect/org/apache/tapestry/internal/aspects/ main/java/org/apache/tapestry/internal/annotations/ main/java/org/apache/tapestry/internal/ioc/ main/java/org/apache/tapestry/intern...

Author: hlship
Date: Sun Jul 30 13:07:44 2006
New Revision: 426929

URL: http://svn.apache.org/viewvc?rev=426929&view=rev
Log:
Rename Synchronized annotation to Concurrent.
Rename Synchronization aspect to Concurrence.
Break out glob pattern matching, and id matching, into their own classes.

Added:
    tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/Concurrence.aj
      - copied, changed from r426823, tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/Synchronization.aj
    tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalConcurrence.aj
      - copied, changed from r426823, tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalSynchronization.aj
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/annotations/Concurrent.java
      - copied, changed from r426823, tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/annotations/Synchronized.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/GlobPatternMatcher.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdMatcher.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdMatcherImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/MatchType.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/OrIdMatcher.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrenceAspectTest.java
      - copied, changed from r426823, tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationAspectTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrentTarget.java
      - copied, changed from r426823, tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationTarget.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrentTargetWrapper.java
      - copied, changed from r426823, tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchTargetWrapper.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/GlobPatternMatcherTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/IdMatcherImplTest.java
Removed:
    tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalSynchronization.aj
    tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/Synchronization.aj
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/annotations/Synchronized.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchTargetWrapper.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationAspectTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationTarget.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/IOCUtilitiesTest.java
Modified:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/DecoratorDefImpl.java
    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/IOCUtilities.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/ValidatingOrderedConfigurationWrapper.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/services/ChainBuilderImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/ComponentTemplateSourceImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentClassTransformerImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalTransformModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/util/Orderer.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IOCUtilities.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/Orderable.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/OrderedConfiguration.java
    tapestry/tapestry5/tapestry-core/trunk/src/site/apt/ioc/configuration.apt
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapperTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/util/OrdererTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/FredModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/transform/SyncCostBench.java

Copied: tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/Concurrence.aj (from r426823, tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/Synchronization.aj)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/Concurrence.aj?p2=tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/Concurrence.aj&p1=tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/Synchronization.aj&r1=426823&r2=426929&rev=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/Synchronization.aj (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/Concurrence.aj Sun Jul 30 13:07:44 2006
@@ -17,18 +17,17 @@
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
-import org.apache.tapestry.internal.annotations.Synchronized;
+import org.apache.tapestry.internal.annotations.Concurrent;
 import org.aspectj.lang.JoinPoint;
 
 /**
  * Manages multi-threaded access to methods of an object instance using a
- * {@link java.util.concurrent.locks.ReentrantReadWriteLock}, driven by the
- * {@link Synchronized.Read} and {@link Synchronized.Write} annotations. Methods that have the
- * Synchronized.Read annotation witll be advised to obtain and release the read lock around their
- * execution. Methods with the Synchronized.Write annotation will obtain and release the write lock
- * around their execution. Methods annotated with Synchronized.Read that call a method annotated
- * with Synchronized.Write (within the same instance) will release the read lock before invoking the
- * method.
+ * {@link java.util.concurrent.locks.ReentrantReadWriteLock}, driven by the {@link Concurrent.Read}
+ * and {@link Concurrent.Write} annotations. Methods that have the Concurrent.Read annotation will
+ * be advised to obtain and release the read lock around their execution. Methods with the
+ * Concurrent.Write annotation will obtain and release the write lock around their execution.
+ * Methods annotated with Concurrent.Read that call a method annotated with Concurrent.Write (within
+ * the same instance) will release the read lock before invoking the write method.
  * <p>
  * This implementation makes use of a ThreadLocal to determine if the current thread has acquired
  * the read lock (or not). This prevents the read lock from being re-locked, and allows the aspect
@@ -38,9 +37,9 @@
  * and that a method may be either read or write, but not both.
  * 
  * @author Howard M. Lewis Ship
- * @see org.apache.tapestry.internal.annotations.Synchronized
+ * @see org.apache.tapestry.internal.annotations.Concurrent
  */
-public abstract aspect Synchronization extends AbstractClassTargetting
+public abstract aspect Concurrence extends AbstractClassTargetting
 perthis(annotatedClasses())
 {
     private final ReadWriteLock _lock = new ReentrantReadWriteLock();
@@ -64,35 +63,35 @@
     }
 
     pointcut annotatedClasses() :
-         targetClasses() && within(@Synchronized *);
+         targetClasses() && within(@Concurrent *);
 
     declare error : 
         targetClasses() &&
-        execution(@(Synchronized.Read || Synchronized.Write) static * *(..)) :
-            "Synchronized.Read and Synchronized.Write annotations may only be applied to instance methods.";
+        execution(@(Concurrent.Read || Concurrent.Write) static * *(..)) :
+            "Concurrent.Read and Concurrent.Write annotations may only be applied to instance methods.";
 
     declare error : 
         targetClasses() &&
-        execution(@(Synchronized.Read || Synchronized.Write) * *(..)) &&
-        within(!@(Synchronized) Object+) :
-            "The class must be annotated with Synchronized in order to use the Synchronized.Read or Synchronized.Write annotations.";
+        execution(@(Concurrent.Read || Concurrent.Write) * *(..)) &&
+        within(!@(Concurrent) Object+) :
+            "The class must be annotated with Concurrent in order to use the Concurrent.Read or Concurrent.Write annotations.";
 
     declare error :
         targetClasses() &&
-        execution(@Synchronized.Read @Synchronized.Write * *(..)) :
-            "A method may be annotated with Synchronized.Read or with Synchronized.Write but not both.";
+        execution(@Concurrent.Read @Concurrent.Write * *(..)) :
+            "A method may be annotated with Concurrent.Read or with Concurrent.Write but not both.";
 
-    pointcut synchronizeWrite() :
-            execution(@Synchronized.Write * *(..));
+    pointcut concurrentWriteMethod() :
+            execution(@Concurrent.Write * *(..));
 
-    pointcut synchronizeRead() :
-        execution(@Synchronized.Read * *(..));
+    pointcut concurrentReadMethod() :
+        execution(@Concurrent.Read * *(..));
 
-    Object around() : synchronizeRead()
+    Object around() : concurrentReadMethod()
     {
-        boolean locked = _threadHasReadLock.get();
+        boolean readLockedAtEntry = _threadHasReadLock.get();
 
-        if (!locked)
+        if (!readLockedAtEntry)
         {
             log(thisJoinPoint, "acquiring read lock");
 
@@ -107,7 +106,7 @@
         }
         finally
         {
-            if (!locked)
+            if (!readLockedAtEntry)
             {
                 log(thisJoinPoint, "releasing read lock");
 
@@ -118,16 +117,20 @@
         }
     }
 
-    Object around() : synchronizeWrite()
+    Object around() : concurrentWriteMethod()
     {
-        boolean locked = _threadHasReadLock.get();
+        boolean readLockedAtEntry = _threadHasReadLock.get();
 
-        if (locked)
+        if (readLockedAtEntry)
         {
             log(thisJoinPoint, "releasing read lock (for upgrade)");
 
             _lock.readLock().unlock();
 
+            // Removing the TL is better than setting it to null. The Thread will keep an instance
+            // of the ThreadLocal, which could force the ThreadBoolean class and its class
+            // loader to be retained even after the application has redeployed.
+
             _threadHasReadLock.set(false);
         }
 
@@ -144,13 +147,17 @@
             log(thisJoinPoint, "releasing write lock");
             _lock.writeLock().unlock();
 
-            if (locked)
+            if (readLockedAtEntry)
             {
                 log(thisJoinPoint, "acquiring read lock (for downgrade)");
 
                 _lock.readLock().lock();
 
                 _threadHasReadLock.set(true);
+            }
+            else
+            {
+                _threadHasReadLock.remove();
             }
         }
     }

Copied: tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalConcurrence.aj (from r426823, tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalSynchronization.aj)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalConcurrence.aj?p2=tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalConcurrence.aj&p1=tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalSynchronization.aj&r1=426823&r2=426929&rev=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalSynchronization.aj (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalConcurrence.aj Sun Jul 30 13:07:44 2006
@@ -15,7 +15,7 @@
 package org.apache.tapestry.internal.aspects;
 
 /** @author Howard M. Lewis Ship */
-public aspect InternalSynchronization extends Synchronization
+public aspect InternalConcurrence extends Concurrence
 {
 
     /**

Copied: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/annotations/Concurrent.java (from r426823, tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/annotations/Synchronized.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/annotations/Concurrent.java?p2=tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/annotations/Concurrent.java&p1=tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/annotations/Synchronized.java&r1=426823&r2=426929&rev=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/annotations/Synchronized.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/annotations/Concurrent.java Sun Jul 30 13:07:44 2006
@@ -24,8 +24,8 @@
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
- * Marker interface for classes whose methods may be annotated with Synchronized.Read or
- * Synchronized.Write. It is the path of least AspectJ resistance to get things working as they
+ * Marker annotation for classes whose methods may be annotated with Concurrent.Read or
+ * Concurrent.Write. It is the path of least AspectJ resistance to get things working as they
  * should.
  * 
  * @author Howard M. Lewis Ship
@@ -34,16 +34,20 @@
 @Retention(RUNTIME)
 @Documented
 @Inherited
-public @interface Synchronized {
+public @interface Concurrent {
 
     /**
      * Marker on methods that perform a read operation. A non-exclusive read lock will be acquired
      * before the method executes, and will be released after the method completes (succesfully or
      * otherwise).
      * <p>
-     * This annotation may only be applied to methods within Synchronized types. It may only be
+     * This annotation may only be applied to methods within Concurrent types. It may only be
      * applied to instance, not static methods. It may not be used in combination with the
-     * Synchronized.Write annotation.
+     * Concurrent.Write annotation.
+     * <p>
+     * If a Read method invokes a Write method (even indirectly), then the Read lock will be
+     * suspended while the Write method executes. However, Write methods should not call back into
+     * Read methods (this may hang the thread).
      */
     @Target(METHOD)
     @Retention(RUNTIME)
@@ -55,15 +59,14 @@
     /**
      * Marker on methods that perform a write operation. An exclusive write lock will be acquired
      * before the method executes, and will be released after the method completes (succesfully or
-     * otherwise).
+     * otherwise).  Write methods should be short.
      * <p>
-     * This annotation may only be applied to methods within Synchronized types. It may only be
-     * applied to instance, not static methods. It may not be used in combination with the
-     * Synchronized.Write annotation.
+     * This annotation may only be applied to methods within Concurrent types. It may only be
+     * applied to instance, not static methods.
+     * <p>
+     * Write methods should not invoke Read methods on the same object as this will hang the thread
+     * (the Read lock can not be acquired while the Write lock is locked, even by the same thread).
      * <p>
-     * TODO: To acquire the write lock, one must give up one's read lock (if any). This is not
-     * supported yet, so invoking a Synchronized.Write method (even indirectly) from a
-     * Synchronized.Read method will hang the thread.
      */
     @Target(METHOD)
     @Retention(RUNTIME)

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/DecoratorDefImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/DecoratorDefImpl.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/DecoratorDefImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/DecoratorDefImpl.java Sun Jul 30 13:07:44 2006
@@ -14,19 +14,22 @@
 
 package org.apache.tapestry.internal.ioc;
 
-import static org.apache.tapestry.internal.ioc.IOCUtilities.decoratorMatch;
-import static org.apache.tapestry.ioc.IOCUtilities.extractModuleId;
-import static org.apache.tapestry.util.Defense.notBlank;
-import static org.apache.tapestry.util.Defense.notNull;
-
 import java.lang.reflect.Method;
+import java.util.List;
 
 import org.apache.tapestry.internal.annotations.SuppressNullCheck;
 import org.apache.tapestry.internal.util.InternalUtils;
+import org.apache.tapestry.ioc.IdMatcher;
+import org.apache.tapestry.ioc.IdMatcherImpl;
+import org.apache.tapestry.ioc.OrIdMatcher;
 import org.apache.tapestry.ioc.ServiceDecorator;
 import org.apache.tapestry.ioc.ServiceResources;
 import org.apache.tapestry.ioc.def.DecoratorDef;
 import org.apache.tapestry.ioc.def.ServiceDef;
+import org.apache.tapestry.util.CollectionFactory;
+
+import static org.apache.tapestry.util.Defense.notBlank;
+import static org.apache.tapestry.util.Defense.notNull;
 
 /**
  * @author Howard M. Lewis Ship
@@ -41,7 +44,7 @@
 
     private final Method _decoratorMethod;
 
-    private final String[] _patterns;
+    private final IdMatcher _idMatcher;
 
     @SuppressNullCheck
     public DecoratorDefImpl(String decoratorId, String before, String after,
@@ -51,7 +54,16 @@
         _before = before;
         _after = after;
         _decoratorMethod = notNull(decoratorMethod, "decoratorMethod");
-        _patterns = notNull(patterns, "patterns");
+
+        List<IdMatcher> matchers = CollectionFactory.newList();
+
+        for (String pattern : notNull(patterns, "patterns"))
+        {
+            IdMatcher matcher = new IdMatcherImpl(pattern);
+            matchers.add(matcher);
+        }
+
+        _idMatcher = new OrIdMatcher(matchers);
     }
 
     @Override
@@ -86,15 +98,8 @@
     public boolean matches(ServiceDef serviceDef)
     {
         String serviceId = serviceDef.getServiceId();
-        String decoratorModuleId = extractModuleId(_decoratorId);
-
-        for (String pattern : _patterns)
-        {
-            if (decoratorMatch(serviceId, decoratorModuleId, pattern))
-                return true;
-        }
 
-        return false;
+        return _idMatcher.matches(serviceId);
     }
 
 }

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=426929&r1=426928&r2=426929&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 Sun Jul 30 13:07:44 2006
@@ -47,6 +47,7 @@
 import static org.apache.tapestry.internal.ioc.IOCMessages.buildMethodWrongReturnType;
 import static org.apache.tapestry.internal.ioc.IOCMessages.decoratorMethodWrongReturnType;
 import static org.apache.tapestry.ioc.IOCUtilities.qualifySimpleIdList;
+import static org.apache.tapestry.ioc.IOCUtilities.toQualifiedId;
 import static org.apache.tapestry.util.CollectionFactory.newMap;
 import static org.apache.tapestry.util.CollectionFactory.newSet;
 
@@ -284,6 +285,11 @@
                 beforeAnnotation.value());
         String[] patterns = match == null ? new String[]
         { simpleDecoratorId } : match.value();
+
+        // Qualify any unqualified match patterns with the decorator's module id.
+
+        for (int i = 0; i < patterns.length; i++)
+            patterns[i] = toQualifiedId(_moduleId, patterns[i]);
 
         DecoratorDef def = new DecoratorDefImpl(id, before, after, method, patterns);
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCUtilities.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCUtilities.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCUtilities.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCUtilities.java Sun Jul 30 13:07:44 2006
@@ -100,83 +100,4 @@
 
         return parameters;
     }
-
-    /**
-     * Checks to see if a string matches against a "glob pattern". A glob pattern is a string to
-     * match that may contain a leading or trailing asterisk ("*"), or may consist of only an
-     * asterisk. The asterisk matches any sequence of characters (including the empty string). The
-     * term "glob" comes from POSIX tools, though this is a very limited subset.
-     * <p>
-     * I'm not happy with the efficiency and utility of this class, so for the moment, it's going to
-     * stay as internal.
-     * 
-     * @param input
-     * @param pattern
-     * @return true if the input matches the pattern, false otherwise
-     */
-    public static boolean globMatch(String input, String pattern)
-    {
-        if (pattern.equals("*"))
-            return true;
-
-        boolean globPrefix = pattern.startsWith("*");
-        boolean globSuffix = pattern.endsWith("*");
-
-        if (globPrefix && globSuffix)
-        {
-            String substring = pattern.substring(1, pattern.length() - 1);
-            return input.contains(substring);
-        }
-
-        if (globPrefix)
-            return input.endsWith(pattern.substring(1));
-
-        if (globSuffix)
-            return input.startsWith(pattern.substring(0, pattern.length() - 1));
-
-        // No globs!
-
-        return input.equals(pattern);
-    }
-
-    /**
-     * Used by the default implementation of {@link org.apache.tapestry.ioc.def.DecoratorDef} to
-     * match a pattern against a prospective service id. The pattern is either simple or qualified.
-     * A simple pattern contains no '.' character, in which case the pattern is matched against just
-     * the simple id portion of the service id and a match can only occur within the same module as
-     * the decorator. Alternately, with a complex pattern, such as <code>foo.bar.*.*Data*</code>
-     * is really two matches: <code>foo.bar.*</code> against the module id portion of the
-     * service's id, and <code>*Data*</code> against the unqualified portion of the service id.
-     * The split occurs on the <em>last</em> period character.
-     * 
-     * @param serviceId
-     *            the fully qualified id of the service to match against
-     * @param decoratorModuleId
-     *            the id of the module containing the decorator, used when the pattern is simple
-     * @param pattern
-     *            the pattern to match against serviceId
-     * @return true if the service id matches the pattern, false otherwise
-     */
-    public static boolean decoratorMatch(String serviceId, String decoratorModuleId, String pattern)
-    {
-        int dotx = serviceId.lastIndexOf('.');
-
-        String serviceModuleId = serviceId.substring(0, dotx);
-        String serviceSimpleId = serviceId.substring(dotx + 1);
-
-        dotx = pattern.lastIndexOf('.');
-
-        // Simple patterns only match within their own module and the pattern
-        // matches the unqualified service id
-
-        if (dotx <= 0)
-            return serviceModuleId.equals(decoratorModuleId) && globMatch(serviceSimpleId, pattern);
-
-        String moduleIdPattern = pattern.substring(0, dotx);
-        String servicePattern = pattern.substring(dotx + 1);
-
-        return globMatch(serviceModuleId, moduleIdPattern)
-                && globMatch(serviceSimpleId, servicePattern);
-    }
-
 }

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=426929&r1=426928&r2=426929&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 Sun Jul 30 13:07:44 2006
@@ -157,7 +157,7 @@
 
     // Why synchronized here? Two reasons. First, with some lifecycle models (or perhaps in some
     // scenarios using interceptors), we may try to acquire the write lock a second time and the
-    // @Synchronized.Write annotation doesn't currently support that. Second, I'm concerned about
+    // @Concurrent.Write annotation doesn't currently support that. Second, I'm concerned about
     // multiple threads building services simultaneously, and getting into a thread deadlock. Of
     // course, this isn't a solution for that ... we may need a global mutex to handle that specific
     // case! Alternately, I've thought about creating a "service creation" thread at startup and

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=426929&r1=426928&r2=426929&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 Sun Jul 30 13:07:44 2006
@@ -61,7 +61,7 @@
             _orderer = orderer;
         }
 
-        public void add(String id, String prerequisites, String postrequisites, T object)
+        public void add(String id, T object, String prerequisites, String postrequisites)
         {
             _orderer.add(id, prerequisites, postrequisites, object);
         }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapper.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapper.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapper.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapper.java Sun Jul 30 13:07:44 2006
@@ -60,13 +60,13 @@
     }
 
     @SuppressNullCheck
-    public void add(String id, String prerequisites, String postrequisites, T object)
+    public void add(String id, T object, String prerequisites, String postrequisites)
     {
         _delegate.add(
                 toQualifiedId(_moduleId, id),
+                validVersionOf(object),
                 qualifySimpleIdList(_moduleId, prerequisites),
-                qualifySimpleIdList(_moduleId, postrequisites),
-                validVersionOf(object));
+                qualifySimpleIdList(_moduleId, postrequisites));
     }
 
     @SuppressNullCheck

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/services/ChainBuilderImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/services/ChainBuilderImpl.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/services/ChainBuilderImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/services/ChainBuilderImpl.java Sun Jul 30 13:07:44 2006
@@ -19,7 +19,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.tapestry.internal.annotations.Synchronized;
+import org.apache.tapestry.internal.annotations.Concurrent;
 import org.apache.tapestry.ioc.services.ChainBuilder;
 import org.apache.tapestry.ioc.services.ClassFab;
 import org.apache.tapestry.ioc.services.ClassFabUtils;
@@ -34,7 +34,7 @@
 /**
  * @author Howard M. Lewis Ship
  */
-@Synchronized
+@Concurrent
 public class ChainBuilderImpl implements ChainBuilder
 {
     private final ClassFactory _classFactory;
@@ -57,7 +57,7 @@
 
     private Map<Class, Class> _cache = CollectionFactory.newMap();
 
-    @Synchronized.Read
+    @Concurrent.Read
     private Class findImplementationClass(Class commandInterface)
     {
         Class result = (Class) _cache.get(commandInterface);
@@ -68,7 +68,7 @@
         return result;
     }
 
-    @Synchronized.Write
+    @Concurrent.Write
     private Class constructImplementationClass(Class commandInterface)
     {
         String name = ClassFabUtils.generateClassName(commandInterface);

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/ComponentTemplateSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/ComponentTemplateSourceImpl.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/ComponentTemplateSourceImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/pageload/ComponentTemplateSourceImpl.java Sun Jul 30 13:07:44 2006
@@ -24,7 +24,7 @@
 import org.apache.hivemind.util.ClasspathResource;
 import org.apache.tapestry.events.UpdateEvent;
 import org.apache.tapestry.events.UpdateListener;
-import org.apache.tapestry.internal.annotations.Synchronized;
+import org.apache.tapestry.internal.annotations.Concurrent;
 import org.apache.tapestry.internal.event.InvalidationEventHubImpl;
 import org.apache.tapestry.internal.parser.ComponentTemplate;
 import org.apache.tapestry.internal.parser.TemplateParser;
@@ -35,7 +35,7 @@
  * 
  * @author Howard M. Lewis Ship
  */
-@Synchronized
+@Concurrent
 public final class ComponentTemplateSourceImpl extends InvalidationEventHubImpl implements
         ComponentTemplateSource, UpdateListener
 {
@@ -63,7 +63,7 @@
      * (the combination of component name and locale is resolved to a resource). The localized
      * resource is used as the key to a cache of {@link ComponentTemplate}s.
      */
-    @Synchronized.Read
+    @Concurrent.Read
     public ComponentTemplate getTemplate(String componentName, Locale locale)
     {
         String key = componentName + ":" + locale.toString();
@@ -87,7 +87,7 @@
         return _templates.get(resource);
     }
 
-    @Synchronized.Write
+    @Concurrent.Write
     private void parseTemplate(Resource r)
     {
         _tracker.add(r.getResourceURL());
@@ -97,7 +97,7 @@
         _templates.put(r, template);
     }
 
-    @Synchronized.Write
+    @Concurrent.Write
     private void locateTemplateResource(String componentName, Locale locale, String key)
     {
         // TODO: Currently hard-coded to a ".html" extension! Need to locate the
@@ -116,7 +116,7 @@
      * cleared, and an invalidation event is fired. This is brute force ... a more targetted
      * dependency management strategy may come later.
      */
-    @Synchronized.Write
+    @Concurrent.Write
     public void checkForUpdates(UpdateEvent event)
     {
         if (_tracker.containsChanges())

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentClassTransformerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentClassTransformerImpl.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentClassTransformerImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentClassTransformerImpl.java Sun Jul 30 13:07:44 2006
@@ -24,7 +24,7 @@
 import org.apache.tapestry.annotations.ComponentClass;
 import org.apache.tapestry.events.InvalidationEvent;
 import org.apache.tapestry.events.InvalidationListener;
-import org.apache.tapestry.internal.annotations.Synchronized;
+import org.apache.tapestry.internal.annotations.Concurrent;
 import org.apache.tapestry.internal.model.MutableComponentModelImpl;
 import org.apache.tapestry.model.MutableComponentModel;
 import org.apache.tapestry.transform.ComponentClassTransformWorker;
@@ -34,7 +34,7 @@
  * 
  * @author Howard M. Lewis Ship
  */
-@Synchronized
+@Concurrent
 public class ComponentClassTransformerImpl implements ComponentClassTransformer,
         InvalidationListener
 {
@@ -56,13 +56,13 @@
      * Clears the cache of {@link InternalClassTransformation} instances whenever the class loader
      * is invalidated.
      */
-    @Synchronized.Write
+    @Concurrent.Write
     public void objectWasInvalidated(InvalidationEvent event)
     {
         _nameToClassTransformation.clear();
     }
 
-    @Synchronized.Write
+    @Concurrent.Write
     public void transformComponentClass(CtClass ctClass)
     {
         String classname = ctClass.getName();
@@ -106,7 +106,7 @@
         _nameToClassTransformation.put(classname, transformation);
     }
 
-    @Synchronized.Read
+    @Concurrent.Read
     public Instantiator createInstantiator(Class componentClass)
     {
         String className = componentClass.getName();

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalTransformModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalTransformModule.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalTransformModule.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalTransformModule.java Sun Jul 30 13:07:44 2006
@@ -38,7 +38,7 @@
             OrderedConfiguration<ComponentClassTransformWorker> configuration)
     {
         configuration.add("Retain", new RetainWorker());
-        configuration.add("UnclaimedField", "*", null, new UnclaimedFieldWorker());
+        configuration.add("UnclaimedField", new UnclaimedFieldWorker(), "*", null);
     }
 
     public ComponentClassTransformer buildComponentClassTransformer(

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=426929&r1=426928&r2=426929&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 Sun Jul 30 13:07:44 2006
@@ -76,7 +76,7 @@
     @SuppressNullCheck
     public void add(String id, String prereqs, String postreqs, T target)
     {
-        add(new Orderable<T>(id, prereqs, postreqs, target));
+        add(new Orderable<T>(id, target, prereqs, postreqs));
     }
 
     @OneShot.Lockdown

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/GlobPatternMatcher.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/GlobPatternMatcher.java?rev=426929&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/GlobPatternMatcher.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/GlobPatternMatcher.java Sun Jul 30 13:07:44 2006
@@ -0,0 +1,82 @@
+package org.apache.tapestry.ioc;
+
+import static org.apache.tapestry.ioc.MatchType.ANY;
+import static org.apache.tapestry.ioc.MatchType.INFIX;
+import static org.apache.tapestry.ioc.MatchType.PREFIX;
+import static org.apache.tapestry.ioc.MatchType.SUFFIX;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+public class GlobPatternMatcher
+{
+    private String _substring;
+
+    private MatchType _type;
+
+    public GlobPatternMatcher(String pattern)
+    {
+        analyze(pattern);
+    }
+
+    private void analyze(String pattern)
+    {
+        if (pattern.equals("*"))
+        {
+            _type = ANY;
+            return;
+        }
+
+        boolean globPrefix = pattern.startsWith("*");
+        boolean globSuffix = pattern.endsWith("*");
+
+        if (globPrefix && globSuffix)
+        {
+            _substring = pattern.substring(1, pattern.length() - 1);
+            _type = INFIX;
+            return;
+        }
+
+        if (globPrefix)
+        {
+            _substring = pattern.substring(1);
+            _type = SUFFIX;
+            return;
+        }
+
+        if (globSuffix)
+        {
+            _substring = pattern.substring(0, pattern.length() - 1);
+            _type = PREFIX;
+            return;
+        }
+
+        _type = MatchType.EXACT;
+        _substring = pattern;
+    }
+
+    public boolean matches(String input)
+    {
+        switch (_type)
+        {
+            case ANY:
+                return true;
+
+            case EXACT:
+
+                return input.equals(_substring);
+
+            case INFIX:
+
+                return input.contains(_substring);
+
+            case PREFIX:
+
+                return input.startsWith(_substring);
+
+            default:
+
+                return input.endsWith(_substring);
+        }
+    }
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IOCUtilities.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IOCUtilities.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IOCUtilities.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IOCUtilities.java Sun Jul 30 13:07:44 2006
@@ -134,11 +134,6 @@
         }
     }
 
-    public static boolean match(String serviceId, String moduleId, String pattern)
-    {
-        return true;
-    }
-
     /**
      * Returns a fully qualfied id. If the id contains a '.', then it is returned unchanged.
      * Otherwise, the module's id is prefixed (with a seperator '.') and returned;

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdMatcher.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdMatcher.java?rev=426929&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdMatcher.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdMatcher.java Sun Jul 30 13:07:44 2006
@@ -0,0 +1,18 @@
+package org.apache.tapestry.ioc;
+
+/**
+ * A matcher of <em>fully qualified<em> ids.
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public interface IdMatcher
+{
+    /**
+     * Returns true if the provided input id matches the pattern defined by this matcher instance.
+     * 
+     * @param id
+     *            the fully qualfied id
+     * @return true on match, false otherwise
+     */
+    boolean matches(String id);
+}
\ No newline at end of file

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdMatcherImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdMatcherImpl.java?rev=426929&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdMatcherImpl.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/IdMatcherImpl.java Sun Jul 30 13:07:44 2006
@@ -0,0 +1,42 @@
+package org.apache.tapestry.ioc;
+
+/**
+ * Used to match input values (as fully qualified ids) to a pattern. The pattern is split into two
+ * glob match patterns at the last dot.
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public class IdMatcherImpl implements IdMatcher
+{
+    private final GlobPatternMatcher _moduleMatcher;
+
+    private final GlobPatternMatcher _serviceMatcher;
+
+    public IdMatcherImpl(String pattern)
+    {
+        int dotx = pattern.lastIndexOf('.');
+
+        if (dotx < 0)
+            throw new IllegalArgumentException(String.format(
+                    "Pattern '%s' does not contain a '.' seperator character.",
+                    pattern));
+
+        _moduleMatcher = new GlobPatternMatcher(pattern.substring(0, dotx));
+        _serviceMatcher = new GlobPatternMatcher(pattern.substring(dotx + 1));
+    }
+
+    public boolean matches(String id)
+    {
+        int dotx = id.lastIndexOf('.');
+
+        if (dotx < 0)
+            throw new IllegalArgumentException(String.format(
+                    "Input id '%s' does not contain a '.' seperator character.",
+                    id));
+
+        String moduleId = id.substring(0, dotx);
+        String serviceId = id.substring(dotx + 1);
+
+        return _moduleMatcher.matches(moduleId) && _serviceMatcher.matches(serviceId);
+    }
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/MatchType.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/MatchType.java?rev=426929&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/MatchType.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/MatchType.java Sun Jul 30 13:07:44 2006
@@ -0,0 +1,8 @@
+/**
+ * 
+ */
+package org.apache.tapestry.ioc;
+
+enum MatchType {
+    EXACT, PREFIX, SUFFIX, INFIX, ANY
+}
\ No newline at end of file

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/OrIdMatcher.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/OrIdMatcher.java?rev=426929&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/OrIdMatcher.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/OrIdMatcher.java Sun Jul 30 13:07:44 2006
@@ -0,0 +1,28 @@
+package org.apache.tapestry.ioc;
+
+import java.util.Collection;
+
+/**
+ * A wrapper around a collection of IdMatchers. A match occurs if <em>any</em> matcher matches.
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public class OrIdMatcher implements IdMatcher
+{
+    private final IdMatcher[] _matchers;
+
+    public OrIdMatcher(Collection<IdMatcher> matchers)
+    {
+        _matchers = matchers.toArray(new IdMatcher[0]);
+    }
+
+    public boolean matches(String id)
+    {
+        for (IdMatcher m : _matchers)
+            if (m.matches(id))
+                return true;
+
+        return false;
+    }
+
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/Orderable.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/Orderable.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/Orderable.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/Orderable.java Sun Jul 30 13:07:44 2006
@@ -43,16 +43,16 @@
     /**
      * @param id
      *            unique identifier for the target object
+     * @param target
+     *            the object to be ordered; this may also be null (in which case the id represents a
+     *            placeholder)
      * @param prereqs
      *            list of preceding objects, or "*" to order this object last, or null to not care
      * @param postreqs
      *            list of following objects, or "*" to order this object last, or null to not care
-     * @param target
-     *            the object to be ordered; this may also be null (in which case the id represents a
-     *            placeholder)
      */
     @SuppressNullCheck
-    public Orderable(String id, String prereqs, String postreqs, T target)
+    public Orderable(String id, T target, String prereqs, String postreqs)
     {
         _id = notBlank(id, "id");
         _prereqs = prereqs;
@@ -63,7 +63,7 @@
     @SuppressNullCheck
     public Orderable(String id, T target)
     {
-        this(id, null, null, target);
+        this(id, target, null, null);
     }
 
     public String getId()

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/OrderedConfiguration.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/OrderedConfiguration.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/OrderedConfiguration.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ioc/OrderedConfiguration.java Sun Jul 30 13:07:44 2006
@@ -41,16 +41,16 @@
      * @param id
      *            a unique id for the object; the id will be fully qualified with the contributing
      *            module's id
+     * @parm object to add to the service's configuration
      * @param prerequisites
      *            comma separated list of ids, or "*", or null (aka "after")
      * @param postrequisites
      *            comma separated list of ids, or, "*", or null (aka "before")
-     * @parm object to add to the service's configuration
      */
-    void add(String id, String prerequisites, String postrequisites, T object);
+    void add(String id, T object, String prerequisites, String postrequisites);
 
     /**
-     * Simplified version of {@link #add(String, String, String, T)} that assumes null for the pre-
+     * Simplified version of {@link #add(String, T, String, String)} that assumes null for the pre-
      * and post-requisites.
      * 
      * @param id

Modified: tapestry/tapestry5/tapestry-core/trunk/src/site/apt/ioc/configuration.apt
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/ioc/configuration.apt?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/apt/ioc/configuration.apt (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/apt/ioc/configuration.apt Sun Jul 30 13:07:44 2006
@@ -195,8 +195,8 @@
   @Contribute("some.module.Startup")
   public void contributeStartups(OrderedConfiguration<Runnable> configuration)
   {
-    configuration.add("jms", new JMSStartup());
-    configuration.add("filesystem", "some.other.module.classloader", null, new FileSystemStartup());
+    configuration.add("JMS", new JMSStartup());
+    configuration.add("FileSystem", new FileSystemStartup(), "some.other.module.ClassLoader", null);
   }    
 +------+
   
@@ -205,7 +205,7 @@
   object (here the JMSStartup instance) based on the constraints of other contributed objects.
   
   The second form is more specific, it allows pre-requisites and post-requisites. Each is a comma
-  separated list of ids.  Unqualified ids in the list will be qualified with the contributing module's id.
+  separated list of ids.  Unqualified ids in the list will be qualified with the <contributing> module's id.
   As elsewhere, you may use the value "*" to indicate the item must be last or first in the list.
   
   The object passed in may be null; this is valid, and is considered a "join point": points of reference in the
@@ -224,7 +224,3 @@
   the conflict), and ignore the conflicting value.
   
   The value may not be null.
-  
-    
-  
-   
\ No newline at end of file

Copied: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrenceAspectTest.java (from r426823, tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationAspectTest.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrenceAspectTest.java?p2=tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrenceAspectTest.java&p1=tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationAspectTest.java&r1=426823&r2=426929&rev=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationAspectTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrenceAspectTest.java Sun Jul 30 13:07:44 2006
@@ -24,14 +24,14 @@
 import static org.testng.Assert.assertEquals;
 
 /** @author Howard M. Lewis Ship */
-public class SynchronizationAspectTest extends TestBase
+public class ConcurrenceAspectTest extends TestBase
 {
-    private SynchronizationTarget _target;
+    private ConcurrentTarget _target;
 
     @Configuration(beforeTestClass = true)
     public void createTarget()
     {
-        _target = new SynchronizationTarget();
+        _target = new ConcurrentTarget();
     }
 
     private static final int THREAD_COUNT = 100;
@@ -107,7 +107,7 @@
     @Test
     public void multiple_synchronized_objects() throws Exception
     {
-        Runnable operation = new SynchTargetWrapper(_target);
+        Runnable operation = new ConcurrentTargetWrapper(_target);
 
         runOperation(operation);
     }

Copied: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrentTarget.java (from r426823, tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationTarget.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrentTarget.java?p2=tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrentTarget.java&p1=tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationTarget.java&r1=426823&r2=426929&rev=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationTarget.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrentTarget.java Sun Jul 30 13:07:44 2006
@@ -14,51 +14,51 @@
 
 package org.apache.tapestry.internal.aspects;
 
-import org.apache.tapestry.internal.annotations.Synchronized;
+import org.apache.tapestry.internal.annotations.Concurrent;
 
 /**
  * Class used to test the {@link Synchronization} aspect.
  * 
  * @author Howard M. Lewis Ship
  */
-@Synchronized
-public class SynchronizationTarget
+@Concurrent
+public class ConcurrentTarget
 {
     private int _counter;
 
     // Used to check if read locks accumulate when @Read calls @Read
-    @Synchronized.Read
+    @Concurrent.Read
     public int readCounter()
     {
         return getCounter();
     }
     
-    @Synchronized.Read
+    @Concurrent.Read
     public int getCounter()
     {
         return _counter;
     }
 
-    @Synchronized.Write
+    @Concurrent.Write
     public void incrementCounter()
     {
         _counter++;
     }
 
-    @Synchronized.Write
+    @Concurrent.Write
     public void setCounter(int counter)
     {
         _counter = counter;
     }
 
-    @Synchronized.Read
+    @Concurrent.Read
     public void incrementIfNonNegative()
     {
         if (_counter >= 0)
             incrementCounter();
     }
 
-    @Synchronized.Read
+    @Concurrent.Read
     public void incrementViaRunnable()
     {
         Runnable r = new Runnable()
@@ -72,7 +72,7 @@
         r.run();
     }
 
-    @Synchronized.Write
+    @Concurrent.Write
     public void incrementCounterHard()
     {
         _counter = getCounter() + 1;

Copied: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrentTargetWrapper.java (from r426823, tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchTargetWrapper.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrentTargetWrapper.java?p2=tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrentTargetWrapper.java&p1=tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchTargetWrapper.java&r1=426823&r2=426929&rev=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchTargetWrapper.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ConcurrentTargetWrapper.java Sun Jul 30 13:07:44 2006
@@ -14,24 +14,24 @@
 
 package org.apache.tapestry.internal.aspects;
 
-import org.apache.tapestry.internal.annotations.Synchronized;
+import org.apache.tapestry.internal.annotations.Concurrent;
 
 /**
  * Class used to test the {@link Synchronization} aspect.
  * 
  * @author Howard M. Lewis Ship
  */
-@Synchronized
-public class SynchTargetWrapper implements Runnable
+@Concurrent
+public class ConcurrentTargetWrapper implements Runnable
 {
-    private final SynchronizationTarget _target;
+    private final ConcurrentTarget _target;
 
-    public SynchTargetWrapper(SynchronizationTarget target)
+    public ConcurrentTargetWrapper(ConcurrentTarget target)
     {
         _target = target;
     }
 
-    @Synchronized.Read
+    @Concurrent.Read
     public void run()
     {
         _target.incrementCounter();

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/GlobPatternMatcherTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/GlobPatternMatcherTest.java?rev=426929&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/GlobPatternMatcherTest.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/GlobPatternMatcherTest.java Sun Jul 30 13:07:44 2006
@@ -0,0 +1,77 @@
+// 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.internal.ioc;
+
+import org.apache.tapestry.ioc.GlobPatternMatcher;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+public class GlobPatternMatcherTest
+{
+    private boolean globMatch(String input, String pattern)
+    {
+        return new GlobPatternMatcher(pattern).matches(input);
+    }
+
+    @Test
+    public void glob_match_exact()
+    {
+        assertTrue(globMatch("fred", "fred"));
+        assertFalse(globMatch("xfred", "fred"));
+        assertFalse(globMatch("fredx", "fred"));
+        assertFalse(globMatch("fred", "xfred"));
+        assertFalse(globMatch("fred", "fredx"));
+    }
+
+    @Test
+    public void glob_match_wild()
+    {
+        assertTrue(globMatch("fred", "*"));
+        assertTrue(globMatch("", "*"));
+    }
+
+    @Test
+    public void glob_match_prefix()
+    {
+        assertTrue(globMatch("fred.Barney", "*Barney"));
+        assertFalse(globMatch("fred.Barneyx", "*Barney"));
+        assertFalse(globMatch("fred.Barney", "*Barneyx"));
+        assertFalse(globMatch("fred.Barney", "*xBarney"));
+    }
+
+    @Test
+    public void glob_match_suffix()
+    {
+        assertTrue(globMatch("fred.Barney", "fred*"));
+        assertFalse(globMatch("xfred.Barney", "fred*"));
+        assertFalse(globMatch("fred.Barney", "fredx*"));
+        assertFalse(globMatch("fred.Barney", "xfred*"));
+    }
+
+    @Test
+    public void glob_match_infix()
+    {
+        assertTrue(globMatch("fred.Barney", "*d.B*"));
+        assertTrue(globMatch("fred.Barney", "*Barney*"));
+        assertTrue(globMatch("fred.Barney", "*fred*"));
+        assertFalse(globMatch("fred.Barney", "*flint*"));
+    }
+
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/IdMatcherImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/IdMatcherImplTest.java?rev=426929&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/IdMatcherImplTest.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/IdMatcherImplTest.java Sun Jul 30 13:07:44 2006
@@ -0,0 +1,79 @@
+package org.apache.tapestry.internal.ioc;
+
+import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.apache.tapestry.ioc.IdMatcher;
+import org.apache.tapestry.ioc.IdMatcherImpl;
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+public class IdMatcherImplTest extends InternalBaseTestCase
+{
+    @Test
+    public void invalid_pattern()
+    {
+        try
+        {
+            new IdMatcherImpl("foo");
+            unreachable();
+        }
+        catch (IllegalArgumentException ex)
+        {
+            Assert.assertEquals(
+                    ex.getMessage(),
+                    "Pattern 'foo' does not contain a '.' seperator character.");
+        }
+    }
+
+    @Test
+    public void invalid_input()
+    {
+        try
+        {
+            new IdMatcherImpl("*.*").matches("fred");
+            unreachable();
+        }
+        catch (IllegalArgumentException ex)
+        {
+            Assert.assertEquals(
+                    ex.getMessage(),
+                    "Input id 'fred' does not contain a '.' seperator character.");
+        }
+
+    }
+
+    @Test(dataProvider = "id_match_values")
+    public void id_match(String pattern, boolean expectedMatch)
+    {
+        IdMatcher matcher = new IdMatcherImpl(pattern);
+
+        Assert.assertEquals(matcher.matches("foo.bar.Baz"), expectedMatch);
+    }
+
+    @DataProvider(name = "id_match_values")
+    public Object[][] id_match_values()
+    {
+        return new Object[][]
+        {//
+        new Object[]
+        { "foo*.Baz", true },
+        // 
+                new Object[]
+                { "*.Baz", true },
+                // 
+                new Object[]
+                { "foo.bar.*az", true },
+                // 
+                new Object[]
+                { "*fie*.*az", false },
+                // 
+                new Object[]
+                { "*.Goop", false }
+
+        };
+    }
+
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapperTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapperTest.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapperTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapperTest.java Sun Jul 30 13:07:44 2006
@@ -35,14 +35,14 @@
         OrderedConfiguration<Runnable> configuration = newOrderedConfiguration();
         Runnable contribution = newRunnable();
 
-        configuration.add("fred.id", "fred.pre", "fred.post", contribution);
+        configuration.add("fred.id", contribution, "fred.pre", "fred.post");
 
         replay();
 
         OrderedConfiguration<Runnable> wrapper = new ValidatingOrderedConfigurationWrapper<Runnable>(
                 "barney.Service", "fred", def, log, Runnable.class, configuration);
 
-        wrapper.add("id", "pre", "post", contribution);
+        wrapper.add("id", contribution, "pre", "post");
 
         verify();
     }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/util/OrdererTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/util/OrdererTest.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/util/OrdererTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/util/OrdererTest.java Sun Jul 30 13:07:44 2006
@@ -272,7 +272,7 @@
 
         assertEquals(simple.toString(), "Orderable[simple SIMPLE]");
 
-        Orderable<String> complex = new Orderable<String>("complex", "pre", "post", "COMPLEX");
+        Orderable<String> complex = new Orderable<String>("complex", "COMPLEX", "pre", "post");
 
         assertEquals(complex.toString(), "Orderable[complex pre:pre post:post COMPLEX]");
     }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/FredModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/FredModule.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/FredModule.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/ioc/FredModule.java Sun Jul 30 13:07:44 2006
@@ -114,7 +114,7 @@
     {
         // Order "FRED" after "BARNEY"
 
-        configuration.add("fred", "barney", null, "FRED");
+        configuration.add("fred", "FRED", "barney", null);
         configuration.add("barney", "BARNEY");
     }
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/transform/SyncCostBench.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/transform/SyncCostBench.java?rev=426929&r1=426928&r2=426929&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/transform/SyncCostBench.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/transform/SyncCostBench.java Sun Jul 30 13:07:44 2006
@@ -17,7 +17,7 @@
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
-import org.apache.tapestry.internal.annotations.Synchronized;
+import org.apache.tapestry.internal.annotations.Concurrent;
 
 import static java.lang.String.format;
 import static java.lang.System.out;
@@ -29,7 +29,7 @@
  * is that hotspot is going to mess up our synchronization when it see we're not really doing
  * anything multi-threaded.
  * <p>
- * The results show that using the {@link org.apache.tapestry.internal.annotations.Synchronized}
+ * The results show that using the {@link org.apache.tapestry.internal.annotations.Concurrent}
  * aspect (which used a {@link java.util.concurrent.locks.ReentrantReadWriteLock} under the covers)
  * is about 4x as expensive as just using the synchronized keyword. There are some anomolous results
  * ... for example, ReadWriteLockRunner is consistently slower than ReadWriteLockAspectRunner (one
@@ -85,7 +85,7 @@
         }
     }
 
-    @Synchronized
+    @Concurrent
     static class ReadWriteLockAspectRunner implements Runnable
     {
         private final Runnable _delegate;
@@ -95,7 +95,7 @@
             _delegate = delegate;
         }
 
-        @Synchronized.Read
+        @Concurrent.Read
         public void run()
         {
             _delegate.run();