Skip to content

Commit 00094cf

Browse files
committed
DXA 1.7 Sprint 4
2 parents 0b35e1f + 4673b13 commit 00094cf

File tree

51 files changed

+1457
-314
lines changed

Some content is hidden

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

51 files changed

+1457
-314
lines changed

dxa-bom/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
</developers>
4646

4747
<properties>
48-
<dd4t.version>2.1.2-DXA</dd4t.version>
49-
<cd-cil.version>8.5.0-1005</cd-cil.version>
48+
<dd4t.version>2.1.3-DXA17</dd4t.version>
49+
<cd-cil.version>8.5.0-1007</cd-cil.version>
5050

5151
<!-- DXA versions -->
5252
<dxa.version>${project.version}</dxa.version>

dxa-builder/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,13 @@ artifacts {
5454
task signPom(type: Sign) {
5555
sign configurations.pom
5656
}
57+
signPom.enabled = isRelease
5758

5859
task signJars(type: Sign, dependsOn: [jar, signPom, javadocJar, sourceJar]) {
5960
sign configurations.archives
6061
}
62+
signJars.enabled = isRelease
6163
task preparePublication(dependsOn: [signPom, signJars])
62-
preparePublication.enabled = isRelease
6364

6465
task publishLocal(dependsOn: [build, publishToMavenLocal])
6566
task publishRemote(dependsOn: [build, preparePublication, publish])

dxa-builder/src/main/groovy/com/sdl/dxa/builder/configuration/parameters/Parameter.groovy

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ class Parameter {
88
Validator validator
99
String value
1010

11+
String versionAdded
12+
1113
private boolean valid = false
1214

1315
//region Builder methods
@@ -40,8 +42,23 @@ class Parameter {
4042
this.value = project && project.hasProperty(cliName) ? (project[cliName] as String).trim() : defaultValue
4143
this
4244
}
45+
46+
Parameter versionAdded(String version) {
47+
this.versionAdded = version
48+
this
49+
}
4350
//endregion
4451

52+
boolean isSupportedInCurrentVersion(String currentVersion) {
53+
if (!currentVersion || !versionAdded) {
54+
return true
55+
}
56+
def normalize = { String version ->
57+
Integer.parseInt(version.replaceAll(/[^\d]/, "").padRight(5, "0").substring(0, 5))
58+
}
59+
normalize(currentVersion) >= normalize(versionAdded)
60+
}
61+
4562
String process(boolean batch, Map<String, ?> configuration = [:]) {
4663
if (!this.value && this.dynamicDefault) {
4764
this.value = this.dynamicDefault(configuration)

dxa-builder/src/main/groovy/com/sdl/dxa/builder/configuration/parameters/Validator.groovy

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,21 @@ class Validator {
7474
})
7575
}
7676

77-
static Validator domainName() {
78-
new Validator(description: 'Should match a valid Domain Name', validate: { String it ->
77+
static Validator domainName(boolean validWithPort = false) {
78+
new Validator(description: "Should match a valid Domain Name ${validWithPort ? "with" : "without"} port", validate: { String it ->
79+
def result = notEmpty().validate(it as String)
80+
81+
result &= !it.contains('://')
7982
it = removePath(it)
80-
notEmpty().validate(it as String) && DomainValidator.getInstance(true).isValid(it as String)
83+
84+
if (validWithPort) {
85+
if (it.contains(':')) {
86+
def arr = it.split(':')
87+
it = arr[0]
88+
result &= arr.length == 2 && intNumber().validate(arr[1])
89+
}
90+
}
91+
result && DomainValidator.getInstance(true).isValid(it as String)
8192
})
8293
}
8394

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.sdl.dxa.builder.configuration.parameters
2+
3+
import org.junit.Assert
4+
import org.junit.Test
5+
6+
class ValidatorTest {
7+
8+
@Test
9+
void shouldValidateDomainNames() {
10+
//given
11+
def validator = Validator.domainName()
12+
13+
//when, then
14+
Assert.assertTrue(validator.validate("sdl.com"))
15+
Assert.assertTrue(validator.validate("sdl.com/path"))
16+
Assert.assertTrue(validator.validate("toplevel.sdl.com"))
17+
Assert.assertTrue(validator.validate("toplevel.sdl.com/path/test"))
18+
19+
20+
Assert.assertFalse(validator.validate("http://sdl.com"))
21+
Assert.assertFalse(validator.validate("http://sdl.com/path"))
22+
Assert.assertFalse(validator.validate("sdl.com:8080"))
23+
Assert.assertFalse(validator.validate("sdl.com:8080/[ath"))
24+
}
25+
26+
@Test
27+
void shouldValidateDomainNamesWithPort() {
28+
//given
29+
def validator = Validator.domainName(true)
30+
31+
//when, then
32+
Assert.assertTrue(validator.validate("sdl.com"))
33+
Assert.assertTrue(validator.validate("sdl.com/path"))
34+
Assert.assertTrue(validator.validate("toplevel.sdl.com"))
35+
Assert.assertTrue(validator.validate("toplevel.sdl.com/path/text"))
36+
Assert.assertTrue(validator.validate("sdl.com:8080"))
37+
Assert.assertTrue(validator.validate("sdl.com:8080/path"))
38+
39+
40+
Assert.assertFalse(validator.validate("http://sdl.com"))
41+
Assert.assertFalse(validator.validate("http://sdl.com/path"))
42+
Assert.assertFalse(validator.validate("http://sdl.com:8080"))
43+
Assert.assertFalse(validator.validate("http://sdl.com:8080/path"))
44+
Assert.assertFalse(validator.validate("sdl.com:8080:80"))
45+
}
46+
47+
@Test
48+
void shouldValidateIPs() {
49+
//given
50+
def validator = Validator.ip()
51+
52+
//when, then
53+
Assert.assertTrue(validator.validate("127.0.0.1"))
54+
55+
//then
56+
Assert.assertFalse(validator.validate("http://sdl.com"))
57+
}
58+
}

dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/api/mapping/semantic/config/EntitySemantics.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@ public final class EntitySemantics {
1313

1414
private final String entityName;
1515

16-
/**
17-
* <p>Constructor for EntitySemantics.</p>
18-
*
19-
* @param vocabulary a {@link com.sdl.webapp.common.api.mapping.semantic.config.SemanticVocabulary} object.
20-
* @param entityName a {@link java.lang.String} object.
21-
*/
2216
public EntitySemantics(SemanticVocabulary vocabulary, String entityName) {
2317
this.vocabulary = vocabulary;
2418
this.entityName = entityName;

dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/api/mapping/semantic/config/FieldPath.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,9 @@
1010
public final class FieldPath {
1111

1212
private final String head;
13+
1314
private final FieldPath tail;
1415

15-
/**
16-
* <p>Constructor for FieldPath.</p>
17-
*
18-
* @param path a {@link java.lang.String} object.
19-
*/
2016
public FieldPath(String path) {
2117
if (path.startsWith("/")) {
2218
path = path.substring(1);
@@ -35,4 +31,8 @@ public FieldPath(String path) {
3531
public boolean hasTail() {
3632
return tail != null;
3733
}
34+
35+
public boolean isMetadata() {
36+
return "Metadata".equals(head);
37+
}
3838
}

dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/api/mapping/semantic/config/FieldSemantics.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,6 @@ public final class FieldSemantics {
1717

1818
private final String propertyName;
1919

20-
/**
21-
* <p>Constructor for FieldSemantics.</p>
22-
*
23-
* @param vocabulary a {@link com.sdl.webapp.common.api.mapping.semantic.config.SemanticVocabulary} object.
24-
* @param entityName a {@link java.lang.String} object.
25-
* @param propertyName a {@link java.lang.String} object.
26-
*/
2720
public FieldSemantics(SemanticVocabulary vocabulary, String entityName, String propertyName) {
2821
this.vocabulary = vocabulary;
2922
this.entityName = entityName;

dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/api/mapping/semantic/config/SemanticField.java

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,18 @@
44
import lombok.EqualsAndHashCode;
55
import lombok.Getter;
66
import lombok.ToString;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.jetbrains.annotations.NotNull;
9+
import org.jetbrains.annotations.Nullable;
710

811
import java.util.Map;
912

13+
import static com.google.common.base.Strings.isNullOrEmpty;
14+
1015
@Getter
1116
@ToString
1217
@EqualsAndHashCode
18+
@Slf4j
1319
public final class SemanticField {
1420

1521
private final String name;
@@ -20,19 +26,45 @@ public final class SemanticField {
2026

2127
private final Map<FieldSemantics, SemanticField> embeddedFields;
2228

23-
/**
24-
* <p>Constructor for SemanticField.</p>
25-
*
26-
* @param name a {@link java.lang.String} object.
27-
* @param path a {@link java.lang.String} object.
28-
* @param multiValue a boolean.
29-
* @param embeddedFields a {@link java.util.Map} object.
30-
*/
3129
public SemanticField(String name, String path, boolean multiValue,
3230
Map<FieldSemantics, SemanticField> embeddedFields) {
3331
this.name = name;
3432
this.path = new FieldPath(path);
3533
this.multiValue = multiValue;
3634
this.embeddedFields = ImmutableMap.copyOf(embeddedFields);
3735
}
36+
37+
/**
38+
* Generates XPath for this semantic field respecting the context XPath and type of the field (metadata or content).
39+
*
40+
* @param contextXPath the current context XPath, optional, may be {@code null}
41+
* @return generated XPath
42+
*/
43+
@NotNull
44+
public String getXPath(@Nullable String contextXPath) {
45+
FieldPath pathCopy = path;
46+
47+
StringBuilder builder = new StringBuilder(pathCopy.isMetadata() ? "tcm:Metadata" : "tcm:Content");
48+
49+
while (true) {
50+
builder.append("/custom:").append(pathCopy.getHead());
51+
if (!pathCopy.hasTail()) {
52+
break;
53+
}
54+
pathCopy = pathCopy.getTail();
55+
}
56+
57+
String xPath = builder.toString();
58+
String contextPathWithoutPredicate = null;
59+
if (!isNullOrEmpty(contextXPath)) {
60+
contextPathWithoutPredicate = contextXPath.split("\\[")[0];
61+
62+
if (!xPath.startsWith(contextPathWithoutPredicate)) {
63+
// This should not happen, but if it happens, we just stick with the original XPath.
64+
log.warn("Semantic field's XPath ('{}}') does not match context XPath '{}'.", xPath, contextXPath);
65+
}
66+
}
67+
68+
return contextPathWithoutPredicate == null ? xPath : xPath.replaceFirst(contextPathWithoutPredicate, contextXPath);
69+
}
3870
}

dxa-framework/dxa-common-api/src/main/java/com/sdl/webapp/common/api/mapping/semantic/config/SemanticSchema.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,6 @@ public final class SemanticSchema {
3232
@Setter
3333
private Localization localization;
3434

35-
/**
36-
* <p>Constructor for SemanticSchema.</p>
37-
*
38-
* @param id a long.
39-
* @param rootElement a {@link java.lang.String} object.
40-
* @param entitySemantics a {@link java.util.Set} object.
41-
* @param semanticFields a {@link java.util.Map} object.
42-
*/
4335
public SemanticSchema(long id, String rootElement, Set<EntitySemantics> entitySemantics,
4436
Map<FieldSemantics, SemanticField> semanticFields) {
4537
this.id = id;

0 commit comments

Comments
 (0)