You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Fidel Chavarria <fi...@gmail.com> on 2008/04/16 23:28:08 UTC

Environment services are not stateless ...??

Hi, I 've a list of filter components to make the user experience more
confortable when he is looking at a list of issues in my app. I use Tapestry
radiogroup component technique to enclose those filtters in a FilterGroup
component, It works ..! but it's not stateless. when I login to my
application as another user with a new instance of another web browser (to
avoid browser session ) it keeps all filters applyed from a previous user. 

Environment services are not stateless ...?
How can I avoid this behaviour ..?

public class FilterGroup {

	private FilterContainer container = new FilterContainer() ;
	
	@Inject
	private Environment environment ;
	
	void setupRender() {
		environment.push(FilterContainer.class, container) ;
	}
	
	void afterRender() {
	        environment.pop(FilterContainer.class) ;
	}    

         public void onAction(Object[] ctx) {
		if (container.getActiveFilters().contains((String) ctx[0]))
			container.getActiveFilters().remove(ctx[0]) ;
		else {
			container.getActiveFilters().clear() ;
			container.getActiveFilters().add((String) ctx[0]) ;
		}
	}
	
	public Collection<Filter<BacklogItem>> getFilters() {
		List<Filter<BacklogItem>> filters = new ArrayList<Filter<BacklogItem>>() ;
		for (String activeFilter : container.getActiveFilters())
				filters.add(container.getAvailableFilters().get(activeFilter)) ;
		return filters ;
	}
}
**********************************************************************************
public abstract class AbstractFilter {

	@Inject
	private ComponentResources resources ;

	@Parameter(defaultPrefix = TapestryConstants.LITERAL_BINDING_PREFIX,
required=true)
	private String label ;
	
	@Environmental
	private FilterContainer container ;
	
	protected abstract String getFilterName() ;
	
	protected abstract Filter<BacklogItem> getFilter() ;
	
	@SetupRender
	void setupRender() {
		container.getAvailableFilters().put(getFilterName(), getFilter()) ;
	}
	
	void beginRender(MarkupWriter writer) {
		Link link = resources.createActionLink(TapestryConstants.ACTION_EVENT,
false, getFilterName()) ;
		
		writer.writeRaw("<li>") ;
		writer.element("a", "href", link.toURI()) ;
		writer.write( container.getFilterState(getFilterName()) ) ;
		writer.write(label) ;
		writer.end() ;
		writer.writeRaw("</li>") ;
	}


-- 
View this message in context: http://www.nabble.com/Environment-services-are-not-stateless-...---tp16733862p16733862.html
Sent from the Tapestry - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Environment services are not stateless ...??

Posted by Fidel Chavarria <fi...@gmail.com>.
It works! 
Thanks in advance ..! 


joshcanfield wrote:
> 
> This doesn't really have anything to do with the Environment, the
> problem is with your FilterContainer property.
> 
> Every time tapestry pulls your page from the pool (or puts it I don't
> recall which) it initializes the page properties with the values you
> set in the constructor or set in the property declaration. That means
> your page is always going to get back the same instance of the object
> it instantiated when it the page created. Which is great for objects
> that users don't manipulate.
> 
> It sounds like what you want is to hold on to the FilterContainer in
> the session, so change your property declaration like this:
> 
> @Persist("session")
> private FilterContainer container; // Defaults to null, persisted
> classes should be Serializable
> 
> And:
>        void setupRender() {
>                // If there is no container in the session then create a
> new one.
>                if ( container == null ) container = new FilterContainer();
>                environment.push(FilterContainer.class, container) ;
>        }
> 
> Josh
> 
> On Wed, Apr 16, 2008 at 2:28 PM, Fidel Chavarria
> <fi...@gmail.com> wrote:
>>
>> Hi, I 've a list of filter components to make the user experience more
>> confortable when he is looking at a list of issues in my app. I use
>> Tapestry
>> radiogroup component technique to enclose those filtters in a FilterGroup
>> component, It works ..! but it's not stateless. when I login to my
>> application as another user with a new instance of another web browser
>> (to
>> avoid browser session ) it keeps all filters applyed from a previous
>> user.
>>
>> Environment services are not stateless ...?
>> How can I avoid this behaviour ..?
>>
>> public class FilterGroup {
>>
>>        private FilterContainer container = new FilterContainer() ;
>>
>>        @Inject
>>        private Environment environment ;
>>
>>        void setupRender() {
>>                environment.push(FilterContainer.class, container) ;
>>        }
>>
>>        void afterRender() {
>>                environment.pop(FilterContainer.class) ;
>>        }
>>
>>         public void onAction(Object[] ctx) {
>>                if (container.getActiveFilters().contains((String)
>> ctx[0]))
>>                        container.getActiveFilters().remove(ctx[0]) ;
>>                else {
>>                        container.getActiveFilters().clear() ;
>>                        container.getActiveFilters().add((String) ctx[0])
>> ;
>>                }
>>        }
>>
>>        public Collection<Filter<BacklogItem>> getFilters() {
>>                List<Filter<BacklogItem>> filters = new
>> ArrayList<Filter<BacklogItem>>() ;
>>                for (String activeFilter : container.getActiveFilters())
>>                               
>> filters.add(container.getAvailableFilters().get(activeFilter)) ;
>>                return filters ;
>>        }
>> }
>> **********************************************************************************
>> public abstract class AbstractFilter {
>>
>>        @Inject
>>        private ComponentResources resources ;
>>
>>        @Parameter(defaultPrefix =
>> TapestryConstants.LITERAL_BINDING_PREFIX,
>> required=true)
>>        private String label ;
>>
>>        @Environmental
>>        private FilterContainer container ;
>>
>>        protected abstract String getFilterName() ;
>>
>>        protected abstract Filter<BacklogItem> getFilter() ;
>>
>>        @SetupRender
>>        void setupRender() {
>>                container.getAvailableFilters().put(getFilterName(),
>> getFilter()) ;
>>        }
>>
>>        void beginRender(MarkupWriter writer) {
>>                Link link =
>> resources.createActionLink(TapestryConstants.ACTION_EVENT,
>> false, getFilterName()) ;
>>
>>                writer.writeRaw("<li>") ;
>>                writer.element("a", "href", link.toURI()) ;
>>                writer.write( container.getFilterState(getFilterName()) )
>> ;
>>                writer.write(label) ;
>>                writer.end() ;
>>                writer.writeRaw("</li>") ;
>>        }
>>
>>
>> --
>> View this message in context:
>> http://www.nabble.com/Environment-services-are-not-stateless-...---tp16733862p16733862.html
>> Sent from the Tapestry - User mailing list archive at Nabble.com.
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>>
> 
> 
> 
> -- 
> --
> TheDailyTube.com. Sign up and get the best new videos on the internet
> delivered fresh to your inbox.
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Environment-services-are-not-stateless-...---tp16733862p16734948.html
Sent from the Tapestry - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Environment services are not stateless ...??

Posted by Josh Canfield <jo...@thedailytube.com>.
This doesn't really have anything to do with the Environment, the
problem is with your FilterContainer property.

Every time tapestry pulls your page from the pool (or puts it I don't
recall which) it initializes the page properties with the values you
set in the constructor or set in the property declaration. That means
your page is always going to get back the same instance of the object
it instantiated when it the page created. Which is great for objects
that users don't manipulate.

It sounds like what you want is to hold on to the FilterContainer in
the session, so change your property declaration like this:

@Persist("session")
private FilterContainer container; // Defaults to null, persisted
classes should be Serializable

And:
       void setupRender() {
               // If there is no container in the session then create a new one.
               if ( container == null ) container = new FilterContainer();
               environment.push(FilterContainer.class, container) ;
       }

Josh

On Wed, Apr 16, 2008 at 2:28 PM, Fidel Chavarria
<fi...@gmail.com> wrote:
>
> Hi, I 've a list of filter components to make the user experience more
> confortable when he is looking at a list of issues in my app. I use Tapestry
> radiogroup component technique to enclose those filtters in a FilterGroup
> component, It works ..! but it's not stateless. when I login to my
> application as another user with a new instance of another web browser (to
> avoid browser session ) it keeps all filters applyed from a previous user.
>
> Environment services are not stateless ...?
> How can I avoid this behaviour ..?
>
> public class FilterGroup {
>
>        private FilterContainer container = new FilterContainer() ;
>
>        @Inject
>        private Environment environment ;
>
>        void setupRender() {
>                environment.push(FilterContainer.class, container) ;
>        }
>
>        void afterRender() {
>                environment.pop(FilterContainer.class) ;
>        }
>
>         public void onAction(Object[] ctx) {
>                if (container.getActiveFilters().contains((String) ctx[0]))
>                        container.getActiveFilters().remove(ctx[0]) ;
>                else {
>                        container.getActiveFilters().clear() ;
>                        container.getActiveFilters().add((String) ctx[0]) ;
>                }
>        }
>
>        public Collection<Filter<BacklogItem>> getFilters() {
>                List<Filter<BacklogItem>> filters = new ArrayList<Filter<BacklogItem>>() ;
>                for (String activeFilter : container.getActiveFilters())
>                                filters.add(container.getAvailableFilters().get(activeFilter)) ;
>                return filters ;
>        }
> }
> **********************************************************************************
> public abstract class AbstractFilter {
>
>        @Inject
>        private ComponentResources resources ;
>
>        @Parameter(defaultPrefix = TapestryConstants.LITERAL_BINDING_PREFIX,
> required=true)
>        private String label ;
>
>        @Environmental
>        private FilterContainer container ;
>
>        protected abstract String getFilterName() ;
>
>        protected abstract Filter<BacklogItem> getFilter() ;
>
>        @SetupRender
>        void setupRender() {
>                container.getAvailableFilters().put(getFilterName(), getFilter()) ;
>        }
>
>        void beginRender(MarkupWriter writer) {
>                Link link = resources.createActionLink(TapestryConstants.ACTION_EVENT,
> false, getFilterName()) ;
>
>                writer.writeRaw("<li>") ;
>                writer.element("a", "href", link.toURI()) ;
>                writer.write( container.getFilterState(getFilterName()) ) ;
>                writer.write(label) ;
>                writer.end() ;
>                writer.writeRaw("</li>") ;
>        }
>
>
> --
> View this message in context: http://www.nabble.com/Environment-services-are-not-stateless-...---tp16733862p16733862.html
> Sent from the Tapestry - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>



-- 
--
TheDailyTube.com. Sign up and get the best new videos on the internet
delivered fresh to your inbox.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Environment services are not stateless ...??

Posted by Fidel Chavarria <fi...@gmail.com>.
It works!
Thanks in advance ..!


Fidel Chavarria wrote:
> 
> Hi, I 've a list of filter components to make the user experience more
> confortable when he is looking at a list of issues in my app. I use
> Tapestry radiogroup component technique to enclose those filtters in a
> FilterGroup component, It works ..! but it's not stateless. when I login
> to my application as another user with a new instance of another web
> browser (to avoid browser session ) it keeps all filters applyed from a
> previous user. 
> 
> Environment services are not stateless ...?
> How can I avoid this behaviour ..?
> 
> public class FilterGroup {
> 
> 	private FilterContainer container = new FilterContainer() ;
> 	
> 	@Inject
> 	private Environment environment ;
> 	
> 	void setupRender() {
> 		environment.push(FilterContainer.class, container) ;
> 	}
> 	
> 	void afterRender() {
> 	        environment.pop(FilterContainer.class) ;
> 	}    
> 
>          public void onAction(Object[] ctx) {
> 		if (container.getActiveFilters().contains((String) ctx[0]))
> 			container.getActiveFilters().remove(ctx[0]) ;
> 		else {
> 			container.getActiveFilters().clear() ;
> 			container.getActiveFilters().add((String) ctx[0]) ;
> 		}
> 	}
> 	
> 	public Collection<Filter<BacklogItem>> getFilters() {
> 		List<Filter<BacklogItem>> filters = new ArrayList<Filter<BacklogItem>>()
> ;
> 		for (String activeFilter : container.getActiveFilters())
> 				filters.add(container.getAvailableFilters().get(activeFilter)) ;
> 		return filters ;
> 	}
> }
> **********************************************************************************
> public abstract class AbstractFilter {
> 
> 	@Inject
> 	private ComponentResources resources ;
> 
> 	@Parameter(defaultPrefix = TapestryConstants.LITERAL_BINDING_PREFIX,
> required=true)
> 	private String label ;
> 	
> 	@Environmental
> 	private FilterContainer container ;
> 	
> 	protected abstract String getFilterName() ;
> 	
> 	protected abstract Filter<BacklogItem> getFilter() ;
> 	
> 	@SetupRender
> 	void setupRender() {
> 		container.getAvailableFilters().put(getFilterName(), getFilter()) ;
> 	}
> 	
> 	void beginRender(MarkupWriter writer) {
> 		Link link = resources.createActionLink(TapestryConstants.ACTION_EVENT,
> false, getFilterName()) ;
> 		
> 		writer.writeRaw("<li>") ;
> 		writer.element("a", "href", link.toURI()) ;
> 		writer.write( container.getFilterState(getFilterName()) ) ;
> 		writer.write(label) ;
> 		writer.end() ;
> 		writer.writeRaw("</li>") ;
> 	}
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Environment-services-are-not-stateless-...---tp16733862p16734946.html
Sent from the Tapestry - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org