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/02/19 19:54:16 UTC
svn commit: r911929 - in
/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5:
internal/transform/SessionAttributeWorker.java services/TapestryModule.java
Author: hlship
Date: Fri Feb 19 18:54:16 2010
New Revision: 911929
URL: http://svn.apache.org/viewvc?rev=911929&view=rev
Log:
Rewrite SessionAttributeWorker to use a FieldValueConduit
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/SessionAttributeWorker.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
Modified: 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=911929&r1=911928&r2=911929&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/SessionAttributeWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/SessionAttributeWorker.java Fri Feb 19 18:54:16 2010
@@ -4,7 +4,7 @@
// 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,
@@ -14,91 +14,75 @@
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.ioc.services.FieldValueConduit;
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;
+import org.apache.tapestry5.services.TransformField;
/**
* 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)}.
+ * fields into calls to the {@link Session#getAttribute(String)} and {@link Session#setAttribute(String, Object)}.
*/
public class SessionAttributeWorker implements ComponentClassTransformWorker
{
- private final ObjectLocator objectLocator;
+ private final Request request;
- public SessionAttributeWorker(ObjectLocator objectLocator)
+ private class SessionKeyConduit implements FieldValueConduit
{
- this.objectLocator = objectLocator;
- }
+ private final String key;
- public void transform(ClassTransformation transformation, MutableComponentModel model)
- {
- List<String> names = transformation.findFieldsWithAnnotation(SessionAttribute.class);
-
- for (String fieldName : names)
+ public SessionKeyConduit(String key)
{
- SessionAttribute annotation = transformation.getFieldAnnotation(fieldName,
- SessionAttribute.class);
-
- String sessionKey = annotation.value();
-
- if ("".equals(sessionKey))
- {
- sessionKey = fieldName;
- }
-
- String fieldType = transformation.getFieldType(fieldName);
+ this.key = key;
+ }
- Request request = objectLocator.getService(Request.class);
+ private Session getSession()
+ {
+ return request.getSession(true);
+ }
- String requestField = transformation.addInjectedField(Request.class, "_request",
- request);
+ public Object get()
+ {
+ // TODO: caching, and not creating the session unnecessarily
+ return getSession().getAttribute(key);
+ }
- replaceReadAccess(transformation, fieldName, fieldType, sessionKey, requestField);
- replaceWriteAccess(transformation, fieldName, fieldType, sessionKey, requestField);
+ public void set(Object newValue)
+ {
+ getSession().setAttribute(key, newValue);
}
}
- private void replaceReadAccess(ClassTransformation transformation, String fieldName,
- String fieldType, String sessionKey, String requestField)
+ public SessionAttributeWorker(Request request)
{
- 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);
+ this.request = request;
}
- private void replaceWriteAccess(ClassTransformation transformation, String fieldName,
- String fieldType, String sessionKey, String requestField)
+ public void transform(ClassTransformation transformation, MutableComponentModel model)
{
- String writeMethodName = transformation.newMemberName("write", fieldName);
+ for (TransformField field : transformation.matchFieldsWithAnnotation(SessionAttribute.class))
+ {
+ convertFieldToSessionAccess(field);
+ }
+ }
- TransformMethodSignature writeSignature = new TransformMethodSignature(Modifier.PRIVATE,
- "void", writeMethodName, new String[]
- { fieldType }, null);
+ private void convertFieldToSessionAccess(TransformField field)
+ {
+ SessionAttribute annotation = field.getAnnotation(SessionAttribute.class);
- String body = String.format("%s.getSession(true).setAttribute(\"%s\", $1);", requestField,
- sessionKey);
+ field.claim(annotation);
- transformation.addMethod(writeSignature, body);
- transformation.replaceWriteAccess(fieldName, writeMethodName);
+ String key = determineSessionKey(field, annotation.value());
+ field.replaceAccess(new SessionKeyConduit(key));
}
+ private String determineSessionKey(TransformField field, String value)
+ {
+ return value.equals("") ? field.getName() : value;
+ }
}
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=911929&r1=911928&r2=911929&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 Fri Feb 19 18:54:16 2010
@@ -582,7 +582,7 @@
add(configuration, PageDetached.class, TransformConstants.CONTAINING_PAGE_DID_DETACH_SIGNATURE, "pageDetached");
configuration.add("Retain", new RetainWorker());
- configuration.addInstance("Persist", PersistWorker.class);
+ configuration.addInstance("Persist", PersistWorker.class);
configuration.addInstance("IncludeStylesheet", IncludeStylesheetWorker.class, "after:SetupRender");
configuration
@@ -611,7 +611,7 @@
configuration.add("PageActivationContext", new PageActivationContextWorker(), "before:OnEvent");
- configuration.add("SessionAttribute", new SessionAttributeWorker(locator));
+ configuration.addInstance("SessionAttribute", SessionAttributeWorker.class);
}
/**