You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2022/10/26 14:36:56 UTC

[syncope] branch master updated: [SYNCOPE-1704] Evicting JPAExternalResource instances from JPA cache when policies get updated

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new fffdd3a048 [SYNCOPE-1704] Evicting JPAExternalResource instances from JPA cache when policies get updated
fffdd3a048 is described below

commit fffdd3a048b29d98e80c0f0bbb468c35801153f1
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Wed Oct 26 16:36:46 2022 +0200

    [SYNCOPE-1704] Evicting JPAExternalResource instances from JPA cache when policies get updated
---
 .../console/policies/PolicyModalPanelBuilder.java  |  8 ++--
 .../syncope/core/logic/ImplementationLogic.java    |  4 ++
 .../persistence/api/dao/ExternalResourceDAO.java   |  4 +-
 .../core/persistence/jpa/PersistenceContext.java   | 18 ++++++--
 .../jpa/dao/JPAExternalResourceDAO.java            | 10 ++++
 .../persistence/jpa/dao/JPAImplementationDAO.java  | 15 ++++++
 .../core/persistence/jpa/dao/JPAPolicyDAO.java     | 22 ++++++++-
 .../jpa/entity/JPAExternalResource.java            |  2 +-
 .../jpa/entity/policy/JPAPropagationPolicy.java    |  2 +
 .../core/persistence/jpa/outer/TaskTest.java       | 54 ++++++++++------------
 .../AbstractPropagationTaskExecutor.java           | 14 +++---
 11 files changed, 106 insertions(+), 47 deletions(-)

diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java
index 1b9e2c10b5..3afafc6537 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java
@@ -145,7 +145,7 @@ public class PolicyModalPanelBuilder<T extends PolicyTO> extends AbstractModalPa
 
             switch (type) {
                 case ACCOUNT:
-                    fields.add(new AjaxSpinnerFieldPanel.Builder<Integer>().build(
+                    fields.add(new AjaxSpinnerFieldPanel.Builder<Integer>().min(1).build(
                             "field",
                             "maxAuthenticationAttempts",
                             Integer.class,
@@ -164,7 +164,7 @@ public class PolicyModalPanelBuilder<T extends PolicyTO> extends AbstractModalPa
                     break;
 
                 case PASSWORD:
-                    fields.add(new AjaxSpinnerFieldPanel.Builder<Integer>().build(
+                    fields.add(new AjaxSpinnerFieldPanel.Builder<Integer>().min(1).build(
                             "field",
                             "historyLength",
                             Integer.class,
@@ -190,7 +190,7 @@ public class PolicyModalPanelBuilder<T extends PolicyTO> extends AbstractModalPa
                             new PropertyModel<>(policyTO, "updateDelta"),
                             false));
 
-                    fields.add(new AjaxSpinnerFieldPanel.Builder<Integer>().build(
+                    fields.add(new AjaxSpinnerFieldPanel.Builder<Integer>().min(1).build(
                             "field",
                             "maxAttempts",
                             Integer.class,
@@ -286,6 +286,8 @@ public class PolicyModalPanelBuilder<T extends PolicyTO> extends AbstractModalPa
                             "unauthorizedRedirectUrl",
                             new IModel<>() {
 
+                        private static final long serialVersionUID = 1015030402166681242L;
+
                         @Override
                         public String getObject() {
                             return Optional.ofNullable(
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ImplementationLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ImplementationLogic.java
index 09853e398f..70c86bfb3c 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ImplementationLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ImplementationLogic.java
@@ -209,6 +209,10 @@ public class ImplementationLogic extends AbstractTransactionalLogic<Implementati
                 inUse = !realmDAO.findByLogicActions(implementation).isEmpty();
                 break;
 
+            case IdMImplementationType.PROVISION_SORTER:
+                inUse = !resourceDAO.findByProvisionSorter(implementation).isEmpty();
+                break;
+
             case IdMImplementationType.PROPAGATION_ACTIONS:
                 inUse = !resourceDAO.findByPropagationActions(implementation).isEmpty();
                 break;
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java
index 3242518ab9..8fc338e8c3 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java
@@ -37,7 +37,9 @@ public interface ExternalResourceDAO extends DAO<ExternalResource> {
 
     boolean anyItemHaving(Implementation transformer);
 
-    List<ExternalResource> findByPropagationActions(Implementation propagationActions);
+    List<ExternalResource> findByProvisionSorter(Implementation propagationActions);
+
+    List<ExternalResource> findByPropagationActions(Implementation provisionSorter);
 
     List<ExternalResource> findByPolicy(Policy policy);
 
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java
index 97822c456e..89bb5beb24 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java
@@ -517,8 +517,11 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public ImplementationDAO implementationDAO() {
-        return new JPAImplementationDAO();
+    public ImplementationDAO implementationDAO(
+            final @Lazy ExternalResourceDAO resourceDAO,
+            final @Lazy EntityCacheDAO entityCacheDAO) {
+
+        return new JPAImplementationDAO(resourceDAO, entityCacheDAO);
     }
 
     @ConditionalOnMissingBean
@@ -574,9 +577,16 @@ public class PersistenceContext {
             final @Lazy ExternalResourceDAO resourceDAO,
             final @Lazy CASSPClientAppDAO casSPClientAppDAO,
             final @Lazy OIDCRPClientAppDAO oidcRPClientAppDAO,
-            final @Lazy SAML2SPClientAppDAO saml2SPClientAppDAO) {
+            final @Lazy SAML2SPClientAppDAO saml2SPClientAppDAO,
+            final @Lazy EntityCacheDAO entityCacheDAO) {
 
-        return new JPAPolicyDAO(realmDAO, resourceDAO, casSPClientAppDAO, oidcRPClientAppDAO, saml2SPClientAppDAO);
+        return new JPAPolicyDAO(
+                realmDAO,
+                resourceDAO,
+                casSPClientAppDAO,
+                oidcRPClientAppDAO,
+                saml2SPClientAppDAO,
+                entityCacheDAO);
     }
 
     @ConditionalOnMissingBean
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
index 43f2c402f0..8b3e955fc7 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
@@ -145,6 +145,16 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource> implem
         return query.getResultList();
     }
 
+    @Override
+    public List<ExternalResource> findByProvisionSorter(final Implementation provisionSorter) {
+        TypedQuery<ExternalResource> query = entityManager().createQuery(
+                "SELECT e FROM " + JPAExternalResource.class.getSimpleName() + " e "
+                + "WHERE e.provisionSorter=:provisionSorter", ExternalResource.class);
+        query.setParameter("provisionSorter", provisionSorter);
+
+        return query.getResultList();
+    }
+
     protected StringBuilder getByPolicyQuery(final Class<? extends Policy> policyClass) {
         StringBuilder query = new StringBuilder("SELECT e FROM ").
                 append(JPAExternalResource.class.getSimpleName()).
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAImplementationDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAImplementationDAO.java
index b063cf39fa..1b1a69e01a 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAImplementationDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAImplementationDAO.java
@@ -21,14 +21,26 @@ package org.apache.syncope.core.persistence.jpa.dao;
 import java.util.List;
 import javax.persistence.TypedQuery;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.core.persistence.api.dao.EntityCacheDAO;
+import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
 import org.apache.syncope.core.persistence.api.entity.Implementation;
+import org.apache.syncope.core.persistence.jpa.entity.JPAExternalResource;
 import org.apache.syncope.core.persistence.jpa.entity.JPAImplementation;
 import org.apache.syncope.core.spring.implementation.ImplementationManager;
 import org.springframework.transaction.annotation.Transactional;
 
 public class JPAImplementationDAO extends AbstractDAO<Implementation> implements ImplementationDAO {
 
+    protected final ExternalResourceDAO resourceDAO;
+
+    protected final EntityCacheDAO entityCacheDAO;
+
+    public JPAImplementationDAO(final ExternalResourceDAO resourceDAO, final EntityCacheDAO entityCacheDAO) {
+        this.resourceDAO = resourceDAO;
+        this.entityCacheDAO = entityCacheDAO;
+    }
+
     @Transactional(readOnly = true)
     @Override
     public Implementation find(final String key) {
@@ -74,6 +86,9 @@ public class JPAImplementationDAO extends AbstractDAO<Implementation> implements
 
         ImplementationManager.purge(merged.getKey());
 
+        resourceDAO.findByProvisionSorter(merged).
+                forEach(resource -> entityCacheDAO.evict(JPAExternalResource.class, resource.getKey()));
+
         return merged;
     }
 
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java
index 6e6c3a97bb..63c1bc475d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.jpa.dao;
 import java.util.List;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.core.persistence.api.dao.CASSPClientAppDAO;
+import org.apache.syncope.core.persistence.api.dao.EntityCacheDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.OIDCRPClientAppDAO;
 import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
@@ -37,6 +38,7 @@ import org.apache.syncope.core.persistence.api.entity.policy.Policy;
 import org.apache.syncope.core.persistence.api.entity.policy.PropagationPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PushPolicy;
+import org.apache.syncope.core.persistence.jpa.entity.JPAExternalResource;
 import org.apache.syncope.core.persistence.jpa.entity.policy.AbstractPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccessPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccountPolicy;
@@ -81,18 +83,22 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
 
     protected final SAML2SPClientAppDAO saml2SPClientAppDAO;
 
+    protected final EntityCacheDAO entityCacheDAO;
+
     public JPAPolicyDAO(
             final RealmDAO realmDAO,
             final ExternalResourceDAO resourceDAO,
             final CASSPClientAppDAO casSPClientAppDAO,
             final OIDCRPClientAppDAO oidcRPClientAppDAO,
-            final SAML2SPClientAppDAO saml2SPClientAppDAO) {
+            final SAML2SPClientAppDAO saml2SPClientAppDAO,
+            final EntityCacheDAO entityCacheDAO) {
 
         this.realmDAO = realmDAO;
         this.resourceDAO = resourceDAO;
         this.casSPClientAppDAO = casSPClientAppDAO;
         this.oidcRPClientAppDAO = oidcRPClientAppDAO;
         this.saml2SPClientAppDAO = saml2SPClientAppDAO;
+        this.entityCacheDAO = entityCacheDAO;
     }
 
     @SuppressWarnings("unchecked")
@@ -168,7 +174,19 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
 
     @Override
     public <T extends Policy> T save(final T policy) {
-        return entityManager().merge(policy);
+        T merged = entityManager().merge(policy);
+
+        if (policy instanceof AccountPolicy
+                || policy instanceof PasswordPolicy
+                || policy instanceof PropagationPolicy
+                || policy instanceof PullPolicy
+                || policy instanceof PushPolicy) {
+
+            resourceDAO.findByPolicy(policy).
+                    forEach(resource -> entityCacheDAO.evict(JPAExternalResource.class, resource.getKey()));
+        }
+
+        return merged;
     }
 
     @Override
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAExternalResource.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAExternalResource.java
index 339ff1484a..2fd04c2880 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAExternalResource.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAExternalResource.java
@@ -142,7 +142,7 @@ public class JPAExternalResource extends AbstractProvidedKeyEntity implements Ex
     @ManyToOne(fetch = FetchType.EAGER)
     private JPAPushPolicy pushPolicy;
 
-    @ManyToOne
+    @ManyToOne(fetch = FetchType.EAGER)
     private JPAImplementation provisionSorter;
 
     /**
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPropagationPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPropagationPolicy.java
index 92c0ad7ba4..cade540bc5 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPropagationPolicy.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPropagationPolicy.java
@@ -23,6 +23,7 @@ import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import javax.persistence.Table;
+import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
 import org.apache.syncope.common.lib.types.BackOffStrategy;
 import org.apache.syncope.core.persistence.api.entity.policy.PropagationPolicy;
@@ -47,6 +48,7 @@ public class JPAPropagationPolicy extends AbstractPolicy implements PropagationP
 
     private String backOffParams;
 
+    @Min(1)
     @NotNull
     private Integer maxAttempts = 3;
 
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/TaskTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/TaskTest.java
index d5546a067b..952e4c9734 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/TaskTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/TaskTest.java
@@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.time.OffsetDateTime;
 import java.util.ArrayList;
@@ -29,7 +30,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.UUID;
-import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ExecStatus;
 import org.apache.syncope.common.lib.types.IdMImplementationType;
@@ -42,13 +42,13 @@ import org.apache.syncope.common.lib.types.UnmatchingRule;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
+import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
 import org.apache.syncope.core.persistence.api.dao.TaskExecDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
 import org.apache.syncope.core.persistence.api.entity.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.Implementation;
-import org.apache.syncope.core.persistence.api.entity.task.AnyTemplatePullTask;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationData;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.persistence.api.entity.task.PullTask;
@@ -80,6 +80,9 @@ public class TaskTest extends AbstractTest {
     @Autowired
     private UserDAO userDAO;
 
+    @Autowired
+    private RealmDAO realmDAO;
+
     @Autowired
     private ImplementationDAO implementationDAO;
 
@@ -112,7 +115,7 @@ public class TaskTest extends AbstractTest {
     }
 
     @Test
-    public void save() {
+    public void savePropagationTask() {
         ExternalResource resource = resourceDAO.find("ws-target-resource-1");
         assertNotNull(resource);
 
@@ -139,7 +142,6 @@ public class TaskTest extends AbstractTest {
 
         entityManager().flush();
 
-        resource = resourceDAO.find("ws-target-resource-1");
         assertTrue(taskDAO.<PropagationTask>findAll(
                 TaskType.PROPAGATION, resource, null, null, null, -1, -1, List.of()).
                 contains(task));
@@ -244,51 +246,45 @@ public class TaskTest extends AbstractTest {
 
     @Test
     public void savePullTask() {
-        ExternalResource resource = resourceDAO.find("ws-target-resource-1");
-        assertNotNull(resource);
-
-        AnyTemplatePullTask template = entityFactory.newEntity(AnyTemplatePullTask.class);
-        template.set(new UserTO());
-
         PullTask task = entityFactory.newEntity(PullTask.class);
         task.setName("savePullTask");
         task.setDescription("PullTask description");
         task.setActive(true);
         task.setPullMode(PullMode.FULL_RECONCILIATION);
-        task.add(template);
+        task.setJobDelegate(implementationDAO.find("PullJobDelegate"));
+        task.setDestinationRealm(realmDAO.getRoot());
         task.setCronExpression("BLA BLA");
         task.setMatchingRule(MatchingRule.UPDATE);
         task.setUnmatchingRule(UnmatchingRule.PROVISION);
 
+        // now adding PullActions
+        Implementation pullActions = entityFactory.newEntity(Implementation.class);
+        pullActions.setKey("PullActions" + UUID.randomUUID().toString());
+        pullActions.setEngine(ImplementationEngine.JAVA);
+        pullActions.setType(IdMImplementationType.PULL_ACTIONS);
+        pullActions.setBody(PullActions.class.getName());
+        pullActions = implementationDAO.save(pullActions);
+        entityManager().flush();
+
+        task.add(pullActions);
+
         // this save() fails because of an invalid Cron Expression
-        InvalidEntityException exception = null;
         try {
             taskDAO.save(task);
+            fail();
         } catch (InvalidEntityException e) {
-            exception = e;
+            assertNotNull(e);
         }
-        assertNotNull(exception);
-
         task.setCronExpression(null);
+
         // this save() fails because a PullTask requires a target resource
-        exception = null;
         try {
             taskDAO.save(task);
+            fail();
         } catch (InvalidEntityException e) {
-            exception = e;
+            assertNotNull(e);
         }
-        assertNotNull(exception);
-
-        task.setResource(resource);
-
-        Implementation pullActions = entityFactory.newEntity(Implementation.class);
-        pullActions.setKey("PullActions" + UUID.randomUUID().toString());
-        pullActions.setEngine(ImplementationEngine.JAVA);
-        pullActions.setType(IdMImplementationType.PULL_ACTIONS);
-        pullActions.setBody(PullActions.class.getName());
-        pullActions = implementationDAO.save(pullActions);
-
-        task.add(pullActions);
+        task.setResource(resourceDAO.find("ws-target-resource-1"));
 
         // this save() finally works
         task = (PullTask) taskDAO.save(task);
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
index 91be9326c3..b09251f4b3 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
@@ -384,21 +384,21 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
                         ExponentialBackOffPolicy eBackOffPolicy = new ExponentialBackOffPolicy();
                         if (params.length > 0) {
                             try {
-                                eBackOffPolicy.setInitialInterval(Long.valueOf(params[0]));
+                                eBackOffPolicy.setInitialInterval(Long.parseLong(params[0]));
                             } catch (NumberFormatException e) {
                                 LOG.error("Could not convert to long: {}", params[0], e);
                             }
                         }
                         if (params.length > 1) {
                             try {
-                                eBackOffPolicy.setMaxInterval(Long.valueOf(params[1]));
+                                eBackOffPolicy.setMaxInterval(Long.parseLong(params[1]));
                             } catch (NumberFormatException e) {
                                 LOG.error("Could not convert to long: {}", params[1], e);
                             }
                         }
                         if (params.length > 2) {
                             try {
-                                eBackOffPolicy.setMultiplier(Double.valueOf(params[2]));
+                                eBackOffPolicy.setMultiplier(Double.parseDouble(params[2]));
                             } catch (NumberFormatException e) {
                                 LOG.error("Could not convert to double: {}", params[2], e);
                             }
@@ -410,21 +410,21 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
                         ExponentialRandomBackOffPolicy erBackOffPolicy = new ExponentialRandomBackOffPolicy();
                         if (params.length > 0) {
                             try {
-                                erBackOffPolicy.setInitialInterval(Long.valueOf(params[0]));
+                                erBackOffPolicy.setInitialInterval(Long.parseLong(params[0]));
                             } catch (NumberFormatException e) {
                                 LOG.error("Could not convert to long: {}", params[0], e);
                             }
                         }
                         if (params.length > 1) {
                             try {
-                                erBackOffPolicy.setMaxInterval(Long.valueOf(params[1]));
+                                erBackOffPolicy.setMaxInterval(Long.parseLong(params[1]));
                             } catch (NumberFormatException e) {
                                 LOG.error("Could not convert to long: {}", params[1], e);
                             }
                         }
                         if (params.length > 2) {
                             try {
-                                erBackOffPolicy.setMultiplier(Double.valueOf(params[2]));
+                                erBackOffPolicy.setMultiplier(Double.parseDouble(params[2]));
                             } catch (NumberFormatException e) {
                                 LOG.error("Could not convert to double: {}", params[2], e);
                             }
@@ -437,7 +437,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
                         FixedBackOffPolicy fBackOffPolicy = new FixedBackOffPolicy();
                         if (params.length > 0) {
                             try {
-                                fBackOffPolicy.setBackOffPeriod(Long.valueOf(params[0]));
+                                fBackOffPolicy.setBackOffPeriod(Long.parseLong(params[0]));
                             } catch (NumberFormatException e) {
                                 LOG.error("Could not convert to long: {}", params[0], e);
                             }