You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Nenad Nikolic <iz...@gmail.com> on 2013/04/17 18:33:49 UTC

Selective caching of resources

Hello, i'm struggling with delivering a transformed resource for each
request.

Here is exactly what i mean:

There are two requests expected to hit the app.
1) a request containing a unique identifier and some other values as
request parameters.
This request will hit a dispatcher which will store the data into
hazelcast, and render a response which will contain urls to two assets (one
js one css) with a request parameter (the unique identifier).
Here is how an example response looks like:

<modifier>
<javascript>
<filepath>
http://localhost:8080/app/assets/1.0.0-SNAPSHOT/ccdd/template.nmjs?trid=unique_identifier
</filepath>
</javascript>
<css>
<filepath>
http://localhost:8080/app/assets/1.0.0-SNAPSHOT/ccdd/template.nmcss?trid=unique_identifier
</filepath>
</css>
</modifier>

This is a machine-to-machine request. The system that made the request will
give the asset urls to the client when rendering a webpage.

2) the second request is the one coming from the client. It is a request
for the actuall assets. It should return the asset but replace the
placeholders within the asset with values from hazelcast.
I currently have an AssetHandler mapped to the "ccdd" path.
In the AssetHandler i get the request parameter and get the values from the
hazelcast map. Then the values are stored on the environment stack for my
ResourceTransformer to access. This whole thing is working and i get a
properly transformed asset for the first request.

My problem is that when the unique identifier changes the resource is not
transformed again.

So my questions are:

Is it possible to cache resources selectively?
Am i doing this in a completely shitty way?

I hope that my explanation is understandable. Thx in advance for any
responses!

Re: Selective caching of resources

Posted by Howard Lewis Ship <hl...@gmail.com>.
No, I agree; I'm thinking of a refactoring where SRS does just what it
says: create an SR from a Resource and cross-compile it (i.e., CoffeeScript
to JavaScript), and then add a second service to which filters can be
contributed to do all the other work: CSS rewrites, minimization, caching,
gzipping. The current approach is a bit too complicated.


On Fri, Apr 19, 2013 at 3:50 PM, Nenad Nikolic <iz...@gmail.com>wrote:

> Documentation sake :
> I have solved the problem by extending StreamableResourceSourceImpl with my
> local class and binding that class with a local interface with the same
> methods as StreamableResourceSource, hence avoiding the decorators bound to
> StreamableResourceSource.
>
> I feel that this is a very bad solution, but it was just simpler than if i
> wrote it servlet style.
> I think StreamableResourceSource itself should be a plpeline into which a
> user could contribute and override existing instances.
>
> Also i could be completely wrong :)
>
> Regards.
>
>
>
> On Wed, Apr 17, 2013 at 7:24 PM, Nenad Nikolic <iznenad.nikolic@gmail.com
> >wrote:
>
> > Thank you for the quick response! I was considering such an approach,
> > implementing a separate dispatcher at first but figured it would just be
> > too much work and tapestry already provides the features and
> infrastructure
> > i need for delivering assets. I seems that i wasn't looking at the
> problem
> > i need to solve good enough.
> >
> > But still, if it would be possible to somehow override the
> > SRSCachingInterceptor's implementation of isCachable i think i would
> > actually have a valid solution.
> > I could have a special handling for the resources with the custom
> > extension and just not cache them.
> >
> > Is it possible to do this? Am i missing something in thinking this?
> >
> > Thanks again.
> >
> >
> >
> > On Wed, Apr 17, 2013 at 7:05 PM, Howard Lewis Ship <hlship@gmail.com
> >wrote:
> >
> >> Generally speaking, assets are expected to be static (that is,
> unchanging)
> >> and global, which is why there's so much caching going on.
> >>
> >> I would say that you should implement your own Dispatcher (contributed
> to
> >> the MasterDispatcher) service and just take control of this, using the
> >> same
> >> techniques you might use to server content out of a database. It ends up
> >> being more like a servlet at that point (Dispatcher is very similar to
> >> HttpServlet) and you have control over everything that happens: you
> >> control
> >> the cache, the URL format, the works.  With a little bit of effort, you
> >> can
> >> probably leverage some of the features of Tapestry's asset pipeline
> >> (minimization, CSS rewriting in 5.4, etc.), by making your data
> implement
> >> StreamableResource.
> >>
> >>
> >> On Wed, Apr 17, 2013 at 5:33 PM, Nenad Nikolic <
> iznenad.nikolic@gmail.com
> >> >wrote:
> >>
> >> > Hello, i'm struggling with delivering a transformed resource for each
> >> > request.
> >> >
> >> > Here is exactly what i mean:
> >> >
> >> > There are two requests expected to hit the app.
> >> > 1) a request containing a unique identifier and some other values as
> >> > request parameters.
> >> > This request will hit a dispatcher which will store the data into
> >> > hazelcast, and render a response which will contain urls to two assets
> >> (one
> >> > js one css) with a request parameter (the unique identifier).
> >> > Here is how an example response looks like:
> >> >
> >> > <modifier>
> >> > <javascript>
> >> > <filepath>
> >> >
> >> >
> >>
> http://localhost:8080/app/assets/1.0.0-SNAPSHOT/ccdd/template.nmjs?trid=unique_identifier
> >> > </filepath>
> >> > </javascript>
> >> > <css>
> >> > <filepath>
> >> >
> >> >
> >>
> http://localhost:8080/app/assets/1.0.0-SNAPSHOT/ccdd/template.nmcss?trid=unique_identifier
> >> > </filepath>
> >> > </css>
> >> > </modifier>
> >> >
> >> > This is a machine-to-machine request. The system that made the request
> >> will
> >> > give the asset urls to the client when rendering a webpage.
> >> >
> >> > 2) the second request is the one coming from the client. It is a
> request
> >> > for the actuall assets. It should return the asset but replace the
> >> > placeholders within the asset with values from hazelcast.
> >> > I currently have an AssetHandler mapped to the "ccdd" path.
> >> > In the AssetHandler i get the request parameter and get the values
> from
> >> the
> >> > hazelcast map. Then the values are stored on the environment stack for
> >> my
> >> > ResourceTransformer to access. This whole thing is working and i get a
> >> > properly transformed asset for the first request.
> >> >
> >> > My problem is that when the unique identifier changes the resource is
> >> not
> >> > transformed again.
> >> >
> >> > So my questions are:
> >> >
> >> > Is it possible to cache resources selectively?
> >> > Am i doing this in a completely shitty way?
> >> >
> >> > I hope that my explanation is understandable. Thx in advance for any
> >> > responses!
> >> >
> >>
> >>
> >>
> >> --
> >> Howard M. Lewis Ship
> >>
> >> Creator of Apache Tapestry
> >>
> >> The source for Tapestry training, mentoring and support. Contact me to
> >> learn how I can get you up and productive in Tapestry fast!
> >>
> >> (971) 678-5210
> >> http://howardlewisship.com
> >>
> >
> >
>



-- 
Howard M. Lewis Ship

Creator of Apache Tapestry

The source for Tapestry training, mentoring and support. Contact me to
learn how I can get you up and productive in Tapestry fast!

(971) 678-5210
http://howardlewisship.com

Re: Selective caching of resources

Posted by Nenad Nikolic <iz...@gmail.com>.
Documentation sake :
I have solved the problem by extending StreamableResourceSourceImpl with my
local class and binding that class with a local interface with the same
methods as StreamableResourceSource, hence avoiding the decorators bound to
StreamableResourceSource.

I feel that this is a very bad solution, but it was just simpler than if i
wrote it servlet style.
I think StreamableResourceSource itself should be a plpeline into which a
user could contribute and override existing instances.

Also i could be completely wrong :)

Regards.



On Wed, Apr 17, 2013 at 7:24 PM, Nenad Nikolic <iz...@gmail.com>wrote:

> Thank you for the quick response! I was considering such an approach,
> implementing a separate dispatcher at first but figured it would just be
> too much work and tapestry already provides the features and infrastructure
> i need for delivering assets. I seems that i wasn't looking at the problem
> i need to solve good enough.
>
> But still, if it would be possible to somehow override the
> SRSCachingInterceptor's implementation of isCachable i think i would
> actually have a valid solution.
> I could have a special handling for the resources with the custom
> extension and just not cache them.
>
> Is it possible to do this? Am i missing something in thinking this?
>
> Thanks again.
>
>
>
> On Wed, Apr 17, 2013 at 7:05 PM, Howard Lewis Ship <hl...@gmail.com>wrote:
>
>> Generally speaking, assets are expected to be static (that is, unchanging)
>> and global, which is why there's so much caching going on.
>>
>> I would say that you should implement your own Dispatcher (contributed to
>> the MasterDispatcher) service and just take control of this, using the
>> same
>> techniques you might use to server content out of a database. It ends up
>> being more like a servlet at that point (Dispatcher is very similar to
>> HttpServlet) and you have control over everything that happens: you
>> control
>> the cache, the URL format, the works.  With a little bit of effort, you
>> can
>> probably leverage some of the features of Tapestry's asset pipeline
>> (minimization, CSS rewriting in 5.4, etc.), by making your data implement
>> StreamableResource.
>>
>>
>> On Wed, Apr 17, 2013 at 5:33 PM, Nenad Nikolic <iznenad.nikolic@gmail.com
>> >wrote:
>>
>> > Hello, i'm struggling with delivering a transformed resource for each
>> > request.
>> >
>> > Here is exactly what i mean:
>> >
>> > There are two requests expected to hit the app.
>> > 1) a request containing a unique identifier and some other values as
>> > request parameters.
>> > This request will hit a dispatcher which will store the data into
>> > hazelcast, and render a response which will contain urls to two assets
>> (one
>> > js one css) with a request parameter (the unique identifier).
>> > Here is how an example response looks like:
>> >
>> > <modifier>
>> > <javascript>
>> > <filepath>
>> >
>> >
>> http://localhost:8080/app/assets/1.0.0-SNAPSHOT/ccdd/template.nmjs?trid=unique_identifier
>> > </filepath>
>> > </javascript>
>> > <css>
>> > <filepath>
>> >
>> >
>> http://localhost:8080/app/assets/1.0.0-SNAPSHOT/ccdd/template.nmcss?trid=unique_identifier
>> > </filepath>
>> > </css>
>> > </modifier>
>> >
>> > This is a machine-to-machine request. The system that made the request
>> will
>> > give the asset urls to the client when rendering a webpage.
>> >
>> > 2) the second request is the one coming from the client. It is a request
>> > for the actuall assets. It should return the asset but replace the
>> > placeholders within the asset with values from hazelcast.
>> > I currently have an AssetHandler mapped to the "ccdd" path.
>> > In the AssetHandler i get the request parameter and get the values from
>> the
>> > hazelcast map. Then the values are stored on the environment stack for
>> my
>> > ResourceTransformer to access. This whole thing is working and i get a
>> > properly transformed asset for the first request.
>> >
>> > My problem is that when the unique identifier changes the resource is
>> not
>> > transformed again.
>> >
>> > So my questions are:
>> >
>> > Is it possible to cache resources selectively?
>> > Am i doing this in a completely shitty way?
>> >
>> > I hope that my explanation is understandable. Thx in advance for any
>> > responses!
>> >
>>
>>
>>
>> --
>> Howard M. Lewis Ship
>>
>> Creator of Apache Tapestry
>>
>> The source for Tapestry training, mentoring and support. Contact me to
>> learn how I can get you up and productive in Tapestry fast!
>>
>> (971) 678-5210
>> http://howardlewisship.com
>>
>
>

Re: Selective caching of resources

Posted by Nenad Nikolic <iz...@gmail.com>.
Thank you for the quick response! I was considering such an approach,
implementing a separate dispatcher at first but figured it would just be
too much work and tapestry already provides the features and infrastructure
i need for delivering assets. I seems that i wasn't looking at the problem
i need to solve good enough.

But still, if it would be possible to somehow override the
SRSCachingInterceptor's implementation of isCachable i think i would
actually have a valid solution.
I could have a special handling for the resources with the custom extension
and just not cache them.

Is it possible to do this? Am i missing something in thinking this?

Thanks again.



On Wed, Apr 17, 2013 at 7:05 PM, Howard Lewis Ship <hl...@gmail.com> wrote:

> Generally speaking, assets are expected to be static (that is, unchanging)
> and global, which is why there's so much caching going on.
>
> I would say that you should implement your own Dispatcher (contributed to
> the MasterDispatcher) service and just take control of this, using the same
> techniques you might use to server content out of a database. It ends up
> being more like a servlet at that point (Dispatcher is very similar to
> HttpServlet) and you have control over everything that happens: you control
> the cache, the URL format, the works.  With a little bit of effort, you can
> probably leverage some of the features of Tapestry's asset pipeline
> (minimization, CSS rewriting in 5.4, etc.), by making your data implement
> StreamableResource.
>
>
> On Wed, Apr 17, 2013 at 5:33 PM, Nenad Nikolic <iznenad.nikolic@gmail.com
> >wrote:
>
> > Hello, i'm struggling with delivering a transformed resource for each
> > request.
> >
> > Here is exactly what i mean:
> >
> > There are two requests expected to hit the app.
> > 1) a request containing a unique identifier and some other values as
> > request parameters.
> > This request will hit a dispatcher which will store the data into
> > hazelcast, and render a response which will contain urls to two assets
> (one
> > js one css) with a request parameter (the unique identifier).
> > Here is how an example response looks like:
> >
> > <modifier>
> > <javascript>
> > <filepath>
> >
> >
> http://localhost:8080/app/assets/1.0.0-SNAPSHOT/ccdd/template.nmjs?trid=unique_identifier
> > </filepath>
> > </javascript>
> > <css>
> > <filepath>
> >
> >
> http://localhost:8080/app/assets/1.0.0-SNAPSHOT/ccdd/template.nmcss?trid=unique_identifier
> > </filepath>
> > </css>
> > </modifier>
> >
> > This is a machine-to-machine request. The system that made the request
> will
> > give the asset urls to the client when rendering a webpage.
> >
> > 2) the second request is the one coming from the client. It is a request
> > for the actuall assets. It should return the asset but replace the
> > placeholders within the asset with values from hazelcast.
> > I currently have an AssetHandler mapped to the "ccdd" path.
> > In the AssetHandler i get the request parameter and get the values from
> the
> > hazelcast map. Then the values are stored on the environment stack for my
> > ResourceTransformer to access. This whole thing is working and i get a
> > properly transformed asset for the first request.
> >
> > My problem is that when the unique identifier changes the resource is not
> > transformed again.
> >
> > So my questions are:
> >
> > Is it possible to cache resources selectively?
> > Am i doing this in a completely shitty way?
> >
> > I hope that my explanation is understandable. Thx in advance for any
> > responses!
> >
>
>
>
> --
> Howard M. Lewis Ship
>
> Creator of Apache Tapestry
>
> The source for Tapestry training, mentoring and support. Contact me to
> learn how I can get you up and productive in Tapestry fast!
>
> (971) 678-5210
> http://howardlewisship.com
>

Re: Selective caching of resources

Posted by Howard Lewis Ship <hl...@gmail.com>.
Generally speaking, assets are expected to be static (that is, unchanging)
and global, which is why there's so much caching going on.

I would say that you should implement your own Dispatcher (contributed to
the MasterDispatcher) service and just take control of this, using the same
techniques you might use to server content out of a database. It ends up
being more like a servlet at that point (Dispatcher is very similar to
HttpServlet) and you have control over everything that happens: you control
the cache, the URL format, the works.  With a little bit of effort, you can
probably leverage some of the features of Tapestry's asset pipeline
(minimization, CSS rewriting in 5.4, etc.), by making your data implement
StreamableResource.


On Wed, Apr 17, 2013 at 5:33 PM, Nenad Nikolic <iz...@gmail.com>wrote:

> Hello, i'm struggling with delivering a transformed resource for each
> request.
>
> Here is exactly what i mean:
>
> There are two requests expected to hit the app.
> 1) a request containing a unique identifier and some other values as
> request parameters.
> This request will hit a dispatcher which will store the data into
> hazelcast, and render a response which will contain urls to two assets (one
> js one css) with a request parameter (the unique identifier).
> Here is how an example response looks like:
>
> <modifier>
> <javascript>
> <filepath>
>
> http://localhost:8080/app/assets/1.0.0-SNAPSHOT/ccdd/template.nmjs?trid=unique_identifier
> </filepath>
> </javascript>
> <css>
> <filepath>
>
> http://localhost:8080/app/assets/1.0.0-SNAPSHOT/ccdd/template.nmcss?trid=unique_identifier
> </filepath>
> </css>
> </modifier>
>
> This is a machine-to-machine request. The system that made the request will
> give the asset urls to the client when rendering a webpage.
>
> 2) the second request is the one coming from the client. It is a request
> for the actuall assets. It should return the asset but replace the
> placeholders within the asset with values from hazelcast.
> I currently have an AssetHandler mapped to the "ccdd" path.
> In the AssetHandler i get the request parameter and get the values from the
> hazelcast map. Then the values are stored on the environment stack for my
> ResourceTransformer to access. This whole thing is working and i get a
> properly transformed asset for the first request.
>
> My problem is that when the unique identifier changes the resource is not
> transformed again.
>
> So my questions are:
>
> Is it possible to cache resources selectively?
> Am i doing this in a completely shitty way?
>
> I hope that my explanation is understandable. Thx in advance for any
> responses!
>



-- 
Howard M. Lewis Ship

Creator of Apache Tapestry

The source for Tapestry training, mentoring and support. Contact me to
learn how I can get you up and productive in Tapestry fast!

(971) 678-5210
http://howardlewisship.com