Browse Source

hidden deprecated schemas, fixed duplicated classes

pull/15379/head
dashevchenko 2 months ago
parent
commit
e56566e91f
  1. 39
      application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java
  2. 2
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/AlarmRule.java
  3. 1
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmCondition.java
  4. 2
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/DurationAlarmCondition.java
  5. 2
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/RepeatingAlarmCondition.java
  6. 2
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/SimpleAlarmCondition.java
  7. 2
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionFilter.java
  8. 3
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/ComplexOperation.java
  9. 1
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/BooleanFilterPredicate.java
  10. 2
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NoDataFilterPredicate.java
  11. 1
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NumericFilterPredicate.java
  12. 1
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/StringFilterPredicate.java
  13. 2
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AlarmScheduleType.java
  14. 2
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AnyTimeSchedule.java
  15. 2
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeSchedule.java
  16. 2
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeScheduleItem.java
  17. 2
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/SpecificTimeSchedule.java
  18. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmCondition.java
  19. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionFilter.java
  20. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmRule.java
  21. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmScheduleType.java
  22. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AnyTimeSchedule.java
  23. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/CustomTimeSchedule.java
  24. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/CustomTimeScheduleItem.java
  25. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/SpecificTimeSchedule.java
  26. 2
      common/data/src/main/java/org/thingsboard/server/common/data/page/SortOrder.java
  27. 2
      common/data/src/main/java/org/thingsboard/server/common/data/transport/resource/ResourceType.java

39
application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java

@ -119,6 +119,8 @@ public class SwaggerConfiguration {
// Keyed by the schema name that swagger-core generates (see resolveSchemaName).
private final Map<String, List<String>> schemaPropertyOrders = new ConcurrentHashMap<>();
private final Map<String, Set<String>> schemaOwnProps = new ConcurrentHashMap<>();
// Tracks schema name → fully-qualified class names to detect collisions.
private final Map<String, Set<String>> schemaNameToClasses = new ConcurrentHashMap<>();
@Value("${swagger.api_path:/api/**}")
private String apiPath;
@ -343,6 +345,10 @@ public class SwaggerConfiguration {
try {
var beanDesc = Json.mapper().getSerializationConfig().introspect(javaType);
String schemaName = resolveSchemaName(javaType);
Set<String> classes = schemaNameToClasses.computeIfAbsent(schemaName, k -> ConcurrentHashMap.newKeySet());
if (classes.add(cls.getName()) && classes.size() > 1) {
log.error("Duplicate OpenAPI schema name '{}' mapped by: {}. Use @Schema(name = ...) to disambiguate.", schemaName, classes);
}
schemaPropertyOrders.put(schemaName, resolvePropertyOrder(cls, beanDesc));
Set<String> ownProps = computeOwnPropNames(cls, beanDesc);
if (!ownProps.isEmpty()) {
@ -390,6 +396,19 @@ public class SwaggerConfiguration {
var apiKeyRequirement = createSecurityRequirement(API_KEY_SCHEME);
return openAPI -> {
// Fail fast on duplicate schema names — two different classes resolving to the same
// OpenAPI schema name causes one to silently overwrite the other.
List<String> duplicates = schemaNameToClasses.entrySet().stream()
.filter(e -> e.getValue().size() > 1)
.map(e -> "'" + e.getKey() + "' mapped by: " + e.getValue())
.sorted()
.toList();
if (!duplicates.isEmpty()) {
throw new IllegalStateException(
"Duplicate OpenAPI schema names detected. Use @Schema(name = ...) to disambiguate:\n "
+ String.join("\n ", duplicates));
}
var paths = openAPI.getPaths();
paths.entrySet().stream()
.peek(entry -> {
@ -885,7 +904,13 @@ public class SwaggerConfiguration {
* This matches the naming convention used by swagger-core's {@code TypeNameResolver}.
*/
private static String resolveSchemaName(JavaType javaType) {
StringBuilder sb = new StringBuilder(javaType.getRawClass().getSimpleName());
Class<?> cls = javaType.getRawClass();
io.swagger.v3.oas.annotations.media.Schema schemaAnnotation =
cls.getAnnotation(io.swagger.v3.oas.annotations.media.Schema.class);
if (schemaAnnotation != null && !schemaAnnotation.name().isEmpty()) {
return schemaAnnotation.name();
}
StringBuilder sb = new StringBuilder(cls.getSimpleName());
if (javaType.hasGenericTypes()) {
for (int i = 0; i < javaType.containedTypeCount(); i++) {
JavaType param = javaType.containedType(i);
@ -990,8 +1015,14 @@ public class SwaggerConfiguration {
// Map backing field names to their JSON property names (respects @JsonProperty)
Map<String, String> fieldToJsonName = new LinkedHashMap<>();
for (var prop : beanDesc.findProperties()) {
if (prop.getField() != null && prop.couldSerialize()) {
fieldToJsonName.put(prop.getField().getName(), prop.getName());
if (prop.couldSerialize()) {
if (prop.getField() != null) {
fieldToJsonName.put(prop.getField().getName(), prop.getName());
} else {
// For transient fields, Jackson may not associate the field with the property.
// Fall back to using the property name as the field name key.
fieldToJsonName.putIfAbsent(prop.getName(), prop.getName());
}
}
}
@ -1026,4 +1057,4 @@ public class SwaggerConfiguration {
.value(node);
}
}
}

2
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/AlarmRule.java

@ -25,7 +25,7 @@ import org.thingsboard.server.common.data.alarm.rule.condition.AlarmCondition;
import io.swagger.v3.oas.annotations.media.Schema;
import org.thingsboard.server.common.data.id.DashboardId;
@Schema(name = "AlarmRuleDefinition")
@Schema
@Data
@AllArgsConstructor
@NoArgsConstructor

1
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/AlarmCondition.java

@ -32,7 +32,6 @@ import org.thingsboard.server.common.data.alarm.rule.condition.schedule.AlarmSch
import org.thingsboard.server.common.data.alarm.rule.condition.schedule.AnyTimeSchedule;
@Schema(
name = "AlarmRuleCondition",
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "SIMPLE", schema = SimpleAlarmCondition.class),

2
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/DurationAlarmCondition.java

@ -25,7 +25,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import java.util.concurrent.TimeUnit;
@Schema(name = "AlarmRuleDurationCondition")
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)

2
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/RepeatingAlarmCondition.java

@ -22,7 +22,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(name = "AlarmRuleRepeatingCondition")
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)

2
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/SimpleAlarmCondition.java

@ -17,7 +17,7 @@ package org.thingsboard.server.common.data.alarm.rule.condition;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(name = "AlarmRuleSimpleCondition")
@Schema
public class SimpleAlarmCondition extends AlarmCondition {
@Override

2
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionFilter.java

@ -31,7 +31,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import java.io.Serializable;
import java.util.List;
@Schema(name = "AlarmRuleConditionFilter")
@Schema
@Data
public class AlarmConditionFilter implements Serializable {

3
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/ComplexOperation.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.alarm.rule.condition.expression;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(name = "AlarmRuleComplexOperation")
public enum ComplexOperation {
AND,
OR

1
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/BooleanFilterPredicate.java

@ -37,6 +37,7 @@ public class BooleanFilterPredicate implements SimpleKeyFilterPredicate<Boolean>
return FilterPredicateType.BOOLEAN;
}
@Schema(name = "AlarmRuleBooleanOperation")
public enum BooleanOperation {
EQUAL,
NOT_EQUAL

2
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NoDataFilterPredicate.java

@ -25,7 +25,7 @@ import org.thingsboard.server.common.data.alarm.rule.condition.AlarmConditionVal
import java.util.concurrent.TimeUnit;
@Schema(name = "AlarmRuleNoDataFilterPredicate")
@Schema
@Data
@AllArgsConstructor
@NoArgsConstructor

1
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/NumericFilterPredicate.java

@ -41,6 +41,7 @@ public class NumericFilterPredicate implements SimpleKeyFilterPredicate<Double>
return FilterPredicateType.NUMERIC;
}
@Schema(name = "AlarmRuleNumericOperation")
public enum NumericOperation {
EQUAL,
NOT_EQUAL,

1
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/predicate/StringFilterPredicate.java

@ -38,6 +38,7 @@ public class StringFilterPredicate implements SimpleKeyFilterPredicate<String> {
return FilterPredicateType.STRING;
}
@Schema(name= "AlarmRuleStringOperation")
public enum StringOperation {
EQUAL,
NOT_EQUAL,

2
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AlarmScheduleType.java

@ -17,7 +17,7 @@ package org.thingsboard.server.common.data.alarm.rule.condition.schedule;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(name = "AlarmRuleScheduleType")
@Schema
public enum AlarmScheduleType {
ANY_TIME,
SPECIFIC_TIME,

2
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/AnyTimeSchedule.java

@ -17,7 +17,7 @@ package org.thingsboard.server.common.data.alarm.rule.condition.schedule;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(name = "AlarmRuleAnyTimeSchedule")
@Schema
public class AnyTimeSchedule implements AlarmSchedule {
@Override

2
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeSchedule.java

@ -20,7 +20,7 @@ import lombok.Data;
import java.util.List;
@Schema(name = "AlarmRuleCustomTimeSchedule")
@Schema
@Data
public class CustomTimeSchedule implements AlarmSchedule {

2
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/CustomTimeScheduleItem.java

@ -21,7 +21,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import java.io.Serializable;
@Schema(name = "AlarmRuleCustomTimeScheduleItem")
@Schema
@Data
public class CustomTimeScheduleItem implements Serializable {

2
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/schedule/SpecificTimeSchedule.java

@ -20,7 +20,7 @@ import lombok.Data;
import java.util.Set;
@Schema(name = "AlarmRuleSpecificTimeSchedule")
@Schema
@Data
public class SpecificTimeSchedule implements AlarmSchedule {

2
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmCondition.java

@ -24,7 +24,7 @@ import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Schema
@Schema(hidden = true)
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@Deprecated

2
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionFilter.java

@ -24,7 +24,7 @@ import org.thingsboard.server.common.data.validation.NoXss;
import java.io.Serializable;
@Schema
@Schema(hidden = true)
@Data
@Deprecated
public class AlarmConditionFilter implements Serializable {

2
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmRule.java

@ -24,7 +24,7 @@ import org.thingsboard.server.common.data.validation.NoXss;
import java.io.Serial;
import java.io.Serializable;
@Schema
@Schema(hidden = true)
@Data
@Deprecated
public class AlarmRule implements Serializable {

3
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmScheduleType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(hidden = true)
@Deprecated
public enum AlarmScheduleType {

2
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AnyTimeSchedule.java

@ -15,8 +15,10 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.Schema;
import org.thingsboard.server.common.data.query.DynamicValue;
@Schema(hidden = true)
@Deprecated
public class AnyTimeSchedule implements AlarmSchedule {

2
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/CustomTimeSchedule.java

@ -15,11 +15,13 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.query.DynamicValue;
import java.util.List;
@Schema(hidden = true)
@Data
@Deprecated
public class CustomTimeSchedule implements AlarmSchedule {

2
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/CustomTimeScheduleItem.java

@ -15,10 +15,12 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
@Schema(hidden = true)
@Data
@Deprecated
public class CustomTimeScheduleItem implements Serializable {

2
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/SpecificTimeSchedule.java

@ -15,11 +15,13 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.query.DynamicValue;
import java.util.Set;
@Schema(hidden = true)
@Data
@Deprecated
public class SpecificTimeSchedule implements AlarmSchedule {

2
common/data/src/main/java/org/thingsboard/server/common/data/page/SortOrder.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.page;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@ -36,6 +37,7 @@ public class SortOrder {
return new SortOrder(property, direction);
}
@Schema(name = "SortOrderDirection")
public static enum Direction {
ASC, DESC
}

2
common/data/src/main/java/org/thingsboard/server/common/data/transport/resource/ResourceType.java

@ -17,7 +17,7 @@ package org.thingsboard.server.common.data.transport.resource;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(name = "TransportResourceType")
@Schema(hidden = true)
public enum ResourceType {
LWM2M_MODEL, JKS, PKCS_12
}

Loading…
Cancel
Save