Skip to content

Commit

Permalink
Merge pull request #130 from hivemq/fix/129/duplicate-entity-metadata
Browse files Browse the repository at this point in the history
Fix(129) - Remove duplicated config schema attributes which yeilds messy configuration forms
  • Loading branch information
simon622 authored Sep 26, 2023
2 parents 2d4b0d2 + 19747c1 commit 1de5d82
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -123,13 +123,17 @@ private Integer arrayMaxItems(final @NotNull MemberScope<?, ?> memberScope) {
}

private String title(final @NotNull MemberScope<?, ?> memberScope) {
//-- We should not allow duplication of titles for wrapped types
if(memberScope.isFakeContainerItemScope()) return null;
final ModuleConfigField fieldInfo = getModuleFieldInfo(memberScope);
return fieldInfo != null && fieldInfo.title() != null && !fieldInfo.title().isBlank() ?
fieldInfo.title() :
null;
}

private String description(final @NotNull MemberScope<?, ?> memberScope) {
//-- We should not allow duplication of descriptions for wrapped types
if(memberScope.isFakeContainerItemScope()) return null;
final ModuleConfigField fieldInfo = getModuleFieldInfo(memberScope);
return fieldInfo != null && fieldInfo.description() != null && !fieldInfo.description().isBlank() ?
fieldInfo.description() :
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,24 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.google.common.base.Preconditions;
import com.hivemq.api.json.CustomConfigSchemaGenerator;
import com.hivemq.edge.modules.adapters.annotations.ModuleConfigField;
import com.hivemq.edge.modules.config.impl.AbstractProtocolAdapterConfig;
import com.hivemq.extension.sdk.api.annotations.NotNull;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import wiremock.org.custommonkey.xmlunit.NodeTestException;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


/**
Expand Down Expand Up @@ -44,13 +50,50 @@ public void testPropertyOrdering() {
Assertions.assertEquals("Identifier", nodes.next().get("title").textValue(), "Identifier Should be Last");
}

// @Test
// public void testHttpConfig() throws JsonProcessingException {
//
// CustomConfigSchemaGenerator generator = new CustomConfigSchemaGenerator();
// JsonNode node = generator.generateJsonSchema(HttpAdapterConfig.class);
@Test
public void testNestedEntitySchemaDuplication() {

CustomConfigSchemaGenerator generator = new CustomConfigSchemaGenerator();
JsonNode node = generator.generateJsonSchema(TestNestedEntity.class);
// System.err.println(mapper.writeValueAsString(node));
// }
JsonNode propertiesNode = node.get("properties");
JsonNode subscriptions = findFirstChild(propertiesNode, "subscriptions");
JsonNode subscriptionItems = findFirstChild(subscriptions, "items");
Assertions.assertFalse(hasImmediateChild(subscriptionItems, "title"), "Wrapped typed should not have a duplicate title");
Assertions.assertFalse(hasImmediateChild(subscriptionItems, "description"), "Wrapped typed should not have a duplicate description");
}

@Test
public void testCustomAttributesAppearInSchema() {

CustomConfigSchemaGenerator generator = new CustomConfigSchemaGenerator();
JsonNode node = generator.generateJsonSchema(TestNestedEntity.class);
JsonNode propertiesNode = node.get("properties");
JsonNode subscriptions = findFirstChild(propertiesNode, "subscriptions");
JsonNode subscriptionItems = findFirstChild(subscriptions, "items");
Assertions.assertTrue(hasImmediateChild(subscriptionItems, "testAttributeName"), "Wrapped typed should have a test-attribute");
}

private static JsonNode findFirstChild(final @NotNull JsonNode parent, final @NotNull String nodeName){
Preconditions.checkNotNull(parent);
JsonNode child = parent.get(nodeName);
if(child != null){
return child;
} else {
Iterator<JsonNode> nodes = parent.iterator();
while (nodes.hasNext()){
if((child = findFirstChild(nodes.next(), nodeName)) != null){
return child;
}
}
}
return null;
}

private static boolean hasImmediateChild(final @NotNull JsonNode parent, final @NotNull String nodeName){
Preconditions.checkNotNull(parent);
return parent.get(nodeName) != null;
}

@JsonPropertyOrder({"startIdx", "endIdx"})
static class TestOrderingConfig extends AbstractProtocolAdapterConfig {
Expand All @@ -63,4 +106,15 @@ static class TestOrderingConfig extends AbstractProtocolAdapterConfig {
@ModuleConfigField(title = "End Index")
int endIdx;
}

static class TestNestedEntity extends AbstractProtocolAdapterConfig {

@JsonProperty("subscriptions")
@ModuleConfigField(title = "Subscriptions",
description = "Map your sensor data to MQTT Topics", customAttributes = {
@ModuleConfigField.CustomAttribute(name = "testAttributeName", value = "testAttributeValue")
})
private @NotNull List<Subscription> subscriptions = new ArrayList<>();

}
}

0 comments on commit 1de5d82

Please sign in to comment.