You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axkit-dev@xml.apache.org by Kip Hampton <kh...@totalcinema.com> on 2003/04/11 12:42:28 UTC

Re: Incremental Caching Patches

Chris Leishman wrote:

> Really?  I didn't notice that...  AFAIK a Content-Length header is only 
> actually returned when delivering from a cache file (apache calculates 
> the content-length, etc, after the $r->filename is set and the handler 
> declines).  When delivering normally I noticed that there is no 
> Content-Length header (although HTTP/1.1 connections used chunked 
> encoding which is preferable to content length anyway).
> 

The content-length was different because the content returned was 
different. See below.

>> hence, if only the DOM is returned, there may be unexpected results.
> 
> 
> AFAIK my patches should change this situation at all.  At the moment a 
> language module can return a dom (via pnotes), or just a string.  And 
> the next module has the opportunity to look for the dom or the string in 
> pnotes.  So are you saying that there are actually differences in the 
> output under the new patches, because that seems strange...

It does change it, though. Your patched version always returns a DOM 
instance, the current version serializes the result to a string using 
the XSLT processor's output_string( $result ) if the current process is 
$last_in_chain. The difference is that the latter *alters* the output 
based on options that may be set in an <xsl:output/> element in the 
stylesheet itself. The last stylesheet in my test suite had

<xsl:output mode="html"/>

(which is fairly common) so, when your patched version just returned the 
DOM result, the XSLT processor didn't get a chance to do its HTML mode 
serialization tricks (stripping of the XML declaration, adding meta 
headers for encoding, etc.) like it does in the current 
Language::LibXSLT-- hence the results are different,

Its not a big deal, all it takes is checking $last_in_chain and 
returning the result of output_string( $result ) if its defined instead 
of always returning the DOM.


> I don't see any reason why AxKit should serialise and re-parse at each 
> stage.  If a language processor is known to be broken wrt using a 
> prebuilt DOM, it can query the provider for get_strref and then parse 
> it's own DOM internally.  It would be silly to impose that overhead if 
> the modules being used don't need it.  It would also encourage people to 
> fix bugs that stop it working properly.

Agreed. I didn't want it to go away either. The combination of the above 
XSLT output annoyance and Simon Woodside's recent "bug" w.r.t. 
serializing default namespaces made me a little touchy. What can I say, 
I'll try the decaf...

> 
>> * It wasn't clear to me whether or not the new Language module design 
>> allows direct output to the client if the current processor is the 
>> last in the chain. If not, this presumption puts limits on what can be 
>> integrated as last-in-chain Language modules that may need access to 
>> the Apache object to return content appropriately.
> 
> 
> The last-in-chain module can't output directly to the client, since the 
> response should be returned to AxKit for it to deliver.  But I don't 
> think the previous code did either.  I noticed some modules (eg. 
> LibXSLT) took the effort of serialising the DOM and printing it if 
> last-in-chain was in effect, but the AxKit::Apache module simply 
> redirects the print and puts the data in pnotes('xml_string') anyway - 
> so it's still not dynamic (and is thus kind of pointless....maybe this 
> is historic?).

Er, that is pretty silly, actually...
> 
>> * Bolting on the result of the transformation to the return code in 
>> the new Language modules (e.g. return (Apache::Constants::OK, 
>> \%results); ) seems a smidge hacky to me. They should return one or 
>> the other, both is an ugly mix of coding strategies.
> 
> 
> It is a smidge hacky I agree.  I did it to be backwards compatible.  I 
> guess the same could be achieved by returning a hashref with a 'status' 
> member, and then detecting whether a scalar or a hash ref was returned 
> by the processor back in AxKit.

+1

> 
>> So, I guess the sum of my evaluation is "I'm not sure". There are 
>> definitely some good things in the proposed patches, but I think they 
>> go too far in some places.
> 
> 
> I'm not sure you've really said where in particular they 'go to far'...

Well, really the only part I was worried about was shutting down direct 
access to sending data to the client from the Language modules, but, 
given that its only there in an illusory way now anyway, it really 
doesn't matter.
.
> 
>> The questions that need to be answered are:
>>
>> In general, does switching to incremental caching give us something 
>> that we don't already have, or is it arguably a better generic 
>> solution than the current all-or-nothing implementation (especially in 
>> light of the fact that the typical use-case seems to put the dynamic 
>> parts at the front of the processing chain)?
> 
> 
> Well, it buys you advantages in the cases where dynamic parts are later 
> in the chain.  And I still haven't heard an overly convincing argument 
> for why that shouldn't be a far more appropriate thing in many cases.  
> My view is that XSP by nature is a form of 'styling', and should be 
> added in rather than being in the original XML document.

XSP (eXtensible Server Pages) is all about *generating* content. It is 
not a transformative processor in the way that XSLT and XPathScript are. 
There is no XSP stylesheet that gets applied to a source document and 
there's nothing in the language itself that presumes an input document.. 
Markup, inlined code, and taglibs (markup that maps to code) are 
combined in one document and the only "transformation" happens when the 
XSP processor executes the inlined or taglib-added code.

So, unless you mean "a pipeline of styles that generates an XSP page 
that gets executed at the end to generate further content" I'm not sure 
what you mean by using XSP as "form of styling". Its not that you 
*couldn't* do things that way, but its hardly the common case. The 
XSP(to generate content)->XSLT(to style it for the given client) pattern 
is far more common.

Here's what I suggest:

1) Accept the patches.
2) Re-implement the current all-or-nothing" caching behavior of the 
current Cache.pm using the new interfaces and keep this behavior as the 
default.
3) Ship Cache::Incremental (or whatever) as a standard alternative.

Reasonable? Doable? Anyone have thoughts?

> 
> [ all: please change the subject to create a new thread if you want to 
> discuss this point with me further.  The initial discussion on this was 
> on -users with the topic 'Adding XSP to an XSLT pipeline'. ]

This discussion is not appropriate for the user's list; that's why I 
brought it here. If you want to continue in the conversation you are 
certainly most welcome and what you do with the subject line in your 
replies is your business. :-)

-kip


Re: Incremental Caching Patches

Posted by Robin Berjon <ro...@knowscape.com>.
Kip Hampton wrote:
> Here's what I suggest:
> 
> 1) Accept the patches.
> 2) Re-implement the current all-or-nothing" caching behavior of the 
> current Cache.pm using the new interfaces and keep this behavior as the 
> default.
> 3) Ship Cache::Incremental (or whatever) as a standard alternative.
> 
> Reasonable? Doable? Anyone have thoughts?

+1 for me

--r


Re: Incremental Caching Patches [plus offtopic]

Posted by Jörg Walter <eh...@ich.bin.kein.hoschi.de>.
Hi AxDevers...

After being submerged in my new contractor's office, which was getting hacked 
by some annoying trojan right away and cleaning stuff up, I'll finally give 
my 2 cents to this issue.

On Friday, 11. April 2003 13:24, Chris Leishman wrote:

> >> It is a smidge hacky I agree.  I did it to be backwards compatible.
> >> I guess the same could be achieved by returning a hashref with a
> >> 'status' member, and then detecting whether a scalar or a hash ref
> >> was returned by the processor back in AxKit.
> >
> > +1

Sounds reasonable.

> > XSP (eXtensible Server Pages) is all about *generating* content. It is
> > not a transformative processor in the way that XSLT and XPathScript
> > are. There is no XSP stylesheet that gets applied to a source document
> > and there's nothing in the language itself that presumes an input
> > document.. Markup, inlined code, and taglibs (markup that maps to
> > code) are combined in one document and the only "transformation"
> > happens when the XSP processor executes the inlined or taglib-added
> > code.
> >
> > So, unless you mean "a pipeline of styles that generates an XSP page
> > that gets executed at the end to generate further content" I'm not
> > sure what you mean by using XSP as "form of styling". Its not that you
> > *couldn't* do things that way, but its hardly the common case. The
> > XSP(to generate content)->XSLT(to style it for the given client)
> > pattern is far more common.
>
> Well, my way of thinking about XML based content management, is that
> everything should start, where possible, from a simple XML document
> that contains only the data of interest.  Eg, if I wanted to display a
> page that has a list of blog entries, then I'd start with some XML
> similar to RSS - or if I wanted an article on my site, I might start
> with a document in docbook format.  These documents would either come
> from a file or somewhere else based on the initial Provider AxKit uses.

I have been doing quite heavy XSLT->XSP->... processing. It boils down to some 
data document (be it from the filesystem or generated from SQL via a nice 
provider I did, or retrieved from XMLDB, whatever...) that is the 'object' of 
some processing. A user might want to edit it, because it's his own. A user 
might want to add a comment, because he is interested in it, whatever.
So there are actually two stylesheet directives to apply one logical 
transformation: The XSLT which converts the input data to some XSP page 
usually using some taglib which was written for that very purpose, and the 
XSP transformation after that. The result is some internal XML which is later 
transformed into the correct HTML forms, links, whatever.
So this is definitely useful, especially since it makes you independent of 
storage. I transferred the whole site from XMLDB to SQL in a matter of a few 
days, including writing/extending the SQL provider. Re-doing all that in ESQL 
would have been deadly.

Yet, let me take you off topic. Matt already said it: XSP is no styling 
language per se. This is a problem. The split approach can get very 
confusing. XSLT doesn't give you enough access to foreign data, even using 
perl extenstion functions, or allows you to leverage perl's module library 
easily. XPathScript allows you to do fairly complex processing, but lacks 
XSP's mix-and-match taglib flexibility. People actually doing XSP-after-XSLT 
are a good indicator that something is indeed missing. I agree with Matt that 
XSP was meant to *generate* content, but the world seems to want something 
between XSP, XSLT and XPathScript for active transformations. At least I want 
;-) XPathScript with taglibs and some selected XSLT constructs, sort of.

> Maybe I'm just being a content purist though ;-)

Oh, you are not alone. I am purist of everything that makes the job easier or 
cooler ;-)

> > Here's what I suggest:
> >
> > 1) Accept the patches.
> > 2) Re-implement the current all-or-nothing" caching behavior of the
> > current Cache.pm using the new interfaces and keep this behavior as
> > the default.
> > 3) Ship Cache::Incremental (or whatever) as a standard alternative.
> >
> > Reasonable? Doable? Anyone have thoughts?

+1 from me. Variations as discussed elsewhere optionally included, I have 
never had much insight in the caching system, so I am not much of a judge.


-- 
CU
  Joerg

PGP Public Key at http://ich.bin.kein.hoschi.de/~trouble/public_key.asc
PGP Key fingerprint = D34F 57C4 99D8 8F16 E16E  7779 CDDC 41A4 4C48 6F94


Re: XSP in a pipeline (was Re: Incremental Caching Patches)

Posted by Chris Leishman <ch...@leishman.org>.
On Monday, April 14, 2003, at 10:09 AM, Matt Sergeant wrote:

> On Sun, 13 Apr 2003, Chris Leishman wrote:
>
>> Actually - the Cocoon guys have covered this topic in their basic
>> concepts introduction:
>>
>> http://xml.apache.org/cocoon/userdocs/concepts/index.html#c2-
>> abstractions
>>
>> Their conclusion is pretty much the same as mine - starting with XSP 
>> in
>> the pipeline is ok for examples but bad for real systems.  Better to
>> use a 'logicsheet' (xslt) to create an xsp page to be processed.  And
>> as soon as people start trying to do this, incremental caching is
>> invaluable...
>
> That's why I say never use a logicsheet ;-)
>
> Cocoon logicsheets are flawed ideas IMHO when faced with AxKit's 
> ability
> to write taglibs.

But I thought you can write taglibs in Cocoon too.....

Regards,
Chris


Re: XSP in a pipeline (was Re: Incremental Caching Patches)

Posted by Matt Sergeant <ma...@sergeant.org>.
On Sun, 13 Apr 2003, Chris Leishman wrote:

> Actually - the Cocoon guys have covered this topic in their basic
> concepts introduction:
>
> http://xml.apache.org/cocoon/userdocs/concepts/index.html#c2-
> abstractions
>
> Their conclusion is pretty much the same as mine - starting with XSP in
> the pipeline is ok for examples but bad for real systems.  Better to
> use a 'logicsheet' (xslt) to create an xsp page to be processed.  And
> as soon as people start trying to do this, incremental caching is
> invaluable...

That's why I say never use a logicsheet ;-)

Cocoon logicsheets are flawed ideas IMHO when faced with AxKit's ability
to write taglibs.

-- 
<!-- Matt -->
<:->get a SMart net</:->
Spam trap - do not mail: spam-sig@spamtrap.messagelabs.com

Re: XSP in a pipeline (was Re: Incremental Caching Patches)

Posted by Chris Leishman <ch...@leishman.org>.
On Friday, April 11, 2003, at 02:53 PM, Chris Leishman wrote:
<snip>
> I guess my way of doing it would be XML -> XSLT (which creates XHTML  
> but also includes XSP tags) -> XSP -> XHTML.
>
> That way the XSLT is still responsible for creating the XHTML and then  
> the XSP just adds in the dynamic elements.  But I could see situations  
> where you might want to use some intermediate XML format and then do a  
> final XSLT to create XHTML.

Actually - the Cocoon guys have covered this topic in their basic  
concepts introduction:

http://xml.apache.org/cocoon/userdocs/concepts/index.html#c2- 
abstractions

Their conclusion is pretty much the same as mine - starting with XSP in  
the pipeline is ok for examples but bad for real systems.  Better to  
use a 'logicsheet' (xslt) to create an xsp page to be processed.  And  
as soon as people start trying to do this, incremental caching is  
invaluable...

Regards,
Chris

XSP in a pipeline (was Re: Incremental Caching Patches)

Posted by Chris Leishman <ch...@leishman.org>.
On Friday, April 11, 2003, at 02:42 PM, Robin Berjon wrote:
<snip>
> There's nothing "wrong" with your approach, but you are using XSP to 
> produce XHTML, and the latter /may/ contain styling information. 
> Producing styled output from XSP is imho a bad idea which is why, in 
> the process you describe, starting from an initial document I might do 
> FooML(source) -> XSLT(adds some XSP elements) -> XSP(processes XSP 
> stuff) -> XSLT(styles).
>
> In such cases, what I've done is XSP(does dynamic stuff *and* includes 
> the real content, usually from path info) -> XSLT(styles).

I guess my way of doing it would be XML -> XSLT (which creates XHTML 
but also includes XSP tags) -> XSP -> XHTML.

That way the XSLT is still responsible for creating the XHTML and then 
the XSP just adds in the dynamic elements.  But I could see situations 
where you might want to use some intermediate XML format and then do a 
final XSLT to create XHTML.

>> Maybe I'm just being a content purist though ;-)
>
> I am, and I tend to have http://foo.org/src/foo/bar.xml to access the 
> content in itself (with no decoration) and 
> http://foo.org/cms.xsp/foo/bar.xml to get the page people want to see.
<snip>

The seems rather hackish to me...

I would have though something like:

http://foo.org/foo/bar.xml                               (gives nice 
XHTML in the style of the site)
http://foo.org/foo/bar.xml?style=printable  (gives another style 
suitable for printing)
http://foo.org/foo/bar.xml?style=raw           (returns the original 
XML document)

or similar would be nicer than separating all the other styles from the 
'raw' one.  And then it saves having to do tricks with path_info...

But each to his own I guess :-)

Regards,
Chris

Re: Incremental Caching Patches

Posted by Robin Berjon <ro...@knowscape.com>.
Chris Leishman wrote:
> On Friday, April 11, 2003, at 01:42 PM, Kip Hampton wrote:
>> It does change it, though. Your patched version always returns a DOM 
>> instance, the current version serializes the result to a string using 
>> the XSLT processor's output_string( $result ) if the current process 
>> is $last_in_chain. The difference is that the latter *alters* the 
>> output based on options that may be set in an <xsl:output/> element in 
>> the stylesheet itself. The last stylesheet in my test suite had
> 
> Ok....thats annoying!  Can someone tell me how XSLT embeds the desired 
> output format into the DOM, so that when 
> XML::LibXSLT::output_string($result) is called, it knows to serialize in 
> a specific manner?

Well, it may be seen as annoying (and I for one hope that mode='html' will cease 
to be useful soon enough) but it's done as per the spec and it thus won't go 
away (besides, I don't really see an alternative solution...).

The info isn't stored in the DOM, it's stored in the stylesheet object. 
$xslt->output_string() looks that up and uses its own serialisation code instead 
of libxml's.

> Then to create something suitable to my site, I might apply some XSLT to 
> convert to XHTML.  But if I wanted to include some dynamic stuff - eg. a 
> 'Welcome <logged in user>' or even a form like 'Add new entry to blog', 
> then I'd want to convert from the original RSS to an XSP page that could 
> output XHTML containing the user details and perhaps the results of 
> processing the parameters in the request...
> 
> I can certainly see situations where there is no initial data source and 
> thus one is generated entirely dynamically via XSP based on the request 
> parameters or similar - but I would've thought it more common to have 
> some initial XML to work with.

There's nothing "wrong" with your approach, but you are using XSP to produce 
XHTML, and the latter /may/ contain styling information. Producing styled output 
from XSP is imho a bad idea which is why, in the process you describe, starting 
from an initial document I might do FooML(source) -> XSLT(adds some XSP 
elements) -> XSP(processes XSP stuff) -> XSLT(styles).

In such cases, what I've done is XSP(does dynamic stuff *and* includes the real 
content, usually from path info) -> XSLT(styles).

> Maybe I'm just being a content purist though ;-)

I am, and I tend to have http://foo.org/src/foo/bar.xml to access the content in 
itself (with no decoration) and http://foo.org/cms.xsp/foo/bar.xml to get the 
page people want to see.

--r


Re: Incremental Caching Patches

Posted by Chris Leishman <ch...@leishman.org>.
On Friday, April 11, 2003, at 01:42 PM, Kip Hampton wrote:
<snip>
> The content-length was different because the content returned was 
> different. See below.
<snip>

Ok...

> It does change it, though. Your patched version always returns a DOM 
> instance, the current version serializes the result to a string using 
> the XSLT processor's output_string( $result ) if the current process 
> is $last_in_chain. The difference is that the latter *alters* the 
> output based on options that may be set in an <xsl:output/> element in 
> the stylesheet itself. The last stylesheet in my test suite had
<snip>

Ok....thats annoying!  Can someone tell me how XSLT embeds the desired 
output format into the DOM, so that when 
XML::LibXSLT::output_string($result) is called, it knows to serialize 
in a specific manner?

> Its not a big deal, all it takes is checking $last_in_chain and 
> returning the result of output_string( $result ) if its defined 
> instead of always returning the DOM.

Rather than this, it could be better to keep passing the DOM back (for 
consistancy) - but then at the final serialization stage (when sending 
to the client) we use a serialization method that respects the desired 
output format attached to the DOM.  Not that it really matters.....

>> It is a smidge hacky I agree.  I did it to be backwards compatible.  
>> I guess the same could be achieved by returning a hashref with a 
>> 'status' member, and then detecting whether a scalar or a hash ref 
>> was returned by the processor back in AxKit.
>
> +1

Ok....we'll use that way then.  Makes no difference to me :-)

> Well, really the only part I was worried about was shutting down 
> direct access to sending data to the client from the Language modules, 
> but, given that its only there in an illusory way now anyway, it 
> really doesn't matter.

Cool.

> XSP (eXtensible Server Pages) is all about *generating* content. It is 
> not a transformative processor in the way that XSLT and XPathScript 
> are. There is no XSP stylesheet that gets applied to a source document 
> and there's nothing in the language itself that presumes an input 
> document.. Markup, inlined code, and taglibs (markup that maps to 
> code) are combined in one document and the only "transformation" 
> happens when the XSP processor executes the inlined or taglib-added 
> code.
>
> So, unless you mean "a pipeline of styles that generates an XSP page 
> that gets executed at the end to generate further content" I'm not 
> sure what you mean by using XSP as "form of styling". Its not that you 
> *couldn't* do things that way, but its hardly the common case. The 
> XSP(to generate content)->XSLT(to style it for the given client) 
> pattern is far more common.

Well, my way of thinking about XML based content management, is that 
everything should start, where possible, from a simple XML document 
that contains only the data of interest.  Eg, if I wanted to display a 
page that has a list of blog entries, then I'd start with some XML 
similar to RSS - or if I wanted an article on my site, I might start 
with a document in docbook format.  These documents would either come 
from a file or somewhere else based on the initial Provider AxKit uses.

Then to create something suitable to my site, I might apply some XSLT 
to convert to XHTML.  But if I wanted to include some dynamic stuff - 
eg. a 'Welcome <logged in user>' or even a form like 'Add new entry to 
blog', then I'd want to convert from the original RSS to an XSP page 
that could output XHTML containing the user details and perhaps the 
results of processing the parameters in the request...

I can certainly see situations where there is no initial data source 
and thus one is generated entirely dynamically via XSP based on the 
request parameters or similar - but I would've thought it more common 
to have some initial XML to work with.

Maybe I'm just being a content purist though ;-)

> Here's what I suggest:
>
> 1) Accept the patches.
> 2) Re-implement the current all-or-nothing" caching behavior of the 
> current Cache.pm using the new interfaces and keep this behavior as 
> the default.
> 3) Ship Cache::Incremental (or whatever) as a standard alternative.
>
> Reasonable? Doable? Anyone have thoughts?

I think it's do-able.  Stage 3 wouldn't be done via a different Cache 
module though - it would have to be via some sort of option 
(AxIncrementalCache On/Off ?).

>> [ all: please change the subject to create a new thread if you want 
>> to discuss this point with me further.  The initial discussion on 
>> this was on -users with the topic 'Adding XSP to an XSLT pipeline'. ]
>
> This discussion is not appropriate for the user's list; that's why I 
> brought it here. If you want to continue in the conversation you are 
> certainly most welcome and what you do with the subject line in your 
> replies is your business. :-)

I was actually referring to my comments on the pros/cons of putting XSP 
earlier or later in a pipeline....thats really a different discussion 
from whether the patches are good or not.

Regards,
Chris