Skip to content

Commit 518c2a1

Browse files
authored
Move MessageValidator to common (#1091)
1 parent 1565512 commit 518c2a1

24 files changed

+94
-91
lines changed

common/src/main/java/com/google/udmi/util/Common.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import com.google.common.base.Strings;
1010
import com.google.common.reflect.ClassPath;
1111
import com.google.common.reflect.ClassPath.ClassInfo;
12-
import com.google.daq.mqtt.util.ExceptionMap.ExceptionCategory;
12+
import com.google.udmi.util.ExceptionMap.ExceptionCategory;
1313
import java.util.ArrayList;
1414
import java.util.List;
1515
import java.util.MissingFormatArgumentException;

common/src/main/java/com/google/daq/mqtt/util/ContextWrapper.java common/src/main/java/com/google/udmi/util/ContextWrapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.google.daq.mqtt.util;
1+
package com.google.udmi.util;
22

33
import java.util.List;
44
import java.util.ArrayList;

common/src/main/java/com/google/daq/mqtt/util/ErrorMap.java common/src/main/java/com/google/udmi/util/ErrorMap.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.google.daq.mqtt.util;
1+
package com.google.udmi.util;
22

33
import java.util.HashMap;
44
import java.util.Map;

common/src/main/java/com/google/daq/mqtt/util/ExceptionList.java common/src/main/java/com/google/udmi/util/ExceptionList.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.google.daq.mqtt.util;
1+
package com.google.udmi.util;
22

33
import static java.lang.String.format;
44

common/src/main/java/com/google/daq/mqtt/util/ExceptionMap.java common/src/main/java/com/google/udmi/util/ExceptionMap.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
package com.google.daq.mqtt.util;
1+
package com.google.udmi.util;
22

33
import static com.google.udmi.util.GeneralUtils.multiTrim;
44

5-
import com.google.daq.mqtt.util.ErrorMap.ErrorMapException;
5+
import com.google.udmi.util.ErrorMap.ErrorMapException;
66
import java.io.ByteArrayOutputStream;
77
import java.io.IOException;
88
import java.io.OutputStream;

common/src/main/java/com/google/udmi/util/GeneralUtils.java

-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import com.google.common.collect.ImmutableList;
2020
import com.google.common.collect.Sets;
2121
import com.google.common.hash.Hashing;
22-
import com.google.daq.mqtt.util.ValidationException;
2322
import com.google.udmi.util.ProperPrinter.OutputFormat;
2423
import java.io.BufferedReader;
2524
import java.io.ByteArrayOutputStream;

validator/src/main/java/com/google/bos/iot/core/proxy/MessageValidator.java common/src/main/java/com/google/udmi/util/MessageValidator.java

+48-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
package com.google.bos.iot.core.proxy;
1+
package com.google.udmi.util;
2+
3+
import static com.google.common.base.Preconditions.checkArgument;
4+
import static com.google.common.collect.ImmutableList.toImmutableList;
5+
import static java.lang.String.format;
26

37
import com.fasterxml.jackson.databind.JsonNode;
48
import com.fasterxml.jackson.databind.ObjectMapper;
59
import com.github.fge.jsonschema.core.exceptions.ProcessingException;
610
import com.github.fge.jsonschema.core.load.configuration.LoadingConfiguration;
711
import com.github.fge.jsonschema.core.load.download.URIDownloader;
12+
import com.github.fge.jsonschema.core.report.LogLevel;
13+
import com.github.fge.jsonschema.core.report.ProcessingMessage;
814
import com.github.fge.jsonschema.core.report.ProcessingReport;
915
import com.github.fge.jsonschema.main.JsonSchema;
1016
import com.github.fge.jsonschema.main.JsonSchemaFactory;
1117
import com.google.common.collect.ImmutableList;
1218
import com.google.common.collect.Maps;
13-
import com.google.daq.mqtt.util.ValidationException;
14-
import com.google.daq.mqtt.validator.Validator;
1519
import java.io.File;
1620
import java.io.FileInputStream;
1721
import java.io.IOException;
@@ -20,13 +24,20 @@
2024
import java.net.URL;
2125
import java.util.List;
2226
import java.util.Map;
27+
import java.util.regex.Pattern;
28+
import java.util.stream.StreamSupport;
2329

2430
/**
2531
* Validation wrapper for processing individual messages.
2632
*/
2733
public class MessageValidator {
2834

2935
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
36+
@SuppressWarnings("checkstyle:linelength")
37+
private static final List<String> IGNORE_LIST = ImmutableList.of(
38+
"instance type \\(string\\) does not match any allowed primitive type \\(allowed: \\[.*\"number\"\\]\\)");
39+
private static final List<Pattern> IGNORE_PATTERNS = IGNORE_LIST.stream().map(Pattern::compile)
40+
.toList();
3041

3142
private final Map<String, JsonSchema> schemaMap = Maps.newConcurrentMap();
3243
private final File schemaRoot;
@@ -44,6 +55,39 @@ public MessageValidator(String schemaRootPath) {
4455
}
4556
}
4657

58+
/**
59+
* From an external processing report.
60+
*
61+
* @param report Report to convert
62+
* @return Converted exception.
63+
*/
64+
public static ValidationException fromProcessingReport(ProcessingReport report) {
65+
checkArgument(!report.isSuccess(), "Report must not be successful");
66+
ImmutableList<ValidationException> causingExceptions =
67+
StreamSupport.stream(report.spliterator(), false)
68+
.filter(MessageValidator::errorOrWorse)
69+
.filter(MessageValidator::notOnIgnoreList)
70+
.map(MessageValidator::convertMessage).collect(toImmutableList());
71+
return causingExceptions.isEmpty() ? null : new ValidationException(
72+
format("%d schema violations found", causingExceptions.size()), causingExceptions);
73+
}
74+
75+
private static boolean notOnIgnoreList(ProcessingMessage processingMessage) {
76+
return IGNORE_PATTERNS.stream()
77+
.noneMatch(p -> p.matcher(processingMessage.getMessage()).matches());
78+
}
79+
80+
private static boolean errorOrWorse(ProcessingMessage processingMessage) {
81+
return processingMessage.getLogLevel().compareTo(LogLevel.ERROR) >= 0;
82+
}
83+
84+
private static ValidationException convertMessage(ProcessingMessage processingMessage) {
85+
String pointer = processingMessage.asJson().get("instance").get("pointer").asText();
86+
String prefix =
87+
com.google.api.client.util.Strings.isNullOrEmpty(pointer) ? "" : (pointer + ": ");
88+
return new ValidationException(prefix + processingMessage.getMessage());
89+
}
90+
4791
/**
4892
* Validate the indicated message.
4993
*
@@ -58,7 +102,7 @@ public List<String> validateMessage(String subFolder, String data) {
58102
if (report.isSuccess()) {
59103
return ImmutableList.of();
60104
}
61-
throw Validator.fromProcessingReport(report);
105+
throw fromProcessingReport(report);
62106
} catch (ValidationException e) {
63107
return e.getAllMessages();
64108
} catch (IOException | ProcessingException ex) {

common/src/main/java/com/google/udmi/util/SiteModel.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@
3535
import com.fasterxml.jackson.databind.node.ObjectNode;
3636
import com.fasterxml.jackson.databind.util.ISO8601DateFormat;
3737
import com.google.common.collect.ImmutableList;
38-
import com.google.daq.mqtt.util.ExceptionMap;
39-
import com.google.daq.mqtt.util.ExceptionMap.ExceptionCategory;
38+
import com.google.udmi.util.ExceptionMap.ExceptionCategory;
4039
import java.io.File;
4140
import java.util.Arrays;
4241
import java.util.Collection;

common/src/main/java/com/google/daq/mqtt/util/ValidationError.java common/src/main/java/com/google/udmi/util/ValidationError.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.google.daq.mqtt.util;
1+
package com.google.udmi.util;
22

33
public class ValidationError extends RuntimeException {
44

common/src/main/java/com/google/daq/mqtt/util/ValidationException.java common/src/main/java/com/google/udmi/util/ValidationException.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.google.daq.mqtt.util;
1+
package com.google.udmi.util;
22

33
import com.google.common.collect.ImmutableList;
44

common/src/main/java/com/google/daq/mqtt/util/ValidationWarning.java common/src/main/java/com/google/udmi/util/ValidationWarning.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.google.daq.mqtt.util;
1+
package com.google.udmi.util;
22

33
public class ValidationWarning extends ValidationError {
44

pubber/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ publishing {
100100

101101
dependencies {
102102
implementation 'io.jsonwebtoken:jjwt:0.9.1'
103+
implementation group: 'com.github.java-json-tools', name: 'json-schema-validator', version: '2.2.14'
103104
implementation 'javax.xml.bind:jaxb-api:2.3.1'
104105
implementation 'com.sun.xml.bind:jaxb-impl:3.0.1'
105106
implementation 'commons-io:commons-io:2.5'

udmis/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ repositories {
8484
dependencies {
8585
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.4'
8686
implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.11.0'
87+
implementation group: 'com.github.java-json-tools', name: 'json-schema-validator', version: '2.2.14'
8788
implementation 'commons-io:commons-io:2.5'
8889

8990
implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: '0.9.10'

validator/src/main/java/com/google/bos/iot/core/proxy/IotCoreProxy.java

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.google.cloud.ServiceOptions;
1111
import com.google.daq.mqtt.util.PubSubClient;
1212
import com.google.daq.mqtt.util.PubSubPusher;
13+
import com.google.udmi.util.MessageValidator;
1314
import java.io.File;
1415
import java.util.Date;
1516
import java.util.HashMap;

validator/src/main/java/com/google/daq/mqtt/registrar/LocalDevice.java

+11-11
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
import static com.google.daq.mqtt.registrar.Registrar.METADATA_SCHEMA_JSON;
88
import static com.google.daq.mqtt.util.ConfigManager.GENERATED_CONFIG_JSON;
99
import static com.google.daq.mqtt.util.ConfigManager.configFrom;
10-
import static com.google.daq.mqtt.util.ContextWrapper.runInContext;
1110
import static com.google.udmi.util.Common.DEVICE_ID_ALLOWABLE;
1211
import static com.google.udmi.util.Common.POINT_NAME_ALLOWABLE;
12+
import static com.google.udmi.util.ContextWrapper.runInContext;
1313
import static com.google.udmi.util.GeneralUtils.CSV_JOINER;
1414
import static com.google.udmi.util.GeneralUtils.OBJECT_MAPPER_STRICT;
1515
import static com.google.udmi.util.GeneralUtils.catchToNull;
@@ -44,19 +44,19 @@
4444
import com.google.daq.mqtt.util.CloudIotManager;
4545
import com.google.daq.mqtt.util.ConfigManager;
4646
import com.google.daq.mqtt.util.DeviceExceptionManager;
47-
import com.google.daq.mqtt.util.ErrorMap;
48-
import com.google.daq.mqtt.util.ErrorMap.ErrorMapException;
49-
import com.google.daq.mqtt.util.ExceptionMap;
50-
import com.google.daq.mqtt.util.ExceptionMap.ErrorTree;
51-
import com.google.daq.mqtt.util.ExceptionMap.ExceptionCategory;
52-
import com.google.daq.mqtt.util.ValidationError;
53-
import com.google.daq.mqtt.util.ValidationException;
54-
import com.google.daq.mqtt.util.ValidationWarning;
55-
import com.google.daq.mqtt.validator.Validator;
47+
import com.google.udmi.util.ErrorMap;
48+
import com.google.udmi.util.ErrorMap.ErrorMapException;
49+
import com.google.udmi.util.ExceptionMap;
50+
import com.google.udmi.util.ExceptionMap.ErrorTree;
51+
import com.google.udmi.util.ExceptionMap.ExceptionCategory;
5652
import com.google.udmi.util.JsonUtil;
5753
import com.google.udmi.util.MessageDowngrader;
54+
import com.google.udmi.util.MessageValidator;
5855
import com.google.udmi.util.SiteModel;
5956
import com.google.udmi.util.SiteModel.MetadataException;
57+
import com.google.udmi.util.ValidationError;
58+
import com.google.udmi.util.ValidationException;
59+
import com.google.udmi.util.ValidationWarning;
6060
import java.io.File;
6161
import java.io.FileInputStream;
6262
import java.io.FileWriter;
@@ -238,7 +238,7 @@ public static void parseMetadataValidateProcessingReport(ProcessingReport report
238238

239239
for (ProcessingMessage msg : report) {
240240
if (msg.getLogLevel().compareTo(LogLevel.ERROR) >= 0) {
241-
throw Validator.fromProcessingReport(report);
241+
throw MessageValidator.fromProcessingReport(report);
242242
}
243243
}
244244
}

validator/src/main/java/com/google/daq/mqtt/registrar/Registrar.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,16 @@
5959
import com.google.daq.mqtt.util.CloudDeviceSettings;
6060
import com.google.daq.mqtt.util.CloudIotManager;
6161
import com.google.daq.mqtt.util.DeviceGatewayBoundException;
62-
import com.google.daq.mqtt.util.ExceptionMap;
63-
import com.google.daq.mqtt.util.ExceptionMap.ErrorTree;
64-
import com.google.daq.mqtt.util.ExceptionMap.ExceptionCategory;
6562
import com.google.daq.mqtt.util.PubSubPusher;
66-
import com.google.daq.mqtt.util.ValidationError;
6763
import com.google.udmi.util.CommandLineOption;
6864
import com.google.udmi.util.CommandLineProcessor;
6965
import com.google.udmi.util.Common;
66+
import com.google.udmi.util.ExceptionMap;
67+
import com.google.udmi.util.ExceptionMap.ErrorTree;
68+
import com.google.udmi.util.ExceptionMap.ExceptionCategory;
7069
import com.google.udmi.util.JsonUtil;
7170
import com.google.udmi.util.SiteModel;
71+
import com.google.udmi.util.ValidationError;
7272
import java.io.File;
7373
import java.io.FileInputStream;
7474
import java.io.FileNotFoundException;

validator/src/main/java/com/google/daq/mqtt/util/CloudIotManager.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
import static udmi.schema.IotAccess.IotProvider.PUBSUB;
1818

1919
import com.google.common.collect.ImmutableList;
20-
import com.google.daq.mqtt.util.ExceptionMap.ExceptionCategory;
20+
import com.google.udmi.util.ExceptionMap;
21+
import com.google.udmi.util.ExceptionMap.ExceptionCategory;
2122
import com.google.udmi.util.GeneralUtils;
2223
import com.google.udmi.util.IotProvider;
2324
import com.google.udmi.util.MetadataMapKeys;

validator/src/main/java/com/google/daq/mqtt/util/ConfigManager.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.google.daq.mqtt.util;
22

33
import static com.google.common.base.Preconditions.checkState;
4-
import static com.google.daq.mqtt.util.ContextWrapper.getCurrentContext;
5-
import static com.google.daq.mqtt.util.ContextWrapper.runInContext;
6-
import static com.google.daq.mqtt.util.ContextWrapper.wrapExceptionWithContext;
74
import static com.google.daq.mqtt.util.providers.FamilyProvider.NAMED_FAMILIES;
5+
import static com.google.udmi.util.ContextWrapper.getCurrentContext;
6+
import static com.google.udmi.util.ContextWrapper.runInContext;
7+
import static com.google.udmi.util.ContextWrapper.wrapExceptionWithContext;
88
import static com.google.udmi.util.GeneralUtils.catchToNull;
99
import static com.google.udmi.util.GeneralUtils.deepCopy;
1010
import static com.google.udmi.util.GeneralUtils.ifNotNullGet;

validator/src/main/java/com/google/daq/mqtt/util/FirestoreDataSink.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import com.google.cloud.firestore.Firestore;
66
import com.google.cloud.firestore.FirestoreOptions;
77
import com.google.common.base.Preconditions;
8-
import com.google.daq.mqtt.util.ExceptionMap.ErrorTree;
98
import com.google.daq.mqtt.validator.ReportingDevice;
9+
import com.google.udmi.util.ExceptionMap.ErrorTree;
1010
import java.time.Instant;
1111
import java.time.ZoneOffset;
1212
import java.time.format.DateTimeFormatter;

validator/src/main/java/com/google/daq/mqtt/validator/PointsetValidator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import com.google.common.base.Joiner;
77
import com.google.common.collect.ImmutableMap;
88
import com.google.common.collect.ImmutableSet;
9-
import com.google.daq.mqtt.util.ValidationException;
109
import com.google.daq.mqtt.validator.ReportingDevice.MetadataDiff;
1110
import com.google.udmi.util.JsonUtil;
11+
import com.google.udmi.util.ValidationException;
1212
import java.util.Date;
1313
import java.util.Map;
1414
import java.util.Set;

validator/src/main/java/com/google/daq/mqtt/validator/ReportingDevice.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
import static java.util.Optional.ofNullable;
99
import static org.junit.Assert.assertTrue;
1010

11-
import com.google.daq.mqtt.util.ExceptionList;
12-
import com.google.daq.mqtt.util.ValidationException;
1311
import com.google.udmi.util.Common;
12+
import com.google.udmi.util.ExceptionList;
13+
import com.google.udmi.util.ValidationException;
1414
import java.time.Instant;
1515
import java.util.ArrayList;
1616
import java.util.Date;

validator/src/main/java/com/google/daq/mqtt/validator/SchemaTester.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.google.daq.mqtt.validator;
22

3-
import com.google.daq.mqtt.util.ExceptionMap;
3+
import com.google.udmi.util.ExceptionMap;
44
import java.util.Arrays;
55

66
/**

0 commit comments

Comments
 (0)