Search in sources :

Example 1 with ScriptingExpressionType

use of com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType in project midpoint by Evolveum.

the class SearchEvaluator method evaluate.

public <T extends ObjectType> PipelineData evaluate(SearchExpressionType searchExpression, PipelineData input, ExecutionContext context, OperationResult globalResult) throws ScriptExecutionException {
    Validate.notNull(searchExpression.getType());
    boolean noFetch = expressionHelper.getArgumentAsBoolean(searchExpression.getParameter(), PARAM_NO_FETCH, input, context, false, "search", globalResult);
    @SuppressWarnings({ "unchecked", "raw" }) Class<T> objectClass = (Class<T>) ObjectTypes.getObjectTypeFromTypeQName(searchExpression.getType()).getClassDefinition();
    ObjectQuery objectQuery = null;
    if (searchExpression.getQuery() != null) {
        try {
            objectQuery = QueryJaxbConvertor.createObjectQuery(objectClass, searchExpression.getQuery(), prismContext);
        } catch (SchemaException e) {
            throw new ScriptExecutionException("Couldn't parse object query due to schema exception", e);
        }
    } else if (searchExpression.getSearchFilter() != null) {
        // todo resolve variable references in the filter
        objectQuery = new ObjectQuery();
        try {
            ObjectFilter filter = QueryConvertor.parseFilter(searchExpression.getSearchFilter(), objectClass, prismContext);
            objectQuery.setFilter(filter);
        } catch (SchemaException e) {
            throw new ScriptExecutionException("Couldn't parse object filter due to schema exception", e);
        }
    }
    final String variableName = searchExpression.getVariable();
    final PipelineData oldVariableValue = variableName != null ? context.getVariable(variableName) : null;
    final PipelineData outputData = PipelineData.createEmpty();
    final MutableBoolean atLeastOne = new MutableBoolean(false);
    ResultHandler<T> handler = (object, parentResult) -> {
        context.checkTaskStop();
        atLeastOne.setValue(true);
        if (searchExpression.getScriptingExpression() != null) {
            if (variableName != null) {
                context.setVariable(variableName, PipelineData.create(object.getValue()));
            }
            JAXBElement<?> childExpression = searchExpression.getScriptingExpression();
            try {
                outputData.addAllFrom(scriptingExpressionEvaluator.evaluateExpression((ScriptingExpressionType) childExpression.getValue(), PipelineData.create(object.getValue()), context, globalResult));
                globalResult.setSummarizeSuccesses(true);
                globalResult.summarize();
            } catch (ScriptExecutionException e) {
                // todo think about this
                if (context.isContinueOnAnyError()) {
                    LoggingUtils.logUnexpectedException(LOGGER, "Exception when evaluating item from search result list.", e);
                } else {
                    throw new SystemException(e);
                }
            }
        } else {
            outputData.addValue(object.getValue());
        }
        return true;
    };
    try {
        Collection<SelectorOptions<GetOperationOptions>> options = operationsHelper.createGetOptions(searchExpression.getOptions(), noFetch);
        modelService.searchObjectsIterative(objectClass, objectQuery, handler, options, context.getTask(), globalResult);
    } catch (SchemaException | ObjectNotFoundException | SecurityViolationException | CommunicationException | ConfigurationException | ExpressionEvaluationException e) {
        // TODO continue on any error?
        throw new ScriptExecutionException("Couldn't execute searchObjects operation: " + e.getMessage(), e);
    }
    if (atLeastOne.isFalse()) {
        String matching = objectQuery != null ? "matching " : "";
        // temporary hack, this will be configurable
        context.println("Warning: no " + matching + searchExpression.getType().getLocalPart() + " object found");
    }
    if (variableName != null) {
        context.setVariable(variableName, oldVariableValue);
    }
    return outputData;
}
Also used : ObjectType(com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType) OperationsHelper(com.evolveum.midpoint.model.impl.scripting.helpers.OperationsHelper) OperationResult(com.evolveum.midpoint.schema.result.OperationResult) Autowired(org.springframework.beans.factory.annotation.Autowired) Trace(com.evolveum.midpoint.util.logging.Trace) com.evolveum.midpoint.util.exception(com.evolveum.midpoint.util.exception) ExpressionHelper(com.evolveum.midpoint.model.impl.scripting.helpers.ExpressionHelper) ObjectFilter(com.evolveum.midpoint.prism.query.ObjectFilter) ResultHandler(com.evolveum.midpoint.schema.ResultHandler) SelectorOptions(com.evolveum.midpoint.schema.SelectorOptions) ScriptExecutionException(com.evolveum.midpoint.model.api.ScriptExecutionException) JAXBElement(javax.xml.bind.JAXBElement) Collection(java.util.Collection) ExecutionContext(com.evolveum.midpoint.model.impl.scripting.ExecutionContext) LoggingUtils(com.evolveum.midpoint.util.logging.LoggingUtils) QueryConvertor(com.evolveum.midpoint.prism.marshaller.QueryConvertor) PipelineData(com.evolveum.midpoint.model.impl.scripting.PipelineData) QueryJaxbConvertor(com.evolveum.midpoint.prism.query.QueryJaxbConvertor) Component(org.springframework.stereotype.Component) ScriptingExpressionType(com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType) GetOperationOptions(com.evolveum.midpoint.schema.GetOperationOptions) MutableBoolean(org.apache.commons.lang.mutable.MutableBoolean) ObjectTypes(com.evolveum.midpoint.schema.constants.ObjectTypes) ObjectQuery(com.evolveum.midpoint.prism.query.ObjectQuery) SearchExpressionType(com.evolveum.midpoint.xml.ns._public.model.scripting_3.SearchExpressionType) Validate(org.apache.commons.lang.Validate) TraceManager(com.evolveum.midpoint.util.logging.TraceManager) ScriptExecutionException(com.evolveum.midpoint.model.api.ScriptExecutionException) MutableBoolean(org.apache.commons.lang.mutable.MutableBoolean) PipelineData(com.evolveum.midpoint.model.impl.scripting.PipelineData) ObjectFilter(com.evolveum.midpoint.prism.query.ObjectFilter) JAXBElement(javax.xml.bind.JAXBElement) ObjectQuery(com.evolveum.midpoint.prism.query.ObjectQuery) SelectorOptions(com.evolveum.midpoint.schema.SelectorOptions)

Example 2 with ScriptingExpressionType

use of com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType in project midpoint by Evolveum.

the class ModelWebService method doExecuteScripts.

private ExecuteScriptsResponseType doExecuteScripts(List<JAXBElement<?>> scriptsToExecute, ExecuteScriptsOptionsType options, Task task, OperationResult result) {
    ExecuteScriptsResponseType response = new ExecuteScriptsResponseType();
    ScriptOutputsType outputs = new ScriptOutputsType();
    response.setOutputs(outputs);
    try {
        for (JAXBElement<?> script : scriptsToExecute) {
            Object scriptValue = script.getValue();
            if (!(scriptValue instanceof ScriptingExpressionType)) {
                throw new SchemaException("Expected that scripts will be of type ScriptingExpressionType, but it was " + scriptValue.getClass().getName());
            }
            ScriptExecutionResult executionResult = scriptingService.evaluateExpression((ScriptingExpressionType) script.getValue(), task, result);
            SingleScriptOutputType output = new SingleScriptOutputType();
            outputs.getOutput().add(output);
            output.setTextOutput(executionResult.getConsoleOutput());
            if (options == null || options.getOutputFormat() == null || options.getOutputFormat() == OutputFormatType.XML) {
                output.setDataOutput(prepareXmlData(executionResult.getDataOutput(), null));
            } else {
                // temporarily we send serialized XML in the case of MSL output
                PipelineDataType jaxbOutput = prepareXmlData(executionResult.getDataOutput(), null);
                output.setMslData(prismContext.xmlSerializer().serializeAnyData(jaxbOutput, SchemaConstants.C_VALUE));
            }
        }
        result.computeStatusIfUnknown();
    } catch (ScriptExecutionException | JAXBException | SchemaException | RuntimeException | SecurityViolationException e) {
        result.recordFatalError(e.getMessage(), e);
        LoggingUtils.logException(LOGGER, "Exception while executing script", e);
    }
    result.summarize();
    response.setResult(result.createOperationResultType());
    return response;
}
Also used : JAXBException(javax.xml.bind.JAXBException) ScriptingExpressionType(com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType) ExecuteScriptsResponseType(com.evolveum.midpoint.xml.ns._public.model.model_3.ExecuteScriptsResponseType) PrismObject(com.evolveum.midpoint.prism.PrismObject) PipelineDataType(com.evolveum.midpoint.xml.ns._public.model.scripting_3.PipelineDataType)

Example 3 with ScriptingExpressionType

use of com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType in project midpoint by Evolveum.

the class PageBulkAction method startPerformed.

private void startPerformed(AjaxRequestTarget target) {
    Task task = createSimpleTask(OPERATION_PERFORM_BULK);
    OperationResult result = new OperationResult(OPERATION_PERFORM_BULK);
    BulkActionDto bulkActionDto = model.getObject();
    if (StringUtils.isEmpty(bulkActionDto.getScript())) {
        warn(getString("PageBulkAction.message.emptyString"));
        target.add(getFeedbackPanel());
        return;
    }
    Object parsed = null;
    try {
        parsed = getPrismContext().parserFor(bulkActionDto.getScript()).parseRealValue();
        if (parsed == null) {
            result.recordFatalError("No bulk action object was provided.");
        } else if (!(parsed instanceof ExecuteScriptType) && !(parsed instanceof ScriptingExpressionType)) {
            result.recordFatalError("Provided 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);
        LoggingUtils.logUnexpectedException(LOGGER, "Couldn't parse bulk action object", e);
    }
    if (parsed != null) {
        if (bulkActionDto.isAsync()) {
            try {
                if (parsed instanceof ExecuteScriptType) {
                    getScriptingService().evaluateExpressionInBackground((ExecuteScriptType) parsed, task, result);
                } else {
                    //noinspection ConstantConditions
                    getScriptingService().evaluateExpressionInBackground((ScriptingExpressionType) parsed, task, result);
                }
                result.recordStatus(OperationResultStatus.IN_PROGRESS, task.getName() + " has been successfully submitted to execution");
            } catch (SchemaException | SecurityViolationException e) {
                result.recordFatalError("Couldn't submit bulk action to execution", e);
                LoggingUtils.logUnexpectedException(LOGGER, "Couldn't submit bulk action to execution", e);
            }
        } else {
            try {
                //noinspection ConstantConditions
                ScriptExecutionResult executionResult = parsed instanceof ExecuteScriptType ? getScriptingService().evaluateExpression((ExecuteScriptType) parsed, task, result) : getScriptingService().evaluateExpression((ScriptingExpressionType) parsed, task, result);
                result.recordStatus(OperationResultStatus.SUCCESS, "Action executed. Returned " + executionResult.getDataOutput().size() + " item(s). Console and data output available via 'Export to XML' function.");
                result.addReturn("console", executionResult.getConsoleOutput());
                result.addCollectionOfSerializablesAsReturn("data", executionResult.getDataOutput());
            } catch (ScriptExecutionException | SchemaException | SecurityViolationException e) {
                result.recordFatalError("Couldn't execute bulk action", e);
                LoggingUtils.logUnexpectedException(LOGGER, "Couldn't execute bulk action", e);
            }
        }
    }
    showResult(result);
    target.add(getFeedbackPanel());
}
Also used : SchemaException(com.evolveum.midpoint.util.exception.SchemaException) Task(com.evolveum.midpoint.task.api.Task) ExecuteScriptType(com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExecuteScriptType) SecurityViolationException(com.evolveum.midpoint.util.exception.SecurityViolationException) ScriptExecutionException(com.evolveum.midpoint.model.api.ScriptExecutionException) ScriptExecutionResult(com.evolveum.midpoint.model.api.ScriptExecutionResult) OperationResult(com.evolveum.midpoint.schema.result.OperationResult) ScriptingExpressionType(com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType) BulkActionDto(com.evolveum.midpoint.web.page.admin.configuration.dto.BulkActionDto)

Aggregations

ScriptingExpressionType (com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType)3 ScriptExecutionException (com.evolveum.midpoint.model.api.ScriptExecutionException)2 OperationResult (com.evolveum.midpoint.schema.result.OperationResult)2 ScriptExecutionResult (com.evolveum.midpoint.model.api.ScriptExecutionResult)1 ExecutionContext (com.evolveum.midpoint.model.impl.scripting.ExecutionContext)1 PipelineData (com.evolveum.midpoint.model.impl.scripting.PipelineData)1 ExpressionHelper (com.evolveum.midpoint.model.impl.scripting.helpers.ExpressionHelper)1 OperationsHelper (com.evolveum.midpoint.model.impl.scripting.helpers.OperationsHelper)1 PrismObject (com.evolveum.midpoint.prism.PrismObject)1 QueryConvertor (com.evolveum.midpoint.prism.marshaller.QueryConvertor)1 ObjectFilter (com.evolveum.midpoint.prism.query.ObjectFilter)1 ObjectQuery (com.evolveum.midpoint.prism.query.ObjectQuery)1 QueryJaxbConvertor (com.evolveum.midpoint.prism.query.QueryJaxbConvertor)1 GetOperationOptions (com.evolveum.midpoint.schema.GetOperationOptions)1 ResultHandler (com.evolveum.midpoint.schema.ResultHandler)1 SelectorOptions (com.evolveum.midpoint.schema.SelectorOptions)1 ObjectTypes (com.evolveum.midpoint.schema.constants.ObjectTypes)1 Task (com.evolveum.midpoint.task.api.Task)1 com.evolveum.midpoint.util.exception (com.evolveum.midpoint.util.exception)1 SchemaException (com.evolveum.midpoint.util.exception.SchemaException)1