Browse Source
git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@557 50f2f4bb-b051-0410-bef5-90022cba6387pull/1/head
13 changed files with 2290 additions and 2293 deletions
@ -1,67 +1,66 @@
@@ -1,67 +1,66 @@
|
||||
/* |
||||
* Copyright 2002-2007 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; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
|
||||
import javax.servlet.ServletInputStream; |
||||
|
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* Delegating implementation of {@link javax.servlet.ServletInputStream}. |
||||
* |
||||
* <p>Used by {@link org.springframework.mock.web.MockHttpServletRequest}; typically not directly |
||||
* used for testing application controllers. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @since 1.0.2 |
||||
* @see org.springframework.mock.web.MockHttpServletRequest |
||||
*/ |
||||
public class DelegatingServletInputStream extends ServletInputStream { |
||||
|
||||
private final InputStream sourceStream; |
||||
|
||||
|
||||
/** |
||||
* Create a DelegatingServletInputStream for the given source stream. |
||||
* @param sourceStream the source stream (never <code>null</code>) |
||||
*/ |
||||
public DelegatingServletInputStream(InputStream sourceStream) { |
||||
Assert.notNull(sourceStream, "Source InputStream must not be null"); |
||||
this.sourceStream = sourceStream; |
||||
} |
||||
|
||||
/** |
||||
* Return the underlying source stream (never <code>null</code>). |
||||
*/ |
||||
public final InputStream getSourceStream() { |
||||
return this.sourceStream; |
||||
} |
||||
|
||||
|
||||
public int read() throws IOException { |
||||
return this.sourceStream.read(); |
||||
} |
||||
|
||||
public void close() throws IOException { |
||||
super.close(); |
||||
this.sourceStream.close(); |
||||
} |
||||
|
||||
} |
||||
/* |
||||
* 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; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import javax.servlet.ServletInputStream; |
||||
|
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* Delegating implementation of {@link javax.servlet.ServletInputStream}. |
||||
* |
||||
* <p>Used by {@link MockHttpServletRequest}; typically not directly |
||||
* used for testing application controllers. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @since 1.0.2 |
||||
* @see MockHttpServletRequest |
||||
*/ |
||||
public class DelegatingServletInputStream extends ServletInputStream { |
||||
|
||||
private final InputStream sourceStream; |
||||
|
||||
|
||||
/** |
||||
* Create a DelegatingServletInputStream for the given source stream. |
||||
* @param sourceStream the source stream (never <code>null</code>) |
||||
*/ |
||||
public DelegatingServletInputStream(InputStream sourceStream) { |
||||
Assert.notNull(sourceStream, "Source InputStream must not be null"); |
||||
this.sourceStream = sourceStream; |
||||
} |
||||
|
||||
/** |
||||
* Return the underlying source stream (never <code>null</code>). |
||||
*/ |
||||
public final InputStream getSourceStream() { |
||||
return this.sourceStream; |
||||
} |
||||
|
||||
|
||||
public int read() throws IOException { |
||||
return this.sourceStream.read(); |
||||
} |
||||
|
||||
public void close() throws IOException { |
||||
super.close(); |
||||
this.sourceStream.close(); |
||||
} |
||||
|
||||
} |
||||
|
||||
@ -1,72 +1,71 @@
@@ -1,72 +1,71 @@
|
||||
/* |
||||
* Copyright 2002-2007 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; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.OutputStream; |
||||
|
||||
import javax.servlet.ServletOutputStream; |
||||
|
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* Delegating implementation of {@link javax.servlet.ServletOutputStream}. |
||||
* |
||||
* <p>Used by {@link org.springframework.mock.web.MockHttpServletResponse}; typically not directly |
||||
* used for testing application controllers. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @since 1.0.2 |
||||
* @see org.springframework.mock.web.MockHttpServletResponse |
||||
*/ |
||||
public class DelegatingServletOutputStream extends ServletOutputStream { |
||||
|
||||
private final OutputStream targetStream; |
||||
|
||||
|
||||
/** |
||||
* Create a DelegatingServletOutputStream for the given target stream. |
||||
* @param targetStream the target stream (never <code>null</code>) |
||||
*/ |
||||
public DelegatingServletOutputStream(OutputStream targetStream) { |
||||
Assert.notNull(targetStream, "Target OutputStream must not be null"); |
||||
this.targetStream = targetStream; |
||||
} |
||||
|
||||
/** |
||||
* Return the underlying target stream (never <code>null</code>). |
||||
*/ |
||||
public final OutputStream getTargetStream() { |
||||
return this.targetStream; |
||||
} |
||||
|
||||
|
||||
public void write(int b) throws IOException { |
||||
this.targetStream.write(b); |
||||
} |
||||
|
||||
public void flush() throws IOException { |
||||
super.flush(); |
||||
this.targetStream.flush(); |
||||
} |
||||
|
||||
public void close() throws IOException { |
||||
super.close(); |
||||
this.targetStream.close(); |
||||
} |
||||
|
||||
} |
||||
/* |
||||
* 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; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.OutputStream; |
||||
import javax.servlet.ServletOutputStream; |
||||
|
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* Delegating implementation of {@link javax.servlet.ServletOutputStream}. |
||||
* |
||||
* <p>Used by {@link MockHttpServletResponse}; typically not directly |
||||
* used for testing application controllers. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @since 1.0.2 |
||||
* @see MockHttpServletResponse |
||||
*/ |
||||
public class DelegatingServletOutputStream extends ServletOutputStream { |
||||
|
||||
private final OutputStream targetStream; |
||||
|
||||
|
||||
/** |
||||
* Create a DelegatingServletOutputStream for the given target stream. |
||||
* @param targetStream the target stream (never <code>null</code>) |
||||
*/ |
||||
public DelegatingServletOutputStream(OutputStream targetStream) { |
||||
Assert.notNull(targetStream, "Target OutputStream must not be null"); |
||||
this.targetStream = targetStream; |
||||
} |
||||
|
||||
/** |
||||
* Return the underlying target stream (never <code>null</code>). |
||||
*/ |
||||
public final OutputStream getTargetStream() { |
||||
return this.targetStream; |
||||
} |
||||
|
||||
|
||||
public void write(int b) throws IOException { |
||||
this.targetStream.write(b); |
||||
} |
||||
|
||||
public void flush() throws IOException { |
||||
super.flush(); |
||||
this.targetStream.flush(); |
||||
} |
||||
|
||||
public void close() throws IOException { |
||||
super.close(); |
||||
this.targetStream.close(); |
||||
} |
||||
|
||||
} |
||||
|
||||
@ -1,85 +1,92 @@
@@ -1,85 +1,92 @@
|
||||
/* |
||||
* Copyright 2002-2007 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; |
||||
|
||||
import java.util.Collection; |
||||
import java.util.Collections; |
||||
import java.util.Iterator; |
||||
import java.util.LinkedList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import org.springframework.util.Assert; |
||||
import org.springframework.util.CollectionUtils; |
||||
|
||||
/** |
||||
* Internal helper class that serves as value holder for request headers. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @author Rick Evans |
||||
* @since 2.0.1 |
||||
*/ |
||||
class HeaderValueHolder { |
||||
|
||||
private final List values = new LinkedList(); |
||||
|
||||
|
||||
public void setValue(Object value) { |
||||
this.values.clear(); |
||||
this.values.add(value); |
||||
} |
||||
|
||||
public void addValue(Object value) { |
||||
this.values.add(value); |
||||
} |
||||
|
||||
public void addValues(Collection values) { |
||||
this.values.addAll(values); |
||||
} |
||||
|
||||
public void addValueArray(Object values) { |
||||
CollectionUtils.mergeArrayIntoCollection(values, this.values); |
||||
} |
||||
|
||||
public List getValues() { |
||||
return Collections.unmodifiableList(this.values); |
||||
} |
||||
|
||||
public Object getValue() { |
||||
return (!this.values.isEmpty() ? this.values.get(0) : null); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Find a HeaderValueHolder by name, ignoring casing. |
||||
* @param headers the Map of header names to HeaderValueHolders |
||||
* @param name the name of the desired header |
||||
* @return the corresponding HeaderValueHolder, |
||||
* or <code>null</code> if none found |
||||
*/ |
||||
public static HeaderValueHolder getByName(Map headers, String name) { |
||||
Assert.notNull(name, "Header name must not be null"); |
||||
for (Iterator it = headers.keySet().iterator(); it.hasNext();) { |
||||
String headerName = (String) it.next(); |
||||
if (headerName.equalsIgnoreCase(name)) { |
||||
return (HeaderValueHolder) headers.get(headerName); |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
} |
||||
/* |
||||
* 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; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Collection; |
||||
import java.util.Collections; |
||||
import java.util.LinkedList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import org.springframework.util.Assert; |
||||
import org.springframework.util.CollectionUtils; |
||||
|
||||
/** |
||||
* Internal helper class that serves as value holder for request headers. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @author Rick Evans |
||||
* @since 2.0.1 |
||||
*/ |
||||
class HeaderValueHolder { |
||||
|
||||
private final List<Object> values = new LinkedList<Object>(); |
||||
|
||||
|
||||
public void setValue(Object value) { |
||||
this.values.clear(); |
||||
this.values.add(value); |
||||
} |
||||
|
||||
public void addValue(Object value) { |
||||
this.values.add(value); |
||||
} |
||||
|
||||
public void addValues(Collection<?> values) { |
||||
this.values.addAll(values); |
||||
} |
||||
|
||||
public void addValueArray(Object values) { |
||||
CollectionUtils.mergeArrayIntoCollection(values, this.values); |
||||
} |
||||
|
||||
public List<Object> getValues() { |
||||
return Collections.unmodifiableList(this.values); |
||||
} |
||||
|
||||
public List<String> getStringValues() { |
||||
List<String> stringList = new ArrayList<String>(this.values.size()); |
||||
for (Object value : this.values) { |
||||
stringList.add(value.toString()); |
||||
} |
||||
return Collections.unmodifiableList(stringList); |
||||
} |
||||
|
||||
public Object getValue() { |
||||
return (!this.values.isEmpty() ? this.values.get(0) : null); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Find a HeaderValueHolder by name, ignoring casing. |
||||
* @param headers the Map of header names to HeaderValueHolders |
||||
* @param name the name of the desired header |
||||
* @return the corresponding HeaderValueHolder, |
||||
* or <code>null</code> if none found |
||||
*/ |
||||
public static HeaderValueHolder getByName(Map<String, HeaderValueHolder> headers, String name) { |
||||
Assert.notNull(name, "Header name must not be null"); |
||||
for (String headerName : headers.keySet()) { |
||||
if (headerName.equalsIgnoreCase(name)) { |
||||
return headers.get(headerName); |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
} |
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,245 +1,246 @@
@@ -1,245 +1,246 @@
|
||||
/* |
||||
* Copyright 2002-2007 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; |
||||
|
||||
import java.io.Serializable; |
||||
import java.util.Enumeration; |
||||
import java.util.HashMap; |
||||
import java.util.Hashtable; |
||||
import java.util.Iterator; |
||||
import java.util.Map; |
||||
|
||||
import javax.servlet.ServletContext; |
||||
import javax.servlet.http.HttpSession; |
||||
import javax.servlet.http.HttpSessionBindingEvent; |
||||
import javax.servlet.http.HttpSessionBindingListener; |
||||
import javax.servlet.http.HttpSessionContext; |
||||
|
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* Mock implementation of the {@link javax.servlet.http.HttpSession} interface. |
||||
* Supports the Servlet 2.4 API level. |
||||
* |
||||
* <p>Used for testing the web framework; also useful for testing |
||||
* application controllers. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @author Rod Johnson |
||||
* @author Mark Fisher |
||||
* @since 1.0.2 |
||||
*/ |
||||
public class MockHttpSession implements HttpSession { |
||||
|
||||
public static final String SESSION_COOKIE_NAME = "JSESSION"; |
||||
|
||||
private static int nextId = 1; |
||||
|
||||
|
||||
private final String id; |
||||
|
||||
private final long creationTime = System.currentTimeMillis(); |
||||
|
||||
private int maxInactiveInterval; |
||||
|
||||
private long lastAccessedTime = System.currentTimeMillis(); |
||||
|
||||
private final ServletContext servletContext; |
||||
|
||||
private final Hashtable attributes = new Hashtable(); |
||||
|
||||
private boolean invalid = false; |
||||
|
||||
private boolean isNew = true; |
||||
|
||||
|
||||
/** |
||||
* Create a new MockHttpSession with a default {@link org.springframework.mock.web.MockServletContext}. |
||||
* @see org.springframework.mock.web.MockServletContext |
||||
*/ |
||||
public MockHttpSession() { |
||||
this(null); |
||||
} |
||||
|
||||
/** |
||||
* Create a new MockHttpSession. |
||||
* @param servletContext the ServletContext that the session runs in |
||||
*/ |
||||
public MockHttpSession(ServletContext servletContext) { |
||||
this(servletContext, null); |
||||
} |
||||
|
||||
/** |
||||
* Create a new MockHttpSession. |
||||
* @param servletContext the ServletContext that the session runs in |
||||
* @param id a unique identifier for this session |
||||
*/ |
||||
public MockHttpSession(ServletContext servletContext, String id) { |
||||
this.servletContext = (servletContext != null ? servletContext : new MockServletContext()); |
||||
this.id = (id != null ? id : Integer.toString(nextId++)); |
||||
} |
||||
|
||||
|
||||
public long getCreationTime() { |
||||
return this.creationTime; |
||||
} |
||||
|
||||
public String getId() { |
||||
return this.id; |
||||
} |
||||
|
||||
public void access() { |
||||
this.lastAccessedTime = System.currentTimeMillis(); |
||||
this.isNew = false; |
||||
} |
||||
|
||||
public long getLastAccessedTime() { |
||||
return this.lastAccessedTime; |
||||
} |
||||
|
||||
public ServletContext getServletContext() { |
||||
return this.servletContext; |
||||
} |
||||
|
||||
public void setMaxInactiveInterval(int interval) { |
||||
this.maxInactiveInterval = interval; |
||||
} |
||||
|
||||
public int getMaxInactiveInterval() { |
||||
return this.maxInactiveInterval; |
||||
} |
||||
|
||||
public HttpSessionContext getSessionContext() { |
||||
throw new UnsupportedOperationException("getSessionContext"); |
||||
} |
||||
|
||||
public Object getAttribute(String name) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
return this.attributes.get(name); |
||||
} |
||||
|
||||
public Object getValue(String name) { |
||||
return getAttribute(name); |
||||
} |
||||
|
||||
public Enumeration getAttributeNames() { |
||||
return this.attributes.keys(); |
||||
} |
||||
|
||||
public String[] getValueNames() { |
||||
return (String[]) this.attributes.keySet().toArray(new String[this.attributes.size()]); |
||||
} |
||||
|
||||
public void setAttribute(String name, Object value) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
if (value != null) { |
||||
this.attributes.put(name, value); |
||||
if (value instanceof HttpSessionBindingListener) { |
||||
((HttpSessionBindingListener) value).valueBound(new HttpSessionBindingEvent(this, name, value)); |
||||
} |
||||
} |
||||
else { |
||||
removeAttribute(name); |
||||
} |
||||
} |
||||
|
||||
public void putValue(String name, Object value) { |
||||
setAttribute(name, value); |
||||
} |
||||
|
||||
public void removeAttribute(String name) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
Object value = this.attributes.remove(name); |
||||
if (value instanceof HttpSessionBindingListener) { |
||||
((HttpSessionBindingListener) value).valueUnbound(new HttpSessionBindingEvent(this, name, value)); |
||||
} |
||||
} |
||||
|
||||
public void removeValue(String name) { |
||||
removeAttribute(name); |
||||
} |
||||
|
||||
/** |
||||
* Clear all of this session's attributes. |
||||
*/ |
||||
public void clearAttributes() { |
||||
for (Iterator it = this.attributes.entrySet().iterator(); it.hasNext();) { |
||||
Map.Entry entry = (Map.Entry) it.next(); |
||||
String name = (String) entry.getKey(); |
||||
Object value = entry.getValue(); |
||||
it.remove(); |
||||
if (value instanceof HttpSessionBindingListener) { |
||||
((HttpSessionBindingListener) value).valueUnbound(new HttpSessionBindingEvent(this, name, value)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void invalidate() { |
||||
this.invalid = true; |
||||
clearAttributes(); |
||||
} |
||||
|
||||
public boolean isInvalid() { |
||||
return this.invalid; |
||||
} |
||||
|
||||
public void setNew(boolean value) { |
||||
this.isNew = value; |
||||
} |
||||
|
||||
public boolean isNew() { |
||||
return this.isNew; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Serialize the attributes of this session into an object that can |
||||
* be turned into a byte array with standard Java serialization. |
||||
* @return a representation of this session's serialized state |
||||
*/ |
||||
public Serializable serializeState() { |
||||
HashMap state = new HashMap(); |
||||
for (Iterator it = this.attributes.entrySet().iterator(); it.hasNext();) { |
||||
Map.Entry entry = (Map.Entry) it.next(); |
||||
String name = (String) entry.getKey(); |
||||
Object value = entry.getValue(); |
||||
it.remove(); |
||||
if (value instanceof Serializable) { |
||||
state.put(name, value); |
||||
} |
||||
else { |
||||
// Not serializable... Servlet containers usually automatically
|
||||
// unbind the attribute in this case.
|
||||
if (value instanceof HttpSessionBindingListener) { |
||||
((HttpSessionBindingListener) value).valueUnbound(new HttpSessionBindingEvent(this, name, value)); |
||||
} |
||||
} |
||||
} |
||||
return state; |
||||
} |
||||
|
||||
/** |
||||
* Deserialize the attributes of this session from a state object |
||||
* created by {@link #serializeState()}. |
||||
* @param state a representation of this session's serialized state |
||||
*/ |
||||
public void deserializeState(Serializable state) { |
||||
Assert.isTrue(state instanceof Map, "Serialized state needs to be of type [java.util.Map]"); |
||||
this.attributes.putAll((Map) state); |
||||
} |
||||
|
||||
} |
||||
/* |
||||
* 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; |
||||
|
||||
import java.io.Serializable; |
||||
import java.util.Collections; |
||||
import java.util.Enumeration; |
||||
import java.util.HashMap; |
||||
import java.util.Iterator; |
||||
import java.util.LinkedHashMap; |
||||
import java.util.Map; |
||||
import javax.servlet.ServletContext; |
||||
import javax.servlet.http.HttpSession; |
||||
import javax.servlet.http.HttpSessionBindingEvent; |
||||
import javax.servlet.http.HttpSessionBindingListener; |
||||
import javax.servlet.http.HttpSessionContext; |
||||
|
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* Mock implementation of the {@link javax.servlet.http.HttpSession} interface. |
||||
* Supports the Servlet 2.4 API level. |
||||
* |
||||
* <p>Used for testing the web framework; also useful for testing |
||||
* application controllers. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @author Rod Johnson |
||||
* @author Mark Fisher |
||||
* @since 1.0.2 |
||||
*/ |
||||
public class MockHttpSession implements HttpSession { |
||||
|
||||
public static final String SESSION_COOKIE_NAME = "JSESSION"; |
||||
|
||||
private static int nextId = 1; |
||||
|
||||
|
||||
private final String id; |
||||
|
||||
private final long creationTime = System.currentTimeMillis(); |
||||
|
||||
private int maxInactiveInterval; |
||||
|
||||
private long lastAccessedTime = System.currentTimeMillis(); |
||||
|
||||
private final ServletContext servletContext; |
||||
|
||||
private final Map<String, Object> attributes = new LinkedHashMap<String, Object>(); |
||||
|
||||
private boolean invalid = false; |
||||
|
||||
private boolean isNew = true; |
||||
|
||||
|
||||
/** |
||||
* Create a new MockHttpSession with a default {@link MockServletContext}. |
||||
* @see MockServletContext |
||||
*/ |
||||
public MockHttpSession() { |
||||
this(null); |
||||
} |
||||
|
||||
/** |
||||
* Create a new MockHttpSession. |
||||
* @param servletContext the ServletContext that the session runs in |
||||
*/ |
||||
public MockHttpSession(ServletContext servletContext) { |
||||
this(servletContext, null); |
||||
} |
||||
|
||||
/** |
||||
* Create a new MockHttpSession. |
||||
* @param servletContext the ServletContext that the session runs in |
||||
* @param id a unique identifier for this session |
||||
*/ |
||||
public MockHttpSession(ServletContext servletContext, String id) { |
||||
this.servletContext = (servletContext != null ? servletContext : new MockServletContext()); |
||||
this.id = (id != null ? id : Integer.toString(nextId++)); |
||||
} |
||||
|
||||
|
||||
public long getCreationTime() { |
||||
return this.creationTime; |
||||
} |
||||
|
||||
public String getId() { |
||||
return this.id; |
||||
} |
||||
|
||||
public void access() { |
||||
this.lastAccessedTime = System.currentTimeMillis(); |
||||
this.isNew = false; |
||||
} |
||||
|
||||
public long getLastAccessedTime() { |
||||
return this.lastAccessedTime; |
||||
} |
||||
|
||||
public ServletContext getServletContext() { |
||||
return this.servletContext; |
||||
} |
||||
|
||||
public void setMaxInactiveInterval(int interval) { |
||||
this.maxInactiveInterval = interval; |
||||
} |
||||
|
||||
public int getMaxInactiveInterval() { |
||||
return this.maxInactiveInterval; |
||||
} |
||||
|
||||
public HttpSessionContext getSessionContext() { |
||||
throw new UnsupportedOperationException("getSessionContext"); |
||||
} |
||||
|
||||
public Object getAttribute(String name) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
return this.attributes.get(name); |
||||
} |
||||
|
||||
public Object getValue(String name) { |
||||
return getAttribute(name); |
||||
} |
||||
|
||||
public Enumeration<String> getAttributeNames() { |
||||
return Collections.enumeration(this.attributes.keySet()); |
||||
} |
||||
|
||||
public String[] getValueNames() { |
||||
return this.attributes.keySet().toArray(new String[this.attributes.size()]); |
||||
} |
||||
|
||||
public void setAttribute(String name, Object value) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
if (value != null) { |
||||
this.attributes.put(name, value); |
||||
if (value instanceof HttpSessionBindingListener) { |
||||
((HttpSessionBindingListener) value).valueBound(new HttpSessionBindingEvent(this, name, value)); |
||||
} |
||||
} |
||||
else { |
||||
removeAttribute(name); |
||||
} |
||||
} |
||||
|
||||
public void putValue(String name, Object value) { |
||||
setAttribute(name, value); |
||||
} |
||||
|
||||
public void removeAttribute(String name) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
Object value = this.attributes.remove(name); |
||||
if (value instanceof HttpSessionBindingListener) { |
||||
((HttpSessionBindingListener) value).valueUnbound(new HttpSessionBindingEvent(this, name, value)); |
||||
} |
||||
} |
||||
|
||||
public void removeValue(String name) { |
||||
removeAttribute(name); |
||||
} |
||||
|
||||
/** |
||||
* Clear all of this session's attributes. |
||||
*/ |
||||
public void clearAttributes() { |
||||
for (Iterator<Map.Entry<String, Object>> it = this.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(this, name, value)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void invalidate() { |
||||
this.invalid = true; |
||||
clearAttributes(); |
||||
} |
||||
|
||||
public boolean isInvalid() { |
||||
return this.invalid; |
||||
} |
||||
|
||||
public void setNew(boolean value) { |
||||
this.isNew = value; |
||||
} |
||||
|
||||
public boolean isNew() { |
||||
return this.isNew; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Serialize the attributes of this session into an object that can |
||||
* be turned into a byte array with standard Java serialization. |
||||
* @return a representation of this session's serialized state |
||||
*/ |
||||
public Serializable serializeState() { |
||||
HashMap<String, Serializable> state = new HashMap<String, Serializable>(); |
||||
for (Iterator<Map.Entry<String, Object>> it = this.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 Serializable) { |
||||
state.put(name, (Serializable) value); |
||||
} |
||||
else { |
||||
// Not serializable... Servlet containers usually automatically
|
||||
// unbind the attribute in this case.
|
||||
if (value instanceof HttpSessionBindingListener) { |
||||
((HttpSessionBindingListener) value).valueUnbound(new HttpSessionBindingEvent(this, name, value)); |
||||
} |
||||
} |
||||
} |
||||
return state; |
||||
} |
||||
|
||||
/** |
||||
* Deserialize the attributes of this session from a state object |
||||
* created by {@link #serializeState()}. |
||||
* @param state a representation of this session's serialized state |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
public void deserializeState(Serializable state) { |
||||
Assert.isTrue(state instanceof Map, "Serialized state needs to be of type [java.util.Map]"); |
||||
this.attributes.putAll((Map<String, Object>) state); |
||||
} |
||||
|
||||
} |
||||
|
||||
@ -1,91 +1,91 @@
@@ -1,91 +1,91 @@
|
||||
/* |
||||
* Copyright 2002-2007 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; |
||||
|
||||
import javax.servlet.RequestDispatcher; |
||||
import javax.servlet.ServletRequest; |
||||
import javax.servlet.ServletResponse; |
||||
import javax.servlet.http.HttpServletResponseWrapper; |
||||
|
||||
import org.apache.commons.logging.Log; |
||||
import org.apache.commons.logging.LogFactory; |
||||
|
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* Mock implementation of the {@link javax.servlet.RequestDispatcher} interface. |
||||
* |
||||
* <p>Used for testing the web framework; typically not necessary for |
||||
* testing application controllers. |
||||
* |
||||
* @author Rod Johnson |
||||
* @author Juergen Hoeller |
||||
* @since 1.0.2 |
||||
*/ |
||||
public class MockRequestDispatcher implements RequestDispatcher { |
||||
|
||||
private final Log logger = LogFactory.getLog(getClass()); |
||||
|
||||
private final String url; |
||||
|
||||
|
||||
/** |
||||
* Create a new MockRequestDispatcher for the given URL. |
||||
* @param url the URL to dispatch to. |
||||
*/ |
||||
public MockRequestDispatcher(String url) { |
||||
Assert.notNull(url, "URL must not be null"); |
||||
this.url = url; |
||||
} |
||||
|
||||
|
||||
public void forward(ServletRequest request, ServletResponse response) { |
||||
Assert.notNull(request, "Request must not be null"); |
||||
Assert.notNull(response, "Response must not be null"); |
||||
if (response.isCommitted()) { |
||||
throw new IllegalStateException("Cannot perform forward - response is already committed"); |
||||
} |
||||
getMockHttpServletResponse(response).setForwardedUrl(this.url); |
||||
if (logger.isDebugEnabled()) { |
||||
logger.debug("MockRequestDispatcher: forwarding to URL [" + this.url + "]"); |
||||
} |
||||
} |
||||
|
||||
public void include(ServletRequest request, ServletResponse response) { |
||||
Assert.notNull(request, "Request must not be null"); |
||||
Assert.notNull(response, "Response must not be null"); |
||||
getMockHttpServletResponse(response).setIncludedUrl(this.url); |
||||
if (logger.isDebugEnabled()) { |
||||
logger.debug("MockRequestDispatcher: including URL [" + this.url + "]"); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Obtain the underlying MockHttpServletResponse, |
||||
* unwrapping {@link javax.servlet.http.HttpServletResponseWrapper} decorators if necessary. |
||||
*/ |
||||
protected MockHttpServletResponse getMockHttpServletResponse(ServletResponse response) { |
||||
if (response instanceof MockHttpServletResponse) { |
||||
return (MockHttpServletResponse) response; |
||||
} |
||||
if (response instanceof HttpServletResponseWrapper) { |
||||
return getMockHttpServletResponse(((HttpServletResponseWrapper) response).getResponse()); |
||||
} |
||||
throw new IllegalArgumentException("MockRequestDispatcher requires MockHttpServletResponse"); |
||||
} |
||||
|
||||
} |
||||
/* |
||||
* 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; |
||||
|
||||
import javax.servlet.RequestDispatcher; |
||||
import javax.servlet.ServletRequest; |
||||
import javax.servlet.ServletResponse; |
||||
import javax.servlet.http.HttpServletResponseWrapper; |
||||
|
||||
import org.apache.commons.logging.Log; |
||||
import org.apache.commons.logging.LogFactory; |
||||
|
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* Mock implementation of the {@link javax.servlet.RequestDispatcher} interface. |
||||
* |
||||
* <p>Used for testing the web framework; typically not necessary for |
||||
* testing application controllers. |
||||
* |
||||
* @author Rod Johnson |
||||
* @author Juergen Hoeller |
||||
* @since 1.0.2 |
||||
*/ |
||||
public class MockRequestDispatcher implements RequestDispatcher { |
||||
|
||||
private final Log logger = LogFactory.getLog(getClass()); |
||||
|
||||
private final String url; |
||||
|
||||
|
||||
/** |
||||
* Create a new MockRequestDispatcher for the given URL. |
||||
* @param url the URL to dispatch to. |
||||
*/ |
||||
public MockRequestDispatcher(String url) { |
||||
Assert.notNull(url, "URL must not be null"); |
||||
this.url = url; |
||||
} |
||||
|
||||
|
||||
public void forward(ServletRequest request, ServletResponse response) { |
||||
Assert.notNull(request, "Request must not be null"); |
||||
Assert.notNull(response, "Response must not be null"); |
||||
if (response.isCommitted()) { |
||||
throw new IllegalStateException("Cannot perform forward - response is already committed"); |
||||
} |
||||
getMockHttpServletResponse(response).setForwardedUrl(this.url); |
||||
if (logger.isDebugEnabled()) { |
||||
logger.debug("MockRequestDispatcher: forwarding to URL [" + this.url + "]"); |
||||
} |
||||
} |
||||
|
||||
public void include(ServletRequest request, ServletResponse response) { |
||||
Assert.notNull(request, "Request must not be null"); |
||||
Assert.notNull(response, "Response must not be null"); |
||||
getMockHttpServletResponse(response).setIncludedUrl(this.url); |
||||
if (logger.isDebugEnabled()) { |
||||
logger.debug("MockRequestDispatcher: including URL [" + this.url + "]"); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Obtain the underlying MockHttpServletResponse, |
||||
* unwrapping {@link HttpServletResponseWrapper} decorators if necessary. |
||||
*/ |
||||
protected MockHttpServletResponse getMockHttpServletResponse(ServletResponse response) { |
||||
if (response instanceof MockHttpServletResponse) { |
||||
return (MockHttpServletResponse) response; |
||||
} |
||||
if (response instanceof HttpServletResponseWrapper) { |
||||
return getMockHttpServletResponse(((HttpServletResponseWrapper) response).getResponse()); |
||||
} |
||||
throw new IllegalArgumentException("MockRequestDispatcher requires MockHttpServletResponse"); |
||||
} |
||||
|
||||
} |
||||
|
||||
@ -1,356 +1,355 @@
@@ -1,356 +1,355 @@
|
||||
/* |
||||
* Copyright 2002-2007 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; |
||||
|
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.net.MalformedURLException; |
||||
import java.net.URL; |
||||
import java.util.Collections; |
||||
import java.util.Enumeration; |
||||
import java.util.HashMap; |
||||
import java.util.Hashtable; |
||||
import java.util.LinkedHashSet; |
||||
import java.util.Map; |
||||
import java.util.Properties; |
||||
import java.util.Set; |
||||
|
||||
import javax.activation.FileTypeMap; |
||||
import javax.servlet.RequestDispatcher; |
||||
import javax.servlet.Servlet; |
||||
import javax.servlet.ServletContext; |
||||
|
||||
import org.apache.commons.logging.Log; |
||||
import org.apache.commons.logging.LogFactory; |
||||
|
||||
import org.springframework.core.io.DefaultResourceLoader; |
||||
import org.springframework.core.io.Resource; |
||||
import org.springframework.core.io.ResourceLoader; |
||||
import org.springframework.util.Assert; |
||||
import org.springframework.util.ObjectUtils; |
||||
import org.springframework.web.util.WebUtils; |
||||
|
||||
/** |
||||
* Mock implementation of the {@link javax.servlet.ServletContext} interface. |
||||
* |
||||
* <p>Used for testing the Spring web framework; only rarely necessary for testing |
||||
* application controllers. As long as application components don't explicitly |
||||
* access the ServletContext, ClassPathXmlApplicationContext or |
||||
* FileSystemXmlApplicationContext can be used to load the context files for testing, |
||||
* even for DispatcherServlet context definitions. |
||||
* |
||||
* <p>For setting up a full WebApplicationContext in a test environment, you can |
||||
* use XmlWebApplicationContext (or GenericWebApplicationContext), passing in an |
||||
* appropriate MockServletContext instance. You might want to configure your |
||||
* MockServletContext with a FileSystemResourceLoader in that case, to make your |
||||
* resource paths interpreted as relative file system locations. |
||||
* |
||||
* <p>A common setup is to point your JVM working directory to the root of your |
||||
* web application directory, in combination with filesystem-based resource loading. |
||||
* This allows to load the context files as used in the web application, with |
||||
* relative paths getting interpreted correctly. Such a setup will work with both |
||||
* FileSystemXmlApplicationContext (which will load straight from the file system) |
||||
* and XmlWebApplicationContext with an underlying MockServletContext (as long as |
||||
* the MockServletContext has been configured with a FileSystemResourceLoader). |
||||
* |
||||
* @author Rod Johnson |
||||
* @author Juergen Hoeller |
||||
* @since 1.0.2 |
||||
* @see #MockServletContext(org.springframework.core.io.ResourceLoader) |
||||
* @see org.springframework.web.context.support.XmlWebApplicationContext |
||||
* @see org.springframework.web.context.support.GenericWebApplicationContext |
||||
* @see org.springframework.context.support.ClassPathXmlApplicationContext |
||||
* @see org.springframework.context.support.FileSystemXmlApplicationContext |
||||
*/ |
||||
public class MockServletContext implements ServletContext { |
||||
|
||||
private static final String TEMP_DIR_SYSTEM_PROPERTY = "java.io.tmpdir"; |
||||
|
||||
|
||||
private final Log logger = LogFactory.getLog(getClass()); |
||||
|
||||
private final ResourceLoader resourceLoader; |
||||
|
||||
private final String resourceBasePath; |
||||
|
||||
private String contextPath = ""; |
||||
|
||||
private final Map contexts = new HashMap(); |
||||
|
||||
private final Properties initParameters = new Properties(); |
||||
|
||||
private final Hashtable attributes = new Hashtable(); |
||||
|
||||
private String servletContextName = "MockServletContext"; |
||||
|
||||
|
||||
/** |
||||
* Create a new MockServletContext, using no base path and a |
||||
* DefaultResourceLoader (i.e. the classpath root as WAR root). |
||||
* @see org.springframework.core.io.DefaultResourceLoader |
||||
*/ |
||||
public MockServletContext() { |
||||
this("", null); |
||||
} |
||||
|
||||
/** |
||||
* Create a new MockServletContext, using a DefaultResourceLoader. |
||||
* @param resourceBasePath the WAR root directory (should not end with a slash) |
||||
* @see org.springframework.core.io.DefaultResourceLoader |
||||
*/ |
||||
public MockServletContext(String resourceBasePath) { |
||||
this(resourceBasePath, null); |
||||
} |
||||
|
||||
/** |
||||
* Create a new MockServletContext, using the specified ResourceLoader |
||||
* and no base path. |
||||
* @param resourceLoader the ResourceLoader to use (or null for the default) |
||||
*/ |
||||
public MockServletContext(ResourceLoader resourceLoader) { |
||||
this("", resourceLoader); |
||||
} |
||||
|
||||
/** |
||||
* Create a new MockServletContext. |
||||
* @param resourceBasePath the WAR root directory (should not end with a slash) |
||||
* @param resourceLoader the ResourceLoader to use (or null for the default) |
||||
*/ |
||||
public MockServletContext(String resourceBasePath, ResourceLoader resourceLoader) { |
||||
this.resourceLoader = (resourceLoader != null ? resourceLoader : new DefaultResourceLoader()); |
||||
this.resourceBasePath = (resourceBasePath != null ? resourceBasePath : ""); |
||||
|
||||
// Use JVM temp dir as ServletContext temp dir.
|
||||
String tempDir = System.getProperty(TEMP_DIR_SYSTEM_PROPERTY); |
||||
if (tempDir != null) { |
||||
this.attributes.put(WebUtils.TEMP_DIR_CONTEXT_ATTRIBUTE, new File(tempDir)); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Build a full resource location for the given path, |
||||
* prepending the resource base path of this MockServletContext. |
||||
* @param path the path as specified |
||||
* @return the full resource path |
||||
*/ |
||||
protected String getResourceLocation(String path) { |
||||
if (!path.startsWith("/")) { |
||||
path = "/" + path; |
||||
} |
||||
return this.resourceBasePath + path; |
||||
} |
||||
|
||||
|
||||
public void setContextPath(String contextPath) { |
||||
this.contextPath = (contextPath != null ? contextPath : ""); |
||||
} |
||||
|
||||
/* This is a Servlet API 2.5 method. */ |
||||
public String getContextPath() { |
||||
return this.contextPath; |
||||
} |
||||
|
||||
public void registerContext(String contextPath, ServletContext context) { |
||||
this.contexts.put(contextPath, context); |
||||
} |
||||
|
||||
public ServletContext getContext(String contextPath) { |
||||
if (this.contextPath.equals(contextPath)) { |
||||
return this; |
||||
} |
||||
return (ServletContext) this.contexts.get(contextPath); |
||||
} |
||||
|
||||
public int getMajorVersion() { |
||||
return 2; |
||||
} |
||||
|
||||
public int getMinorVersion() { |
||||
return 5; |
||||
} |
||||
|
||||
public String getMimeType(String filePath) { |
||||
return MimeTypeResolver.getMimeType(filePath); |
||||
} |
||||
|
||||
public Set getResourcePaths(String path) { |
||||
String actualPath = (path.endsWith("/") ? path : path + "/"); |
||||
Resource resource = this.resourceLoader.getResource(getResourceLocation(actualPath)); |
||||
try { |
||||
File file = resource.getFile(); |
||||
String[] fileList = file.list(); |
||||
if (ObjectUtils.isEmpty(fileList)) { |
||||
return null; |
||||
} |
||||
Set resourcePaths = new LinkedHashSet(fileList.length); |
||||
for (int i = 0; i < fileList.length; i++) { |
||||
String resultPath = actualPath + fileList[i]; |
||||
if (resource.createRelative(fileList[i]).getFile().isDirectory()) { |
||||
resultPath += "/"; |
||||
} |
||||
resourcePaths.add(resultPath); |
||||
} |
||||
return resourcePaths; |
||||
} |
||||
catch (IOException ex) { |
||||
logger.warn("Couldn't get resource paths for " + resource, ex); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public URL getResource(String path) throws MalformedURLException { |
||||
Resource resource = this.resourceLoader.getResource(getResourceLocation(path)); |
||||
if (!resource.exists()) { |
||||
return null; |
||||
} |
||||
try { |
||||
return resource.getURL(); |
||||
} |
||||
catch (MalformedURLException ex) { |
||||
throw ex; |
||||
} |
||||
catch (IOException ex) { |
||||
logger.warn("Couldn't get URL for " + resource, ex); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public InputStream getResourceAsStream(String path) { |
||||
Resource resource = this.resourceLoader.getResource(getResourceLocation(path)); |
||||
if (!resource.exists()) { |
||||
return null; |
||||
} |
||||
try { |
||||
return resource.getInputStream(); |
||||
} |
||||
catch (IOException ex) { |
||||
logger.warn("Couldn't open InputStream for " + resource, ex); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public RequestDispatcher getRequestDispatcher(String path) { |
||||
if (!path.startsWith("/")) { |
||||
throw new IllegalArgumentException("RequestDispatcher path at ServletContext level must start with '/'"); |
||||
} |
||||
return new MockRequestDispatcher(path); |
||||
} |
||||
|
||||
public RequestDispatcher getNamedDispatcher(String path) { |
||||
return null; |
||||
} |
||||
|
||||
public Servlet getServlet(String name) { |
||||
return null; |
||||
} |
||||
|
||||
public Enumeration getServlets() { |
||||
return Collections.enumeration(Collections.EMPTY_SET); |
||||
} |
||||
|
||||
public Enumeration getServletNames() { |
||||
return Collections.enumeration(Collections.EMPTY_SET); |
||||
} |
||||
|
||||
public void log(String message) { |
||||
logger.info(message); |
||||
} |
||||
|
||||
public void log(Exception ex, String message) { |
||||
logger.info(message, ex); |
||||
} |
||||
|
||||
public void log(String message, Throwable ex) { |
||||
logger.info(message, ex); |
||||
} |
||||
|
||||
public String getRealPath(String path) { |
||||
Resource resource = this.resourceLoader.getResource(getResourceLocation(path)); |
||||
try { |
||||
return resource.getFile().getAbsolutePath(); |
||||
} |
||||
catch (IOException ex) { |
||||
logger.warn("Couldn't determine real path of resource " + resource, ex); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public String getServerInfo() { |
||||
return "MockServletContext"; |
||||
} |
||||
|
||||
public String getInitParameter(String name) { |
||||
Assert.notNull(name, "Parameter name must not be null"); |
||||
return this.initParameters.getProperty(name); |
||||
} |
||||
|
||||
public void addInitParameter(String name, String value) { |
||||
Assert.notNull(name, "Parameter name must not be null"); |
||||
this.initParameters.setProperty(name, value); |
||||
} |
||||
|
||||
public Enumeration getInitParameterNames() { |
||||
return this.initParameters.keys(); |
||||
} |
||||
|
||||
public Object getAttribute(String name) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
return this.attributes.get(name); |
||||
} |
||||
|
||||
public Enumeration getAttributeNames() { |
||||
return this.attributes.keys(); |
||||
} |
||||
|
||||
public void setAttribute(String name, Object value) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
if (value != null) { |
||||
this.attributes.put(name, value); |
||||
} |
||||
else { |
||||
this.attributes.remove(name); |
||||
} |
||||
} |
||||
|
||||
public void removeAttribute(String name) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
this.attributes.remove(name); |
||||
} |
||||
|
||||
public void setServletContextName(String servletContextName) { |
||||
this.servletContextName = servletContextName; |
||||
} |
||||
|
||||
public String getServletContextName() { |
||||
return this.servletContextName; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Inner factory class used to just introduce a Java Activation Framework |
||||
* dependency when actually asked to resolve a MIME type. |
||||
*/ |
||||
private static class MimeTypeResolver { |
||||
|
||||
public static String getMimeType(String filePath) { |
||||
return FileTypeMap.getDefaultFileTypeMap().getContentType(filePath); |
||||
} |
||||
} |
||||
|
||||
} |
||||
/* |
||||
* 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; |
||||
|
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.net.MalformedURLException; |
||||
import java.net.URL; |
||||
import java.util.Collections; |
||||
import java.util.Enumeration; |
||||
import java.util.HashMap; |
||||
import java.util.HashSet; |
||||
import java.util.LinkedHashMap; |
||||
import java.util.LinkedHashSet; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import javax.activation.FileTypeMap; |
||||
import javax.servlet.RequestDispatcher; |
||||
import javax.servlet.Servlet; |
||||
import javax.servlet.ServletContext; |
||||
|
||||
import org.apache.commons.logging.Log; |
||||
import org.apache.commons.logging.LogFactory; |
||||
|
||||
import org.springframework.core.io.DefaultResourceLoader; |
||||
import org.springframework.core.io.Resource; |
||||
import org.springframework.core.io.ResourceLoader; |
||||
import org.springframework.util.Assert; |
||||
import org.springframework.util.ObjectUtils; |
||||
import org.springframework.web.util.WebUtils; |
||||
|
||||
/** |
||||
* Mock implementation of the {@link javax.servlet.ServletContext} interface. |
||||
* |
||||
* <p>Used for testing the Spring web framework; only rarely necessary for testing |
||||
* application controllers. As long as application components don't explicitly |
||||
* access the ServletContext, ClassPathXmlApplicationContext or |
||||
* FileSystemXmlApplicationContext can be used to load the context files for testing, |
||||
* even for DispatcherServlet context definitions. |
||||
* |
||||
* <p>For setting up a full WebApplicationContext in a test environment, you can |
||||
* use XmlWebApplicationContext (or GenericWebApplicationContext), passing in an |
||||
* appropriate MockServletContext instance. You might want to configure your |
||||
* MockServletContext with a FileSystemResourceLoader in that case, to make your |
||||
* resource paths interpreted as relative file system locations. |
||||
* |
||||
* <p>A common setup is to point your JVM working directory to the root of your |
||||
* web application directory, in combination with filesystem-based resource loading. |
||||
* This allows to load the context files as used in the web application, with |
||||
* relative paths getting interpreted correctly. Such a setup will work with both |
||||
* FileSystemXmlApplicationContext (which will load straight from the file system) |
||||
* and XmlWebApplicationContext with an underlying MockServletContext (as long as |
||||
* the MockServletContext has been configured with a FileSystemResourceLoader). |
||||
* |
||||
* @author Rod Johnson |
||||
* @author Juergen Hoeller |
||||
* @since 1.0.2 |
||||
* @see #MockServletContext(org.springframework.core.io.ResourceLoader) |
||||
* @see org.springframework.web.context.support.XmlWebApplicationContext |
||||
* @see org.springframework.web.context.support.GenericWebApplicationContext |
||||
* @see org.springframework.context.support.ClassPathXmlApplicationContext |
||||
* @see org.springframework.context.support.FileSystemXmlApplicationContext |
||||
*/ |
||||
public class MockServletContext implements ServletContext { |
||||
|
||||
private static final String TEMP_DIR_SYSTEM_PROPERTY = "java.io.tmpdir"; |
||||
|
||||
|
||||
private final Log logger = LogFactory.getLog(getClass()); |
||||
|
||||
private final ResourceLoader resourceLoader; |
||||
|
||||
private final String resourceBasePath; |
||||
|
||||
private String contextPath = ""; |
||||
|
||||
private final Map<String, ServletContext> contexts = new HashMap<String, ServletContext>(); |
||||
|
||||
private final Map<String, String> initParameters = new LinkedHashMap<String, String>(); |
||||
|
||||
private final Map<String, Object> attributes = new LinkedHashMap<String, Object>(); |
||||
|
||||
private String servletContextName = "MockServletContext"; |
||||
|
||||
|
||||
/** |
||||
* Create a new MockServletContext, using no base path and a |
||||
* DefaultResourceLoader (i.e. the classpath root as WAR root). |
||||
* @see org.springframework.core.io.DefaultResourceLoader |
||||
*/ |
||||
public MockServletContext() { |
||||
this("", null); |
||||
} |
||||
|
||||
/** |
||||
* Create a new MockServletContext, using a DefaultResourceLoader. |
||||
* @param resourceBasePath the WAR root directory (should not end with a slash) |
||||
* @see org.springframework.core.io.DefaultResourceLoader |
||||
*/ |
||||
public MockServletContext(String resourceBasePath) { |
||||
this(resourceBasePath, null); |
||||
} |
||||
|
||||
/** |
||||
* Create a new MockServletContext, using the specified ResourceLoader |
||||
* and no base path. |
||||
* @param resourceLoader the ResourceLoader to use (or null for the default) |
||||
*/ |
||||
public MockServletContext(ResourceLoader resourceLoader) { |
||||
this("", resourceLoader); |
||||
} |
||||
|
||||
/** |
||||
* Create a new MockServletContext. |
||||
* @param resourceBasePath the WAR root directory (should not end with a slash) |
||||
* @param resourceLoader the ResourceLoader to use (or null for the default) |
||||
*/ |
||||
public MockServletContext(String resourceBasePath, ResourceLoader resourceLoader) { |
||||
this.resourceLoader = (resourceLoader != null ? resourceLoader : new DefaultResourceLoader()); |
||||
this.resourceBasePath = (resourceBasePath != null ? resourceBasePath : ""); |
||||
|
||||
// Use JVM temp dir as ServletContext temp dir.
|
||||
String tempDir = System.getProperty(TEMP_DIR_SYSTEM_PROPERTY); |
||||
if (tempDir != null) { |
||||
this.attributes.put(WebUtils.TEMP_DIR_CONTEXT_ATTRIBUTE, new File(tempDir)); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Build a full resource location for the given path, |
||||
* prepending the resource base path of this MockServletContext. |
||||
* @param path the path as specified |
||||
* @return the full resource path |
||||
*/ |
||||
protected String getResourceLocation(String path) { |
||||
if (!path.startsWith("/")) { |
||||
path = "/" + path; |
||||
} |
||||
return this.resourceBasePath + path; |
||||
} |
||||
|
||||
|
||||
public void setContextPath(String contextPath) { |
||||
this.contextPath = (contextPath != null ? contextPath : ""); |
||||
} |
||||
|
||||
/* This is a Servlet API 2.5 method. */ |
||||
public String getContextPath() { |
||||
return this.contextPath; |
||||
} |
||||
|
||||
public void registerContext(String contextPath, ServletContext context) { |
||||
this.contexts.put(contextPath, context); |
||||
} |
||||
|
||||
public ServletContext getContext(String contextPath) { |
||||
if (this.contextPath.equals(contextPath)) { |
||||
return this; |
||||
} |
||||
return this.contexts.get(contextPath); |
||||
} |
||||
|
||||
public int getMajorVersion() { |
||||
return 2; |
||||
} |
||||
|
||||
public int getMinorVersion() { |
||||
return 5; |
||||
} |
||||
|
||||
public String getMimeType(String filePath) { |
||||
return MimeTypeResolver.getMimeType(filePath); |
||||
} |
||||
|
||||
public Set<String> getResourcePaths(String path) { |
||||
String actualPath = (path.endsWith("/") ? path : path + "/"); |
||||
Resource resource = this.resourceLoader.getResource(getResourceLocation(actualPath)); |
||||
try { |
||||
File file = resource.getFile(); |
||||
String[] fileList = file.list(); |
||||
if (ObjectUtils.isEmpty(fileList)) { |
||||
return null; |
||||
} |
||||
Set<String> resourcePaths = new LinkedHashSet<String>(fileList.length); |
||||
for (String fileEntry : fileList) { |
||||
String resultPath = actualPath + fileEntry; |
||||
if (resource.createRelative(fileEntry).getFile().isDirectory()) { |
||||
resultPath += "/"; |
||||
} |
||||
resourcePaths.add(resultPath); |
||||
} |
||||
return resourcePaths; |
||||
} |
||||
catch (IOException ex) { |
||||
logger.warn("Couldn't get resource paths for " + resource, ex); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public URL getResource(String path) throws MalformedURLException { |
||||
Resource resource = this.resourceLoader.getResource(getResourceLocation(path)); |
||||
if (!resource.exists()) { |
||||
return null; |
||||
} |
||||
try { |
||||
return resource.getURL(); |
||||
} |
||||
catch (MalformedURLException ex) { |
||||
throw ex; |
||||
} |
||||
catch (IOException ex) { |
||||
logger.warn("Couldn't get URL for " + resource, ex); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public InputStream getResourceAsStream(String path) { |
||||
Resource resource = this.resourceLoader.getResource(getResourceLocation(path)); |
||||
if (!resource.exists()) { |
||||
return null; |
||||
} |
||||
try { |
||||
return resource.getInputStream(); |
||||
} |
||||
catch (IOException ex) { |
||||
logger.warn("Couldn't open InputStream for " + resource, ex); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public RequestDispatcher getRequestDispatcher(String path) { |
||||
if (!path.startsWith("/")) { |
||||
throw new IllegalArgumentException("RequestDispatcher path at ServletContext level must start with '/'"); |
||||
} |
||||
return new MockRequestDispatcher(path); |
||||
} |
||||
|
||||
public RequestDispatcher getNamedDispatcher(String path) { |
||||
return null; |
||||
} |
||||
|
||||
public Servlet getServlet(String name) { |
||||
return null; |
||||
} |
||||
|
||||
public Enumeration<Servlet> getServlets() { |
||||
return Collections.enumeration(new HashSet<Servlet>()); |
||||
} |
||||
|
||||
public Enumeration<String> getServletNames() { |
||||
return Collections.enumeration(new HashSet<String>()); |
||||
} |
||||
|
||||
public void log(String message) { |
||||
logger.info(message); |
||||
} |
||||
|
||||
public void log(Exception ex, String message) { |
||||
logger.info(message, ex); |
||||
} |
||||
|
||||
public void log(String message, Throwable ex) { |
||||
logger.info(message, ex); |
||||
} |
||||
|
||||
public String getRealPath(String path) { |
||||
Resource resource = this.resourceLoader.getResource(getResourceLocation(path)); |
||||
try { |
||||
return resource.getFile().getAbsolutePath(); |
||||
} |
||||
catch (IOException ex) { |
||||
logger.warn("Couldn't determine real path of resource " + resource, ex); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public String getServerInfo() { |
||||
return "MockServletContext"; |
||||
} |
||||
|
||||
public String getInitParameter(String name) { |
||||
Assert.notNull(name, "Parameter name must not be null"); |
||||
return this.initParameters.get(name); |
||||
} |
||||
|
||||
public void addInitParameter(String name, String value) { |
||||
Assert.notNull(name, "Parameter name must not be null"); |
||||
this.initParameters.put(name, value); |
||||
} |
||||
|
||||
public Enumeration<String> getInitParameterNames() { |
||||
return Collections.enumeration(this.initParameters.keySet()); |
||||
} |
||||
|
||||
public Object getAttribute(String name) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
return this.attributes.get(name); |
||||
} |
||||
|
||||
public Enumeration<String> getAttributeNames() { |
||||
return Collections.enumeration(this.attributes.keySet()); |
||||
} |
||||
|
||||
public void setAttribute(String name, Object value) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
if (value != null) { |
||||
this.attributes.put(name, value); |
||||
} |
||||
else { |
||||
this.attributes.remove(name); |
||||
} |
||||
} |
||||
|
||||
public void removeAttribute(String name) { |
||||
Assert.notNull(name, "Attribute name must not be null"); |
||||
this.attributes.remove(name); |
||||
} |
||||
|
||||
public void setServletContextName(String servletContextName) { |
||||
this.servletContextName = servletContextName; |
||||
} |
||||
|
||||
public String getServletContextName() { |
||||
return this.servletContextName; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Inner factory class used to just introduce a Java Activation Framework |
||||
* dependency when actually asked to resolve a MIME type. |
||||
*/ |
||||
private static class MimeTypeResolver { |
||||
|
||||
public static String getMimeType(String filePath) { |
||||
return FileTypeMap.getDefaultFileTypeMap().getContentType(filePath); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
Loading…
Reference in new issue