Ok, I'll take the option "before:OnEvent" cause the
PageActivationContextWorker is already implemented without an advice. I'll
also add the mentioned integration test to prove that no conflicts exist. We
can rewrite it using the ComponentMethodAdvice if some problems will occur.
On Mon, Jun 16, 2008 at 7:07 PM, Howard Lewis Ship <[EMAIL PROTECTED]> wrote:
> 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]
>
>
--
Best regards,
Igor Drobiazko