/*
* 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.page;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import org.apache.wicket.Application;
import org.apache.wicket.pageStore.DefaultPageStore;
import org.apache.wicket.pageStore.IDataStore;
import org.apache.wicket.pageStore.IPageStore;
import org.apache.wicket.pageStore.memory.DummyPageManagerContext;
import org.apache.wicket.serialize.java.JavaSerializer;
import org.apache.wicket.versioning.InMemoryPageStore;
import org.junit.Assert;
import org.junit.Test;
/**
* @author Pedro Santos
*/
public class PersistentPageManagerTest
{
private static final String APP_NAME = "test_app";
/**
* WICKET-3470
*
* Tests that a page already put in the session (in SessionEntry) can be serialized and later
* deserialized without the need of {@link IPageStore}
*
* @throws ClassNotFoundException
* @throws IOException
*/
@Test
public void serializationOutsideWicketLifecyle() throws IOException, ClassNotFoundException
{
// create IPageManager (with IPageStore) and store a page instance
IPageManager pageManager = newPersistentPageManager(APP_NAME);
TestPage toSerializePage = new TestPage();
pageManager.touchPage(toSerializePage);
pageManager.commitRequest();
// get the stored SessionEntry
Serializable sessionEntry = pageManager.getContext().getSessionAttribute(null);
// destroy the manager and the store
pageManager.destroy();
// simulate persisting of the http sessions initiated by the web container
byte[] serializedSessionEntry = new JavaSerializer(APP_NAME).serialize(sessionEntry);
assertNotNull("Wicket needs to be able to serialize the session entry",
serializedSessionEntry);
// simulate loading of the persisted http session initiated by the web container
// when starting an application
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(
serializedSessionEntry));
// WicketFilter is not initialized so there is no Application available yet
Assert.assertFalse("Worker thread should be unaware of Wicket application",
Application.exists());
assertEquals(APP_NAME, in.readObject());
// without available IPageStore the read SessionEntry holds
// the IManageablePage itself, not SerializedPage
Serializable loadedSessionEntry = (Serializable)in.readObject();
assertNotNull(
"Wicket needs to be able to deserialize the session entry regardless the application availability",
loadedSessionEntry);
// provide new IPageStore which will read IManageablePage's or SerializedPage's
// from the SessionEntry's
IPageManager newPageManager = newPersistentPageManager(APP_NAME);
newPageManager.getContext().setSessionAttribute(null, loadedSessionEntry);
TestPage deserializedPage = (TestPage)newPageManager.getPage(toSerializePage.getPageId());
assertNotNull(deserializedPage);
assertEquals(toSerializePage.instanceID, deserializedPage.instanceID);
newPageManager.destroy();
}
private PageStoreManager newPersistentPageManager(String appName)
{
IDataStore dataStore = new InMemoryPageStore();
IPageStore pageStore = new DefaultPageStore(new JavaSerializer(appName), dataStore, 4);
IPageManagerContext pageManagerContext = new DummyPageManagerContext();
return new PageStoreManager(appName, pageStore, pageManagerContext);
}
private static class TestPage implements IManageablePage
{
/** */
private static final long serialVersionUID = 1L;
private static int sequence;
private int instanceID;
private TestPage()
{
instanceID = sequence++;
}
public boolean isPageStateless()
{
return false;
}
public int getPageId()
{
return instanceID;
}
public void detach()
{
}
public boolean setFreezePageId(boolean freeze)
{
return false;
}
}
}