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