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 105e83f WICKET-6563 support size limit
105e83f is described below
commit 105e83fcbd8ebe1a0bbc8cc57a2b3aee557ec06c
Author: Sven Meier <[email protected]>
AuthorDate: Tue Jan 22 19:19:28 2019 +0100
WICKET-6563 support size limit
for InSessionPageStore and InMemoryPageStore; corrected formatting
---
.../pageStore/AbstractPersistentPageStore.java | 6 +-
.../wicket/pageStore/AsynchronousPageStore.java | 37 ++--
.../wicket/pageStore/DelegatingPageStore.java | 21 +-
.../org/apache/wicket/pageStore/DiskPageStore.java | 9 +-
.../org/apache/wicket/pageStore/FilePageStore.java | 17 +-
.../apache/wicket/pageStore/InMemoryPageStore.java | 140 ++++++++++---
.../wicket/pageStore/InSessionPageStore.java | 217 ++++++++++++++++-----
.../apache/wicket/pageStore/RequestPageStore.java | 9 +-
.../wicket/pageStore/SerializingPageStore.java | 6 +-
.../wicket/pageStore/disk/NestedFolders.java | 36 ++--
.../wicket/pageStore/disk/PageWindowManager.java | 3 +-
11 files changed, 381 insertions(+), 120 deletions(-)
diff --git
a/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPersistentPageStore.java
b/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPersistentPageStore.java
index b7d6a3d..918e8c1 100644
---
a/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPersistentPageStore.java
+++
b/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPersistentPageStore.java
@@ -146,7 +146,8 @@ public abstract class AbstractPersistentPageStore
implements IPersistentPageStor
context.setSessionAttribute(KEY, attribute);
}
- if (attribute == null) {
+ if (attribute == null)
+ {
return null;
}
return attribute.identifier;
@@ -160,7 +161,8 @@ public abstract class AbstractPersistentPageStore
implements IPersistentPageStor
* @param context context
* @return identifier for the sseion
*/
- protected String createSessionIdentifier(IPageContext context) {
+ protected String createSessionIdentifier(IPageContext context)
+ {
return context.getSessionId();
}
diff --git
a/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousPageStore.java
b/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousPageStore.java
index 9eb0c95..42f3233 100644
---
a/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousPageStore.java
+++
b/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousPageStore.java
@@ -165,7 +165,8 @@ public class AsynchronousPageStore extends
DelegatingPageStore
@Override
public <T> void setRequestData(MetaDataKey<T> key, T value)
{
- if (asynchronous) {
+ if (asynchronous)
+ {
throw new WicketRuntimeException("no request
available asynchronuously");
}
@@ -178,7 +179,8 @@ public class AsynchronousPageStore extends
DelegatingPageStore
@Override
public <T> T getRequestData(MetaDataKey<T> key)
{
- if (asynchronous) {
+ if (asynchronous)
+ {
throw new WicketRuntimeException("no request
available asynchronuously");
}
@@ -194,11 +196,13 @@ public class AsynchronousPageStore extends
DelegatingPageStore
@Override
public <T extends Serializable> void setSessionAttribute(String
key, T value)
{
- if (asynchronous) {
+ if (asynchronous)
+ {
throw new WicketRuntimeException("no session
available asynchronuously");
}
- if (value != null) {
+ if (value != null)
+ {
attributeCache.put(key, value);
}
@@ -215,9 +219,11 @@ public class AsynchronousPageStore extends
DelegatingPageStore
@Override
public <T extends Serializable> T getSessionAttribute(String
key)
{
- if (asynchronous) {
+ if (asynchronous)
+ {
T value = (T)attributeCache.get(key);
- if (value != null) {
+ if (value != null)
+ {
return value;
}
@@ -225,7 +231,8 @@ public class AsynchronousPageStore extends
DelegatingPageStore
}
T value = context.getSessionAttribute(key);
- if (value != null) {
+ if (value != null)
+ {
attributeCache.put(key, value);
}
@@ -238,7 +245,8 @@ public class AsynchronousPageStore extends
DelegatingPageStore
@Override
public <T extends Serializable> T setSessionData(MetaDataKey<T>
key, T value)
{
- if (asynchronous) {
+ if (asynchronous)
+ {
throw new WicketRuntimeException("no session
available asynchronuously");
}
@@ -366,7 +374,8 @@ public class AsynchronousPageStore extends
DelegatingPageStore
public void addPage(IPageContext context, IManageablePage page)
{
PendingAdd add = new PendingAdd(context, page);
- if (getDelegate().canBeAsynchronous(add)) {
+ if (getDelegate().canBeAsynchronous(add))
+ {
String key = add.getKey();
queueMap.put(key, add);
try
@@ -387,7 +396,9 @@ public class AsynchronousPageStore extends
DelegatingPageStore
log.error(e.getMessage(), e);
queueMap.remove(key);
}
- } else {
+ }
+ else
+ {
log.warn("Delegated page store '{}' can not be
asynchronous", getDelegate().getClass().getName());
}
@@ -398,10 +409,12 @@ public class AsynchronousPageStore extends
DelegatingPageStore
public void removeAllPages(IPageContext context)
{
Iterator<PendingAdd> iterator = queue.iterator();
- while (iterator.hasNext()) {
+ while (iterator.hasNext())
+ {
PendingAdd add = iterator.next();
- if (add.sessionId.equals(context.getSessionId())) {
+ if (add.sessionId.equals(context.getSessionId()))
+ {
iterator.remove();
}
}
diff --git
a/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
b/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
index 4e40d04..ba256a0 100644
---
a/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
+++
b/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
@@ -26,7 +26,8 @@ public abstract class DelegatingPageStore implements
IPageStore
{
private final IPageStore delegate;
- protected DelegatingPageStore(IPageStore delegate) {
+ protected DelegatingPageStore(IPageStore delegate)
+ {
this.delegate = Args.notNull(delegate, "delegate");
}
@@ -45,32 +46,38 @@ public abstract class DelegatingPageStore implements
IPageStore
}
@Override
- public void addPage(IPageContext context, IManageablePage page) {
+ public void addPage(IPageContext context, IManageablePage page)
+ {
delegate.addPage(context, page);
}
@Override
- public void removePage(IPageContext context, IManageablePage page) {
+ public void removePage(IPageContext context, IManageablePage page)
+ {
delegate.removePage(context, page);
}
@Override
- public void removeAllPages(IPageContext context) {
+ public void removeAllPages(IPageContext context)
+ {
delegate.removeAllPages(context);
}
@Override
- public IManageablePage getPage(IPageContext context, int id) {
+ public IManageablePage getPage(IPageContext context, int id)
+ {
return delegate.getPage(context, id);
}
@Override
- public void detach(IPageContext context) {
+ public void detach(IPageContext context)
+ {
delegate.detach(context);
}
@Override
- public void destroy() {
+ public void destroy()
+ {
delegate.destroy();
}
}
diff --git
a/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java
b/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java
index 067e41f..3fdaa55 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java
@@ -47,6 +47,7 @@ import org.apache.wicket.util.file.Files;
import org.apache.wicket.util.io.IOUtils;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.lang.Bytes;
+import org.apache.wicket.util.lang.Classes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -141,7 +142,8 @@ public class DiskPageStore extends
AbstractPersistentPageStore
* Pages are already serialized.
*/
@Override
- public boolean supportsVersioning() {
+ public boolean supportsVersioning()
+ {
return true;
}
@@ -195,7 +197,8 @@ public class DiskPageStore extends
AbstractPersistentPageStore
protected void removeAllPersistedPages(String identifier)
{
DiskData diskData = getDiskData(identifier, false);
- if (diskData != null) {
+ if (diskData != null)
+ {
synchronized (diskDatas)
{
diskDatas.remove(diskData.sessionIdentifier);
@@ -209,7 +212,7 @@ public class DiskPageStore extends
AbstractPersistentPageStore
{
if (page instanceof SerializedPage == false)
{
- throw new WicketRuntimeException("works with serialized
pages only");
+ throw new WicketRuntimeException("DiskPageStore works
with serialized pages only");
}
SerializedPage serializedPage = (SerializedPage) page;
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 cb39dc5..8ebd85c 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
@@ -118,9 +118,11 @@ public class FilePageStore extends
AbstractPersistentPageStore
}
@Override
- protected IManageablePage getPersistedPage(String identifier, int id) {
+ protected IManageablePage getPersistedPage(String identifier, int id)
+ {
byte[] data = readFile(identifier, id);
- if (data == null) {
+ if (data == null)
+ {
return null;
}
@@ -161,7 +163,8 @@ public class FilePageStore extends
AbstractPersistentPageStore
}
@Override
- protected void removePersistedPage(String identifier, IManageablePage
page) {
+ protected void removePersistedPage(String identifier, IManageablePage
page)
+ {
File file = getPageFile(identifier, page.getPageId(), false);
if (file.exists())
{
@@ -173,15 +176,17 @@ public class FilePageStore extends
AbstractPersistentPageStore
}
@Override
- protected void removeAllPersistedPages(String identifier) {
+ protected void removeAllPersistedPages(String identifier)
+ {
folders.remove(identifier);
}
@Override
- protected void addPersistedPage(String identifier, IManageablePage
page) {
+ protected void addPersistedPage(String identifier, IManageablePage page)
+ {
if (page instanceof SerializedPage == false)
{
- throw new WicketRuntimeException("works with serialized
pages only");
+ throw new WicketRuntimeException("FilePageStore works
with serialized pages only");
}
SerializedPage serializedPage = (SerializedPage) page;
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 31bbea0..4764018 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
@@ -23,10 +23,12 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import org.apache.wicket.Application;
+import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.core.util.lang.WicketObjects;
import org.apache.wicket.page.IManageablePage;
import org.apache.wicket.util.lang.Args;
@@ -41,7 +43,7 @@ public class InMemoryPageStore extends
AbstractPersistentPageStore
private final Map<String, MemoryData> datas = new ConcurrentHashMap<>();
- private int maxPages;
+ private final Supplier<MemoryData> dataCreator;
/**
* @param applicationName
@@ -51,9 +53,25 @@ public class InMemoryPageStore extends
AbstractPersistentPageStore
*/
public InMemoryPageStore(String applicationName, int maxPages)
{
+ this(applicationName, () -> new CountLimitedData(maxPages));
+ }
+
+ /**
+ * @param applicationName
+ * {@link Application#getName()}
+ * @param maxPages
+ * max pages per session
+ */
+ public InMemoryPageStore(String applicationName, Bytes maxBytes)
+ {
+ this(applicationName, () -> new SizeLimitedData(maxBytes));
+ }
+
+ InMemoryPageStore(String applicationName, Supplier<MemoryData>
dataCreator)
+ {
super(applicationName);
- this.maxPages = Args.withinRange(1, Integer.MAX_VALUE,
maxPages, "maxPages");
+ this.dataCreator = dataCreator;
}
/**
@@ -85,7 +103,7 @@ public class InMemoryPageStore extends
AbstractPersistentPageStore
{
synchronized (data)
{
- data.remove(page);
+ data.remove(page.getPageId());
}
}
}
@@ -101,7 +119,7 @@ public class InMemoryPageStore extends
AbstractPersistentPageStore
{
MemoryData data = getMemoryData(identifier, true);
- data.add(page, maxPages);
+ data.add(page);
}
@Override
@@ -155,9 +173,12 @@ public class InMemoryPageStore extends
AbstractPersistentPageStore
*/
protected long getSize(IManageablePage page)
{
- if (page instanceof SerializedPage) {
+ if (page instanceof SerializedPage)
+ {
return ((SerializedPage)page).getData().length;
- } else {
+ }
+ else
+ {
return WicketObjects.sizeof(page);
}
}
@@ -169,7 +190,7 @@ public class InMemoryPageStore extends
AbstractPersistentPageStore
return datas.get(identifier);
}
- MemoryData data = new MemoryData();
+ MemoryData data = dataCreator.get();
MemoryData existing = datas.putIfAbsent(identifier, data);
return existing != null ? existing : data;
}
@@ -177,9 +198,9 @@ public class InMemoryPageStore extends
AbstractPersistentPageStore
/**
* Data kept in memory.
*/
- static class MemoryData implements Iterable<IManageablePage>
+ static abstract class MemoryData implements Iterable<IManageablePage>
{
- private LinkedHashMap<Integer, IManageablePage> pages = new
LinkedHashMap<>();
+ LinkedHashMap<Integer, IManageablePage> pages = new
LinkedHashMap<>();
@Override
public Iterator<IManageablePage> iterator()
@@ -187,25 +208,15 @@ public class InMemoryPageStore extends
AbstractPersistentPageStore
return pages.values().iterator();
}
- public synchronized void add(IManageablePage page, int maxPages)
+ public synchronized void add(IManageablePage page)
{
pages.remove(page.getPageId());
pages.put(page.getPageId(), page);
-
- Iterator<IManageablePage> iterator =
pages.values().iterator();
- int size = pages.size();
- while (size > maxPages)
- {
- iterator.next();
-
- iterator.remove();
- size--;
- }
}
- public void remove(IManageablePage page)
+ public IManageablePage remove(int pageId)
{
- pages.remove(page.getPageId());
+ return pages.remove(pageId);
}
public void removeAll()
@@ -219,5 +230,90 @@ public class InMemoryPageStore extends
AbstractPersistentPageStore
return page;
}
+
+ protected void removeFirst() {
+ Iterator<IManageablePage> iterator =
pages.values().iterator();
+ iterator.next();
+ iterator.remove();
+ }
+ }
+
+ /**
+ * Limit pages by count.
+ */
+ static class CountLimitedData extends MemoryData
+ {
+
+ private int maxPages;
+
+ public CountLimitedData(int maxPages)
+ {
+ this.maxPages = Args.withinRange(1, Integer.MAX_VALUE,
maxPages, "maxPages");
+ }
+
+ @Override
+ public synchronized void add(IManageablePage page)
+ {
+ super.add(page);
+
+ while (pages.size() > maxPages)
+ {
+ removeFirst();
+ }
+ }
+ }
+
+ /**
+ * Limit pages by size.
+ */
+ static class SizeLimitedData extends MemoryData
+ {
+
+ private Bytes maxBytes;
+
+ private long size;
+
+ public SizeLimitedData(Bytes maxBytes)
+ {
+ Args.notNull(maxBytes, "maxBytes");
+
+ this.maxBytes = Args.withinRange(Bytes.bytes(1),
Bytes.MAX, maxBytes, "maxBytes");
+ }
+
+ @Override
+ public synchronized void add(IManageablePage page)
+ {
+ if (page instanceof SerializedPage == false)
+ {
+ throw new
WicketRuntimeException("InMemoryPageStore limited by size works with serialized
pages only");
+ }
+
+ super.add(page);
+
+ size += ((SerializedPage) page).getData().length;
+
+ while (size > maxBytes.bytes())
+ {
+ removeFirst();
+ }
+ }
+
+ @Override
+ public synchronized IManageablePage remove(int pageId)
+ {
+ SerializedPage page = (SerializedPage)
super.remove(pageId);
+
+ size -= ((SerializedPage) page).getData().length;
+
+ 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 7662fb8..c880ce0 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
@@ -22,15 +22,18 @@ import java.io.Serializable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.function.Supplier;
import javax.servlet.http.HttpSession;
import org.apache.wicket.DefaultPageManagerProvider;
import org.apache.wicket.MetaDataKey;
import org.apache.wicket.Session;
+import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.page.IManageablePage;
import org.apache.wicket.serialize.ISerializer;
import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.lang.Bytes;
import org.apache.wicket.util.lang.Classes;
/**
@@ -49,11 +52,13 @@ public class InSessionPageStore extends DelegatingPageStore
private final ISerializer serializer;
- private int maxPages;
+ private final Supplier<SessionData> dataCreator;
/**
- * Use this constructor if pages should not be persisted along with
their session, e.g. because a delegated peristent page store
- * keeps them anyway for backup.
+ * Keep {@code maxPages} in each session.
+ * <p>
+ * If the container serializes sessions to disk, any non-{@code
SerializedPage} added to this store
+ * will be dropped.
*
* @param delegate
* store to delegate to
@@ -66,7 +71,10 @@ public class InSessionPageStore extends DelegatingPageStore
}
/**
- * Use this constructor if pages should be serialized along with their
session.
+ * Keep {@code maxPages} in each session.
+ * <p>
+ * If the container serializes sessions to disk, any non-{@code
SerializedPage} added to this store
+ * will be automatically serialized.
*
* @param delegate
* store to delegate to
@@ -77,18 +85,40 @@ public class InSessionPageStore extends DelegatingPageStore
*/
public InSessionPageStore(IPageStore delegate, int maxPages,
ISerializer serializer)
{
+ this(delegate, serializer, () -> new
CountLimitedData(maxPages));
+ }
+
+ /**
+ * 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
+ * a {@link SerializingPageStore} delegate to this store.
+ *
+ * @param delegate
+ * store to delegate to
+ * @param maxBytes
+ * maximum bytes to keep in session
+ */
+ public InSessionPageStore(IPageStore delegate, Bytes maxBytes)
+ {
+ this(delegate, null, () -> new SizeLimitedData(maxBytes));
+ }
+
+ private InSessionPageStore(IPageStore delegate, ISerializer serializer,
Supplier<SessionData> dataCreator)
+ {
super(delegate);
this.serializer = serializer;
-
- this.maxPages = maxPages;
+
+ this.dataCreator = dataCreator;
}
@Override
public IManageablePage getPage(IPageContext context, int id)
{
SessionData data = getSessionData(context, false);
- if (data != null) {
+ if (data != null)
+ {
IManageablePage page = data.get(id);
if (page != null)
{
@@ -104,7 +134,7 @@ public class InSessionPageStore extends DelegatingPageStore
{
SessionData data = getSessionData(context, true);
- data.add(context, page, maxPages);
+ data.add(page);
getDelegate().addPage(context, page);
}
@@ -113,8 +143,9 @@ public class InSessionPageStore extends DelegatingPageStore
public void removePage(IPageContext context, IManageablePage page)
{
SessionData data = getSessionData(context, false);
- if (data != null) {
- data.remove(page);
+ if (data != null)
+ {
+ data.remove(page.getPageId());
}
getDelegate().removePage(context, page);
@@ -124,7 +155,8 @@ public class InSessionPageStore extends DelegatingPageStore
public void removeAllPages(IPageContext context)
{
SessionData data = getSessionData(context, false);
- if (data != null) {
+ if (data != null)
+ {
data.removeAll();
}
@@ -136,12 +168,13 @@ public class InSessionPageStore extends
DelegatingPageStore
SessionData data = context.getSessionData(KEY);
if (data == null && create)
{
- data = context.setSessionData(KEY, new SessionData());
+ data = context.setSessionData(KEY, dataCreator.get());
}
- if (data != null && serializer != null) {
+ if (data != null && serializer != null)
+ {
// data might be deserialized so initialize again
- data.init(serializer);
+ data.supportSessionSerialization(serializer);
}
return data;
@@ -151,7 +184,7 @@ public class InSessionPageStore extends DelegatingPageStore
* Data kept in the {@link Session}, might get serialized along with
its containing
* {@link HttpSession}.
*/
- static class SessionData implements Serializable
+ static abstract class SessionData implements Serializable
{
transient ISerializer serializer;
@@ -161,39 +194,47 @@ public class InSessionPageStore extends
DelegatingPageStore
* <p>
* Kept in list instead of map, since life pages might change
their id during a request.
*/
- private List<IManageablePage> pages = new LinkedList<>();
+ List<IManageablePage> pages = new LinkedList<>();
/**
- * This method <em>must</em> be called each time it is
retrieved from the session: <br/>
- * After deserializing from persisted session the serializer is
no longer referenced and all
- * contained pages are in a serialized state.
+ * Call this method if session serialization should be
supported, i.e. all pages get serialized along with the session.
*/
- public void init(ISerializer serializer)
+ public void supportSessionSerialization(ISerializer serializer)
{
this.serializer = Args.notNull(serializer,
"serializer");
}
- public synchronized void add(IPageContext context,
IManageablePage page, int maxPages)
+ public synchronized void add(IManageablePage page)
{
// move to end
- remove(page);
+ remove(page.getPageId());
+
pages.add(page);
-
- while (pages.size() > maxPages)
- {
- pages.remove(0);
- }
}
- public synchronized void remove(IManageablePage page)
+ public synchronized IManageablePage removeFirst()
+ {
+ IManageablePage page = pages.get(0);
+
+ remove(page.getPageId());
+
+ return page;
+ }
+
+ public synchronized IManageablePage remove(int pageId)
{
Iterator<IManageablePage> iterator = pages.iterator();
- while (iterator.hasNext()) {
- if (iterator.next().getPageId() ==
page.getPageId()) {
+ while (iterator.hasNext())
+ {
+ IManageablePage page = iterator.next();
+
+ if (page.getPageId() == pageId)
+ {
iterator.remove();
- break;
+ return page;
}
}
+ return null;
}
public synchronized void removeAll()
@@ -203,13 +244,12 @@ public class InSessionPageStore extends
DelegatingPageStore
public synchronized IManageablePage get(int id)
{
- IManageablePage page = null;
-
for (int p = 0; p < pages.size(); p++)
{
IManageablePage candidate = pages.get(p);
- if (candidate.getPageId() == id) {
+ if (candidate.getPageId() == id)
+ {
if (candidate instanceof SerializedPage
&& serializer != null)
{
candidate =
(IManageablePage)serializer.deserialize(((SerializedPage)candidate).getData());
@@ -217,12 +257,11 @@ public class InSessionPageStore extends
DelegatingPageStore
pages.set(p, candidate);
}
- page = candidate;
- break;
+ return candidate;
}
}
- return page;
+ return null;
}
/**
@@ -230,21 +269,21 @@ public class InSessionPageStore extends
DelegatingPageStore
*/
private void writeObject(final ObjectOutputStream output)
throws IOException
{
- if (serializer == null) {
- pages.clear();
- } else {
- // serialize pages if not already
- for (int p = 0; p < pages.size(); p++)
+ // handle non-serialized pages
+ for (int p = 0; p < pages.size(); p++)
+ {
+ IManageablePage page = pages.get(p);
+
+ if ((page instanceof SerializedPage) == false)
{
- IManageablePage page = pages.get(p);
-
- if ((page instanceof SerializedPage) ==
false)
+ if (serializer == null)
+ {
+ pages.remove(p);
+ p--;
+ }
+ else
{
- if (serializer == null)
- {
- throw new
IllegalStateException("SessionData#init() was not called");
- }
- pages.set(p, new
SerializedPage(page.getPageId(), Classes.name(page.getClass()),
serializer.serialize(page)));
+ pages.set(p, new
SerializedPage(page.getPageId(), Classes.name(page.getClass()),
serializer.serialize(page)));
}
}
}
@@ -252,4 +291,82 @@ public class InSessionPageStore extends DelegatingPageStore
output.defaultWriteObject();
}
}
+
+ /**
+ * Limit pages by count.
+ */
+ static class CountLimitedData extends SessionData
+ {
+
+ private int maxPages;
+
+ public CountLimitedData(int maxPages)
+ {
+ this.maxPages = Args.withinRange(1, Integer.MAX_VALUE,
maxPages, "maxPages");
+ }
+
+ public synchronized void add(IManageablePage page)
+ {
+ super.add(page);
+
+ while (pages.size() > maxPages)
+ {
+ removeFirst();
+ }
+ }
+ }
+
+ /**
+ * Limit pages by size.
+ */
+ static class SizeLimitedData extends SessionData
+ {
+
+ private Bytes maxBytes;
+
+ private long size;
+
+ public SizeLimitedData(Bytes maxBytes)
+ {
+ Args.notNull(maxBytes, "maxBytes");
+
+ this.maxBytes = Args.withinRange(Bytes.bytes(1),
Bytes.MAX, maxBytes, "maxBytes");
+ }
+
+ @Override
+ public synchronized void add(IManageablePage page)
+ {
+ if (page instanceof SerializedPage == false)
+ {
+ throw new
WicketRuntimeException("InSessionPageStore limited by size works with
serialized pages only");
+ }
+
+ super.add(page);
+
+ size += ((SerializedPage) page).getData().length;
+
+ while (size > maxBytes.bytes())
+ {
+ removeFirst();
+ }
+ }
+
+ @Override
+ public synchronized IManageablePage remove(int pageId)
+ {
+ SerializedPage page = (SerializedPage)
super.remove(pageId);
+
+ size -= ((SerializedPage) page).getData().length;
+
+ 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/RequestPageStore.java
b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
index 69a1210..f7ee6d8 100644
---
a/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
+++
b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
@@ -135,9 +135,12 @@ public class RequestPageStore extends DelegatingPageStore
return pages;
}
- public IManageablePage get(int id) {
- for (IManageablePage page : pages) {
- if (page.getPageId() == id) {
+ public IManageablePage get(int id)
+ {
+ for (IManageablePage page : pages)
+ {
+ if (page.getPageId() == id)
+ {
return page;
}
}
diff --git
a/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializingPageStore.java
b/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializingPageStore.java
index 0a20825..bd19872 100644
---
a/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializingPageStore.java
+++
b/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializingPageStore.java
@@ -65,7 +65,8 @@ public class SerializingPageStore extends DelegatingPageStore
{
IManageablePage page = getDelegate().getPage(context, id);
- if (page instanceof SerializedPage) {
+ if (page instanceof SerializedPage)
+ {
page =
(IManageablePage)serializer.deserialize(((SerializedPage)page).getData());
}
return page;
@@ -74,7 +75,8 @@ public class SerializingPageStore extends DelegatingPageStore
@Override
public void addPage(IPageContext context, IManageablePage page)
{
- if (page instanceof SerializedPage == false) {
+ if (page instanceof SerializedPage == false)
+ {
page = new SerializedPage(page.getPageId(),
Classes.name(page.getClass()), serializer.serialize(page));
}
getDelegate().addPage(context, page);
diff --git
a/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/NestedFolders.java
b/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/NestedFolders.java
index 6fe5954..7636d83 100644
---
a/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/NestedFolders.java
+++
b/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/NestedFolders.java
@@ -37,7 +37,8 @@ public class NestedFolders
*
* @param base base has to be a folder
*/
- public NestedFolders(File base) {
+ public NestedFolders(File base)
+ {
this.base = Args.notNull(base, "base");
}
@@ -53,7 +54,8 @@ public class NestedFolders
* @param create
* @return
*/
- public File get(String name, final boolean create) {
+ public File get(String name, final boolean create)
+ {
name = name.replace('*', '_');
name = name.replace('/', '_');
name = name.replace(':', '_');
@@ -61,13 +63,15 @@ public class NestedFolders
String path = createPathFrom(name);
File folder = new File(base, path);
- if (create && folder.exists() == false) {
+ if (create && folder.exists() == false)
+ {
Files.mkdirs(folder);
}
return folder;
}
- private String createPathFrom(final String name) {
+ private String createPathFrom(final String name)
+ {
int hash = Math.abs(name.hashCode());
String low = String.valueOf(hash % 9973);
String high = String.valueOf((hash / 9973) % 9973);
@@ -89,14 +93,18 @@ public class NestedFolders
public void remove(String name)
{
File folder = get(name, false);
- if (folder.exists()) {
+ if (folder.exists())
+ {
Files.removeFolder(folder);
File high = folder.getParentFile();
- if (high.list().length == 0) {
- if (Files.removeFolder(high)) {
+ if (high.list().length == 0)
+ {
+ if (Files.removeFolder(high))
+ {
File low = high.getParentFile();
- if (low.list().length == 0) {
+ if (low.list().length == 0)
+ {
Files.removeFolder(low);
}
}
@@ -113,10 +121,14 @@ public class NestedFolders
{
Set<File> files = new HashSet<>();
- if (base.exists()) {
- for (File low : Files.list(base)) {
- for (File high: Files.list(low)) {
- for (File file : Files.list(high)) {
+ if (base.exists())
+ {
+ for (File low : Files.list(base))
+ {
+ for (File high: Files.list(low))
+ {
+ for (File file : Files.list(high))
+ {
files.add(file);
}
}
diff --git
a/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/PageWindowManager.java
b/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/PageWindowManager.java
index f20d156..ad60dab 100644
---
a/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/PageWindowManager.java
+++
b/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/PageWindowManager.java
@@ -64,7 +64,8 @@ public class PageWindowManager implements Serializable
}
@Override
- public String getPageType() {
+ public String getPageType()
+ {
return type;
}