/*
* 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.core.request.mapper;
import org.apache.wicket.MockPage;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.core.request.handler.PageProvider;
import org.apache.wicket.markup.MarkupParser;
import org.apache.wicket.page.IPageManagerContext;
import org.apache.wicket.page.PageStoreManager;
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.request.component.IRequestablePage;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.ResourceReference;
import org.apache.wicket.request.resource.ResourceReference.Key;
import org.apache.wicket.request.resource.ResourceReferenceRegistry;
import org.apache.wicket.serialize.java.JavaSerializer;
import org.apache.wicket.versioning.InMemoryPageStore;
/**
* Simple {@link IMapperContext} implementation for testing purposes
*
* @author Matej Knopp
*/
public class TestMapperContext implements IMapperContext
{
private static final String APP_NAME = "test_app";
private static int count;
IDataStore dataStore;
IPageStore pageStore;
IPageManagerContext pageManagerContext;
PageStoreManager pageManager;
private String appName;
private boolean createMockPageIfInstanceNotFound = true;
/**
* Construct.
*/
public TestMapperContext()
{
appName = APP_NAME + count++;
dataStore = new InMemoryPageStore();
pageStore = new DefaultPageStore(new JavaSerializer(appName), dataStore, 4);
pageManagerContext = new DummyPageManagerContext();
pageManager = new PageStoreManager(appName, pageStore, pageManagerContext);
}
/**
* just making sure the session cache will be empty by simulating an intermezzo request
*/
public void cleanSessionCache()
{
getPageManager().getContext().setRequestData(null);
MockPage other = new MockPage();
other.setPageId(Integer.MAX_VALUE);
getPageManager().touchPage(other);
getPageManager().commitRequest();
}
/**
* @return pageManager
*/
public PageStoreManager getPageManager()
{
return pageManager;
}
@Override
public String getBookmarkableIdentifier()
{
return "bookmarkable";
}
@Override
public String getNamespace()
{
return MarkupParser.WICKET;
}
@Override
public String getPageIdentifier()
{
return "page";
}
@Override
public String getResourceIdentifier()
{
return "resource";
}
@Override
public ResourceReferenceRegistry getResourceReferenceRegistry()
{
return registry;
}
private final ResourceReferenceRegistry registry = new ResourceReferenceRegistry()
{
@Override
protected ResourceReference createDefaultResourceReference(Key key)
{
// Do not create package resource here because it requires "real" application
return null;
}
};
private boolean bookmarkable = true;
/**
* Determines whether the newly created page will have bookmarkable flag set
*
* @param bookmarkable
*/
public void setBookmarkable(boolean bookmarkable)
{
this.bookmarkable = bookmarkable;
}
private boolean createdBookmarkable = true;
/**
* Determines whether the newly created page will have createdBookmarkable flag set
*
* @param createdBookmarkable
*/
public void setCreatedBookmarkable(boolean createdBookmarkable)
{
this.createdBookmarkable = createdBookmarkable;
}
private int nextPageRenderCount = 0;
/**
*
* @param nextPageRenderCount
*/
public void setNextPageRenderCount(int nextPageRenderCount)
{
this.nextPageRenderCount = nextPageRenderCount;
}
@Override
public IRequestablePage getPageInstance(int pageId)
{
IRequestablePage requestablePage = (IRequestablePage)pageManager.getPage(pageId);
if (requestablePage == null && createMockPageIfInstanceNotFound)
{
MockPage page = new MockPage();
page.setPageId(pageId);
page.setBookmarkable(bookmarkable);
page.setCreatedBookmarkable(createdBookmarkable);
page.setRenderCount(nextPageRenderCount);
requestablePage = page;
}
return requestablePage;
}
int idCounter = 0;
@Override
public IRequestablePage newPageInstance(Class<? extends IRequestablePage> pageClass,
PageParameters pageParameters)
{
try
{
MockPage page;
page = (MockPage)pageClass.newInstance();
page.setPageId(++idCounter);
page.setBookmarkable(true);
page.setCreatedBookmarkable(true);
if (pageParameters != null)
{
page.getPageParameters().overwriteWith(pageParameters);
}
return page;
}
catch (Exception e)
{
throw new WicketRuntimeException(e);
}
}
@Override
public Class<? extends IRequestablePage> getHomePageClass()
{
return MockPage.class;
}
/**
*
* Adapts {@link PageProvider} to this {@link IMapperContext}
*
* @author Pedro Santos
*/
public class TestPageProvider extends PageProvider
{
/**
* Construct.
*
* @param pageId
* @param renderCount
*/
public TestPageProvider(int pageId, Integer renderCount)
{
super(pageId, renderCount);
}
@Override
protected IPageSource getPageSource()
{
return TestMapperContext.this;
}
}
}