1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.tobago.application;
21
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24 import org.apache.myfaces.tobago.internal.application.ViewHandlerImpl;
25 import org.apache.myfaces.tobago.internal.webapp.TobagoResponse;
26 import org.apache.myfaces.tobago.util.DebugUtils;
27 import org.apache.myfaces.tobago.util.VariableResolverUtils;
28
29 import javax.faces.FacesException;
30 import javax.faces.application.ViewHandler;
31 import javax.faces.component.UIViewRoot;
32 import javax.faces.context.FacesContext;
33 import javax.servlet.RequestDispatcher;
34 import javax.servlet.ServletException;
35 import javax.servlet.ServletResponse;
36 import javax.servlet.http.HttpServletRequest;
37 import javax.servlet.http.HttpServletResponse;
38 import java.io.IOException;
39
40
41
42
43
44 public class FoViewHandlerImpl extends ViewHandlerImpl {
45
46 private static final Logger LOG = LoggerFactory.getLogger(FoViewHandlerImpl.class);
47
48 public FoViewHandlerImpl(ViewHandler base) {
49 super(base);
50 }
51
52 public void renderView(FacesContext facesContext, UIViewRoot viewRoot)
53 throws IOException, FacesException {
54 String requestUri = viewRoot.getViewId();
55
56 String contentType = VariableResolverUtils.resolveClientProperties(facesContext).getContentType();
57 if (LOG.isDebugEnabled()) {
58 LOG.debug("contentType = '" + contentType + "'");
59 }
60 if (contentType.indexOf("fo") == -1) {
61
62 super.renderView(facesContext, viewRoot);
63 } else {
64 try {
65
66 if (facesContext.getExternalContext().getResponse() instanceof TobagoResponse) {
67 ((TobagoResponse) facesContext.getExternalContext().getResponse()).setBuffering();
68
69 HttpServletRequest request = (HttpServletRequest)
70 facesContext.getExternalContext().getRequest();
71 HttpServletResponse response = (HttpServletResponse)
72 facesContext.getExternalContext().getResponse();
73 RequestDispatcher requestDispatcher
74 = request.getRequestDispatcher(requestUri);
75 requestDispatcher.include(request, response);
76 response.setContentType("application/pdf");
77 String buffer =
78 ((TobagoResponse) facesContext.getExternalContext().getResponse()).getBufferedString();
79 ServletResponse servletResponse = (ServletResponse)
80 facesContext.getExternalContext().getResponse();
81 if (LOG.isDebugEnabled()) {
82 LOG.debug("fo buffer: " + buffer);
83 }
84 FopConverter.fo2Pdf(servletResponse, buffer);
85 }
86 } catch (ServletException e) {
87 IOException ex = new IOException();
88 ex.initCause(e);
89 throw ex;
90 }
91 }
92 if (LOG.isDebugEnabled()) {
93 LOG.debug("VIEW");
94 LOG.debug(DebugUtils.toString(facesContext.getViewRoot(), 0));
95 }
96 }
97
98 }