Skip to content

Commit 9d4dfaf

Browse files
committed
extracted WrappingFormatValidator, deprecated SchemaLoaderBuilder#addFormatValidator(String, FormatValidator), and added javadoc
1 parent 71f44b3 commit 9d4dfaf

File tree

4 files changed

+78
-17
lines changed

4 files changed

+78
-17
lines changed

core/src/main/java/org/everit/json/schema/FormatValidator.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,17 @@ static FormatValidator forFormat(final String formatName) {
8080
*/
8181
Optional<String> validate(String subject);
8282

83+
/**
84+
* Provides the name of this format.
85+
*
86+
* Unless specified otherwise the {@link org.everit.json.schema.loader.SchemaLoader} will use this
87+
* name to recognize string schemas using this format.
88+
*
89+
* The default implementation of this method returns {@code "unnamed-format"}. It is strongly
90+
* recommended for implementations to give a more meaningful name by overriding this method.
91+
*
92+
* @return the format name.
93+
*/
8394
default String formatName() {
8495
return "unnamed-format";
8596
}

core/src/main/java/org/everit/json/schema/loader/SchemaLoader.java

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,8 @@
1818
import org.everit.json.schema.*;
1919
import org.everit.json.schema.ObjectSchema.Builder;
2020
import org.everit.json.schema.internal.*;
21-
import org.everit.json.schema.loader.internal.DefaultSchemaClient;
22-
import org.everit.json.schema.loader.internal.JSONPointer;
21+
import org.everit.json.schema.loader.internal.*;
2322
import org.everit.json.schema.loader.internal.JSONPointer.QueryResult;
24-
import org.everit.json.schema.loader.internal.ReferenceResolver;
25-
import org.everit.json.schema.loader.internal.TypeBasedMultiplexer;
2623
import org.json.JSONArray;
2724
import org.json.JSONException;
2825
import org.json.JSONObject;
@@ -75,21 +72,34 @@ public static class SchemaLoaderBuilder {
7572
formatValidators.put("hostname", new HostnameFormatValidator());
7673
}
7774

75+
/**
76+
* Registers a format validator with the name returned by {@link FormatValidator#formatName()}.
77+
*
78+
* @param formatValidator
79+
* @return {@code this}
80+
*/
81+
public SchemaLoaderBuilder addFormatValidator(FormatValidator formatValidator) {
82+
formatValidators.put(formatValidator.formatName(), formatValidator);
83+
return this;
84+
}
85+
86+
/**
87+
* @param formatName
88+
* the name which will be used in the schema JSON files to refer to this {@code formatValidator}
89+
* @param formatValidator
90+
* the object performing the validation for schemas which use the {@code formatName} format
91+
* @return {@code this}
92+
* @deprecated instead it is better to override {@link FormatValidator#formatName()}
93+
* and use {@link #addFormatValidator(FormatValidator)}
94+
*/
95+
@Deprecated
7896
public SchemaLoaderBuilder addFormatValidator(final String formatName,
7997
final FormatValidator formatValidator) {
80-
FormatValidator wrappingFormatValidator = new FormatValidator() {
81-
82-
@Override
83-
public Optional<String> validate(String subject) {
84-
return formatValidator.validate(subject);
85-
}
86-
87-
@Override
88-
public String formatName() {
89-
return formatName;
90-
}
91-
};
92-
formatValidators.put(formatName, wrappingFormatValidator);
98+
if (!Objects.equals(formatName, formatValidator.formatName())) {
99+
formatValidators.put(formatName, new WrappingFormatValidator(formatName, formatValidator));
100+
} else {
101+
formatValidators.put(formatName, formatValidator);
102+
}
93103
return this;
94104
}
95105

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.everit.json.schema.loader.internal;
2+
3+
import org.everit.json.schema.FormatValidator;
4+
5+
import java.util.Optional;
6+
import static java.util.Objects.requireNonNull;
7+
8+
public class WrappingFormatValidator implements FormatValidator {
9+
10+
private final String formatName;
11+
private final FormatValidator formatValidator;
12+
13+
public WrappingFormatValidator(String formatName, FormatValidator wrappedValidator) {
14+
this.formatName = requireNonNull(formatName, "formatName cannot be null");
15+
this.formatValidator = requireNonNull(wrappedValidator, "wrappedValidator cannot be null");
16+
}
17+
18+
19+
20+
@Override
21+
public Optional<String> validate(String subject) {
22+
return formatValidator.validate(subject);
23+
}
24+
25+
@Override
26+
public String formatName() {
27+
return formatName;
28+
}
29+
}

core/src/test/java/org/everit/json/schema/loader/CustomFormatValidatorTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,15 @@ public void nameOverride() {
7575
assertEquals("somethingelse", actual);
7676
}
7777

78+
@Test
79+
public void formatValidatorWithoutExplicitName() {
80+
SchemaLoader schemaLoader = SchemaLoader.builder()
81+
.schemaJson(loader.readObj("customformat-schema.json"))
82+
.addFormatValidator(new EvenCharNumValidator())
83+
.build();
84+
Object actual = new JSONObject(schemaLoader.load().build().toString())
85+
.query("/properties/id/format");
86+
assertEquals("evenlength", actual);
87+
}
88+
7889
}

0 commit comments

Comments
 (0)