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 2010/05/19 03:02:39 UTC

svn commit: r945984 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/internal/services/ main/java/org/apache/tapestry5/internal/services/meta/ main/java/org/apache/tapestry5/internal/transform/ main/java/org/apache/tapes...

Author: hlship
Date: Wed May 19 01:02:39 2010
New Revision: 945984

URL: http://svn.apache.org/viewvc?rev=945984&view=rev
Log:
TAP5-461: Create a service that fits into the ComponentClassTransformWorker chain and can be configured to extract component meta-data from class annotations

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/ContentTypeExtractor.java   (with props)
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaAnnotationExtractor.java   (contents, props changed)
      - copied, changed from r945983, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MetaWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaWorkerImpl.java   (with props)
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/FixedExtractor.java   (with props)
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaDataExtractor.java   (with props)
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaWorker.java   (with props)
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/meta/
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/meta/MetaWorkerTest.java   (contents, props changed)
      - copied, changed from r945983, tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/MetaWorkerTest.java
Removed:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ContentTypeWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MetaWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/SecureWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/ContentTypeWorkerTest.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/MetaWorkerTest.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformerImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformerImpl.java?rev=945984&r1=945983&r2=945984&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformerImpl.java Wed May 19 01:02:39 2010
@@ -14,14 +14,19 @@
 
 package org.apache.tapestry5.internal.services;
 
+import java.lang.reflect.Modifier;
+import java.util.Map;
+
 import javassist.CtClass;
 import javassist.CtConstructor;
 import javassist.NotFoundException;
+
 import org.apache.tapestry5.TapestryMarkers;
 import org.apache.tapestry5.internal.InternalConstants;
 import org.apache.tapestry5.internal.model.MutableComponentModelImpl;
 import org.apache.tapestry5.ioc.LoggerSource;
 import org.apache.tapestry5.ioc.Resource;
+import org.apache.tapestry5.ioc.annotations.Primary;
 import org.apache.tapestry5.ioc.internal.services.CtClassSource;
 import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
@@ -33,9 +38,6 @@ import org.apache.tapestry5.services.Com
 import org.apache.tapestry5.services.InvalidationListener;
 import org.slf4j.Logger;
 
-import java.lang.reflect.Modifier;
-import java.util.Map;
-
 /**
  * Implementation of {@link org.apache.tapestry5.internal.services.ComponentClassTransformer}.
  */
@@ -69,10 +71,18 @@ public class ComponentClassTransformerIm
      * @param classSource
      * @param componentClassCache
      */
-    public ComponentClassTransformerImpl(ComponentClassTransformWorker workerChain, LoggerSource loggerSource,
-            @ComponentLayer
-            ClassFactory classFactory, @ComponentLayer
-            CtClassSource classSource, ComponentClassCache componentClassCache)
+    public ComponentClassTransformerImpl(@Primary
+    ComponentClassTransformWorker workerChain,
+
+    LoggerSource loggerSource,
+
+    @ComponentLayer
+    ClassFactory classFactory,
+
+    @ComponentLayer
+    CtClassSource classSource,
+
+    ComponentClassCache componentClassCache)
     {
         this.workerChain = workerChain;
         this.loggerSource = loggerSource;

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/ContentTypeExtractor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/ContentTypeExtractor.java?rev=945984&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/ContentTypeExtractor.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/ContentTypeExtractor.java Wed May 19 01:02:39 2010
@@ -0,0 +1,28 @@
+// Copyright 2010 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.tapestry5.internal.services.meta;
+
+import org.apache.tapestry5.MetaDataConstants;
+import org.apache.tapestry5.annotations.ContentType;
+import org.apache.tapestry5.model.MutableComponentModel;
+import org.apache.tapestry5.services.meta.MetaDataExtractor;
+
+public class ContentTypeExtractor implements MetaDataExtractor<ContentType>
+{
+    public void extractMetaData(MutableComponentModel model, ContentType annotation)
+    {
+        model.setMeta(MetaDataConstants.RESPONSE_CONTENT_TYPE, annotation.value());
+    }
+}

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/ContentTypeExtractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaAnnotationExtractor.java (from r945983, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MetaWorker.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaAnnotationExtractor.java?p2=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaAnnotationExtractor.java&p1=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MetaWorker.java&r1=945983&r2=945984&rev=945984&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MetaWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaAnnotationExtractor.java Wed May 19 01:02:39 2010
@@ -1,10 +1,10 @@
-// Copyright 2007 The Apache Software Foundation
+// Copyright 2010 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
+// 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,
@@ -12,28 +12,18 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.transform;
+package org.apache.tapestry5.internal.services.meta;
 
 import org.apache.tapestry5.annotations.Meta;
 import org.apache.tapestry5.internal.KeyValue;
 import org.apache.tapestry5.internal.TapestryInternalUtils;
 import org.apache.tapestry5.model.MutableComponentModel;
-import org.apache.tapestry5.services.ClassTransformation;
-import org.apache.tapestry5.services.ComponentClassTransformWorker;
+import org.apache.tapestry5.services.meta.MetaDataExtractor;
 
-/**
- * Checks for the presence of a {@link Meta} annotation, and adds the data within to the component model.
- */
-public class MetaWorker implements ComponentClassTransformWorker
+public class MetaAnnotationExtractor implements MetaDataExtractor<Meta>
 {
-
-    public void transform(ClassTransformation transformation, MutableComponentModel model)
+    public void extractMetaData(MutableComponentModel model, Meta annotation)
     {
-        Meta annotation = transformation.getAnnotation(Meta.class);
-
-        if (annotation == null)
-            return;
-
         for (String meta : annotation.value())
         {
             KeyValue kv = TapestryInternalUtils.parseKeyValue(meta);

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaAnnotationExtractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaWorkerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaWorkerImpl.java?rev=945984&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaWorkerImpl.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaWorkerImpl.java Wed May 19 01:02:39 2010
@@ -0,0 +1,50 @@
+// Copyright 2010 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.tapestry5.internal.services.meta;
+
+import java.lang.annotation.Annotation;
+import java.util.Map;
+
+import org.apache.tapestry5.model.MutableComponentModel;
+import org.apache.tapestry5.services.ClassTransformation;
+import org.apache.tapestry5.services.meta.MetaDataExtractor;
+import org.apache.tapestry5.services.meta.MetaWorker;
+
+@SuppressWarnings("unchecked")
+public class MetaWorkerImpl implements MetaWorker
+{
+    private final Map<Class, MetaDataExtractor> configuration;
+
+    public MetaWorkerImpl(Map<Class, MetaDataExtractor> configuration)
+    {
+        this.configuration = configuration;
+    }
+
+    public void transform(ClassTransformation transformation, MutableComponentModel model)
+    {
+        for (Class c : configuration.keySet())
+        {
+            Annotation annotation = transformation.getAnnotation(c);
+
+            if (annotation != null)
+            {
+                MetaDataExtractor extractor = configuration.get(c);
+
+                extractor.extractMetaData(model, annotation);
+            }
+        }
+    }
+
+}

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/meta/MetaWorkerImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=945984&r1=945983&r2=945984&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Wed May 19 01:02:39 2010
@@ -37,13 +37,8 @@ import javax.servlet.http.HttpServletRes
 
 import org.apache.tapestry5.*;
 import org.apache.tapestry5.ajax.MultiZoneUpdate;
-import org.apache.tapestry5.annotations.HeartbeatDeferred;
-import org.apache.tapestry5.annotations.PageAttached;
-import org.apache.tapestry5.annotations.PageDetached;
-import org.apache.tapestry5.annotations.PageLoaded;
-import org.apache.tapestry5.annotations.PageReset;
-import org.apache.tapestry5.annotations.Path;
-import org.apache.tapestry5.annotations.Service;
+import org.apache.tapestry5.annotations.*;
+import org.apache.tapestry5.annotations.ContentType;
 import org.apache.tapestry5.beaneditor.Validate;
 import org.apache.tapestry5.corelib.LoopFormState;
 import org.apache.tapestry5.corelib.SubmitMode;
@@ -85,6 +80,9 @@ import org.apache.tapestry5.internal.ser
 import org.apache.tapestry5.internal.services.javascript.JavascriptStackPathConstructor;
 import org.apache.tapestry5.internal.services.javascript.JavascriptStackSourceImpl;
 import org.apache.tapestry5.internal.services.messages.PropertiesFileParserImpl;
+import org.apache.tapestry5.internal.services.meta.ContentTypeExtractor;
+import org.apache.tapestry5.internal.services.meta.MetaAnnotationExtractor;
+import org.apache.tapestry5.internal.services.meta.MetaWorkerImpl;
 import org.apache.tapestry5.internal.transform.*;
 import org.apache.tapestry5.internal.translator.NumericTranslator;
 import org.apache.tapestry5.internal.translator.NumericTranslatorSupport;
@@ -115,6 +113,9 @@ import org.apache.tapestry5.services.jav
 import org.apache.tapestry5.services.javascript.JavascriptSupport;
 import org.apache.tapestry5.services.messages.ComponentMessagesSource;
 import org.apache.tapestry5.services.messages.PropertiesFileParser;
+import org.apache.tapestry5.services.meta.FixedExtractor;
+import org.apache.tapestry5.services.meta.MetaDataExtractor;
+import org.apache.tapestry5.services.meta.MetaWorker;
 import org.apache.tapestry5.util.StringToEnumCoercion;
 import org.apache.tapestry5.validator.Email;
 import org.apache.tapestry5.validator.Max;
@@ -374,6 +375,7 @@ public final class TapestryModule
         binder.bind(AssetPathConstructor.class, AssetPathConstructorImpl.class);
         binder.bind(JavascriptStackSource.class, JavascriptStackSourceImpl.class);
         binder.bind(TranslatorAlternatesSource.class, TranslatorAlternatesSourceImpl.class);
+        binder.bind(MetaWorker.class, MetaWorkerImpl.class);
     }
 
     // ========================================================================
@@ -552,7 +554,7 @@ public final class TapestryModule
      * <dt>SupportsInformalParameters</dt>
      * <dd>Checks for the annotation</dd>
      * <dt>Meta</dt>
-     * <dd>Checks for meta data and adds it to the component model</dd>
+     * <dd>Checks for meta data annotations and adds it to the component model</dd>
      * <dt>ApplicationState</dt>
      * <dd>Converts fields that reference application state objects
      * <dt>UnclaimedField</dt>
@@ -564,10 +566,6 @@ public final class TapestryModule
      * <dt>InvokePostRenderCleanupOnResources</dt>
      * <dd>Makes sure {@link org.apache.tapestry5.internal.InternalComponentResources#postRenderCleanup()} is invoked
      * after a component finishes rendering</dd>
-     * <dt>Secure</dt>
-     * <dd>Checks for the {@link org.apache.tapestry5.annotations.Secure} annotation</dd>
-     * <dt>ContentType</dt>
-     * <dd>Checks for {@link org.apache.tapestry5.annotations.ContentType} annotation</dd>
      * <dt>GenerateAccessors</dt>
      * <dd>Generates accessor methods if {@link org.apache.tapestry5.annotations.Property} annotation is present</dd>
      * <dt>Cached</dt>
@@ -587,17 +585,17 @@ public final class TapestryModule
 
             InjectionProvider injectionProvider,
 
+            MetaWorker metaWorker,
+
             ComponentClassResolver resolver)
     {
         configuration.addInstance("Cached", CachedWorker.class);
 
-        configuration.add("Meta", new MetaWorker());
+        configuration.add("Meta", metaWorker);
 
         configuration.add("Inject", new InjectWorker(locator, injectionProvider));
         configuration.addInstance("InjectService", InjectServiceWorker.class);
 
-        configuration.add("Secure", new SecureWorker());
-
         configuration.add("MixinAfter", new MixinAfterWorker());
         configuration.add("Component", new ComponentWorker(resolver));
         configuration.add("Mixin", new MixinWorker(resolver));
@@ -642,8 +640,6 @@ public final class TapestryModule
 
         configuration.add("InvokePostRenderCleanupOnResources", new InvokePostRenderCleanupOnResourcesWorker());
 
-        configuration.add("ContentType", new ContentTypeWorker());
-
         configuration.add("Property", new PropertyWorker());
 
         // These must come after Property, since they actually delete fields
@@ -1399,6 +1395,7 @@ public final class TapestryModule
      * Allows the exact steps in the component class transformation process to
      * be defined.
      */
+    @Marker(Primary.class)
     public ComponentClassTransformWorker buildComponentClassTransformWorker(
             List<ComponentClassTransformWorker> configuration)
     {
@@ -2896,4 +2893,16 @@ public final class TapestryModule
         configuration.add("AppCatalog", applicationCatalog);
     }
 
+    /**
+     * Contributes ....
+     * 
+     * @since 5.2.0
+     */
+    @SuppressWarnings("unchecked")
+    public static void contributeMetaWorker(MappedConfiguration<Class, MetaDataExtractor> configuration)
+    {
+        configuration.addInstance(Meta.class, MetaAnnotationExtractor.class);
+        configuration.add(Secure.class, new FixedExtractor(MetaDataConstants.SECURE_PAGE));
+        configuration.addInstance(ContentType.class, ContentTypeExtractor.class);
+    }
 }

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/FixedExtractor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/FixedExtractor.java?rev=945984&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/FixedExtractor.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/FixedExtractor.java Wed May 19 01:02:39 2010
@@ -0,0 +1,51 @@
+// Copyright 2010 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.tapestry5.services.meta;
+
+import java.lang.annotation.Annotation;
+
+import org.apache.tapestry5.ioc.internal.util.Defense;
+import org.apache.tapestry5.model.MutableComponentModel;
+
+/**
+ * Implementation of {@link MetaDataExtractor} that is used to set a fixed
+ * value for a fixed meta-data key, when a given annotation is present.
+ * 
+ * @since 5.2.0
+ */
+public class FixedExtractor<T extends Annotation> implements MetaDataExtractor<T>
+{
+    private final String key;
+
+    private final String value;
+
+    /** Defaults the value to "true". */
+    public FixedExtractor(String key)
+    {
+        this(key, "true");
+    }
+
+    public FixedExtractor(String key, String value)
+    {
+        this.key = Defense.notBlank(key, "key");
+        this.value = Defense.notBlank(value, "value");
+    }
+
+    public void extractMetaData(MutableComponentModel model, T annotation)
+    {
+        model.setMeta(key, value);
+    }
+
+}

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/FixedExtractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaDataExtractor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaDataExtractor.java?rev=945984&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaDataExtractor.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaDataExtractor.java Wed May 19 01:02:39 2010
@@ -0,0 +1,43 @@
+// Copyright 2010 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.tapestry5.services.meta;
+
+import java.lang.annotation.Annotation;
+
+import org.apache.tapestry5.model.ComponentModel;
+import org.apache.tapestry5.model.MutableComponentModel;
+import org.apache.tapestry5.services.MetaDataLocator;
+
+/**
+ * Used to extract a {@linkplain ComponentModel#getMeta(String) meta data value} from a component annotation. Instances
+ * of this interface are contributed into the MetaWorker service.
+ * 
+ * @since 5.2.0
+ * @see MetaWorker
+ * @see MetaDataLocator
+ */
+public interface MetaDataExtractor<T extends Annotation>
+{
+    /**
+     * Invoked on the extractor to extract the appropriate value for the annotation and
+     * {@linkplain MutableComponentModel#setMeta(String, String) set the meta data on the model}.
+     * 
+     * @param model
+     *            on which to set meta data
+     * @param annotation
+     *            class annotation, from whose attributes specific data may be extracted
+     */
+    void extractMetaData(MutableComponentModel model, T annotation);
+}

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaDataExtractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaWorker.java?rev=945984&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaWorker.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaWorker.java Wed May 19 01:02:39 2010
@@ -0,0 +1,32 @@
+// Copyright 2010 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.tapestry5.services.meta;
+
+import org.apache.tapestry5.ioc.annotations.UsesMappedConfiguration;
+import org.apache.tapestry5.services.ComponentClassTransformWorker;
+
+/**
+ * Service that makes it easy to identify a class annotation and use its presence, or the value of an attribute,
+ * to set a meta-data key. The configuration map class annotation types to corresponding extractors who will be invoked
+ * when the annotation is present. Most commonly, a {@link FixedExtractor} is used to set a fixed value to a fixed key,
+ * triggered by the presence of the corresponding annotation.
+ * 
+ * @since 5.2.0
+ */
+@UsesMappedConfiguration(key = Class.class, value = MetaDataExtractor.class)
+public interface MetaWorker extends ComponentClassTransformWorker
+{
+
+}

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/meta/MetaWorker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml?rev=945984&r1=945983&r2=945984&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml Wed May 19 01:02:39 2010
@@ -39,7 +39,9 @@
       <package name="org.apache.tapestry5.internal.model"/>
       <package name="org.apache.tapestry5.internal.pageload"/>
       <package name="org.apache.tapestry5.internal.services"/>
+      <package name="org.apache.tapestry5.internal.services.assets"/>
       <package name="org.apache.tapestry5.internal.services.messages"/>
+      <package name="org.apache.tapestry5.internal.services.meta"/>
       <package name="org.apache.tapestry5.internal.structure"/>
       <package name="org.apache.tapestry5.internal.test"/>
       <package name="org.apache.tapestry5.internal.transform"/>
@@ -49,10 +51,10 @@
     </packages>
   </test>
 
-<!--    We break these out by which of the test applications they apply to. We have a bunch. -->
+  <!--    We break these out by which of the test applications they apply to. We have a bunch. -->
   <test name="Core Integration Tests" enabled="true">
     <parameter name="tapestry.web-app-folder" value="src/test/app1"/>
-    
+
     <packages>
       <package name="org.apache.tapestry5.integration.app1"/>
     </packages>
@@ -60,10 +62,10 @@
       <class name="org.apache.tapestry5.test.SeleniumLauncher"/>
     </classes>
   </test>
-  
+
   <test name="Additional Integration Tests" enabled="true">
     <parameter name="tapestry.web-app-folder" value="src/test/app3"/>
-    
+
     <packages>
       <package name="org.apache.tapestry5.integration.app3"/>
     </packages>
@@ -71,7 +73,7 @@
       <class name="org.apache.tapestry5.test.SeleniumLauncher"/>
     </classes>
   </test>
-  
+
   <test name="Immediate Mode Integration Tests" enabled="true">
     <parameter name="tapestry.web-app-folder" value="src/test/app4"/>
 
@@ -85,7 +87,7 @@
 
   <test name="URL Rewriter Tests" enabled="true">
     <parameter name="tapestry.web-app-folder" value="src/test/app5"/>
-    
+
     <packages>
       <package name="org.apache.tapestry5.urlrewriter"/>
     </packages>
@@ -102,7 +104,7 @@
       <class name="org.apache.tapestry5.test.SeleniumLauncher"/>
     </classes>
   </test>
-  
+
   <test name="PageTester Tests" enabled="true">
     <packages>
       <package name="org.apache.tapestry5.integration.pagetester"/>

Copied: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/meta/MetaWorkerTest.java (from r945983, tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/MetaWorkerTest.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/meta/MetaWorkerTest.java?p2=tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/meta/MetaWorkerTest.java&p1=tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/MetaWorkerTest.java&r1=945983&r2=945984&rev=945984&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/MetaWorkerTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/meta/MetaWorkerTest.java Wed May 19 01:02:39 2010
@@ -1,10 +1,10 @@
-// Copyright 2007, 2008 The Apache Software Foundation
+// Copyright 2007, 2008, 2010 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
+// 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,
@@ -12,49 +12,31 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.transform;
+package org.apache.tapestry5.internal.services.meta;
 
 import org.apache.tapestry5.annotations.Meta;
+import org.apache.tapestry5.internal.services.meta.MetaAnnotationExtractor;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
 import org.apache.tapestry5.model.MutableComponentModel;
-import org.apache.tapestry5.services.ClassTransformation;
 import org.testng.annotations.Test;
 
 public class MetaWorkerTest extends InternalBaseTestCase
 {
     @Test
-    public void no_annotation()
-    {
-        ClassTransformation ct = mockClassTransformation();
-        MutableComponentModel model = mockMutableComponentModel();
-
-        train_getAnnotation(ct, Meta.class, null);
-
-        replay();
-
-        new MetaWorker().transform(ct, model);
-
-        verify();
-    }
-
-    @Test
     public void has_meta_data()
     {
-        ClassTransformation ct = mockClassTransformation();
         MutableComponentModel model = mockMutableComponentModel();
         Meta annotation = newMock(Meta.class);
 
-        train_getAnnotation(ct, Meta.class, annotation);
-
         expect(annotation.value()).andReturn(new String[]
-                { "foo=bar", "baz=biff" });
+        { "foo=bar", "baz=biff" });
 
         model.setMeta("foo", "bar");
         model.setMeta("baz", "biff");
 
         replay();
 
-        new MetaWorker().transform(ct, model);
+        new MetaAnnotationExtractor().extractMetaData(model, annotation);
 
         verify();
     }

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/meta/MetaWorkerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native