Fix sonar findings (#2769)

Signed-off-by: Avgustin Marinov <Avgustin.Marinov@bosch.com>
This commit is contained in:
Avgustin Marinov
2025-10-22 15:12:37 +03:00
committed by GitHub
parent 1b62bee92f
commit a3cf835ae2
10 changed files with 28 additions and 44 deletions

View File

@@ -23,7 +23,6 @@ import java.io.StringWriter;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Random;
import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonGenerator;

View File

@@ -26,7 +26,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.NoSuchElementException;
import org.eclipse.hawkbit.ddi.rest.api.DdiRestConstants; import org.eclipse.hawkbit.ddi.rest.api.DdiRestConstants;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;

View File

@@ -33,13 +33,11 @@ import org.eclipse.hawkbit.repository.jpa.rsql.legacy.SpecificationBuilderLegacy
import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver; import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.orm.jpa.vendor.Database;
/** /**
* A utility class which is able to parse RSQL strings into an spring data * A utility class which is able to parse RSQL strings into an spring data
@@ -114,7 +112,6 @@ public class QLSupport implements ApplicationListener<ContextRefreshedEvent> {
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({ "rawtypes", "unchecked" })
private QueryParser parser; private QueryParser parser;
private List<NodeTransformer> nodeTransformers; private List<NodeTransformer> nodeTransformers;
private Database database;
private EntityManager entityManager; private EntityManager entityManager;
private VirtualPropertyResolver virtualPropertyResolver; private VirtualPropertyResolver virtualPropertyResolver;
@@ -139,11 +136,6 @@ public class QLSupport implements ApplicationListener<ContextRefreshedEvent> {
}).toList(); }).toList();
} }
@Autowired
void setDatabase(final JpaProperties jpaProperties) {
database = jpaProperties.getDatabase();
}
@Autowired @Autowired
void setEntityManager(final EntityManager entityManager) { void setEntityManager(final EntityManager entityManager) {
this.entityManager = entityManager; this.entityManager = entityManager;
@@ -171,15 +163,15 @@ public class QLSupport implements ApplicationListener<ContextRefreshedEvent> {
*/ */
public <A extends Enum<A> & QueryField, T> Specification<T> buildSpec(final String query, final Class<A> queryFieldType) { public <A extends Enum<A> & QueryField, T> Specification<T> buildSpec(final String query, final Class<A> queryFieldType) {
if (specBuilder == SpecBuilder.G3) { if (specBuilder == SpecBuilder.G3) {
return new SpecificationBuilder<T>(ignoreCase && !caseInsensitiveDB , database) return new SpecificationBuilder<T>(ignoreCase && !caseInsensitiveDB)
.specification(transform(parse(query, queryFieldType), queryFieldType)); .specification(transform(parse(query, queryFieldType), queryFieldType));
} else { } else {
return new SpecificationBuilderLegacy<A, T>(queryFieldType, virtualPropertyResolver, database).specification(query); return new SpecificationBuilderLegacy<A, T>(queryFieldType, virtualPropertyResolver).specification(query);
} }
} }
public <A extends Enum<A> & QueryField, T> Specification<T> buildSpec(final Node query, final Class<A> queryFieldType) { public <A extends Enum<A> & QueryField, T> Specification<T> buildSpec(final Node query, final Class<A> queryFieldType) {
return new SpecificationBuilder<T>(ignoreCase && !caseInsensitiveDB , database) return new SpecificationBuilder<T>(ignoreCase && !caseInsensitiveDB)
.specification(transform(query, queryFieldType)); .specification(transform(query, queryFieldType));
} }

View File

@@ -55,7 +55,6 @@ import org.eclipse.hawkbit.repository.jpa.ql.Node.Comparison;
import org.eclipse.hawkbit.repository.jpa.ql.Node.Comparison.Operator; import org.eclipse.hawkbit.repository.jpa.ql.Node.Comparison.Operator;
import org.eclipse.hawkbit.repository.jpa.ql.Node.Logical; import org.eclipse.hawkbit.repository.jpa.ql.Node.Logical;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
@Slf4j @Slf4j
@@ -64,11 +63,9 @@ public class SpecificationBuilder<T> {
private static final char ESCAPE_CHAR = '\\'; private static final char ESCAPE_CHAR = '\\';
private final boolean ensureIgnoreCase; private final boolean ensureIgnoreCase;
private final Database database;
public SpecificationBuilder(final boolean ensureIgnoreCase, final Database database) { public SpecificationBuilder(final boolean ensureIgnoreCase) {
this.ensureIgnoreCase = ensureIgnoreCase; this.ensureIgnoreCase = ensureIgnoreCase;
this.database = database;
} }
public Specification<T> specification(final Node node) { public Specification<T> specification(final Node node) {

View File

@@ -49,7 +49,6 @@ import org.eclipse.hawkbit.repository.exception.RSQLParameterUnsupportedFieldExc
import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver; import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver;
import org.springframework.beans.SimpleTypeConverter; import org.springframework.beans.SimpleTypeConverter;
import org.springframework.beans.TypeMismatchException; import org.springframework.beans.TypeMismatchException;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
@@ -77,7 +76,6 @@ public class JpaQueryRsqlVisitor<A extends Enum<A> & QueryField, T> extends Abst
private final CriteriaBuilder cb; private final CriteriaBuilder cb;
private final CriteriaQuery<?> query; private final CriteriaQuery<?> query;
private final Database database;
private final boolean ensureIgnoreCase; private final boolean ensureIgnoreCase;
private final Root<T> root; private final Root<T> root;
private final VirtualPropertyResolver virtualPropertyResolver; private final VirtualPropertyResolver virtualPropertyResolver;
@@ -89,7 +87,7 @@ public class JpaQueryRsqlVisitor<A extends Enum<A> & QueryField, T> extends Abst
public JpaQueryRsqlVisitor( public JpaQueryRsqlVisitor(
final Root<T> root, final CriteriaBuilder cb, final Class<A> enumType, final Root<T> root, final CriteriaBuilder cb, final Class<A> enumType,
final VirtualPropertyResolver virtualPropertyResolver, final Database database, final VirtualPropertyResolver virtualPropertyResolver,
final CriteriaQuery<?> query, final boolean ensureIgnoreCase) { final CriteriaQuery<?> query, final boolean ensureIgnoreCase) {
super(enumType); super(enumType);
this.root = root; this.root = root;
@@ -97,7 +95,6 @@ public class JpaQueryRsqlVisitor<A extends Enum<A> & QueryField, T> extends Abst
this.query = query; this.query = query;
this.virtualPropertyResolver = virtualPropertyResolver; this.virtualPropertyResolver = virtualPropertyResolver;
this.simpleTypeConverter = new SimpleTypeConverter(); this.simpleTypeConverter = new SimpleTypeConverter();
this.database = database;
this.ensureIgnoreCase = ensureIgnoreCase; this.ensureIgnoreCase = ensureIgnoreCase;
} }
@@ -334,7 +331,8 @@ public class JpaQueryRsqlVisitor<A extends Enum<A> & QueryField, T> extends Abst
final Predicate mapPredicate = mapToMapPredicate(fieldPath, queryPath); final Predicate mapPredicate = mapToMapPredicate(fieldPath, queryPath);
final Predicate valuePredicate = addOperatorPredicate(node, queryPath.getEnumValue().isMap() ? (Path)toMapValuePath(fieldPath) : fieldPath, transformedValues, value, queryPath); final Predicate valuePredicate = addOperatorPredicate(node,
queryPath.getEnumValue().isMap() ? (Path) toMapValuePath(fieldPath) : fieldPath, transformedValues, value, queryPath);
return toSingleList(mapPredicate != null ? cb.and(mapPredicate, valuePredicate) : valuePredicate); return toSingleList(mapPredicate != null ? cb.and(mapPredicate, valuePredicate) : valuePredicate);
} }
@@ -495,7 +493,7 @@ public class JpaQueryRsqlVisitor<A extends Enum<A> & QueryField, T> extends Abst
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({ "rawtypes", "unchecked" })
private Expression<String> getExpressionToCompare(final Path innerFieldPath, final A enumField) { private Expression<String> getExpressionToCompare(final Path innerFieldPath, final A enumField) {
if (enumField.isMap()){ if (enumField.isMap()) {
return toMapValuePath(innerFieldPath); return toMapValuePath(innerFieldPath);
} else { } else {
return pathOfString(innerFieldPath); return pathOfString(innerFieldPath);

View File

@@ -46,7 +46,6 @@ import org.eclipse.hawkbit.repository.exception.RSQLParameterSyntaxException;
import org.eclipse.hawkbit.repository.exception.RSQLParameterUnsupportedFieldException; import org.eclipse.hawkbit.repository.exception.RSQLParameterUnsupportedFieldException;
import org.eclipse.hawkbit.repository.jpa.ql.SpecificationBuilder; import org.eclipse.hawkbit.repository.jpa.ql.SpecificationBuilder;
import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver; import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
@@ -56,9 +55,9 @@ import org.springframework.util.ObjectUtils;
* @param <A> the enum for providing the field name of the entity field to filter on. * @param <A> the enum for providing the field name of the entity field to filter on.
* @param <T> the entity type referenced by the root * @param <T> the entity type referenced by the root
* @deprecated Old implementation of RSQL Visitor (G2). Deprecated in favour of next gen implementation - * @deprecated Old implementation of RSQL Visitor (G2). Deprecated in favour of next gen implementation -
* {@link SpecificationBuilder}. * {@link SpecificationBuilder}.
* It will be kept for some time in order to keep backward compatibility and to allow for a smooth transition. Also, in case of * It will be kept for some time in order to keep backward compatibility and to allow for a smooth transition. Also, in case of
* problems with the new implementation, this one can be used as a fallback. * problems with the new implementation, this one can be used as a fallback.
*/ */
@Deprecated(forRemoval = true, since = "0.9.0") @Deprecated(forRemoval = true, since = "0.9.0")
@Slf4j @Slf4j
@@ -72,7 +71,6 @@ public class JpaQueryRsqlVisitorG2<A extends Enum<A> & QueryField, T>
private final Root<T> root; private final Root<T> root;
private final CriteriaQuery<?> query; private final CriteriaQuery<?> query;
private final CriteriaBuilder cb; private final CriteriaBuilder cb;
private final Database database;
private final VirtualPropertyResolver virtualPropertyResolver; private final VirtualPropertyResolver virtualPropertyResolver;
private final boolean ensureIgnoreCase; private final boolean ensureIgnoreCase;
@@ -82,13 +80,12 @@ public class JpaQueryRsqlVisitorG2<A extends Enum<A> & QueryField, T>
public JpaQueryRsqlVisitorG2( public JpaQueryRsqlVisitorG2(
final Class<A> enumType, final Class<A> enumType,
final Root<T> root, final CriteriaQuery<?> query, final CriteriaBuilder cb, final Root<T> root, final CriteriaQuery<?> query, final CriteriaBuilder cb,
final Database database, final VirtualPropertyResolver virtualPropertyResolver, final boolean ensureIgnoreCase) { final VirtualPropertyResolver virtualPropertyResolver, final boolean ensureIgnoreCase) {
super(enumType); super(enumType);
this.root = root; this.root = root;
this.cb = cb; this.cb = cb;
this.query = query; this.query = query;
this.virtualPropertyResolver = virtualPropertyResolver; this.virtualPropertyResolver = virtualPropertyResolver;
this.database = database;
this.ensureIgnoreCase = ensureIgnoreCase; this.ensureIgnoreCase = ensureIgnoreCase;
} }
@@ -150,7 +147,8 @@ public class JpaQueryRsqlVisitorG2<A extends Enum<A> & QueryField, T>
mapEntryKeyPredicate = null; mapEntryKeyPredicate = null;
} }
final Predicate valuePredicate = toOperatorAndValuePredicate(node, queryPath, queryPath.getEnumValue().isMap() ? toMapValuePath(fieldPath) : fieldPath, values); final Predicate valuePredicate = toOperatorAndValuePredicate(node, queryPath,
queryPath.getEnumValue().isMap() ? toMapValuePath(fieldPath) : fieldPath, values);
return mapEntryKeyPredicate == null ? valuePredicate : cb.and(mapEntryKeyPredicate, valuePredicate); return mapEntryKeyPredicate == null ? valuePredicate : cb.and(mapEntryKeyPredicate, valuePredicate);
} }

View File

@@ -9,8 +9,8 @@
*/ */
package org.eclipse.hawkbit.repository.jpa.rsql.legacy; package org.eclipse.hawkbit.repository.jpa.rsql.legacy;
import static org.eclipse.hawkbit.repository.jpa.rsql.legacy.AbstractRSQLVisitor.OPERATORS;
import static org.eclipse.hawkbit.repository.jpa.ql.QLSupport.SpecBuilder.LEGACY_G1; import static org.eclipse.hawkbit.repository.jpa.ql.QLSupport.SpecBuilder.LEGACY_G1;
import static org.eclipse.hawkbit.repository.jpa.rsql.legacy.AbstractRSQLVisitor.OPERATORS;
import java.util.List; import java.util.List;
@@ -23,15 +23,14 @@ import cz.jirutka.rsql.parser.ast.RSQLVisitor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.hawkbit.repository.QueryField; import org.eclipse.hawkbit.repository.QueryField;
import org.eclipse.hawkbit.repository.exception.RSQLParameterSyntaxException; import org.eclipse.hawkbit.repository.exception.RSQLParameterSyntaxException;
import org.eclipse.hawkbit.repository.jpa.ql.SpecificationBuilder;
import org.eclipse.hawkbit.repository.jpa.ql.QLSupport; import org.eclipse.hawkbit.repository.jpa.ql.QLSupport;
import org.eclipse.hawkbit.repository.jpa.ql.SpecificationBuilder;
import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver; import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
/** /**
* @deprecated Old implementation of RSQL Visitor (G2). Deprecated in favour of next gen implementation - {@link SpecificationBuilder}. * @deprecated Old implementation of RSQL Visitor (G2). Deprecated in favour of next gen implementation - {@link SpecificationBuilder}.
*/ */
@Deprecated(forRemoval = true, since = "0.9.0") @Deprecated(forRemoval = true, since = "0.9.0")
@Slf4j @Slf4j
@@ -39,13 +38,10 @@ public class SpecificationBuilderLegacy<A extends Enum<A> & QueryField, T> {
private final Class<A> rsqlQueryFieldType; private final Class<A> rsqlQueryFieldType;
private final VirtualPropertyResolver virtualPropertyResolver; private final VirtualPropertyResolver virtualPropertyResolver;
private final Database database;
public SpecificationBuilderLegacy( public SpecificationBuilderLegacy(final Class<A> rsqlQueryFieldType, final VirtualPropertyResolver virtualPropertyResolver) {
final Class<A> rsqlQueryFieldType, final VirtualPropertyResolver virtualPropertyResolver, final Database database) {
this.rsqlQueryFieldType = rsqlQueryFieldType; this.rsqlQueryFieldType = rsqlQueryFieldType;
this.virtualPropertyResolver = virtualPropertyResolver; this.virtualPropertyResolver = virtualPropertyResolver;
this.database = database;
} }
public Specification<T> specification(final String rsql) { public Specification<T> specification(final String rsql) {
@@ -58,8 +54,8 @@ public class SpecificationBuilderLegacy<A extends Enum<A> & QueryField, T> {
final boolean ensureIgnoreCase = !qlSupport.isCaseInsensitiveDB() && qlSupport.isIgnoreCase(); final boolean ensureIgnoreCase = !qlSupport.isCaseInsensitiveDB() && qlSupport.isIgnoreCase();
final RSQLVisitor<List<Predicate>, String> jpqQueryRSQLVisitor = final RSQLVisitor<List<Predicate>, String> jpqQueryRSQLVisitor =
qlSupport.getSpecBuilder() == LEGACY_G1 qlSupport.getSpecBuilder() == LEGACY_G1
? new JpaQueryRsqlVisitor<>(root, cb, rsqlQueryFieldType, virtualPropertyResolver, database, query, ensureIgnoreCase) ? new JpaQueryRsqlVisitor<>(root, cb, rsqlQueryFieldType, virtualPropertyResolver, query, ensureIgnoreCase)
: new JpaQueryRsqlVisitorG2<>(rsqlQueryFieldType, root, query, cb, database, virtualPropertyResolver, ensureIgnoreCase); : new JpaQueryRsqlVisitorG2<>(rsqlQueryFieldType, root, query, cb, virtualPropertyResolver, ensureIgnoreCase);
final List<Predicate> accept = rootNode.accept(jpqQueryRSQLVisitor); final List<Predicate> accept = rootNode.accept(jpqQueryRSQLVisitor);
if (CollectionUtils.isEmpty(accept)) { if (CollectionUtils.isEmpty(accept)) {

View File

@@ -22,13 +22,12 @@ import org.eclipse.hawkbit.repository.jpa.ql.QLSupport.SpecBuilder;
import org.eclipse.hawkbit.repository.jpa.rsql.legacy.SpecificationBuilderLegacy; import org.eclipse.hawkbit.repository.jpa.rsql.legacy.SpecificationBuilderLegacy;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.orm.jpa.vendor.Database;
@SuppressWarnings("java:S2699") // java:S2699 - assertions are un the super methods that are called @SuppressWarnings("java:S2699") // java:S2699 - assertions are un the super methods that are called
@Slf4j @Slf4j
class SpecificationBuilderLegacyTest extends SpecificationBuilderTest { class SpecificationBuilderLegacyTest extends SpecificationBuilderTest {
private final SpecificationBuilderLegacy<RootField, Root> builder = new SpecificationBuilderLegacy<>(RootField.class, null, Database.H2); private final SpecificationBuilderLegacy<RootField, Root> builder = new SpecificationBuilderLegacy<>(RootField.class, null);
private static void runWithRsqlToSpecBuilder(final Runnable runnable, final SpecBuilder rsqlToSpecBuilder) { private static void runWithRsqlToSpecBuilder(final Runnable runnable, final SpecBuilder rsqlToSpecBuilder) {
final SpecBuilder defaultBuilder = QLSupport.getInstance().getSpecBuilder(); final SpecBuilder defaultBuilder = QLSupport.getInstance().getSpecBuilder();
@@ -44,6 +43,7 @@ class SpecificationBuilderLegacyTest extends SpecificationBuilderTest {
void singularStringAttributeG1() { void singularStringAttributeG1() {
runWithRsqlToSpecBuilder(super::singularStringAttribute, LEGACY_G1); runWithRsqlToSpecBuilder(super::singularStringAttribute, LEGACY_G1);
} }
@Override @Override
@Test @Test
void singularStringAttribute() { void singularStringAttribute() {
@@ -54,6 +54,7 @@ class SpecificationBuilderLegacyTest extends SpecificationBuilderTest {
void singularIntAttributeG1() { void singularIntAttributeG1() {
runWithRsqlToSpecBuilder(super::singularIntAttribute, LEGACY_G1); runWithRsqlToSpecBuilder(super::singularIntAttribute, LEGACY_G1);
} }
@Override @Override
@Test @Test
void singularIntAttribute() { void singularIntAttribute() {
@@ -64,6 +65,7 @@ class SpecificationBuilderLegacyTest extends SpecificationBuilderTest {
void singularEntityAttributeG1() { void singularEntityAttributeG1() {
runWithRsqlToSpecBuilder(super::singularEntityAttribute, LEGACY_G1); runWithRsqlToSpecBuilder(super::singularEntityAttribute, LEGACY_G1);
} }
@Override @Override
@Test @Test
void singularEntityAttribute() { void singularEntityAttribute() {
@@ -74,6 +76,7 @@ class SpecificationBuilderLegacyTest extends SpecificationBuilderTest {
void pluralSubSetAttributeG1() { void pluralSubSetAttributeG1() {
runWithRsqlToSpecBuilder(super::pluralSubSetAttribute, LEGACY_G1); runWithRsqlToSpecBuilder(super::pluralSubSetAttribute, LEGACY_G1);
} }
@Override @Override
@Test @Test
void pluralSubSetAttribute() { void pluralSubSetAttribute() {
@@ -91,6 +94,7 @@ class SpecificationBuilderLegacyTest extends SpecificationBuilderTest {
void singularEntitySubSubAttributeG1() { void singularEntitySubSubAttributeG1() {
runWithRsqlToSpecBuilder(super::singularEntitySubSubAttribute, LEGACY_G1); runWithRsqlToSpecBuilder(super::singularEntitySubSubAttribute, LEGACY_G1);
} }
@Override @Override
@Test @Test
void singularEntitySubSubAttribute() { void singularEntitySubSubAttribute() {

View File

@@ -51,7 +51,7 @@ class SpecificationBuilderTest {
@Autowired @Autowired
private EntityManager entityManager; private EntityManager entityManager;
private final SpecificationBuilder<Root> builder = new SpecificationBuilder<>(false, Database.H2); private final SpecificationBuilder<Root> builder = new SpecificationBuilder<>(false);
@Test @Test
void singularStringAttribute() { void singularStringAttribute() {

View File

@@ -125,6 +125,7 @@ class OfflineDsAssignmentStrategy extends AbstractDsAssignmentStrategy {
@Override @Override
public void cancelActiveActions(final List<List<Long>> targetIds) { public void cancelActiveActions(final List<List<Long>> targetIds) {
// Not supported by offline case
} }
@Override @Override