http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/persistence-jpa/src/test/resources/domains/MasterContent.xml ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml index 2bc840d..20baa6b 100644 --- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml +++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml @@ -581,64 +581,64 @@ under the License. <ExternalResource name="ws-target-resource-1" connector_id="100" randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0" - propagationPriority="0" propagationPrimary="1" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + propagationPriority="1" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="ws-target-resource-2" connector_id="100" randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0" - propagationPriority="0" propagationPrimary="0" createTraceLevel="FAILURES" deleteTraceLevel="NONE" updateTraceLevel="ALL" syncTraceLevel="ALL" + createTraceLevel="FAILURES" deleteTraceLevel="NONE" updateTraceLevel="ALL" syncTraceLevel="ALL" syncPolicy_id="9" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="ws-target-resource-timeout" connector_id="102" randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0" - propagationPriority="0" propagationPrimary="1" createTraceLevel="FAILURES" deleteTraceLevel="NONE" updateTraceLevel="ALL" syncTraceLevel="ALL" + propagationPriority="1" createTraceLevel="FAILURES" deleteTraceLevel="NONE" updateTraceLevel="ALL" syncTraceLevel="ALL" jsonConf='[{"schema":{"name":"endpoint","displayName":null,"helpMessage":null,"type":"java.lang.String","required":true,"order":0,"confidential":false,"defaultValues":null},"overridable":true,"values":["http://localhost:${cargo.servlet.port}/syncope-fit-build-tools/services/provisioning"]}]' creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="ws-target-resource-list-mappings-1" connector_id="100" randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0" - propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="ws-target-resource-list-mappings-2" connector_id="100" randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0" - propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="ws-target-resource-delete" connector_id="102" randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0" - propagationPriority="2" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + propagationPriority="2" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="ws-target-resource-update" connector_id="100" randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0" - propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="resource-testdb" connector_id="101" randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0" - propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="resource-testdb2" connector_id="106" randomPwdIfNotProvided="1" enforceMandatoryCondition="1" overrideCapabilities="0" - propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="resource-csv" connector_id="104" randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0" syncPolicy_id="3" - propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="ws-target-resource-update-resetsynctoken" connector_id="100" enforceMandatoryCondition="1" - randomPwdIfNotProvided="0" propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="resource-ldap" connector_id="105" randomPwdIfNotProvided="1" enforceMandatoryCondition="1" overrideCapabilities="0" - propagationPriority="0" propagationPrimary="1" + propagationPriority="1" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> @@ -646,7 +646,7 @@ under the License. actionClassName="org.apache.syncope.core.provisioning.java.propagation.LDAPMembershipPropagationActions"/> <ExternalResource name="ws-target-resource-nopropagation" connector_id="103" randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0" - propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" passwordPolicy_id="4" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> @@ -654,17 +654,17 @@ under the License. <!-- The following three resources have been added to verify the issue SYNCOPE-68 --> <ExternalResource name="ws-target-resource-nopropagation2" connector_id="103" enforceMandatoryCondition="1" overrideCapabilities="0" - randomPwdIfNotProvided="0" propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="ws-target-resource-nopropagation3" connector_id="103" enforceMandatoryCondition="1" overrideCapabilities="0" - randomPwdIfNotProvided="0" propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="ws-target-resource-nopropagation4" connector_id="103" enforceMandatoryCondition="1" overrideCapabilities="0" - randomPwdIfNotProvided="0" propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" + randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> @@ -672,7 +672,7 @@ under the License. <ExternalResource name="resource-db-sync" connector_id="107" randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" syncTraceLevel="ALL" updateTraceLevel="ALL" enforceMandatoryCondition="0" - propagationPrimary="0" propagationPriority="0" overrideCapabilities="0" + overrideCapabilities="0" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> @@ -680,14 +680,14 @@ under the License. <ExternalResource name="resource-db-virattr" connector_id="107" randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" syncTraceLevel="ALL" updateTraceLevel="ALL" enforceMandatoryCondition="0" - propagationPrimary="0" propagationPriority="0" overrideCapabilities="0" + overrideCapabilities="0" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> <ExternalResource name="resource-db-scripted" connector_id="108" randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" syncTraceLevel="ALL" updateTraceLevel="ALL" enforceMandatoryCondition="0" - propagationPrimary="0" propagationPriority="0" overrideCapabilities="0" + overrideCapabilities="0" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> @@ -968,34 +968,34 @@ under the License. <Task DTYPE="PropagationTask" type="PROPAGATION" id="1" operation="UPDATE" objectClassName="__ACCOUNT__" resource_name="ws-target-resource-2" anyTypeKind="USER" anyKey="1" - xmlAttributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/> + attributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/> <TaskExec id="1" task_id="1" status="SUCCESS"/> <Task DTYPE="PropagationTask" type="PROPAGATION" id="2" operation="CREATE" objectClassName="__ACCOUNT__" resource_name="ws-target-resource-2" anyTypeKind="USER" anyKey="1" - xmlAttributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/> + attributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/> <Task DTYPE="PropagationTask" type="PROPAGATION" id="3" operation="DELETE" objectClassName="__ACCOUNT__" resource_name="ws-target-resource-2" anyTypeKind="USER" anyKey="1" - xmlAttributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"type","value":["type"]}]'/> + attributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"type","value":["type"]}]'/> <Task DTYPE="SyncTask" type="SYNCHRONIZATION" id="4" name="CSV (update matching; assign unmatching)" resource_name="resource-csv" destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="1" syncStatus="1" fullReconciliation="0" unmatchingRule="ASSIGN" matchingRule="UPDATE"/> <AnyTemplateSyncTask id="41" syncTask_id="4" anyType_name="USER" - template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["csv"],"derAttrs":[{"schema":"cn","readonly":false,"values":[""]}],"virAttrs":[],"resources":["resource-testdb"],"propagationStatuses":[],"relationships":[],"memberships":[{"leftType":null,"leftKey":0,"rightType":"GROUP","rightKey":8,"groupName":null}],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"type","readonly":false,"values":["email == '[email protected]'? 'TYPE_8': 'TYPE_OTHER'"]}]}'/> + template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["csv"],"derAttrs":[{"schema":"cn","readonly":false,"values":[""]}],"virAttrs":[],"resources":["resource-testdb"],"relationships":[],"memberships":[{"leftType":null,"leftKey":0,"rightType":"GROUP","rightKey":8,"groupName":null}],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"type","readonly":false,"values":["email == '[email protected]'? 'TYPE_8': 'TYPE_OTHER'"]}]}'/> <AnyTemplateSyncTask id="42" syncTask_id="4" anyType_name="GROUP" - template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"adynMembershipCond":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"propagationStatuses":[],"plainAttrs":[]}'/> + template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"adynMembershipCond":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/> <Task DTYPE="SchedTask" type="SCHEDULED" id="5" name="SampleJob Task" jobDelegateClassName="org.apache.syncope.fit.core.reference.TestSampleJobDelegate" cronExpression="0 0 0 1 * ?"/> <Task DTYPE="PropagationTask" type="PROPAGATION" id="6" operation="UPDATE" objectClassName="__ACCOUNT__" resource_name="ws-target-resource-nopropagation" anyTypeKind="USER" anyKey="1" - xmlAttributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/> + attributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/> <TaskExec id="6" task_id="6" status="SUCCESS"/> <Task DTYPE="SyncTask" type="SYNCHRONIZATION" id="7" name="TestDB Task" resource_name="resource-testdb" destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="0" syncStatus="1" fullReconciliation="1" unmatchingRule="PROVISION" matchingRule="UPDATE"/> <AnyTemplateSyncTask id="71" syncTask_id="7" anyType_name="USER" - template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"propagationStatuses":[],"relationships":[],"memberships":[],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"type","readonly":false,"values":["'type a'"]},{"schema":"userId","readonly":false,"values":["'[email protected]'"]},{"schema":"fullname","readonly":false,"values":["'reconciled fullname'"]},{"schema":"surname","readonly":false,"values":["'surname'"]}]}'/> + template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"relationships":[],"memberships":[],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"type","readonly":false,"values":["'type a'"]},{"schema":"userId","readonly":false,"values":["'[email protected]'"]},{"schema":"fullname","readonly":false,"values":["'reconciled fullname'"]},{"schema":"surname","readonly":false,"values":["'surname'"]}]}'/> <AnyTemplateSyncTask id="72" syncTask_id="7" anyType_name="GROUP" - template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"adynMembershipCond":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"propagationStatuses":[],"plainAttrs":[]}'/> + template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"adynMembershipCond":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/> <Task DTYPE="NotificationTask" type="NOTIFICATION" id="8" sender="[email protected]" subject="Notification for SYNCOPE-81" textBody="NOTIFICATION-81" htmlBody="NOTIFICATION-81" traceLevel="ALL"/> <Task DTYPE="SyncTask" type="SYNCHRONIZATION" id="9" name="TestDB2 Task" resource_name="resource-testdb2" @@ -1008,9 +1008,9 @@ under the License. destinationRealm_id="1" fullReconciliation="1" performCreate="1" performDelete="1" performUpdate="1" syncStatus="0" unmatchingRule="PROVISION" matchingRule="UPDATE"/> <AnyTemplateSyncTask id="1" syncTask_id="11" anyType_name="USER" - template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[{"schema":"virtualReadOnly","readonly":true,"values":[""]}],"resources":["resource-ldap"],"propagationStatuses":[],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[]}'/> + template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[{"schema":"virtualReadOnly","readonly":true,"values":[""]}],"resources":["resource-ldap"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[]}'/> <AnyTemplateSyncTask id="2" syncTask_id="11" anyType_name="GROUP" - template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"adynMembershipCond":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"propagationStatuses":[],"plainAttrs":[{"schema":"show","readonly":false,"values":["true"]}]}'/> + template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"adynMembershipCond":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[{"schema":"show","readonly":false,"values":["true"]}]}'/> <SyncTask_actionsClassNames SyncTask_id="11" actionClassName="org.apache.syncope.core.provisioning.java.sync.LDAPMembershipSyncActions"/> <Task DTYPE="SyncTask" type="SYNCHRONIZATION" id="12" name="VirAttrCache test" resource_name="resource-csv" destinationRealm_id="1" performCreate="0" performUpdate="1" performDelete="0" syncStatus="0" fullReconciliation="1" @@ -1075,9 +1075,9 @@ under the License. destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="1" syncStatus="1" fullReconciliation="0" unmatchingRule="PROVISION" matchingRule="UPDATE"/> <AnyTemplateSyncTask id="3" syncTask_id="24" anyType_name="USER" - template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":["resource-testdb"],"propagationStatuses":[],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[{"schema":"firstname","readonly":false,"values":[""]},{"schema":"userId","readonly":false,"values":["'test'"]},{"schema":"fullname","readonly":false,"values":["'test'"]},{"schema":"surname","readonly":false,"values":["'test'"]}]}'/> + template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":["resource-testdb"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[{"schema":"firstname","readonly":false,"values":[""]},{"schema":"userId","readonly":false,"values":["'test'"]},{"schema":"fullname","readonly":false,"values":["'test'"]},{"schema":"surname","readonly":false,"values":["'test'"]}]}'/> <AnyTemplateSyncTask id="4" syncTask_id="24" anyType_name="GROUP" - template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"adynMembershipCond":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"propagationStatuses":[],"plainAttrs":[]}'/> + template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"adynMembershipCond":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/> <Task DTYPE="SyncTask" type="SYNCHRONIZATION" id="25" name="CSV (unlink matching; ignore unmatching)" resource_name="resource-csv" destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="1" syncStatus="1" fullReconciliation="0" unmatchingRule="IGNORE" matchingRule="UNLINK"/> @@ -1086,7 +1086,7 @@ under the License. unmatchingRule="ASSIGN" matchingRule="IGNORE"/> <Task DTYPE="PropagationTask" type="PROPAGATION" id="27" operation="CREATE" objectClassName="__ACCOUNT__" resource_name="resource-testdb" anyTypeKind="USER" anyKey="1" - xmlAttributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/> + attributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/> <Task DTYPE="SyncTask" type="SYNCHRONIZATION" id="28" name="Scripted SQL" resource_name="resource-db-scripted" destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="1" syncStatus="0" fullReconciliation="0" unmatchingRule="PROVISION" matchingRule="UPDATE"/>
http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AnyObjectProvisioningManager.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AnyObjectProvisioningManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AnyObjectProvisioningManager.java index d5571ab..df9a204 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AnyObjectProvisioningManager.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AnyObjectProvisioningManager.java @@ -26,5 +26,5 @@ import org.apache.syncope.common.lib.to.PropagationStatus; public interface AnyObjectProvisioningManager extends ProvisioningManager<AnyObjectTO, AnyObjectPatch> { - List<PropagationStatus> provision(Long key, Collection<String> resources); + List<PropagationStatus> provision(Long key, Collection<String> resources, boolean nullPriorityAsync); } http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/GroupProvisioningManager.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/GroupProvisioningManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/GroupProvisioningManager.java index ea258e5..3aae89f 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/GroupProvisioningManager.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/GroupProvisioningManager.java @@ -30,8 +30,8 @@ import org.apache.syncope.common.lib.to.GroupTO; public interface GroupProvisioningManager extends ProvisioningManager<GroupTO, GroupPatch> { Pair<Long, List<PropagationStatus>> create( - GroupTO groupTO, Map<Long, String> groupOwnerMap, Set<String> excludedResources); + GroupTO groupTO, Map<Long, String> groupOwnerMap, Set<String> excludedResources, boolean nullPriorityAsync); - List<PropagationStatus> provision(Long key, Collection<String> resources); + List<PropagationStatus> provision(Long key, Collection<String> resources, boolean nullPriorityAsync); } http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ProvisioningManager.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ProvisioningManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ProvisioningManager.java index add5b03..72a1253 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ProvisioningManager.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ProvisioningManager.java @@ -28,22 +28,22 @@ import org.apache.syncope.common.lib.to.PropagationStatus; public interface ProvisioningManager<T extends AnyTO, P extends AnyPatch> { - Pair<Long, List<PropagationStatus>> create(T anyTO); + Pair<Long, List<PropagationStatus>> create(T anyTO, boolean nullPriorityAsync); - Pair<Long, List<PropagationStatus>> create(T anyTO, Set<String> excludedResources); + Pair<Long, List<PropagationStatus>> create(T anyTO, Set<String> excludedResources, boolean nullPriorityAsync); - Pair<Long, List<PropagationStatus>> update(P anyMod); + Pair<Long, List<PropagationStatus>> update(P patch, boolean nullPriorityAsync); - Pair<Long, List<PropagationStatus>> update(P anyMod, Set<String> excludedResources); + Pair<Long, List<PropagationStatus>> update(P patch, Set<String> excludedResources, boolean nullPriorityAsync); - List<PropagationStatus> delete(Long anyKey); + List<PropagationStatus> delete(Long anyKey, boolean nullPriorityAsync); - List<PropagationStatus> delete(Long anyKey, Set<String> excludedResources); + List<PropagationStatus> delete(Long anyKey, Set<String> excludedResources, boolean nullPriorityAsync); Long unlink(P anyMod); Long link(P anyMod); - List<PropagationStatus> deprovision(Long anyKey, Collection<String> resources); + List<PropagationStatus> deprovision(Long anyKey, Collection<String> resources, boolean nullPriorityAsync); } http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/UserProvisioningManager.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/UserProvisioningManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/UserProvisioningManager.java index b29eee3..1f9b7ef 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/UserProvisioningManager.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/UserProvisioningManager.java @@ -26,30 +26,40 @@ import org.apache.syncope.common.lib.patch.StatusPatch; import org.apache.syncope.common.lib.patch.UserPatch; import org.apache.syncope.common.lib.to.PropagationStatus; import org.apache.syncope.common.lib.to.UserTO; -import org.apache.syncope.core.provisioning.api.sync.ProvisioningResult; +import org.apache.syncope.core.provisioning.api.sync.ProvisioningReport; public interface UserProvisioningManager extends ProvisioningManager<UserTO, UserPatch> { - Pair<Long, List<PropagationStatus>> activate(StatusPatch statusPatch); + Pair<Long, List<PropagationStatus>> activate(StatusPatch statusPatch, boolean nullPriorityAsync); - Pair<Long, List<PropagationStatus>> reactivate(StatusPatch statusPatch); + Pair<Long, List<PropagationStatus>> reactivate(StatusPatch statusPatch, boolean nullPriorityAsync); - Pair<Long, List<PropagationStatus>> suspend(StatusPatch statusPatch); + Pair<Long, List<PropagationStatus>> suspend(StatusPatch statusPatch, boolean nullPriorityAsync); void internalSuspend(Long key); - Pair<Long, List<PropagationStatus>> create(UserTO userTO, boolean storePassword); + Pair<Long, List<PropagationStatus>> create(UserTO userTO, boolean storePassword, boolean nullPriorityAsync); - Pair<Long, List<PropagationStatus>> create(UserTO userTO, boolean storePassword, - boolean disablePwdPolicyCheck, Boolean enabled, Set<String> excludedResources); + Pair<Long, List<PropagationStatus>> create( + UserTO userTO, + boolean storePassword, + boolean disablePwdPolicyCheck, + Boolean enabled, + Set<String> excludedResources, + boolean nullPriorityAsync); - Pair<Long, List<PropagationStatus>> update(UserPatch userPatch, Long key, - ProvisioningResult result, Boolean enabled, Set<String> excludedResources); + Pair<Long, List<PropagationStatus>> update( + UserPatch userPatch, + ProvisioningReport result, + Boolean enabled, + Set<String> excludedResources, + boolean nullPriorityAsync); void requestPasswordReset(Long key); void confirmPasswordReset(Long key, String token, String password); - List<PropagationStatus> provision(Long key, boolean changePwd, String password, Collection<String> resources); + List<PropagationStatus> provision( + Long key, boolean changePwd, String password, Collection<String> resources, boolean nullPriorityAsync); } http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationReporter.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationReporter.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationReporter.java index 20ae8df..d96b1a7 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationReporter.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationReporter.java @@ -18,6 +18,7 @@ */ package org.apache.syncope.core.provisioning.api.propagation; +import java.util.Collection; import java.util.List; import org.apache.syncope.common.lib.to.PropagationStatus; import org.apache.syncope.common.lib.types.PropagationTaskExecStatus; @@ -30,24 +31,29 @@ import org.identityconnectors.framework.common.objects.ConnectorObject; public interface PropagationReporter { /** - * Report propagation status after executions in case of success or non-blocking failure - * (e.g. on secondary resources). + * Report propagation status after executions in case blocking failure (e.g. on priority resources). * - * @param resourceName resource name. - * @param execStatus propagation execution status. - * @param failureReason propagation execution failure message. - * @param beforeObj retrieved connector object before operation execution. - * @param afterObj retrieved connector object after operation execution. + * @param failingResource failing resource name + * @param tasks propagation tasks performed before failure */ - void onSuccessOrSecondaryResourceFailures(String resourceName, PropagationTaskExecStatus execStatus, - String failureReason, ConnectorObject beforeObj, ConnectorObject afterObj); + void onPriorityResourceFailure(String failingResource, Collection<PropagationTask> tasks); /** - * Report propagation status after executions in case blocking failure (e.g. on primary resources). + * Report propagation status after executions in case of success or non-blocking failure + * (e.g. on non-priority resources). * - * @param tasks propagation tasks performed before failure + * @param propagationTask propagation task + * @param execStatus propagation execution status + * @param failureReason propagation execution failure message + * @param beforeObj retrieved connector object before operation execution + * @param afterObj retrieved connector object after operation execution */ - void onPrimaryResourceFailure(List<PropagationTask> tasks); + void onSuccessOrNonPriorityResourceFailures( + PropagationTask propagationTask, + PropagationTaskExecStatus execStatus, + String failureReason, + ConnectorObject beforeObj, + ConnectorObject afterObj); /** * Returns the list of propagation statuses. http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationTaskCallable.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationTaskCallable.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationTaskCallable.java new file mode 100644 index 0000000..84c4864 --- /dev/null +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationTaskCallable.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.core.provisioning.api.propagation; + +import java.util.concurrent.Callable; +import org.apache.syncope.core.persistence.api.entity.task.PropagationTask; +import org.apache.syncope.core.persistence.api.entity.task.TaskExec; + +public interface PropagationTaskCallable extends Callable<TaskExec> { + + void setExecutor(PropagationTaskExecutor executor); + + void setTask(PropagationTask task); + + void setReporter(PropagationReporter reporter); +} http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationTaskExecutor.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationTaskExecutor.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationTaskExecutor.java index d3b8870..ace29a2 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationTaskExecutor.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationTaskExecutor.java @@ -42,7 +42,18 @@ public interface PropagationTaskExecutor { String MANDATORY_NULL_OR_EMPTY_ATTR_NAME = "__MANDATORY_NULL_OR_EMPTY__"; /** - * Execute the given PropagationTask and returns the generated TaskExec. + * Creates new instances of {@link PropagationTaskCallable} for usage with + * {@link java.util.concurrent.CompletionService}. + * + * @param task to be executed + * @param reporter to report propagation execution status + * @return new {@link PropagationTaskCallable} instance for usage with + * {@link java.util.concurrent.CompletionService} + */ + PropagationTaskCallable newPropagationTaskCallable(PropagationTask task, PropagationReporter reporter); + + /** + * Execute the given PropagationTask and returns the generated {@link TaskExec}. * * @param task to be executed * @return the generated TaskExec @@ -67,11 +78,13 @@ public interface PropagationTaskExecutor { void execute(Collection<PropagationTask> tasks); /** - * Execute a collection of PropagationTask objects and invoke the given handler on each of these. - * The process is interrupted as soon as the result of the communication with a primary resource is in error. + * Execute a collection of PropagationTask objects. + * The process is interrupted as soon as the result of the communication with a resource with non-null priority is + * in error. * * @param tasks to be execute, in given order * @param reporter to report propagation execution status + * @param nullPriorityAsync asynchronously executes tasks related to resources with no priority */ - void execute(Collection<PropagationTask> tasks, PropagationReporter reporter); + void execute(Collection<PropagationTask> tasks, PropagationReporter reporter, boolean nullPriorityAsync); } http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningProfile.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningProfile.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningProfile.java index 6bab515..2e6e055 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningProfile.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningProfile.java @@ -34,7 +34,7 @@ public class ProvisioningProfile<T extends ProvisioningTask, A extends Provision private final T task; - private final List<ProvisioningResult> results = new ArrayList<>(); + private final List<ProvisioningReport> results = new ArrayList<>(); private boolean dryRun; @@ -55,7 +55,7 @@ public class ProvisioningProfile<T extends ProvisioningTask, A extends Provision return task; } - public Collection<ProvisioningResult> getResults() { + public Collection<ProvisioningReport> getResults() { return results; } http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningReport.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningReport.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningReport.java new file mode 100644 index 0000000..9e3c28a --- /dev/null +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningReport.java @@ -0,0 +1,140 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.core.provisioning.api.sync; + +import java.util.Collection; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.syncope.common.lib.types.ResourceOperation; +import org.apache.syncope.common.lib.types.TraceLevel; + +public class ProvisioningReport { + + public enum Status { + + SUCCESS, + IGNORE, + FAILURE + + } + + private String message; + + private Status status; + + private String anyType; + + private ResourceOperation operation; + + private Long key; + + private String name; + + public String getMessage() { + return message; + } + + public void setMessage(final String message) { + this.message = message; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public Long getKey() { + return key; + } + + public void setKey(final Long key) { + this.key = key; + } + + public Status getStatus() { + return status; + } + + public void setStatus(final Status status) { + this.status = status; + } + + public String getAnyType() { + return anyType; + } + + public void setAnyType(final String anyType) { + this.anyType = anyType; + } + + public ResourceOperation getOperation() { + return operation; + } + + public void setOperation(final ResourceOperation operation) { + this.operation = operation; + } + + @Override + public String toString() { + return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString(); + } + + /** + * Human readable report string, using the given trace level. + * + * @param level trace level + * @return String for certain levels, null for level NONE + */ + public String getReportString(final TraceLevel level) { + if (level == TraceLevel.SUMMARY) { + // No per entry log in this case. + return null; + } else if (level == TraceLevel.FAILURES && status == Status.FAILURE) { + // only report failures + return String.format("Failed %s (id/name): %d/%s with message: %s", operation, key, name, message); + } else { + // All + return String.format("%s %s (id/name): %d/%s %s", operation, status, key, name, + StringUtils.isBlank(message) + ? "" + : "with message: " + message); + } + } + + /** + * Helper method to invoke logging per synchronization result for the given trace level. + * + * @param results synchronization result + * @param level trace level + * @return report as string + */ + public static String produceReport(final Collection<ProvisioningReport> results, final TraceLevel level) { + StringBuilder sb = new StringBuilder(); + for (ProvisioningReport result : results) { + sb.append(result.getReportString(level)).append('\n'); + } + return sb.toString(); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningResult.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningResult.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningResult.java deleted file mode 100644 index 23af92d..0000000 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/ProvisioningResult.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.syncope.core.provisioning.api.sync; - -import java.util.Collection; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.builder.ReflectionToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import org.apache.syncope.common.lib.types.ResourceOperation; -import org.apache.syncope.common.lib.types.TraceLevel; - -public class ProvisioningResult { - - public enum Status { - - SUCCESS, - IGNORE, - FAILURE - - } - - private String message; - - private Status status; - - private String anyType; - - private ResourceOperation operation; - - private Long key; - - private String name; - - public String getMessage() { - return message; - } - - public void setMessage(final String message) { - this.message = message; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - - public Long getKey() { - return key; - } - - public void setKey(final Long key) { - this.key = key; - } - - public Status getStatus() { - return status; - } - - public void setStatus(final Status status) { - this.status = status; - } - - public String getAnyType() { - return anyType; - } - - public void setAnyType(final String anyType) { - this.anyType = anyType; - } - - public ResourceOperation getOperation() { - return operation; - } - - public void setOperation(final ResourceOperation operation) { - this.operation = operation; - } - - @Override - public String toString() { - return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString(); - } - - /** - * Human readable report string, using the given trace level. - * - * @param level trace level - * @return String for certain levels, null for level NONE - */ - public String getReportString(final TraceLevel level) { - if (level == TraceLevel.SUMMARY) { - // No per entry log in this case. - return null; - } else if (level == TraceLevel.FAILURES && status == Status.FAILURE) { - // only report failures - return String.format("Failed %s (id/name): %d/%s with message: %s", operation, key, name, message); - } else { - // All - return String.format("%s %s (id/name): %d/%s %s", operation, status, key, name, - StringUtils.isBlank(message) - ? "" - : "with message: " + message); - } - } - - /** - * Helper method to invoke logging per synchronization result for the given trace level. - * - * @param results synchronization result - * @param level trace level - * @return report as string - */ - public static String produceReport(final Collection<ProvisioningResult> results, final TraceLevel level) { - StringBuilder sb = new StringBuilder(); - for (ProvisioningResult result : results) { - sb.append(result.getReportString(level)).append('\n'); - } - return sb.toString(); - } -} http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/PushActions.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/PushActions.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/PushActions.java index c06a05f..fee3a45 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/PushActions.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/PushActions.java @@ -145,7 +145,7 @@ public interface PushActions extends ProvisioningActions { <A extends Any<?, ?>> void onError( ProvisioningProfile<?, ?> profile, A any, - ProvisioningResult result, + ProvisioningReport result, Exception error) throws JobExecutionException; /** @@ -160,5 +160,5 @@ public interface PushActions extends ProvisioningActions { <A extends Any<?, ?>> void after( ProvisioningProfile<?, ?> profile, A any, - ProvisioningResult result) throws JobExecutionException; + ProvisioningReport result) throws JobExecutionException; } http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/SyncActions.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/SyncActions.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/SyncActions.java index fd36d39..e7c8d8c 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/SyncActions.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/sync/SyncActions.java @@ -182,7 +182,7 @@ public interface SyncActions extends ProvisioningActions { void onError( ProvisioningProfile<?, ?> profile, SyncDelta delta, - ProvisioningResult result, + ProvisioningReport result, Exception error) throws JobExecutionException; /** @@ -200,5 +200,5 @@ public interface SyncActions extends ProvisioningActions { ProvisioningProfile<?, ?> profile, SyncDelta delta, A any, - ProvisioningResult result) throws JobExecutionException; + ProvisioningReport result) throws JobExecutionException; } http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java index ffecdb9..f2b489f 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java @@ -35,21 +35,16 @@ import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO; import org.apache.syncope.core.persistence.api.entity.task.PropagationTask; import org.apache.syncope.core.provisioning.api.AnyObjectProvisioningManager; import org.apache.syncope.core.provisioning.api.WorkflowResult; -import org.apache.syncope.core.provisioning.api.propagation.PropagationException; import org.apache.syncope.core.provisioning.api.propagation.PropagationManager; import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter; import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor; import org.apache.syncope.core.misc.spring.ApplicationContextProvider; import org.apache.syncope.core.provisioning.api.VirAttrHandler; import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisioningManager { - private static final Logger LOG = LoggerFactory.getLogger(AnyObjectProvisioningManager.class); - @Autowired protected AnyObjectWorkflowAdapter awfAdapter; @@ -66,13 +61,13 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin protected AnyObjectDAO anyObjectDAO; @Override - public Pair<Long, List<PropagationStatus>> create(final AnyObjectTO anyObjectTO) { - return create(anyObjectTO, Collections.<String>emptySet()); + public Pair<Long, List<PropagationStatus>> create(final AnyObjectTO anyObjectTO, final boolean nullPriorityAsync) { + return create(anyObjectTO, Collections.<String>emptySet(), nullPriorityAsync); } @Override public Pair<Long, List<PropagationStatus>> create( - final AnyObjectTO anyObjectTO, final Set<String> excludedResources) { + final AnyObjectTO anyObjectTO, final Set<String> excludedResources, final boolean nullPriorityAsync) { WorkflowResult<Long> created = awfAdapter.create(anyObjectTO); @@ -84,24 +79,21 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin excludedResources); PropagationReporter propagationReporter = ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class); - try { - taskExecutor.execute(tasks, propagationReporter); - } catch (PropagationException e) { - LOG.error("Error propagation primary resource", e); - propagationReporter.onPrimaryResourceFailure(tasks); - } + taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync); return new ImmutablePair<>(created.getResult(), propagationReporter.getStatuses()); } @Override - public Pair<Long, List<PropagationStatus>> update(final AnyObjectPatch anyObjectPatch) { - return update(anyObjectPatch, Collections.<String>emptySet()); + public Pair<Long, List<PropagationStatus>> update( + final AnyObjectPatch anyObjectPatch, final boolean nullPriorityAsync) { + + return update(anyObjectPatch, Collections.<String>emptySet(), nullPriorityAsync); } @Override public Pair<Long, List<PropagationStatus>> update( - final AnyObjectPatch anyObjectPatch, final Set<String> excludedResources) { + final AnyObjectPatch anyObjectPatch, final Set<String> excludedResources, final boolean nullPriorityAsync) { WorkflowResult<Long> updated = awfAdapter.update(anyObjectPatch); @@ -115,23 +107,20 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin excludedResources); PropagationReporter propagationReporter = ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class); - try { - taskExecutor.execute(tasks, propagationReporter); - } catch (PropagationException e) { - LOG.error("Error propagation primary resource", e); - propagationReporter.onPrimaryResourceFailure(tasks); - } + taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync); return new ImmutablePair<>(updated.getResult(), propagationReporter.getStatuses()); } @Override - public List<PropagationStatus> delete(final Long key) { - return delete(key, Collections.<String>emptySet()); + public List<PropagationStatus> delete(final Long key, final boolean nullPriorityAsync) { + return delete(key, Collections.<String>emptySet(), nullPriorityAsync); } @Override - public List<PropagationStatus> delete(final Long key, final Set<String> excludedResources) { + public List<PropagationStatus> delete( + final Long key, final Set<String> excludedResources, final boolean nullPriorityAsync) { + List<PropagationTask> tasks = propagationManager.getDeleteTasks( AnyTypeKind.ANY_OBJECT, key, @@ -139,12 +128,7 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin excludedResources); PropagationReporter propagationReporter = ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class); - try { - taskExecutor.execute(tasks, propagationReporter); - } catch (PropagationException e) { - LOG.error("Error propagation primary resource", e); - propagationReporter.onPrimaryResourceFailure(tasks); - } + taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync); awfAdapter.delete(key); @@ -162,7 +146,9 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin } @Override - public List<PropagationStatus> provision(final Long key, final Collection<String> resources) { + public List<PropagationStatus> provision( + final Long key, final Collection<String> resources, final boolean nullPriorityAsync) { + PropagationByResource propByRes = new PropagationByResource(); propByRes.addAll(ResourceOperation.UPDATE, resources); @@ -176,17 +162,15 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin null); PropagationReporter propagationReporter = ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class); - try { - taskExecutor.execute(tasks, propagationReporter); - } catch (PropagationException e) { - LOG.error("Error propagation primary resource", e); - propagationReporter.onPrimaryResourceFailure(tasks); - } + taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync); + return propagationReporter.getStatuses(); } @Override - public List<PropagationStatus> deprovision(final Long key, final Collection<String> resources) { + public List<PropagationStatus> deprovision( + final Long key, final Collection<String> resources, final boolean nullPriorityAsync) { + PropagationByResource propByRes = new PropagationByResource(); propByRes.addAll(ResourceOperation.DELETE, resources); @@ -197,12 +181,8 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin CollectionUtils.removeAll(anyObjectDAO.findAllResourceNames(anyObjectDAO.authFind(key)), resources)); PropagationReporter propagationReporter = ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class); - try { - taskExecutor.execute(tasks, propagationReporter); - } catch (PropagationException e) { - LOG.error("Error propagation primary resource", e); - propagationReporter.onPrimaryResourceFailure(tasks); - } + taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync); + return propagationReporter.getStatuses(); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java index 9e3d566..831e41f 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java @@ -25,8 +25,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Set; import org.apache.commons.collections4.CollectionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -42,7 +40,6 @@ import org.apache.syncope.core.persistence.api.dao.GroupDAO; import org.apache.syncope.core.persistence.api.entity.task.PropagationTask; import org.apache.syncope.core.provisioning.api.GroupProvisioningManager; import org.apache.syncope.core.provisioning.api.WorkflowResult; -import org.apache.syncope.core.provisioning.api.propagation.PropagationException; import org.apache.syncope.core.provisioning.api.propagation.PropagationManager; import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter; import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor; @@ -52,8 +49,6 @@ import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter; public class DefaultGroupProvisioningManager implements GroupProvisioningManager { - private static final Logger LOG = LoggerFactory.getLogger(GroupProvisioningManager.class); - @Autowired protected GroupWorkflowAdapter gwfAdapter; @@ -70,12 +65,14 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager protected VirAttrHandler virtAttrHandler; @Override - public Pair<Long, List<PropagationStatus>> create(final GroupTO group) { - return create(group, Collections.<String>emptySet()); + public Pair<Long, List<PropagationStatus>> create(final GroupTO group, final boolean nullPriorityAsync) { + return create(group, Collections.<String>emptySet(), nullPriorityAsync); } @Override - public Pair<Long, List<PropagationStatus>> create(final GroupTO groupTO, final Set<String> excludedResources) { + public Pair<Long, List<PropagationStatus>> create( + final GroupTO groupTO, final Set<String> excludedResources, final boolean nullPriorityAsync) { + WorkflowResult<Long> created = gwfAdapter.create(groupTO); List<PropagationTask> tasks = propagationManager.getCreateTasks( @@ -86,19 +83,17 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager excludedResources); PropagationReporter propagationReporter = ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class); - try { - taskExecutor.execute(tasks, propagationReporter); - } catch (PropagationException e) { - LOG.error("Error propagation primary resource", e); - propagationReporter.onPrimaryResourceFailure(tasks); - } + taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync); return new ImmutablePair<>(created.getResult(), propagationReporter.getStatuses()); } @Override public Pair<Long, List<PropagationStatus>> create( - final GroupTO groupTO, final Map<Long, String> groupOwnerMap, final Set<String> excludedResources) { + final GroupTO groupTO, + final Map<Long, String> groupOwnerMap, + final Set<String> excludedResources, + final boolean nullPriorityAsync) { WorkflowResult<Long> created = gwfAdapter.create(groupTO); @@ -116,24 +111,19 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager excludedResources); PropagationReporter propagationReporter = ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class); - try { - taskExecutor.execute(tasks, propagationReporter); - } catch (PropagationException e) { - LOG.error("Error propagation primary resource", e); - propagationReporter.onPrimaryResourceFailure(tasks); - } + taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync); return new ImmutablePair<>(created.getResult(), null); } @Override - public Pair<Long, List<PropagationStatus>> update(final GroupPatch groupPatch) { - return update(groupPatch, Collections.<String>emptySet()); + public Pair<Long, List<PropagationStatus>> update(final GroupPatch groupPatch, final boolean nullPriorityAsync) { + return update(groupPatch, Collections.<String>emptySet(), nullPriorityAsync); } @Override public Pair<Long, List<PropagationStatus>> update( - final GroupPatch groupPatch, final Set<String> excludedResources) { + final GroupPatch groupPatch, final Set<String> excludedResources, final boolean nullPriorityAsync) { WorkflowResult<Long> updated = gwfAdapter.update(groupPatch); @@ -147,23 +137,20 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager excludedResources); PropagationReporter propagationReporter = ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class); - try { - taskExecutor.execute(tasks, propagationReporter); - } catch (PropagationException e) { - LOG.error("Error propagation primary resource", e); - propagationReporter.onPrimaryResourceFailure(tasks); - } + taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync); return new ImmutablePair<>(updated.getResult(), propagationReporter.getStatuses()); } @Override - public List<PropagationStatus> delete(final Long key) { - return delete(key, Collections.<String>emptySet()); + public List<PropagationStatus> delete(final Long key, final boolean nullPriorityAsync) { + return delete(key, Collections.<String>emptySet(), nullPriorityAsync); } @Override - public List<PropagationStatus> delete(final Long key, final Set<String> excludedResources) { + public List<PropagationStatus> delete( + final Long key, final Set<String> excludedResources, final boolean nullPriorityAsync) { + List<PropagationTask> tasks = new ArrayList<>(); // Generate propagation tasks for deleting users and any objects from group resources, @@ -196,12 +183,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager PropagationReporter propagationReporter = ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class); - try { - taskExecutor.execute(tasks, propagationReporter); - } catch (PropagationException e) { - LOG.error("Error propagation primary resource", e); - propagationReporter.onPrimaryResourceFailure(tasks); - } + taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync); gwfAdapter.delete(key); @@ -215,7 +197,9 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager } @Override - public List<PropagationStatus> provision(final Long key, final Collection<String> resources) { + public List<PropagationStatus> provision( + final Long key, final Collection<String> resources, final boolean nullPriorityAsync) { + PropagationByResource propByRes = new PropagationByResource(); propByRes.addAll(ResourceOperation.UPDATE, resources); @@ -229,17 +213,15 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager null); PropagationReporter propagationReporter = ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class); - try { - taskExecutor.execute(tasks, propagationReporter); - } catch (PropagationException e) { - LOG.error("Error propagation primary resource", e); - propagationReporter.onPrimaryResourceFailure(tasks); - } + taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync); + return propagationReporter.getStatuses(); } @Override - public List<PropagationStatus> deprovision(final Long key, final Collection<String> resources) { + public List<PropagationStatus> deprovision( + final Long key, final Collection<String> resources, final boolean nullPriorityAsync) { + PropagationByResource propByRes = new PropagationByResource(); propByRes.addAll(ResourceOperation.DELETE, resources); @@ -250,12 +232,8 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager CollectionUtils.removeAll(groupDAO.authFind(key).getResourceNames(), resources)); PropagationReporter propagationReporter = ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class); - try { - taskExecutor.execute(tasks, propagationReporter); - } catch (PropagationException e) { - LOG.error("Error propagation primary resource", e); - propagationReporter.onPrimaryResourceFailure(tasks); - } + taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync); + return propagationReporter.getStatuses(); }
