You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/02/22 12:58:35 UTC

[isis] branch master updated: ISIS-2538: fix potential client side caching issues for Blob/Clob

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new ca8668d  ISIS-2538: fix potential client side caching issues for Blob/Clob
ca8668d is described below

commit ca8668d0c020b46b95c651cc5939f76d64fb171a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Feb 22 13:58:19 2021 +0100

    ISIS-2538: fix potential client side caching issues for Blob/Clob
    
    reinstates code that was previously removed for the no-arg case, so does
    apply more generally
---
 .../viewer/wicket/model/models/ActionModel.java    | 35 ++++++++++++++++++----
 .../actionresponse/ActionResultResponseType.java   |  4 +--
 2 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 946b176..141e1b0 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -278,7 +278,7 @@ implements FormUiModel, FormExecutorContext, BookmarkableModel {
         return null;
     }
 
-    public static IRequestHandler downloadHandler(final Object value) {
+    public IRequestHandler downloadHandler(final Object value) {
         if(value instanceof Clob) {
             val clob = (Clob)value;
             return handlerFor(resourceStreamFor(clob), clob);
@@ -313,15 +313,20 @@ implements FormUiModel, FormExecutorContext, BookmarkableModel {
     }
 
     private static IResourceStream resourceStreamFor(final Clob clob) {
-        final IResourceStream resourceStream = new StringResourceStream(clob.getChars(), clob.getMimeType().toString());
-        return resourceStream;
+        return new StringResourceStream(clob.getChars(), clob.getMimeType().toString());
     }
 
-    private static IRequestHandler handlerFor(final IResourceStream resourceStream, final NamedWithMimeType namedWithMimeType) {
-        final ResourceStreamRequestHandler handler =
+    private IRequestHandler handlerFor(
+            final IResourceStream resourceStream, 
+            final NamedWithMimeType namedWithMimeType) {
+        val handler =
                 new ResourceStreamRequestHandler(resourceStream, namedWithMimeType.getName());
         handler.setContentDisposition(ContentDisposition.ATTACHMENT);
-        return handler;
+        
+        //ISIS-1619, prevent clients from caching the response content
+        return isIdempotentOrCachable()
+                ? handler
+                : enforceNoCacheOnClientSide(handler);
     }
 
     //////////////////////////////////////////////////
@@ -476,6 +481,12 @@ implements FormUiModel, FormExecutorContext, BookmarkableModel {
         });
 
     }
+    
+    // -- HELPER
+    
+    private boolean isIdempotentOrCachable() {
+        return ObjectAction.Util.isIdempotentOrCachable(getMetaModel());
+    }
 
 //    private boolean isPartOfChoicesConsideringDependentArgs(
 //            ManagedObject paramValue, 
@@ -487,5 +498,17 @@ implements FormUiModel, FormExecutorContext, BookmarkableModel {
 //                .anyMatch(choice->Objects.equals(pendingValue, choice.getPojo()));
 //    }
 
+    // -- CLIENT SIDE CACHING ASPECTS ...
+
+    private static IRequestHandler enforceNoCacheOnClientSide(IRequestHandler downloadHandler){
+        if(downloadHandler==null) {
+            return downloadHandler;
+        }
+        if(downloadHandler instanceof ResourceStreamRequestHandler)
+            ((ResourceStreamRequestHandler) downloadHandler)
+            .setCacheDuration(org.apache.wicket.util.time.Duration.seconds(0));
+
+        return downloadHandler;
+    }
 
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
index 121e2a9..66f11a4 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
@@ -82,7 +82,7 @@ public enum ActionResultResponseType {
         @Override
         public ActionResultResponse interpretResult(ActionModel model, AjaxRequestTarget target, ManagedObject resultAdapter) {
             final Object value = resultAdapter.getPojo();
-            IRequestHandler handler = ActionModel.downloadHandler(value);
+            IRequestHandler handler = model.downloadHandler(value);
             return ActionResultResponse.withHandler(handler);
         }
     },
@@ -90,7 +90,7 @@ public enum ActionResultResponseType {
         @Override
         public ActionResultResponse interpretResult(ActionModel model, AjaxRequestTarget target, ManagedObject resultAdapter) {
             final Object value = resultAdapter.getPojo();
-            IRequestHandler handler = ActionModel.downloadHandler(value);
+            IRequestHandler handler = model.downloadHandler(value);
             return ActionResultResponse.withHandler(handler);
         }
     },