Skip to content

Commit cff5393

Browse files
committed
2.2.1
2 parents e98d55e + a3407c8 commit cff5393

File tree

45 files changed

+700
-330
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+700
-330
lines changed

dxa-dd4t-ms-provider/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>dxa-parent</artifactId>
77
<groupId>com.sdl.dxa</groupId>
8-
<version>2.2.1-SNAPSHOT</version>
8+
<version>2.2.1</version>
99
<relativePath>../pom.xml</relativePath>
1010
</parent>
1111
<modelVersion>4.0.0</modelVersion>

dxa-framework/dxa-common-api/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>com.sdl.dxa</groupId>
88
<artifactId>dxa-framework</artifactId>
9-
<version>2.2.1-SNAPSHOT</version>
9+
<version>2.2.1</version>
1010
</parent>
1111

1212
<artifactId>dxa-common-api</artifactId>

dxa-framework/dxa-common-api/src/main/java/com/sdl/dxa/DxaSpringInitialization.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ public View resolveViewName(String viewName, Locale locale) throws Exception {
9191
}
9292

9393
@Bean
94+
@Profile("!dxa.docs.enabled")
9495
public ViewResolver overrideDeviceContextualViewResolver() {
9596
UrlBasedViewResolver viewResolver = new ContextualDeviceUrlBasedViewResolver();
9697
viewResolver.setViewClass(OptionalJstlView.class);
@@ -101,6 +102,7 @@ public ViewResolver overrideDeviceContextualViewResolver() {
101102
}
102103

103104
@Bean
105+
@Profile("!dxa.docs.enabled")
104106
public ViewResolver deviceContextualViewResolver() {
105107
UrlBasedViewResolver viewResolver = new ContextualDeviceUrlBasedViewResolver();
106108
viewResolver.setViewClass(OptionalJstlView.class);

dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/api/model/entity/SitemapItem.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fasterxml.jackson.annotation.JsonInclude;
55
import com.fasterxml.jackson.annotation.JsonProperty;
66
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
7+
import com.google.common.base.MoreObjects;
78
import com.sdl.webapp.common.api.content.LinkResolver;
89
import com.sdl.webapp.common.api.localization.Localization;
910
import lombok.*;
@@ -13,18 +14,14 @@
1314
import org.jetbrains.annotations.Nullable;
1415
import org.joda.time.DateTime;
1516

16-
import java.util.Collection;
17-
import java.util.Collections;
18-
import java.util.LinkedHashSet;
19-
import java.util.Set;
17+
import java.util.*;
2018

2119
import static org.apache.commons.lang3.StringUtils.isEmpty;
2220

2321
/**
2422
* @dxa.publicApi
2523
*/
2624
@Data
27-
@ToString(exclude = {"parent"})
2825
@EqualsAndHashCode(callSuper = true, of = {"title", "originalTitle", "type", "publishedDate"})
2926
@Slf4j
3027
@NoArgsConstructor
@@ -42,7 +39,7 @@ public class SitemapItem extends AbstractEntityModel {
4239

4340
@JsonProperty("Items")
4441
@JsonDeserialize(as = LinkedHashSet.class)
45-
private Set<SitemapItem> items;
42+
private LinkedHashSet<SitemapItem> items;
4643

4744
@JsonProperty("PublishedDate")
4845
private DateTime publishedDate;
@@ -98,8 +95,12 @@ public Set<SitemapItem> getItems() {
9895
*
9996
* @param items items to set
10097
*/
101-
public void setItems(@Nullable Set<SitemapItem> items) {
102-
this.items = wrapItems(items);
98+
public void setItems(@Nullable Collection<SitemapItem> items) {
99+
if (LinkedHashSet.class.isAssignableFrom(items.getClass())){
100+
this.items = (LinkedHashSet) items;
101+
} else {
102+
this.items = new LinkedHashSet<>(items);
103+
}
103104
rebuildParentRelationships();
104105
}
105106

@@ -130,7 +131,7 @@ public boolean removeItem(SitemapItem item) {
130131
}
131132

132133
@Contract("null -> !null; !null -> !null")
133-
protected Set<SitemapItem> wrapItems(@Nullable Set<SitemapItem> items) {
134+
protected LinkedHashSet<SitemapItem> wrapItems(@Nullable LinkedHashSet<SitemapItem> items) {
134135
return items == null ? new LinkedHashSet<>() : items;
135136
}
136137

@@ -182,4 +183,18 @@ public SitemapItem getParent() {
182183
}
183184
return parent;
184185
}
186+
187+
@Override
188+
public String toString() {
189+
return MoreObjects.toStringHelper(this).omitNullValues()
190+
.add("id", getId())
191+
.add("title", title)
192+
.add("url", url)
193+
.add("type", type)
194+
.add("items", items)
195+
.add("publishedDate", publishedDate)
196+
.add("visible", visible)
197+
.add("originalTitle", originalTitle)
198+
.toString();
199+
}
185200
}

dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/api/model/entity/TaxonomyNode.java

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,15 @@
22

33
import com.fasterxml.jackson.annotation.JsonInclude;
44
import com.fasterxml.jackson.annotation.JsonProperty;
5-
import com.google.common.collect.ComparisonChain;
65
import com.sdl.webapp.common.api.content.LinkResolver;
76
import com.sdl.webapp.common.api.localization.Localization;
7+
import com.sdl.webapp.common.api.model.sorting.SortableSiteMap;
88
import lombok.Data;
99
import lombok.EqualsAndHashCode;
1010
import org.jetbrains.annotations.Contract;
1111
import org.jetbrains.annotations.Nullable;
12-
import org.springframework.util.comparator.NullSafeComparator;
1312

14-
import java.util.Comparator;
15-
import java.util.Set;
16-
import java.util.TreeSet;
13+
import java.util.LinkedHashSet;
1714

1815
/**
1916
* Represents a special kind of {@link SitemapItem} which is used for Taxonomy Nodes.
@@ -24,11 +21,6 @@
2421
@EqualsAndHashCode(callSuper = true)
2522
public class TaxonomyNode extends SitemapItem {
2623

27-
private static final Comparator<SitemapItem> SITEMAP_SORT_BY_TITLE_AND_ID = new NullSafeComparator<>((o1, o2) -> ComparisonChain.start()
28-
.compare(o1.getOriginalTitle(), o2.getOriginalTitle())
29-
.compare(o1.getId(), o2.getId())
30-
.result(), true);
31-
3224
@JsonProperty("Key")
3325
private String key;
3426

@@ -45,12 +37,8 @@ public class TaxonomyNode extends SitemapItem {
4537
private int classifiedItemsCount;
4638

4739
@Override
48-
protected Set<SitemapItem> wrapItems(@Nullable Set<SitemapItem> items) {
49-
TreeSet<SitemapItem> treeSet = new TreeSet<>(SITEMAP_SORT_BY_TITLE_AND_ID);
50-
if (items != null) {
51-
treeSet.addAll(items);
52-
}
53-
return treeSet;
40+
protected LinkedHashSet<SitemapItem> wrapItems(@Nullable LinkedHashSet<SitemapItem> items) {
41+
return new LinkedHashSet<>(SortableSiteMap.sortItem(items, SortableSiteMap.SORT_BY_TITLE_AND_ID));
5442
}
5543

5644
@Override

dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/api/model/page/DefaultPageModel.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
@JsonInclude(JsonInclude.Include.NON_NULL)
3737
@JsonPropertyOrder({ "id", "name", "title", "url", "meta", "regions" })
3838
@NoArgsConstructor
39+
@lombok.ToString
3940
public class DefaultPageModel extends AbstractViewModel implements PageModel {
4041

4142
private static final String XPM_PAGE_SETTINGS_MARKUP = "<!-- Page Settings: {\"PageID\":\"%s\",\"PageModified\":\"%s\",\"PageTemplateID\":\"%s\",\"PageTemplateModified\":\"%s\"} -->";
@@ -108,7 +109,7 @@ public void filterConditionalEntities(Collection<ConditionalEntityEvaluator> eva
108109
try {
109110
regionModel.filterConditionalEntities(evaluators);
110111
} catch (ContentProviderException ex) {
111-
exception.set(ex);
112+
if (exception.get() == null) exception.set(ex);
112113
}
113114
});
114115
if (exception.get() != null) throw exception.get();

dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/api/model/region/RegionModelImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,15 @@ public void filterConditionalEntities(Collection<ConditionalEntityEvaluator> eva
205205
try {
206206
regionModel.filterConditionalEntities(evaluators);
207207
} catch (ContentProviderException ex) {
208-
exception.set(ex);
208+
if (exception.get() == null) exception.set(ex);
209209
}
210210
});
211211
if (exception.get() != null) throw exception.get();
212212
entities.removeIf(entityModel -> !evaluators.stream().allMatch(evaluator -> {
213213
try {
214214
return evaluator.includeEntity(entityModel);
215215
} catch (ContentProviderException ex) {
216-
exception.set(ex);
216+
if (exception.get() == null) exception.set(ex);
217217
return true;
218218
}
219219
}));
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package com.sdl.webapp.common.api.model.sorting;
2+
3+
import com.google.common.collect.ComparisonChain;
4+
import com.sdl.dxa.api.datamodel.model.SitemapItemModelData;
5+
import com.sdl.webapp.common.api.model.entity.SitemapItem;
6+
import org.apache.commons.lang3.StringUtils;
7+
import org.springframework.util.comparator.NullSafeComparator;
8+
9+
import java.util.Collection;
10+
import java.util.Collections;
11+
import java.util.Comparator;
12+
import java.util.regex.Matcher;
13+
import java.util.regex.Pattern;
14+
import java.util.stream.Collectors;
15+
16+
/**
17+
* A private class that contains the results of the regex so they only have to be done once for a whole sorting.
18+
*/
19+
public class SortableSiteMap {
20+
private static final Pattern TAXONOMY_ID_PATTERN = Pattern.compile("^(\\w?)(\\d+)-(\\w?)(\\d+)$");
21+
22+
public static final Comparator<SortableSiteMap> SORT_BY_TITLE_AND_ID = new NullSafeComparator<>(new Comparator<SortableSiteMap>() {
23+
@Override
24+
public int compare(SortableSiteMap o1, SortableSiteMap o2) {
25+
return ComparisonChain.start()
26+
.compareTrueFirst(o1 != null, o2 != null)
27+
.compare(o1.getOriginalTitle(), o2.getOriginalTitle())
28+
.compare(o1.getId(), o2.getId())
29+
.result();
30+
}
31+
}, true);
32+
33+
public static final Comparator<SortableSiteMap> SORT_BY_TAXONOMY_AND_KEYWORD = new NullSafeComparator<>(new Comparator<SortableSiteMap>() {
34+
@Override
35+
public int compare(SortableSiteMap o1, SortableSiteMap o2) {
36+
return ComparisonChain.start()
37+
.compareTrueFirst(o1 != null, o2 != null)
38+
.compare(o1.getFirstChar(), o2.getFirstChar())
39+
.compare(o1.getFirstNumber(), o2.getFirstNumber())
40+
.compare(o1.getSecondChar(), o2.getSecondChar())
41+
.compare(o1.getSecondNumber(), o2.getSecondNumber())
42+
.result();
43+
}
44+
}, true);
45+
46+
private Integer firstNumber = Integer.MIN_VALUE;
47+
private String firstChar = "";
48+
private Integer secondNumber = Integer.MIN_VALUE;
49+
private String secondChar = "";
50+
private String originalTitle = "";
51+
private String id = "";
52+
private SitemapItem sitemapItem;
53+
private SitemapItemModelData sitemapItemModelData;
54+
55+
public SortableSiteMap(SitemapItemModelData sitemapItemModelData) {
56+
this.sitemapItemModelData = sitemapItemModelData;
57+
if (sitemapItemModelData == null) {
58+
return;
59+
}
60+
originalTitle = sitemapItemModelData.getOriginalTitle() == null ? "" : sitemapItemModelData.getOriginalTitle();
61+
id = sitemapItemModelData.getId() == null ? "" : sitemapItemModelData.getId();
62+
if (sitemapItemModelData.getId() == null) return;
63+
Matcher matcher = TAXONOMY_ID_PATTERN.matcher(sitemapItemModelData.getId());
64+
if (!matcher.matches()) {
65+
return;
66+
}
67+
fillFromMatcher(matcher);
68+
}
69+
70+
public SortableSiteMap(SitemapItem sitemapItem) {
71+
this.sitemapItem = sitemapItem;
72+
if (sitemapItem == null) {
73+
return;
74+
}
75+
originalTitle = sitemapItem.getOriginalTitle() == null ? "" : sitemapItem.getOriginalTitle();
76+
id = sitemapItem.getId() == null ? "" : sitemapItem.getId();
77+
if (sitemapItem.getId() == null) return;
78+
Matcher matcher = TAXONOMY_ID_PATTERN.matcher(sitemapItem.getId());
79+
if (!matcher.matches()) {
80+
return;
81+
}
82+
fillFromMatcher(matcher);
83+
}
84+
85+
private void fillFromMatcher(Matcher matcher) {
86+
String group2 = matcher.group(2);
87+
String group4 = matcher.group(4);
88+
if (StringUtils.isNotEmpty(group2)) {
89+
this.firstNumber = Integer.parseInt(group2);
90+
}
91+
if (StringUtils.isNotEmpty(group4)) {
92+
this.secondNumber = Integer.parseInt(group4);
93+
}
94+
this.firstChar = matcher.group(1);
95+
this.secondChar = matcher.group(3);
96+
}
97+
98+
public Integer getFirstNumber() {
99+
return firstNumber;
100+
}
101+
102+
public Integer getSecondNumber() {
103+
return secondNumber;
104+
}
105+
106+
public String getFirstChar() {
107+
return firstChar;
108+
}
109+
110+
public String getSecondChar() {
111+
return secondChar;
112+
}
113+
114+
public SitemapItem getSitemapItem() {
115+
return sitemapItem;
116+
}
117+
118+
public SitemapItemModelData getSitemapItemModelData() {
119+
return sitemapItemModelData;
120+
}
121+
122+
public String getOriginalTitle() {
123+
return originalTitle;
124+
}
125+
126+
public String getId() {
127+
return id;
128+
}
129+
130+
public static Collection<SitemapItem> sortItem(Collection<SitemapItem> entries, Comparator<SortableSiteMap> comparator) {
131+
if (entries == null) return Collections.emptyList();
132+
return entries
133+
.stream()
134+
.map(SortableSiteMap::new)
135+
.sorted(comparator)
136+
.map(SortableSiteMap::getSitemapItem).collect(Collectors.toList());
137+
}
138+
139+
public static Collection<SitemapItemModelData> sortModelData(Collection<SitemapItemModelData> entries, Comparator<SortableSiteMap> comparator) {
140+
if (entries == null) return Collections.emptyList();
141+
return entries
142+
.stream()
143+
.map(SortableSiteMap::new)
144+
.sorted(comparator)
145+
.map(SortableSiteMap::getSitemapItemModelData).collect(Collectors.toList());
146+
}
147+
148+
}

dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/api/serialization/json/filter/IgnoreByNameInRequestFilter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ public IgnoreByNameInRequestFilter(HttpServletRequest httpServletRequest) {
4040
*/
4141
public static void ignoreByName(ServletRequest request, String... properties) {
4242
if (properties != null && properties.length != 0) {
43-
String value = on(DELIMITER).skipNulls().join(
44-
on(DELIMITER).join(properties), request.getAttribute(REQUEST_ATTRIBUTE));
43+
String value = on(DELIMITER).skipNulls().join(on(DELIMITER).join(properties), request.getAttribute(REQUEST_ATTRIBUTE));
4544

4645
request.setAttribute(REQUEST_ATTRIBUTE, value);
4746
log.trace("Set ignore properties in current request: {}", value);

dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/controller/EntityController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.sdl.webapp.common.api.model.entity.RedirectEntity;
88
import org.slf4j.Logger;
99
import org.slf4j.LoggerFactory;
10+
import org.springframework.context.annotation.Profile;
1011
import org.springframework.stereotype.Controller;
1112
import org.springframework.web.bind.annotation.PathVariable;
1213
import org.springframework.web.bind.annotation.RequestMapping;
@@ -23,6 +24,7 @@
2324
* @dxa.publicApi
2425
*/
2526
@Controller
27+
@Profile("!dxa.docs.enabled")
2628
@RequestMapping(INCLUDE_MAPPING + "/Entity")
2729
public class EntityController extends BaseController {
2830

0 commit comments

Comments
 (0)