diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/enforcement/PolicyEnforcementDelegatorImpl.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/enforcement/PolicyEnforcementDelegatorImpl.java index 3667f258c61..74e5d8e7f17 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/enforcement/PolicyEnforcementDelegatorImpl.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/enforcement/PolicyEnforcementDelegatorImpl.java @@ -44,6 +44,8 @@ import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementExcept import org.wso2.carbon.device.mgt.common.policy.mgt.Policy; import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation; import org.wso2.carbon.device.mgt.core.operation.mgt.OperationMgtConstants; +import org.wso2.carbon.device.mgt.core.operation.mgt.PolicyOperation; +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.policy.mgt.common.PolicyAdministratorPoint; import org.wso2.carbon.policy.mgt.common.PolicyEvaluationException; import org.wso2.carbon.policy.mgt.common.PolicyManagementException; @@ -96,6 +98,7 @@ public class PolicyEnforcementDelegatorImpl implements PolicyEnforcementDelegato */ if (devicePolicy == null || devicePolicy.getId() != policy.getId() || updatedPolicyIds.contains (policy.getId())) { + this.markPreviousPolicyBundlesRepeated(device); this.addPolicyRevokeOperation(deviceIdentifiers); this.addPolicyOperation(deviceIdentifiers, policy); } @@ -202,4 +205,29 @@ public class PolicyEnforcementDelegatorImpl implements PolicyEnforcementDelegato throw new PolicyDelegationException(msg, e); } } + + /** + * Update the previous pending policy operation's status as REPEATED + * @param device Device + * @throws PolicyDelegationException throws when getting pending operations + */ + public void markPreviousPolicyBundlesRepeated(Device device) throws PolicyDelegationException { + DeviceManagementProviderService deviceManagerService = PolicyManagementDataHolder.getInstance(). + getDeviceManagementService(); + try { + List operations = deviceManagerService.getPendingOperations(device); + for(Operation operation : operations) { + String operationCode = operation.getCode(); + if(PolicyOperation.POLICY_OPERATION_CODE.equals(operationCode) || + OperationMgtConstants.OperationCodes.POLICY_REVOKE.equals(operationCode)) { + operation.setStatus(Operation.Status.REPEATED); + deviceManagerService.updateOperation(device, operation); + } + } + } catch (OperationManagementException e) { + String msg = "Error occurred while retrieving pending operations of device id "+device.getId(); + log.error(msg, e); + throw new PolicyDelegationException(msg, e); + } + } }