diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/manual/DummyItsmIntegrationConnectorInstance.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/manual/DummyItsmIntegrationConnectorInstance.java index 6624220f68b..6585b1e92fa 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/manual/DummyItsmIntegrationConnectorInstance.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/manual/DummyItsmIntegrationConnectorInstance.java @@ -84,8 +84,7 @@ public OperationResultStatus queryOperationStatus(String asynchronousOperationRe @Override - protected String createTicketAdd(PrismObject object, - Collection additionalOperations, OperationResult result) throws CommunicationException, + protected String createTicketAdd(PrismObject object, OperationResult result) throws CommunicationException, GenericFrameworkException, SchemaException, ObjectAlreadyExistsException, ConfigurationException { DummyItsm itsm = DummyItsm.getInstance(); String identifier; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/multi/TestMultiConnectorResources.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/multi/TestMultiConnectorResources.java index 07a4afa3e1a..88bbcdb0b23 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/multi/TestMultiConnectorResources.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/multi/TestMultiConnectorResources.java @@ -65,6 +65,8 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti super.initSystem(initTask, initResult); initDummyResourcePirate(RESOURCE_DUMMY_OPALINE_NAME, RESOURCE_DUMMY_OPALINE_FILE, RESOURCE_DUMMY_OPALINE_OID, initTask, initResult); + DummyResourceContoller opalineScriptController = DummyResourceContoller.create(RESOURCE_DUMMY_OPALINE_SCRIPT_NAME, getDummyResourceObject(RESOURCE_DUMMY_OPALINE_NAME)); + dummyResourceCollection.initDummyResource(RESOURCE_DUMMY_OPALINE_SCRIPT_NAME, opalineScriptController); repoAddObjectFromFile(SECURITY_POLICY_FILE, initResult); repoAddObjectFromFile(PASSWORD_POLICY_BENEVOLENT_FILE, initResult); @@ -73,7 +75,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti repoAddObjectFromFile(USER_GUYBRUSH_FILE, true, initResult); } - @Test(enabled = false) // MID-5921 + @Test public void test000Sanity() throws Exception { final String TEST_NAME = "test000Sanity"; displayTestTitle(TEST_NAME); @@ -93,7 +95,7 @@ public void test000Sanity() throws Exception { assertEquals("Wrong OPALINE-SCRIPT useless string", CONF_USELESS_SCRIPT, getDummyResource(RESOURCE_DUMMY_OPALINE_SCRIPT_NAME).getUselessString()); } - @Test(enabled = false) // MID-5921 + @Test public void test100JackAssignDummyOpaline() throws Exception { final String TEST_NAME = "test100JackAssignDummyOpaline"; displayTestTitle(TEST_NAME); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java index b77f8144774..c7ca0ca5308 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java @@ -35,6 +35,7 @@ import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.schema.util.ShadowUtil; import com.evolveum.midpoint.task.api.RunningTask; +import com.evolveum.midpoint.task.api.StateReporter; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.Tracer; import com.evolveum.midpoint.util.DebugUtil; @@ -250,21 +251,20 @@ public AsynchronousOperationReturnValue> addResourceObje checkForCapability(ctx, CreateCapabilityType.class, result); - Collection additionalOperations = new ArrayList<>(); - addExecuteScriptOperation(additionalOperations, ProvisioningOperationTypeType.ADD, scripts, resource, result); + executeProvisioningScripts(ctx, ProvisioningOperationTypeType.ADD, BeforeAfterType.BEFORE, scripts, result); + entitlementConverter.processEntitlementsAdd(ctx, shadowClone); ConnectorInstance connector = ctx.getConnector(CreateCapabilityType.class, result); AsynchronousOperationReturnValue>> connectorAsyncOpRet; try { if (LOGGER.isDebugEnabled()) { - LOGGER.debug("PROVISIONING ADD operation on resource {}\n ADD object:\n{}\n additional operations:\n{}", - resource.asPrismObject(), shadowType.asPrismObject().debugDump(), - SchemaDebugUtil.debugDump(additionalOperations, 2)); + LOGGER.debug("PROVISIONING ADD operation on resource {}\n ADD object:\n{}\n", + resource.asPrismObject(), shadowType.asPrismObject().debugDump()); } transformActivationAttributesAdd(ctx, shadowType, result); - connectorAsyncOpRet = connector.addObject(shadowClone, additionalOperations, ctx, result); + connectorAsyncOpRet = connector.addObject(shadowClone, ctx, result); resourceAttributesAfterAdd = connectorAsyncOpRet.getReturnValue(); if (LOGGER.isDebugEnabled()) { @@ -297,6 +297,8 @@ public AsynchronousOperationReturnValue> addResourceObje LOGGER.trace("Added resource object {}", shadow); + executeProvisioningScripts(ctx, ProvisioningOperationTypeType.ADD, BeforeAfterType.AFTER, scripts, result); + computeResultStatus(result); AsynchronousOperationReturnValue> asyncOpRet = AsynchronousOperationReturnValue.wrap(shadow, result); @@ -391,9 +393,7 @@ public AsynchronousOperationResult deleteResourceObject(ProvisioningContext ctx, // Execute entitlement modification on other objects (if needed) executeEntitlementChangesDelete(ctx, shadow, scripts, connOptions, result); - Collection additionalOperations = new ArrayList<>(); - addExecuteScriptOperation(additionalOperations, ProvisioningOperationTypeType.DELETE, scripts, ctx.getResource(), - result); + executeProvisioningScripts(ctx, ProvisioningOperationTypeType.DELETE, BeforeAfterType.BEFORE, scripts, result); ConnectorInstance connector = ctx.getConnector(DeleteCapabilityType.class, result); AsynchronousOperationResult connectorAsyncOpRet = null; @@ -401,10 +401,9 @@ public AsynchronousOperationResult deleteResourceObject(ProvisioningContext ctx, if (LOGGER.isDebugEnabled()) { LOGGER.debug( - "PROVISIONING DELETE operation on {}\n DELETE object, object class {}, identified by:\n{}\n additional operations:\n{}", + "PROVISIONING DELETE operation on {}\n DELETE object, object class {}, identified by:\n{}", ctx.getResource(), shadow.asObjectable().getObjectClass(), - SchemaDebugUtil.debugDump(identifiers), - SchemaDebugUtil.debugDump(additionalOperations)); + SchemaDebugUtil.debugDump(identifiers)); } if (!ResourceTypeUtil.isDeleteCapabilityEnabled(ctx.getResource())){ @@ -413,7 +412,7 @@ public AsynchronousOperationResult deleteResourceObject(ProvisioningContext ctx, throw e; } - connectorAsyncOpRet = connector.deleteObject(ctx.getObjectClassDefinition(), additionalOperations, shadow, identifiers, ctx, result); + connectorAsyncOpRet = connector.deleteObject(ctx.getObjectClassDefinition(), shadow, identifiers, ctx, result); computeResultStatus(result); LOGGER.debug("PROVISIONING DELETE: {}", result.getStatus()); @@ -446,8 +445,10 @@ public AsynchronousOperationResult deleteResourceObject(ProvisioningContext ctx, throw ex; } - LOGGER.trace("Deleted resource object {}", shadow); + + executeProvisioningScripts(ctx, ProvisioningOperationTypeType.DELETE, BeforeAfterType.AFTER, scripts, result); + AsynchronousOperationResult aResult = AsynchronousOperationResult.wrap(result); updateQuantum(ctx, connector, aResult, parentResult); if (connectorAsyncOpRet != null) { @@ -568,9 +569,6 @@ public AsynchronousOperationReturnValue> convertToPropertyDelta( } @SuppressWarnings("rawtypes") - private AsynchronousOperationReturnValue> executeModify(ProvisioningContext ctx, - PrismObject currentShadow, Collection> identifiers, - Collection operations, ConnectorOperationOptions connOptions, OperationResult parentResult) + private AsynchronousOperationReturnValue> executeModify(ProvisioningContext ctx, PrismObject currentShadow, Collection> identifiers, Collection operations, OperationProvisioningScriptsType scripts, OperationResult parentResult, ConnectorOperationOptions connOptions) throws ObjectNotFoundException, CommunicationException, SchemaException, SecurityViolationException, PolicyViolationException, ConfigurationException, ObjectAlreadyExistsException, ExpressionEvaluationException { Collection sideEffectChanges = new HashSet<>(); @@ -696,7 +692,9 @@ private AsynchronousOperationReturnValue> connectorAsyncOpRet = null; try { @@ -734,8 +732,6 @@ private AsynchronousOperationReturnValue> asyncOpRet = AsynchronousOperationReturnValue.wrap(sideEffectChanges, parentResult); if (connectorAsyncOpRet != null) { asyncOpRet.setOperationType(connectorAsyncOpRet.getOperationType()); @@ -1207,7 +1205,7 @@ private void executeEntitlements(ProvisioningContext subjectCtx, OperationResult result = parentResult.createMinorSubresult(OPERATION_MODIFY_ENTITLEMENT); try { - executeModify(entitlementCtx, entry.getValue().getCurrentShadow(), allIdentifiers, operations, connOptions, result); + executeModify(entitlementCtx, entry.getValue().getCurrentShadow(), allIdentifiers, operations, null, result, connOptions); result.recordSuccess(); @@ -2519,27 +2517,62 @@ private String getLockoutLockedValue(ActivationLockoutStatusCapabilityType capAc return capActStatus.getLockedValue().iterator().next(); } - private void addExecuteScriptOperation(Collection operations, ProvisioningOperationTypeType type, - OperationProvisioningScriptsType scripts, ResourceType resource, OperationResult result) throws SchemaException { + private void executeProvisioningScripts(ProvisioningContext ctx, ProvisioningOperationTypeType provisioningOperationType, + BeforeAfterType beforeAfter, OperationProvisioningScriptsType scripts, OperationResult result) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, ExpressionEvaluationException, GenericConnectorException { + Collection operations = determineExecuteScriptOperations(provisioningOperationType, beforeAfter, scripts, ctx.getResource(), result); + if (operations == null) { + return; + } + ConnectorInstance connector = ctx.getConnector(ScriptCapabilityType.class, result); + for (ExecuteProvisioningScriptOperation operation : operations) { + StateReporter reporter = new StateReporter(ctx.getResource().getOid(), ctx.getTask()); + + try { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("PROVISIONING SCRIPT EXECUTION {} {} operation on resource {}", + beforeAfter.value(), provisioningOperationType.value(), + ctx.getResource()); + } + + Object returnedValue = connector.executeScript(operation, reporter, result); + + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("PROVISIONING SCRIPT EXECUTION {} {} successful, returned value: {}", returnedValue); + } + + } catch (CommunicationException ex) { + result.recordFatalError( + "Could not execute provisioning script. Error communicating with the connector " + connector + ": " + ex.getMessage(), ex); + throw new CommunicationException("Error communicating with the connector " + connector + ": " + + ex.getMessage(), ex); + } catch (GenericFrameworkException ex) { + result.recordFatalError("Could not execute provisioning script. Generic error in connector: " + ex.getMessage(), ex); + throw new GenericConnectorException("Generic error in connector: " + ex.getMessage(), ex); + } + + } + } + + private Collection determineExecuteScriptOperations(ProvisioningOperationTypeType provisioningOperationType, + BeforeAfterType beforeAfter, OperationProvisioningScriptsType scripts, ResourceType resource, OperationResult result) throws SchemaException { if (scripts == null) { // No warning needed, this is quite normal - LOGGER.trace("Skipping creating script operation to execute. Scripts was not defined."); - return; + LOGGER.trace("Skipping creating script operation to execute. No scripts were defined."); + return null; } + Collection operations = new ArrayList<>(); for (OperationProvisioningScriptType script : scripts.getScript()) { for (ProvisioningOperationTypeType operationType : script.getOperation()) { - if (type.equals(operationType)) { + if (provisioningOperationType.equals(operationType) && beforeAfter.equals(script.getOrder())) { ExecuteProvisioningScriptOperation scriptOperation = ProvisioningUtil.convertToScriptOperation( script, "script value for " + operationType + " in " + resource, prismContext); - - scriptOperation.setScriptOrder(script.getOrder()); - LOGGER.trace("Created script operation: {}", SchemaDebugUtil.prettyPrint(scriptOperation)); operations.add(scriptOperation); } } } + return operations; } public AsynchronousOperationResult refreshOperationStatus(ProvisioningContext ctx, diff --git a/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/ConnectorInstance.java b/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/ConnectorInstance.java index e5959a632dc..bd0c517d370 100644 --- a/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/ConnectorInstance.java +++ b/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/ConnectorInstance.java @@ -254,9 +254,8 @@ int count(ObjectClassComplexTypeDefinition objectClassDefinition, ObjectQuery qu * @return created object attributes. May be null. * @throws ObjectAlreadyExistsException object already exists on the resource */ - AsynchronousOperationReturnValue>> addObject(PrismObject object, Collection additionalOperations, StateReporter reporter, - OperationResult parentResult) throws CommunicationException, GenericFrameworkException, SchemaException, - ObjectAlreadyExistsException, ConfigurationException, SecurityViolationException, PolicyViolationException; + AsynchronousOperationReturnValue>> addObject(PrismObject object, StateReporter reporter, OperationResult parentResult) + throws CommunicationException, GenericFrameworkException, SchemaException, ObjectAlreadyExistsException, ConfigurationException, SecurityViolationException, PolicyViolationException; /** * TODO: This should return indication how the operation went, e.g. what changes were applied, what were not @@ -281,7 +280,7 @@ AsynchronousOperationReturnValue> modi throws ObjectNotFoundException, CommunicationException, GenericFrameworkException, SchemaException, SecurityViolationException, PolicyViolationException, ObjectAlreadyExistsException, ConfigurationException; - AsynchronousOperationResult deleteObject(ObjectClassComplexTypeDefinition objectClass, Collection additionalOperations, PrismObject shadow, Collection> identifiers, StateReporter reporter, + AsynchronousOperationResult deleteObject(ObjectClassComplexTypeDefinition objectClass, PrismObject shadow, Collection> identifiers, StateReporter reporter, OperationResult parentResult) throws ObjectNotFoundException, CommunicationException, GenericFrameworkException, SchemaException, ConfigurationException, SecurityViolationException, PolicyViolationException; diff --git a/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/ExecuteProvisioningScriptOperation.java b/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/ExecuteProvisioningScriptOperation.java index dcc907f797f..3a2d1daf454 100644 --- a/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/ExecuteProvisioningScriptOperation.java +++ b/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/ExecuteProvisioningScriptOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2017 Evolveum and contributors + * Copyright (c) 2010-2019 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -10,6 +10,7 @@ import java.util.List; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; +import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.xml.ns._public.common.common_3.BeforeAfterType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CriticalityType; @@ -17,7 +18,7 @@ * * @author Radovan Semancik */ -public class ExecuteProvisioningScriptOperation extends Operation { +public class ExecuteProvisioningScriptOperation implements DebugDumpable { private static final int DEBUG_MAX_CODE_LENGTH = 32; @@ -29,8 +30,6 @@ public class ExecuteProvisioningScriptOperation extends Operation { private String textCode; private String language; - private BeforeAfterType scriptOrder; - private CriticalityType criticality; public ExecuteProvisioningScriptOperation() { @@ -76,14 +75,6 @@ public void setLanguage(String language) { this.language = language; } - public BeforeAfterType getScriptOrder() { - return scriptOrder; - } - - public void setScriptOrder(BeforeAfterType scriptOrder) { - this.scriptOrder = scriptOrder; - } - public CriticalityType getCriticality() { return criticality; } @@ -101,7 +92,6 @@ public int hashCode() { result = prime * result + ((criticality == null) ? 0 : criticality.hashCode()); result = prime * result + ((language == null) ? 0 : language.hashCode()); result = prime * result + (resourceHost ? 1231 : 1237); - result = prime * result + ((scriptOrder == null) ? 0 : scriptOrder.hashCode()); result = prime * result + ((textCode == null) ? 0 : textCode.hashCode()); return result; } @@ -141,9 +131,6 @@ public boolean equals(Object obj) { if (resourceHost != other.resourceHost) { return false; } - if (scriptOrder != other.scriptOrder) { - return false; - } if (textCode == null) { if (other.textCode != null) { return false; @@ -176,7 +163,6 @@ private String toStringInternal() { if (resourceHost) { sb.append("on resource "); } - sb.append(scriptOrder); sb.append(" : "); if (textCode.length() <= DEBUG_MAX_CODE_LENGTH) { sb.append(textCode); diff --git a/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/connectors/AbstractManualConnectorInstance.java b/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/connectors/AbstractManualConnectorInstance.java index 1b8942b9776..a7654b02b4a 100644 --- a/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/connectors/AbstractManualConnectorInstance.java +++ b/provisioning/ucf-api/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/connectors/AbstractManualConnectorInstance.java @@ -72,8 +72,7 @@ public abstract class AbstractManualConnectorInstance extends AbstractManagedCon // Operations to be implemented in the subclasses. These operations create the tickets. - protected abstract String createTicketAdd(PrismObject object, - Collection additionalOperations, OperationResult result) throws CommunicationException, + protected abstract String createTicketAdd(PrismObject object, OperationResult result) throws CommunicationException, GenericFrameworkException, SchemaException, ObjectAlreadyExistsException, ConfigurationException; protected abstract String createTicketModify(ObjectClassComplexTypeDefinition objectClass, @@ -88,7 +87,7 @@ protected abstract String createTicketDelete(ObjectClassComplexTypeDefinition ob @Override public AsynchronousOperationReturnValue>> addObject( - PrismObject object, Collection additionalOperations, + PrismObject object, StateReporter reporter, OperationResult parentResult) throws CommunicationException, GenericFrameworkException, SchemaException, ObjectAlreadyExistsException, ConfigurationException { @@ -101,7 +100,7 @@ public AsynchronousOperationReturnValue>> addObj try { - ticketIdentifier = createTicketAdd(object, additionalOperations, result); + ticketIdentifier = createTicketAdd(object, result); } catch (CommunicationException | GenericFrameworkException | SchemaException | ObjectAlreadyExistsException | ConfigurationException | RuntimeException | Error e) { @@ -158,7 +157,7 @@ public AsynchronousOperationReturnValue additionalOperations, PrismObject shadow, + PrismObject shadow, Collection> identifiers, StateReporter reporter, OperationResult parentResult) throws ObjectNotFoundException, CommunicationException, GenericFrameworkException, SchemaException, ConfigurationException { diff --git a/provisioning/ucf-impl-builtin/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/builtin/ManualConnectorInstance.java b/provisioning/ucf-impl-builtin/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/builtin/ManualConnectorInstance.java index bea2fecd7b3..4ac35ac1ae2 100644 --- a/provisioning/ucf-impl-builtin/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/builtin/ManualConnectorInstance.java +++ b/provisioning/ucf-impl-builtin/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/builtin/ManualConnectorInstance.java @@ -128,8 +128,7 @@ public TaskManager getTaskManager() { } @Override - protected String createTicketAdd(PrismObject object, - Collection additionalOperations, OperationResult result) throws SchemaException, + protected String createTicketAdd(PrismObject object, OperationResult result) throws SchemaException, ObjectAlreadyExistsException { LOGGER.debug("Creating case to add account\n{}", object.debugDump(1)); ObjectDelta objectDelta = DeltaFactory.Object.createAddDelta(object); diff --git a/provisioning/ucf-impl-builtin/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/builtin/async/AsyncUpdateConnectorInstance.java b/provisioning/ucf-impl-builtin/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/builtin/async/AsyncUpdateConnectorInstance.java index 3b4e49c02ed..98983052bb3 100644 --- a/provisioning/ucf-impl-builtin/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/builtin/async/AsyncUpdateConnectorInstance.java +++ b/provisioning/ucf-impl-builtin/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/builtin/async/AsyncUpdateConnectorInstance.java @@ -273,7 +273,7 @@ public int count(ObjectClassComplexTypeDefinition objectClassDefinition, ObjectQ @Override public AsynchronousOperationReturnValue>> addObject(PrismObject object, - Collection additionalOperations, StateReporter reporter, OperationResult parentResult) { + StateReporter reporter, OperationResult parentResult) { InternalMonitor.recordConnectorOperation("addObject"); return null; } @@ -288,8 +288,7 @@ public AsynchronousOperationReturnValue additionalOperations, PrismObject shadow, - Collection> identifiers, StateReporter reporter, OperationResult parentResult) { + PrismObject shadow, Collection> identifiers, StateReporter reporter, OperationResult parentResult) { InternalMonitor.recordConnectorOperation("deleteObject"); return null; } diff --git a/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/AbstractModificationConverter.java b/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/AbstractModificationConverter.java index c391e3e9560..41edcf97ec5 100644 --- a/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/AbstractModificationConverter.java +++ b/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/AbstractModificationConverter.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2010-2018 Evolveum and contributors + * Copyright (c) 2010-2019 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -68,8 +68,6 @@ public abstract class AbstractModificationConverter implements DebugDumpable { private ConnIdNameMapper connIdNameMapper; private Protector protector; - private List additionalOperations = new ArrayList<>(); - public Collection getChanges() { return changes; } @@ -134,10 +132,6 @@ public void setProtector(Protector protector) { this.protector = protector; } - public List getAdditionalOperations() { - return additionalOperations; - } - public ConnectorOperationOptions getOptions() { return options; } @@ -251,10 +245,6 @@ public void convert() throws SchemaException { throw new SchemaException("Change of unknown attribute " + delta.getPath()); } - } else if (operation instanceof ExecuteProvisioningScriptOperation) { - ExecuteProvisioningScriptOperation scriptOperation = (ExecuteProvisioningScriptOperation) operation; - additionalOperations.add(scriptOperation); - } else { throw new IllegalArgumentException("Unknown operation type " + operation.getClass().getName() + ": " + operation); @@ -392,7 +382,6 @@ private PropertyDelta determineAuxilaryObjectClassDelta(Collection>> addObject(PrismObject shadow, Collection additionalOperations, StateReporter reporter, - OperationResult parentResult) throws CommunicationException, - GenericFrameworkException, SchemaException, ObjectAlreadyExistsException, ConfigurationException, SecurityViolationException, PolicyViolationException { + public AsynchronousOperationReturnValue>> addObject(PrismObject shadow, StateReporter reporter, OperationResult parentResult) + throws CommunicationException, GenericFrameworkException, SchemaException, ObjectAlreadyExistsException, ConfigurationException, SecurityViolationException, PolicyViolationException { validateShadow(shadow, "add", false); ShadowType shadowType = shadow.asObjectable(); @@ -762,7 +761,6 @@ public AsynchronousOperationReturnValue>> addObj OperationResult result = parentResult.createSubresult(ConnectorInstance.class.getName() + ".addObject"); result.addParam("resourceObject", shadow); - result.addParam("additionalOperations", DebugUtil.debugDump(additionalOperations)); // because of serialization issues ObjectClassComplexTypeDefinition ocDef; ResourceAttributeContainerDefinition attrContDef = attributesContainer.getDefinition(); @@ -845,8 +843,6 @@ public AsynchronousOperationReturnValue>> addObj OperationOptionsBuilder operationOptionsBuilder = new OperationOptionsBuilder(); OperationOptions options = operationOptionsBuilder.build(); - checkAndExecuteAdditionalOperations(reporter, additionalOperations, BeforeAfterType.BEFORE, result); - OperationResult connIdResult = result.createSubresult(ConnectorFacade.class.getName() + ".create"); connIdResult.addArbitraryObjectAsParam("objectClass", icfObjectClass); connIdResult.addArbitraryObjectCollectionAsParam("auxiliaryObjectClasses", icfAuxiliaryObjectClasses); @@ -909,8 +905,6 @@ public AsynchronousOperationReturnValue>> addObj } connIdResult.recordSuccess(); - checkAndExecuteAdditionalOperations(reporter, additionalOperations, BeforeAfterType.AFTER, result); - result.computeStatus(); return AsynchronousOperationReturnValue.wrap(attributesContainer.getAttributes(), result); } @@ -1031,8 +1025,6 @@ private AsynchronousOperationReturnValue attributesDelta = converter.getAttributesDelta(); @@ -1093,8 +1085,6 @@ private AsynchronousOperationReturnValue sideEffectChanges = new ArrayList<>(); @@ -1197,8 +1187,6 @@ private AsynchronousOperationReturnValue attributesToAdd = converter.getAttributesToAdd(); if (!attributesToAdd.isEmpty()) { @@ -1381,8 +1369,6 @@ private AsynchronousOperationReturnValue sideEffectChanges = new ArrayList<>(); @@ -1493,7 +1479,7 @@ private String dumpValue(String attrDeltaList, List values){ } @Override - public AsynchronousOperationResult deleteObject(ObjectClassComplexTypeDefinition objectClass, Collection additionalOperations, PrismObject shadow, Collection> identifiers, StateReporter reporter, + public AsynchronousOperationResult deleteObject(ObjectClassComplexTypeDefinition objectClass, PrismObject shadow, Collection> identifiers, StateReporter reporter, OperationResult parentResult) throws ObjectNotFoundException, CommunicationException, GenericFrameworkException, SchemaException { Validate.notNull(objectClass, "No objectclass"); @@ -1511,8 +1497,6 @@ public AsynchronousOperationResult deleteObject(ObjectClassComplexTypeDefinition throw e; } - checkAndExecuteAdditionalOperations(reporter, additionalOperations, BeforeAfterType.BEFORE, result); - OperationResult icfResult = result.createSubresult(ConnectorFacade.class.getName() + ".delete"); icfResult.addArbitraryObjectAsParam("uid", uid); icfResult.addArbitraryObjectAsParam("objectClass", objClass); @@ -1553,8 +1537,6 @@ public AsynchronousOperationResult deleteObject(ObjectClassComplexTypeDefinition } } - checkAndExecuteAdditionalOperations(reporter, additionalOperations, BeforeAfterType.AFTER, result); - result.computeStatus(); return AsynchronousOperationResult.wrap(result); } @@ -2401,30 +2383,6 @@ private PrismProperty createTokenPropertyFromRealValue(T realValue) { return property; } - /** - * check additional operation order, according to the order are script - * executed before or after operation.. - */ - private void checkAndExecuteAdditionalOperations(StateReporter reporter, Collection additionalOperations, BeforeAfterType order, OperationResult result) throws CommunicationException, GenericFrameworkException { - - if (additionalOperations == null) { - // TODO: add warning to the result - return; - } - - for (Operation op : additionalOperations) { - if (op instanceof ExecuteProvisioningScriptOperation) { - ExecuteProvisioningScriptOperation executeOp = (ExecuteProvisioningScriptOperation) op; - LOGGER.trace("Find execute script operation: {}", SchemaDebugUtil.prettyPrint(executeOp)); - // execute operation in the right order.. - if (order.equals(executeOp.getScriptOrder())) { - executeScriptIcf(reporter, executeOp, result); - } - } - } - - } - @Override public Object executeScript(ExecuteProvisioningScriptOperation scriptOperation, StateReporter reporter, OperationResult parentResult) throws CommunicationException, GenericFrameworkException { diff --git a/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfDummy.java b/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfDummy.java index 2b433f47640..014e5563454 100644 --- a/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfDummy.java +++ b/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfDummy.java @@ -338,7 +338,7 @@ public void test040AddAccount() throws Exception { icfsNameProp.setRealValue(ACCOUNT_JACK_USERNAME); // WHEN - cc.addObject(shadow, null, null, result); + cc.addObject(shadow, null, result); // THEN DummyAccount dummyAccount = dummyResource.getAccountByUsername(ACCOUNT_JACK_USERNAME); diff --git a/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfDummyMulti.java b/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfDummyMulti.java index 68b34550c6a..87b23846c6a 100644 --- a/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfDummyMulti.java +++ b/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfDummyMulti.java @@ -120,7 +120,7 @@ public void test100AddAccount() throws Exception { icfsNameProp.setRealValue(ACCOUNT_JACK_USERNAME); // WHEN - cc.addObject(shadow, null, null, result); + cc.addObject(shadow, null, result); // THEN DummyAccount dummyAccount = dummyResource.getAccountByUsername(ACCOUNT_JACK_USERNAME); diff --git a/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfOpenDj.java b/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfOpenDj.java index 36874d2b046..79d3ab877db 100644 --- a/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfOpenDj.java +++ b/provisioning/ucf-impl-connid/src/test/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/TestUcfOpenDj.java @@ -274,8 +274,7 @@ private Collection> addSampleResourceObject(String name, St PrismObject shadow = wrapInShadow(ShadowType.class, resourceObject); - Set operation = new HashSet<>(); - AsynchronousOperationReturnValue>> ret = cc.addObject(shadow, operation, null, result); + AsynchronousOperationReturnValue>> ret = cc.addObject(shadow, null, result); Collection> resourceAttributes = ret.getReturnValue(); return resourceAttributes; } @@ -309,7 +308,7 @@ public void test100AddDeleteObject() throws Exception { ObjectClassComplexTypeDefinition accountDefinition = resourceSchema.findObjectClassDefinition(OpenDJController.OBJECT_CLASS_INETORGPERSON_NAME); - cc.deleteObject(accountDefinition, null, null, identifiers, null, result); + cc.deleteObject(accountDefinition, null, identifiers, null, result); ResourceObjectIdentification identification = ResourceObjectIdentification.createFromAttributes( accountDefinition, identifiers); @@ -597,7 +596,7 @@ public void test500FetchObject() throws Exception { PrismObject shadow = wrapInShadow(ShadowType.class, resourceObject); // Add a testing object - cc.addObject(shadow, null, null, addResult); + cc.addObject(shadow, null, addResult); ObjectClassComplexTypeDefinition accountDefinition = resourceObject.getDefinition().getComplexTypeDefinition(); @@ -653,7 +652,6 @@ public void test600CreateAccountWithPassword() throws Exception { ResourceAttributeContainer resourceObject = createResourceObject( "uid=lechuck,ou=people,dc=example,dc=com", "Ghost Pirate LeChuck", "LeChuck"); - Set additionalOperations = new HashSet<>(); ProtectedStringType ps = protector.encryptString("t4k30v3rTh3W0rld"); // PasswordChangeOperation passOp = new PasswordChangeOperation(ps); @@ -670,7 +668,7 @@ public void test600CreateAccountWithPassword() throws Exception { shadow.asObjectable().setCredentials(credentials); // WHEN - cc.addObject(shadow, additionalOperations, null, addResult); + cc.addObject(shadow, null, addResult); // THEN @@ -698,7 +696,7 @@ public void test610ChangePassword() throws Exception { OperationResult addResult = new OperationResult(this.getClass().getName() + "." + TEST_NAME); // Add a testing object - cc.addObject(shadow, null, null, addResult); + cc.addObject(shadow, null, addResult); String entryUuid = (String) resourceObject.getPrimaryIdentifier().getValue().getValue(); Entry entry = openDJController.searchAndAssertByEntryUuid(entryUuid);