1
1
/*
2
- * Copyright 2002-2018 the original author or authors.
2
+ * Copyright 2002-2019 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
23
23
import java .util .Map ;
24
24
import java .util .concurrent .ConcurrentHashMap ;
25
25
import java .util .concurrent .ConcurrentMap ;
26
+ import java .util .concurrent .CopyOnWriteArrayList ;
26
27
27
28
import org .springframework .http .MediaType ;
28
29
import org .springframework .lang .Nullable ;
29
- import org .springframework .util .LinkedMultiValueMap ;
30
- import org .springframework .util .MultiValueMap ;
31
30
32
31
/**
33
32
* An implementation of {@code MediaTypeFileExtensionResolver} that maintains
37
36
* Subsequently subclasses can use {@link #addMapping} to add more mappings.
38
37
*
39
38
* @author Rossen Stoyanchev
39
+ * @author Juergen Hoeller
40
40
* @since 3.2
41
41
*/
42
42
public class MappingMediaTypeFileExtensionResolver implements MediaTypeFileExtensionResolver {
43
43
44
44
private final ConcurrentMap <String , MediaType > mediaTypes = new ConcurrentHashMap <>(64 );
45
45
46
- private final MultiValueMap <MediaType , String > fileExtensions = new LinkedMultiValueMap <>();
46
+ private final ConcurrentMap <MediaType , List < String >> fileExtensions = new ConcurrentHashMap <>(64 );
47
47
48
- private final List <String > allFileExtensions = new ArrayList <>();
48
+ private final List <String > allFileExtensions = new CopyOnWriteArrayList <>();
49
49
50
50
51
51
/**
52
52
* Create an instance with the given map of file extensions and media types.
53
53
*/
54
54
public MappingMediaTypeFileExtensionResolver (@ Nullable Map <String , MediaType > mediaTypes ) {
55
55
if (mediaTypes != null ) {
56
+ List <String > allFileExtensions = new ArrayList <>();
56
57
mediaTypes .forEach ((extension , mediaType ) -> {
57
58
String lowerCaseExtension = extension .toLowerCase (Locale .ENGLISH );
58
59
this .mediaTypes .put (lowerCaseExtension , mediaType );
59
- this . fileExtensions . add (mediaType , lowerCaseExtension );
60
- this . allFileExtensions .add (lowerCaseExtension );
60
+ addFileExtension (mediaType , extension );
61
+ allFileExtensions .add (lowerCaseExtension );
61
62
});
63
+ this .allFileExtensions .addAll (allFileExtensions );
62
64
}
63
65
}
64
66
@@ -77,11 +79,17 @@ protected List<MediaType> getAllMediaTypes() {
77
79
protected void addMapping (String extension , MediaType mediaType ) {
78
80
MediaType previous = this .mediaTypes .putIfAbsent (extension , mediaType );
79
81
if (previous == null ) {
80
- this . fileExtensions . add (mediaType , extension );
82
+ addFileExtension (mediaType , extension );
81
83
this .allFileExtensions .add (extension );
82
84
}
83
85
}
84
86
87
+ private void addFileExtension (MediaType mediaType , String extension ) {
88
+ List <String > newList = new CopyOnWriteArrayList <>();
89
+ List <String > oldList = this .fileExtensions .putIfAbsent (mediaType , newList );
90
+ (oldList != null ? oldList : newList ).add (extension );
91
+ }
92
+
85
93
86
94
@ Override
87
95
public List <String > resolveFileExtensions (MediaType mediaType ) {
0 commit comments