Re: A WM brain bender: The solution

Alex Twisleton-Wykeham-Fiennes <[email protected]>
Newsgroups gmane.comp.java.webmacro.user
Message-ID <[email protected]>
On Saturday 12 March 2005 07:47, marcel.huijkman wrote:
> Please don't do this via the #include directive.
>  It's not an include and it sounds like a workaround for a specific
> problem!
>
>  Don't misuse directive for other tasks as for where they were made for.

I fully appreciate your point of view, and am happy to follow what appears to 
be the general consensus, but I would just like to add this usage possiblity 
into the planning:-

If I have a template that knows that it is going to be fed a sub-template that 
needs to be evaluated as a template withint the current context.  I don't 
know what this template is or where it is going to be coming from as this is 
supplied by a process outside the scope of my current template.  I'm going to 
be passing in the name of the template as a String variable to this template.

In a 'normal' model, we would expect the template to be a conventional 
webmacro template and we just do (outer is the template that is including the 
inner template):-

	outer: #set $templatePath = "template/path/file.wm"
	inner: #include as template "$templatePath"

and it goes off and finds and evaluates the Template.

Now, if I've registered a FileTemplateLoader onto my 
DelegatingTemplateProvider then the following will also work (transparently 
to my inner template):-

	outer: #set $templatePath = "/absolute/webmacro/dir/template/path/file.wm"
	inner: #include as template "$templatePath"

And if I implemented an HttpTemplateLoader and registered it with 
DelegatingTemplateProvider then it would be able to do this:-

	outer: #set $templatePath = "http://www.mytemplateserver.com/file.wm"
	inner: #include as template "$templatePath"

Now, supposing that I had a Db that contained templates that where being 
maintained through a different purpose and I made a DbTemplateLoader, then I 
would be able to do this:-

	outer: #set $templatePath = "db:/file.wm"
	inner: #include as template "$templatePath"

and the DbTemplateLoader would accept the request for the template, due to the 
leader header and resolve it via some internal logic from the rest of the 
path and then return a Template object.

So far, I don't feel that I've strayed outside the scope of the what #include 
is supposed to do, and if anything I've improved encapsulation of the inner 
template by not forcing it to know where the Template is coming from or how 
it was generated.

So why would it be a misuse of the task to make it so that the inner template 
could just parse a Template source where the source of the Template was 
completely undefined?

	outer: #set $templatePath = "string:$someTemplateSource"
	inner: #include as template "$templatePath"

If we follow the #eval method that has been proposed then the inner template 
has to magically know that the $templatePath that has been passed to it has 
to be treated differently to other normal templates and the code switches 
into something like:-

	outer: #set $templatePath = <somethingUnknown>
	inner: #if ($Magic.requiresEval($templatePath)) { 
			#eval $templatePath 
		} #else {
			#include as template "$templatePath"
		}

which to me seems to be a disadvantage.

I do of course think that having the #eval syntax with the opportunity to pass 
in dedicated Context scopes etc etc is of course a good thing and should be 
possible and utilised in situations when the inner template _knows_ that this 
is the case, but for the situation that is described above, I fail to see 
where the StringTemplateLoader implementation of TemplateLoader is failing in 
the requirements of TemplateLoader?

Alex


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.