[ 
https://issues.jboss.org/browse/JBSEAM-3988?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jozef Hartinger reassigned JBSEAM-3988:
---------------------------------------

    Assignee:     (was: Jozef Hartinger)


> Support for mapping RESTful XHTML resource representations with Facelets 
> templates
> ----------------------------------------------------------------------------------
>
>                 Key: JBSEAM-3988
>                 URL: https://issues.jboss.org/browse/JBSEAM-3988
>             Project: Seam 2
>          Issue Type: Feature Request
>          Components: WS
>            Reporter: Christian Bauer
>             Fix For: The future
>
>
> What I wrote a while ago about this feature:
> I'm thinking about a special provider that can marshal an object graph into 
> an XHTML (not just XML) response body and back from an XHTML request body to 
> an object graph. This is about the "connectedness" of resources, see the 
> O'Reilly REST book. As a developer I should write a Facelets XHTML template 
> that defines the transformation. Imagine that you write it the same way you 
> write a JSF template today, with bidirectional binding using EL expressions, 
> from object getter/setter pair to XML attribute or element value. We can even 
> have built-in Facelets "widgets" that render certain microformats. Seam has 
> some machinery for this already but we might need an extra interceptor on 
> resource methods to trigger the transformation. Or we use Seams pages.xml 
> navigation rules ("when this resource method finishes, render this template").
> Later I did some prototype experiments - note that this only considers 
> uni-directional mapping for GET, handling POST/PUT resource representation is 
> more difficult:
> package org.jboss.seam.resteasy;
> import java.lang.annotation.*;
> /**
>  * @author Christian Bauer
>  */
> @Target({ElementType.METHOD})
> @Retention(RetentionPolicy.RUNTIME)
> @Documented
> @Inherited
> public @interface FaceletsXhtmlResponse {
>     String template();
> }
> package org.jboss.seam.resteasy;
> import org.jboss.seam.core.Interpolator;
> import org.jboss.seam.faces.Renderer;
> import org.jboss.seam.log.Log;
> import org.jboss.seam.log.Logging;
> import javax.ws.rs.ProduceMime;
> import javax.ws.rs.core.MediaType;
> import javax.ws.rs.core.MultivaluedMap;
> import javax.ws.rs.ext.MessageBodyWriter;
> import javax.ws.rs.ext.Provider;
> import java.io.IOException;
> import java.io.OutputStream;
> import java.lang.annotation.Annotation;
> import java.lang.reflect.Type;
> /**
>  * @author Christian Bauer
>  */
> @Provider
> @ProduceMime("application/xhtml+xml")
> public class FaceletsXhtmlProvider implements MessageBodyWriter<Object> {
>     Log log = Logging.getLog(FaceletsXhtmlProvider.class);
>     public boolean isWriteable(Class<?> type, Type genericType, Annotation[] 
> annotations) {
>         for (Annotation annotation : annotations) {
>             if 
> (annotation.annotationType().equals(FaceletsXhtmlResponse.class)) {
>                 return true;
>             }
>         }
>         return false;
>     }
>     public long getSize(Object o) {
>         return -1;
>     }
>     public void writeTo(Object o, Class<?> type, Type genericType, 
> Annotation[] annotations,
>                         MediaType mediaType, MultivaluedMap<String, Object> 
> httpHeaders, OutputStream entityStream)
>             throws IOException {
>         log.debug("writing XHTML response for entity type: " + 
> type.getName());
>         FaceletsXhtmlResponse respAnnotation = null;
>         for (Annotation annotation : annotations) {
>             if 
> (annotation.annotationType().equals(FaceletsXhtmlResponse.class))
>                 respAnnotation = (FaceletsXhtmlResponse) annotation;
>         }
>         if (respAnnotation == null) throw new 
> IllegalStateException("@FaceletsXhtmlResponse annotation disappeared");
>         String template = getTemplatePath(respAnnotation);
>         log.debug("rendering XHTML template: " + template);
>         String output = Renderer.instance().render(template);
>         entityStream.write(output.getBytes());
>     }
>     protected String getTemplatePath(FaceletsXhtmlResponse annotation) {
>         return isTemplatePathInterpolated() 
>                 ? Interpolator.instance().interpolate(annotation.template())
>                 : annotation.template();
>     }
>     protected boolean isTemplatePathInterpolated() {
>         return true;
>     }
> }
> @Name("customerResource")
> @Path("/customer")
> public class CustomerResource {
>     @GET
>     @ProduceMime("application/xhtml+xml")
>     @FaceletsXhtmlResponse(
>         template = "#{somePath}/customerTemplate.xhtml"
>     )
>     @Out(value = "customers", scope = ScopeType.EVENT)
>     public List<Customer> getCustomers() {
>         return mockCustomers();
>     }
> }
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
> <html xmlns="http://www.w3.org/1999/xhtml";
>       xmlns:t="http://java.sun.com/jsf/facelets";
>       xmlns:h="http://java.sun.com/jsf/html";
>       xmlns:f="http://java.sun.com/jsf/core";>
> <head>
>     <title>Customers</title>
> </head>
> <body>
> <ul>
>     <t:repeat var="cust" value="#{customers}">
>         <li>
>             <h:outputText value="#{cust.name}"/>
>         </li>
>     </t:repeat>
> </ul>
> </body>
> </html>



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)
_______________________________________________
seam-issues mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/seam-issues

Reply via email to