From b1d9930d9444b2fbf3228fd4703512d92b247abc Mon Sep 17 00:00:00 2001 From: Dominik Herbst Date: Wed, 28 Sep 2016 13:54:54 +0200 Subject: [PATCH] Optimized implementation of VirtualPropertyReplacer. Added auto configuration for VirtualPropertyResolver. Signed-off-by: Dominik Herbst --- .../JpaRepositoryAutoConfiguration.java | 16 +++++++++- .../rsql/VirtualPropertyReplacer.java} | 16 +++++----- .../repository/jpa/TimestampCalculator.java | 4 +-- .../TenantConfigurationManagementHolder.java | 0 .../jpa/rsql/VirtualPropertyResolver.java | 25 +++++++++++----- .../jpa/JpaDeploymentManagement.java | 6 ++-- .../jpa/JpaDistributionSetManagement.java | 10 +++---- .../jpa/JpaRolloutGroupManagement.java | 8 ++--- .../repository/jpa/JpaRolloutManagement.java | 6 ++-- .../repository/jpa/JpaSoftwareManagement.java | 10 +++---- .../repository/jpa/JpaTagManagement.java | 8 ++--- .../jpa/JpaTargetFilterQueryManagement.java | 6 ++-- .../repository/jpa/JpaTargetManagement.java | 18 ++++++------ .../repository/jpa/rsql/RSQLUtility.java | 29 +++++++++---------- .../repository/jpa/rsql/RSQLUtilityTest.java | 3 +- .../jpa/rsql/VirtualPropertyResolverTest.java | 1 + .../eclipse/hawkbit/TestConfiguration.java | 11 +++++++ .../FilterQueryValidation.java | 5 ++-- 18 files changed, 106 insertions(+), 76 deletions(-) rename hawkbit-repository/{hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyLookup.java => hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/rsql/VirtualPropertyReplacer.java} (54%) rename hawkbit-repository/{hawkbit-repository-jpa => hawkbit-repository-core}/src/main/java/org/eclipse/hawkbit/repository/jpa/TimestampCalculator.java (94%) rename hawkbit-repository/{hawkbit-repository-jpa => hawkbit-repository-core}/src/main/java/org/eclipse/hawkbit/repository/jpa/model/helper/TenantConfigurationManagementHolder.java (100%) rename hawkbit-repository/{hawkbit-repository-jpa => hawkbit-repository-core}/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyResolver.java (75%) 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 dd6ead86b..245e4d57a 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 @@ -9,12 +9,16 @@ package org.eclipse.hawkbit.autoconfigure.repository; import org.eclipse.hawkbit.EnableJpaRepository; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; +import org.eclipse.hawkbit.repository.jpa.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; /** - * Auto-Configuration for enabling the REST-Resources. + * Auto-Configuration for enabling JPA repository. * */ @Configuration @@ -22,4 +26,14 @@ import org.springframework.context.annotation.Import; @Import({ EnableJpaRepository.class }) public class JpaRepositoryAutoConfiguration { + /** + * + * @return returns a VirtualPropertyReplacer + */ + @Bean + @ConditionalOnMissingBean + public VirtualPropertyReplacer virtualPropertyReplacer() { + return new VirtualPropertyResolver(); + } + } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyLookup.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/rsql/VirtualPropertyReplacer.java similarity index 54% rename from hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyLookup.java rename to hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/rsql/VirtualPropertyReplacer.java index a67064261..abdc671f7 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyLookup.java +++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/rsql/VirtualPropertyReplacer.java @@ -6,7 +6,7 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ -package org.eclipse.hawkbit.repository.jpa.rsql; +package org.eclipse.hawkbit.repository.rsql; /** * Implementations map a placeholder to the associated value. @@ -14,15 +14,15 @@ package org.eclipse.hawkbit.repository.jpa.rsql; * This is used in context of string replacement. */ @FunctionalInterface -public interface VirtualPropertyLookup { +public interface VirtualPropertyReplacer { /** - * Looks up a placeholder to the associated value. + * Looks up a placeholders and replaces them * - * @param placeholder - * the virtual property that should be resolved by a value - * @return the value for the placeholder; may be null if no - * value could be found for the given placeholder; + * @param input + * the input string in which virtual properties should be + * replaced + * @return the result of the replacement */ - String lookup(String placeholder); + String replace(String input); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/TimestampCalculator.java b/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/jpa/TimestampCalculator.java similarity index 94% rename from hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/TimestampCalculator.java rename to hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/jpa/TimestampCalculator.java index 071da214d..ea467b316 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/TimestampCalculator.java +++ b/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/jpa/TimestampCalculator.java @@ -15,15 +15,13 @@ import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.repository.jpa.model.helper.TenantConfigurationManagementHolder; import org.eclipse.hawkbit.tenancy.configuration.DurationHelper; import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey; -import org.springframework.stereotype.Service; /** - * Service that calculates non-persistent timestamps , e.g. the point a time a + * Calculates non-persistent timestamps , e.g. the point a time a * target is declared as overdue.
* Therefore tenant specific configuration may be considered. * */ -@Service public class TimestampCalculator { /** diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/helper/TenantConfigurationManagementHolder.java b/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/jpa/model/helper/TenantConfigurationManagementHolder.java similarity index 100% rename from hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/helper/TenantConfigurationManagementHolder.java rename to hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/jpa/model/helper/TenantConfigurationManagementHolder.java diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyResolver.java b/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyResolver.java similarity index 75% rename from hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyResolver.java rename to hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyResolver.java index 739874610..1e78d7f10 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyResolver.java +++ b/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyResolver.java @@ -11,9 +11,9 @@ package org.eclipse.hawkbit.repository.jpa.rsql; import java.time.Instant; import org.apache.commons.lang3.text.StrLookup; +import org.apache.commons.lang3.text.StrSubstitutor; import org.eclipse.hawkbit.repository.jpa.TimestampCalculator; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; /** * Adds macro capabilities to RSQL expressions that are used to filter for @@ -24,8 +24,8 @@ import org.springframework.stereotype.Component; * time intervals).
* Such a virtual property needs to be calculated on Java-side before it may be * used in a target filter query that is passed to the database. Therefore a - * placeholder is used in the RSQL expression that is expanded in the - * {@link RSQLUtility}. + * placeholder is used in the RSQL expression that is expanded when the RSQL is + * parsed *

* A virtual property may either be a system value like the current date (aka * now_ts) or a value derived from (tenant-specific) system @@ -41,11 +41,11 @@ import org.springframework.stereotype.Component; * configuration. * */ -@Component -public class VirtualPropertyResolver extends StrLookup implements VirtualPropertyLookup { +public class VirtualPropertyResolver extends StrLookup implements VirtualPropertyReplacer { - @Autowired - private TimestampCalculator timestampCalculator; + private final TimestampCalculator timestampCalculator = new TimestampCalculator(); + + private StrSubstitutor substitutor; @Override public String lookup(String rhs) { @@ -59,6 +59,15 @@ public class VirtualPropertyResolver extends StrLookup implements Virtua return resolved; } + @Override + public String replace(String input) { + if (substitutor == null) { + substitutor = new StrSubstitutor(this, StrSubstitutor.DEFAULT_PREFIX, StrSubstitutor.DEFAULT_SUFFIX, + StrSubstitutor.DEFAULT_ESCAPE); + } + return substitutor.replace(input); + } + TimestampCalculator getTimestampCalculator() { return timestampCalculator; } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDeploymentManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDeploymentManagement.java index 1a7655096..6014e6802 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDeploymentManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDeploymentManagement.java @@ -54,7 +54,7 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaSoftwareModule; import org.eclipse.hawkbit.repository.jpa.model.JpaTarget; import org.eclipse.hawkbit.repository.jpa.model.JpaTargetInfo; import org.eclipse.hawkbit.repository.jpa.rsql.RSQLUtility; -import org.eclipse.hawkbit.repository.jpa.rsql.VirtualPropertyLookup; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.repository.jpa.specifications.TargetSpecifications; import org.eclipse.hawkbit.repository.model.Action; import org.eclipse.hawkbit.repository.model.Action.ActionType; @@ -136,7 +136,7 @@ public class JpaDeploymentManagement implements DeploymentManagement { private SystemSecurityContext systemSecurityContext; @Autowired - private VirtualPropertyLookup virtualPropertyLookup; + private VirtualPropertyReplacer virtualPropertyReplacer; @Override @Transactional(isolation = Isolation.READ_COMMITTED) @@ -609,7 +609,7 @@ public class JpaDeploymentManagement implements DeploymentManagement { } private Specification createSpecificationFor(final Target target, final String rsqlParam) { - final Specification spec = RSQLUtility.parse(rsqlParam, ActionFields.class, virtualPropertyLookup); + final Specification spec = RSQLUtility.parse(rsqlParam, ActionFields.class, virtualPropertyReplacer); return (root, query, cb) -> cb.and(spec.toPredicate(root, query, cb), cb.equal(root.get(JpaAction_.target), target)); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java index 7d719acbe..b9df4e1b0 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java @@ -42,7 +42,7 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetMetadata_; import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetType; import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSet_; import org.eclipse.hawkbit.repository.jpa.rsql.RSQLUtility; -import org.eclipse.hawkbit.repository.jpa.rsql.VirtualPropertyLookup; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.repository.jpa.specifications.DistributionSetSpecification; import org.eclipse.hawkbit.repository.jpa.specifications.DistributionSetTypeSpecification; import org.eclipse.hawkbit.repository.jpa.specifications.SpecificationsBuilder; @@ -109,7 +109,7 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { private TenantAware tenantAware; @Autowired - private VirtualPropertyLookup virtualPropertyLookup; + private VirtualPropertyReplacer virtualPropertyReplacer; @Override public DistributionSet findDistributionSetByIdWithDetails(final Long distid) { @@ -283,7 +283,7 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { @Override public Page findDistributionSetTypesAll(final String rsqlParam, final Pageable pageable) { final Specification spec = RSQLUtility.parse(rsqlParam, - DistributionSetTypeFields.class, virtualPropertyLookup); + DistributionSetTypeFields.class, virtualPropertyReplacer); return convertDsTPage(distributionSetTypeRepository.findAll(spec, pageable)); } @@ -350,7 +350,7 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { final Boolean deleted) { final Specification spec = RSQLUtility.parse(rsqlParam, DistributionSetFields.class, - virtualPropertyLookup); + virtualPropertyReplacer); final List> specList = new ArrayList<>(2); if (deleted != null) { @@ -562,7 +562,7 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { final String rsqlParam, final Pageable pageable) { final Specification spec = RSQLUtility.parse(rsqlParam, - DistributionSetMetadataFields.class, virtualPropertyLookup); + DistributionSetMetadataFields.class, virtualPropertyReplacer); return convertMdPage( distributionSetMetadataRepository diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutGroupManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutGroupManagement.java index 0453bf26b..382b8fab4 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutGroupManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutGroupManagement.java @@ -33,7 +33,7 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaTarget_; import org.eclipse.hawkbit.repository.jpa.model.RolloutTargetGroup; import org.eclipse.hawkbit.repository.jpa.model.RolloutTargetGroup_; import org.eclipse.hawkbit.repository.jpa.rsql.RSQLUtility; -import org.eclipse.hawkbit.repository.jpa.rsql.VirtualPropertyLookup; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.repository.model.Action; import org.eclipse.hawkbit.repository.model.Rollout; import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus; @@ -72,7 +72,7 @@ public class JpaRolloutGroupManagement implements RolloutGroupManagement { private EntityManager entityManager; @Autowired - private VirtualPropertyLookup virtualPropertyLookup; + private VirtualPropertyReplacer virtualPropertyReplacer; @Override public RolloutGroup findRolloutGroupById(final Long rolloutGroupId) { @@ -97,7 +97,7 @@ public class JpaRolloutGroupManagement implements RolloutGroupManagement { final Pageable pageable) { final Specification specification = RSQLUtility.parse(rsqlParam, RolloutGroupFields.class, - virtualPropertyLookup); + virtualPropertyReplacer); return convertPage( rolloutGroupRepository @@ -151,7 +151,7 @@ public class JpaRolloutGroupManagement implements RolloutGroupManagement { final Pageable pageable) { final Specification rsqlSpecification = RSQLUtility.parse(rsqlParam, TargetFields.class, - virtualPropertyLookup); + virtualPropertyReplacer); return convertTPage(targetRepository.findAll((root, query, criteriaBuilder) -> { final ListJoin rolloutTargetJoin = root.join(JpaTarget_.rolloutTargetGroup); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java index ca5c8389d..3845a0c5a 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java @@ -32,7 +32,7 @@ import org.eclipse.hawkbit.repository.jpa.model.RolloutTargetGroup; import org.eclipse.hawkbit.repository.jpa.rollout.condition.RolloutGroupActionEvaluator; import org.eclipse.hawkbit.repository.jpa.rollout.condition.RolloutGroupConditionEvaluator; import org.eclipse.hawkbit.repository.jpa.rsql.RSQLUtility; -import org.eclipse.hawkbit.repository.jpa.rsql.VirtualPropertyLookup; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.repository.model.Action; import org.eclipse.hawkbit.repository.model.Action.ActionType; import org.eclipse.hawkbit.repository.model.DistributionSet; @@ -116,7 +116,7 @@ public class JpaRolloutManagement implements RolloutManagement { private CacheWriteNotify cacheWriteNotify; @Autowired - private VirtualPropertyLookup virtualPropertyLookup; + private VirtualPropertyReplacer virtualPropertyReplacer; @Autowired @Qualifier("asyncExecutor") @@ -155,7 +155,7 @@ public class JpaRolloutManagement implements RolloutManagement { public Page findAllWithDetailedStatusByPredicate(final String rsqlParam, final Pageable pageable) { final Specification specification = RSQLUtility.parse(rsqlParam, RolloutFields.class, - virtualPropertyLookup); + virtualPropertyReplacer); final Page findAll = rolloutRepository.findAll(specification, pageable); setRolloutStatusDetails(findAll); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareManagement.java index fad743baf..f403ff38b 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareManagement.java @@ -45,7 +45,7 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaSoftwareModuleType; import org.eclipse.hawkbit.repository.jpa.model.JpaSoftwareModule_; import org.eclipse.hawkbit.repository.jpa.model.SwMetadataCompositeKey; import org.eclipse.hawkbit.repository.jpa.rsql.RSQLUtility; -import org.eclipse.hawkbit.repository.jpa.rsql.VirtualPropertyLookup; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.repository.jpa.specifications.SoftwareModuleSpecification; import org.eclipse.hawkbit.repository.jpa.specifications.SpecificationsBuilder; import org.eclipse.hawkbit.repository.model.AssignedSoftwareModule; @@ -108,7 +108,7 @@ public class JpaSoftwareManagement implements SoftwareManagement { private ArtifactManagement artifactManagement; @Autowired - private VirtualPropertyLookup virtualPropertyLookup; + private VirtualPropertyReplacer virtualPropertyReplacer; @Override @Modifying @@ -317,7 +317,7 @@ public class JpaSoftwareManagement implements SoftwareManagement { @Override public Page findSoftwareModulesByPredicate(final String rsqlParam, final Pageable pageable) { final Specification spec = RSQLUtility.parse(rsqlParam, SoftwareModuleFields.class, - virtualPropertyLookup); + virtualPropertyReplacer); return convertSmPage(softwareModuleRepository.findAll(spec, pageable), pageable); } @@ -326,7 +326,7 @@ public class JpaSoftwareManagement implements SoftwareManagement { public Page findSoftwareModuleTypesAll(final String rsqlParam, final Pageable pageable) { final Specification spec = RSQLUtility.parse(rsqlParam, SoftwareModuleTypeFields.class, - virtualPropertyLookup); + virtualPropertyReplacer); return convertSmTPage(softwareModuleTypeRepository.findAll(spec, pageable), pageable); } @@ -612,7 +612,7 @@ public class JpaSoftwareManagement implements SoftwareManagement { final String rsqlParam, final Pageable pageable) { final Specification spec = RSQLUtility.parse(rsqlParam, - SoftwareModuleMetadataFields.class, virtualPropertyLookup); + SoftwareModuleMetadataFields.class, virtualPropertyReplacer); return convertSmMdPage( softwareModuleMetadataRepository .findAll( diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTagManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTagManagement.java index fcc97729e..fd151b527 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTagManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTagManagement.java @@ -30,7 +30,7 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetTag; import org.eclipse.hawkbit.repository.jpa.model.JpaTarget; import org.eclipse.hawkbit.repository.jpa.model.JpaTargetTag; import org.eclipse.hawkbit.repository.jpa.rsql.RSQLUtility; -import org.eclipse.hawkbit.repository.jpa.rsql.VirtualPropertyLookup; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.repository.model.DistributionSetTag; import org.eclipse.hawkbit.repository.model.TargetTag; import org.eclipse.hawkbit.tenancy.TenantAware; @@ -76,7 +76,7 @@ public class JpaTagManagement implements TagManagement { private AfterTransactionCommitExecutor afterCommit; @Autowired - private VirtualPropertyLookup virtualPropertyLookup; + private VirtualPropertyReplacer virtualPropertyReplacer; @Override public TargetTag findTargetTag(final String name) { @@ -151,7 +151,7 @@ public class JpaTagManagement implements TagManagement { @Override public Page findAllTargetTags(final String rsqlParam, final Pageable pageable) { - final Specification spec = RSQLUtility.parse(rsqlParam, TagFields.class, virtualPropertyLookup); + final Specification spec = RSQLUtility.parse(rsqlParam, TagFields.class, virtualPropertyReplacer); return convertTPage(targetTagRepository.findAll(spec, pageable), pageable); } @@ -285,7 +285,7 @@ public class JpaTagManagement implements TagManagement { @Override public Page findAllDistributionSetTags(final String rsqlParam, final Pageable pageable) { final Specification spec = RSQLUtility.parse(rsqlParam, TagFields.class, - virtualPropertyLookup); + virtualPropertyReplacer); return convertDsPage(distributionSetTagRepository.findAll(spec, pageable), pageable); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetFilterQueryManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetFilterQueryManagement.java index 39343d3a4..ed9ba5977 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetFilterQueryManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetFilterQueryManagement.java @@ -16,7 +16,7 @@ import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.exception.EntityAlreadyExistsException; import org.eclipse.hawkbit.repository.jpa.model.JpaTargetFilterQuery; import org.eclipse.hawkbit.repository.jpa.rsql.RSQLUtility; -import org.eclipse.hawkbit.repository.jpa.rsql.VirtualPropertyLookup; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.repository.jpa.specifications.SpecificationsBuilder; import org.eclipse.hawkbit.repository.jpa.specifications.TargetFilterQuerySpecification; import org.eclipse.hawkbit.repository.model.TargetFilterQuery; @@ -46,7 +46,7 @@ public class JpaTargetFilterQueryManagement implements TargetFilterQueryManageme private TargetFilterQueryRepository targetFilterQueryRepository; @Autowired - private VirtualPropertyLookup virtualPropertyLookup; + private VirtualPropertyReplacer virtualPropertyReplacer; @Override @Modifying @@ -115,7 +115,7 @@ public class JpaTargetFilterQueryManagement implements TargetFilterQueryManageme @Override public boolean verifyTargetFilterQuerySyntax(final String query) { - RSQLUtility.parse(query, TargetFields.class, virtualPropertyLookup); + RSQLUtility.parse(query, TargetFields.class, virtualPropertyReplacer); return true; } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java index 878c70f04..75e883c83 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java @@ -42,7 +42,7 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaTargetInfo_; import org.eclipse.hawkbit.repository.jpa.model.JpaTargetTag; import org.eclipse.hawkbit.repository.jpa.model.JpaTarget_; import org.eclipse.hawkbit.repository.jpa.rsql.RSQLUtility; -import org.eclipse.hawkbit.repository.jpa.rsql.VirtualPropertyLookup; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.repository.jpa.specifications.SpecificationsBuilder; import org.eclipse.hawkbit.repository.jpa.specifications.TargetSpecifications; import org.eclipse.hawkbit.repository.model.Target; @@ -105,7 +105,7 @@ public class JpaTargetManagement implements TargetManagement { private AfterTransactionCommitExecutor afterCommit; @Autowired - private VirtualPropertyLookup virtualPropertyLookup; + private VirtualPropertyReplacer virtualPropertyReplacer; @Override public Target findTargetByControllerID(final String controllerId) { @@ -158,13 +158,13 @@ public class JpaTargetManagement implements TargetManagement { @Override public Slice findTargetsAll(final TargetFilterQuery targetFilterQuery, final Pageable pageable) { return findTargetsBySpec( - RSQLUtility.parse(targetFilterQuery.getQuery(), TargetFields.class, virtualPropertyLookup), + RSQLUtility.parse(targetFilterQuery.getQuery(), TargetFields.class, virtualPropertyReplacer), pageable); } @Override public Page findTargetsAll(final String targetFilterQuery, final Pageable pageable) { - return findTargetsBySpec(RSQLUtility.parse(targetFilterQuery, TargetFields.class, virtualPropertyLookup), + return findTargetsBySpec(RSQLUtility.parse(targetFilterQuery, TargetFields.class, virtualPropertyReplacer), pageable); } @@ -233,7 +233,7 @@ public class JpaTargetManagement implements TargetManagement { final Pageable pageReq) { final Specification spec = RSQLUtility.parse(rsqlParam, TargetFields.class, - virtualPropertyLookup); + virtualPropertyReplacer); return convertPage( targetRepository @@ -262,7 +262,7 @@ public class JpaTargetManagement implements TargetManagement { final Pageable pageable) { final Specification spec = RSQLUtility.parse(rsqlParam, TargetFields.class, - virtualPropertyLookup); + virtualPropertyReplacer); return convertPage( targetRepository @@ -566,7 +566,7 @@ public class JpaTargetManagement implements TargetManagement { final CriteriaQuery multiselect = query.multiselect(targetRoot.get(JpaTarget_.id), targetRoot.get(JpaTarget_.controllerId), targetRoot.get(JpaTarget_.name), targetRoot.get(sortProperty)); - final Specification spec = RSQLUtility.parse(targetFilterQuery.getQuery(), TargetFields.class, virtualPropertyLookup); + final Specification spec = RSQLUtility.parse(targetFilterQuery.getQuery(), TargetFields.class, virtualPropertyReplacer); final Predicate[] specificationsForMultiSelect = specificationsToPredicate(Lists.newArrayList(spec), targetRoot, multiselect, cb); @@ -645,14 +645,14 @@ public class JpaTargetManagement implements TargetManagement { @Override public Long countTargetByTargetFilterQuery(final TargetFilterQuery targetFilterQuery) { final Specification specs = RSQLUtility.parse(targetFilterQuery.getQuery(), TargetFields.class, - virtualPropertyLookup); + virtualPropertyReplacer); return targetRepository.count(specs); } @Override public Long countTargetByTargetFilterQuery(final String targetFilterQuery) { final Specification specs = RSQLUtility.parse(targetFilterQuery, TargetFields.class, - virtualPropertyLookup); + virtualPropertyReplacer); return targetRepository.count(specs); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtility.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtility.java index f3e2ce50d..7565f464a 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtility.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtility.java @@ -26,11 +26,11 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import org.apache.commons.lang3.text.StrLookup; -import org.apache.commons.lang3.text.StrSubstitutor; import org.eclipse.hawkbit.repository.FieldNameProvider; import org.eclipse.hawkbit.repository.FieldValueConverter; import org.eclipse.hawkbit.repository.exception.RSQLParameterSyntaxException; import org.eclipse.hawkbit.repository.exception.RSQLParameterUnsupportedFieldException; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.SimpleTypeConverter; @@ -99,7 +99,7 @@ public final class RSQLUtility { * @param fieldNameProvider * the enum class type which implements the * {@link FieldNameProvider} - * @param virtualPropertyLookup + * @param virtualPropertyReplacer * holds the logic how the known macros have to be resolved; may * be null * @return an specification which can be used with JPA @@ -110,8 +110,8 @@ public final class RSQLUtility { * if the RSQL syntax is wrong */ public static & FieldNameProvider, T> Specification parse(final String rsql, - final Class fieldNameProvider, VirtualPropertyLookup virtualPropertyLookup) { - return new RSQLSpecification<>(rsql.toLowerCase(), fieldNameProvider, virtualPropertyLookup); + final Class fieldNameProvider, VirtualPropertyReplacer virtualPropertyReplacer) { + return new RSQLSpecification<>(rsql.toLowerCase(), fieldNameProvider, virtualPropertyReplacer); } /** @@ -142,13 +142,13 @@ public final class RSQLUtility { private final String rsql; private final Class enumType; - private final VirtualPropertyLookup virtualPropertyLookup; + private final VirtualPropertyReplacer virtualPropertyReplacer; private RSQLSpecification(final String rsql, final Class enumType, - VirtualPropertyLookup virtualPropertyLookup) { + VirtualPropertyReplacer virtualPropertyReplacer) { this.rsql = rsql; this.enumType = enumType; - this.virtualPropertyLookup = virtualPropertyLookup; + this.virtualPropertyReplacer = virtualPropertyReplacer; } @Override @@ -157,7 +157,7 @@ public final class RSQLUtility { final Node rootNode = parseRsql(rsql); final JpqQueryRSQLVisitor jpqQueryRSQLVisitor = new JpqQueryRSQLVisitor<>(root, cb, enumType, - virtualPropertyLookup); + virtualPropertyReplacer); final List accept = rootNode., String> accept(jpqQueryRSQLVisitor); if (accept != null && !accept.isEmpty()) { @@ -187,19 +187,16 @@ public final class RSQLUtility { private final Root root; private final CriteriaBuilder cb; private final Class enumType; - private final StrSubstitutor substitutor; + private final VirtualPropertyReplacer virtualPropertyReplacer; private final SimpleTypeConverter simpleTypeConverter; private JpqQueryRSQLVisitor(final Root root, final CriteriaBuilder cb, final Class enumType, - VirtualPropertyLookup virtualPropertyLookup) { + VirtualPropertyReplacer virtualPropertyReplacer) { this.root = root; this.cb = cb; this.enumType = enumType; - this.substitutor = (virtualPropertyLookup != null && virtualPropertyLookup instanceof StrLookup) - ? new StrSubstitutor((StrLookup)virtualPropertyLookup, StrSubstitutor.DEFAULT_PREFIX, - StrSubstitutor.DEFAULT_SUFFIX, StrSubstitutor.DEFAULT_ESCAPE) - : null; + this.virtualPropertyReplacer = virtualPropertyReplacer; simpleTypeConverter = new SimpleTypeConverter(); } @@ -446,8 +443,8 @@ public final class RSQLUtility { final String value; // if lookup is available, replace macros ... - if (substitutor != null) { - value = substitutor.replace(values.get(0)); + if (virtualPropertyReplacer != null) { + value = virtualPropertyReplacer.replace(values.get(0)); } else { value = values.get(0); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtilityTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtilityTest.java index 1e73bbe24..d72f92f11 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtilityTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtilityTest.java @@ -30,6 +30,7 @@ import org.eclipse.hawkbit.repository.exception.RSQLParameterUnsupportedFieldExc import org.eclipse.hawkbit.repository.jpa.TimestampCalculator; import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.TenantConfigurationValue; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey; import org.junit.Test; import org.junit.runner.RunWith; @@ -321,7 +322,7 @@ public class RSQLUtilityTest { eq(overduePropPlaceholder)); } - public VirtualPropertyLookup setupMacroLookup() { + public VirtualPropertyReplacer setupMacroLookup() { when(confMgmt.getConfigurationValue(TenantConfigurationKey.POLLING_TIME_INTERVAL, String.class)) .thenReturn(TEST_POLLING_TIME_INTERVAL); when(confMgmt.getConfigurationValue(TenantConfigurationKey.POLLING_OVERDUE_TIME_INTERVAL, String.class)) diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyResolverTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyResolverTest.java index daa816f8e..a519c8188 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyResolverTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/VirtualPropertyResolverTest.java @@ -9,6 +9,7 @@ package org.eclipse.hawkbit.repository.jpa.rsql; import static org.junit.Assert.*; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import java.time.Instant; diff --git a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/TestConfiguration.java b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/TestConfiguration.java index 499925540..716236d3a 100644 --- a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/TestConfiguration.java +++ b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/TestConfiguration.java @@ -15,6 +15,8 @@ import org.eclipse.hawkbit.cache.CacheConstants; import org.eclipse.hawkbit.cache.TenancyCacheManager; import org.eclipse.hawkbit.cache.TenantAwareCacheManager; import org.eclipse.hawkbit.repository.jpa.model.helper.EventBusHolder; +import org.eclipse.hawkbit.repository.jpa.rsql.VirtualPropertyResolver; +import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.repository.test.util.JpaTestRepositoryManagement; import org.eclipse.hawkbit.repository.test.util.TestRepositoryManagement; import org.eclipse.hawkbit.repository.test.util.TestdataFactory; @@ -120,4 +122,13 @@ public class TestConfiguration implements AsyncConfigurer { return new SimpleAsyncUncaughtExceptionHandler(); } + /** + * + * @return returns a VirtualPropertyReplacer + */ + @Bean + public VirtualPropertyReplacer virtualPropertyReplacer() { + return new VirtualPropertyResolver(); + } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/FilterQueryValidation.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/FilterQueryValidation.java index 6d1f1a7ab..869608990 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/FilterQueryValidation.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/FilterQueryValidation.java @@ -43,9 +43,8 @@ public final class FilterQueryValidation { /** * method for get ExpectedTokens. * - * @param input - * @param entityManager - * @return + * @param input RSQL filter + * @return Validation result */ public static ValidationResult getExpectedTokens(final String input) {