Author: drobiazko
Date: Tue Jul 14 22:25:19 2009
New Revision: 794095
URL: http://svn.apache.org/viewvc?rev=794095&view=rev
Log:
TAP5-226: Add annotation @SessionAttribute to map a field to a specific session
attribute
Added:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/SessionAttribute.java
(with props)
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/SessionAttributeWorker.java
(with props)
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/ReadSessionAttribute.java
(with props)
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SessionAttributeDemo.java
(with props)
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/ReadSessionAttribute.tml
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/SessionAttributeDemo.tml
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
Added:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/SessionAttribute.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/SessionAttribute.java?rev=794095&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/SessionAttribute.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/SessionAttribute.java
Tue Jul 14 22:25:19 2009
@@ -0,0 +1,38 @@
+// Copyright 2009 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;
+
+/**
+ * Used to map a property of a page or component to value stored in session.
+ *
+ * @since 5.2.0.0
+ */
+...@target(FIELD)
+...@documented
+...@retention(RUNTIME)
+public @interface SessionAttribute
+{
+
+ /**
+ * Name of a Session-Attribute.
+ */
+ String value() default "";
+}
\ No newline at end of file
Propchange:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/annotations/SessionAttribute.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/SessionAttributeWorker.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/SessionAttributeWorker.java?rev=794095&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/SessionAttributeWorker.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/SessionAttributeWorker.java
Tue Jul 14 22:25:19 2009
@@ -0,0 +1,116 @@
+// Copyright 2009 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.util.List;
+
+import javassist.Modifier;
+
+import org.apache.tapestry5.annotations.SessionAttribute;
+import org.apache.tapestry5.ioc.ObjectLocator;
+import org.apache.tapestry5.model.MutableComponentModel;
+import org.apache.tapestry5.services.ClassTransformation;
+import org.apache.tapestry5.services.ComponentClassTransformWorker;
+import org.apache.tapestry5.services.Request;
+import org.apache.tapestry5.services.Session;
+import org.apache.tapestry5.services.TransformMethodSignature;
+
+
+/**
+ * Looks for the {...@link SessionAttribute} annotation and converts read and
write access on such
+ * fields into calls to the {...@link Session#getAttribute(String)} and
+ * {...@link Session#setAttribute(String, Object)}.
+ *
+ */
+public class SessionAttributeWorker implements ComponentClassTransformWorker
+{
+
+ private ObjectLocator objectLocator;
+
+ public SessionAttributeWorker(ObjectLocator objectLocator)
+ {
+ super();
+ this.objectLocator = objectLocator;
+ }
+
+ public void transform(ClassTransformation transformation,
MutableComponentModel model)
+ {
+ List<String> names =
transformation.findFieldsWithAnnotation(SessionAttribute.class);
+
+ for (String fieldName : names)
+ {
+ SessionAttribute annotation = transformation.getFieldAnnotation(
+ fieldName,
+ SessionAttribute.class);
+
+ String sessionKey = annotation.value();
+
+ if ("".equals(sessionKey))
+ {
+ sessionKey = fieldName;
+ }
+
+ String fieldType = transformation.getFieldType(fieldName);
+
+ Request request = objectLocator.getService(Request.class);
+
+ String requestField = transformation.addInjectedField(
+ Request.class,
+ "_request",
+ request);
+
+ replaceReadAccess(transformation, fieldName, fieldType,
sessionKey, requestField);
+ replaceWriteAccess(transformation, fieldName, fieldType,
sessionKey, requestField);
+ }
+ }
+
+ private void replaceReadAccess(ClassTransformation transformation, String
fieldName,
+ String fieldType, String sessionKey, String requestField)
+ {
+ String readMethodName = transformation.newMemberName("read",
fieldName);
+
+ TransformMethodSignature readMethodSignature = new
TransformMethodSignature(
+ Modifier.PRIVATE, fieldType, readMethodName, null, null);
+
+ String body = String.format(
+ "return (%s) %s.getSession(true).getAttribute(\"%s\");",
+ fieldType,
+ requestField,
+ sessionKey);
+
+ transformation.addMethod(readMethodSignature, body);
+ transformation.replaceReadAccess(fieldName, readMethodName);
+ }
+
+ private void replaceWriteAccess(ClassTransformation transformation, String
fieldName,
+ String fieldType, String sessionKey, String requestField)
+ {
+ String writeMethodName = transformation.newMemberName("write",
fieldName);
+
+ TransformMethodSignature writeSignature = new
TransformMethodSignature(Modifier.PRIVATE,
+ "void", writeMethodName, new String[]
+ { fieldType }, null);
+
+ String body = String.format(
+ "%s.getSession(true).setAttribute(\"%s\", $1);",
+ requestField,
+ sessionKey);
+
+ transformation.addMethod(writeSignature, body);
+ transformation.replaceWriteAccess(fieldName, writeMethodName);
+
+ }
+
+}
Propchange:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/SessionAttributeWorker.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=794095&r1=794094&r2=794095&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 Jul 14 22:25:19 2009
@@ -531,6 +531,8 @@
configuration.add("UnclaimedField", new UnclaimedFieldWorker(),
"after:*");
configuration.add("PageActivationContext", new
PageActivationContextWorker(), "before:OnEvent");
+
+ configuration.add("SessionAttribute", new
SessionAttributeWorker(locator));
}
/**
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=794095&r1=794094&r2=794095&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 Jul 14 22:25:19 2009
@@ -2966,4 +2966,18 @@
assertText("divwithid","Div Content");
}
+
+ @Test
+ public void session_attribute()
+ {
+ start("SessionAttribute Demo");
+
+ assertTextPresent("Foo");
+ assertTextPresent("Bar");
+
+ clickAndWait("link=Read SessionAttribute");
+
+ assertTextPresent("read Foo");
+ assertTextPresent("read Bar");
+ }
}
\ No newline at end of file
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java?rev=794095&r1=794094&r2=794095&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
Tue Jul 14 22:25:19 2009
@@ -355,7 +355,11 @@
new Item("RenderClientIdDemo",
"RenderClientId Mixin",
- "Force render of client-side id of a client element via
the RenderClientId mixin")
+ "Force render of client-side id of a client element via
the RenderClientId mixin"),
+
+ new Item("SessionAttributeDemo",
+ "SessionAttribute Demo",
+ "Annotation to map a field to a specific session
attribute")
);
Added:
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/ReadSessionAttribute.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/ReadSessionAttribute.java?rev=794095&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/ReadSessionAttribute.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/ReadSessionAttribute.java
Tue Jul 14 22:25:19 2009
@@ -0,0 +1,32 @@
+// Copyright 2009 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;
+
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.annotations.SessionAttribute;
+import org.apache.tapestry5.integration.app1.data.Track;
+
+public class ReadSessionAttribute
+{
+
+ @SessionAttribute
+ @Property
+ private Track favoriteTrack;
+
+ @SessionAttribute("track_in_session")
+ @Property
+ private Track anotherTrack;
+
+}
Propchange:
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/ReadSessionAttribute.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SessionAttributeDemo.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SessionAttributeDemo.java?rev=794095&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SessionAttributeDemo.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SessionAttributeDemo.java
Tue Jul 14 22:25:19 2009
@@ -0,0 +1,49 @@
+// Copyright 2009 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;
+
+import org.apache.tapestry5.annotations.SessionAttribute;
+import org.apache.tapestry5.integration.app1.data.Track;
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.services.Request;
+
+public class SessionAttributeDemo
+{
+ @Inject
+ private Request request;
+
+ @SessionAttribute
+ private Track favoriteTrack;
+
+ @SessionAttribute("track_in_session")
+ private Track anotherTrack;
+
+ void onActivate()
+ {
+ favoriteTrack = new Track();
+ favoriteTrack.setTitle("Foo");
+
+ anotherTrack = new Track();
+ anotherTrack.setTitle("Bar");
+ }
+
+ public Track getFavoriteTrack(){
+ return (Track) request.getSession(true).getAttribute("favoriteTrack");
+ }
+
+ public Track getAnotherTrack(){
+ return (Track)
request.getSession(true).getAttribute("track_in_session");
+ }
+}
Propchange:
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SessionAttributeDemo.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/ReadSessionAttribute.tml
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/ReadSessionAttribute.tml?rev=794095&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/ReadSessionAttribute.tml
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/ReadSessionAttribute.tml
Tue Jul 14 22:25:19 2009
@@ -0,0 +1,7 @@
+<html t:type="Border"
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
+ <h1>Read SessionAttribute Demo</h1>
+
+ <p>read ${favoriteTrack.title}</p>
+ <p>read ${anotherTrack.title}</p>
+
+</html>
Added:
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/SessionAttributeDemo.tml
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/SessionAttributeDemo.tml?rev=794095&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/SessionAttributeDemo.tml
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/SessionAttributeDemo.tml
Tue Jul 14 22:25:19 2009
@@ -0,0 +1,9 @@
+<html t:type="Border"
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
+ <h1>@SessionAttribute Demo</h1>
+
+ <p>${favoriteTrack.title}</p>
+ <p>${anotherTrack.title}</p>
+
+ <t:pagelink page="ReadSessionAttribute">Read SessionAttribute</t:pagelink>
+
+</html>