Improve target management (#1260)

* Fix join type for targets with their assignedDs

Signed-off-by: Michael Herdt <Michael.Herdt@bosch.io>

* Override saveAll method and make use of it in the JpaTargetManagement

Signed-off-by: Michael Herdt <Michael.Herdt@bosch.io>

* Use unmodifiable list and flip transactional logic

Signed-off-by: Michael Herdt <Michael.Herdt@bosch.io>

* Initialize new list instead of an unmodifiable list.

Signed-off-by: Michael Herdt <Michael.Herdt@bosch.io>

* Fix testdata factory

Signed-off-by: Michael Herdt <Michael.Herdt@bosch.io>
This commit is contained in:
Michael Herdt
2022-07-01 13:47:00 +02:00
committed by GitHub
parent d3ef290ec7
commit f0a7c2d07d
5 changed files with 35 additions and 10 deletions

View File

@@ -9,6 +9,7 @@
package org.eclipse.hawkbit.repository.jpa; package org.eclipse.hawkbit.repository.jpa;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import org.eclipse.hawkbit.repository.jpa.model.AbstractJpaTenantAwareBaseEntity; import org.eclipse.hawkbit.repository.jpa.model.AbstractJpaTenantAwareBaseEntity;
@@ -40,4 +41,18 @@ public interface BaseEntityRepository<T extends AbstractJpaTenantAwareBaseEntity
*/ */
Optional<T> findById(I id); Optional<T> findById(I id);
/**
* Overrides
* {@link org.springframework.data.repository.CrudRepository#saveAll(Iterable)}
* to return a list of created entities instead of an instance of
* {@link Iterable} to be able to work with it directly in further code
* processing instead of converting the {@link Iterable}.
*
* @param entities
* to persist in the database
* @return the created entities
*/
@Override
@Transactional
<S extends T> List<S> saveAll(Iterable<S> entities);
} }

View File

@@ -748,7 +748,9 @@ public class JpaTargetManagement implements TargetManagement {
@Retryable(include = { @Retryable(include = {
ConcurrencyFailureException.class }, maxAttempts = Constants.TX_RT_MAX, backoff = @Backoff(delay = Constants.TX_RT_DELAY)) ConcurrencyFailureException.class }, maxAttempts = Constants.TX_RT_MAX, backoff = @Backoff(delay = Constants.TX_RT_DELAY))
public List<Target> create(final Collection<TargetCreate> targets) { public List<Target> create(final Collection<TargetCreate> targets) {
return targets.stream().map(this::create).collect(Collectors.toList()); final List<JpaTarget> targetList = targets.stream().map(JpaTargetCreate.class::cast).map(JpaTargetCreate::build)
.collect(Collectors.toList());
return Collections.unmodifiableList(targetRepository.saveAll(targetList));
} }
@Override @Override

View File

@@ -20,7 +20,6 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSet;
import org.eclipse.hawkbit.repository.jpa.model.JpaTarget; import org.eclipse.hawkbit.repository.jpa.model.JpaTarget;
import org.eclipse.hawkbit.repository.jpa.specifications.TargetSpecifications; import org.eclipse.hawkbit.repository.jpa.specifications.TargetSpecifications;
import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.repository.model.TargetType;
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity; import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;

View File

@@ -148,7 +148,7 @@ public final class TargetSpecifications {
return (targetRoot, query, cb) -> { return (targetRoot, query, cb) -> {
final Predicate predicate = targetRoot.get(JpaTarget_.controllerId).in(controllerIDs); final Predicate predicate = targetRoot.get(JpaTarget_.controllerId).in(controllerIDs);
targetRoot.fetch(JpaTarget_.assignedDistributionSet); targetRoot.fetch(JpaTarget_.assignedDistributionSet, JoinType.LEFT);
return predicate; return predicate;
}; };
} }

View File

@@ -880,7 +880,7 @@ public class TestdataFactory {
targets.add(entityFactory.target().create().controllerId(DEFAULT_CONTROLLER_ID + i)); targets.add(entityFactory.target().create().controllerId(DEFAULT_CONTROLLER_ID + i));
} }
return targetManagement.create(targets); return createTargets(targets);
} }
/** /**
@@ -904,7 +904,7 @@ public class TestdataFactory {
.targetType(targetType.getId())); .targetType(targetType.getId()));
} }
return targetManagement.create(targets); return createTargets(targets);
} }
/** /**
@@ -922,7 +922,7 @@ public class TestdataFactory {
targets.add(entityFactory.target().create().controllerId(targetId)); targets.add(entityFactory.target().create().controllerId(targetId));
} }
return targetManagement.create(targets); return createTargets(targets);
} }
/** /**
@@ -987,11 +987,19 @@ public class TestdataFactory {
public List<Target> createTargets(final int numberOfTargets, final String controllerIdPrefix, public List<Target> createTargets(final int numberOfTargets, final String controllerIdPrefix,
final String descriptionPrefix) { final String descriptionPrefix) {
return targetManagement.create(IntStream.range(0, numberOfTargets) final List<TargetCreate> targets = IntStream.range(0, numberOfTargets)
.mapToObj(i -> entityFactory.target().create() .mapToObj(i -> entityFactory.target().create()
.controllerId(String.format("%s-%05d", controllerIdPrefix, i)) .controllerId(String.format("%s-%05d", controllerIdPrefix, i))
.description(descriptionPrefix + i)) .description(descriptionPrefix + i))
.collect(Collectors.toList())); .collect(Collectors.toList());
return createTargets(targets);
}
private List<Target> createTargets(final Collection<TargetCreate> targetCreates) {
// init new instance of array list since the TargetManagement#create will
// provide a unmodifiable list
final List<Target> createdTargets = targetManagement.create(targetCreates);
return new ArrayList<>(createdTargets);
} }
/** /**
@@ -1010,11 +1018,12 @@ public class TestdataFactory {
public List<Target> createTargets(final int numberOfTargets, final String controllerIdPrefix, public List<Target> createTargets(final int numberOfTargets, final String controllerIdPrefix,
final String descriptionPrefix, final Long lastTargetQuery) { final String descriptionPrefix, final Long lastTargetQuery) {
return targetManagement.create(IntStream.range(0, numberOfTargets) final List<TargetCreate> targets = IntStream.range(0, numberOfTargets)
.mapToObj(i -> entityFactory.target().create() .mapToObj(i -> entityFactory.target().create()
.controllerId(String.format("%s-%05d", controllerIdPrefix, i)) .controllerId(String.format("%s-%05d", controllerIdPrefix, i))
.description(descriptionPrefix + i).lastTargetQuery(lastTargetQuery)) .description(descriptionPrefix + i).lastTargetQuery(lastTargetQuery))
.collect(Collectors.toList())); .collect(Collectors.toList());
return createTargets(targets);
} }
/** /**