[seam-dev] Seam Mail and Render

Lincoln Baxter, III lincolnbaxter at gmail.com
Mon Mar 7 16:31:32 EST 2011


Ah, ok, in the case of Database-loaded templates with Seam Render, that's
the reason why I made the *TemplateResolver *class in the first place. The
template path in render is actually an extensible lookup scheme.

*So:*

@include{"db:users/1/order/12/template"}@end{}

*Could be interpreted by a TemplateResolver which would perform the DB
lookup and provide the template.*

You'd need a *DatabaseTemplateResolver *and *DatabaseTemplateResource*. Once
that's done, and you define your path scheme, you're all set! The resolver
will handle lookups automatically! Caching templates so that you don't
hammer the database might be a few extra steps.
*
First, you register the resolver in the services file:*

/META-INF/services/org.jboss.seam.render.spi.TemplateResolver
com.example.myapp.DatabaseTemplateResolver

*Then it's then as simple as:*

@Inject TemplateCompiler compiler;
TemplateResource<?> template =
compiler.compile("db:nameOfTemplate/id12/param2/");

template.render(); //already integrated with CDI internally :)

// or the template lookup can be as simple as a name or id, but I still
recommend the use a "prefix:"
// "db:passwordRecovery"

*Templates of any resource type can reference templates of another type:
*

TemplateResource<?> template =
compiler.compile("db:nameOfTemplate/id12/param2/");

// the template above contains an include statement to a classpath template,
which in turn includes another database template.

@include{"/org/jboss/seam/mail/basicHtmlTemplate.render"} @end{}
----> @include{"db:templateThatChangesFrequently"} @end{}

// This from within your database template, will perform a classpath or
filesystem lookup (using the included resolvers.) So you can do cool things
like cross-resolver referencing of templates.

~Lincoln



On Mon, Mar 7, 2011 at 3:57 PM, Cody Lerum <cody.lerum at gmail.com> wrote:

> You definitely want the ability to send in the template content via
> inputstream however like I do with mail template.
>
> I for example store my templates in the database.
>
> -C
>
> On Mon, Mar 7, 2011 at 1:19 PM, Lincoln Baxter, III
> <lincolnbaxter at gmail.com> wrote:
> > :)
> >
> > BTW. RenderTemplate would look something like this... since Render has
> its
> > own TemplateResolver SPI, it wouldn't be very complicated from Seam
> Mail's
> > end.
> >
> > I don't think there's a real way that the MailTemplate interface would go
> > with Render, unless an additional render TemplateResource implementation
> > were provided to wrap it internally here. The only issue is that Render
> > attempts to resolve relative paths in templates, so using MailTemplate
> > doesn't really make sense here. Really render already implements a good
> deal
> > of what you are having to do in mail by trying to abstract the template
> > input stream from the templating system itself... I believe you'll have a
> > similar problem with Freemarker (or even with velocity if folks use any
> > @Include("templateName.path") declarations.
> >
> > Thoughts?
> >
> > /*
> >  * JBoss, Home of Professional Open Source
> >  * Copyright 2011, Red Hat, Inc., and individual contributors
> >  * by the @authors tag. See the copyright.txt in the distribution for a
> >  * full listing of individual contributors.
> >  *
> >  * Licensed under the Apache License, Version 2.0 (the "License");
> >  * you may not use this file except in compliance with the License.
> >  * You may obtain a copy of the License at
> >  * http://www.apache.org/licenses/LICENSE-2.0
> >  * Unless required by applicable law or agreed to in writing, software
> >  * distributed under the License is distributed on an "AS IS" BASIS,
> >  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> >  * See the License for the specific language governing permissions and
> >  * limitations under the License.
> >  */
> >
> > package org.jboss.seam.mail.templating.render;
> >
> > import java.io.InputStream;
> > import java.util.HashMap;
> > import java.util.Map;
> >
> > import org.jboss.seam.mail.templating.MailTemplate;
> > import org.jboss.seam.mail.templating.TemplateImpl;
> > import org.jboss.seam.render.TemplateCompiler;
> > import org.jboss.seam.render.spi.TemplateResolver;
> > import org.jboss.seam.render.spi.TemplateResource;
> > import org.jboss.seam.render.template.CompiledTemplateResource;
> >
> > /**
> >  * @author <a href="mailto:lincolnbaxter at gmail.com">Lincoln Baxter,
> III</a>
> >  */
> > public class RenderTemplate implements TemplateImpl
> > {
> >    private final CompiledTemplateResource template;
> >
> >    public RenderTemplate(TemplateCompiler compiler, final MailTemplate
> > template)
> >    {
> >       // not sure this integration really makes sense. Render should
> > probably be responsible only for delivering a java.lang.String as output.
> >       TemplateResource<InputStream> resource = new
> > TemplateResource<InputStream>()
> >       {
> >          @Override
> >          public String getPath()
> >          {
> >             return template.getTemplateName();
> >          }
> >
> >          @Override
> >          public InputStream getInputStream()
> >          {
> >             return template.getInputStream();
> >          }
> >
> >          @Override
> >          public long getLastModified()
> >          {
> >             return 0;
> >          }
> >
> >          @Override
> >          public InputStream getUnderlyingResource()
> >          {
> >             return getInputStream();
> >          }
> >
> >          @Override
> >          public TemplateResolver<InputStream> getResolvedBy()
> >          {
> >             return new TemplateResolver<InputStream>()
> >             {
> >                @Override
> >                public TemplateResource<InputStream> resolve(String
> target)
> >                {
> >                   // render will throw an error if this is reached
> >                   return null;
> >                }
> >
> >                @Override
> >                public TemplateResource<InputStream>
> > resolveRelative(TemplateResource<InputStream> origin, String target)
> >                {
> >                   // render will throw an error if this is reached
> >                   return null;
> >                }
> >             };
> >          }
> >       };
> >
> >       this.template = compiler.compile(resource);
> >    }
> >
> >    public RenderTemplate(TemplateCompiler compiler, String path)
> >    {
> >       template = compiler.compile(path);
> >    }
> >
> >    public RenderTemplate(TemplateCompiler compiler, TemplateResource<?>
> > resource)
> >    {
> >       template = compiler.compile(resource);
> >    }
> >
> >    public RenderTemplate(CompiledTemplateResource template)
> >    {
> >       this.template = template;
> >    }
> >
> >    @Override
> >    public String merge(Map<String, Object> context)
> >    {
> >       Map<Object, Object> map = new HashMap<Object, Object>();
> >       map.putAll(context);
> >
> >       String rendered = template.render(map);
> >       return rendered;
> >    }
> > }
> >
> >
>



-- 
Lincoln Baxter, III
http://ocpsoft.com
http://scrumshark.com
"Keep it Simple"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/seam-dev/attachments/20110307/75e8b047/attachment.html 


More information about the seam-dev mailing list