From 4434484d356eeb04cdccd8b2c1386b30ac9156c8 Mon Sep 17 00:00:00 2001 From: Avgustin Marinov Date: Fri, 26 Sep 2025 14:56:32 +0300 Subject: [PATCH] Deprecate VirtualPropertyReplacer (#2697) Signed-off-by: Avgustin Marinov --- .../JpaRepositoryAutoConfiguration.java | 13 ------------ .../hawkbit/repository/ActionFields.java | 4 ++-- .../rsql/VirtualPropertyReplacer.java | 3 +++ .../hawkbit/repository/jpa/ql/QLSupport.java | 14 +++++++------ .../jpa/JpaRepositoryConfiguration.java | 21 +++++++++++++++++-- 5 files changed, 32 insertions(+), 23 deletions(-) diff --git a/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/repository/JpaRepositoryAutoConfiguration.java b/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/repository/JpaRepositoryAutoConfiguration.java index 65ad702c9..b4aa3980b 100644 --- a/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/repository/JpaRepositoryAutoConfiguration.java +++ b/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/repository/JpaRepositoryAutoConfiguration.java @@ -10,11 +10,7 @@ package org.eclipse.hawkbit.autoconfigure.repository; import org.eclipse.hawkbit.repository.jpa.JpaRepositoryConfiguration; -import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; -import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -25,13 +21,4 @@ import org.springframework.context.annotation.Import; @ConditionalOnClass({ JpaRepositoryConfiguration.class }) @Import({ JpaRepositoryConfiguration.class }) public class JpaRepositoryAutoConfiguration { - - /** - * @return returns a VirtualPropertyReplacer - */ - @Bean - @ConditionalOnMissingBean - public VirtualPropertyReplacer virtualPropertyReplacer() { - return new VirtualPropertyResolver(); - } } \ No newline at end of file diff --git a/hawkbit-core/src/main/java/org/eclipse/hawkbit/repository/ActionFields.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/repository/ActionFields.java index 686cda9ae..a3b0de73c 100644 --- a/hawkbit-core/src/main/java/org/eclipse/hawkbit/repository/ActionFields.java +++ b/hawkbit-core/src/main/java/org/eclipse/hawkbit/repository/ActionFields.java @@ -20,8 +20,8 @@ import lombok.Getter; public enum ActionFields implements QueryField, FieldValueConverter { ID("id"), - STATUS("active"), - DETAILSTATUS("status"), + STATUS("active"), // true if status is "pending", false if "finished" + DETAILSTATUS("status"), // real status LASTSTATUSCODE("lastActionStatusCode"), CREATEDAT("createdAt"), CREATEDBY("createdBy"), diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/rsql/VirtualPropertyReplacer.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/rsql/VirtualPropertyReplacer.java index b739dc78c..fb3449170 100644 --- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/rsql/VirtualPropertyReplacer.java +++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/rsql/VirtualPropertyReplacer.java @@ -15,7 +15,10 @@ import java.io.Serializable; * Implementations map a placeholder to the associated value. *

* This is used in context of string replacement. + * + * @deprecated Since 0.10.0, used only in deprecated specification builders */ +@Deprecated(since = "0.10.0", forRemoval = true) @FunctionalInterface public interface VirtualPropertyReplacer extends Serializable { diff --git a/hawkbit-repository/hawkbit-repository-jpa-ql/src/main/java/org/eclipse/hawkbit/repository/jpa/ql/QLSupport.java b/hawkbit-repository/hawkbit-repository-jpa-ql/src/main/java/org/eclipse/hawkbit/repository/jpa/ql/QLSupport.java index 1d732ba83..c0dee535d 100644 --- a/hawkbit-repository/hawkbit-repository-jpa-ql/src/main/java/org/eclipse/hawkbit/repository/jpa/ql/QLSupport.java +++ b/hawkbit-repository/hawkbit-repository-jpa-ql/src/main/java/org/eclipse/hawkbit/repository/jpa/ql/QLSupport.java @@ -181,12 +181,13 @@ public class QLSupport { public static class DefaultQueryParser implements QueryParser { - private VirtualPropertyReplacer virtualPropertyReplacer; - - @Autowired(required = false) - void setVirtualPropertyReplacer(final VirtualPropertyReplacer virtualPropertyReplacer) { - this.virtualPropertyReplacer = virtualPropertyReplacer; + @Override + public & QueryField> Node parse(final String query, final Class queryFieldType) throws QueryException { + return RsqlParser.parse(query, queryFieldType); } + } + + public static class MappingQueryParser extends DefaultQueryParser { @Override public & QueryField> Node parse(final String query, final Class queryFieldType) throws QueryException { @@ -205,8 +206,9 @@ public class QLSupport { return key; } + // just extension points for subclasses protected Object mapValue(final Object value, final Comparison comparison) { - return value instanceof String strValue ? virtualPropertyReplacer.replace(strValue) : value; + return value; } } } \ No newline at end of file diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRepositoryConfiguration.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRepositoryConfiguration.java index c8d20b912..a6828382b 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRepositoryConfiguration.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRepositoryConfiguration.java @@ -67,7 +67,10 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaTargetType; import org.eclipse.hawkbit.repository.jpa.model.helper.AfterTransactionCommitExecutorHolder; import org.eclipse.hawkbit.repository.jpa.model.helper.EntityInterceptorHolder; import org.eclipse.hawkbit.repository.jpa.model.helper.TenantAwareHolder; +import org.eclipse.hawkbit.repository.jpa.ql.Node; +import org.eclipse.hawkbit.repository.jpa.ql.Node.Comparison; import org.eclipse.hawkbit.repository.jpa.ql.QLSupport.DefaultQueryParser; +import org.eclipse.hawkbit.repository.jpa.ql.QLSupport.MappingQueryParser; import org.eclipse.hawkbit.repository.jpa.ql.QLSupport.QueryParser; import org.eclipse.hawkbit.repository.jpa.repository.ActionRepository; import org.eclipse.hawkbit.repository.jpa.repository.DistributionSetRepository; @@ -96,6 +99,8 @@ import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.TargetFilterQuery; import org.eclipse.hawkbit.repository.model.helper.SystemSecurityContextHolder; import org.eclipse.hawkbit.repository.model.helper.TenantConfigurationManagementHolder; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver; import org.eclipse.hawkbit.security.HawkbitSecurityProperties; import org.eclipse.hawkbit.security.SecurityTokenGenerator; import org.eclipse.hawkbit.security.SystemSecurityContext; @@ -517,8 +522,20 @@ public class JpaRepositoryConfiguration { @Bean @ConditionalOnMissingBean - QueryParser queryParser() { - return new DefaultQueryParser(); + public VirtualPropertyResolver virtualPropertyReplacer() { + return new VirtualPropertyResolver(); + } + + @Bean + @ConditionalOnMissingBean + QueryParser queryParser(final Optional virtualPropertyResolver) { + return virtualPropertyResolver.map(resolver -> new MappingQueryParser() { + + @Override + protected Object mapValue(final Object value, final Comparison comparison) { + return value instanceof String strValue ? resolver.replace(strValue) : value; + } + }).orElseGet(DefaultQueryParser::new); } /**