refactored obsolete com.github.java-json-tools:json-schema-validator with actively updated com.networknt:json-schema-validator
This commit is contained in:
		
							parent
							
								
									dec61b8ac2
								
							
						
					
					
						commit
						a3c7084d7f
					
				@ -60,10 +60,6 @@
 | 
				
			|||||||
            <groupId>jakarta.annotation</groupId>
 | 
					            <groupId>jakarta.annotation</groupId>
 | 
				
			||||||
            <artifactId>jakarta.annotation-api</artifactId>
 | 
					            <artifactId>jakarta.annotation-api</artifactId>
 | 
				
			||||||
        </dependency>
 | 
					        </dependency>
 | 
				
			||||||
        <dependency>
 | 
					 | 
				
			||||||
            <groupId>com.github.java-json-tools</groupId>
 | 
					 | 
				
			||||||
            <artifactId>json-schema-validator</artifactId>
 | 
					 | 
				
			||||||
        </dependency>
 | 
					 | 
				
			||||||
        <dependency>
 | 
					        <dependency>
 | 
				
			||||||
            <groupId>org.slf4j</groupId>
 | 
					            <groupId>org.slf4j</groupId>
 | 
				
			||||||
            <artifactId>slf4j-api</artifactId>
 | 
					            <artifactId>slf4j-api</artifactId>
 | 
				
			||||||
 | 
				
			|||||||
@ -56,10 +56,6 @@
 | 
				
			|||||||
            <groupId>jakarta.annotation</groupId>
 | 
					            <groupId>jakarta.annotation</groupId>
 | 
				
			||||||
            <artifactId>jakarta.annotation-api</artifactId>
 | 
					            <artifactId>jakarta.annotation-api</artifactId>
 | 
				
			||||||
        </dependency>
 | 
					        </dependency>
 | 
				
			||||||
        <dependency>
 | 
					 | 
				
			||||||
            <groupId>com.github.java-json-tools</groupId>
 | 
					 | 
				
			||||||
            <artifactId>json-schema-validator</artifactId>
 | 
					 | 
				
			||||||
        </dependency>
 | 
					 | 
				
			||||||
        <dependency>
 | 
					        <dependency>
 | 
				
			||||||
            <groupId>org.slf4j</groupId>
 | 
					            <groupId>org.slf4j</groupId>
 | 
				
			||||||
            <artifactId>slf4j-api</artifactId>
 | 
					            <artifactId>slf4j-api</artifactId>
 | 
				
			||||||
 | 
				
			|||||||
@ -59,6 +59,10 @@
 | 
				
			|||||||
            <groupId>org.thingsboard.common</groupId>
 | 
					            <groupId>org.thingsboard.common</groupId>
 | 
				
			||||||
            <artifactId>util</artifactId>
 | 
					            <artifactId>util</artifactId>
 | 
				
			||||||
        </dependency>
 | 
					        </dependency>
 | 
				
			||||||
 | 
					        <dependency>
 | 
				
			||||||
 | 
					            <groupId>com.networknt</groupId>
 | 
				
			||||||
 | 
					            <artifactId>json-schema-validator</artifactId>
 | 
				
			||||||
 | 
					        </dependency>
 | 
				
			||||||
        <dependency>
 | 
					        <dependency>
 | 
				
			||||||
            <groupId>org.slf4j</groupId>
 | 
					            <groupId>org.slf4j</groupId>
 | 
				
			||||||
            <artifactId>slf4j-api</artifactId>
 | 
					            <artifactId>slf4j-api</artifactId>
 | 
				
			||||||
 | 
				
			|||||||
@ -16,10 +16,10 @@
 | 
				
			|||||||
package org.thingsboard.server.dao.component;
 | 
					package org.thingsboard.server.dao.component;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.fasterxml.jackson.databind.JsonNode;
 | 
					import com.fasterxml.jackson.databind.JsonNode;
 | 
				
			||||||
import com.github.fge.jsonschema.core.exceptions.ProcessingException;
 | 
					import com.networknt.schema.JsonSchema;
 | 
				
			||||||
import com.github.fge.jsonschema.core.report.ProcessingReport;
 | 
					import com.networknt.schema.JsonSchemaFactory;
 | 
				
			||||||
import com.github.fge.jsonschema.main.JsonSchemaFactory;
 | 
					import com.networknt.schema.SpecVersion;
 | 
				
			||||||
import com.github.fge.jsonschema.main.JsonValidator;
 | 
					import com.networknt.schema.ValidationMessage;
 | 
				
			||||||
import lombok.extern.slf4j.Slf4j;
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
import org.springframework.stereotype.Service;
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
@ -36,6 +36,7 @@ import org.thingsboard.server.dao.service.DataValidator;
 | 
				
			|||||||
import org.thingsboard.server.dao.service.Validator;
 | 
					import org.thingsboard.server.dao.service.Validator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Optional;
 | 
					import java.util.Optional;
 | 
				
			||||||
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @author Andrew Shvayka
 | 
					 * @author Andrew Shvayka
 | 
				
			||||||
@ -89,15 +90,18 @@ public class BaseComponentDescriptorService implements ComponentDescriptorServic
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public boolean validate(TenantId tenantId, ComponentDescriptor component, JsonNode configuration) {
 | 
					    public boolean validate(TenantId tenantId, ComponentDescriptor component, JsonNode configuration) {
 | 
				
			||||||
        JsonValidator validator = JsonSchemaFactory.byDefault().getValidator();
 | 
					 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            if (!component.getConfigurationDescriptor().has("schema")) {
 | 
					            if (!component.getConfigurationDescriptor().has("schema")) {
 | 
				
			||||||
                throw new DataValidationException("Configuration descriptor doesn't contain schema property!");
 | 
					                throw new DataValidationException("Configuration descriptor doesn't contain schema property!");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            JsonNode configurationSchema = component.getConfigurationDescriptor().get("schema");
 | 
					            JsonNode configurationSchema = component.getConfigurationDescriptor().get("schema");
 | 
				
			||||||
            ProcessingReport report = validator.validate(configurationSchema, configuration);
 | 
					
 | 
				
			||||||
            return report.isSuccess();
 | 
					            JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4);
 | 
				
			||||||
        } catch (ProcessingException e) {
 | 
					            JsonSchema schema = factory.getSchema(configurationSchema);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Set<ValidationMessage> validationMessages = schema.validate(configuration);
 | 
				
			||||||
 | 
					            return validationMessages.isEmpty();
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
            throw new IncorrectParameterException(e.getMessage(), e);
 | 
					            throw new IncorrectParameterException(e.getMessage(), e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,98 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Copyright © 2016-2025 The Thingsboard Authors
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					package org.thingsboard.server.dao.component;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.JsonNode;
 | 
				
			||||||
 | 
					import org.junit.jupiter.api.BeforeEach;
 | 
				
			||||||
 | 
					import org.junit.jupiter.api.Test;
 | 
				
			||||||
 | 
					import org.mockito.Mockito;
 | 
				
			||||||
 | 
					import org.thingsboard.common.util.JacksonUtil;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.id.TenantId;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.plugin.ComponentClusteringMode;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.plugin.ComponentScope;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.plugin.ComponentType;
 | 
				
			||||||
 | 
					import org.thingsboard.server.dao.exception.IncorrectParameterException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static org.junit.jupiter.api.Assertions.assertFalse;
 | 
				
			||||||
 | 
					import static org.junit.jupiter.api.Assertions.assertThrows;
 | 
				
			||||||
 | 
					import static org.junit.jupiter.api.Assertions.assertTrue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BaseComponentDescriptorServiceTest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private BaseComponentDescriptorService service;
 | 
				
			||||||
 | 
					    private ComponentDescriptor componentDescriptor;
 | 
				
			||||||
 | 
					    private TenantId tenantId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @BeforeEach
 | 
				
			||||||
 | 
					    void setUp() {
 | 
				
			||||||
 | 
					        service = Mockito.spy(BaseComponentDescriptorService.class);
 | 
				
			||||||
 | 
					        tenantId = TenantId.SYS_TENANT_ID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Create a simple component descriptor
 | 
				
			||||||
 | 
					        componentDescriptor = new ComponentDescriptor();
 | 
				
			||||||
 | 
					        componentDescriptor.setType(ComponentType.ACTION);
 | 
				
			||||||
 | 
					        componentDescriptor.setScope(ComponentScope.TENANT);
 | 
				
			||||||
 | 
					        componentDescriptor.setClusteringMode(ComponentClusteringMode.ENABLED);
 | 
				
			||||||
 | 
					        componentDescriptor.setName("Test Component");
 | 
				
			||||||
 | 
					        componentDescriptor.setClazz("org.thingsboard.test.TestComponent");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Create configuration descriptor with schema from JSON string
 | 
				
			||||||
 | 
					        String configDescriptorJson = """
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                  "schema": {
 | 
				
			||||||
 | 
					                    "type": "object",
 | 
				
			||||||
 | 
					                    "properties": {
 | 
				
			||||||
 | 
					                      "testField": {
 | 
				
			||||||
 | 
					                        "type": "string"
 | 
				
			||||||
 | 
					                      }
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "required": ["testField"]
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                }""";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        componentDescriptor.setConfigurationDescriptor(JacksonUtil.toJsonNode(configDescriptorJson));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    void testValidate() {
 | 
				
			||||||
 | 
					        // Create valid configuration from JSON string
 | 
				
			||||||
 | 
					        String validConfigJson = "{\"testField\": \"test value\"}";
 | 
				
			||||||
 | 
					        JsonNode validConfig = JacksonUtil.toJsonNode(validConfigJson);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Create invalid configuration (missing required field) from JSON string
 | 
				
			||||||
 | 
					        String invalidConfigJson = "{}";
 | 
				
			||||||
 | 
					        JsonNode invalidConfig = JacksonUtil.toJsonNode(invalidConfigJson);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Test valid configuration
 | 
				
			||||||
 | 
					        boolean validResult = service.validate(tenantId, componentDescriptor, validConfig);
 | 
				
			||||||
 | 
					        assertTrue(validResult, "Valid configuration should pass validation");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Test invalid configuration
 | 
				
			||||||
 | 
					        boolean invalidResult = service.validate(tenantId, componentDescriptor, invalidConfig);
 | 
				
			||||||
 | 
					        assertFalse(invalidResult, "Invalid configuration should fail validation");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Test with component descriptor without schema
 | 
				
			||||||
 | 
					        ComponentDescriptor noSchemaDescriptor = new ComponentDescriptor(componentDescriptor);
 | 
				
			||||||
 | 
					        noSchemaDescriptor.setConfigurationDescriptor(JacksonUtil.toJsonNode("{}"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Should throw exception when schema is missing
 | 
				
			||||||
 | 
					        assertThrows(IncorrectParameterException.class, () -> {
 | 
				
			||||||
 | 
					            service.validate(tenantId, noSchemaDescriptor, validConfig);
 | 
				
			||||||
 | 
					        }, "Should throw exception when schema is missing");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										10
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								pom.xml
									
									
									
									
									
								
							@ -75,7 +75,7 @@
 | 
				
			|||||||
        <jackson-databind.version>2.17.2</jackson-databind.version>
 | 
					        <jackson-databind.version>2.17.2</jackson-databind.version>
 | 
				
			||||||
        <fasterxml-classmate.version>1.7.0</fasterxml-classmate.version>
 | 
					        <fasterxml-classmate.version>1.7.0</fasterxml-classmate.version>
 | 
				
			||||||
        <auth0-jwt.version>4.4.0</auth0-jwt.version>
 | 
					        <auth0-jwt.version>4.4.0</auth0-jwt.version>
 | 
				
			||||||
        <json-schema-validator.version>2.2.14</json-schema-validator.version>
 | 
					        <json-schema-validator.version>1.5.6</json-schema-validator.version>
 | 
				
			||||||
        <milo.version>0.6.12</milo.version>
 | 
					        <milo.version>0.6.12</milo.version>
 | 
				
			||||||
        <californium.version>3.12.1</californium.version>
 | 
					        <californium.version>3.12.1</californium.version>
 | 
				
			||||||
        <leshan.version>2.0.0-M15</leshan.version>
 | 
					        <leshan.version>2.0.0-M15</leshan.version>
 | 
				
			||||||
@ -1620,15 +1620,9 @@
 | 
				
			|||||||
                <version>${auth0-jwt.version}</version>
 | 
					                <version>${auth0-jwt.version}</version>
 | 
				
			||||||
            </dependency>
 | 
					            </dependency>
 | 
				
			||||||
            <dependency>
 | 
					            <dependency>
 | 
				
			||||||
                <groupId>com.github.java-json-tools</groupId>
 | 
					                <groupId>com.networknt</groupId>
 | 
				
			||||||
                <artifactId>json-schema-validator</artifactId>
 | 
					                <artifactId>json-schema-validator</artifactId>
 | 
				
			||||||
                <version>${json-schema-validator.version}</version>
 | 
					                <version>${json-schema-validator.version}</version>
 | 
				
			||||||
                <exclusions>
 | 
					 | 
				
			||||||
                    <exclusion>
 | 
					 | 
				
			||||||
                        <groupId>com.sun.mail</groupId>
 | 
					 | 
				
			||||||
                        <artifactId>mailapi</artifactId>
 | 
					 | 
				
			||||||
                    </exclusion>
 | 
					 | 
				
			||||||
                </exclusions>
 | 
					 | 
				
			||||||
            </dependency>
 | 
					            </dependency>
 | 
				
			||||||
            <dependency>
 | 
					            <dependency>
 | 
				
			||||||
                <groupId>org.eclipse.leshan</groupId>
 | 
					                <groupId>org.eclipse.leshan</groupId>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user