From ba3951930bd20d264d297381fdbf8df057e84010 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Thu, 16 Apr 2020 17:02:48 +0200 Subject: [PATCH] removed ModelWebService(Raw), related port and cleanup around --- .../midpoint/model/api/ModelPort.java | 39 -- model/model-common/pom.xml | 9 - .../FunctionExpressionEvaluatorFactory.java | 19 +- .../script/jsr223/Jsr223ScriptEvaluator.java | 58 +-- .../common/util/AbstractModelWebService.java | 83 ---- model/model-impl/pom.xml | 4 - .../midpoint/model/impl/ModelRestService.java | 190 ++++---- .../midpoint/model/impl/ModelWebService.java | 446 ------------------ .../model/impl/ModelWebServiceRaw.java | 212 --------- .../model/impl/scripting/PipelineData.java | 28 ++ .../security/MidpointPasswordValidator.java | 92 ---- .../src/main/resources/ctx-model.xml | 209 ++++---- .../intest/scripting/TestScriptingBasic.java | 16 +- pom.xml | 6 - 14 files changed, 229 insertions(+), 1182 deletions(-) delete mode 100644 model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelPort.java delete mode 100644 model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/AbstractModelWebService.java delete mode 100644 model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java delete mode 100644 model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java delete mode 100644 model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/MidpointPasswordValidator.java diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelPort.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelPort.java deleted file mode 100644 index b9572e32ba0..00000000000 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelPort.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2010-2014 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.model.api; - -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.xml.ns._public.model.model_3.ModelPortType; - -import javax.xml.namespace.QName; - -/** - * - * @author lazyman - * - */ -public interface ModelPort { - - String CLASS_NAME_WITH_DOT = ModelPortType.class.getName() + "."; - String GET_OBJECT = CLASS_NAME_WITH_DOT + "getObject"; - String SEARCH_OBJECTS = CLASS_NAME_WITH_DOT + "searchObjects"; - String EXECUTE_CHANGES = CLASS_NAME_WITH_DOT + "executeChanges"; - String LIST_ACCOUNT_SHADOW_OWNER = CLASS_NAME_WITH_DOT + "listAccountShadowOwner"; - String TEST_RESOURCE = CLASS_NAME_WITH_DOT + "testResource"; - String IMPORT_FROM_RESOURCE = CLASS_NAME_WITH_DOT + "importFromResource"; - String NOTIFY_CHANGE = CLASS_NAME_WITH_DOT + "notifyChange"; - String EXECUTE_SCRIPTS = CLASS_NAME_WITH_DOT + "executeScripts"; - - QName GET_OBJECT_RESPONSE = new QName(SchemaConstants.NS_MODEL_WS, "getObjectResponse"); - QName SEARCH_OBJECTS_RESPONSE = new QName(SchemaConstants.NS_MODEL_WS, "searchObjectsResponse"); - QName EXECUTE_CHANGES_RESPONSE = new QName(SchemaConstants.NS_MODEL_WS, "executeChangesResponse"); - QName FIND_SHADOW_OWNER_RESPONSE = new QName(SchemaConstants.NS_MODEL_WS, "findShadowOwnerResponse"); - QName TEST_RESOURCE_RESPONSE = new QName(SchemaConstants.NS_MODEL_WS, "testResourceResponse"); - QName EXECUTE_SCRIPTS_RESPONSE = new QName(SchemaConstants.NS_MODEL_WS, "executeScriptsResponse"); - QName IMPORT_FROM_RESOURCE_RESPONSE = new QName(SchemaConstants.NS_MODEL_WS, "importFromResourceResponse"); - QName NOTIFY_CHANGE_RESPONSE = new QName(SchemaConstants.NS_MODEL_WS, "notifyChangeResponse"); -} diff --git a/model/model-common/pom.xml b/model/model-common/pom.xml index 9cdb91724fb..789f95e997f 100644 --- a/model/model-common/pom.xml +++ b/model/model-common/pom.xml @@ -70,11 +70,6 @@ model-api 4.2-SNAPSHOT - - com.evolveum.midpoint.repo - audit-api - 4.2-SNAPSHOT - com.evolveum.midpoint.repo repo-common @@ -120,10 +115,6 @@ org.apache.commons commons-configuration2 - - org.springframework.security - spring-security-core - org.springframework spring-context diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/FunctionExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/FunctionExpressionEvaluatorFactory.java index 23095261f4e..d4373e5dc03 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/FunctionExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/FunctionExpressionEvaluatorFactory.java @@ -7,12 +7,9 @@ package com.evolveum.midpoint.model.common.expression.evaluator; import java.util.Collection; - import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import com.evolveum.midpoint.schema.cache.CacheConfigurationManager; -import com.evolveum.midpoint.task.api.Task; import org.apache.commons.lang.Validate; import com.evolveum.midpoint.prism.ItemDefinition; @@ -22,8 +19,10 @@ import com.evolveum.midpoint.repo.common.expression.AbstractObjectResolvableExpressionEvaluatorFactory; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.schema.cache.CacheConfigurationManager; import com.evolveum.midpoint.schema.expression.ExpressionProfile; 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.FunctionExpressionEvaluatorType; @@ -33,7 +32,6 @@ * This is NOT autowired evaluator. * * @author semancik - * */ public class FunctionExpressionEvaluatorFactory extends AbstractObjectResolvableExpressionEvaluatorFactory { @@ -42,7 +40,8 @@ public class FunctionExpressionEvaluatorFactory extends AbstractObjectResolvable private final Protector protector; private final PrismContext prismContext; - public FunctionExpressionEvaluatorFactory(ExpressionFactory expressionFactory, Protector protector, PrismContext prismContext, + public FunctionExpressionEvaluatorFactory( + ExpressionFactory expressionFactory, Protector protector, PrismContext prismContext, CacheConfigurationManager cacheConfigurationManager) { super(expressionFactory, cacheConfigurationManager); this.protector = protector; @@ -58,18 +57,18 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement, com.evolveum.midpoint.prism.PrismContext) */ @Override - public ExpressionEvaluator createEvaluator( + public ExpressionEvaluator createEvaluator( Collection> evaluatorElements, D outputDefinition, ExpressionProfile expressionProfile, ExpressionFactory factory, String contextDescription, Task task, OperationResult result) - throws SchemaException, ObjectNotFoundException { + throws SchemaException, ObjectNotFoundException { Validate.notNull(outputDefinition, "output definition must be specified for 'generate' expression evaluator"); if (evaluatorElements.size() > 1) { - throw new SchemaException("More than one evaluator specified in "+contextDescription); + throw new SchemaException("More than one evaluator specified in " + contextDescription); } JAXBElement evaluatorElement = evaluatorElements.iterator().next(); @@ -78,10 +77,10 @@ public ExpressionEvaluator evaluatorTypeObject = evaluatorElement.getValue(); } if (evaluatorTypeObject != null && !(evaluatorTypeObject instanceof FunctionExpressionEvaluatorType)) { - throw new SchemaException("Function expression evaluator cannot handle elements of type " + evaluatorTypeObject.getClass().getName()+" in "+contextDescription); + throw new SchemaException("Function expression evaluator cannot handle elements of type " + evaluatorTypeObject.getClass().getName() + " in " + contextDescription); } - FunctionExpressionEvaluatorType functionEvaluatorType = (FunctionExpressionEvaluatorType)evaluatorTypeObject; + FunctionExpressionEvaluatorType functionEvaluatorType = (FunctionExpressionEvaluatorType) evaluatorTypeObject; return new FunctionExpressionEvaluator(ELEMENT_NAME, functionEvaluatorType, outputDefinition, protector, getObjectResolver(), prismContext); } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java index abec1cc65ce..eb647f1cd92 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java @@ -6,79 +6,43 @@ */ package com.evolveum.midpoint.model.common.expression.script.jsr223; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; - -import javax.script.Bindings; -import javax.script.Compilable; -import javax.script.CompiledScript; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; -import javax.xml.namespace.QName; +import javax.script.*; import com.evolveum.midpoint.common.LocalizationService; -import com.evolveum.midpoint.model.common.expression.functions.FunctionLibrary; import com.evolveum.midpoint.model.common.expression.script.AbstractCachingScriptEvaluator; -import com.evolveum.midpoint.model.common.expression.script.ScriptEvaluator; import com.evolveum.midpoint.model.common.expression.script.ScriptExpressionEvaluationContext; -import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.crypto.Protector; -import com.evolveum.midpoint.prism.xml.XsdTypeMapper; -import com.evolveum.midpoint.repo.common.ObjectResolver; import com.evolveum.midpoint.repo.common.expression.ExpressionSyntaxException; -import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; -import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; import com.evolveum.midpoint.schema.constants.MidPointConstants; -import com.evolveum.midpoint.schema.internals.InternalCounters; -import com.evolveum.midpoint.schema.internals.InternalMonitor; -import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ExceptionUtil; -import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; -import com.evolveum.midpoint.util.exception.SystemException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ScriptExpressionEvaluatorType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ScriptExpressionReturnTypeType; +import com.evolveum.midpoint.util.exception.*; /** * Expression evaluator that is using javax.script (JSR-223) engine. - * + *

* This evaluator does not really support expression profiles. It has just one * global almighty compiler (ScriptEngine). * * @author Radovan Semancik - * */ -public class Jsr223ScriptEvaluator extends AbstractCachingScriptEvaluator { - - private static final Trace LOGGER = TraceManager.getTrace(Jsr223ScriptEvaluator.class); +public class Jsr223ScriptEvaluator extends AbstractCachingScriptEvaluator { private final ScriptEngine scriptEngine; - public Jsr223ScriptEvaluator(String engineName, PrismContext prismContext, Protector protector, - LocalizationService localizationService) { + public Jsr223ScriptEvaluator(String engineName, PrismContext prismContext, + Protector protector, LocalizationService localizationService) { super(prismContext, protector, localizationService); ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); scriptEngine = scriptEngineManager.getEngineByName(engineName); if (scriptEngine == null) { - throw new SystemException("The JSR-223 scripting engine for '"+engineName+"' was not found"); + throw new SystemException("The JSR-223 scripting engine for '" + engineName + "' was not found"); } } @Override protected CompiledScript compileScript(String codeString, ScriptExpressionEvaluationContext context) throws Exception { - return ((Compilable)scriptEngine).compile(codeString); + return ((Compilable) scriptEngine).compile(codeString); } @Override @@ -89,13 +53,12 @@ protected Object evaluateScript(CompiledScript compiledScript, ScriptExpressionE } private Bindings convertToBindings(ScriptExpressionEvaluationContext context) - throws ExpressionSyntaxException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { + throws ExpressionSyntaxException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { Bindings bindings = scriptEngine.createBindings(); bindings.putAll(prepareScriptVariablesValueMap(context)); return bindings; } - // public Object evaluateReportScript(String codeString, ScriptExpressionEvaluationContext context) throws ExpressionEvaluationException, // ObjectNotFoundException, ExpressionSyntaxException, CommunicationException, ConfigurationException, SecurityViolationException { // @@ -126,7 +89,6 @@ private Bindings convertToBindings(ScriptExpressionEvaluationContext context) // return evalRawResult; // } - /* (non-Javadoc) * @see com.evolveum.midpoint.common.expression.ExpressionEvaluator#getLanguageName() */ diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/AbstractModelWebService.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/AbstractModelWebService.java deleted file mode 100644 index f9b37f0374a..00000000000 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/util/AbstractModelWebService.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2014-2017 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.model.common.util; - -import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; - -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.ModelService; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.result.OperationResultStatus; -import com.evolveum.midpoint.security.api.MidPointPrincipal; -import com.evolveum.midpoint.security.api.SecurityContextManager; -import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.task.api.TaskManager; -import com.evolveum.midpoint.util.exception.SystemException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; - -/** - * Abstract superclass that provides methods common to all web service implementations that - * use ModelService. - * - * @author Radovan Semancik - * - */ -public abstract class AbstractModelWebService { - - @Autowired protected ModelService modelService; - @Autowired protected TaskManager taskManager; - @Autowired protected AuditService auditService; - @Autowired protected PrismContext prismContext; - @Autowired protected SecurityContextManager securityContextManager; - - protected void setTaskOwner(Task task) { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication == null) { - throw new SystemException("Failed to get authentication object"); - } - FocusType focusType = ((MidPointPrincipal)(SecurityContextHolder.getContext().getAuthentication().getPrincipal())).getFocus(); - if (focusType == null) { - throw new SystemException("Failed to get user from authentication object"); - } - task.setOwner(focusType.asPrismObject()); - } - - protected Task createTaskInstance(String operationName) { - // TODO: better task initialization - Task task = taskManager.createTaskInstance(operationName); - setTaskOwner(task); - task.setChannel(SchemaConstants.CHANNEL_WEB_SERVICE_URI); - return task; - } - - protected void auditLogin(Task task) { - AuditEventRecord record = new AuditEventRecord(AuditEventType.CREATE_SESSION, AuditEventStage.REQUEST); - record.setInitiatorAndLoginParameter(task.getOwner()); - record.setChannel(SchemaConstants.CHANNEL_WEB_SERVICE_URI); - record.setTimestamp(System.currentTimeMillis()); - record.setOutcome(OperationResultStatus.SUCCESS); - auditService.audit(record, task); - } - - protected void auditLogout(Task task) { - AuditEventRecord record = new AuditEventRecord(AuditEventType.TERMINATE_SESSION, AuditEventStage.REQUEST); - record.setInitiatorAndLoginParameter(task.getOwner()); - record.setChannel(SchemaConstants.CHANNEL_WEB_SERVICE_URI); - record.setTimestamp(System.currentTimeMillis()); - record.setOutcome(OperationResultStatus.SUCCESS); - auditService.audit(record, task); - } - -} diff --git a/model/model-impl/pom.xml b/model/model-impl/pom.xml index a9033f1a2de..894d4b7d0c9 100644 --- a/model/model-impl/pom.xml +++ b/model/model-impl/pom.xml @@ -265,10 +265,6 @@ spring-boot-starter-amqp runtime - - javax.xml.ws - jaxws-api - diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java index f8ed5b8c5df..e8a39025a32 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java @@ -6,31 +6,51 @@ */ package com.evolveum.midpoint.model.impl; +import java.net.URI; +import java.util.Collection; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.*; +import javax.ws.rs.core.*; +import javax.ws.rs.core.Response.ResponseBuilder; +import javax.ws.rs.core.Response.Status; +import javax.xml.namespace.QName; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.Validate; +import org.apache.cxf.jaxrs.ext.MessageContext; +import org.jetbrains.annotations.NotNull; +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 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.common.rest.Converter; +import com.evolveum.midpoint.common.rest.ConverterInterface; import com.evolveum.midpoint.model.api.*; import com.evolveum.midpoint.model.api.validator.ResourceValidator; import com.evolveum.midpoint.model.api.validator.Scope; import com.evolveum.midpoint.model.api.validator.ValidationResult; import com.evolveum.midpoint.model.common.SystemObjectCache; -import com.evolveum.midpoint.model.common.stringpolicy.ValuePolicyProcessor; -import com.evolveum.midpoint.common.rest.Converter; -import com.evolveum.midpoint.common.rest.ConverterInterface; import com.evolveum.midpoint.model.impl.rest.PATCH; +import com.evolveum.midpoint.model.impl.scripting.PipelineData; import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator; import com.evolveum.midpoint.model.impl.security.SecurityHelper; import com.evolveum.midpoint.model.impl.util.RestServiceUtil; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.ItemPathCollectionsUtil; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.repo.api.CacheDispatcher; -import com.evolveum.midpoint.schema.*; +import com.evolveum.midpoint.schema.DefinitionProcessingOption; +import com.evolveum.midpoint.schema.DeltaConvertor; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; @@ -48,36 +68,15 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExecuteScriptOutputType; -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.*; import com.evolveum.prism.xml.ns._public.query_3.QueryType; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang.Validate; -import org.apache.cxf.jaxrs.ext.MessageContext; -import org.jetbrains.annotations.NotNull; -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.servlet.http.HttpServletRequest; -import javax.ws.rs.*; -import javax.ws.rs.core.*; -import javax.ws.rs.core.Response.ResponseBuilder; -import javax.ws.rs.core.Response.Status; -import javax.xml.namespace.QName; -import java.net.URI; -import java.util.Collection; -import java.util.List; - /** * @author katkav * @author semancik */ @Service -@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public class ModelRestService { public static final String CLASS_DOT = ModelRestService.class.getName() + "."; @@ -102,10 +101,10 @@ public class ModelRestService { public static final String OPERATION_COMPARE = CLASS_DOT + "compare"; public static final String OPERATION_GET_LOG_FILE_CONTENT = CLASS_DOT + "getLogFileContent"; public static final String OPERATION_GET_LOG_FILE_SIZE = CLASS_DOT + "getLogFileSize"; - public static final String OPERATION_VALIDATE_VALUE = CLASS_DOT + "validateValue"; - public static final String OPERATION_VALIDATE_VALUE_RPC = CLASS_DOT + "validateValueRpc"; - public static final String OPERATION_GENERATE_VALUE = CLASS_DOT + "generateValue"; - public static final String OPERATION_GENERATE_VALUE_RPC = CLASS_DOT + "generateValueRpc"; + public static final String OPERATION_VALIDATE_VALUE = CLASS_DOT + "validateValue"; + public static final String OPERATION_VALIDATE_VALUE_RPC = CLASS_DOT + "validateValueRpc"; + public static final String OPERATION_GENERATE_VALUE = CLASS_DOT + "generateValue"; + public static final String OPERATION_GENERATE_VALUE_RPC = CLASS_DOT + "generateValueRpc"; public static final String OPERATION_EXECUTE_CREDENTIAL_RESET = CLASS_DOT + "executeCredentialReset"; public static final String OPERATION_EXECUTE_CLUSTER_EVENT = CLASS_DOT + "executeClusterCacheInvalidationEvent"; public static final String OPERATION_GET_LOCAL_SCHEDULER_INFORMATION = CLASS_DOT + "getLocalSchedulerInformation"; @@ -126,14 +125,10 @@ public class ModelRestService { @Autowired private ModelInteractionService modelInteraction; @Autowired private PrismContext prismContext; @Autowired private SecurityHelper securityHelper; - @Autowired private ValuePolicyProcessor policyProcessor; @Autowired private TaskManager taskManager; @Autowired private TaskService taskService; - @Autowired private Protector protector; @Autowired private ResourceValidator resourceValidator; - @Autowired private CacheDispatcher cacheDispatcher; - @Autowired private SystemObjectCache systemObjectCache; @Autowired private AuditService auditService; @@ -147,8 +142,8 @@ public ModelRestService() { @POST @Path("/{type}/{oid}/generate") - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response generateValue(@PathParam("type") String type, @PathParam("oid") String oid, PolicyItemsDefinitionType policyItemsDefinition, @Context MessageContext mc) { @@ -174,8 +169,8 @@ public Response generateValue(@PathParam("type") String type, @POST @Path("/rpc/generate") - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response generateValue(PolicyItemsDefinitionType policyItemsDefinition, @Context MessageContext mc) { @@ -188,7 +183,7 @@ public Response generateValue(PolicyItemsDefinitionType policyItemsDefinition, return response; } - private Response generateValue(PrismObject object, PolicyItemsDefinitionType policyItemsDefinition, Task task, OperationResult parentResult){ + private Response generateValue(PrismObject object, PolicyItemsDefinitionType policyItemsDefinition, Task task, OperationResult parentResult) { Response response; if (policyItemsDefinition == null) { response = createBadPolicyItemsDefinitionResponse("Policy items definition must not be null", parentResult); @@ -212,8 +207,8 @@ private Response generateValue(PrismObject object, Pol @POST @Path("/{type}/{oid}/validate") - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response validateValue(@PathParam("type") String type, @PathParam("oid") String oid, PolicyItemsDefinitionType policyItemsDefinition, @Context MessageContext mc) { Task task = initRequest(mc); @@ -235,8 +230,8 @@ public Response validateValue(@PathParam("type") String type, @PathParam("oid") @POST @Path("/rpc/validate") - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response validateValue(PolicyItemsDefinitionType policyItemsDefinition, @Context MessageContext mc) { Task task = initRequest(mc); @@ -263,24 +258,22 @@ private Response validateValue(PrismObject object, Htt return response; } + try { + modelInteraction.validateValue(object, policyItemsDefinition, task, parentResult); - try { - modelInteraction.validateValue(object, policyItemsDefinition, task, parentResult); - - parentResult.computeStatusIfUnknown(); - ResponseBuilder responseBuilder; - if (parentResult.isAcceptable()) { - response = RestServiceUtil.createResponse(Response.Status.OK, policyItemsDefinition, parentResult, true); - } else { - responseBuilder = Response.status(Status.CONFLICT).entity(parentResult); - response = responseBuilder.build(); - } - - } catch (Exception ex) { - parentResult.computeStatus(); - response = RestServiceUtil.handleException(parentResult, ex); + parentResult.computeStatusIfUnknown(); + ResponseBuilder responseBuilder; + if (parentResult.isAcceptable()) { + response = RestServiceUtil.createResponse(Response.Status.OK, policyItemsDefinition, parentResult, true); + } else { + responseBuilder = Response.status(Status.CONFLICT).entity(parentResult); + response = responseBuilder.build(); } + } catch (Exception ex) { + parentResult.computeStatus(); + response = RestServiceUtil.handleException(parentResult, ex); + } return response; } @@ -323,13 +316,13 @@ public Response getValuePolicyForUser(@PathParam("id") String oid, @Context Mess @GET @Path("/{type}/{id}") - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response getObject(@PathParam("type") String type, @PathParam("id") String id, @QueryParam("options") List options, @QueryParam("include") List include, @QueryParam("exclude") List exclude, @QueryParam("resolveNames") List resolveNames, - @Context MessageContext mc){ + @Context MessageContext mc) { LOGGER.debug("model rest service for get operation start"); Task task = initRequest(mc); @@ -347,7 +340,7 @@ public Response getObject(@PathParam("type") String type, @PathParam("id") Strin ObjectQuery query = prismContext.queryFor(NodeType.class) .item(NodeType.F_NODE_IDENTIFIER).eq(nodeId) .build(); - List> objects = model.searchObjects(NodeType.class, query, getOptions, task, parentResult); + List> objects = model.searchObjects(NodeType.class, query, getOptions, task, parentResult); if (objects.isEmpty()) { throw new ObjectNotFoundException("Current node (id " + nodeId + ") couldn't be found."); } else if (objects.size() > 1) { @@ -372,8 +365,8 @@ public Response getObject(@PathParam("type") String type, @PathParam("id") Strin @GET @Path("/self") - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) - public Response getSelf(@Context MessageContext mc){ + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) + public Response getSelf(@Context MessageContext mc) { LOGGER.debug("model rest service for get operation start"); Task task = initRequest(mc); @@ -394,12 +387,11 @@ public Response getSelf(@Context MessageContext mc){ return response; } - @POST @Path("/{type}") - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response addObject(@PathParam("type") String type, PrismObject object, - @QueryParam("options") List options, + @QueryParam("options") List options, @Context UriInfo uriInfo, @Context MessageContext mc) { LOGGER.debug("model rest service for add operation start"); @@ -407,7 +399,7 @@ public Response addObject(@PathParam("type") String type, OperationResult parentResult = task.getResult().createSubresult(OPERATION_ADD_OBJECT); Class clazz = ObjectTypes.getClassFromRestType(type); - if (!object.getCompileTimeClass().equals(clazz)){ + if (!object.getCompileTimeClass().equals(clazz)) { finishRequest(task, mc.getHttpServletRequest()); parentResult.recordFatalError("Request to add object of type " + object.getCompileTimeClass().getSimpleName() + " to the collection of " + type); @@ -420,7 +412,7 @@ public Response addObject(@PathParam("type") String type, Response response; try { oid = model.addObject(object, modelExecuteOptions, task, parentResult); - LOGGER.debug("returned oid : {}", oid ); + LOGGER.debug("returned oid : {}", oid); if (oid != null) { URI resourceURI = uriInfo.getAbsolutePathBuilder().path(oid).build(oid); @@ -441,7 +433,7 @@ public Response addObject(@PathParam("type") String type, @GET @Path("/{type}") - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response searchObjectsByType(@PathParam("type") String type, @QueryParam("options") List options, @QueryParam("include") List include, @QueryParam("exclude") List exclude, @QueryParam("resolveNames") List resolveNames, @@ -487,10 +479,10 @@ private void validateIfRequested(PrismObject object, @PUT @Path("/{type}/{id}") - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response addObject(@PathParam("type") String type, @PathParam("id") String id, PrismObject object, @QueryParam("options") List options, @Context UriInfo uriInfo, - @Context Request request, @Context MessageContext mc){ + @Context Request request, @Context MessageContext mc) { LOGGER.debug("model rest service for add operation start"); @@ -498,7 +490,7 @@ public Response addObject(@PathParam("type") String type, OperationResult parentResult = task.getResult().createSubresult(OPERATION_ADD_OBJECT); Class clazz = ObjectTypes.getClassFromRestType(type); - if (!object.getCompileTimeClass().equals(clazz)){ + if (!object.getCompileTimeClass().equals(clazz)) { finishRequest(task, mc.getHttpServletRequest()); parentResult.recordFatalError("Request to add object of type " + object.getCompileTimeClass().getSimpleName() @@ -509,7 +501,7 @@ public Response addObject(@PathParam("type") String type, ModelExecuteOptions modelExecuteOptions = ModelExecuteOptions.fromRestOptions(options); if (modelExecuteOptions == null) { modelExecuteOptions = ModelExecuteOptions.createOverwrite(); - } else if (!ModelExecuteOptions.isOverwrite(modelExecuteOptions)){ + } else if (!ModelExecuteOptions.isOverwrite(modelExecuteOptions)) { modelExecuteOptions.setOverwrite(Boolean.TRUE); } @@ -534,7 +526,7 @@ public Response addObject(@PathParam("type") String type, @DELETE @Path("/{type}/{id}") public Response deleteObject(@PathParam("type") String type, @PathParam("id") String id, - @QueryParam("options") List options, @Context MessageContext mc){ + @QueryParam("options") List options, @Context MessageContext mc) { LOGGER.debug("model rest service for delete operation start"); @@ -569,7 +561,7 @@ public Response deleteObject(@PathParam("type") String type, @PathParam("id") St @POST @Path("/{type}/{oid}") - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response modifyObjectPost(@PathParam("type") String type, @PathParam("oid") String oid, ObjectModificationType modificationType, @QueryParam("options") List options, @Context MessageContext mc) { return modifyObjectPatch(type, oid, modificationType, options, mc); @@ -577,7 +569,7 @@ public Response modifyObjectPost(@PathParam("type") String type, @PathParam("oid @PATCH @Path("/{type}/{oid}") - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response modifyObjectPatch(@PathParam("type") String type, @PathParam("oid") String oid, ObjectModificationType modificationType, @QueryParam("options") List options, @Context MessageContext mc) { @@ -605,7 +597,7 @@ public Response modifyObjectPatch(@PathParam("type") String type, @PathParam("oi @POST @Path("/notifyChange") - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response notifyChange(ResourceObjectShadowChangeDescriptionType changeDescription, @Context UriInfo uriInfo, @Context MessageContext mc) { LOGGER.debug("model rest service for notify change operation start"); @@ -629,8 +621,8 @@ public Response notifyChange(ResourceObjectShadowChangeDescriptionType changeDes @GET @Path("/shadows/{oid}/owner") - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) - public Response findShadowOwner(@PathParam("oid") String shadowOid, @Context MessageContext mc){ + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) + public Response findShadowOwner(@PathParam("oid") String shadowOid, @Context MessageContext mc) { Task task = initRequest(mc); OperationResult parentResult = task.getResult().createSubresult(OPERATION_FIND_SHADOW_OWNER); @@ -650,7 +642,7 @@ public Response findShadowOwner(@PathParam("oid") String shadowOid, @Context Mes @POST @Path("/shadows/{oid}/import") - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response importShadow(@PathParam("oid") String shadowOid, @Context MessageContext mc, @Context UriInfo uriInfo) { LOGGER.debug("model rest service for import shadow from resource operation start"); @@ -673,8 +665,8 @@ public Response importShadow(@PathParam("oid") String shadowOid, @Context Messag @POST @Path("/{type}/search") - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response searchObjects(@PathParam("type") String type, QueryType queryType, @QueryParam("options") List options, @QueryParam("include") List include, @@ -716,7 +708,7 @@ private void removeExcludes(PrismObject object, List Response compare(PrismObject clientObject, @QueryParam("readOptions") List restReadOptions, @QueryParam("compareOptions") List restCompareOptions, @@ -904,7 +895,7 @@ public Response compare(PrismObject clientObject, @GET @Path("/log/size") - @Produces({"text/plain"}) + @Produces({ "text/plain" }) public Response getLogFileSize(@Context MessageContext mc) { Task task = initRequest(mc); @@ -926,7 +917,7 @@ public Response getLogFileSize(@Context MessageContext mc) { @GET @Path("/log") - @Produces({"text/plain"}) + @Produces({ "text/plain" }) public Response getLog(@QueryParam("fromPosition") Long fromPosition, @QueryParam("maxSize") Long maxSize, @Context MessageContext mc) { Task task = initRequest(mc); @@ -956,8 +947,8 @@ public Response getLog(@QueryParam("fromPosition") Long fromPosition, @QueryPara @POST @Path("/users/{oid}/credential") - @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) - @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML}) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, RestServiceUtil.APPLICATION_YAML }) public Response executeCredentialReset(@PathParam("oid") String oid, ExecuteCredentialResetRequestType executeCredentialResetRequest, @Context MessageContext mc) { Task task = initRequest(mc); OperationResult result = task.getResult().createSubresult(OPERATION_EXECUTE_CREDENTIAL_RESET); @@ -976,12 +967,11 @@ public Response executeCredentialReset(@PathParam("oid") String oid, ExecuteCred finishRequest(task, mc.getHttpServletRequest()); return response; - } @GET @Path("/threads") - @Produces({"text/plain"}) + @Produces({ "text/plain" }) public Response getThreadsDump(@Context MessageContext mc) { Task task = initRequest(mc); @@ -1002,7 +992,7 @@ public Response getThreadsDump(@Context MessageContext mc) { @GET @Path("/tasks/threads") - @Produces({"text/plain"}) + @Produces({ "text/plain" }) public Response getRunningTasksThreadsDump(@Context MessageContext mc) { Task task = initRequest(mc); @@ -1023,7 +1013,7 @@ public Response getRunningTasksThreadsDump(@Context MessageContext mc) { @GET @Path("/tasks/{oid}/threads") - @Produces({"text/plain"}) + @Produces({ "text/plain" }) public Response getTaskThreadsDump(@PathParam("oid") String oid, @Context MessageContext mc) { Task task = initRequest(mc); OperationResult result = task.getResult().createSubresult(OPERATION_GET_TASK_THREADS_DUMP); @@ -1075,10 +1065,10 @@ public void auditEvent(HttpServletRequest request) { String name = null; if (principal instanceof MidPointPrincipal) { name = ((MidPointPrincipal) principal).getUsername(); - } else if (principal != null){ + } else if (principal != null) { return; } - PrismObject user = principal!= null ? ((MidPointPrincipal)principal).getFocus().asPrismObject() : null; + PrismObject user = principal != null ? ((MidPointPrincipal) principal).getFocus().asPrismObject() : null; Task task = taskManager.createTaskInstance(); task.setOwner(user); 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 deleted file mode 100644 index cecb25e7720..00000000000 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java +++ /dev/null @@ -1,446 +0,0 @@ -/* - * Copyright (c) 2010-2017 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.model.impl; - -import com.evolveum.midpoint.model.api.*; -import com.evolveum.midpoint.model.common.util.AbstractModelWebService; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.schema.DeltaConvertor; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.ObjectDeltaOperation; -import com.evolveum.midpoint.schema.SelectorOptions; -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.util.MiscSchemaUtil; -import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.util.exception.*; -import com.evolveum.midpoint.util.logging.LoggingUtils; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.api_types_3.*; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import com.evolveum.midpoint.xml.ns._public.common.fault_3.*; -import com.evolveum.midpoint.xml.ns._public.model.model_3.ExecuteScriptsResponseType; -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.PipelineDataType; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.PipelineItemType; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionEvaluationOptionsType; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType; -import com.evolveum.prism.xml.ns._public.query_3.QueryType; -import org.apache.commons.lang.StringUtils; -import org.apache.cxf.interceptor.Fault; -import org.apache.wss4j.common.ext.WSSecurityException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; -import javax.xml.namespace.QName; -import javax.xml.ws.Holder; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -/** - * - * @author lazyman - * - */ -@Service -public class ModelWebService extends AbstractModelWebService implements ModelPortType, ModelPort { - - private static final Trace LOGGER = TraceManager.getTrace(ModelWebService.class); - - @Autowired(required = true) - private ModelCrudService model; - - @Autowired - private ScriptingService scriptingService; - - @Override - public void getObject(QName objectType, String oid, SelectorQualifiedGetOptionsType optionsType, - Holder objectHolder, Holder resultHolder) throws FaultMessage { - notNullArgument(objectType, "Object type must not be null."); - notEmptyArgument(oid, "Oid must not be null or empty."); - - Task task = createTaskInstance(GET_OBJECT); - auditLogin(task); - OperationResult operationResult = task.getResult(); - try { - Class objectClass = ObjectTypes.getObjectTypeFromTypeQName(objectType).getClassDefinition(); - Collection> options = MiscSchemaUtil.optionsTypeToOptions(optionsType, - prismContext); - PrismObject object = model.getObject(objectClass, oid, options, task, operationResult); - handleOperationResult(operationResult, resultHolder); - objectHolder.value = object.asObjectable(); - return; - } catch (Exception ex) { - LoggingUtils.logException(LOGGER, "# MODEL getObject() failed", ex); - throwFault(ex, operationResult); - } finally { - auditLogout(task); - } - } - - @Override - public void searchObjects(QName objectType, QueryType query, SelectorQualifiedGetOptionsType optionsType, - Holder objectListHolder, Holder result) throws FaultMessage { - notNullArgument(objectType, "Object type must not be null."); - - Task task = createTaskInstance(SEARCH_OBJECTS); - auditLogin(task); - OperationResult operationResult = task.getResult(); - try { - Class objectClass = ObjectTypes.getObjectTypeFromTypeQName(objectType).getClassDefinition(); - Collection> options = MiscSchemaUtil.optionsTypeToOptions(optionsType, - prismContext); - ObjectQuery q = prismContext.getQueryConverter().createObjectQuery(objectClass, query); - List> list = (List)model.searchObjects(objectClass, q, options, task, operationResult); - handleOperationResult(operationResult, result); - ObjectListType listType = new ObjectListType(); - for (PrismObject o : list) { - listType.getObject().add(o.asObjectable()); - } - objectListHolder.value = listType; - } catch (Exception ex) { - LoggingUtils.logException(LOGGER, "# MODEL searchObjects() failed", ex); - throwFault(ex, operationResult); - } finally { - auditLogout(task); - } - } - - @Override - public ObjectDeltaOperationListType executeChanges(ObjectDeltaListType deltaList, ModelExecuteOptionsType optionsType) throws FaultMessage { - notNullArgument(deltaList, "Object delta list must not be null."); - - Task task = createTaskInstance(EXECUTE_CHANGES); - auditLogin(task); - OperationResult operationResult = task.getResult(); - try { - Collection deltas = DeltaConvertor.createObjectDeltas(deltaList, prismContext); - for (ObjectDelta delta : deltas) { - prismContext.adopt(delta); - } - ModelExecuteOptions options = ModelExecuteOptions.fromModelExecutionOptionsType(optionsType); - Collection> objectDeltaOperations = modelService.executeChanges((Collection) deltas, options, task, operationResult); // brutally eliminating type-safety compiler barking - ObjectDeltaOperationListType retval = new ObjectDeltaOperationListType(); - for (ObjectDeltaOperation objectDeltaOperation : objectDeltaOperations) { - ObjectDeltaOperationType objectDeltaOperationType = DeltaConvertor.toObjectDeltaOperationType(objectDeltaOperation, null); - retval.getDeltaOperation().add(objectDeltaOperationType); - } - return retval; - } catch (Exception ex) { - LoggingUtils.logException(LOGGER, "# MODEL executeChanges() failed", ex); - throwFault(ex, operationResult); - // notreached - return null; - } finally { - auditLogout(task); - } - } - - @Override - public void findShadowOwner(String accountOid, Holder userHolder, Holder result) - throws FaultMessage { - notEmptyArgument(accountOid, "Account oid must not be null or empty."); - - Task task = createTaskInstance(LIST_ACCOUNT_SHADOW_OWNER); - auditLogin(task); - OperationResult operationResult = task.getResult(); - try { - PrismObject user = modelService.searchShadowOwner(accountOid, null, task, operationResult); - handleOperationResult(operationResult, result); - if (user != null && user.asObjectable() instanceof UserType) { - // The schema for findShadowOwner SOAP call requires the returned object is of UserType. - // SOAP interface will be removed anyway, so let's not try to resolve this more intelligently. - userHolder.value = (UserType) user.asObjectable(); - } - return; - } catch (Exception ex) { - LoggingUtils.logException(LOGGER, "# MODEL findShadowOwner() failed", ex); - throwFault(ex, operationResult); - } finally { - auditLogout(task); - } - } - - @Override - public OperationResultType testResource(String resourceOid) throws FaultMessage { - notEmptyArgument(resourceOid, "Resource oid must not be null or empty."); - - Task task = createTaskInstance(TEST_RESOURCE); - auditLogin(task); - try { - OperationResult testResult = modelService.testResource(resourceOid, task); - return handleOperationResult(testResult); - } catch (Exception ex) { - LoggingUtils.logException(LOGGER, "# MODEL testResource() failed", ex); - OperationResult faultResult = new OperationResult(TEST_RESOURCE); - faultResult.recordFatalError(ex); - throwFault(ex, faultResult); - // notreached - return null; - } finally { - auditLogout(task); - } - } - - @Override - public ExecuteScriptsResponseType executeScripts(ExecuteScriptsType parameters) throws FaultMessage { - Task task = createTaskInstance(EXECUTE_SCRIPTS); - auditLogin(task); - OperationResult result = task.getResult(); - try { - List> scriptsToExecute = parseScripts(parameters); - return doExecuteScripts(scriptsToExecute, parameters.getOptions(), task, result); - } catch (Exception ex) { - LoggingUtils.logException(LOGGER, "# MODEL executeScripts() failed", ex); - throwFault(ex, null); - // notreached - return null; - } finally { - auditLogout(task); - } - } - - private List> parseScripts(ExecuteScriptsType parameters) throws JAXBException, SchemaException { - List> scriptsToExecute = new ArrayList<>(); - if (parameters.getXmlScripts() != null) { - for (Object scriptAsObject : parameters.getXmlScripts().getAny()) { - if (scriptAsObject instanceof JAXBElement) { - scriptsToExecute.add((JAXBElement) scriptAsObject); - } else { - throw new IllegalArgumentException("Invalid script type: " + scriptAsObject.getClass()); - } - } - } else { - // here comes MSL script decoding (however with a quick hack to allow passing XML as text here) - String scriptsAsString = parameters.getMslScripts(); - if (scriptsAsString.startsWith(" expressionType = (PrismProperty) prismContext.parserFor(scriptsAsString).xml().parseItem(); - if (expressionType.size() != 1) { - throw new IllegalArgumentException("Unexpected number of scripting expressions at input: " + expressionType.size() + " (expected 1)"); - } - scriptsToExecute.add(expressionType.getAnyValue().toJaxbElement()); - } - } - return scriptsToExecute; - } - - private ExecuteScriptsResponseType doExecuteScripts(List> 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 | ObjectNotFoundException | ExpressionEvaluationException | CommunicationException | ConfigurationException e) { - result.recordFatalError(e.getMessage(), e); - LoggingUtils.logException(LOGGER, "Exception while executing script", e); - } - result.summarize(); - response.setResult(result.createOperationResultType()); - return response; - } - - public static PipelineDataType prepareXmlData(List output, - ScriptingExpressionEvaluationOptionsType options) throws JAXBException, SchemaException { - boolean hideResults = options != null && Boolean.TRUE.equals(options.isHideOperationResults()); - PipelineDataType rv = new PipelineDataType(); - if (output != null) { - for (PipelineItem item: output) { - PipelineItemType itemType = new PipelineItemType(); - PrismValue value = item.getValue(); - if (value instanceof PrismReferenceValue) { - // This is a bit of hack: value.getRealValue() would return unserializable object (PRV$1 - does not have type QName) - ObjectReferenceType ort = new ObjectReferenceType(); - ort.setupReferenceValue((PrismReferenceValue) value); - itemType.setValue(ort); - } else { - itemType.setValue(value.getRealValue()); // TODO - ok? - } - if (!hideResults) { - itemType.setResult(item.getResult().createOperationResultType()); - } - rv.getItem().add(itemType); - } - } - return rv; - } - - private void handleOperationResult(OperationResult result, Holder holder) { - result.recordSuccess(); - OperationResultType resultType = result.createOperationResultType(); - if (holder.value == null) { - holder.value = resultType; - } else { - holder.value.getPartialResults().add(resultType); - } - } - - private OperationResultType handleOperationResult(OperationResult result) { - result.recordSuccess(); - return result.createOperationResultType(); - } - - private void notNullResultHolder(Holder holder) throws FaultMessage { - notNullArgument(holder, "Holder must not be null."); - notNullArgument(holder.value, "Result type must not be null."); - } - - private void notNullHolder(Holder holder) throws FaultMessage { - notNullArgument(holder, "Holder must not be null."); - notNullArgument(holder.value, holder.getClass().getSimpleName() + " must not be null (in Holder)."); - } - - private void notEmptyArgument(String object, String message) throws FaultMessage { - if (StringUtils.isEmpty(object)) { - throw createIllegalArgumentFault(message); - } - } - - private void notNullArgument(Object object, String message) throws FaultMessage { - if (object == null) { - throw createIllegalArgumentFault(message); - } - } - - public FaultMessage createIllegalArgumentFault(String message) { - FaultType faultType = new IllegalArgumentFaultType(); - return new FaultMessage(message, faultType); - } - - public void throwFault(Throwable ex, OperationResult result) throws FaultMessage { - if (result != null) { - result.recordFatalError(ex.getMessage(), ex); - } - - FaultType faultType; - if (ex instanceof ObjectNotFoundException) { - faultType = new ObjectNotFoundFaultType(); - } else if (ex instanceof IllegalArgumentException) { - faultType = new IllegalArgumentFaultType(); - } else if (ex instanceof ObjectAlreadyExistsException) { - faultType = new ObjectAlreadyExistsFaultType(); - } else if (ex instanceof CommunicationException) { - faultType = new CommunicationFaultType(); - } else if (ex instanceof ConfigurationException) { - faultType = new ConfigurationFaultType(); - } else if (ex instanceof ExpressionEvaluationException) { - faultType = new SystemFaultType(); - } else if (ex instanceof SchemaException) { - faultType = new SchemaViolationFaultType(); - } else if (ex instanceof PolicyViolationException) { - faultType = new PolicyViolationFaultType(); - } else if (ex instanceof AuthorizationException) { - throw new Fault(new WSSecurityException(WSSecurityException.ErrorCode.FAILED_AUTHENTICATION), - WSSecurityException.ErrorCode.FAILED_AUTHENTICATION.getQName()); - } else if (ex instanceof SecurityViolationException) { - throw new Fault(new WSSecurityException(WSSecurityException.ErrorCode.FAILURE), - WSSecurityException.ErrorCode.FAILURE.getQName()); - } else{ - faultType = new SystemFaultType(); - } - faultType.setMessage(ex.getMessage()); - if (result != null) { - faultType.setOperationResult(result.createOperationResultType()); - } - - FaultMessage fault = new FaultMessage(ex.getMessage(), faultType, ex); - LOGGER.trace("Throwing fault message type: {}", faultType.getClass(), fault); - throw fault; - } - - @Override - public TaskType importFromResource(String resourceOid, QName objectClass) - throws FaultMessage { - notEmptyArgument(resourceOid, "Resource oid must not be null or empty."); - notNullArgument(objectClass, "Object class must not be null."); - - Task task = createTaskInstance(IMPORT_FROM_RESOURCE); - auditLogin(task); - OperationResult operationResult = task.getResult(); - - try { - modelService.importFromResource(resourceOid, objectClass, task, operationResult); - operationResult.computeStatus(); - return handleTaskResult(task); - } catch (Exception ex) { - LoggingUtils.logException(LOGGER, "# MODEL importFromResource() failed", ex); - auditLogout(task); - throwFault(ex, operationResult); - // notreached - return null; - } - } - - @Override - public TaskType notifyChange(ResourceObjectShadowChangeDescriptionType changeDescription) - throws FaultMessage { - // TODO Auto-generated method stub - notNullArgument(changeDescription, "Change description must not be null"); - LOGGER.trace("notify change started"); - - Task task = createTaskInstance(NOTIFY_CHANGE); - OperationResult parentResult = task.getResult(); - - try { - modelService.notifyChange(changeDescription, task, parentResult); - } catch (ObjectNotFoundException | SchemaException | CommunicationException | ConfigurationException | - SecurityViolationException | ObjectAlreadyExistsException | ExpressionEvaluationException | - RuntimeException | Error | PolicyViolationException ex) { - LoggingUtils.logException(LOGGER, "# MODEL notifyChange() failed", ex); - auditLogout(task); - throwFault(ex, parentResult); - } - - - LOGGER.info("notify change ended."); - LOGGER.info("result of notify change: {}", parentResult.debugDump()); - return handleTaskResult(task); - } - - /** - * return appropriate form of taskType (and result) to - * return back to a web service caller. - * - * @param task - */ - private TaskType handleTaskResult(Task task) { - return task.getUpdatedTaskObject().asObjectable(); - } - -} diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java deleted file mode 100644 index 80bfeb1fc4b..00000000000 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (c) 2010-2015 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.model.impl; - -import com.evolveum.midpoint.model.api.ModelPort; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismSerializer; -import com.evolveum.midpoint.prism.SerializationOptions; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.result.OperationResult; -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.xml.ns._public.common.api_types_3.ObjectDeltaOperationListType; -import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectListType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; -import com.evolveum.midpoint.xml.ns._public.common.fault_3.FaultMessage; -import com.evolveum.midpoint.xml.ns._public.model.model_3.ExecuteChangesResponseType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.ExecuteChangesType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.ExecuteScriptsResponseType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.ExecuteScriptsType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.FindShadowOwnerResponseType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.FindShadowOwnerType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.GetObjectResponseType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.GetObjectType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.ImportFromResourceResponseType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.ImportFromResourceType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.NotifyChangeResponseType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.NotifyChangeType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.SearchObjectsResponseType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.SearchObjectsType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.TestResourceResponseType; -import com.evolveum.midpoint.xml.ns._public.model.model_3.TestResourceType; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; - -import javax.xml.namespace.QName; -import javax.xml.soap.Detail; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPFactory; -import javax.xml.soap.SOAPFault; -import javax.xml.transform.dom.DOMSource; -import javax.xml.ws.Holder; -import javax.xml.ws.Provider; -import javax.xml.ws.soap.SOAPFaultException; - -/** - * - * @author mederly - * - */ -@Service -public class ModelWebServiceRaw implements Provider { - - private static final Trace LOGGER = TraceManager.getTrace(ModelWebServiceRaw.class); - - public static final String NS_SOAP11_ENV = "http://schemas.xmlsoap.org/soap/envelope/"; - public static final String NS_SOAP11_ENV_PREFIX = "SOAP-ENV"; - public static final QName SOAP11_FAULT = new QName(NS_SOAP11_ENV, "Fault"); - public static final QName SOAP11_FAULTCODE = new QName("", "faultcode"); - public static final String SOAP11_FAULTCODE_SERVER = NS_SOAP11_ENV_PREFIX + ":Server"; - public static final QName SOAP11_FAULTSTRING = new QName("", "faultstring"); - public static final QName SOAP11_FAULTACTOR = new QName("", "faultactor"); - public static final QName SOAP11_FAULT_DETAIL = new QName("", "detail"); - public static final String ACTOR = "TODO"; - - @Autowired - private ModelWebService ws; - - @Autowired - private PrismContext prismContext; - - @Override - public DOMSource invoke(DOMSource request) { - try { - return invokeAllowingFaults(request); - } catch (FaultMessage faultMessage) { - try { - SOAPFactory factory = SOAPFactory.newInstance(); - SOAPFault soapFault = factory.createFault(); - soapFault.setFaultCode(SOAP11_FAULTCODE_SERVER); // todo here is a constant until we have a mechanism to determine the correct value (client / server) - soapFault.setFaultString(faultMessage.getMessage()); - Detail detail = soapFault.addDetail(); - serializeFaultMessage(detail, faultMessage); - // fault actor? - // stack trace of the outer exception (FaultMessage) is unimportant, because it is always created at one place - // todo consider providing stack trace of the inner exception - //Detail detail = soapFault.addDetail(); - //detail.setTextContent(getStackTraceAsString(faultMessage)); - throw new SOAPFaultException(soapFault); - } catch (SOAPException e) { - throw new RuntimeException("SOAP Exception: " + e.getMessage(), e); - } - } - } - - public DOMSource invokeAllowingFaults(DOMSource request) throws FaultMessage { - Node rootNode = request.getNode(); - Element rootElement; - if (rootNode instanceof Document) { - rootElement = ((Document) rootNode).getDocumentElement(); - } else if (rootNode instanceof Element) { - rootElement = (Element) rootNode; - } else { - throw ws.createIllegalArgumentFault("Unexpected DOM node type: " + rootNode); - } - - Object requestObject; - try { - requestObject = prismContext.parserFor(rootElement).parseRealValue(); - } catch (SchemaException e) { - throw ws.createIllegalArgumentFault("Couldn't parse SOAP request body because of schema exception: " + e.getMessage()); - } - - Node response; - Holder operationResultTypeHolder = new Holder<>(); - try { - PrismSerializer serializer = prismContext.domSerializer() - .options(SerializationOptions.createSerializeReferenceNames()); - if (requestObject instanceof GetObjectType) { - GetObjectType g = (GetObjectType) requestObject; - Holder objectTypeHolder = new Holder<>(); - ws.getObject(g.getObjectType(), g.getOid(), g.getOptions(), objectTypeHolder, operationResultTypeHolder); - GetObjectResponseType gr = new GetObjectResponseType(); - gr.setObject(objectTypeHolder.value); - gr.setResult(operationResultTypeHolder.value); - response = serializer.serializeAnyData(gr, ModelPort.GET_OBJECT_RESPONSE); - } else if (requestObject instanceof SearchObjectsType) { - SearchObjectsType s = (SearchObjectsType) requestObject; - Holder objectListTypeHolder = new Holder<>(); - ws.searchObjects(s.getObjectType(), s.getQuery(), s.getOptions(), objectListTypeHolder, operationResultTypeHolder); - SearchObjectsResponseType sr = new SearchObjectsResponseType(); - sr.setObjectList(objectListTypeHolder.value); - sr.setResult(operationResultTypeHolder.value); - response = serializer.serializeAnyData(sr, ModelPort.SEARCH_OBJECTS_RESPONSE); - } else if (requestObject instanceof ExecuteChangesType) { - ExecuteChangesType e = (ExecuteChangesType) requestObject; - ObjectDeltaOperationListType objectDeltaOperationListType = ws.executeChanges(e.getDeltaList(), e.getOptions()); - ExecuteChangesResponseType er = new ExecuteChangesResponseType(); - er.setDeltaOperationList(objectDeltaOperationListType); - response = serializer.serializeAnyData(er, ModelPort.EXECUTE_CHANGES_RESPONSE); - } else if (requestObject instanceof FindShadowOwnerType) { - FindShadowOwnerType f = (FindShadowOwnerType) requestObject; - Holder userTypeHolder = new Holder<>(); - ws.findShadowOwner(f.getShadowOid(), userTypeHolder, operationResultTypeHolder); - FindShadowOwnerResponseType fsr = new FindShadowOwnerResponseType(); - fsr.setUser(userTypeHolder.value); - fsr.setResult(operationResultTypeHolder.value); - response = serializer.serializeAnyData(fsr, ModelPort.FIND_SHADOW_OWNER_RESPONSE); - } else if (requestObject instanceof TestResourceType) { - TestResourceType tr = (TestResourceType) requestObject; - OperationResultType operationResultType = ws.testResource(tr.getResourceOid()); - TestResourceResponseType trr = new TestResourceResponseType(); - trr.setResult(operationResultType); - response = serializer.serializeAnyData(trr, ModelPort.TEST_RESOURCE_RESPONSE); - } else if (requestObject instanceof ExecuteScriptsType) { - ExecuteScriptsType es = (ExecuteScriptsType) requestObject; - ExecuteScriptsResponseType esr = ws.executeScripts(es); - response = serializer.serializeAnyData(esr, ModelPort.EXECUTE_SCRIPTS_RESPONSE); - } else if (requestObject instanceof ImportFromResourceType) { - ImportFromResourceType ifr = (ImportFromResourceType) requestObject; - TaskType taskType = ws.importFromResource(ifr.getResourceOid(), ifr.getObjectClass()); - ImportFromResourceResponseType ifrr = new ImportFromResourceResponseType(); - ifrr.setTask(taskType); - response = serializer.serializeAnyData(ifrr, ModelPort.IMPORT_FROM_RESOURCE_RESPONSE); - } else if (requestObject instanceof NotifyChangeType) { - NotifyChangeType nc = (NotifyChangeType) requestObject; - TaskType taskType = ws.notifyChange(nc.getChangeDescription()); - NotifyChangeResponseType ncr = new NotifyChangeResponseType(); - ncr.setTask(taskType); - response = serializer.serializeAnyData(ncr, ModelPort.NOTIFY_CHANGE_RESPONSE); - } else { - throw ws.createIllegalArgumentFault("Unsupported request type: " + requestObject); - } - } catch (SchemaException e) { - throwFault(e, operationResultTypeHolder.value); - // not reached - return null; - } - - // brutal hack for MID-2001 (serializing and parsing eliminates the problem!) - //String serialized = DOMUtil.printDom(response).toString(); - //LOGGER.trace("WEB SERVICE RESPONSE:\n{}", serialized); - //response = DOMUtil.parseDocument(serialized); - - return new DOMSource(response); - } - - private void serializeFaultMessage(Detail detail, FaultMessage faultMessage) { - prismContext.hacks() - .serializeFaultMessage(detail, faultMessage.getFaultInfo(), SchemaConstants.FAULT_MESSAGE_ELEMENT_NAME, LOGGER); - } - - private void throwFault(Exception ex, OperationResultType resultType) throws FaultMessage { - if (resultType != null) { - ws.throwFault(ex, OperationResult.createOperationResult(resultType)); - } else { - ws.throwFault(ex, null); - } - } -} diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/PipelineData.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/PipelineData.java index bdc692dfb22..458983515b3 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/PipelineData.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/PipelineData.java @@ -20,6 +20,9 @@ import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.PipelineDataType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.PipelineItemType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionEvaluationOptionsType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ValueListType; import com.evolveum.prism.xml.ns._public.query_3.QueryType; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; @@ -198,4 +201,29 @@ public PipelineData cloneMutableState() { data.forEach(d -> rv.add(d.cloneMutableState())); return rv; } + + public static PipelineDataType prepareXmlData( + List output, ScriptingExpressionEvaluationOptionsType options) { + boolean hideResults = options != null && Boolean.TRUE.equals(options.isHideOperationResults()); + PipelineDataType rv = new PipelineDataType(); + if (output != null) { + for (PipelineItem item : output) { + PipelineItemType itemType = new PipelineItemType(); + PrismValue value = item.getValue(); + if (value instanceof PrismReferenceValue) { + // This is a bit of hack: value.getRealValue() would return unserializable object (PRV$1 - does not have type QName) + ObjectReferenceType ort = new ObjectReferenceType(); + ort.setupReferenceValue((PrismReferenceValue) value); + itemType.setValue(ort); + } else { + itemType.setValue(value.getRealValue()); + } + if (!hideResults) { + itemType.setResult(item.getResult().createOperationResultType()); + } + rv.getItem().add(itemType); + } + } + return rv; + } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/MidpointPasswordValidator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/MidpointPasswordValidator.java deleted file mode 100644 index eebb7c1d911..00000000000 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/MidpointPasswordValidator.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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. - */ -package com.evolveum.midpoint.model.impl.security; - -import com.evolveum.midpoint.model.api.authentication.GuiProfiledPrincipalManager; -import com.evolveum.midpoint.model.api.authentication.GuiProfiledPrincipal; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.security.api.ConnectionEnvironment; -import com.evolveum.midpoint.security.api.MidPointPrincipal; -import com.evolveum.midpoint.util.exception.*; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - -import org.apache.wss4j.common.ext.WSSecurityException; -import org.apache.wss4j.dom.handler.RequestData; -import org.apache.wss4j.dom.message.token.UsernameToken; -import org.apache.wss4j.dom.validate.Credential; -import org.apache.wss4j.dom.validate.UsernameTokenValidator; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class MidpointPasswordValidator extends UsernameTokenValidator { - - @Autowired private PasswordAuthenticationEvaluatorImpl passwdEvaluator; - @Autowired private GuiProfiledPrincipalManager userService; - - @Override - public Credential validate(Credential credential, RequestData data) throws WSSecurityException { - try { - Credential credentialToReturn = super.validate(credential, data); - recordAuthenticationSuccess(credential); - return credentialToReturn; - } catch (WSSecurityException ex) { - recordAuthenticatonError(credential, ex); - throw ex; - } - } - - private void recordAuthenticationSuccess(Credential credential) throws WSSecurityException { - MidPointPrincipal principal = resolveMidpointPrincipal(credential); - ConnectionEnvironment connEnv = ConnectionEnvironment.create(SchemaConstants.CHANNEL_WEB_SERVICE_URI); - passwdEvaluator.recordPasswordAuthenticationSuccess(principal, connEnv, resolvePassowrd(principal)); - } - - private void recordAuthenticatonError(Credential credential, WSSecurityException originEx) throws WSSecurityException { - - - MidPointPrincipal principal = resolveMidpointPrincipal(credential); - - PasswordType passwordType = resolvePassowrd(principal); - - ConnectionEnvironment connEnv = ConnectionEnvironment.create(SchemaConstants.CHANNEL_WEB_SERVICE_URI); - - PasswordCredentialsPolicyType passwdPolicy = null; - - if (principal.getApplicableSecurityPolicy() != null) { - CredentialsPolicyType credentialsPolicyType = principal.getApplicableSecurityPolicy().getCredentials(); - passwdPolicy = credentialsPolicyType.getPassword(); - } - - passwdEvaluator.recordPasswordAuthenticationFailure(principal, connEnv, passwordType, passwdPolicy, originEx.getMessage()); - } - - private MidPointPrincipal resolveMidpointPrincipal(Credential credential) throws WSSecurityException { - UsernameToken usernameToken = credential.getUsernametoken(); - String username = usernameToken.getName(); - - GuiProfiledPrincipal principal = null; - try { - principal = userService.getPrincipal(username, UserType.class); - } catch (ObjectNotFoundException | SchemaException | CommunicationException | ConfigurationException | SecurityViolationException | ExpressionEvaluationException e) { - - throw new WSSecurityException(WSSecurityException.ErrorCode.FAILED_AUTHENTICATION, e); - } - - return principal; - } - - private PasswordType resolvePassowrd(MidPointPrincipal principal) { - FocusType user = principal.getFocus(); - PasswordType passwordType = null; - if (user.getCredentials() != null) { - passwordType = user.getCredentials().getPassword(); - } - - return passwordType; - } -} diff --git a/model/model-impl/src/main/resources/ctx-model.xml b/model/model-impl/src/main/resources/ctx-model.xml index fe9c2343717..5c06ec66d76 100644 --- a/model/model-impl/src/main/resources/ctx-model.xml +++ b/model/model-impl/src/main/resources/ctx-model.xml @@ -8,24 +8,19 @@ --> + http://cxf.apache.org/schemas/jaxrs.xsd" + default-lazy-init="false" + default-autowire="byName"> @@ -35,15 +30,15 @@ - - - - + + + + - + @@ -51,13 +46,12 @@ - - + + - + @@ -65,34 +59,38 @@ - - - - + + + + + - - - + + + + - - - - + + + + + - - - + + + + - + @@ -116,8 +114,8 @@ - + @@ -125,8 +123,8 @@ - + @@ -135,8 +133,8 @@ - + @@ -145,54 +143,49 @@ - - - - - - - + class="com.evolveum.midpoint.model.common.expression.evaluator.AssignmentTargetSearchExpressionEvaluatorFactory"> + + + + + + + - - - - - - - + class="com.evolveum.midpoint.model.common.expression.evaluator.ReferenceSearchExpressionEvaluatorFactory"> + + + + + + + - - - - - - - + class="com.evolveum.midpoint.model.common.expression.evaluator.AssociationTargetSearchExpressionEvaluatorFactory"> + + + + + + + - - - - - - + class="com.evolveum.midpoint.model.common.expression.evaluator.AssociationFromLinkExpressionEvaluatorFactory"> + + + + + + - + @@ -207,8 +200,7 @@ - + @@ -216,8 +208,8 @@ - + @@ -302,37 +294,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - 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 58e56d53e8f..ecf2aee10c3 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 @@ -14,13 +14,13 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.stream.Collectors; -import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; -import com.evolveum.midpoint.model.api.ScriptExecutionException; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; @@ -31,7 +31,7 @@ import com.evolveum.midpoint.common.LoggingConfigurationManager; import com.evolveum.midpoint.model.api.ModelPublicConstants; import com.evolveum.midpoint.model.api.PipelineItem; -import com.evolveum.midpoint.model.impl.ModelWebService; +import com.evolveum.midpoint.model.api.ScriptExecutionException; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; import com.evolveum.midpoint.model.impl.scripting.PipelineData; import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator; @@ -49,7 +49,6 @@ import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; -import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.LogfileTestTailer; import com.evolveum.midpoint.test.util.MidPointAsserts; @@ -1274,14 +1273,13 @@ private void assertAttributesFetched(List data) { } } - private void dumpOutput(ExecutionContext output, OperationResult result) throws JAXBException, SchemaException { + private void dumpOutput(ExecutionContext output, OperationResult result) throws SchemaException { displayDumpable("output", output.getFinalOutput()); displayValue("stdout", output.getConsoleOutput()); display(result); if (output.getFinalOutput() != null) { - PipelineDataType bean = ModelWebService.prepareXmlData(output.getFinalOutput().getData(), null); + PipelineDataType bean = PipelineData.prepareXmlData(output.getFinalOutput().getData(), null); displayValue("output in XML", prismContext.xmlSerializer().root(new QName("output")).serializeRealValue(bean)); } } - } diff --git a/pom.xml b/pom.xml index 13aef71209b..258bb11c1c1 100644 --- a/pom.xml +++ b/pom.xml @@ -198,7 +198,6 @@ 1.4.0 7.1.1 7.0 - 2.3.1 1.1.3 9.4.20.v20190813 3.6.2 @@ -216,11 +215,6 @@ javax.xml.soap-api ${javax.xml.soap.version} - - javax.xml.ws - jaxws-api - ${jaxws-api.version} - org.apache.geronimo.specs geronimo-ws-metadata_2.0_spec