Re: session-less forms

2008-04-13 Thread nicholas Krul
the @Meta("tapestry.persistence-strategy=X") works beautifully... no more
sessions till logged in.


On Mon, Apr 7, 2008 at 7:14 PM, Robert Zeigler <[EMAIL PROTECTED]> wrote:

>
> On Apr 7, 2008, at 4/712:53 PM , Fernando Padilla wrote:
>
> > so.. the "client" strategy stores it in a cookie?
> >
> >
> Client strategy stores it in the url.
> Not sure how that would play out for myspace, etc.
>
> Robert
>
>
>
>  Yeah, I don't really have access to those either :)
> >
> > ps - This is for integration with GoogleGadgets/OpenSocial/MySpace/Hi5.
> >  So it's basically a portlet hosted on a different site.  And the requests
> > to my server are being proxied by MySpace/Hi5 so we don't have access to
> > cookies from the client side..
> >
> > pps - I am using Zones and Form/Zones, so I'm rendering on the same
> > request as the submit, and at first glance that seems to be working.  I just
> > wanted to make sure "persist"/"session" requirement wasn't going to bite me
> > later..
> >
> > ppps - So if we're doing the render on the same request as submit, we
> > don't really have to store the Validation object in the session right?
> >
> > Howard Lewis Ship wrote:
> >
> > > The approach I would take would be to configure the Form to store its
> > > persistent fields on the client, rather than in the Session.
> > > On your PAGE, you can add a @Meta annotation for this:
> > > @Meta("tapestry.persistence-strategy=client")
> > > public class MyPage { ...
> > > This sets the default persistence strategy for the entire page to be
> > > "client".  Since in most cases, @Persist is used without a specific
> > > strategy, even nested components (such as Form) will inherit a default
> > > persistent strategy from their container.
> > > I haven't tried this yet myself ... give it a try and report back!
> > > On Mon, Apr 7, 2008 at 5:05 AM, Peter Stavrinides
> > > <[EMAIL PROTECTED]> wrote:
> > >
> > > > If I understand correctly you need to pass data completely
> > > > independent of
> > > > session state... then your options are hidden form fields, and or
> > > > URL
> > > > parameters. Of course then you would have to reinitialize your
> > > > properties
> > > > manually after posting, which is not such big a deal!
> > > >
> > > >
> > > >
> > > > Fernando Padilla wrote:
> > > >
> > > >  I have a requirement to not depend on HttpSession, but the Form
> > > > > component
> > > > >
> > > > has a @Persist field that Tapestry wants to store in a session.
> > > >  What are
> > > > some options to avoid this?
> > > >
> > > > >
> > > > >
> > > > > -
> > > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > > >
> > > > >
> > > > > -
> > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > >
> > > >
> > > >
> > -
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
>
>
> -
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>


Re: session-less forms

2008-04-07 Thread Robert Zeigler


On Apr 7, 2008, at 4/712:53 PM , Fernando Padilla wrote:

so.. the "client" strategy stores it in a cookie?



Client strategy stores it in the url.
Not sure how that would play out for myspace, etc.

Robert



Yeah, I don't really have access to those either :)

ps - This is for integration with GoogleGadgets/OpenSocial/MySpace/ 
Hi5.  So it's basically a portlet hosted on a different site.  And  
the requests to my server are being proxied by MySpace/Hi5 so we  
don't have access to cookies from the client side..


pps - I am using Zones and Form/Zones, so I'm rendering on the same  
request as the submit, and at first glance that seems to be  
working.  I just wanted to make sure "persist"/"session" requirement  
wasn't going to bite me later..


ppps - So if we're doing the render on the same request as submit,  
we don't really have to store the Validation object in the session  
right?


Howard Lewis Ship wrote:

The approach I would take would be to configure the Form to store its
persistent fields on the client, rather than in the Session.
On your PAGE, you can add a @Meta annotation for this:
@Meta("tapestry.persistence-strategy=client")
public class MyPage { ...
This sets the default persistence strategy for the entire page to be
"client".  Since in most cases, @Persist is used without a specific
strategy, even nested components (such as Form) will inherit a  
default

persistent strategy from their container.
I haven't tried this yet myself ... give it a try and report back!
On Mon, Apr 7, 2008 at 5:05 AM, Peter Stavrinides
<[EMAIL PROTECTED]> wrote:
If I understand correctly you need to pass data completely  
independent of
session state... then your options are hidden form fields, and or  
URL
parameters. Of course then you would have to reinitialize your  
properties

manually after posting, which is not such big a deal!



Fernando Padilla wrote:

I have a requirement to not depend on HttpSession, but the Form  
component
has a @Persist field that Tapestry wants to store in a session.   
What are

some options to avoid this?


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



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




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



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



Re: session-less forms

2008-04-07 Thread Fernando Padilla

so.. the "client" strategy stores it in a cookie?

Yeah, I don't really have access to those either :)

ps - This is for integration with GoogleGadgets/OpenSocial/MySpace/Hi5. 
 So it's basically a portlet hosted on a different site.  And the 
requests to my server are being proxied by MySpace/Hi5 so we don't have 
access to cookies from the client side..


pps - I am using Zones and Form/Zones, so I'm rendering on the same 
request as the submit, and at first glance that seems to be working.  I 
just wanted to make sure "persist"/"session" requirement wasn't going to 
bite me later..


ppps - So if we're doing the render on the same request as submit, we 
don't really have to store the Validation object in the session right?


Howard Lewis Ship wrote:

The approach I would take would be to configure the Form to store its
persistent fields on the client, rather than in the Session.

On your PAGE, you can add a @Meta annotation for this:

@Meta("tapestry.persistence-strategy=client")
public class MyPage { ...

This sets the default persistence strategy for the entire page to be
"client".  Since in most cases, @Persist is used without a specific
strategy, even nested components (such as Form) will inherit a default
persistent strategy from their container.

I haven't tried this yet myself ... give it a try and report back!

On Mon, Apr 7, 2008 at 5:05 AM, Peter Stavrinides
<[EMAIL PROTECTED]> wrote:

If I understand correctly you need to pass data completely independent of
session state... then your options are hidden form fields, and or URL
parameters. Of course then you would have to reinitialize your properties
manually after posting, which is not such big a deal!



 Fernando Padilla wrote:


I have a requirement to not depend on HttpSession, but the Form component

has a @Persist field that Tapestry wants to store in a session.  What are
some options to avoid this?


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



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








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



Re: session-less forms

2008-04-07 Thread Howard Lewis Ship
The approach I would take would be to configure the Form to store its
persistent fields on the client, rather than in the Session.

On your PAGE, you can add a @Meta annotation for this:

@Meta("tapestry.persistence-strategy=client")
public class MyPage { ...

This sets the default persistence strategy for the entire page to be
"client".  Since in most cases, @Persist is used without a specific
strategy, even nested components (such as Form) will inherit a default
persistent strategy from their container.

I haven't tried this yet myself ... give it a try and report back!

On Mon, Apr 7, 2008 at 5:05 AM, Peter Stavrinides
<[EMAIL PROTECTED]> wrote:
> If I understand correctly you need to pass data completely independent of
> session state... then your options are hidden form fields, and or URL
> parameters. Of course then you would have to reinitialize your properties
> manually after posting, which is not such big a deal!
>
>
>
>  Fernando Padilla wrote:
>
> > I have a requirement to not depend on HttpSession, but the Form component
> has a @Persist field that Tapestry wants to store in a session.  What are
> some options to avoid this?
> >
> >
> > -
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
>  -
>  To unsubscribe, e-mail: [EMAIL PROTECTED]
>  For additional commands, e-mail: [EMAIL PROTECTED]
>
>



-- 
Howard M. Lewis Ship

Creator Apache Tapestry and Apache HiveMind

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



Re: session-less forms

2008-04-07 Thread Peter Stavrinides
If I understand correctly you need to pass data completely independent 
of session state... then your options are hidden form fields, and or URL 
parameters. Of course then you would have to reinitialize your 
properties manually after posting, which is not such big a deal!


Fernando Padilla wrote:
I have a requirement to not depend on HttpSession, but the Form 
component has a @Persist field that Tapestry wants to store in a 
session.  What are some options to avoid this?



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



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



Re: session-less forms

2008-04-06 Thread Josh Canfield
I have a requirement to not depend on HttpSession, but the Form  
component has a @Persist field that Tapestry wants to store in a  
session.  What are some options to avoid this?



I may have posted this before, but here it is again. I think it's a  
pretty good solution.


I created a session persistence strategy that only stores non-null  
values, and extended the Form to only store the validation if there  
are errors... The changes to the existing classes are minor.


Here's the code.

import org.apache.tapestry.ValidationTracker;
import org.apache.tapestry.ValidationTrackerImpl;
import org.apache.tapestry.annotations.Persist;

/**
 * Overrides the core [EMAIL PROTECTED]  
org.apache.tapestry.corelib.components.Form} in order to store the  
validation tracker only

 * when there is something to track.
 * 
 * Created by IntelliJ IDEA.
 * User: joshcanfield
 * Date: Oct 26, 2007
 */
public class Form extends org.apache.tapestry.corelib.components.Form {
@Persist("nonnull")
private ValidationTracker _tracker;

private ValidationTracker _nonPersistedTracker;

public ValidationTracker getDefaultTracker() {
if (_nonPersistedTracker == null) {
if (_tracker != null) {
// _tracker is loaded via injection magic when it's  
in the session

_nonPersistedTracker = _tracker;
} else {
_nonPersistedTracker = new ValidationTrackerImpl();
}
}
return _nonPersistedTracker;
}

public void setDefaultTracker(ValidationTracker defaultTracker) {
_nonPersistedTracker = defaultTracker;
}

protected void onAction() {
if (_nonPersistedTracker.getHasErrors()) {
_tracker = _nonPersistedTracker;
} else {
_tracker = null;
}
}

}


import org.apache.tapestry.internal.services.PersistentFieldChangeImpl;
import static  
org.apache.tapestry.ioc.internal.util.CollectionFactory.newList;

import static org.apache.tapestry.ioc.internal.util.Defense.notBlank;
import org.apache.tapestry.services.PersistentFieldChange;
import org.apache.tapestry.services.PersistentFieldStrategy;
import org.apache.tapestry.services.Request;
import org.apache.tapestry.services.Session;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: joshcanfield
 * Date: Oct 26, 2007
 */
public class NonNullSessionPersistentFieldStrategy implements  
PersistentFieldStrategy {

/**
 * Prefix used to identify keys stored in the session.
 */
static final String PREFIX = "nonnull:";

private final Request _request;

protected NonNullSessionPersistentFieldStrategy(Request request) {
_request = request;
}

public final Collection  
gatherFieldChanges(String pageName) {

Session session = _request.getSession(false);

if (session == null) return Collections.emptyList();

List result = newList();

String fullPrefix = PREFIX + pageName + ":";

for (String name : session.getAttributeNames(fullPrefix)) {
PersistentFieldChange change = buildChange(name,  
session.getAttribute(name));


result.add(change);
}

return result;
}

public void discardChanges(String pageName) {
Session session = _request.getSession(false);

if (session == null) return;

String fullPrefix = PREFIX + pageName + ":";

for (String name : session.getAttributeNames(fullPrefix)) {
session.setAttribute(name, null);
}
}

private PersistentFieldChange buildChange(String name, Object  
attribute) {
// TODO: Regexp is probably too expensive for what we need  
here. Maybe an IOC InternalUtils

// method for this purpose?

String[] chunks = name.split(":");

// Will be empty string for the root component
String componentId = chunks[2];
String fieldName = chunks[3];

return new PersistentFieldChangeImpl(componentId, fieldName,  
attribute);

}

public final void postChange(String pageName, String componentId,  
String fieldName, Object newValue) {

notBlank(pageName, "pageName");
notBlank(fieldName, "fieldName");
StringBuilder builder = new StringBuilder(PREFIX);
builder.append(pageName);
builder.append(':');

if (componentId != null) builder.append(componentId);

builder.append(':');
builder.append(fieldName);
// because we don't want to create a session when the object  
is null

Session session = _request.getSession(newValue != null);
if (session != null) {
session.setAttribute(builder.toString(), newValue);
}
}

}

Add this to your app module:

public void contributePersistentFieldManager(
MappedConfiguration  
configuration, Request request) {
configuration.add("nonnull",

session-less forms

2008-04-06 Thread Fernando Padilla
I have a requirement to not depend on HttpSession, but the Form 
component has a @Persist field that Tapestry wants to store in a 
session.  What are some options to avoid this?



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