The problem (which I think is a bug) is in the way the url is produced.

The line         
        String url = (String)RequestCycle.get().urlFor(resourceReference, null);

Produces the url to use for the resource ref.

In the non-working version it returns:

../resource/org.apache.wicket.Application/pdfProducer

If I set a breakpoint just after this line and I manually remove the first dot 
in the string  using the debugger to get:

./resource/org.apache.wicket.Application/pdfProducer

and then let the code continue to run, my pdf appears correctly.

The debug trace also shows the correct uri.

2015-03-13 17:59:30,292  DEBUG - ServletWebRequest          - Calculating 
context relative path from: context path '', filterPrefix '', uri 
'/wicket/resource/org.apache.wicket.Application/pdfProducer'
2015-03-13 17:59:30,298  DEBUG - ServletWebRequest          - Calculating 
context relative path from: context path '', filterPrefix '', uri 
'/wicket/resource/org.apache.wicket.Application/pdfProducer'
2015-03-13 17:59:30,301  DEBUG - ServletWebRequest          - Calculating 
context relative path from: context path '', filterPrefix '', uri 
'/wicket/resource/org.apache.wicket.Application/pdfProducer'
2015-03-13 17:59:30,305  DEBUG - CompoundRequestMapper      - One compatible 
mapper found for URL 
'wicket/resource/org.apache.wicket.Application/pdfProducer' -> 'Mapper: 
org.apache.wicket.core.request.mapper.ResourceReferenceMapper; Score: 1'

Maybe someone knows how to fix this? I could strip the first dot as a 
workaround in the mean time.

Bruce

-----Original Message-----
From: Martin Grigorov [mailto:mgrigo...@apache.org] 
Sent: Friday, March 13, 2015 4:17 PM
To: users@wicket.apache.org
Subject: Re: PDF viewed in panel via ResourceReference works in 6.12 but not in 
6.13

Hi,

This is your code:

 WebDocsSession session = (WebDocsSession)getSession();  final byte[] pdf = 
session.getPdf();  if(pdf == null) System.out.println("PdfPanel session.getPdf 
returned null");  PdfResourceProducer pdfResourceProducer = new 
PdfResourceProducer(pdf);  return pdfResourceProducer;


There is nothing Component specific here. Except #getSession(), but you can use 
Session.get() and cast it. It is the same.

If you need the component to be able to generate the PDF bytes then you need to 
implement IResourceListener interface. In #onResourceRequested() you can 
generate the bytes and write them to the Response:
getResponse().write(byte[]).
The change you need to do is in #urlFor():
urlFor(ResourceListener.INTERFACE, parameters))


Martin Grigorov
Freelancer, available for hire!
Wicket Training and Consulting
https://twitter.com/mtgrigorov

On Fri, Mar 13, 2015 at 8:15 PM, Bruce Lombardi <brlom...@gmail.com> wrote:

> Martin,
>
> I'm looking into mounting the resource but there is something that I 
> don't understand.
> Currently I am creating the resource in my panel and passing the pdf I 
> want to display into the constructor of the resource. If I mount the 
> resource, how do I provide it with the dynamically generated pdf? I 
> don't even see a way of getting a hold of the resourceReference object 
> created and mounted in the  WebApplication init() method. Perhaps I 
> need to also register it as an application-shared resource, then 
> access it in my panel constructor and add the pdf there?
>
> Bruce
>
> -----Original Message-----
> From: Martin Grigorov [mailto:mgrigo...@apache.org]
> Sent: Friday, March 13, 2015 12:53 PM
> To: users@wicket.apache.org
> Subject: Re: PDF viewed in panel via ResourceReference works in 6.12 
> but not in 6.13
>
> Hi,
>
> I think I see what happens.
> The ResRef is created as a local variable to create the url and then 
> discarded.
> Wicket has something called ResourceReferenceRegistry. When a ResRef 
> is used to create an url to it it is automatically registered in the registry.
> It seems after 6.13 there is no such auto-registration for your ResRef 
> for some reason.
> You should have some WARNs in the logs.
>
> I see nothing component specific in your ResRef so I'd #mountResource() it.
> This way it will be always available.
>
>
> Martin Grigorov
> Freelancer, available for hire!
> Wicket Training and Consulting
> https://twitter.com/mtgrigorov
>
> On Fri, Mar 13, 2015 at 6:40 PM, Bruce Lombardi <brlom...@gmail.com>
> wrote:
>
> > I have a PdfViewer page that contains a panel that displays a 
> > dynamically generated PDF using a resource reference. This works 
> > fine in Wicket 6.12.0, but when I upgrade to 6.13.0 it stops working 
> > (just changed Maven dependency
> > - no code changes). No errors are displayed and the html is 
> > generated exactly as it is with 6.12, but the pdf does not show up in the 
> > page.
> >
> > By setting a breakpoint in Eclipse I have determined that code in 
> > the resource that produces the response (newResourceResponse) is 
> > never called in 6.13. After migrating to the latest version (6.19) I 
> > still get the problem.
> > I've looked at the release notes for version 6.13 and see some 
> > changes related to IResource but nothing that looks related to this problem.
> >
> > I'm hoping someone has seen something similar. Here is some of the 
> > relevant
> > code:
> >
> > PdfViewer .html - just has reference to panel
> >
> >        <div wicket:id="pdfPanel"></div>
> >
> >
> >
> > PdfPane.html - just has object reference
> >
> > Raw HTML
> >
> >        <object wicket:id="pdf" data="" border="1" width="80%"
> > height="80%"></object>
> >
> >
> >
> > Generated HTML - seen with view source in browser
> >
> >         <object
> data="./resource/org.apache.wicket.Application/pdfProducer"
> >
> >                border="1" width="80%" height="80%"></object>
> >
> >
> >
> > PdfPanel.java - has setup for resource reference
> >
> > public class PdfPanel extends Panel {
> >
> >
> >
> >        private static final long serialVersionUID = 1L;
> >
> >
> >
> >        public PdfPanel(String id) {
> >
> >               super(id);
> >
> >
> >
> >               ResourceReference resourceReference = new 
> > ResourceReference(
> >
> >                            "pdfProducer") {
> >
> >                      private static final long serialVersionUID = 
> > 1L;
> >
> >
> >
> >                      @Override
> >
> >                      public IResource getResource() {
> >
> >                            WebDocsSession session = 
> > (WebDocsSession)getSession();
> >
> >
> >
> >                            final byte[] pdf = session.getPdf();
> >
> >
> >
> >                            if(pdf == null)
> >
> > System.out.println("PdfPanel session.getPdf returned null");
> >
> >
> >
> > PdfResourceProducer pdfResourceProducer =
> >
> > new PdfResourceProducer(pdf);
> >
> >
> >
> >                            return pdfResourceProducer;
> >
> >                      }
> >
> >               };
> >
> >
> >
> >         String url =
> > (String)RequestCycle.get().urlFor(resourceReference,
> > null);
> >
> >
> >
> >         MarkupContainer wmc = new WebMarkupContainer("pdf");
> >
> >         wmc.add(new AttributeModifier("data", url));
> >
> >         add(wmc);
> >
> >        }
> >
> >
> >
> > PdfProducer.java - implements the Resource
> >
> >                 public class PdfResourceProducer extends 
> > AbstractResource {
> >
> >
> >
> >        private static final long serialVersionUID = 
> > -2245331056747467763L;
> >
> >        final byte[] pdfByteArray;
> >
> >
> >
> >
> >
> >        public PdfResourceProducer(byte[] pdfByteArray) {
> >
> >               super();
> >
> >               this.pdfByteArray = pdfByteArray;
> >
> >               if(pdfByteArray == null) {
> >
> >                      System.out.println("PdfResourceProducer
> > constructor called with
> >
> > null byte array.");
> >
> >               }
> >
> >        }
> >
> >
> >
> >        @Override
> >
> >        protected ResourceResponse newResourceResponse(Attributes
> > attributes)
> > {
> >
> >               ResourceResponse resourceResponse = new 
> > ResourceResponse();
> >
> >               resourceResponse.setContentType("application/pdf");
> >
> >               // resourceResponse.setTextEncoding("utf-8");
> >
> >
> >
> >
> > resourceResponse.setContentLength((int)pdfByteArray.length);
> >
> >
> >
> >               resourceResponse.disableCaching(); //do not allow 
> > resource to be cached.
> >
> >
> >
> >               resourceResponse.setWriteCallback(new WriteCallback() 
> > {
> >
> >                      @Override
> >
> >                      public void writeData(Attributes attributes) 
> > throws IOException {
> >
> >                            try {
> >
> >                                   OutputStream outputStream =
> > attributes.getResponse()
> >
> >                                                 .getOutputStream();
> >
> >                                   outputStream.write(pdfByteArray);
> >
> >                                   outputStream.flush();
> >
> >                            } catch (IOException e) {
> >
> >                                   throw new WicketRuntimeException(
> >
> >                                                 "Problems writing 
> > pdf to response...");
> >
> >                            }
> >
> >                      }
> >
> >               });
> >
> >
> >
> >               return resourceResponse;
> >
> >        }
> >
> >
> >
> > Bruce
> >
> >
> >
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> For additional commands, e-mail: users-h...@wicket.apache.org
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to