Browse Source
Add MimeMappings class to encapsulate mappings between file extensions and mime types. Issue: #51754753pull/9/head
8 changed files with 691 additions and 111 deletions
@ -0,0 +1,376 @@
@@ -0,0 +1,376 @@
|
||||
/* |
||||
* Copyright 2012-2013 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.bootstrap.context.embedded; |
||||
|
||||
import java.util.Collection; |
||||
import java.util.Collections; |
||||
import java.util.Iterator; |
||||
import java.util.LinkedHashMap; |
||||
import java.util.Map; |
||||
|
||||
import org.springframework.bootstrap.context.embedded.MimeMappings.Mapping; |
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* Simple container-independent abstraction for servlet mime mappings. Roughly equivalent |
||||
* to the {@literal <mime-mapping>} element traditionally found in web.xml. |
||||
* |
||||
* @author Phillip Webb |
||||
*/ |
||||
public final class MimeMappings implements Iterable<Mapping> { |
||||
|
||||
/** |
||||
* Default mime mapping commonly used. |
||||
*/ |
||||
public static final MimeMappings DEFAULT; |
||||
static { |
||||
MimeMappings mappings = new MimeMappings(); |
||||
mappings.add("abs", "audio/x-mpeg"); |
||||
mappings.add("ai", "application/postscript"); |
||||
mappings.add("aif", "audio/x-aiff"); |
||||
mappings.add("aifc", "audio/x-aiff"); |
||||
mappings.add("aiff", "audio/x-aiff"); |
||||
mappings.add("aim", "application/x-aim"); |
||||
mappings.add("art", "image/x-jg"); |
||||
mappings.add("asf", "video/x-ms-asf"); |
||||
mappings.add("asx", "video/x-ms-asf"); |
||||
mappings.add("au", "audio/basic"); |
||||
mappings.add("avi", "video/x-msvideo"); |
||||
mappings.add("avx", "video/x-rad-screenplay"); |
||||
mappings.add("bcpio", "application/x-bcpio"); |
||||
mappings.add("bin", "application/octet-stream"); |
||||
mappings.add("bmp", "image/bmp"); |
||||
mappings.add("body", "text/html"); |
||||
mappings.add("cdf", "application/x-cdf"); |
||||
mappings.add("cer", "application/pkix-cert"); |
||||
mappings.add("class", "application/java"); |
||||
mappings.add("cpio", "application/x-cpio"); |
||||
mappings.add("csh", "application/x-csh"); |
||||
mappings.add("css", "text/css"); |
||||
mappings.add("dib", "image/bmp"); |
||||
mappings.add("doc", "application/msword"); |
||||
mappings.add("dtd", "application/xml-dtd"); |
||||
mappings.add("dv", "video/x-dv"); |
||||
mappings.add("dvi", "application/x-dvi"); |
||||
mappings.add("eps", "application/postscript"); |
||||
mappings.add("etx", "text/x-setext"); |
||||
mappings.add("exe", "application/octet-stream"); |
||||
mappings.add("gif", "image/gif"); |
||||
mappings.add("gtar", "application/x-gtar"); |
||||
mappings.add("gz", "application/x-gzip"); |
||||
mappings.add("hdf", "application/x-hdf"); |
||||
mappings.add("hqx", "application/mac-binhex40"); |
||||
mappings.add("htc", "text/x-component"); |
||||
mappings.add("htm", "text/html"); |
||||
mappings.add("html", "text/html"); |
||||
mappings.add("ief", "image/ief"); |
||||
mappings.add("jad", "text/vnd.sun.j2me.app-descriptor"); |
||||
mappings.add("jar", "application/java-archive"); |
||||
mappings.add("java", "text/x-java-source"); |
||||
mappings.add("jnlp", "application/x-java-jnlp-file"); |
||||
mappings.add("jpe", "image/jpeg"); |
||||
mappings.add("jpeg", "image/jpeg"); |
||||
mappings.add("jpg", "image/jpeg"); |
||||
mappings.add("js", "application/javascript"); |
||||
mappings.add("jsf", "text/plain"); |
||||
mappings.add("jspf", "text/plain"); |
||||
mappings.add("kar", "audio/midi"); |
||||
mappings.add("latex", "application/x-latex"); |
||||
mappings.add("m3u", "audio/x-mpegurl"); |
||||
mappings.add("mac", "image/x-macpaint"); |
||||
mappings.add("man", "text/troff"); |
||||
mappings.add("mathml", "application/mathml+xml"); |
||||
mappings.add("me", "text/troff"); |
||||
mappings.add("mid", "audio/midi"); |
||||
mappings.add("midi", "audio/midi"); |
||||
mappings.add("mif", "application/x-mif"); |
||||
mappings.add("mov", "video/quicktime"); |
||||
mappings.add("movie", "video/x-sgi-movie"); |
||||
mappings.add("mp1", "audio/mpeg"); |
||||
mappings.add("mp2", "audio/mpeg"); |
||||
mappings.add("mp3", "audio/mpeg"); |
||||
mappings.add("mp4", "video/mp4"); |
||||
mappings.add("mpa", "audio/mpeg"); |
||||
mappings.add("mpe", "video/mpeg"); |
||||
mappings.add("mpeg", "video/mpeg"); |
||||
mappings.add("mpega", "audio/x-mpeg"); |
||||
mappings.add("mpg", "video/mpeg"); |
||||
mappings.add("mpv2", "video/mpeg2"); |
||||
mappings.add("nc", "application/x-netcdf"); |
||||
mappings.add("oda", "application/oda"); |
||||
mappings.add("odb", "application/vnd.oasis.opendocument.database"); |
||||
mappings.add("odc", "application/vnd.oasis.opendocument.chart"); |
||||
mappings.add("odf", "application/vnd.oasis.opendocument.formula"); |
||||
mappings.add("odg", "application/vnd.oasis.opendocument.graphics"); |
||||
mappings.add("odi", "application/vnd.oasis.opendocument.image"); |
||||
mappings.add("odm", "application/vnd.oasis.opendocument.text-master"); |
||||
mappings.add("odp", "application/vnd.oasis.opendocument.presentation"); |
||||
mappings.add("ods", "application/vnd.oasis.opendocument.spreadsheet"); |
||||
mappings.add("odt", "application/vnd.oasis.opendocument.text"); |
||||
mappings.add("otg", "application/vnd.oasis.opendocument.graphics-template"); |
||||
mappings.add("oth", "application/vnd.oasis.opendocument.text-web"); |
||||
mappings.add("otp", "application/vnd.oasis.opendocument.presentation-template"); |
||||
mappings.add("ots", "application/vnd.oasis.opendocument.spreadsheet-template "); |
||||
mappings.add("ott", "application/vnd.oasis.opendocument.text-template"); |
||||
mappings.add("ogx", "application/ogg"); |
||||
mappings.add("ogv", "video/ogg"); |
||||
mappings.add("oga", "audio/ogg"); |
||||
mappings.add("ogg", "audio/ogg"); |
||||
mappings.add("spx", "audio/ogg"); |
||||
mappings.add("flac", "audio/flac"); |
||||
mappings.add("anx", "application/annodex"); |
||||
mappings.add("axa", "audio/annodex"); |
||||
mappings.add("axv", "video/annodex"); |
||||
mappings.add("xspf", "application/xspf+xml"); |
||||
mappings.add("pbm", "image/x-portable-bitmap"); |
||||
mappings.add("pct", "image/pict"); |
||||
mappings.add("pdf", "application/pdf"); |
||||
mappings.add("pgm", "image/x-portable-graymap"); |
||||
mappings.add("pic", "image/pict"); |
||||
mappings.add("pict", "image/pict"); |
||||
mappings.add("pls", "audio/x-scpls"); |
||||
mappings.add("png", "image/png"); |
||||
mappings.add("pnm", "image/x-portable-anymap"); |
||||
mappings.add("pnt", "image/x-macpaint"); |
||||
mappings.add("ppm", "image/x-portable-pixmap"); |
||||
mappings.add("ppt", "application/vnd.ms-powerpoint"); |
||||
mappings.add("pps", "application/vnd.ms-powerpoint"); |
||||
mappings.add("ps", "application/postscript"); |
||||
mappings.add("psd", "image/vnd.adobe.photoshop"); |
||||
mappings.add("qt", "video/quicktime"); |
||||
mappings.add("qti", "image/x-quicktime"); |
||||
mappings.add("qtif", "image/x-quicktime"); |
||||
mappings.add("ras", "image/x-cmu-raster"); |
||||
mappings.add("rdf", "application/rdf+xml"); |
||||
mappings.add("rgb", "image/x-rgb"); |
||||
mappings.add("rm", "application/vnd.rn-realmedia"); |
||||
mappings.add("roff", "text/troff"); |
||||
mappings.add("rtf", "application/rtf"); |
||||
mappings.add("rtx", "text/richtext"); |
||||
mappings.add("sh", "application/x-sh"); |
||||
mappings.add("shar", "application/x-shar"); |
||||
mappings.add("sit", "application/x-stuffit"); |
||||
mappings.add("snd", "audio/basic"); |
||||
mappings.add("src", "application/x-wais-source"); |
||||
mappings.add("sv4cpio", "application/x-sv4cpio"); |
||||
mappings.add("sv4crc", "application/x-sv4crc"); |
||||
mappings.add("svg", "image/svg+xml"); |
||||
mappings.add("svgz", "image/svg+xml"); |
||||
mappings.add("swf", "application/x-shockwave-flash"); |
||||
mappings.add("t", "text/troff"); |
||||
mappings.add("tar", "application/x-tar"); |
||||
mappings.add("tcl", "application/x-tcl"); |
||||
mappings.add("tex", "application/x-tex"); |
||||
mappings.add("texi", "application/x-texinfo"); |
||||
mappings.add("texinfo", "application/x-texinfo"); |
||||
mappings.add("tif", "image/tiff"); |
||||
mappings.add("tiff", "image/tiff"); |
||||
mappings.add("tr", "text/troff"); |
||||
mappings.add("tsv", "text/tab-separated-values"); |
||||
mappings.add("txt", "text/plain"); |
||||
mappings.add("ulw", "audio/basic"); |
||||
mappings.add("ustar", "application/x-ustar"); |
||||
mappings.add("vxml", "application/voicexml+xml"); |
||||
mappings.add("xbm", "image/x-xbitmap"); |
||||
mappings.add("xht", "application/xhtml+xml"); |
||||
mappings.add("xhtml", "application/xhtml+xml"); |
||||
mappings.add("xls", "application/vnd.ms-excel"); |
||||
mappings.add("xml", "application/xml"); |
||||
mappings.add("xpm", "image/x-xpixmap"); |
||||
mappings.add("xsl", "application/xml"); |
||||
mappings.add("xslt", "application/xslt+xml"); |
||||
mappings.add("xul", "application/vnd.mozilla.xul+xml"); |
||||
mappings.add("xwd", "image/x-xwindowdump"); |
||||
mappings.add("vsd", "application/vnd.visio"); |
||||
mappings.add("wav", "audio/x-wav"); |
||||
mappings.add("wbmp", "image/vnd.wap.wbmp"); |
||||
mappings.add("wml", "text/vnd.wap.wml"); |
||||
mappings.add("wmlc", "application/vnd.wap.wmlc"); |
||||
mappings.add("wmls", "text/vnd.wap.wmlsc"); |
||||
mappings.add("wmlscriptc", "application/vnd.wap.wmlscriptc"); |
||||
mappings.add("wmv", "video/x-ms-wmv"); |
||||
mappings.add("wrl", "model/vrml"); |
||||
mappings.add("wspolicy", "application/wspolicy+xml"); |
||||
mappings.add("Z", "application/x-compress"); |
||||
mappings.add("z", "application/x-compress"); |
||||
mappings.add("zip", "application/zip"); |
||||
DEFAULT = unmodifiableMappings(mappings); |
||||
} |
||||
|
||||
private final Map<String, Mapping> map; |
||||
|
||||
/** |
||||
* Create a new empty {@link MimeMappings} instance. |
||||
*/ |
||||
public MimeMappings() { |
||||
this.map = new LinkedHashMap<String, MimeMappings.Mapping>(); |
||||
} |
||||
|
||||
/** |
||||
* Create a new {@link MimeMappings} instance from the specified mappings. |
||||
* @param mappings the source mappings |
||||
*/ |
||||
public MimeMappings(MimeMappings mappings) { |
||||
this(mappings, true); |
||||
} |
||||
|
||||
/** |
||||
* Create a new {@link MimeMappings} from the specified mappings. |
||||
* @param mappings the source mappings with extension as the key and mime-type as the |
||||
* value |
||||
*/ |
||||
public MimeMappings(Map<String, String> mappings) { |
||||
Assert.notNull(mappings, "Mappings must not be null"); |
||||
this.map = new LinkedHashMap<String, MimeMappings.Mapping>(); |
||||
for (Map.Entry<String, String> entry : mappings.entrySet()) { |
||||
add(entry.getKey(), entry.getValue()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Internal constructor. |
||||
* @param mappings source mappings |
||||
* @param mutable if the new object should be mutable. |
||||
*/ |
||||
private MimeMappings(MimeMappings mappings, boolean mutable) { |
||||
Assert.notNull(mappings, "Mappings must not be null"); |
||||
this.map = (mutable ? new LinkedHashMap<String, MimeMappings.Mapping>( |
||||
mappings.map) : Collections.unmodifiableMap(mappings.map)); |
||||
} |
||||
|
||||
@Override |
||||
public Iterator<Mapping> iterator() { |
||||
return getAll().iterator(); |
||||
} |
||||
|
||||
/** |
||||
* Returns all defined mappings. |
||||
* @return the mappings. |
||||
*/ |
||||
public Collection<Mapping> getAll() { |
||||
return this.map.values(); |
||||
} |
||||
|
||||
/** |
||||
* Add a new mime mapping. |
||||
* @param extension the file extension (excluding '.') |
||||
* @param mimeType the mime type to map |
||||
* @return any previous mapping or {@code null} |
||||
*/ |
||||
public String add(String extension, String mimeType) { |
||||
Mapping previous = this.map.put(extension, new Mapping(extension, mimeType)); |
||||
return (previous == null ? null : previous.getMimeType()); |
||||
} |
||||
|
||||
/** |
||||
* Get a mime mapping for the given extension. |
||||
* @param extension the file extension (excluding '.') |
||||
* @return a mime mapping or {@code null} |
||||
*/ |
||||
public String get(String extension) { |
||||
Mapping mapping = this.map.get(extension); |
||||
return (mapping == null ? null : mapping.getMimeType()); |
||||
} |
||||
|
||||
/** |
||||
* Remove an existing mapping. |
||||
* @param extension the file extension (excluding '.') |
||||
* @return the removed mime mapping or {@code null} if no item was removed |
||||
*/ |
||||
public String remove(String extension) { |
||||
Mapping previous = this.map.remove(extension); |
||||
return (previous == null ? null : previous.getMimeType()); |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object obj) { |
||||
if (obj == null) { |
||||
return false; |
||||
} |
||||
if (obj == this) { |
||||
return true; |
||||
} |
||||
if (obj instanceof MimeMappings) { |
||||
MimeMappings other = (MimeMappings) obj; |
||||
return this.map.equals(other.map); |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
return this.map.hashCode(); |
||||
} |
||||
|
||||
/** |
||||
* Create a new unmodifiable view of the specified mapping. Methods that attempt to |
||||
* modify the returned map will throw {@link UnsupportedOperationException}s. |
||||
* @param mappings the mappings |
||||
* @return an unmodifiable view of the specified mappings. |
||||
*/ |
||||
public static MimeMappings unmodifiableMappings(MimeMappings mappings) { |
||||
return new MimeMappings(mappings, false); |
||||
} |
||||
|
||||
/** |
||||
* A single mime mapping. |
||||
*/ |
||||
public static final class Mapping { |
||||
|
||||
private final String extension; |
||||
|
||||
private final String mimeType; |
||||
|
||||
public Mapping(String extension, String mimeType) { |
||||
Assert.notNull(extension, "Extension must not be null"); |
||||
Assert.notNull(mimeType, "MimeType must not be null"); |
||||
this.extension = extension; |
||||
this.mimeType = mimeType; |
||||
} |
||||
|
||||
public String getExtension() { |
||||
return this.extension; |
||||
} |
||||
|
||||
public String getMimeType() { |
||||
return this.mimeType; |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object obj) { |
||||
if (obj == null) { |
||||
return false; |
||||
} |
||||
if (obj == this) { |
||||
return true; |
||||
} |
||||
if (obj instanceof Mapping) { |
||||
Mapping other = (Mapping) obj; |
||||
return this.extension.equals(other.extension) |
||||
&& this.mimeType.equals(other.mimeType); |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
return this.extension.hashCode(); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,175 @@
@@ -0,0 +1,175 @@
|
||||
/* |
||||
* Copyright 2012-2013 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.bootstrap.context.embedded; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import org.apache.catalina.Context; |
||||
import org.apache.catalina.Wrapper; |
||||
import org.apache.catalina.startup.Tomcat; |
||||
import org.junit.Rule; |
||||
import org.junit.Test; |
||||
import org.junit.rules.ExpectedException; |
||||
import org.mockito.invocation.InvocationOnMock; |
||||
import org.mockito.stubbing.Answer; |
||||
|
||||
import static org.hamcrest.Matchers.equalTo; |
||||
import static org.hamcrest.Matchers.nullValue; |
||||
import static org.junit.Assert.assertThat; |
||||
import static org.mockito.BDDMockito.given; |
||||
import static org.mockito.BDDMockito.willAnswer; |
||||
import static org.mockito.Matchers.anyString; |
||||
import static org.mockito.Mockito.mock; |
||||
|
||||
/** |
||||
* Tests for {@link MimeMappings}. |
||||
* |
||||
* @author Phillip Webb |
||||
*/ |
||||
public class MimeMappingsTests { |
||||
|
||||
@Rule |
||||
public ExpectedException thrown = ExpectedException.none(); |
||||
|
||||
@Test |
||||
public void defaults() throws Exception { |
||||
assertThat(MimeMappings.DEFAULT, equalTo(getTomatDefaults())); |
||||
} |
||||
|
||||
@Test(expected = UnsupportedOperationException.class) |
||||
public void defaultsCannotBeModified() throws Exception { |
||||
MimeMappings.DEFAULT.add("foo", "foo/bar"); |
||||
} |
||||
|
||||
@Test |
||||
public void createFromExisting() throws Exception { |
||||
MimeMappings mappings = new MimeMappings(); |
||||
mappings.add("foo", "bar"); |
||||
MimeMappings clone = new MimeMappings(mappings); |
||||
mappings.add("baz", "bar"); |
||||
assertThat(clone.get("foo"), equalTo("bar")); |
||||
assertThat(clone.get("baz"), nullValue()); |
||||
} |
||||
|
||||
@Test |
||||
public void createFromMap() throws Exception { |
||||
Map<String, String> mappings = new HashMap<String, String>(); |
||||
mappings.put("foo", "bar"); |
||||
MimeMappings clone = new MimeMappings(mappings); |
||||
mappings.put("baz", "bar"); |
||||
assertThat(clone.get("foo"), equalTo("bar")); |
||||
assertThat(clone.get("baz"), nullValue()); |
||||
} |
||||
|
||||
@Test |
||||
public void iterate() throws Exception { |
||||
MimeMappings mappings = new MimeMappings(); |
||||
mappings.add("foo", "bar"); |
||||
mappings.add("baz", "boo"); |
||||
List<MimeMappings.Mapping> mappingList = new ArrayList<MimeMappings.Mapping>(); |
||||
for (MimeMappings.Mapping mapping : mappings) { |
||||
mappingList.add(mapping); |
||||
} |
||||
assertThat(mappingList.get(0).getExtension(), equalTo("foo")); |
||||
assertThat(mappingList.get(0).getMimeType(), equalTo("bar")); |
||||
assertThat(mappingList.get(1).getExtension(), equalTo("baz")); |
||||
assertThat(mappingList.get(1).getMimeType(), equalTo("boo")); |
||||
} |
||||
|
||||
@Test |
||||
public void getAll() throws Exception { |
||||
MimeMappings mappings = new MimeMappings(); |
||||
mappings.add("foo", "bar"); |
||||
mappings.add("baz", "boo"); |
||||
List<MimeMappings.Mapping> mappingList = new ArrayList<MimeMappings.Mapping>(); |
||||
mappingList.addAll(mappings.getAll()); |
||||
assertThat(mappingList.get(0).getExtension(), equalTo("foo")); |
||||
assertThat(mappingList.get(0).getMimeType(), equalTo("bar")); |
||||
assertThat(mappingList.get(1).getExtension(), equalTo("baz")); |
||||
assertThat(mappingList.get(1).getMimeType(), equalTo("boo")); |
||||
} |
||||
|
||||
@Test |
||||
public void addNew() throws Exception { |
||||
MimeMappings mappings = new MimeMappings(); |
||||
assertThat(mappings.add("foo", "bar"), nullValue()); |
||||
} |
||||
|
||||
@Test |
||||
public void addReplacesExisting() throws Exception { |
||||
MimeMappings mappings = new MimeMappings(); |
||||
mappings.add("foo", "bar"); |
||||
assertThat(mappings.add("foo", "baz"), equalTo("bar")); |
||||
} |
||||
|
||||
@Test |
||||
public void remove() throws Exception { |
||||
MimeMappings mappings = new MimeMappings(); |
||||
mappings.add("foo", "bar"); |
||||
assertThat(mappings.remove("foo"), equalTo("bar")); |
||||
assertThat(mappings.remove("foo"), nullValue()); |
||||
} |
||||
|
||||
@Test |
||||
public void get() throws Exception { |
||||
MimeMappings mappings = new MimeMappings(); |
||||
mappings.add("foo", "bar"); |
||||
assertThat(mappings.get("foo"), equalTo("bar")); |
||||
} |
||||
|
||||
@Test |
||||
public void getMissing() throws Exception { |
||||
MimeMappings mappings = new MimeMappings(); |
||||
assertThat(mappings.get("foo"), nullValue()); |
||||
} |
||||
|
||||
@Test |
||||
public void makeUnmodifiable() throws Exception { |
||||
MimeMappings mappings = new MimeMappings(); |
||||
mappings.add("foo", "bar"); |
||||
MimeMappings unmodifiable = MimeMappings.unmodifiableMappings(mappings); |
||||
try { |
||||
unmodifiable.remove("foo"); |
||||
} |
||||
catch (UnsupportedOperationException ex) { |
||||
// Expected
|
||||
} |
||||
mappings.remove("foo"); |
||||
assertThat(unmodifiable.get("foo"), nullValue()); |
||||
} |
||||
|
||||
private MimeMappings getTomatDefaults() { |
||||
final MimeMappings mappings = new MimeMappings(); |
||||
Context ctx = mock(Context.class); |
||||
Wrapper wrapper = mock(Wrapper.class); |
||||
given(ctx.createWrapper()).willReturn(wrapper); |
||||
willAnswer(new Answer<Object>() { |
||||
@Override |
||||
public Object answer(InvocationOnMock invocation) throws Throwable { |
||||
Object[] args = invocation.getArguments(); |
||||
mappings.add((String) args[0], (String) args[1]); |
||||
return null; |
||||
} |
||||
}).given(ctx).addMimeMapping(anyString(), anyString()); |
||||
Tomcat.initWebappDefaults(ctx); |
||||
return mappings; |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue