You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2010/11/11 20:44:28 UTC
svn commit: r1034078 - in /wicket/trunk/wicket/src:
main/java/org/apache/wicket/pageStore/memory/
test/java/org/apache/wicket/pageStore/memory/
Author: mgrigorov
Date: Thu Nov 11 19:44:27 2010
New Revision: 1034078
URL: http://svn.apache.org/viewvc?rev=1034078&view=rev
Log:
WICKET-3138 Wicket 1.5 and GAE
Add IDataStore implementation that stores the pages in the HttpSession.
With two default eviction strategies:
- PageNumberEvictionStrategy - sets maximum number of pages in the session
- MemorySizeEvictionStrategy - sets maximum memory size for the pages in the session.
Added:
wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/
wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/DataStoreEvictionStrategy.java (with props)
wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/HttpSessionDataStore.java (with props)
wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategy.java (with props)
wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategy.java (with props)
wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTable.java (with props)
wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTableCleaner.java (with props)
wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/
wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/DummyPageManagerContext.java (with props)
wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/HttpSessionDataStoreTest.java (with props)
wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategyTest.java (with props)
wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategyTest.java (with props)
wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageTableTest.java (with props)
Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/DataStoreEvictionStrategy.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/DataStoreEvictionStrategy.java?rev=1034078&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/DataStoreEvictionStrategy.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/DataStoreEvictionStrategy.java Thu Nov 11 19:44:27 2010
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore.memory;
+
+
+/**
+ * An eviction strategy that decides whether the in-memory data structure used as page store should
+ * be compacted
+ */
+public interface DataStoreEvictionStrategy
+{
+
+ /**
+ * Called after each {@link DataStore#storeData()} call.
+ *
+ * @param pageTable
+ * the in-memory data store with <strong>all</strong> pages
+ */
+ void evict(PageTable pageTable);
+}
Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/DataStoreEvictionStrategy.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/HttpSessionDataStore.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/HttpSessionDataStore.java?rev=1034078&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/HttpSessionDataStore.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/HttpSessionDataStore.java Thu Nov 11 19:44:27 2010
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore.memory;
+
+import javax.servlet.http.HttpSession;
+
+import org.apache.wicket.page.IPageManagerContext;
+import org.apache.wicket.pageStore.IDataStore;
+
+/**
+ * A {@link DataStore} which stores the pages in the {@link HttpSession}. Uses
+ * {@link DataStoreEvictionStrategy} to keep the memory footprint reasonable.
+ *
+ * <p>
+ * Usage:
+ *
+ * <pre>
+ * <!--@formatter:off-->
+ * MyApp#init()
+ * {
+ *
+ * setPageManagerProvider(new IPageManagerProvider()
+ * {
+ * public IPageManager get(IPageManagerContext pageManagerContext)
+ * {
+ * IDataStore dataStore = new HttpSessionDataStore(pageManagerContext, new PageNumberEvictionStrategy(20));
+ * IPageStore pageStore = new DefaultPageStore(application.getName(), dataStore, getCacheSize());
+ * return new PersistentPageManager(application.getName(), pageStore, pageManagerContext);
+ * }
+ * }
+ * }
+ * <!--@formatter:on-->
+ * </pre>
+ */
+public class HttpSessionDataStore implements IDataStore
+{
+
+ /** the session attribute key. auto-prefixed with application.getSessionAttributePrefix() */
+ private static final String PAGE_TABLE_KEY = "page:store:memory";
+
+ private final IPageManagerContext pageManagerContext;
+
+ private final DataStoreEvictionStrategy evictionStrategy;
+
+ /**
+ * Construct.
+ *
+ * @param pageManagerContext
+ * @param evictionStrategy
+ */
+ public HttpSessionDataStore(IPageManagerContext pageManagerContext,
+ DataStoreEvictionStrategy evictionStrategy)
+ {
+ this.pageManagerContext = pageManagerContext;
+ this.evictionStrategy = evictionStrategy;
+ }
+
+ /**
+ * @param sessionId
+ * Ignored. Only pages from the current http session can be read
+ * @see org.apache.wicket.pageStore.IDataStore#getData(java.lang.String, int)
+ */
+ public byte[] getData(String sessionId, int pageId)
+ {
+ PageTable pageTable = getPageTable(false);
+ byte[] pageAsBytes = null;
+ if (pageTable != null)
+ {
+ pageAsBytes = pageTable.getPage(pageId);
+ }
+ return pageAsBytes;
+ }
+
+ public void removeData(String sessionId, int pageId)
+ {
+ PageTable pageTable = getPageTable(false);
+ if (pageTable != null)
+ {
+ pageTable.removePage(pageId);
+ }
+ }
+
+ public void removeData(String sessionId)
+ {
+ PageTable pageTable = getPageTable(false);
+ if (pageTable != null)
+ {
+ pageTable.clear();
+ }
+ }
+
+ public void storeData(String sessionId, int pageId, byte[] pageAsBytes)
+ {
+ PageTable pageTable = getPageTable(true);
+ pageTable.storePage(pageId, pageAsBytes);
+
+ evictionStrategy.evict(pageTable);
+ }
+
+ public void destroy()
+ {
+ PageTable pageTable = getPageTable(false);
+ if (pageTable != null)
+ {
+ pageTable.clear();
+ }
+ }
+
+ public boolean isReplicated()
+ {
+ return true;
+ }
+
+ private PageTable getPageTable(boolean create)
+ {
+ PageTable pageTable = (PageTable)pageManagerContext.getSessionAttribute(PAGE_TABLE_KEY);
+ if (pageTable == null && create)
+ {
+ pageTable = new PageTable();
+ pageManagerContext.setSessionAttribute(PAGE_TABLE_KEY, pageTable);
+ }
+
+ return pageTable;
+ }
+
+}
Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/HttpSessionDataStore.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategy.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategy.java?rev=1034078&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategy.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategy.java Thu Nov 11 19:44:27 2010
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore.memory;
+
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.lang.Bytes;
+import org.apache.wicket.util.lang.WicketObjects;
+
+/**
+ * An eviction strategy that keeps the data store size up to configured bytes
+ */
+public class MemorySizeEvictionStrategy implements DataStoreEvictionStrategy
+{
+
+ private final Bytes maxBytes;
+
+ /**
+ * Construct.
+ *
+ * @param maxBytes
+ * the maximum size of the data store
+ */
+ public MemorySizeEvictionStrategy(Bytes maxBytes)
+ {
+ Args.notNull(maxBytes, "maxBytes");
+
+ this.maxBytes = maxBytes;
+ }
+
+ /**
+ *
+ * @see org.apache.wicket.pageStore.memory.DataStoreEvictionStrategy#evict(org.apache.wicket.pageStore.memory.PageTable)
+ */
+ public void evict(PageTable pageTable)
+ {
+
+ long storeCurrentSize = WicketObjects.sizeof(pageTable);
+
+ if (storeCurrentSize > maxBytes.bytes())
+ {
+ PageTableCleaner cleaner = new PageTableCleaner();
+ cleaner.drop(pageTable, 1);
+
+ // recurse until enough space is cleaned
+ evict(pageTable);
+ }
+ }
+
+}
Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategy.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategy.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategy.java?rev=1034078&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategy.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategy.java Thu Nov 11 19:44:27 2010
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore.memory;
+
+
+/**
+ * An eviction strategy which decides whether to evict entries from the in-memory data store
+ * depending on the number of stored paged per session
+ */
+public class PageNumberEvictionStrategy implements DataStoreEvictionStrategy
+{
+
+ private final int pagesNumber;
+
+ /**
+ * Construct.
+ *
+ * @param pagesNumber
+ * the maximum number of pages the data store can hold
+ */
+ public PageNumberEvictionStrategy(int pagesNumber)
+ {
+ this.pagesNumber = pagesNumber;
+ }
+
+ /**
+ *
+ * @see org.apache.wicket.pageStore.memory.DataStoreEvictionStrategy#evict(org.apache.wicket.pageStore.memory.PageTable)
+ */
+ public void evict(PageTable pageTable)
+ {
+ int size = pageTable.size();
+ int pagesToDrop = size - pagesNumber;
+
+ if (pagesToDrop > 0)
+ {
+ PageTableCleaner cleaner = new PageTableCleaner();
+ cleaner.drop(pageTable, pagesToDrop);
+ }
+ }
+
+}
Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategy.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTable.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTable.java?rev=1034078&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTable.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTable.java Thu Nov 11 19:44:27 2010
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore.memory;
+
+import java.util.Queue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.wicket.IClusterable;
+
+/**
+ * A structure that holds page id => pageAsBytes.
+ *
+ * <p>
+ * Additionally it has an index of the least recently used pages
+ */
+class PageTable implements IClusterable
+{
+ private static final long serialVersionUID = 1L;
+
+
+ /**
+ * Holds the index of last/least recently used page ids. The most recently used page id is in
+ * the tail, the least recently used is in the head.
+ */
+ /*
+ * Can be replaced later with PriorityQueue to deal with lightweight (Ajax) and heavyweight
+ * pages
+ */
+ private final Queue<Integer> index;
+
+ /**
+ * The actual container for the pages.
+ *
+ * <p>
+ * page id => page as bytes
+ */
+ private final ConcurrentMap<Integer, byte[]> pages;
+
+ public PageTable()
+ {
+ pages = new ConcurrentHashMap<Integer, byte[]>();
+ index = new ConcurrentLinkedQueue<Integer>();
+ }
+
+ void storePage(Integer pageId, byte[] pageAsBytes)
+ {
+ synchronized (index)
+ {
+ pages.put(pageId, pageAsBytes);
+
+ updateIndex(pageId);
+ }
+ }
+
+ byte[] getPage(final Integer pageId)
+ {
+ synchronized (index)
+ {
+ updateIndex(pageId);
+
+ return pages.get(pageId);
+ }
+ }
+
+ public byte[] removePage(Integer pageId)
+ {
+ synchronized (index)
+ {
+ index.remove(pageId);
+
+ return pages.remove(pageId);
+ }
+ }
+
+ public void clear()
+ {
+ synchronized (index)
+ {
+ index.clear();
+ pages.clear();
+ }
+ }
+
+ public int size()
+ {
+ return pages.size();
+ }
+
+ Integer getOldest()
+ {
+ return index.peek();
+ }
+
+ /**
+ * Updates the index of last/least recently used pages by removing the page id from the index
+ * (in case it is already in) and (re-)adding it at the head
+ *
+ * @param pageId
+ * the id of a recently used page
+ */
+ private void updateIndex(Integer pageId)
+ {
+ index.remove(pageId);
+ index.offer(pageId);
+ }
+
+}
Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTable.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTableCleaner.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTableCleaner.java?rev=1034078&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTableCleaner.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTableCleaner.java Thu Nov 11 19:44:27 2010
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore.memory;
+
+/**
+ * Helper class that knows how to remove the nth oldest pages from {@link PageTable}
+ */
+public class PageTableCleaner
+{
+
+ /**
+ * Removes {@code pagesNumber} of pages from the {@link PageTable pageTable}
+ *
+ * @param pageTable
+ * the {@link PageTable} to clean
+ * @param pagesNumber
+ * the number of pages to remove
+ */
+ public void drop(final PageTable pageTable, final int pagesNumber)
+ {
+ for (int i = 0; i < pagesNumber; i++)
+ {
+ Integer pageIdOfTheOldest = pageTable.getOldest();
+ pageTable.removePage(pageIdOfTheOldest);
+ }
+ }
+}
Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/pageStore/memory/PageTableCleaner.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/DummyPageManagerContext.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/DummyPageManagerContext.java?rev=1034078&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/DummyPageManagerContext.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/DummyPageManagerContext.java Thu Nov 11 19:44:27 2010
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore.memory;
+
+import java.io.Serializable;
+
+import org.apache.wicket.page.IPageManagerContext;
+
+class DummyPageManagerContext implements IPageManagerContext
+{
+
+ Serializable attribute = null;
+
+ public void setRequestData(Object data)
+ {
+ }
+
+ public Object getRequestData()
+ {
+ return null;
+ }
+
+ public void setSessionAttribute(String key, Serializable value)
+ {
+ attribute = value;
+ }
+
+ public Serializable getSessionAttribute(String key)
+ {
+ return attribute;
+ }
+
+ public void bind()
+ {
+ }
+
+ public String getSessionId()
+ {
+ return null;
+ }
+
+}
\ No newline at end of file
Propchange: wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/DummyPageManagerContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/HttpSessionDataStoreTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/HttpSessionDataStoreTest.java?rev=1034078&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/HttpSessionDataStoreTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/HttpSessionDataStoreTest.java Thu Nov 11 19:44:27 2010
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore.memory;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class HttpSessionDataStoreTest
+{
+ final String sessionId = "anything";
+
+ final int pageId = 1;
+
+ final byte[] PAGE1 = new byte[] { 1 };
+ final byte[] PAGE2 = new byte[] { 2 };
+
+ HttpSessionDataStore store;
+
+ @Before
+ public void before()
+ {
+ store = new HttpSessionDataStore(new DummyPageManagerContext(), new NoopEvictionStrategy());
+ }
+
+ @After
+ public void after()
+ {
+ store.destroy();
+ }
+
+ @Test
+ public void storePage()
+ {
+ assertNull(store.getData(sessionId, pageId));
+
+ store.storeData(sessionId, pageId, PAGE1);
+ assertArrayEquals(PAGE1, store.getData(sessionId, pageId));
+ }
+
+ @Test
+ public void removePage1()
+ {
+ assertNull(store.getData(sessionId, pageId));
+
+ store.storeData(sessionId, pageId, PAGE1);
+
+ assertNotNull(store.getData(sessionId, pageId));
+
+ store.removeData(sessionId, pageId);
+
+ assertNull(store.getData(sessionId, pageId));
+ }
+
+ @Test
+ public void removePage2()
+ {
+ assertNull(store.getData(sessionId, pageId));
+
+ store.storeData(sessionId, pageId, PAGE1);
+
+ assertNotNull(store.getData(sessionId, pageId));
+
+ store.removeData(sessionId);
+
+ assertNull(store.getData(sessionId, pageId));
+ }
+
+
+ private static final class NoopEvictionStrategy implements DataStoreEvictionStrategy
+ {
+
+ public void evict(PageTable pageTable)
+ {
+ }
+ }
+}
Propchange: wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/HttpSessionDataStoreTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategyTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategyTest.java?rev=1034078&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategyTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategyTest.java Thu Nov 11 19:44:27 2010
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore.memory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.wicket.util.lang.Bytes;
+import org.apache.wicket.util.lang.WicketObjects;
+import org.junit.Test;
+
+/***/
+public class MemorySizeEvictionStrategyTest
+{
+ final byte[] PAGE1 = new byte[] { 1 };
+ final byte[] PAGE2 = new byte[] { 2, 3 };
+
+ /***/
+ @Test
+ public void evict()
+ {
+ PageTable pageTable = new PageTable();
+
+ long sizeOfEmptyPageTable = WicketObjects.sizeof(pageTable);
+
+ // evict to empty page table
+ MemorySizeEvictionStrategy strategy = new MemorySizeEvictionStrategy(
+ Bytes.bytes(sizeOfEmptyPageTable));
+ pageTable.storePage(PAGE1.length, PAGE1);
+ assertEquals(1, pageTable.size());
+ strategy.evict(pageTable);
+ assertEquals(0, pageTable.size());
+ long currentSize = WicketObjects.sizeof(pageTable);
+ assertTrue("Current size: |" + currentSize + "|, strategy size: |" + sizeOfEmptyPageTable +
+ "|", currentSize <= sizeOfEmptyPageTable);
+
+ // evict to page table with size: empty + PAGE2
+ pageTable.storePage(PAGE2.length, PAGE2);
+ long sizeOfWithPage2 = WicketObjects.sizeof(pageTable);
+ strategy = new MemorySizeEvictionStrategy(Bytes.bytes(sizeOfWithPage2));
+ pageTable.storePage(PAGE1.length, PAGE1);
+ assertEquals(2, pageTable.size());
+ strategy.evict(pageTable);
+ // the following assertion depends on the fact that PAGE2 has
+ // bigger size than PAGE1
+ assertEquals(1, pageTable.size());
+ currentSize = WicketObjects.sizeof(pageTable);
+ assertTrue("Current size: |" + currentSize + "|, strategy size: |" + sizeOfWithPage2 + "|",
+ currentSize <= sizeOfWithPage2);
+ }
+}
Propchange: wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategyTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategyTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategyTest.java?rev=1034078&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategyTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategyTest.java Thu Nov 11 19:44:27 2010
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore.memory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+
+/***/
+public class PageNumberEvictionStrategyTest
+{
+
+ final byte[] PAGE1 = new byte[] { 1 };
+ final byte[] PAGE2 = new byte[] { 2, 3 };
+
+ /***/
+ @Test
+ public void evict()
+ {
+ // evict to page table with one page only
+ PageNumberEvictionStrategy strategy = new PageNumberEvictionStrategy(1);
+
+ PageTable pageTable = new PageTable();
+
+ pageTable.storePage(PAGE1.length, PAGE1);
+ assertEquals(1, pageTable.size());
+ strategy.evict(pageTable);
+ assertEquals(1, pageTable.size());
+ assertNotNull(pageTable.getPage(PAGE1.length));
+
+ pageTable.storePage(PAGE2.length, PAGE2);
+ assertEquals(2, pageTable.size());
+ strategy.evict(pageTable);
+ assertEquals(1, pageTable.size());
+ assertNotNull(pageTable.getPage(PAGE2.length));
+ assertNull(pageTable.getPage(PAGE1.length));
+ }
+}
Propchange: wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategyTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageTableTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageTableTest.java?rev=1034078&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageTableTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageTableTest.java Thu Nov 11 19:44:27 2010
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore.memory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+
+/***/
+public class PageTableTest
+{
+
+ final byte[] data = new byte[] { 1 };
+
+ /***/
+ @Test
+ public void getOldest()
+ {
+ PageTable pageTable = new PageTable();
+
+ assertNull(pageTable.getOldest());
+
+ pageTable.storePage(1, data);
+ // index: 1
+ assertEquals(Integer.valueOf(1), pageTable.getOldest());
+
+ pageTable.storePage(2, data);
+ // index: 2, 1
+ assertEquals(Integer.valueOf(1), pageTable.getOldest());
+
+ pageTable.storePage(3, data);
+ // index: 3, 2, 1
+ assertEquals(Integer.valueOf(1), pageTable.getOldest());
+
+ pageTable.getPage(1);
+ // index: 1, 3, 2
+ assertEquals(Integer.valueOf(2), pageTable.getOldest());
+
+ pageTable.removePage(2);
+ // index: 1, 3
+ assertEquals(Integer.valueOf(3), pageTable.getOldest());
+ }
+}
Propchange: wicket/trunk/wicket/src/test/java/org/apache/wicket/pageStore/memory/PageTableTest.java
------------------------------------------------------------------------------
svn:eol-style = native