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

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


The following commit(s) were added to refs/heads/master by this push:
     new 858bb2a  WICKET-6936 allow alternative read and write
858bb2a is described below

commit 858bb2a46df1a43378dd2a762614c309e6707e07
Author: Sven Meier <[email protected]>
AuthorDate: Mon Nov 22 20:43:50 2021 +0100

    WICKET-6936 allow alternative read and write
---
 .../org/apache/wicket/pageStore/FilePageStore.java | 114 ++++++++++++---------
 .../apache/wicket/pageStore/FilePageStoreTest.java |   1 -
 2 files changed, 68 insertions(+), 47 deletions(-)

diff --git 
a/wicket-core/src/main/java/org/apache/wicket/pageStore/FilePageStore.java 
b/wicket-core/src/main/java/org/apache/wicket/pageStore/FilePageStore.java
index 4462b1b..38a8d0a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/FilePageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/FilePageStore.java
@@ -102,43 +102,50 @@ public class FilePageStore extends 
AbstractPersistentPageStore implements IPersi
        @Override
        protected IManageablePage getPersistedPage(String sessionIdentifier, 
int id)
        {
-               byte[] data = readFile(sessionIdentifier, id);
-               if (data == null)
+               File file = getPageFile(sessionIdentifier, id, false);
+               if (file.exists() == false)
                {
                        return null;
                }
-               
-               return new SerializedPage(id, "unknown", data);
-       }
 
-       private byte[] readFile(String sessionIdentifier, int id)
-       {
-               File file = getPageFile(sessionIdentifier, id, false);
-               if (file.exists() == false)
+               byte[] data;
+               try
+               {
+                       data = readFile(file);
+               }
+               catch (IOException ex)
                {
+                       log.warn("cannot read page data for session {} page 
{}", sessionIdentifier, id, ex);
                        return null;
                }
 
-               byte[] data = null;
+               return new SerializedPage(id, "unknown", data);
+       }
+
+       /**
+        * Read a file.
+        * <p>
+        * Note: This implementation uses a {@link FileChannel}.
+        * 
+        * @param file
+        *            file to read
+        * @throws IOException
+        */
+       protected byte[] readFile(File file) throws IOException
+       {
+               byte[] data;
 
+               FileChannel channel = FileChannel.open(file.toPath());
                try
                {
-                       FileChannel channel = FileChannel.open(file.toPath());
-                       try
-                       {
-                               int size = (int)channel.size();
-                               MappedByteBuffer buf = 
channel.map(MapMode.READ_ONLY, 0, size);
-                               data = new byte[size];
-                               buf.get(data);
-                       }
-                       finally
-                       {
-                               IOUtils.closeQuietly(channel);
-                       }
+                       int size = (int)channel.size();
+                       MappedByteBuffer buf = channel.map(MapMode.READ_ONLY, 
0, size);
+                       data = new byte[size];
+                       buf.get(data);
                }
-               catch (IOException ex)
+               finally
                {
-                       log.warn("cannot read page data for session {} page 
{}", sessionIdentifier, id, ex);
+                       IOUtils.closeQuietly(channel);
                }
 
                return data;
@@ -170,39 +177,54 @@ public class FilePageStore extends 
AbstractPersistentPageStore implements IPersi
                {
                        throw new WicketRuntimeException("FilePageStore works 
with serialized pages only");
                }
-               SerializedPage serializedPage = (SerializedPage) page;
+               SerializedPage serializedPage = (SerializedPage)page;
 
-               String type = serializedPage.getPageType();
                byte[] data = serializedPage.getData();
 
-               writeFile(sessionIdentifier, serializedPage.getPageId(), type, 
data);
+               File file = getPageFile(sessionIdentifier, 
serializedPage.getPageId(), true);
+               try
+               {
+                       writeFile(file, data);
+               }
+               catch (IOException ex)
+               {
+                       log.warn("cannot store page data for session {} page 
{}", sessionIdentifier,
+                               serializedPage.getPageId(), ex);
+               }
+
+               setPageType(file, serializedPage.getPageType());
 
                checkMaxSize(sessionIdentifier);
        }
 
-       private void writeFile(String sessionIdentifier, int pageId, String 
pageType, byte[] data)
+       /**
+        * Write a file with given data.
+        * <p>
+        * Note: This implementation uses a {@link FileChannel} with
+        * {@link StandardOpenOption#TRUNCATE_EXISTING}. This might fail on 
Windows systems with
+        * "The requested operation cannot be performed on a file with a 
user-mapped section open", so subclasses
+        * can omit this option to circumvent this error, although this 
prevents files from shrinking when pages become smaller.
+        * Alternatively a completely different implementation can be chosen.
+        * 
+        * @param file
+        *            file to write
+        * @param data
+        *            data to write
+        * @throws IOException
+        */
+       protected void writeFile(File file, byte[] data) throws IOException
        {
-               File file = getPageFile(sessionIdentifier, pageId, true);
+               FileChannel channel = FileChannel.open(file.toPath(), 
StandardOpenOption.CREATE,
+                       StandardOpenOption.TRUNCATE_EXISTING, 
StandardOpenOption.WRITE);
                try
                {
-                       FileChannel channel = FileChannel.open(file.toPath(), 
StandardOpenOption.CREATE,
-                               StandardOpenOption.TRUNCATE_EXISTING, 
StandardOpenOption.WRITE);
-                       try
-                       {
-                               ByteBuffer buffer = ByteBuffer.wrap(data);
-                               channel.write(buffer);
-                       }
-                       finally
-                       {
-                               IOUtils.closeQuietly(channel);
-                       }
+                       ByteBuffer buffer = ByteBuffer.wrap(data);
+                       channel.write(buffer);
                }
-               catch (IOException ex)
+               finally
                {
-                       log.warn("cannot store page data for session {} page 
{}", sessionIdentifier, pageId, ex);
+                       IOUtils.closeQuietly(channel);
                }
-
-               setPageType(file, pageType);
        }
 
        private void checkMaxSize(String sessionIdentifier)
@@ -320,7 +342,7 @@ public class FilePageStore extends 
AbstractPersistentPageStore implements IPersi
        /**
         * Set the type of page on the given file.
         * <p>
-        * This is an optional operation that silently fails in case of an 
error. 
+        * This is an optional operation that silently fails in case of an 
error.
         * 
         * @param file
         * @param pageType
@@ -330,7 +352,7 @@ public class FilePageStore extends 
AbstractPersistentPageStore implements IPersi
                try
                {
                        UserDefinedFileAttributeView view = 
getAttributeView(file);
-                       
+
                        view.write(ATTRIBUTE_PAGE_TYPE, 
Charset.defaultCharset().encode(pageType));
                }
                catch (Exception ex)
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/pageStore/FilePageStoreTest.java 
b/wicket-core/src/test/java/org/apache/wicket/pageStore/FilePageStoreTest.java
index 777a1d5..2988649 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/pageStore/FilePageStoreTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/pageStore/FilePageStoreTest.java
@@ -20,7 +20,6 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 
-import org.apache.wicket.serialize.java.JavaSerializer;
 import org.apache.wicket.util.WicketTestTag;
 import org.apache.wicket.util.lang.Bytes;
 import org.junit.jupiter.api.Tag;

Reply via email to