From 7e10e5c46ca0c3bfe07268577447303091870fd5 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 29 Jul 2014 18:07:35 +0200 Subject: [PATCH] Removed getObject call when deleting objects as administrator. Simplified scripting API a bit + provided rough implementation of PageBulkAction using this API. --- .../admin/configuration/PageBulkAction.java | 58 +++++++++++--- .../evolveum/midpoint/prism/PrismContext.java | 5 ++ .../model/api}/ScriptExecutionException.java | 2 +- .../midpoint/model/api/ScriptingService.java | 38 +++++---- .../midpoint/model/impl/ModelWebService.java | 20 ++--- .../impl/controller/ModelController.java | 16 +++- .../model/impl/scripting/ActionExecutor.java | 1 + .../midpoint/model/impl/scripting/Data.java | 1 + .../scripting/ScriptExecutionTaskHandler.java | 1 + .../ScriptingExpressionEvaluator.java | 37 ++++++--- .../impl/scripting/actions/AddExecutor.java | 2 +- .../scripting/actions/AssignExecutor.java | 3 +- .../scripting/actions/BaseActionExecutor.java | 3 +- .../scripting/actions/DeleteExecutor.java | 2 +- .../actions/DiscoverConnectorsExecutor.java | 7 +- .../actions/EnableDisableExecutor.java | 2 +- .../impl/scripting/actions/LogExecutor.java | 2 +- .../scripting/actions/ModifyExecutor.java | 4 +- .../actions/PurgeSchemaExecutor.java | 2 +- .../scripting/actions/RecomputeExecutor.java | 2 +- .../scripting/actions/ResolveExecutor.java | 2 +- .../actions/TestResourceExecutor.java | 3 +- .../expressions/SearchEvaluator.java | 6 +- .../expressions/SelectEvaluator.java | 4 +- .../scripting/helpers/ExpressionHelper.java | 5 +- .../impl/scripting/helpers/JaxbHelper.java | 56 +++++++++---- .../scripting/helpers/OperationsHelper.java | 2 +- .../intest/scripting/TestScriptingBasic.java | 79 ++++++++++--------- .../testing/model/client/sample/Main.java | 18 ++++- 29 files changed, 239 insertions(+), 144 deletions(-) rename model/{model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting => model-api/src/main/java/com/evolveum/midpoint/model/api}/ScriptExecutionException.java (95%) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java index 50a1b538310..ac5fa157435 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java @@ -16,9 +16,12 @@ package com.evolveum.midpoint.web.page.admin.configuration; +import com.evolveum.midpoint.model.api.ScriptExecutionException; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.application.AuthorizationAction; @@ -26,6 +29,7 @@ import com.evolveum.midpoint.web.component.AceEditor; import com.evolveum.midpoint.web.component.AjaxSubmitButton; import com.evolveum.midpoint.web.page.admin.configuration.dto.BulkActionDto; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.Form; @@ -33,15 +37,16 @@ import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; +import javax.xml.bind.JAXBElement; + /** * @author lazyman */ @PageDescriptor(url = "/admin/config/bulk", action = { -// @AuthorizationAction(actionUri = PageAdminConfiguration.AUTH_CONFIGURATION_ALL, -// label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), -// @AuthorizationAction(actionUri = AuthorizationConstants.NS_AUTHORIZATION + "#bulkAction", -// label = "PageBulkAction.auth.bulkAction.label", description = "PageBulkAction.auth.bulkAction.description") - @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_NO_ACCESS_URL) + @AuthorizationAction(actionUri = PageAdminConfiguration.AUTH_CONFIGURATION_ALL, + label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), + @AuthorizationAction(actionUri = AuthorizationConstants.NS_AUTHORIZATION + "#bulkAction", + label = "PageBulkAction.auth.bulkAction.label", description = "PageBulkAction.auth.bulkAction.description") }) public class PageBulkAction extends PageAdminConfiguration { @@ -87,12 +92,47 @@ protected void onSubmit(AjaxRequestTarget target, Form form) { } private void startPerformed(AjaxRequestTarget target) { - model.getObject(); - Task task = createSimpleTask(OPERATION_PERFORM_BULK); OperationResult result = new OperationResult(OPERATION_PERFORM_BULK); - //TODO - continue here - we need to find a way to serialize XML String to JAXBElement expression to continue -// getScriptingService().evaluateExpressionInBackground(, task, result); + BulkActionDto bulkActionDto = model.getObject(); + + ScriptingExpressionType expression = null; + try { + Object parsed = getPrismContext().parseAnyValue(bulkActionDto.getScript(), PrismContext.LANG_XML); + if (parsed == null) { + result.recordFatalError("No bulk action object was provided."); + } + if (parsed instanceof JAXBElement) { + parsed = ((JAXBElement) parsed).getValue(); + } + if (parsed instanceof ScriptingExpressionType) { + expression = (ScriptingExpressionType) parsed; + } else { + result.recordFatalError("Provided XML text is not a bulk action object. An instance of {scripting-3}ScriptingExpressionType is expected; you have provided " + parsed.getClass() + " instead."); + } + } catch (SchemaException|RuntimeException e) { + result.recordFatalError("Couldn't parse bulk action object", e); + } + + if (expression != null) { + if (bulkActionDto.isAsync()) { + try { + getScriptingService().evaluateExpressionInBackground(expression, task, result); + } catch (SchemaException e) { + result.recordFatalError("Couldn't submit bulk action to execution because of schema exception", e); + } + } else { + try { + getScriptingService().evaluateExpression(expression, task, result); + } catch (ScriptExecutionException e) { + result.recordFatalError("Couldn't execute bulk action", e); + } + } + } + + result.computeStatusIfUnknown(); + showResult(result); + target.add(getFeedbackPanel()); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 64c47fa59bf..e1618167e1d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -391,6 +391,11 @@ public T parseAnyValue(InputStream inputStream, String language) throws Sche return xnodeProcessor.parseAnyValue(xnode); } + public T parseAnyValue(String dataString, String language) throws SchemaException { + XNode xnode = parseToXNode(dataString, language); + return xnodeProcessor.parseAnyValue(xnode); + } + //endregion //region Parsing to XNode diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptExecutionException.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ScriptExecutionException.java similarity index 95% rename from model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptExecutionException.java rename to model/model-api/src/main/java/com/evolveum/midpoint/model/api/ScriptExecutionException.java index 47de4648902..cc8d5e58303 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptExecutionException.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ScriptExecutionException.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.model.impl.scripting; +package com.evolveum.midpoint.model.api; /** * Wraps any exceptions that occur during execution of expressions. (ExpressionEvaluationException would be more appropriate, but this name is already used elsewhere.) diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ScriptingService.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ScriptingService.java index ae1a4d4322e..994b1ebaa4a 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ScriptingService.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ScriptingService.java @@ -16,26 +16,14 @@ package com.evolveum.midpoint.model.api; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.parser.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionExpressionType; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExecuteScriptType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.SearchExpressionType; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import java.util.Collection; -import java.util.List; /** * Interface of the Model subsystem that provides scripting (bulk actions) operations. @@ -55,6 +43,8 @@ public interface ScriptingService { * and assigns ScriptExecutionTaskHandler to it, to execute the script. * @param parentResult * @throws SchemaException + * + * TODO consider removing this method (it was meant as a simplified version of the method below) */ public void evaluateExpressionInBackground(QName objectType, ObjectFilter filter, String actionName, Task task, OperationResult parentResult) throws SchemaException; @@ -62,11 +52,25 @@ public interface ScriptingService { * Asynchronously executes any scripting expression. * * @param expression Expression to be executed. - * @param task Task in context of which the script should execute. The task should be "clean", i.e. - * (1) transient, (2) without any handler. This method puts the task into background, - * and assigns ScriptExecutionTaskHandler to it, to execute the script. + * @param task Task in context of which the script should execute. + * The task should be "clean", i.e. (1) transient, (2) without any handler. + * This method puts the task into background, and assigns ScriptExecutionTaskHandler + * to it, to execute the script. * @param parentResult * @throws SchemaException */ - public void evaluateExpressionInBackground(JAXBElement expression, Task task, OperationResult parentResult) throws SchemaException; -} + public void evaluateExpressionInBackground(ScriptingExpressionType expression, Task task, OperationResult parentResult) throws SchemaException; + + /** + * Synchronously executes any scripting expression (with no input data). + * + * @param expression Scripting expression to execute. + * @param task Task in context of which the script should execute (in foreground!) + * @param result Operation result + * @throws ScriptExecutionException + * + * TODO return ExecutionContext (requires moving the context to model api) + */ + + public void evaluateExpression(ScriptingExpressionType expression, Task task, OperationResult result) throws ScriptExecutionException; +} \ No newline at end of file diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java index 0173f86498e..6134d4c3dc2 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java @@ -15,17 +15,13 @@ */ package com.evolveum.midpoint.model.impl; -import com.evolveum.midpoint.audit.api.AuditEventRecord; -import com.evolveum.midpoint.audit.api.AuditEventStage; -import com.evolveum.midpoint.audit.api.AuditEventType; -import com.evolveum.midpoint.audit.api.AuditService; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.api.ModelPort; import com.evolveum.midpoint.model.common.util.AbstractModelWebService; import com.evolveum.midpoint.model.impl.controller.ModelController; import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismContext; @@ -41,18 +37,14 @@ import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.security.api.MidPointPrincipal; import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.task.api.TaskManager; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SecurityViolationException; -import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -81,14 +73,12 @@ import com.evolveum.midpoint.xml.ns._public.model.model_3.ExecuteScriptsType; import com.evolveum.midpoint.xml.ns._public.model.model_3.ModelPortType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ItemListType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType; import com.evolveum.prism.xml.ns._public.query_3.QueryType; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import javax.xml.bind.JAXBElement; @@ -275,7 +265,7 @@ private List> parseScripts(ExecuteScriptsType parameters) throws return scriptsToExecute; } - private ExecuteScriptsResponseType doExecuteScripts(List> scriptsToExecute, ExecuteScriptsOptionsType options, Task task, OperationResult result) throws ScriptExecutionException, JAXBException, SchemaException { + private ExecuteScriptsResponseType doExecuteScripts(List> scriptsToExecute, ExecuteScriptsOptionsType options, Task task, OperationResult result) { ExecuteScriptsResponseType response = new ExecuteScriptsResponseType(); ScriptOutputsType outputs = new ScriptOutputsType(); response.setOutputs(outputs); @@ -283,7 +273,7 @@ private ExecuteScriptsResponseType doExecuteScripts(List> scripts try { for (JAXBElement script : scriptsToExecute) { - ExecutionContext outputContext = scriptingExpressionEvaluator.evaluateExpression(script, task, result); + ExecutionContext outputContext = scriptingExpressionEvaluator.evaluateExpression((ScriptingExpressionType) script.getValue(), task, result); SingleScriptOutputType output = new SingleScriptOutputType(); outputs.getOutput().add(output); @@ -298,7 +288,7 @@ private ExecuteScriptsResponseType doExecuteScripts(List> scripts } } result.computeStatusIfUnknown(); - } catch (Exception e) { // FIXME little bit brutal treatment + } catch (ScriptExecutionException|JAXBException|SchemaException|RuntimeException e) { result.recordFatalError(e.getMessage(), e); LoggingUtils.logException(LOGGER, "Exception while executing script", e); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java index 1dd55f012f9..682e89e158c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java @@ -28,6 +28,7 @@ import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.api.ScriptingService; import com.evolveum.midpoint.model.api.TaskService; import com.evolveum.midpoint.model.api.WorkflowService; @@ -484,8 +485,11 @@ public void run() { String oid = cacheRepositoryService.addObject(delta.getObjectToAdd(), repoOptions, result1); delta.setOid(oid); } else if (delta.isDelete()) { - PrismObject existingObject = cacheRepositoryService.getObject(delta.getObjectTypeClass(), delta.getOid(), null, result1); - securityEnforcer.authorize(ModelAuthorizationAction.DELETE.getUrl(), null, existingObject, null, null, null, result1); + if (!securityEnforcer.isAuthorized(AuthorizationConstants.AUTZ_ALL_URL, null, null, null, null, null)) { + // getting the object is avoided in case of administrator's request in order to allow deleting malformed (unreadable) objects + PrismObject existingObject = cacheRepositoryService.getObject(delta.getObjectTypeClass(), delta.getOid(), null, result1); + securityEnforcer.authorize(ModelAuthorizationAction.DELETE.getUrl(), null, existingObject, null, null, null, result1); + } if (ObjectTypes.isClassManagedByProvisioning(delta.getObjectTypeClass())) { Utils.clearRequestee(task); provisioning.deleteObject(delta.getObjectTypeClass(), delta.getOid(), @@ -1857,9 +1861,15 @@ public void evaluateExpressionInBackground(QName objectType, ObjectFilter filter } @Override - public void evaluateExpressionInBackground(JAXBElement expression, Task task, OperationResult parentResult) throws SchemaException { + public void evaluateExpressionInBackground(ScriptingExpressionType expression, Task task, OperationResult parentResult) throws SchemaException { scriptingExpressionEvaluator.evaluateExpressionInBackground(expression, task, parentResult); } + + @Override + public void evaluateExpression(ScriptingExpressionType expression, Task task, OperationResult result) throws ScriptExecutionException { + scriptingExpressionEvaluator.evaluateExpression(expression, task, result); + } + //endregion } \ No newline at end of file diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ActionExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ActionExecutor.java index d5faa8e55ad..60c90102a2a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ActionExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ActionExecutor.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.impl.scripting; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionExpressionType; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java index a6196e92d4c..bf072f44c6d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.impl.scripting; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptExecutionTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptExecutionTaskHandler.java index b423248356b..af6c9841a91 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptExecutionTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptExecutionTaskHandler.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.impl.scripting; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java index 7f24cf876d9..9c9fae0efc5 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.impl.scripting; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.impl.scripting.expressions.SearchEvaluator; import com.evolveum.midpoint.model.impl.scripting.expressions.SelectEvaluator; import com.evolveum.midpoint.model.impl.scripting.helpers.JaxbHelper; @@ -43,16 +44,13 @@ import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.apache.commons.lang.NotImplementedException; -import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; -import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -111,7 +109,7 @@ public void evaluateExpressionInBackground(QName objectType, ObjectFilter filter ActionExpressionType action = new ActionExpressionType(); action.setType(actionName); search.setScriptingExpression(objectFactory.createAction(action)); - evaluateExpressionInBackground(objectFactory.createSearch(search), task, parentResult); + evaluateExpressionInBackground(search, task, parentResult); } /** @@ -124,7 +122,7 @@ public void evaluateExpressionInBackground(QName objectType, ObjectFilter filter * @param parentResult * @throws SchemaException */ - public void evaluateExpressionInBackground(JAXBElement expression, Task task, OperationResult parentResult) throws SchemaException { + public void evaluateExpressionInBackground(ScriptingExpressionType expression, Task task, OperationResult parentResult) throws SchemaException { OperationResult result = parentResult.createSubresult(DOT_CLASS + "evaluateExpressionInBackground"); if (!task.isTransient()) { throw new IllegalStateException("Task must be transient"); @@ -133,7 +131,7 @@ public void evaluateExpressionInBackground(JAXBElement expression, Task task, OperationResult result) throws ScriptExecutionException { + + public ExecutionContext evaluateExpression(ScriptingExpressionType expression, Task task, OperationResult result) throws ScriptExecutionException { ExecutionContext context = new ExecutionContext(task); - Data output = evaluateExpression(expression, Data.createEmpty(), context, result); + Data output; + try { + output = evaluateExpression(expression, Data.createEmpty(), context, result); + } catch (RuntimeException e) { + result.recordFatalError("Couldn't execute script", e); + throw new ScriptExecutionException("Couldn't execute script: " + e.getMessage(), e); + } result.computeStatusIfUnknown(); context.setFinalOutput(output); return context; } +// public ExecutionContext evaluateExpression(JAXBElement expression, Task task, OperationResult result) throws ScriptExecutionException { +// ExecutionContext context = new ExecutionContext(task); +// Data output = evaluateExpression(expression.getValue(), Data.createEmpty(), context, result); +// result.computeStatusIfUnknown(); +// context.setFinalOutput(output); +// return context; +// } + public ExecutionContext evaluateExpression(ExecuteScriptType executeScript, Task task, OperationResult result) throws ScriptExecutionException { - return evaluateExpression(executeScript.getScriptingExpression(), task, result); + return evaluateExpression(executeScript.getScriptingExpression().getValue(), task, result); } - public ExecutionContext evaluateExpression(JAXBElement expression, OperationResult result) throws ScriptExecutionException { + public ExecutionContext evaluateExpression(ScriptingExpressionType expression, OperationResult result) throws ScriptExecutionException { Task task = taskManager.createTaskInstance(); return evaluateExpression(expression, task, result); } - public Data evaluateExpression(JAXBElement expression, Data input, ExecutionContext context, OperationResult parentResult) throws ScriptExecutionException { + public Data evaluateExpression(JAXBElement expression, Data input, ExecutionContext context, OperationResult parentResult) throws ScriptExecutionException { return evaluateExpression((ScriptingExpressionType) expression.getValue(), input, context, parentResult); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AddExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AddExecutor.java index b40d4a67102..d3928c4ae1e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AddExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AddExecutor.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.impl.scripting.helpers.OperationsHelper; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismObject; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java index c77804fbd1d..7304042d371 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -39,7 +39,6 @@ import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; -import javax.xml.bind.JAXBElement; import java.util.ArrayList; import java.util.Collection; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/BaseActionExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/BaseActionExecutor.java index ee0ec44f608..88df58b1da9 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/BaseActionExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/BaseActionExecutor.java @@ -16,12 +16,11 @@ package com.evolveum.midpoint.model.impl.scripting.actions; -import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.model.impl.scripting.ActionExecutor; import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator; import com.evolveum.midpoint.model.impl.scripting.helpers.ExpressionHelper; import com.evolveum.midpoint.model.impl.scripting.helpers.OperationsHelper; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DeleteExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DeleteExecutor.java index f2173fd2e08..cdbeece8bfe 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DeleteExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DeleteExecutor.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.impl.scripting.helpers.OperationsHelper; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismObject; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DiscoverConnectorsExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DiscoverConnectorsExecutor.java index c06a5aec385..9c265222177 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DiscoverConnectorsExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DiscoverConnectorsExecutor.java @@ -18,16 +18,14 @@ import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.schema.DeltaConvertor; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.exception.CommunicationException; @@ -39,11 +37,8 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorHostType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionExpressionType; -import com.evolveum.prism.xml.ns._public.types_3.ChangeTypeType; -import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; import org.springframework.stereotype.Component; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/EnableDisableExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/EnableDisableExecutor.java index f5a3a72db28..e65a3acecdc 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/EnableDisableExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/EnableDisableExecutor.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.impl.scripting.helpers.OperationsHelper; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismObject; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/LogExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/LogExecutor.java index ac88b325eca..6591ec2bbb4 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/LogExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/LogExecutor.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.logging.Trace; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ModifyExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ModifyExecutor.java index 5cff40e1190..016d1e6b402 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ModifyExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ModifyExecutor.java @@ -16,10 +16,9 @@ package com.evolveum.midpoint.model.impl.scripting.actions; -import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; @@ -38,7 +37,6 @@ import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; -import javax.xml.bind.JAXBElement; /** * @author mederly diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/PurgeSchemaExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/PurgeSchemaExecutor.java index 79df9b6e74b..563c9cb5562 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/PurgeSchemaExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/PurgeSchemaExecutor.java @@ -19,7 +19,7 @@ import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismObject; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/RecomputeExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/RecomputeExecutor.java index f90b91e7616..29db41e7789 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/RecomputeExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/RecomputeExecutor.java @@ -22,7 +22,7 @@ import com.evolveum.midpoint.model.impl.lens.LensContext; import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.schema.result.OperationResult; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ResolveExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ResolveExecutor.java index e16860270a8..9cedbc7209e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ResolveExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ResolveExecutor.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/TestResourceExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/TestResourceExecutor.java index 2677ae42ca4..2341baae4f6 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/TestResourceExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/TestResourceExecutor.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -35,7 +35,6 @@ import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorHostType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionExpressionType; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java index 4a53cfceb77..eafb225057a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.impl.scripting.helpers.ExpressionHelper; import com.evolveum.midpoint.model.impl.scripting.helpers.OperationsHelper; import com.evolveum.midpoint.prism.PrismObject; @@ -35,8 +35,8 @@ import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.SearchExpressionType; -import com.evolveum.prism.xml.ns._public.query_3.QueryType; import org.apache.commons.lang.Validate; import org.apache.commons.lang.mutable.MutableBoolean; @@ -99,7 +99,7 @@ public boolean handle(PrismObject object, OperationResult parentResult) { } JAXBElement childExpression = searchExpression.getScriptingExpression(); try { - outputData.addAllFrom(scriptingExpressionEvaluator.evaluateExpression(childExpression, Data.create(object), context, result)); + outputData.addAllFrom(scriptingExpressionEvaluator.evaluateExpression((ScriptingExpressionType) childExpression.getValue(), Data.create(object), context, result)); } catch (ScriptExecutionException e) { throw new SystemException(e); // todo think about this } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SelectEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SelectEvaluator.java index c1cd7152c96..6bd3b64c775 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SelectEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SelectEvaluator.java @@ -18,16 +18,14 @@ import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.parser.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.SelectExpressionType; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import org.springframework.stereotype.Component; -import org.w3c.dom.Element; /** * @author mederly diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java index 7c400cd5c5e..ca9d4cdd6bf 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java @@ -18,10 +18,9 @@ import com.evolveum.midpoint.model.impl.scripting.Data; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionExpressionType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionParameterValueType; import com.evolveum.prism.xml.ns._public.types_3.RawType; @@ -29,8 +28,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import javax.xml.bind.JAXBElement; - import java.util.List; /** diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/JaxbHelper.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/JaxbHelper.java index f6d3b24ddfa..019151a498c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/JaxbHelper.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/JaxbHelper.java @@ -16,27 +16,55 @@ package com.evolveum.midpoint.model.impl.scripting.helpers; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionExpressionType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExpressionPipelineType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExpressionSequenceType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.FilterExpressionType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ForeachExpressionType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ObjectFactory; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.SearchExpressionType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.SelectExpressionType; import org.springframework.stereotype.Component; +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; +import java.util.HashMap; +import java.util.Map; + /** * @author mederly */ @Component public class JaxbHelper { -// private Map, QName> elements = new HashMap<>(); -// -// private ObjectFactory objectFactory = new ObjectFactory(); -// -// public JaxbHelper() { -// elements.put(ExpressionPipelineType.class, objectFactory.createPipeline(null).getName()); -// elements.put(ExpressionSequenceType.class, objectFactory.createSequence(null).getName()); -// elements.put(ForeachExpressionType.class, objectFactory.createForeach(null).getName()); -// elements.put(SelectExpressionType.class, objectFactory.createSelect(null).getName()); -// elements.put(FilterExpressionType.class, objectFactory.createFilter(null).getName()); -// elements.put(SearchExpressionType.class, objectFactory.createSearch(null).getName()); -// elements.put(ActionExpressionType.class, objectFactory.createAction(null).getName()); -// elements.put(ConstantExpressionType.class, objectFactory.createConstant(null).getName()); -// } + private Map, QName> elements = new HashMap<>(); + + private ObjectFactory objectFactory = new ObjectFactory(); + + public JaxbHelper() { + elements.put(ExpressionPipelineType.class, objectFactory.createPipeline(null).getName()); + elements.put(ExpressionSequenceType.class, objectFactory.createSequence(null).getName()); + elements.put(ForeachExpressionType.class, objectFactory.createForeach(null).getName()); + elements.put(SelectExpressionType.class, objectFactory.createSelect(null).getName()); + elements.put(FilterExpressionType.class, objectFactory.createFilter(null).getName()); + elements.put(SearchExpressionType.class, objectFactory.createSearch(null).getName()); + elements.put(ActionExpressionType.class, objectFactory.createAction(null).getName()); + } + + /** + * Ugly hack ... sometimes we have to convert "bare" ScriptingExpressionType instance to the JAXBElement version, + * with the correct element name. + * + * @param expressionType + * @return + */ + public JAXBElement toJaxbElement(ScriptingExpressionType expressionType) { + QName qname = elements.get(expressionType.getClass()); + if (qname == null) { + throw new IllegalArgumentException("Unsupported expression type: " + expressionType.getClass()); + } + return new JAXBElement(qname, expressionType.getClass(), expressionType); + } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/OperationsHelper.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/OperationsHelper.java index 4fb64cd978a..1a2dbecb6e1 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/OperationsHelper.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/OperationsHelper.java @@ -20,7 +20,7 @@ import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.model.api.PolicyViolationException; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.ScriptExecutionException; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.schema.GetOperationOptions; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java index 5eb0a898030..7f8a6f68fcc 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java @@ -32,10 +32,13 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionExpressionType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExpressionPipelineType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExpressionSequenceType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ObjectFactory; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.SearchExpressionType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; @@ -101,7 +104,7 @@ public void test100EmptySequence() throws Exception { ObjectFactory of = new ObjectFactory(); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(of.createSequence(sequence), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(sequence, result); // THEN assertNoOutputData(output); @@ -119,7 +122,7 @@ public void test110EmptyPipeline() throws Exception { ObjectFactory of = new ObjectFactory(); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(of.createPipeline(pipeline), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(pipeline, result); // THEN assertNoOutputData(output); @@ -133,14 +136,14 @@ public void test120Log() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test120Log"); - PrismProperty logAction = (PrismProperty) prismContext.parseAnyData(LOG_FILE); + PrismProperty logAction = (PrismProperty) prismContext.parseAnyData(LOG_FILE); LogfileTestTailer tailer = new LogfileTestTailer(); tailer.tail(); tailer.setExpecteMessage("Custom message:"); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(logAction.getAnyValue().toJaxbElement(), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(logAction.getAnyValue().getValue(), result); // THEN assertNoOutputData(output); @@ -156,10 +159,10 @@ public void test200SearchUser() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test200SearchUser"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_USERS_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_USERS_FILE); // WHEN - Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result).getFinalOutput(); + Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); // THEN IntegrationTestTools.display("output", output.getData()); @@ -175,10 +178,10 @@ public void test205SearchForResources() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test205SearchForResources"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_RESOURCES_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_RESOURCES_FILE); // WHEN - Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result).getFinalOutput(); + Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); // THEN IntegrationTestTools.display("output", output.getData()); @@ -193,10 +196,10 @@ public void test206SearchForRoles() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test206SearchForRoles"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_ROLES_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_ROLES_FILE); // WHEN - Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result).getFinalOutput(); + Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); // THEN IntegrationTestTools.display("output", output.getData()); @@ -211,10 +214,10 @@ public void test210SearchForShadows() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test210SearchForShadows"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_SHADOWS_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_SHADOWS_FILE); // WHEN - Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result).getFinalOutput(); + Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); // THEN IntegrationTestTools.display("output", output.getData()); @@ -230,10 +233,10 @@ public void test215SearchForShadowsNoFetch() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test215SearchForShadowsNoFetch"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_SHADOWS_NOFETCH_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_SHADOWS_NOFETCH_FILE); // WHEN - Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result).getFinalOutput(); + Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); // THEN IntegrationTestTools.display("output", output.getData()); @@ -249,10 +252,10 @@ public void test220SearchForUsersAccounts() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test220SearchForUsersAccounts"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_FILE); // WHEN - Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result).getFinalOutput(); + Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); // THEN IntegrationTestTools.display("output", output.getData()); @@ -268,10 +271,10 @@ public void test225SearchForUsersAccountsNoFetch() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test225SearchForUsersAccountsNoFetch"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_NOFETCH_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_NOFETCH_FILE); // WHEN - Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result).getFinalOutput(); + Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); // THEN IntegrationTestTools.display("output", output.getData()); @@ -287,10 +290,10 @@ public void test300DisableJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test300DisableJack"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(DISABLE_JACK_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(DISABLE_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); // THEN assertNoOutputData(output); @@ -307,10 +310,10 @@ public void test310EnableJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test310EnableJack"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(ENABLE_JACK_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(ENABLE_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); // THEN assertNoOutputData(output); @@ -327,10 +330,10 @@ public void test320DeleteAndAddJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test320DeleteAndAddJack"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(DELETE_AND_ADD_JACK_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(DELETE_AND_ADD_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); // THEN assertNoOutputData(output); @@ -347,10 +350,10 @@ public void test330ModifyJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test330ModifyJack"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(MODIFY_JACK_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(MODIFY_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); // THEN assertNoOutputData(output); @@ -368,10 +371,10 @@ public void test340ModifyJackBack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test340ModifyJackBack"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(MODIFY_JACK_BACK_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(MODIFY_JACK_BACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); // THEN assertNoOutputData(output); @@ -389,10 +392,10 @@ public void test350RecomputeJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test350RecomputeJack"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(RECOMPUTE_JACK_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(RECOMPUTE_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); // THEN assertNoOutputData(output); @@ -409,10 +412,10 @@ public void test360AssignToJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test360AssignToJack"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(ASSIGN_TO_JACK_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(ASSIGN_TO_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); // THEN assertNoOutputData(output); @@ -433,12 +436,12 @@ public void test370AssignToJackInBackground() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test370AssignToJackInBackground"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(ASSIGN_TO_JACK_2_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(ASSIGN_TO_JACK_2_FILE); // WHEN Task task = taskManager.createTaskInstance(); task.setOwner(getUser(USER_ADMINISTRATOR_OID)); - scriptingExpressionEvaluator.evaluateExpressionInBackground(expression.getAnyValue().toJaxbElement(), task, result); + scriptingExpressionEvaluator.evaluateExpressionInBackground(expression.getAnyValue().getValue(), task, result); waitForTaskFinish(task.getOid(), false); task.refresh(result); @@ -482,7 +485,7 @@ public void test400PurgeSchema() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test400PurgeSchema"); Task task = taskManager.createTaskInstance(); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(PURGE_DUMMY_BLACK_SCHEMA_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(PURGE_DUMMY_BLACK_SCHEMA_FILE); // ResourceType dummy = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_BLACK_OID, null, task, result).asObjectable(); // IntegrationTestTools.display("dummy resource before purge schema", dummy.asPrismObject()); @@ -490,7 +493,7 @@ public void test400PurgeSchema() throws Exception { // IntegrationTestTools.display("schema as XML: " + DOMUtil.printDom(dummy.getSchema().getDefinition().getAny().get(0))); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); // THEN IntegrationTestTools.display("output", output.getFinalOutput()); @@ -517,10 +520,10 @@ public void test410TestResource() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + "test410TestResource"); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(TEST_DUMMY_RESOURCE_FILE); + PrismProperty expression = (PrismProperty) prismContext.parseAnyData(TEST_DUMMY_RESOURCE_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().toJaxbElement(), result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); // THEN IntegrationTestTools.display("output", output.getFinalOutput()); diff --git a/samples/model-client-sample/src/main/java/com/evolveum/midpoint/testing/model/client/sample/Main.java b/samples/model-client-sample/src/main/java/com/evolveum/midpoint/testing/model/client/sample/Main.java index d9ce6fbbd6e..f7e68b87e14 100644 --- a/samples/model-client-sample/src/main/java/com/evolveum/midpoint/testing/model/client/sample/Main.java +++ b/samples/model-client-sample/src/main/java/com/evolveum/midpoint/testing/model/client/sample/Main.java @@ -102,7 +102,7 @@ public static void main(String[] args) { try { ModelPortType modelPort = createModelPort(args); - + SystemConfigurationType configurationType = getConfiguration(modelPort); System.out.println("Got system configuration"); System.out.println(configurationType); @@ -500,7 +500,7 @@ private static Collection listRequestableRoles(ModelPortType modelPort ObjectListType objectList = objectListHolder.value; return (Collection) objectList.getObject(); } - + private static void deleteUser(ModelPortType modelPort, String oid) throws FaultMessage { ObjectDeltaType deltaType = new ObjectDeltaType(); deltaType.setObjectType(ModelClientUtil.getTypeQName(UserType.class)); @@ -514,6 +514,20 @@ private static void deleteUser(ModelPortType modelPort, String oid) throws Fault executeOptionsType.setRaw(true); modelPort.executeChanges(deltaListType, executeOptionsType); } + + private static void deleteTask(ModelPortType modelPort, String oid) throws FaultMessage { + ObjectDeltaType deltaType = new ObjectDeltaType(); + deltaType.setObjectType(ModelClientUtil.getTypeQName(TaskType.class)); + deltaType.setChangeType(ChangeTypeType.DELETE); + deltaType.setOid(oid); + + ObjectDeltaListType deltaListType = new ObjectDeltaListType(); + deltaListType.getDelta().add(deltaType); + + ModelExecuteOptionsType executeOptionsType = new ModelExecuteOptionsType(); + executeOptionsType.setRaw(true); + modelPort.executeChanges(deltaListType, executeOptionsType); + } public static ModelPortType createModelPort(String[] args) { String endpointUrl = DEFAULT_ENDPOINT_URL;