From e74df51165e60a681a06adf76ccbf539441e6b49 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 13 Oct 2016 12:25:04 +0200 Subject: [PATCH] Selectable data language in debug pages. --- .../midpoint/gui/api/page/PageBase.java | 25 +++-- .../midpoint/web/component/AceEditor.java | 23 +++- .../admin/configuration/PageDebugView.java | 37 +++--- .../web/page/admin/reports/PageReport.java | 5 +- .../admin/resources/PageResourceEdit.java | 2 +- .../midpoint/prism/PrismParserImpl.java | 5 +- .../midpoint/prism/PrismParserImplNoIO.java | 3 +- .../midpoint/prism/PrismParserNoIO.java | 3 +- .../schema/util/AdminGuiConfigTypeUtil.java | 19 +++- .../xml/ns/public/common/common-core-3.xsd | 27 +++++ .../impl/security/UserProfileServiceImpl.java | 105 +++++++++--------- 11 files changed, 163 insertions(+), 91 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java index 4ebf9899854..2726deec301 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java @@ -33,6 +33,7 @@ import com.evolveum.midpoint.web.page.admin.configuration.*; import com.evolveum.midpoint.web.page.admin.reports.*; import com.evolveum.midpoint.web.page.self.*; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.apache.wicket.AttributeModifier; @@ -159,10 +160,6 @@ import com.evolveum.midpoint.web.session.UserProfileStorage; import com.evolveum.midpoint.web.util.validation.MidpointFormValidatorRegistry; import com.evolveum.midpoint.wf.api.WorkflowManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RichHyperlinkType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemType; /** * @author lazyman @@ -870,8 +867,20 @@ public RestartResponseException getRestartResponseException(Class void validateObject(String xmlObject, final Holder

objectHolder, - boolean validateSchema, OperationResult result) { + protected void validateObject(String lexicalRepresentation, final Holder> objectHolder, + String language, boolean validateSchema, OperationResult result) { + + if (language == null || PrismContext.LANG_JSON.equals(language) || PrismContext.LANG_YAML.equals(language)) { + PrismObject object; + try { + object = getPrismContext().parserFor(lexicalRepresentation).language(language).parse(); + objectHolder.setValue(object); + } catch (RuntimeException | SchemaException e) { + result.recordFatalError("Couldn't parse object: " + e.getMessage(), e); + } + return; + } + EventHandler handler = new EventHandler() { @Override @@ -883,7 +892,7 @@ public EventResult preMarshall(Element objectElement, Node postValidationTree, @Override public EventResult postMarshall(PrismObject object, Element objectElement, OperationResult objectResult) { - objectHolder.setValue((P) object); + objectHolder.setValue((PrismObject) object); return EventResult.cont(); } @@ -894,7 +903,7 @@ public void handleGlobalError(OperationResult currentResult) { Validator validator = new Validator(getPrismContext(), handler); validator.setVerbose(true); validator.setValidateSchema(validateSchema); - validator.validateObject(xmlObject, result); + validator.validateObject(lexicalRepresentation, result); result.computeStatus(); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/AceEditor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/AceEditor.java index 97ded86034a..11d504bcb4f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/AceEditor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/AceEditor.java @@ -16,16 +16,32 @@ package com.evolveum.midpoint.web.component; +import com.evolveum.midpoint.prism.PrismContext; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.markup.html.form.TextArea; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; public class AceEditor extends TextArea { public static final String MODE_XML = "ace/mode/xml"; + public static final String MODE_JSON = "ace/mode/json"; + public static final String MODE_YAML = "ace/mode/yaml"; + + public static final Map MODES = new HashMap<>(); + + static { + MODES.put(null, MODE_XML); + MODES.put(PrismContext.LANG_XML, MODE_XML); + MODES.put(PrismContext.LANG_JSON, MODE_JSON); + MODES.put(PrismContext.LANG_YAML, MODE_YAML); + } private IModel readonly = new Model(false); @@ -88,7 +104,11 @@ public void setMode(String mode) { this.mode = mode; } - public void setReadonly(boolean readonly) { + public void setModeForDataLanguage(@Nullable String dataLanguage) { + setMode(MODES.get(dataLanguage)); + } + + public void setReadonly(boolean readonly) { this.readonly.setObject(readonly); } @@ -102,4 +122,5 @@ public void refreshReadonly(AjaxRequestTarget target) { target.appendJavaScript(sb.toString()); } + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java index b2ddc95c654..01e0865d53c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java @@ -27,7 +27,6 @@ import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ReportTypeUtil; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.Holder; @@ -38,18 +37,12 @@ import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.AjaxSubmitButton; -import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto; import com.evolveum.midpoint.web.component.AceEditor; import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto; import com.evolveum.midpoint.web.security.MidPointApplication; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.StringUtils; -import org.apache.wicket.Page; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; @@ -90,6 +83,7 @@ public class PageDebugView extends PageAdminConfiguration { private final IModel switchToPlainText = new Model<>(false); private TextArea plainTextarea; final Form mainForm = new Form("mainForm"); + private final String dataLanguage; public PageDebugView() { model = new LoadableModel(false) { @@ -99,9 +93,19 @@ protected ObjectViewDto load() { return loadObject(); } }; + dataLanguage = determineDataLanguage(); initLayout(); } + private String determineDataLanguage() { + AdminGuiConfigurationType config = loadAdminGuiConfiguration(); + if (config != null && config.getPreferredDataLanguage() != null) { + return config.getPreferredDataLanguage(); + } else { + return PrismContext.LANG_XML; + } + } + @Override protected IModel createPageTitleModel() { return new AbstractReadOnlyModel() { @@ -159,8 +163,8 @@ private ObjectViewDto loadObject() { PrismObject object = getModelService().getObject(type, objectOid.toString(), options, task, result); PrismContext context = application.getPrismContext(); - String xml = context.serializeObjectToString(object, PrismContext.LANG_XML); - dto = new ObjectViewDto(object.getOid(), WebComponentUtil.getName(object), object, xml); + String lex = context.serializerFor(dataLanguage).serialize(object); + dto = new ObjectViewDto(object.getOid(), WebComponentUtil.getName(object), object, lex); result.recomputeStatus(); } catch (Exception ex) { @@ -172,7 +176,7 @@ private ObjectViewDto loadObject() { throw new RestartResponseException(PageDebugList.class); } - showResult(result, false); + showResult(result, false); if (!WebComponentUtil.isSuccessOrHandledErrorOrWarning(result)) { showResult(result, false); @@ -185,8 +189,6 @@ private ObjectViewDto loadObject() { private void initLayout() { add(mainForm); -// final IModel editable = new Model(false); - mainForm.add(new AjaxCheckBox("encrypt", encrypt) { @Override @@ -219,7 +221,7 @@ protected void onUpdate(AjaxRequestTarget target) { @Override protected void onUpdate(AjaxRequestTarget target) { - if (switchToPlainText.getObject().booleanValue()){ + if (switchToPlainText.getObject()){ editor.setVisible(false); plainTextarea.setVisible(true); } else { @@ -237,6 +239,7 @@ protected void onUpdate(AjaxRequestTarget target) { mainForm.add(plainTextarea); editor = new AceEditor("aceEditor", new PropertyModel(model, ObjectViewDto.F_XML)); + editor.setModeForDataLanguage(dataLanguage); mainForm.add(editor); initButtons(mainForm); @@ -296,11 +299,11 @@ public void savePerformed(AjaxRequestTarget target) { PrismObject oldObject = dto.getObject(); oldObject.revive(getPrismContext()); - Holder> objectHolder = new Holder>(null); + Holder> objectHolder = new Holder<>(null); if (editor.isVisible()) { - validateObject(editor.getModel().getObject(), objectHolder, validateSchema.getObject(), result); + validateObject(editor.getModel().getObject(), objectHolder, dataLanguage, validateSchema.getObject(), result); } else { - validateObject(plainTextarea.getModel().getObject(), objectHolder, validateSchema.getObject(), result); + validateObject(plainTextarea.getModel().getObject(), objectHolder, dataLanguage, validateSchema.getObject(), result); } if (result.isAcceptable()) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java index ed2e075be60..366b156e2bb 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java @@ -15,7 +15,6 @@ */ package com.evolveum.midpoint.web.page.admin.reports; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -217,7 +216,7 @@ public void validate(IValidatable validatable) { OpResult opResult = null; try { - validateObject(value, reportHolder, true, result); + validateObject(value, reportHolder, PrismContext.LANG_XML, true, result); if(!result.isAcceptable()){ result.recordFatalError("Could not validate object", result.getCause()); @@ -262,7 +261,7 @@ public void setObject(String object) { Holder> reportHolder = new Holder<>(null); try { - validateObject(object, reportHolder, true, result); + validateObject(object, reportHolder, PrismContext.LANG_XML, true, result); model.getObject().setObject(reportHolder.getValue()); } catch (Exception e){ LOGGER.error("Could not set object. Validation problem occured." + result.getMessage()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java index e4afafd2d28..c9947013cdf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java @@ -214,7 +214,7 @@ private void savePerformed(AjaxRequestTarget target) { OperationResult result = task.getResult(); try { Holder> objectHolder = new Holder>(null); - validateObject(dto.getXml(), objectHolder, false, result); + validateObject(dto.getXml(), objectHolder, PrismContext.LANG_XML, false, result); if (result.isAcceptable()) { PrismObject newResource = objectHolder.getValue(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java index d693d54c127..ed0b0466656 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; @@ -46,14 +47,14 @@ public PrismParserImpl(@NotNull ParserSource source, String language, @NotNull P this.helpers = helpers; } - private PrismParser create(ParserSource source, String language, @NotNull ParsingContext context, LexicalHelpers helpers) { + private PrismParser create(ParserSource source, @Nullable String language, @NotNull ParsingContext context, LexicalHelpers helpers) { return source.isIO() ? new PrismParserImplIO(source, language, context, helpers) : new PrismParserImplNoIO(source, language, context, helpers); } @Override - public PrismParser language(String language) { + public PrismParser language(@Nullable String language) { return create(this.source, language, this.context, this.helpers); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java index 0fb431a9568..7c076dcf240 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; @@ -37,7 +38,7 @@ public PrismParserImplNoIO(ParserSource source, String language, ParsingContext } @Override - public PrismParserNoIO language(String language) { + public PrismParserNoIO language(@Nullable String language) { return (PrismParserNoIO) super.language(language); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java index b5edbfe8442..116266a316f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; @@ -35,7 +36,7 @@ */ public interface PrismParserNoIO extends PrismParser { - PrismParserNoIO language(String language); + PrismParserNoIO language(@Nullable String language); PrismParserNoIO xml(); PrismParserNoIO json(); PrismParserNoIO yaml(); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java index 6cda5218920..9b5ce4d9e48 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java @@ -15,14 +15,15 @@ */ package com.evolveum.midpoint.schema.util; -import java.util.Collection; -import java.util.Iterator; - import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFormType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFormsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; +import org.jetbrains.annotations.NotNull; + +import java.util.Iterator; +import java.util.List; /** * @author semancik @@ -30,8 +31,15 @@ */ public class AdminGuiConfigTypeUtil { - public static AdminGuiConfigurationType compileAdminGuiConfiguration(Collection adminGuiConfigurations, + public static AdminGuiConfigurationType compileAdminGuiConfiguration(@NotNull List adminGuiConfigurations, PrismObject systemConfiguration) { + + // if there's no admin config at all, return null (to preserve original behavior) + if (adminGuiConfigurations.isEmpty() && + (systemConfiguration == null || systemConfiguration.asObjectable().getAdminGuiConfiguration() == null)) { + return null; + } + AdminGuiConfigurationType composite = new AdminGuiConfigurationType(); if (systemConfiguration != null) { applyAdminGuiConfiguration(composite, systemConfiguration.asObjectable().getAdminGuiConfiguration()); @@ -51,6 +59,9 @@ private static void applyAdminGuiConfiguration(AdminGuiConfigurationType composi if (adminGuiConfiguration.getDefaultTimezone() != null) { composite.setDefaultTimezone(adminGuiConfiguration.getDefaultTimezone()); } + if (adminGuiConfiguration.getPreferredDataLanguage() != null) { + composite.setPreferredDataLanguage(adminGuiConfiguration.getPreferredDataLanguage()); + } if (adminGuiConfiguration.getObjectForms() != null) { if (composite.getObjectForms() == null) { composite.setObjectForms(adminGuiConfiguration.getObjectForms().clone()); diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 770a3e8f7d5..8238653ab8b 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -2451,6 +2451,21 @@ + + + +

+ Specifies the admin GUI configuration that should be used + by this user. +

+ + + 3.5 + AdminGuiConfigurationType.adminGuiConfiguration + + + + @@ -9475,6 +9490,18 @@ + + + +

+ Preferred data language (e.g. xml, json, yaml - written in lowercase). Default is xml. +

+
+ + 3.5 + +
+
diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java index 52261f60021..a545045442b 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java @@ -189,66 +189,65 @@ private void initializePrincipalFromAssignments(MidPointPrincipal principal, Pri UserType userType = principal.getUser(); Collection authorizations = principal.getAuthorities(); - Collection adminGuiConfigurations = new ArrayList<>(); + List adminGuiConfigurations = new ArrayList<>(); Task task = taskManager.createTaskInstance(UserProfileServiceImpl.class.getName() + ".addAuthorizations"); OperationResult result = task.getResult(); principal.setApplicableSecurityPolicy(locateSecurityPolicy(principal, systemConfiguration, task, result)); - - if (userType.getAssignment().isEmpty()) { - if (systemConfiguration != null) { - principal.setAdminGuiConfiguration(systemConfiguration.asObjectable().getAdminGuiConfiguration()); - } - return; - } - - AssignmentEvaluator assignmentEvaluator = new AssignmentEvaluator<>(); - assignmentEvaluator.setRepository(repositoryService); - assignmentEvaluator.setFocusOdo(new ObjectDeltaObject(userType.asPrismObject(), null, userType.asPrismObject())); - assignmentEvaluator.setChannel(null); - assignmentEvaluator.setObjectResolver(objectResolver); - assignmentEvaluator.setSystemObjectCache(systemObjectCache); - assignmentEvaluator.setPrismContext(prismContext); - assignmentEvaluator.setMappingFactory(mappingFactory); - assignmentEvaluator.setMappingEvaluator(mappingEvaluator); - assignmentEvaluator.setActivationComputer(activationComputer); - assignmentEvaluator.setNow(clock.currentTimeXMLGregorianCalendar()); - - // We do need only authorizations. Therefore we not need to evaluate constructions, - // so switching it off is faster. It also avoids nasty problems with resources being down, - // resource schema not available, etc. - assignmentEvaluator.setEvaluateConstructions(false); - - // We do not have real lens context here. But the push methods in ModelExpressionThreadLocalHolder - // will need something to push on the stack. So give them context placeholder. - LensContext lensContext = new LensContextPlaceholder<>(prismContext); - assignmentEvaluator.setLensContext(lensContext); - - for(AssignmentType assignmentType: userType.getAssignment()) { - try { - ItemDeltaItem,PrismContainerDefinition> assignmentIdi = new ItemDeltaItem<>(); - assignmentIdi.setItemOld(LensUtil.createAssignmentSingleValueContainerClone(assignmentType)); - assignmentIdi.recompute(); - EvaluatedAssignment assignment = assignmentEvaluator.evaluate(assignmentIdi, false, userType, userType.toString(), task, result); - if (assignment.isValid()) { - authorizations.addAll(assignment.getAuthorizations()); - adminGuiConfigurations.addAll(assignment.getAdminGuiConfigurations()); + + if (!userType.getAssignment().isEmpty()) { + AssignmentEvaluator assignmentEvaluator = new AssignmentEvaluator<>(); + assignmentEvaluator.setRepository(repositoryService); + assignmentEvaluator.setFocusOdo(new ObjectDeltaObject<>(userType.asPrismObject(), null, userType.asPrismObject())); + assignmentEvaluator.setChannel(null); + assignmentEvaluator.setObjectResolver(objectResolver); + assignmentEvaluator.setSystemObjectCache(systemObjectCache); + assignmentEvaluator.setPrismContext(prismContext); + assignmentEvaluator.setMappingFactory(mappingFactory); + assignmentEvaluator.setMappingEvaluator(mappingEvaluator); + assignmentEvaluator.setActivationComputer(activationComputer); + assignmentEvaluator.setNow(clock.currentTimeXMLGregorianCalendar()); + + // We do need only authorizations. Therefore we not need to evaluate constructions, + // so switching it off is faster. It also avoids nasty problems with resources being down, + // resource schema not available, etc. + assignmentEvaluator.setEvaluateConstructions(false); + + // We do not have real lens context here. But the push methods in ModelExpressionThreadLocalHolder + // will need something to push on the stack. So give them context placeholder. + LensContext lensContext = new LensContextPlaceholder<>(prismContext); + assignmentEvaluator.setLensContext(lensContext); + + for (AssignmentType assignmentType: userType.getAssignment()) { + try { + ItemDeltaItem,PrismContainerDefinition> assignmentIdi = new ItemDeltaItem<>(); + assignmentIdi.setItemOld(LensUtil.createAssignmentSingleValueContainerClone(assignmentType)); + assignmentIdi.recompute(); + EvaluatedAssignment assignment = assignmentEvaluator.evaluate(assignmentIdi, false, userType, userType.toString(), task, result); + if (assignment.isValid()) { + authorizations.addAll(assignment.getAuthorizations()); + adminGuiConfigurations.addAll(assignment.getAdminGuiConfigurations()); + } + } catch (SchemaException e) { + LOGGER.error("Schema violation while processing assignment of {}: {}; assignment: {}", + userType, e.getMessage(), assignmentType, e); + } catch (ObjectNotFoundException e) { + LOGGER.error("Object not found while processing assignment of {}: {}; assignment: {}", + userType, e.getMessage(), assignmentType, e); + } catch (ExpressionEvaluationException e) { + LOGGER.error("Evaluation error while processing assignment of {}: {}; assignment: {}", + userType, e.getMessage(), assignmentType, e); + } catch (PolicyViolationException e) { + LOGGER.error("Policy violation while processing assignment of {}: {}; assignment: {}", + userType, e.getMessage(), assignmentType, e); } - } catch (SchemaException e) { - LOGGER.error("Schema violation while processing assignment of {}: {}; assignment: {}", - new Object[]{userType, e.getMessage(), assignmentType, e}); - } catch (ObjectNotFoundException e) { - LOGGER.error("Object not found while processing assignment of {}: {}; assignment: {}", - new Object[]{userType, e.getMessage(), assignmentType, e}); - } catch (ExpressionEvaluationException e) { - LOGGER.error("Evaluation error while processing assignment of {}: {}; assignment: {}", - new Object[]{userType, e.getMessage(), assignmentType, e}); - } catch (PolicyViolationException e) { - LOGGER.error("Policy violation while processing assignment of {}: {}; assignment: {}", - new Object[]{userType, e.getMessage(), assignmentType, e}); } - } + } + if (userType.getAdminGuiConfiguration() != null) { + // config from the user object should go last (to be applied as the last one) + adminGuiConfigurations.add(userType.getAdminGuiConfiguration()); + } principal.setAdminGuiConfiguration(AdminGuiConfigTypeUtil.compileAdminGuiConfiguration(adminGuiConfigurations, systemConfiguration)); }