If the method does not exist when OnEventWorker executes, it won't be
considered; in that case "before:OnEvent" makes sense.

If using ComponentMethodAdvice, then the PageActivationContextWorker
should come after OnEvent, since it wants to advise the method created
by OnEventWorker.

On Wed, Jun 11, 2008 at 3:36 PM, Igor Drobiazko
<[EMAIL PROTECTED]> wrote:
> According to the javadocs ClassTransformation#addTransformedMethod replaces
> the existing method with the same signature. In seems to be unimportent
> whether befor:OnEvent or after:OnEvent is used for PageActivationContext. I
> have an integration test which proves this:
>
> public class MusicDetails2
> {
>    @Property
>    @PageActivationContext
>    private Track track;
>
>    void onActivate(Track track)
>    {
>        throw new RuntimeException("onActivate invoked");
>    }
> }
>
> Relying on this integration test I assume that the generated method doesn't
> conflict with an existing one.
>
>
>
> On Wed, Jun 11, 2008 at 12:20 AM, Howard Lewis Ship <[EMAIL PROTECTED]>
> wrote:
>
>> Most of this looks good ... but I have one issue.
>>
>> public class PageActivationContextWorker implements
>> ComponentClassTransformWorker
>> {
>>    public void transform(ClassTransformation transformation,
>> MutableComponentModel model)
>>    {
>>        List<String> fields =
>> transformation.findFieldsWithAnnotation(PageActivationContext.class);
>>
>>        if(fields.size()>1)
>>            throw new
>>
>> RuntimeException(TransformMessages.illegalNumberOfPageActivationContextHandlers(fields));
>>
>>        for (String fieldName : fields)
>>        {
>>            PageActivationContext annotation =
>> transformation.getFieldAnnotation(fieldName,
>> PageActivationContext.class);
>>
>>            String fieldType = transformation.getFieldType(fieldName);
>>
>>            if (annotation.activate())
>>            {
>>                TransformMethodSignature activate
>>                        = new
>> TransformMethodSignature(Modifier.PROTECTED | Modifier.FINAL, "void",
>>                                                       "onActivate",
>>                                                       new String[] {
>> fieldType }, null);
>>                transformation.addTransformedMethod(activate,
>> fieldName + " = $1;");
>>            }
>>
>>            if (annotation.passivate())
>>            {
>>                TransformMethodSignature passivate
>>                        = new
>> TransformMethodSignature(Modifier.PROTECTED | Modifier.FINAL,
>> "java.lang.Object", "onPassivate",
>>                                                null, null);
>>                transformation.addTransformedMethod(passivate, "return
>> "+fieldName + ";");
>>            }
>>        }
>>
>>    }
>> }
>>
>> This approach is to create a new method and I'm concerned that the new
>> method could conflict with an existing method.  I suppose that's not a
>> likely case, as you would use the annotation instead of writing
>> onActivate() onPassivate().
>>
>> I had originally envisioned this as being ComponentMethodAdvice on the
>> dispatchComponentEvent() method.
>>
>> Also this change is troubling:
>>
>>       configuration.add("PageActivationContext", new
>> PageActivationContextWorker(), "before:*");
>>
>> I think this needs to come before OnEvent (as currently coded).
>> Implemented using method advice, this would come after OnEvent.  Using
>> before:* or after:* is dangerous, as only one item in the
>> configuration is allowed to be first or be last.
>>
>> Otherwise, looks really solid, very cool!
>>
>>
>> On Tue, Jun 10, 2008 at 2:31 PM,  <[EMAIL PROTECTED]> wrote:
>> > Author: drobiazko
>> > Date: Tue Jun 10 14:31:25 2008
>> > New Revision: 666333
>> >
>> > URL: http://svn.apache.org/viewvc?rev=666333&view=rev
>> > Log:
>> > TAPESTRY-2235: Annotation for managing a property as the page activation
>> context
>> >
>> > Added:
>> >
>>  
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/PageActivationContext.java
>> >
>>  
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageActivationContextWorker.java
>> >
>>  tapestry/tapestry5/trunk/tapestry-core/src/test/app1/music/MusicDetails2.tml
>> >
>>  
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/music/MusicDetails2.java
>> >
>>  
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/PageActivationContextWorkerTest.java
>> > Modified:
>> >
>>  
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Path.java
>> >
>>  
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Service.java
>> >
>>  
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/TransformMessages.java
>> >
>>  
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
>> >
>>  
>> tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/internal/transform/TransformStrings.properties
>> >    tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Music.tml
>> >
>>  
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java
>> >    tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt
>> >
>> > Added:
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/PageActivationContext.java
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/PageActivationContext.java?rev=666333&view=auto
>> >
>> ==============================================================================
>> > ---
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/PageActivationContext.java
>> (added)
>> > +++
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/PageActivationContext.java
>> Tue Jun 10 14:31:25 2008
>> > @@ -0,0 +1,37 @@
>> > +// Copyright 2008 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.annotations;
>> > +
>> > +import java.lang.annotation.Documented;
>> > +import static java.lang.annotation.ElementType.FIELD;
>> > +import java.lang.annotation.Retention;
>> > +import static java.lang.annotation.RetentionPolicy.RUNTIME;
>> > +import java.lang.annotation.Target;
>> > +
>> > +/**
>> > + * Annotation for a field for which the page activation context handlers
>> (onActivate and onPassivate) should be created.
>> > + * In order to use this annotation you must contribute a [EMAIL PROTECTED]
>> ValueEncoder} for the class of the annotated property.
>> > + */
>> > [EMAIL PROTECTED](FIELD)
>> > [EMAIL PROTECTED]
>> > [EMAIL PROTECTED](RUNTIME)
>> > +public @interface PageActivationContext
>> > +{
>> > +    /** Whether to create an activate event handler.  */
>> > +    boolean activate() default true;
>> > +
>> > +    /** Whether to create a passivate event handler  */
>> > +    boolean passivate() default true;
>> > +}
>> >
>> > Modified:
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Path.java
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Path.java?rev=666333&r1=666332&r2=666333&view=diff
>> >
>> ==============================================================================
>> > ---
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Path.java
>> (original)
>> > +++
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Path.java
>> Tue Jun 10 14:31:25 2008
>> > @@ -14,8 +14,6 @@
>> >
>> >  package org.apache.tapestry5.annotations;
>> >
>> > -import org.apache.tapestry5.Asset;
>> > -import org.apache.tapestry5.ioc.annotations.Inject;
>> >
>> >  import java.lang.annotation.Documented;
>> >  import static java.lang.annotation.ElementType.FIELD;
>> >
>> > Modified:
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Service.java
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Service.java?rev=666333&r1=666332&r2=666333&view=diff
>> >
>> ==============================================================================
>> > ---
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Service.java
>> (original)
>> > +++
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/Service.java
>> Tue Jun 10 14:31:25 2008
>> > @@ -14,7 +14,6 @@
>> >
>> >  package org.apache.tapestry5.annotations;
>> >
>> > -import org.apache.tapestry5.ioc.annotations.Inject;
>> >
>> >  import java.lang.annotation.Documented;
>> >  import static java.lang.annotation.ElementType.FIELD;
>> >
>> > Added:
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageActivationContextWorker.java
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageActivationContextWorker.java?rev=666333&view=auto
>> >
>> ==============================================================================
>> > ---
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageActivationContextWorker.java
>> (added)
>> > +++
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageActivationContextWorker.java
>> Tue Jun 10 14:31:25 2008
>> > @@ -0,0 +1,65 @@
>> > +// Copyright 2008 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.transform;
>> > +
>> > +import java.lang.reflect.Modifier;
>> > +import java.util.List;
>> > +
>> > +import org.apache.tapestry5.annotations.PageActivationContext;
>> > +import org.apache.tapestry5.model.MutableComponentModel;
>> > +import org.apache.tapestry5.services.ClassTransformation;
>> > +import org.apache.tapestry5.services.ComponentClassTransformWorker;
>> > +import org.apache.tapestry5.services.TransformMethodSignature;
>> > +
>> > +/**
>> > + * Provides the page activation context handlers.
>> > + *
>> > + * @see org.apache.tapestry5.annotations.PageActivationContext
>> > + */
>> > +public class PageActivationContextWorker implements
>> ComponentClassTransformWorker
>> > +{
>> > +    public void transform(ClassTransformation transformation,
>> MutableComponentModel model)
>> > +    {
>> > +        List<String> fields =
>> transformation.findFieldsWithAnnotation(PageActivationContext.class);
>> > +
>> > +        if(fields.size()>1)
>> > +            throw new
>> RuntimeException(TransformMessages.illegalNumberOfPageActivationContextHandlers(fields));
>> > +
>> > +        for (String fieldName : fields)
>> > +        {
>> > +            PageActivationContext annotation =
>> transformation.getFieldAnnotation(fieldName, PageActivationContext.class);
>> > +
>> > +            String fieldType = transformation.getFieldType(fieldName);
>> > +
>> > +            if (annotation.activate())
>> > +            {
>> > +                TransformMethodSignature activate
>> > +                        = new
>> TransformMethodSignature(Modifier.PROTECTED | Modifier.FINAL, "void",
>> > +                                                       "onActivate",
>> > +                                                       new String[] {
>> fieldType }, null);
>> > +                transformation.addTransformedMethod(activate, fieldName
>> + " = $1;");
>> > +            }
>> > +
>> > +            if (annotation.passivate())
>> > +            {
>> > +                TransformMethodSignature passivate
>> > +                        = new
>> TransformMethodSignature(Modifier.PROTECTED | Modifier.FINAL,
>> "java.lang.Object", "onPassivate",
>> > +                                               null, null);
>> > +                transformation.addTransformedMethod(passivate, "return
>> "+fieldName + ";");
>> > +            }
>> > +        }
>> > +
>> > +    }
>> > +}
>> >
>> > Modified:
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/TransformMessages.java
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/TransformMessages.java?rev=666333&r1=666332&r2=666333&view=diff
>> >
>> ==============================================================================
>> > ---
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/TransformMessages.java
>> (original)
>> > +++
>> tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/TransformMessages.java
>> Tue Jun 10 14:31:25 2008
>> > @@ -14,7 +14,10 @@
>> >
>> >  package org.apache.tapestry5.internal.transform;
>> >
>> > +import java.util.List;
>> > +
>> >  import org.apache.tapestry5.ioc.Messages;
>> > +import org.apache.tapestry5.ioc.internal.util.InternalUtils;
>> >  import org.apache.tapestry5.ioc.internal.util.MessagesImpl;
>> >  import org.apache.tapestry5.runtime.Component;
>> >  import org.apache.tapestry5.services.TransformMethodSignature;
>> > @@ -43,4 +46,9 @@
>> >     {
>> >         return MESSAGES.format("cached-no-parameters", method);
>> >     }
>> > +
>> > +    static String
>> illegalNumberOfPageActivationContextHandlers(List<String> fields)
>> > +    {
>> > +        return
>> MESSAGES.format("illegal-number-of-page-activation-context-handlers",
>> InternalUtils.joinSorted(fields));
>> > +    }
>> >  }
>> >
>> > 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=666333&r1=666332&r2=666333&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
>> Tue Jun 10 14:31:25 2008
>> > @@ -380,6 +380,8 @@
>> >         // be converted to clear out at the end of the request.
>> >
>> >         configuration.add("UnclaimedField", new UnclaimedFieldWorker(),
>> "after:*");
>> > +
>> > +        configuration.add("PageActivationContext", new
>> PageActivationContextWorker(), "before:*");
>> >     }
>> >
>> >     /**
>> >
>> > Modified:
>> tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/internal/transform/TransformStrings.properties
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/internal/transform/TransformStrings.properties?rev=666333&r1=666332&r2=666333&view=diff
>> >
>> ==============================================================================
>> > ---
>> tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/internal/transform/TransformStrings.properties
>> (original)
>> > +++
>> tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/internal/transform/TransformStrings.properties
>> Tue Jun 10 14:31:25 2008
>> > @@ -16,3 +16,4 @@
>> >  component-not-assignable-to-field=Component %s is not assignable to
>> field %s (of type %s).
>> >  [EMAIL PROTECTED] may only be used with methods that return
>> values: %s
>> >  [EMAIL PROTECTED] cannot be used with methods that accept
>> parameters: %s
>> > +illegal-number-of-page-activation-context-handlers=Illegal number of
>> fields annotated with @PageActivationContext: %s. Only one field is allowed.
>> >
>> > Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Music.tml
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Music.tml?rev=666333&r1=666332&r2=666333&view=diff
>> >
>> ==============================================================================
>> > --- tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Music.tml
>> (original)
>> > +++ tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Music.tml Tue
>> Jun 10 14:31:25 2008
>> > @@ -2,13 +2,16 @@
>> >
>> >     <h1>Music Library</h1>
>> >
>> > -    <t:grid source="tracks" row="track" remove="genre,artist,playcount">
>> > +    <t:grid source="tracks" row="track" remove="genre,artist,playcount"
>> add="titleCopy">
>> >         <t:parameter name="titleCell">
>> >             <t:pagelink page="music/details"
>> context="track">${track.title}</t:pagelink>
>> >         </t:parameter>
>> >         <t:parameter name="ratingcell">
>> >             <t:outputRating rating="track.rating"/>
>> >         </t:parameter>
>> > +        <t:parameter name="titleCopyCell">
>> > +            <t:pagelink page="music/details2"
>> context="track">${track.title} (Copy)</t:pagelink>
>> > +        </t:parameter>
>> >     </t:grid>
>> >
>> >  </html>
>> >
>> > Added:
>> tapestry/tapestry5/trunk/tapestry-core/src/test/app1/music/MusicDetails2.tml
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/music/MusicDetails2.tml?rev=666333&view=auto
>> >
>> ==============================================================================
>> > ---
>> tapestry/tapestry5/trunk/tapestry-core/src/test/app1/music/MusicDetails2.tml
>> (added)
>> > +++
>> tapestry/tapestry5/trunk/tapestry-core/src/test/app1/music/MusicDetails2.tml
>> Tue Jun 10 14:31:25 2008
>> > @@ -0,0 +1,11 @@
>> > +<html t:type="Border" xmlns:t="
>> http://tapestry.apache.org/schema/tapestry_5_0_0.xsd";>
>> > +
>> > +    <h1>Track Details</h1>
>> > +
>> > +    <t:beandisplay object="track"/>
>> > +
>> > +    <p>
>> > +        <t:pagelink page="music">Back to music library</t:pagelink>
>> > +    </p>
>> > +
>> > +</html>
>> >
>> > Modified:
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java?rev=666333&r1=666332&r2=666333&view=diff
>> >
>> ==============================================================================
>> > ---
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java
>> (original)
>> > +++
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java
>> Tue Jun 10 14:31:25 2008
>> > @@ -1823,6 +1823,25 @@
>> >
>> >         assertText("activePageName", "music/Details");
>> >     }
>> > +
>> > +    /**
>> > +     * TAPESTRY-2235
>> > +     */
>> > +    @Test
>> > +    public void generated_activation_context_handlers()
>> > +    {
>> > +        start("Music Page", "69");
>> > +
>> > +        assertText("activePageName", "Music");
>> > +
>> > +        clickAndWait("link=Wake Me Up (Copy)");
>> > +
>> > +        assertText("activePageName", "music/Details2");
>> > +
>> > +        assertText("//[EMAIL PROTECTED]'t-beandisplay-value title']", 
>> > "Wake Me
>> Up");
>> > +
>> > +        assertText("//[EMAIL PROTECTED]'t-beandisplay-value artist']", 
>> > "Norah
>> Jones");
>> > +    }
>> >
>> >     /**
>> >      * TAPESTRY-1869
>> >
>> > Added:
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/music/MusicDetails2.java
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/music/MusicDetails2.java?rev=666333&view=auto
>> >
>> ==============================================================================
>> > ---
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/music/MusicDetails2.java
>> (added)
>> > +++
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/music/MusicDetails2.java
>> Tue Jun 10 14:31:25 2008
>> > @@ -0,0 +1,27 @@
>> > +// Copyright  2008 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.integration.app1.pages.music;
>> > +
>> > +
>> > +import org.apache.tapestry5.annotations.PageActivationContext;
>> > +import org.apache.tapestry5.annotations.Property;
>> > +import org.apache.tapestry5.integration.app1.data.Track;
>> > +
>> > +public class MusicDetails2
>> > +{
>> > +    @Property
>> > +    @PageActivationContext
>> > +    private Track track;
>> > +}
>> >
>> > Added:
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/PageActivationContextWorkerTest.java
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/PageActivationContextWorkerTest.java?rev=666333&view=auto
>> >
>> ==============================================================================
>> > ---
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/PageActivationContextWorkerTest.java
>> (added)
>> > +++
>> tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/PageActivationContextWorkerTest.java
>> Tue Jun 10 14:31:25 2008
>> > @@ -0,0 +1,137 @@
>> > +// Copyright 2008 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.transform;
>> > +
>> > +import java.lang.reflect.Modifier;
>> > +
>> > +import org.apache.tapestry5.annotations.PageActivationContext;
>> > +import org.apache.tapestry5.integration.app1.data.Track;
>> > +import org.apache.tapestry5.model.MutableComponentModel;
>> > +import org.apache.tapestry5.services.ClassTransformation;
>> > +import org.apache.tapestry5.services.ComponentClassTransformWorker;
>> > +import org.apache.tapestry5.services.TransformMethodSignature;
>> > +import org.apache.tapestry5.test.TapestryTestCase;
>> > +import org.testng.annotations.Test;
>> > +
>> > +public class PageActivationContextWorkerTest extends TapestryTestCase {
>> > +
>> > +       private static final String CLASS_NAME = Track.class.getName();
>> > +
>> > +       @Test
>> > +       public void activate_dafault_passivate_false() {
>> > +               ClassTransformation ct = mockClassTransformation();
>> > +               MutableComponentModel model =
>> mockMutableComponentModel();
>> > +               PageActivationContext annotation =
>> newMock(PageActivationContext.class);
>> > +               ComponentClassTransformWorker worker = new
>> PageActivationContextWorker();
>> > +
>> > +               train_findFieldsWithAnnotation(ct,
>> PageActivationContext.class,
>> > +                               "myfield");
>> > +               train_getFieldAnnotation(ct, "myfield",
>> PageActivationContext.class,
>> > +                               annotation);
>> > +               train_getFieldType(ct, "myfield", CLASS_NAME);
>> > +               expect(annotation.activate()).andReturn(true);
>> > +
>> > +               TransformMethodSignature sig = new
>> TransformMethodSignature(
>> > +                               Modifier.PROTECTED | Modifier.FINAL,
>> "void", "onActivate",
>> > +                               new String[] { CLASS_NAME }, null);
>> > +
>> > +               ct.addTransformedMethod(sig, "myfield = $1;");
>> > +
>> > +               expect(annotation.passivate()).andReturn(false);
>> > +
>> > +               replay();
>> > +
>> > +               worker.transform(ct, model);
>> > +
>> > +               verify();
>> > +       }
>> > +
>> > +       @Test
>> > +       public void activate_false_passivate_default() {
>> > +               ClassTransformation ct = mockClassTransformation();
>> > +               MutableComponentModel model =
>> mockMutableComponentModel();
>> > +               PageActivationContext annotation =
>> newMock(PageActivationContext.class);
>> > +               ComponentClassTransformWorker worker = new
>> PageActivationContextWorker();
>> > +
>> > +               train_findFieldsWithAnnotation(ct,
>> PageActivationContext.class,
>> > +                               "myfield");
>> > +               train_getFieldAnnotation(ct, "myfield",
>> PageActivationContext.class,
>> > +                               annotation);
>> > +               train_getFieldType(ct, "myfield", CLASS_NAME);
>> > +               expect(annotation.activate()).andReturn(false);
>> > +
>> > +               expect(annotation.passivate()).andReturn(true);
>> > +
>> > +               TransformMethodSignature sig = new
>> TransformMethodSignature(
>> > +                               Modifier.PROTECTED | Modifier.FINAL,
>> "java.lang.Object",
>> > +                               "onPassivate", null, null);
>> > +
>> > +               ct.addTransformedMethod(sig, "return myfield;");
>> > +
>> > +               replay();
>> > +
>> > +               worker.transform(ct, model);
>> > +
>> > +               verify();
>> > +       }
>> > +
>> > +       @Test
>> > +       public void activate_false_passivate_false() {
>> > +               ClassTransformation ct = mockClassTransformation();
>> > +               MutableComponentModel model =
>> mockMutableComponentModel();
>> > +               PageActivationContext annotation =
>> newMock(PageActivationContext.class);
>> > +               ComponentClassTransformWorker worker = new
>> PageActivationContextWorker();
>> > +
>> > +               train_findFieldsWithAnnotation(ct,
>> PageActivationContext.class,
>> > +                               "myfield");
>> > +               train_getFieldAnnotation(ct, "myfield",
>> PageActivationContext.class,
>> > +                               annotation);
>> > +               train_getFieldType(ct, "myfield", CLASS_NAME);
>> > +               expect(annotation.activate()).andReturn(false);
>> > +
>> > +               expect(annotation.passivate()).andReturn(false);
>> > +
>> > +               replay();
>> > +
>> > +               worker.transform(ct, model);
>> > +
>> > +               verify();
>> > +       }
>> > +
>> > +    @Test
>> > +    public void illegal_number_of_page_activation_context_handlers()
>> > +    {
>> > +        ClassTransformation ct = mockClassTransformation();
>> > +        MutableComponentModel model = mockMutableComponentModel();
>> > +        ComponentClassTransformWorker worker = new
>> PageActivationContextWorker();
>> > +
>> > +        train_findFieldsWithAnnotation(ct, PageActivationContext.class,
>> > +                "myfield", "myfield2");
>> > +
>> > +        replay();
>> > +
>> > +        try
>> > +        {
>> > +            worker.transform(ct, model);
>> > +            fail("did not throw");
>> > +        }catch(RuntimeException e)
>> > +        {
>> > +            e.printStackTrace();
>> > +        }
>> > +
>> > +        verify();
>> > +    }
>> > +
>> > +
>> > +}
>> >
>> > Modified:
>> tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt
>> > URL:
>> http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt?rev=666333&r1=666332&r2=666333&view=diff
>> >
>> ==============================================================================
>> > ---
>> tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt
>> (original)
>> > +++
>> tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt Tue
>> Jun 10 14:31:25 2008
>> > @@ -36,6 +36,23 @@
>> >
>> >   Accessing the page as <</viewperson/152>> would load the Person entity
>> with id 152 and use that as the page context.
>> >
>> > +Using @PageActivationContext
>> > +
>> > +  If you prefer to use annotations, you may let Tapestry generate the
>> page activation context handlers for you.
>> > +  Relying on an existing ValueEncoder for the corresponding property you
>> can use the @PageActivationContext annotation.
>> > +  The disadvantage is that you can't access the handlers in a unit test.
>> > +
>> > +
>> > ++----+
>> > +public class ViewPerson
>> > +{
>> > +  @Property
>> > +  @PageActivationContext
>> > +  private Person person;
>> > +
>> > +}
>> > ++----+
>> > +
>> >  Using @Persist with entities
>> >
>> >   If you wish to persist an entity in the session, you may use the
>> "entity" persistence strategy:
>> >
>> >
>> >
>>
>>
>>
>> --
>> Howard M. Lewis Ship
>>
>> Creator Apache Tapestry and Apache HiveMind
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>
>
> --
> Best regards,
>
> Igor Drobiazko
>



-- 
Howard M. Lewis Ship

Creator Apache Tapestry and Apache HiveMind

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to