renamed "contextProperties" attribute to "contextParameters" (matching web.xml naming); "contextParameters" contains Servlet/PortletConfig parameters as well; added default "servletContext" and "servletConfig" environment beans; added default "portletContext" and "portletConfig" environment beans; added default web scope "application", wrapping a ServletContext/PortletContext; MockPortletSession supports destruction of session attributes on invalidation
This commit is contained in:
@@ -152,7 +152,7 @@ public class MockPortletContext implements PortletContext {
|
||||
}
|
||||
|
||||
public int getMajorVersion() {
|
||||
return 1;
|
||||
return 2;
|
||||
}
|
||||
|
||||
public int getMinorVersion() {
|
||||
|
||||
@@ -19,9 +19,14 @@ package org.springframework.mock.web.portlet;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import javax.portlet.PortletContext;
|
||||
import javax.portlet.PortletSession;
|
||||
import javax.servlet.http.HttpSessionBindingEvent;
|
||||
import javax.servlet.http.HttpSessionBindingListener;
|
||||
|
||||
import org.springframework.mock.web.MockHttpSession;
|
||||
|
||||
/**
|
||||
* Mock implementation of the {@link javax.portlet.PortletSession} interface.
|
||||
@@ -70,7 +75,7 @@ public class MockPortletSession implements PortletSession {
|
||||
this.portletContext = (portletContext != null ? portletContext : new MockPortletContext());
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Object getAttribute(String name) {
|
||||
return this.portletAttributes.get(name);
|
||||
}
|
||||
@@ -120,14 +125,34 @@ public class MockPortletSession implements PortletSession {
|
||||
return this.maxInactiveInterval;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all of this session's attributes.
|
||||
*/
|
||||
public void clearAttributes() {
|
||||
doClearAttributes(this.portletAttributes);
|
||||
doClearAttributes(this.applicationAttributes);
|
||||
}
|
||||
|
||||
protected void doClearAttributes(Map<String, Object> attributes) {
|
||||
for (Iterator<Map.Entry<String, Object>> it = attributes.entrySet().iterator(); it.hasNext();) {
|
||||
Map.Entry<String, Object> entry = it.next();
|
||||
String name = entry.getKey();
|
||||
Object value = entry.getValue();
|
||||
it.remove();
|
||||
if (value instanceof HttpSessionBindingListener) {
|
||||
((HttpSessionBindingListener) value).valueUnbound(
|
||||
new HttpSessionBindingEvent(new MockHttpSession(), name, value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void invalidate() {
|
||||
this.invalid = true;
|
||||
this.portletAttributes.clear();
|
||||
this.applicationAttributes.clear();
|
||||
clearAttributes();
|
||||
}
|
||||
|
||||
public boolean isInvalid() {
|
||||
return invalid;
|
||||
return this.invalid;
|
||||
}
|
||||
|
||||
public void setNew(boolean value) {
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
* Copyright 2002-2009 the original author or authors.
|
||||
*
|
||||
* Licensed 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.springframework.mock.web.portlet;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import javax.portlet.PortletContext;
|
||||
import javax.portlet.PortletRequestDispatcher;
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* Mock implementation of the {@link javax.portlet.PortletContext} interface,
|
||||
* wrapping an underlying {@link javax.servlet.ServletContext}.
|
||||
*
|
||||
* @author Juergen Hoeller
|
||||
* @since 3.0
|
||||
* @see org.springframework.mock.web.portlet.MockPortletContext
|
||||
*/
|
||||
public class ServletWrappingPortletContext implements PortletContext {
|
||||
|
||||
private final ServletContext servletContext;
|
||||
|
||||
|
||||
/**
|
||||
* Create a new PortletContext wrapping the given ServletContext.
|
||||
* @param servletContext the ServletContext to wrap
|
||||
*/
|
||||
public ServletWrappingPortletContext(ServletContext servletContext) {
|
||||
Assert.notNull(servletContext, "ServletContext must not be null");
|
||||
this.servletContext = servletContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the underlying ServletContext that this PortletContext wraps.
|
||||
*/
|
||||
public final ServletContext getServletContext() {
|
||||
return this.servletContext;
|
||||
}
|
||||
|
||||
|
||||
public String getServerInfo() {
|
||||
return this.servletContext.getServerInfo();
|
||||
}
|
||||
|
||||
public PortletRequestDispatcher getRequestDispatcher(String path) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public PortletRequestDispatcher getNamedDispatcher(String name) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public InputStream getResourceAsStream(String path) {
|
||||
return this.servletContext.getResourceAsStream(path);
|
||||
}
|
||||
|
||||
public int getMajorVersion() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
public int getMinorVersion() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public String getMimeType(String file) {
|
||||
return this.servletContext.getMimeType(file);
|
||||
}
|
||||
|
||||
public String getRealPath(String path) {
|
||||
return this.servletContext.getRealPath(path);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Set<String> getResourcePaths(String path) {
|
||||
return this.servletContext.getResourcePaths(path);
|
||||
}
|
||||
|
||||
public URL getResource(String path) throws MalformedURLException {
|
||||
return this.servletContext.getResource(path);
|
||||
}
|
||||
|
||||
public Object getAttribute(String name) {
|
||||
return this.servletContext.getAttribute(name);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Enumeration<String> getAttributeNames() {
|
||||
return this.servletContext.getAttributeNames();
|
||||
}
|
||||
|
||||
public String getInitParameter(String name) {
|
||||
return this.servletContext.getInitParameter(name);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Enumeration<String> getInitParameterNames() {
|
||||
return this.servletContext.getInitParameterNames();
|
||||
}
|
||||
|
||||
public void log(String msg) {
|
||||
this.servletContext.log(msg);
|
||||
}
|
||||
|
||||
public void log(String message, Throwable throwable) {
|
||||
this.servletContext.log(message, throwable);
|
||||
}
|
||||
|
||||
public void removeAttribute(String name) {
|
||||
this.servletContext.removeAttribute(name);
|
||||
}
|
||||
|
||||
public void setAttribute(String name, Object object) {
|
||||
this.servletContext.setAttribute(name, object);
|
||||
}
|
||||
|
||||
public String getPortletContextName() {
|
||||
return this.servletContext.getServletContextName();
|
||||
}
|
||||
|
||||
public Enumeration<String> getContainerRuntimeOptions() {
|
||||
return Collections.enumeration(new HashSet<String>());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
* Copyright 2002-2009 the original author or authors.
|
||||
*
|
||||
* Licensed 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.springframework.web.portlet.context;
|
||||
|
||||
import javax.portlet.PortletContext;
|
||||
import javax.portlet.PortletSession;
|
||||
import javax.servlet.ServletContextEvent;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.beans.DerivedTestBean;
|
||||
import org.springframework.beans.factory.support.GenericBeanDefinition;
|
||||
import org.springframework.mock.web.MockServletContext;
|
||||
import org.springframework.mock.web.portlet.MockRenderRequest;
|
||||
import org.springframework.mock.web.portlet.ServletWrappingPortletContext;
|
||||
import org.springframework.web.context.ContextCleanupListener;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.support.GenericWebApplicationContext;
|
||||
|
||||
/**
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class PortletApplicationContextScopeTests {
|
||||
|
||||
private static final String NAME = "scoped";
|
||||
|
||||
|
||||
private ConfigurablePortletApplicationContext initApplicationContext(String scope) {
|
||||
MockServletContext sc = new MockServletContext();
|
||||
GenericWebApplicationContext rac = new GenericWebApplicationContext(sc);
|
||||
rac.refresh();
|
||||
PortletContext pc = new ServletWrappingPortletContext(sc);
|
||||
StaticPortletApplicationContext ac = new StaticPortletApplicationContext();
|
||||
ac.setParent(rac);
|
||||
ac.setPortletContext(pc);
|
||||
GenericBeanDefinition bd = new GenericBeanDefinition();
|
||||
bd.setBeanClass(DerivedTestBean.class);
|
||||
bd.setScope(scope);
|
||||
ac.registerBeanDefinition(NAME, bd);
|
||||
ac.refresh();
|
||||
return ac;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequestScope() {
|
||||
WebApplicationContext ac = initApplicationContext(WebApplicationContext.SCOPE_REQUEST);
|
||||
MockRenderRequest request = new MockRenderRequest();
|
||||
PortletRequestAttributes requestAttributes = new PortletRequestAttributes(request);
|
||||
RequestContextHolder.setRequestAttributes(requestAttributes);
|
||||
try {
|
||||
assertNull(request.getAttribute(NAME));
|
||||
DerivedTestBean bean = ac.getBean(NAME, DerivedTestBean.class);
|
||||
assertSame(bean, request.getAttribute(NAME));
|
||||
assertSame(bean, ac.getBean(NAME));
|
||||
requestAttributes.requestCompleted();
|
||||
assertTrue(bean.wasDestroyed());
|
||||
}
|
||||
finally {
|
||||
RequestContextHolder.setRequestAttributes(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSessionScope() {
|
||||
WebApplicationContext ac = initApplicationContext(WebApplicationContext.SCOPE_SESSION);
|
||||
MockRenderRequest request = new MockRenderRequest();
|
||||
PortletRequestAttributes requestAttributes = new PortletRequestAttributes(request);
|
||||
RequestContextHolder.setRequestAttributes(requestAttributes);
|
||||
try {
|
||||
assertNull(request.getPortletSession().getAttribute(NAME));
|
||||
DerivedTestBean bean = ac.getBean(NAME, DerivedTestBean.class);
|
||||
assertSame(bean, request.getPortletSession().getAttribute(NAME));
|
||||
assertSame(bean, ac.getBean(NAME));
|
||||
request.getPortletSession().invalidate();
|
||||
assertTrue(bean.wasDestroyed());
|
||||
}
|
||||
finally {
|
||||
RequestContextHolder.setRequestAttributes(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGlobalSessionScope() {
|
||||
WebApplicationContext ac = initApplicationContext(WebApplicationContext.SCOPE_GLOBAL_SESSION);
|
||||
MockRenderRequest request = new MockRenderRequest();
|
||||
PortletRequestAttributes requestAttributes = new PortletRequestAttributes(request);
|
||||
RequestContextHolder.setRequestAttributes(requestAttributes);
|
||||
try {
|
||||
assertNull(request.getPortletSession().getAttribute(NAME, PortletSession.APPLICATION_SCOPE));
|
||||
DerivedTestBean bean = ac.getBean(NAME, DerivedTestBean.class);
|
||||
assertSame(bean, request.getPortletSession().getAttribute(NAME, PortletSession.APPLICATION_SCOPE));
|
||||
assertSame(bean, ac.getBean(NAME));
|
||||
request.getPortletSession().invalidate();
|
||||
assertTrue(bean.wasDestroyed());
|
||||
}
|
||||
finally {
|
||||
RequestContextHolder.setRequestAttributes(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testApplicationScope() {
|
||||
ConfigurablePortletApplicationContext ac = initApplicationContext(WebApplicationContext.SCOPE_APPLICATION);
|
||||
assertNull(ac.getPortletContext().getAttribute(NAME));
|
||||
DerivedTestBean bean = ac.getBean(NAME, DerivedTestBean.class);
|
||||
assertSame(bean, ac.getPortletContext().getAttribute(NAME));
|
||||
assertSame(bean, ac.getBean(NAME));
|
||||
new ContextCleanupListener().contextDestroyed(new ServletContextEvent(ac.getServletContext()));
|
||||
assertTrue(bean.wasDestroyed());
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user