Also lastly to combine with my previous mail, it doesn’t have to be only 
images. It could also be pdf’s, zips,… So the approach I am using now won’t 
work in all the cases I want :)


> On 28 Jul 2016, at 23:44, Roy Teeuwen <r...@teeuwen.be> wrote:
> 
> Hey Jason, Olivier,
> 
> @Jason:
> Damn, I feel so stupid now :D indeed, using 
> /content/dam/nice-image.jpg.cdn./modification-date/20160815/nice-image.jpg 
> fixes everything. I don’t have to implement the nonexistingservlet anymore 
> ;), I was indeed thinking that jpg was the extension and so that the cdn HAD 
> to be before the jpg because else the cdn would be the extension, but your 
> explanation makes sense!
> 
> @Olivier:
> "What's the reason for forwarding instead of reading/serving the resource 
> from the repository in your current servlet?” Currently I am doing it like 
> that, but I find the implementation a bit nasty… See how I did it:
> 
> @Override
> protected void doGet(SlingHttpServletRequest request, 
> SlingHttpServletResponse response) throws ServletException, IOException {
>     Resource resource = request.getResource();
>     final Image image = new Image(resource);
>     image.set(Image.PN_REFERENCE, resource.getPath());
>     try {
>         final String mimeType = image.getMimeType();
>         final Layer layer = image.getLayer(false, false, false);
>         double quality = mimeType.equals(MIME_TYPE_GIF) ? 255 : 1.0;
>         response.setContentType(mimeType);
>         layer.write(mimeType, quality, response.getOutputStream());
>         response.getOutputStream().flush();
>     } catch (RepositoryException e) {
>         LOG.error("could not get layer", e);
>     }
> }
> 
> Thats why I would think it would be easier / nicer to just forward it to the 
> normal jpg handling servlet so that I don’t actually have to manually write 
> it to the servlet response output. If there is a better way in serving the 
> image resource from the repo, do tell :D.
> 
> (For when you might be curious on why I am doing all of this, I am adding the 
> latest modification date to all the image urls because the image urls 
> actually get served by a cdn in front that proxies to the dam: 
> https://some.azureedge.net/content/dam/nice-image.jpg.cdn./modification-date/20160815/nice-image.jpg
>  
> <https://some.azureedge.net/content/dam/nice-image.jpg.cdn./modification-date/20160815/nice-image.jpg>
>  , this way when the same image gets replaced in the dam by a new image with 
> the same name on a page, I don’t have to invalidate the azure cdn cache 
> because the modification date changing in the url takes care of that, and 
> because I am not using a query string I also don’t have to care about 
> nullifying the browser client-side caching)
> 
> Thanks so far!
> Greets,
> Roy
> 
> 
>> On 28 Jul 2016, at 23:02, Jason Bailey <jason.bai...@sas.com 
>> <mailto:jason.bai...@sas.com>> wrote:
>> 
>> I was going to say that you shouldn't need to implement NonExistingResource 
>> interface because a selector wouldn't impact resolution then I had one of 
>> those blinding aha moments.
>> 
>> In the case of the url you posted you aren't adding a selector, you are 
>> modifying the resource name.  '/content/dam/nice-image.jpg' does not have an 
>> extension in the traditional sense, in the traditional sling sense the 
>> resource would actually be '/content/dam/nice-image' and jpg would be a 
>> handler that would return the asset as a jpeg. 
>> 
>> So when you are adding a selector to it it's not matching anything because 
>> there is no '/content/dam/nice-image' resource to match against.
>> 
>> So first make your request find the resource without the servlet in the way. 
>> If you switch around the .cdn to the end and add a period at the end of cdn 
>> like this... 
>> 
>> content/dam/nice-image.jpg.cdn./modification-date/20160815/nice-image.jpg
>> 
>> This should work to return the original nice-image.jpg at that point it 
>> should be easier to create a servlet that will have the resource as part of 
>> the request.
>> 
>> Or optionally you could try adding a sling:resourceType to the image and 
>> have a selector within that resource type that does what you need it do.
>> 
>> -Jason
>> 
>> 
>> 
>> -----Original Message-----
>> From: Roy Teeuwen [mailto:r...@teeuwen.be <mailto:r...@teeuwen.be>] 
>> Sent: Thursday, July 28, 2016 3:17 PM
>> To: users@sling.apache.org <mailto:users@sling.apache.org>
>> Subject: Re: Getting the actual resource from a request
>> 
>> Hmm Sorry Jason,
>> 
>> I might have had to notice that I am extending SlingSafeMethodServlet but 
>> also implementing the following servlet:
>> https://docs.adobe.com/docs/en/cq/5-6-1/javadoc/com/day/cq/commons/servlets/NonExistingResourceServlet.html
>>  
>> <https://docs.adobe.com/docs/en/cq/5-6-1/javadoc/com/day/cq/commons/servlets/NonExistingResourceServlet.html>
>> 
>> And as it states in the docs itself, it also says:
>>      public boolean accepts(SlingHttpServletRequest request) {
>>          // get non-existing path (incl. selectors and extension!)
>>          String path = request.getResource().getPath();
>>          // return true if this servlet can handle this path
>>          return true;
>>      }
>> 
>> So probably it’s not possible to do it through this interface in without 
>> manually parseing :) It also says in the docs: Please note: This is a 
>> temporary solution until Sling provides a built-in mechanism for this use 
>> case. Not to be used by client implementations!
>> 
>> Any clue if it is possible yet to do it with standard sling, the thing I try 
>> to achieve is a servlet that also catches resources with a selector AND 
>> suffix (as stated in my example of course) ?
>> 
>> Thanks!
>> Roy
>> 
>> 
>>> On 28 Jul 2016, at 18:35, Jason Bailey <jason.bai...@sas.com> wrote:
>>> 
>>> I'm under the understanding that it is;
>>> 
>>> request.getResource().getPath()
>>> 
>>> -----Original Message-----
>>> From: Roy Teeuwen [mailto:r...@teeuwen.be]
>>> Sent: Thursday, July 28, 2016 12:31 PM
>>> To: users@sling.apache.org
>>> Subject: Getting the actual resource from a request
>>> 
>>> Hey all,
>>> 
>>> I am creating a SlingServlet that will work by both using a selector 
>>> and a suffix. The resource is for example /content/dam/image.jpg and 
>>> the actual url will be 
>>> /content/dam/nice-image.cdn.jpg/modification-date/20160815/nice-image.
>>> jpg
>>> 
>>> What is the most easy way to get the actual resource path again from the 
>>> SlingHttpServletRequest? Currently I am doing the following but I find it a 
>>> bit cumbersome:
>>> 
>>> private String getResourcePath(SlingHttpServletRequest request) {
>>>   String requestUrl = request.getRequestPathInfo().getResourcePath();
>>>   int endIndex = 
>>> requestUrl.lastIndexOf(request.getRequestPathInfo().getSuffix());
>>>   String resourcePathWithSelector = requestUrl.substring(0, endIndex);
>>>   endIndex = 
>>> resourcePathWithSelector.lastIndexOf(request.getRequestPathInfo().getSelectorString()
>>>  + "." + request.getRequestPathInfo().getExtension());
>>>   return resourcePathWithSelector.substring(0, endIndex) + 
>>> request.getRequestPathInfo().getExtension();
>>> }
>>> 
>>> Is there an easier way or is parsing it like this the only way?
>>> 
>>> Also after I got the actual resourcePath, I tried doing the following, but 
>>> this doesn’t seem to work, any clue on why? 
>>> 
>>> @Override
>>> protected void doGet(SlingHttpServletRequest request, 
>>> SlingHttpServletResponse response) throws ServletException, IOException {
>>>     RequestDispatcherOptions opts = new RequestDispatcherOptions();
>>>     opts.setReplaceSelectors("");
>>>     String resourcePath = getResourcePath(request);
>>>     RequestDispatcher dispatcher = 
>>> request.getRequestDispatcher(resourcePath, opts);
>>>     if (dispatcher != null) {
>>>         dispatcher.forward(request, response);
>>>     }
>>> }
>>> 
>>> I would expect that the previous would actually just forward it to the 
>>> actual image being fetched from the getResourcePath but it just gives 
>>> me a 404 not found (I checked the getResourcePath and it does return 
>>> /content/dam/nice-image.jpg)
>>> 
>>> Thanks!
>>> Roy
>> 
> 

Reply via email to