1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.dam.app;
35
36 import info.magnolia.dam.app.ui.field.configuration.EditAssetAppConfiguration;
37
38 import java.util.ArrayList;
39 import java.util.List;
40
41 import org.apache.commons.lang3.StringUtils;
42
43 import com.google.common.net.MediaType;
44
45
46
47
48 public class DamAppConfiguration {
49
50 private List<EditAssetAppConfiguration> editAssetAppConfigurations = new ArrayList<EditAssetAppConfiguration>();
51
52 public List<EditAssetAppConfiguration> getEditAssetAppConfigurations() {
53 return editAssetAppConfigurations;
54 }
55
56 public void setEditAssetAppConfigurations(List<EditAssetAppConfiguration> editAssetAppConfigurations) {
57 this.editAssetAppConfigurations = editAssetAppConfigurations;
58 }
59
60 public void addEditAssetAppConfiguration(EditAssetAppConfiguration editAssetAppConfiguration) {
61 this.editAssetAppConfigurations.add(editAssetAppConfiguration);
62 }
63
64
65
66
67
68 public EditAssetAppConfiguration getEditAssetAppConfigurationForMediaType(MediaType mediaType) {
69
70 if (mediaType == null) {
71 throw new IllegalArgumentException("Requested mediaType must not be null");
72 }
73
74 EditAssetAppConfiguration resolvedConfiguration = null;
75 MediaType bestCandidate = MediaType.ANY_TYPE;
76 for (EditAssetAppConfiguration configuration : editAssetAppConfigurations) {
77 for (MediaType configuredMediaType : configuration.getSupportedMediaTypes()) {
78 if (mediaType.is(configuredMediaType)) {
79 bestCandidate = getBestMatchingCandidate(bestCandidate, configuredMediaType, mediaType);
80 if (bestCandidate == configuredMediaType) {
81 resolvedConfiguration = configuration;
82 }
83 }
84 }
85 }
86 if(resolvedConfiguration == null) {
87 throw new IllegalArgumentException("Configuration do not define an EditAssetAppConfiguration for the following mediaType " + mediaType.toString());
88 }
89 return resolvedConfiguration;
90 }
91
92
93
94
95 MediaType getBestMatchingCandidate(MediaType candidate1, MediaType candidate2, MediaType reference) {
96 if(reference.equals(candidate1)) {
97 return candidate1;
98 }
99 if(reference.equals(candidate2)) {
100 return candidate2;
101 }
102
103 if (voteOnMediaType(candidate1, reference) >= voteOnMediaType(candidate2, reference)) {
104 return candidate1;
105 }
106 return candidate2;
107 }
108
109 int voteOnMediaType(MediaType candidate, MediaType reference) {
110 int res = 0;
111 if (!reference.parameters().isEmpty() && candidate.parameters().entries().containsAll(reference.parameters().entries())) {
112 res += 1;
113 }
114 if (StringUtils.equals(reference.type(), candidate.type())) {
115 res += 2;
116 }
117 if (StringUtils.equals(reference.subtype(), candidate.subtype())) {
118 res += 3;
119 }
120 return res;
121 }
122 }