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

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


The following commit(s) were added to refs/heads/WICKET-6563 by this push:
     new d52371d  WICKET-6563 update size when removing pages
d52371d is described below

commit d52371d8e294da4bdc475e4362667d1119752e4b
Author: Sven Meier <[email protected]>
AuthorDate: Wed Jan 23 15:58:37 2019 +0100

    WICKET-6563 update size when removing pages
    
    and keep pages in list for InMemoryPageStore, in case pages are not 
serialized and change
    their id afterwards
---
 .../apache/wicket/pageStore/InMemoryPageStore.java | 72 ++++++++++++++--------
 .../wicket/pageStore/InSessionPageStore.java       |  4 +-
 2 files changed, 47 insertions(+), 29 deletions(-)

diff --git 
a/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java 
b/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java
index e8bca9c..9ea6476 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java
@@ -18,7 +18,7 @@ package org.apache.wicket.pageStore;
 
 import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -46,6 +46,8 @@ public class InMemoryPageStore extends 
AbstractPersistentPageStore
        private final Supplier<MemoryData> dataCreator;
 
        /**
+        * Keep {@code maxPages} for each session.
+        *    
         * @param applicationName
         *            {@link Application#getName()}
         * @param maxPages
@@ -57,10 +59,15 @@ public class InMemoryPageStore extends 
AbstractPersistentPageStore
        }
 
        /**
+        * Keep page up to {@code maxBytes} for each session.
+        * <p>
+        * All pages added to this store <em>must</em> be {@code 
SerializedPage}s. You can achieve this by letting
+        * a {@link SerializingPageStore} delegate to this store.
+        * 
         * @param applicationName
         *            {@link Application#getName()}
-        * @param maxPages
-        *            max pages per session
+        * @param maxBytes
+        *            maximum bytes to keep in session
         */
        public InMemoryPageStore(String applicationName, Bytes maxBytes)
        {
@@ -200,39 +207,58 @@ public class InMemoryPageStore extends 
AbstractPersistentPageStore
         */
        static abstract class MemoryData implements Iterable<IManageablePage>
        {
-               LinkedHashMap<Integer, IManageablePage> pages = new 
LinkedHashMap<>();
+               /**
+                * Kept in list instead of map, since non-serialized pages 
might change their id during a request.
+                */
+               List<IManageablePage> pages = new LinkedList<>();
 
                @Override
                public Iterator<IManageablePage> iterator()
                {
-                       return pages.values().iterator();
+                       return pages.iterator();
                }
 
                public synchronized void add(IManageablePage page)
                {
-                       pages.remove(page.getPageId());
-                       pages.put(page.getPageId(), page);
-               }
-
-               public IManageablePage remove(int pageId)
-               {
-                       return pages.remove(pageId);
+                       remove(page.getPageId());
+                       
+                       pages.add(page);
                }
 
-               public void removeAll()
+               public synchronized IManageablePage remove(int pageId)
                {
-                       pages.clear();
+                       Iterator<IManageablePage> iterator = pages.iterator();
+                       while (iterator.hasNext())
+                       {
+                               IManageablePage page = iterator.next();
+                               
+                               if (page.getPageId() == pageId)
+                               {
+                                       iterator.remove();
+                                       return page;
+                               }
+                       }
+                       return null;
                }
 
-               public IManageablePage get(int id)
+               public synchronized IManageablePage get(int pageId)
                {
-                       IManageablePage page = pages.get(id);
-
-                       return page;
+                       Iterator<IManageablePage> iterator = pages.iterator();
+                       while (iterator.hasNext())
+                       {
+                               IManageablePage page = iterator.next();
+                               
+                               if (page.getPageId() == pageId)
+                               {
+                                       return page;
+                               }
+                       }
+                       
+                       return null;
                }
                
                protected void removeOldest() {
-                       IManageablePage page = pages.values().iterator().next();
+                       IManageablePage page = pages.iterator().next();
                        
                        remove(page.getPageId());
                }
@@ -308,13 +334,5 @@ public class InMemoryPageStore extends 
AbstractPersistentPageStore
                        }
                        return page;
                }
-               
-               @Override
-               public synchronized void removeAll()
-               {
-                       super.removeAll();
-                       
-                       size = 0;
-               }
        }
 }
\ No newline at end of file
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/pageStore/InSessionPageStore.java 
b/wicket-core/src/main/java/org/apache/wicket/pageStore/InSessionPageStore.java
index 81d1060..b33690c 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/pageStore/InSessionPageStore.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/pageStore/InSessionPageStore.java
@@ -91,7 +91,7 @@ public class InSessionPageStore extends DelegatingPageStore
        /**
         * Keep page up to {@code maxBytes} in each session.
         * <p>
-        * All pages added to this store must be {@code SerializedPage}s. You 
can achieve this by letting
+        * All pages added to this store <em>must</em> be {@code 
SerializedPage}s. You can achieve this by letting
         * a {@link SerializingPageStore} delegate to this store.
         * 
         * @param delegate
@@ -192,7 +192,7 @@ public class InSessionPageStore extends DelegatingPageStore
                /**
                 * Pages, may partly be serialized.
                 * <p>
-                * Kept in list instead of map, since life pages might change 
their id during a request.
+                * Kept in list instead of map, since non-serialized pages 
might change their id during a request.
                 */
                List<IManageablePage> pages = new LinkedList<>();
 

Reply via email to