myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Thomas Andraschko <andraschko.tho...@gmail.com>
Subject Re: Unwrap CC ValueExpression?
Date Mon, 13 May 2013 13:04:54 GMT
I'm sure, i checked the code base :)

We generate a report on the fly for the user. It just depends on the
session data but not on view data, therefore streamedContent is actually a
nice solution.


2013/5/13 Christian Beikov <christian.beikov@gmail.com>

> I am not sure if that is independent. I think catagy fixed something like
> this in a newer release.
>
> Well I fixed the graphicImage thing by using the previously provided
> implementation. It's costly because it has to restore the view but in the
> end it works for us. We are using the graphicImage in composite components
> too as far as I remember.
> To overcome the filedownload problem I wrote my own
> UIComponent/UINamingContainer for the composite component which wraps a
> command link that uses the action listener provided by the composite
> component implementation instead of using the fileDownload of PF.
> I didn't use the media component before, but if the content is really
> stateless why don't you provide it via something like:
> #{resource['library:file']} ?
>
>
> 2013/5/13 Thomas Andraschko <andraschko.thomas@gmail.com>
>
> > 3.5.4 but thats indepenent :)
> >
> >
> >
> > 2013/5/13 Christian Beikov <christian.beikov@gmail.com>
> >
> > > What PF version are you using?
> > >
> > >
> > > 2013/5/13 Thomas Andraschko <andraschko.thomas@gmail.com>
> > >
> > > > It's really view independent and  my Controller is RequestScoped.
> > > > The only problem is that currently graphicImage/media/filedownload
> are
> > > > unusable in a CC, if you need to pass the EL into the CC.
> > > >
> > > >
> > > > 2013/5/13 Christian Beikov <christian.beikov@gmail.com>
> > > >
> > > > > The difference is that it can handle the view based scopes where
> the
> > > > > primefaces impl can't. But as I just realize this won't help you
at
> > > all.
> > > > > Sorry but for now I can't think of a reliable general purpose way
> to
> > > > > retrieve the contents without rebuilding the view, I have to think
> > > about
> > > > > it.
> > > > > Do you need any context information like iteration status or so to
> > > > evaluate
> > > > > the expression to a meaningful value or is it completely
> independent
> > of
> > > > the
> > > > > view?
> > > > > What scope has the myController?
> > > > >
> > > > >
> > > > > 2013/5/13 Thomas Andraschko <andraschko.thomas@gmail.com>
> > > > >
> > > > > > Hi Christian,
> > > > > >
> > > > > > i don't understand your solution exactly.
> > > > > > Whats the difference?
> > > > > > It would still store the #{cc.attrs.xxx} expression and #{cc}
> cant
> > be
> > > > > > evaluated without #pushComponentToEL(cc).
> > > > > > Also #createView should be avoided for such a request IMO because
> > of
> > > > > > performance.
> > > > > >
> > > > > > Regards,
> > > > > > Thomas
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > 2013/5/13 Christian Beikov <christian.beikov@gmail.com>
> > > > > >
> > > > > > > I'd rather say this should be fixed by restoring the view
> before
> > > > > > accessing
> > > > > > > the expression. I have done something like that for
> > > > > > > DynamicContentResourceHandler which probably is used in
this
> case
> > > > here
> > > > > > too.
> > > > > > > Basically you need to save the viewId and the expression
> together
> > > in
> > > > > the
> > > > > > > session so you are able to restore the adequate expression
in
> the
> > > > > > resource
> > > > > > > handler. I did the following for GraphicImageRenderer:
> > > > > > >
> > > > > > >
> > > > > > >     @Override
> > > > > > >     protected String getImageSrc(FacesContext context,
> > GraphicImage
> > > > > > image)
> > > > > > > {
> > > > > > >         String src = null;
> > > > > > >         String name = image.getName();
> > > > > > >
> > > > > > >         if(name != null) {
> > > > > > >             String libName = image.getLibrary();
> > > > > > >             ResourceHandler handler =
> > > > > > > context.getApplication().getResourceHandler();
> > > > > > >             Resource res = handler.createResource(name,
> libName);
> > > > > > >
> > > > > > >             if(res == null) {
> > > > > > >                 return "RES_NOT_FOUND";
> > > > > > >             } else {
> > > > > > >                 return
> > > > > > >
> > > context.getExternalContext().encodeResourceURL(res.getRequestPath());
> > > > > > >             }
> > > > > > >         } else {
> > > > > > >             Object value = image.getValue();
> > > > > > >
> > > > > > >             if (value == null) {
> > > > > > >                 return "";
> > > > > > >             } else  if(value instanceof String) {
> > > > > > >                 src = getResourceURL(context, (String)
value);
> > > > > > >             } else if (value instanceof StreamedContent)
{
> > > > > > >                 ViewHandler viewHandler =
> > > > > > > context.getApplication().getViewHandler();
> > > > > > >                 StreamedContent streamedContent =
> > (StreamedContent)
> > > > > > value;
> > > > > > >                 Resource resource =
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> context.getApplication().getResourceHandler().createResource("dynamiccontent",
> > > > > > > "primefaces", streamedContent.getContentType());
> > > > > > >                 String resourcePath =
> resource.getRequestPath();
> > > > > > >
> > > > > > >                 // servlet path/prefix is added already
in
> > > > > > > ViewHandler.getActionURL so remove it here
> > > > > > >                 resourcePath =
> > > > > > >
> > > >
> resourcePath.substring(resourcePath.indexOf("/javax.faces.resource/"));
> > > > > > >                 resourcePath =
> viewHandler.getActionURL(context,
> > > > > > > resourcePath);
> > > > > > >
> > > > > > >                 String rid = createUniqueContentId(context);
> > > > > > >                 StringBuilder builder = new
> > > > > StringBuilder(resourcePath);
> > > > > > >
> > > > > > >                 if(resourcePath.contains("?"))
> > > > > > >                     builder.append("&");
> > > > > > >                 else
> > > > > > >                     builder.append("?");
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> builder.append(DynamicContentResourceHandler.DYNAMIC_CONTENT_PARAM).append("=").append(rid);
> > > > > > >                 builder.append("&").append("ln=primefaces");
> > > > > > >
> > > > > > >                 for (UIComponent kid : image.getChildren())
{
> > > > > > >                     if (kid instanceof UIParameter) {
> > > > > > >                         UIParameter param = (UIParameter)
kid;
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> builder.append("&").append(param.getName()).append("=").append(param.getValue());
> > > > > > >                     }
> > > > > > >                 }
> > > > > > >
> > > > > > >                 src = builder.toString();
> > > > > > >                 Map<String, String> dynamicContentMap
= new
> > > > > > HashMap<String,
> > > > > > > String>();
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> dynamicContentMap.put(DynamicContentResourceHandler.DYNAMIC_CONTENT_VALUE_EXPRESSION_KEY,
> > > > > > > image.getValueExpression("value").getExpressionString());
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> dynamicContentMap.put(DynamicContentResourceHandler.DYNAMIC_CONTENT_VIEW_ID_KEY,
> > > > > > > context.getViewRoot().getViewId());
> > > > > > >
> > > > > > >
> > > context.getExternalContext().getSessionMap().put(rid,
> > > > > > > dynamicContentMap);
> > > > > > >             }
> > > > > > >
> > > > > > >             // Add caching if needed
> > > > > > >             if (!image.isCache()) {
> > > > > > >                 src += src.contains("?") ? "&" : "?";
> > > > > > >                 src = src + "primefaces_image=" +
> > > > > > > UUID.randomUUID().toString();
> > > > > > >             }
> > > > > > >
> > > > > > >         }
> > > > > > >
> > > > > > >         return src;
> > > > > > >     }
> > > > > > >
> > > > > > >
> > > > > > > And then I have the DynamicContentResourceHandler:
> > > > > > >
> > > > > > > public class DynamicContentResourceHandler extends
> > > > > PrimeResourceHandler{
> > > > > > >
> > > > > > >     private final static Logger logger =
> > > > > > >
> Logger.getLogger(DynamicContentResourceHandler.class.getName());
> > > > > > >
> > > > > > >     public static final String DYNAMIC_CONTENT_VIEW_ID_KEY
=
> > > > "viewId";
> > > > > > >     public static final String
> > > DYNAMIC_CONTENT_VALUE_EXPRESSION_KEY =
> > > > > > > "valueExpression";
> > > > > > >     public static final String DYNAMIC_CONTENT_PARAM =
> "pfdrid";
> > > > > > >
> > > > > > >     public DynamicContentResourceHandler(ResourceHandler
> > wrapped) {
> > > > > > >         super(wrapped);
> > > > > > >     }
> > > > > > >
> > > > > > >     @Override
> > > > > > >     public void handleResourceRequest(FacesContext context)
> > throws
> > > > > > > IOException {
> > > > > > >         Map<String,String> params =
> > > > > > > context.getExternalContext().getRequestParameterMap();
> > > > > > >         String library = params.get("ln");
> > > > > > >         String dynamicContentId =
> > > params.get(DYNAMIC_CONTENT_PARAM);
> > > > > > >
> > > > > > >         if(dynamicContentId != null && library
!= null &&
> > > > > > > library.equals("primefaces")) {
> > > > > > >             Map<String,Object> session =
> > > > > > > context.getExternalContext().getSessionMap();
> > > > > > >             StreamedContent content = null;
> > > > > > >
> > > > > > >             try {
> > > > > > >                 @SuppressWarnings("unchecked")
> > > > > > >                 Map<String, String> dynamicContentMap
=
> > > (Map<String,
> > > > > > > String>) session.get(dynamicContentId);
> > > > > > >
> > > > > > >                 if(dynamicContentMap != null){
> > > > > > >                     String viewId =
> > > > > > > dynamicContentMap.get(DYNAMIC_CONTENT_VIEW_ID_KEY);
> > > > > > >                     String dynamicContentEL =
> > > > > > > dynamicContentMap.get(DYNAMIC_CONTENT_VALUE_EXPRESSION_KEY);
> > > > > > >
> > > > > > >                     // Workaround for view based scopes
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> context.setViewRoot(context.getApplication().getViewHandler().createView(context,
> > > > > > > viewId));
> > > > > > >
> > > > > > >                     ELContext eLContext =
> context.getELContext();
> > > > > > >                     ValueExpression ve =
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> context.getApplication().getExpressionFactory().createValueExpression(context.getELContext(),
> > > > > > > dynamicContentEL, StreamedContent.class);
> > > > > > >                     content = (StreamedContent)
> > > > ve.getValue(eLContext);
> > > > > > >
> > > > > > >                     ExternalContext externalContext =
> > > > > > > context.getExternalContext();
> > > > > > >
> > > > > > > externalContext.setResponseStatus(HttpServletResponse.SC_OK);
> > > > > > >
> > > > > > >
> externalContext.setResponseContentType(content.getContentType());
> > > > > > >
> > > > > > >                     byte[] buffer = new byte[2048];
> > > > > > >
> > > > > > >                     int length;
> > > > > > >                     InputStream inputStream =
> > content.getStream();
> > > > > > >
> > > > > > >                     while ((length =
> (inputStream.read(buffer)))
> > >=
> > > > 0)
> > > > > {
> > > > > > >
> > > > > > > externalContext.getResponseOutputStream().write(buffer,
0,
> > length);
> > > > > > >                     }
> > > > > > >
> > > > > > >
> > > > externalContext.getResponseOutputStream().flush();
> > > > > > >                     context.responseComplete();
> > > > > > >                 } else {
> > > > > > >                     ExternalContext externalContext =
> > > > > > > context.getExternalContext();
> > > > > > >
> > > > > > >
> > > externalContext.setResponseStatus(HttpServletResponse.SC_NOT_FOUND);
> > > > > > >
> > > > externalContext.getResponseOutputStream().flush();
> > > > > > >                     context.responseComplete();
> > > > > > >                 }
> > > > > > >             } catch(Exception e) {
> > > > > > >                 logger.log(Level.SEVERE, "Error in streaming
> > > dynamic
> > > > > > > resource.", e);
> > > > > > >             } finally {
> > > > > > >                 session.remove(dynamicContentId);
> > > > > > >
> > > > > > >                 if(content != null) {
> > > > > > >                     content.getStream().close();
> > > > > > >                 }
> > > > > > >             }
> > > > > > >         }
> > > > > > >         else {
> > > > > > >            super.handleResourceRequest(context);
> > > > > > >         }
> > > > > > >     }
> > > > > > >
> > > > > > > }
> > > > > > >
> > > > > > > This at least works for me, hope it can help you too.
> > > > > > >
> > > > > > >
> > > > > > > 2013/5/13 Thomas Andraschko <andraschko.thomas@gmail.com>
> > > > > > >
> > > > > > > > Hi Kito,
> > > > > > > >
> > > > > > > > CC:
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> ----------------------------------------------------------------------------------------------------------------
> > > > > > > >     <composite:interface>
> > > > > > > >         <composite:attribute name="pdfStream"
> > > > > > > > type="org.primefaces.model.StreamedContent" required="true"
> />
> > > > > > > >     </composite:interface>
> > > > > > > >
> > > > > > > >     <composite:implementation>
> > > > > > > >         <p:media value="#{cc.attrs.pdfStream}"
width="100%"
> > > > > > > height="600px"
> > > > > > > > player="pdf"/>
> > > > > > > >     </composite:implementation>
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> ----------------------------------------------------------------------------------------------------------------
> > > > > > > >
> > > > > > > > View:
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> ----------------------------------------------------------------------------------------------------------------
> > > > > > > >     <cc:myCC pdfStream="#{reportController.report}
/>
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> ----------------------------------------------------------------------------------------------------------------
> > > > > > > >
> > > > > > > > PF receives the Expression String via:
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> ----------------------------------------------------------------------------------------------------------------
> > > > > > > > media.getValueExpression("value").getExpressionString();
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> ----------------------------------------------------------------------------------------------------------------
> > > > > > > >
> > > > > > > > If it should work inside a CC, we must receive
> > > > > "#{cc.attrs.pdfStream}"
> > > > > > > > instead of "#{cc.attrs.pdfStream}".
> > > > > > > >
> > > > > > > > How can get the real expression here?
> > > > > > > >
> > > > > > > > Thanks,
> > > > > > > > Thomas
> > > > > > > >
> > > > > > > >
> > > > > > > > 2013/5/13 Kito Mann <kito.mann@virtua.com>
> > > > > > > >
> > > > > > > > > Hello Thomas,
> > > > > > > > >
> > > > > > > > > I think this is doable. Can you send us your
composite
> > > component
> > > > > > code?
> > > > > > > > >
> > > > > > > > > ___
> > > > > > > > >
> > > > > > > > > Kito D. Mann | @kito99 | Author, JSF in Action
> > > > > > > > > Virtua, Inc. | http://www.virtua.com | JSF/Java
EE
> training
> > > and
> > > > > > > > consulting
> > > > > > > > > http://www.JSFCentral.com - JavaServer Faces
FAQ, news,
> and
> > > > info |
> > > > > > > > > @jsfcentral
> > > > > > > > > +1 203-998-0403
> > > > > > > > >
> > > > > > > > > * JSF2 in Action Course - 6/17 - London:
> > > > > > > > > http://skillsmatter.com/course/home/jsf-and-ajax/ng-6708
> > > > > > > > > * Listen to the Enterprise Java Newscast: *
> > > > > > > > > http://blogs.jsfcentral.com/JSFNewscast/
> > > > > > > > > *
> > > > > > > > > * JSFCentral Interviews Podcast:
> > > > > > > > > http://www.jsfcentral.com/resources/jsfcentralpodcasts/
> > > > > > > > > * Sign up for the JSFCentral Newsletter:
> > > > > > > > > http://oi.vresp.com/?fid=ac048d0e17
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > On Mon, May 13, 2013 at 7:17 AM, Thomas Andraschko
<
> > > > > > > > > andraschko.thomas@gmail.com> wrote:
> > > > > > > > >
> > > > > > > > > > Hi,
> > > > > > > > > >
> > > > > > > > > > is it possible unwrap a CC ValueExpresion?
> > > > > > > > > > i found a bug with PrimeFaces p:media inside
a composite
> > > > > component
> > > > > > > and
> > > > > > > > i
> > > > > > > > > > would like to fix it.
> > > > > > > > > >
> > > > > > > > > > If you pass the EL via a CC attr (e.g.
> > > #{myController.content})
> > > > > and
> > > > > > > > > attach
> > > > > > > > > > it to p:media (e.g. #{cc.attrs.content}),
> > > > > > > > > > p:media gets the ValueExpression and saves
them in the
> > > session,
> > > > > to
> > > > > > > > later
> > > > > > > > > > stream the content in a resource request.
> > > > > > > > > > Later the ResourceHandler evaluates it and
tries to get
> the
> > > > value
> > > > > > of
> > > > > > > > > > #{cc.attrs.content}, which can't work ofc.
> > > > > > > > > >
> > > > > > > > > > So is it possible to extract the "real"
EL before store
> it
> > in
> > > > the
> > > > > > > > > session?
> > > > > > > > > > Is there a solution which also works in
mojarra?
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > > Regards,
> > > > > > > > > > Thomas
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > --
> > > > > > > <br/>
> > > > > > > <br/>
> > > > > > > Mit freundlichen Grüßen,<br/>
> > > > > > > <hr/>
> > > > > > > <b>Christian Beikov</b><br/>
> > > > > > > Blazebit Design & Developing<br/>
> > > > > > > <a href="http://www.blazebit.com">http://www.blazebit.com
> > </a><br/>
> > > > > > >
> > > > > >
> > > > >
> > > > >
> > > > >
> > > > > --
> > > > > <br/>
> > > > > <br/>
> > > > > Mit freundlichen Grüßen,<br/>
> > > > > <hr/>
> > > > > <b>Christian Beikov</b><br/>
> > > > > Blazebit Design & Developing<br/>
> > > > > <a href="http://www.blazebit.com">http://www.blazebit.com</a><br/>
> > > > >
> > > >
> > >
> > >
> > >
> > > --
> > > <br/>
> > > <br/>
> > > Mit freundlichen Grüßen,<br/>
> > > <hr/>
> > > <b>Christian Beikov</b><br/>
> > > Blazebit Design & Developing<br/>
> > > <a href="http://www.blazebit.com">http://www.blazebit.com</a><br/>
> > >
> >
>
>
>
> --
> <br/>
> <br/>
> Mit freundlichen Grüßen,<br/>
> <hr/>
> <b>Christian Beikov</b><br/>
> Blazebit Design & Developing<br/>
> <a href="http://www.blazebit.com">http://www.blazebit.com</a><br/>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message