From 2d71af123f902930421867a473ef760b1784f744 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Tue, 22 Jul 2014 19:43:39 +0200 Subject: [PATCH 1/7] Support for generic oid-bound properties (MID-1988). Lightly tested. --- .../xml/ns/public/common/common-3.xsd | 77 +++++++++++++--- .../model/impl/lens/ChangeExecutor.java | 42 ++++++--- .../model/impl/lens/LensFocusContext.java | 10 +-- .../midpoint/model/impl/lens/LensUtil.java | 70 +++++++++++---- .../impl/lens/projector/ContextLoader.java | 28 ++++-- .../impl/lens/projector/FocusProcessor.java | 89 ++++++++++++++----- .../test/AbstractModelIntegrationTest.java | 24 ++--- .../resources/uuid/system-configuration.xml | 9 +- 8 files changed, 261 insertions(+), 88 deletions(-) diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd index e4e0e21f5b8..7fb9fd2108b 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd @@ -7248,18 +7248,36 @@ - - - - Definition of default object templates for a individual object type. The templates will be used - "universally" during all operations with specified object types - unless the templates are overriden - in other definitions (e.g. in resource). - - - - - + + + + Definition of default object templates for a individual object type. The templates will be used + "universally" during all operations with specified object types - unless the templates are overriden + in other definitions (e.g. in resource). + + DEPRECATED. Use defaultFocusPolicy instead. + + + + true + + + + + + + + Definition of default object policy for a individual object type. The definition of this policy + contains object template and other similar settings. The policy will be used + "universally" during all operations with specified object types - unless it is overriden + in other definitions (e.g. in resource or org). + + + + + + @@ -7302,10 +7320,12 @@ - + - Definition of default object templates for a specific object type. + Definition of policy for a specific object type. It defines object template + and similar settings that apply to the object alone. This policy settings + apply to the object internal structure without regard to other objects. @@ -7329,11 +7349,42 @@ + A mode in which OID and name of the speciefied object are the same. + + true + + + + + + + + + + Definition of a property constraints. + + + + + + + + + + + + + The property value will be bound to OID. This property will be set to the value + of OID and it cannot be changed. + + + true + diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java index b9c7759aba6..388c2b14a85 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismReference; @@ -148,22 +149,16 @@ public void executeChanges(LensContext syncContext, Ta LensFocusContext focusContext = syncContext.getFocusContext(); if (focusContext != null) { - ObjectDelta userDelta = focusContext.getWaveDelta(syncContext.getExecutionWave()); - if (userDelta != null) { + ObjectDelta focusDelta = focusContext.getWaveDelta(syncContext.getExecutionWave()); + if (focusDelta != null) { - ObjectTypeTemplateType objectPolicyConfigurationType = focusContext.getObjectPolicyConfigurationType(); - if (objectPolicyConfigurationType != null && BooleanUtils.isTrue(objectPolicyConfigurationType.isOidNameBoundMode())) { - PrismObject objectNew = focusContext.getObjectNew(); - if (userDelta.isAdd() && objectNew.getOid() == null) { - String name = objectNew.asObjectable().getName().getOrig(); - focusContext.setOid(name); - } - } + ObjectPolicyConfigurationType objectPolicyConfigurationType = focusContext.getObjectPolicyConfigurationType(); + applyObjectPolicy(focusContext, focusDelta, objectPolicyConfigurationType); OperationResult subResult = result.createSubresult(OPERATION_EXECUTE_FOCUS+"."+focusContext.getObjectTypeClass().getSimpleName()); try { - executeDelta(userDelta, focusContext, syncContext, null, null, task, subResult); + executeDelta(focusDelta, focusContext, syncContext, null, null, task, subResult); subResult.computeStatus(); @@ -313,6 +308,31 @@ public void executeChanges(LensContext syncContext, Ta } + private void applyObjectPolicy(LensFocusContext focusContext, ObjectDelta focusDelta, + ObjectPolicyConfigurationType objectPolicyConfigurationType) { + if (objectPolicyConfigurationType == null) { + return; + } + PrismObject objectNew = focusContext.getObjectNew(); + if (focusDelta.isAdd() && objectNew.getOid() == null) { + + for (PropertyConstraintType propertyConstraintType: objectPolicyConfigurationType.getPropertyConstraint()) { + if (BooleanUtils.isTrue(propertyConstraintType.isOidBound())) { + ItemPath itemPath = propertyConstraintType.getPath().getItemPath(); + PrismProperty prop = objectNew.findProperty(itemPath); + String stringValue = prop.getRealValue().toString(); + focusContext.setOid(stringValue); + } + } + + // deprecated + if (BooleanUtils.isTrue(objectPolicyConfigurationType.isOidNameBoundMode())) { + String name = objectNew.asObjectable().getName().getOrig(); + focusContext.setOid(name); + } + } + } + private

void recordProjectionExecutionException(Exception e, LensProjectionContext accCtx, OperationResult subResult, SynchronizationPolicyDecision decision) { subResult.recordFatalError(e); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensFocusContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensFocusContext.java index 1a1963f341f..96863a58a32 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensFocusContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensFocusContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2014 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,9 +37,9 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectPolicyConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTypeTemplateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ValuePolicyType; import com.evolveum.midpoint.xml.ns._public.model.model_context_3.LensFocusContextType; @@ -56,7 +56,7 @@ public class LensFocusContext extends LensElementContext secondaryDeltas = new ObjectDeltaWaves(); transient private ValuePolicyType orgPasswordPolicy; - transient private ObjectTypeTemplateType objectPolicyConfigurationType; + transient private ObjectPolicyConfigurationType objectPolicyConfigurationType; private int getProjectionWave() { return getLensContext().getProjectionWave(); @@ -70,11 +70,11 @@ public ValuePolicyType getOrgPasswordPolicy() { return orgPasswordPolicy; } - public ObjectTypeTemplateType getObjectPolicyConfigurationType() { + public ObjectPolicyConfigurationType getObjectPolicyConfigurationType() { return objectPolicyConfigurationType; } - public void setObjectPolicyConfigurationType(ObjectTypeTemplateType objectPolicyConfigurationType) { + public void setObjectPolicyConfigurationType(ObjectPolicyConfigurationType objectPolicyConfigurationType) { this.objectPolicyConfigurationType = objectPolicyConfigurationType; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index 388271a1ba0..0c15d2f70c5 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2014 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -87,11 +87,12 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingStrengthType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectPolicyConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTypeTemplateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PasswordType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyConstraintType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectTypeDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ScriptExpressionReturnTypeType; @@ -1118,26 +1119,61 @@ public static void checkContextSanity(LensContext cont if (namePolyType == null) { throw new SchemaException("Focus "+focusObjectNew+" does not have a name after "+activityDescription); } - ObjectTypeTemplateType objectPolicyConfigurationType = focusContext.getObjectPolicyConfigurationType(); - if (objectPolicyConfigurationType != null && BooleanUtils.isTrue(objectPolicyConfigurationType.isOidNameBoundMode())) { - ObjectDelta focusDelta = focusContext.getDelta(); - if (focusDelta != null) { - if (focusDelta.isAdd()) { - if (namePolyType != null) { - // name delta is OK, but it has to match - if (focusObjectNew.getOid() != null) { - if (!focusObjectNew.getOid().equals(namePolyType.getOrig())) { - throw new PolicyViolationException("Cannot set name to a value different than OID in name-oid bound mode"); - } + ObjectPolicyConfigurationType objectPolicyConfigurationType = focusContext.getObjectPolicyConfigurationType(); + checkObjectPolicy(focusContext, objectPolicyConfigurationType); + } + } + } + + private static void checkObjectPolicy(LensFocusContext focusContext, ObjectPolicyConfigurationType objectPolicyConfigurationType) throws SchemaException, PolicyViolationException { + if (objectPolicyConfigurationType == null) { + return; + } + PrismObject focusObjectNew = focusContext.getObjectNew(); + ObjectDelta focusDelta = focusContext.getDelta(); + + for (PropertyConstraintType propertyConstraintType: objectPolicyConfigurationType.getPropertyConstraint()) { + ItemPath itemPath = propertyConstraintType.getPath().getItemPath(); + if (BooleanUtils.isTrue(propertyConstraintType.isOidBound())) { + if (focusDelta != null) { + if (focusDelta.isAdd()) { + PrismProperty propNew = focusObjectNew.findProperty(itemPath); + if (propNew != null) { + // prop delta is OK, but it has to match + if (focusObjectNew.getOid() != null) { + if (!focusObjectNew.getOid().equals(propNew.getRealValue().toString())) { + throw new PolicyViolationException("Cannot set "+itemPath+" to a value different than OID in oid bound mode"); } } - } else { - PropertyDelta nameDelta = focusDelta.findPropertyDelta(FocusType.F_NAME); - if (nameDelta != null) { - throw new PolicyViolationException("Cannot change name in name-oid bound mode"); + } + } else { + PropertyDelta nameDelta = focusDelta.findPropertyDelta(itemPath); + if (nameDelta != null) { + throw new PolicyViolationException("Cannot change "+itemPath+" in oid bound mode"); + } + } + } + } + } + + // Deprecated + if (BooleanUtils.isTrue(objectPolicyConfigurationType.isOidNameBoundMode())) { + if (focusDelta != null) { + if (focusDelta.isAdd()) { + PolyStringType namePolyType = focusObjectNew.asObjectable().getName(); + if (namePolyType != null) { + // name delta is OK, but it has to match + if (focusObjectNew.getOid() != null) { + if (!focusObjectNew.getOid().equals(namePolyType.getOrig())) { + throw new PolicyViolationException("Cannot set name to a value different than OID in name-oid bound mode"); } } } + } else { + PropertyDelta nameDelta = focusDelta.findPropertyDelta(FocusType.F_NAME); + if (nameDelta != null) { + throw new PolicyViolationException("Cannot change name in name-oid bound mode"); + } } } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java index ee45f891b81..47298f686ca 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java @@ -387,15 +387,33 @@ private PrismObject determineFocusTem Class focusType = focusContext.getObjectTypeClass(); ObjectReferenceType templateRef = null; - for (ObjectTypeTemplateType policyConfigurationType: systemConfigurationType.getObjectTemplate()) { - QName typeQName = policyConfigurationType.getType(); + ObjectPolicyConfigurationType policyConfigurationType = null; + for (ObjectPolicyConfigurationType aPolicyConfigurationType: systemConfigurationType.getDefaultObjectPolicyConfiguration()) { + QName typeQName = aPolicyConfigurationType.getType(); ObjectTypes objectType = ObjectTypes.getObjectTypeFromTypeQName(typeQName); if (objectType == null) { - throw new ConfigurationException("Unknown type "+typeQName+" in object template definition in system configuration"); + throw new ConfigurationException("Unknown type "+typeQName+" in default object policy definition in system configuration"); } if (objectType.getClassDefinition() == focusType) { - templateRef = policyConfigurationType.getObjectTemplateRef(); - focusContext.setObjectPolicyConfigurationType(policyConfigurationType); + templateRef = aPolicyConfigurationType.getObjectTemplateRef(); + focusContext.setObjectPolicyConfigurationType(aPolicyConfigurationType); + policyConfigurationType = aPolicyConfigurationType; + } + } + + if (policyConfigurationType == null) { + // Deprecated + for (ObjectPolicyConfigurationType aPolicyConfigurationType: systemConfigurationType.getObjectTemplate()) { + QName typeQName = aPolicyConfigurationType.getType(); + ObjectTypes objectType = ObjectTypes.getObjectTypeFromTypeQName(typeQName); + if (objectType == null) { + throw new ConfigurationException("Unknown type "+typeQName+" in object template definition in system configuration"); + } + if (objectType.getClassDefinition() == focusType) { + templateRef = aPolicyConfigurationType.getObjectTemplateRef(); + focusContext.setObjectPolicyConfigurationType(aPolicyConfigurationType); + policyConfigurationType = aPolicyConfigurationType; + } } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java index 52647ef9532..cdb87d6cd6d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusProcessor.java @@ -64,6 +64,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismValue; @@ -98,13 +99,14 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.IterationSpecificationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingStrengthType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectPolicyConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateMappingEvaluationPhaseType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateMappingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTypeTemplateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PasswordType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyConstraintType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.StringPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TimeIntervalStatusType; @@ -210,27 +212,8 @@ private void processFocusFocus(LensContext context, Str while (true) { - ObjectTypeTemplateType objectPolicyConfigurationType = focusContext.getObjectPolicyConfigurationType(); - if (objectPolicyConfigurationType != null && BooleanUtils.isTrue(objectPolicyConfigurationType.isOidNameBoundMode())) { - // Generate the name now - unless it is already present - PrismObject focusNew = focusContext.getObjectNew(); - if (focusNew != null) { - PolyStringType focusNewName = focusNew.asObjectable().getName(); - if (focusNewName == null) { - String newName = focusNew.getOid(); - if (newName == null) { - newName = OidUtil.generateOid(); - } - LOGGER.trace("Generating new name (bound to OID): {}", newName); - PrismObjectDefinition focusDefinition = focusContext.getObjectDefinition(); - PrismPropertyDefinition focusNameDef = focusDefinition.findPropertyDefinition(FocusType.F_NAME); - PropertyDelta nameDelta = focusNameDef.createEmptyDelta(new ItemPath(FocusType.F_NAME)); - nameDelta.setValueToReplace(new PrismPropertyValue(new PolyString(newName), OriginType.USER_POLICY, null)); - focusContext.swallowToSecondaryDelta(nameDelta); - focusContext.recompute(); - } - } - } + ObjectPolicyConfigurationType objectPolicyConfigurationType = focusContext.getObjectPolicyConfigurationType(); + applyObjectPolicyConstraints(focusContext, objectPolicyConfigurationType); ExpressionVariables variables = Utils.getDefaultExpressionVariables(focusContext.getObjectNew(), null, null, null, context.getSystemConfiguration()); if (iterationToken == null) { @@ -395,6 +378,68 @@ private void processFocusFocus(LensContext context, Str } + private void applyObjectPolicyConstraints(LensFocusContext focusContext, ObjectPolicyConfigurationType objectPolicyConfigurationType) throws SchemaException { + if (objectPolicyConfigurationType == null) { + return; + } + + PrismObject focusNew = focusContext.getObjectNew(); + if (focusNew == null) { + // This is delete. Nothing to do. + return; + } + + for (PropertyConstraintType propertyConstraintType: objectPolicyConfigurationType.getPropertyConstraint()) { + ItemPath itemPath = propertyConstraintType.getPath().getItemPath(); + if (BooleanUtils.isTrue(propertyConstraintType.isOidBound())) { + PrismProperty prop = focusNew.findProperty(itemPath); + if (prop == null || prop.isEmpty()) { + String newValue = focusNew.getOid(); + if (newValue == null) { + newValue = OidUtil.generateOid(); + } + LOGGER.trace("Generating new OID-bound value for {}: {}", itemPath, newValue); + PrismObjectDefinition focusDefinition = focusContext.getObjectDefinition(); + PrismPropertyDefinition propDef = focusDefinition.findPropertyDefinition(itemPath); + if (propDef == null) { + throw new SchemaException("No definition for property "+itemPath+" in "+focusDefinition+" as specified in object policy"); + } + PropertyDelta propDelta = propDef.createEmptyDelta(itemPath); + if (String.class.isAssignableFrom(propDef.getTypeClass())) { + propDelta.setValueToReplace(new PrismPropertyValue(newValue, OriginType.USER_POLICY, null)); + } else if (PolyString.class.isAssignableFrom(propDef.getTypeClass())) { + propDelta.setValueToReplace(new PrismPropertyValue(new PolyString(newValue), OriginType.USER_POLICY, null)); + } else { + throw new SchemaException("Unsupported type "+propDef.getTypeName()+" for property "+itemPath+" in "+focusDefinition+" as specified in object policy, only string and polystring properties are supported for OID-bound mode"); + } + focusContext.swallowToSecondaryDelta(propDelta); + focusContext.recompute(); + } + } + } + + // Deprecated + if (BooleanUtils.isTrue(objectPolicyConfigurationType.isOidNameBoundMode())) { + // Generate the name now - unless it is already present + if (focusNew != null) { + PolyStringType focusNewName = focusNew.asObjectable().getName(); + if (focusNewName == null) { + String newValue = focusNew.getOid(); + if (newValue == null) { + newValue = OidUtil.generateOid(); + } + LOGGER.trace("Generating new name (bound to OID): {}", newValue); + PrismObjectDefinition focusDefinition = focusContext.getObjectDefinition(); + PrismPropertyDefinition focusNameDef = focusDefinition.findPropertyDefinition(FocusType.F_NAME); + PropertyDelta nameDelta = focusNameDef.createEmptyDelta(new ItemPath(FocusType.F_NAME)); + nameDelta.setValueToReplace(new PrismPropertyValue(new PolyString(newValue), OriginType.USER_POLICY, null)); + focusContext.swallowToSecondaryDelta(nameDelta); + focusContext.recompute(); + } + } + } + } + private boolean willResetIterationCounter(LensFocusContext focusContext) throws SchemaException { ObjectDelta focusDelta = focusContext.getDelta(); if (focusDelta == null) { diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index aaf526e438e..1f96acc6b7b 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2014 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -109,11 +109,11 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.AuthorizationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectPolicyConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSynchronizationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTypeTemplateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PasswordType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; @@ -1484,27 +1484,27 @@ protected void setDefaultObjectTemplate(QName objectType, String userTemplateOid PrismObject systemConfig = repositoryService.getObject(SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(), null, parentResult); - PrismContainerValue deleteValue = null; - for (ObjectTypeTemplateType objectTemplate: systemConfig.asObjectable().getObjectTemplate()) { - if (objectType.equals(objectTemplate)) { - deleteValue = objectTemplate.asPrismContainerValue(); + PrismContainerValue deleteValue = null; + for (ObjectPolicyConfigurationType focusPolicyType: systemConfig.asObjectable().getDefaultObjectPolicyConfiguration()) { + if (objectType.equals(focusPolicyType.getType())) { + deleteValue = focusPolicyType.asPrismContainerValue(); } } Collection modifications = new ArrayList(); if (deleteValue != null) { - ContainerDelta deleteDelta = ContainerDelta.createModificationDelete(SystemConfigurationType.F_OBJECT_TEMPLATE, + ContainerDelta deleteDelta = ContainerDelta.createModificationDelete(SystemConfigurationType.F_DEFAULT_OBJECT_POLICY_CONFIGURATION, SystemConfigurationType.class, prismContext, deleteValue); ((Collection)modifications).add(deleteDelta); } - ObjectTypeTemplateType newTemplateType = new ObjectTypeTemplateType(); - newTemplateType.setType(objectType); + ObjectPolicyConfigurationType newFocusPolicyType = new ObjectPolicyConfigurationType(); + newFocusPolicyType.setType(objectType); ObjectReferenceType templateRef = new ObjectReferenceType(); templateRef.setOid(userTemplateOid); - newTemplateType.setObjectTemplateRef(templateRef); - ContainerDelta addDelta = ContainerDelta.createModificationAdd(SystemConfigurationType.F_OBJECT_TEMPLATE, - SystemConfigurationType.class, prismContext, newTemplateType); + newFocusPolicyType.setObjectTemplateRef(templateRef); + ContainerDelta addDelta = ContainerDelta.createModificationAdd(SystemConfigurationType.F_DEFAULT_OBJECT_POLICY_CONFIGURATION, + SystemConfigurationType.class, prismContext, newFocusPolicyType); ((Collection)modifications).add(addDelta); repositoryService.modifyObject(SystemConfigurationType.class, diff --git a/testing/story/src/test/resources/uuid/system-configuration.xml b/testing/story/src/test/resources/uuid/system-configuration.xml index f611f0429d2..1a1f79e3f7f 100644 --- a/testing/story/src/test/resources/uuid/system-configuration.xml +++ b/testing/story/src/test/resources/uuid/system-configuration.xml @@ -36,9 +36,12 @@ true - + UserType - true - + + name + true + + From 8fde2548be8efecb29c733bbf74b0858d9551744 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Wed, 23 Jul 2014 11:01:33 +0200 Subject: [PATCH 2/7] More tests and some fixes for oid-bound mode (MID-1988) --- .../midpoint/model/impl/lens/LensUtil.java | 10 ++ .../test/AbstractModelIntegrationTest.java | 25 ++- .../midpoint/testing/story/TestVillage.java | 48 +++++- .../village/system-configuration.xml | 153 ++++++++++++++++++ .../test/resources/village/user-murray.xml | 32 ++++ 5 files changed, 257 insertions(+), 11 deletions(-) create mode 100644 testing/story/src/test/resources/village/system-configuration.xml create mode 100644 testing/story/src/test/resources/village/user-murray.xml diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index 0c15d2f70c5..46b760352bb 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -1149,6 +1149,16 @@ private static void checkObjectPolicy(LensFocusContext } else { PropertyDelta nameDelta = focusDelta.findPropertyDelta(itemPath); if (nameDelta != null) { + if (nameDelta.isReplace()) { + Collection> valuesToReplace = nameDelta.getValuesToReplace(); + if (valuesToReplace.size() == 1) { + String stringValue = valuesToReplace.iterator().next().getValue().toString(); + if (focusContext.getOid().equals(stringValue)) { + // This is OK. It is most likely a correction made by a recompute. + continue; + } + } + } throw new PolicyViolationException("Cannot change "+itemPath+" in oid bound mode"); } } diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index 1f96acc6b7b..af453e0e891 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -1484,27 +1484,36 @@ protected void setDefaultObjectTemplate(QName objectType, String userTemplateOid PrismObject systemConfig = repositoryService.getObject(SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(), null, parentResult); - PrismContainerValue deleteValue = null; + PrismContainerValue oldValue = null; for (ObjectPolicyConfigurationType focusPolicyType: systemConfig.asObjectable().getDefaultObjectPolicyConfiguration()) { if (objectType.equals(focusPolicyType.getType())) { - deleteValue = focusPolicyType.asPrismContainerValue(); + oldValue = focusPolicyType.asPrismContainerValue(); } } Collection modifications = new ArrayList(); - if (deleteValue != null) { + if (oldValue != null) { ContainerDelta deleteDelta = ContainerDelta.createModificationDelete(SystemConfigurationType.F_DEFAULT_OBJECT_POLICY_CONFIGURATION, - SystemConfigurationType.class, prismContext, deleteValue); + SystemConfigurationType.class, prismContext, oldValue.clone()); ((Collection)modifications).add(deleteDelta); } - ObjectPolicyConfigurationType newFocusPolicyType = new ObjectPolicyConfigurationType(); - newFocusPolicyType.setType(objectType); + ObjectPolicyConfigurationType newFocusPolicyType; + ContainerDelta addDelta; + if (oldValue == null) { + newFocusPolicyType = new ObjectPolicyConfigurationType(); + newFocusPolicyType.setType(objectType); + addDelta = ContainerDelta.createModificationAdd(SystemConfigurationType.F_DEFAULT_OBJECT_POLICY_CONFIGURATION, + SystemConfigurationType.class, prismContext, newFocusPolicyType); + } else { + PrismContainerValue newValue = oldValue.clone(); + addDelta = ContainerDelta.createModificationAdd(SystemConfigurationType.F_DEFAULT_OBJECT_POLICY_CONFIGURATION, + SystemConfigurationType.class, prismContext, newValue); + newFocusPolicyType = newValue.asContainerable(); + } ObjectReferenceType templateRef = new ObjectReferenceType(); templateRef.setOid(userTemplateOid); newFocusPolicyType.setObjectTemplateRef(templateRef); - ContainerDelta addDelta = ContainerDelta.createModificationAdd(SystemConfigurationType.F_DEFAULT_OBJECT_POLICY_CONFIGURATION, - SystemConfigurationType.class, prismContext, newFocusPolicyType); ((Collection)modifications).add(addDelta); repositoryService.modifyObject(SystemConfigurationType.class, diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java index 98df89347ba..5c57e9e8372 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java @@ -133,6 +133,8 @@ public class TestVillage extends AbstractStoryTest { public static final File TEST_DIR = new File(MidPointTestConstants.TEST_RESOURCES_DIR, "village"); + public static final File SYSTEM_CONFIGURATION_FILE = new File(TEST_DIR, "system-configuration.xml"); + public static final File OBJECT_TEMPLATE_USER_FILE = new File(TEST_DIR, "object-template-user.xml"); public static final String OBJECT_TEMPLATE_USER_OID = "10000000-0000-0000-0000-000000000222"; @@ -183,10 +185,12 @@ public class TestVillage extends AbstractStoryTest { protected static final File TASK_LIVE_SYNC_DUMMY_SOURCE_FILE = new File(TEST_DIR, "task-dumy-source-livesync.xml"); protected static final String TASK_LIVE_SYNC_DUMMY_SOURCE_OID = "10000000-0000-0000-5555-555500000001"; - private static final String USER_MIKE_FILENAME = COMMON_DIR_NAME + "/user-mike.xml"; - private static final File USER_MIKE_FILE = new File(USER_MIKE_FILENAME); + private static final File USER_MIKE_FILE = new File(COMMON_DIR, "user-mike.xml"); private static final String USER_MIKE_OID = "c0c010c0-d34d-b33f-f00d-222333111111"; - + + private static final File USER_MURRAY_FILE = new File(TEST_DIR, "user-murray.xml"); + private static final String USER_MURRAY_OID = "c0c010c0-d34d-b33f-f00d-1111111111aa"; + private static final String ACCOUNT_HERMAN_USERNAME = "ht"; private static final String ACCOUNT_HERMAN_FIST_NAME = "Herman"; private static final String ACCOUNT_HERMAN_LAST_NAME = "Toothrot"; @@ -311,6 +315,11 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti } + @Override + protected File getSystemConfigurationFile() { + return SYSTEM_CONFIGURATION_FILE; + } + @Test public void test000Sanity() throws Exception { final String TEST_NAME = "test000Sanity"; @@ -706,6 +715,32 @@ public void test300AddProjectJollyRoger() throws Exception { //TODO: assertions } + /** + * User is added to repo directly, so he does not have OID in employee number. + * Recompute should fix that. This is a migration scenario. + */ + @Test + public void test350AddRepoUserNoEmployeeNumberRecompute() throws Exception { + final String TEST_NAME = "test350AddRepoUserNoEmployeeNumberRecompute"; + TestUtil.displayTestTile(this, TEST_NAME); + Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + + PrismObject user = PrismTestUtil.parseObject(USER_MURRAY_FILE); + repositoryService.addObject(user, null, result); + + // WHEN + TestUtil.displayWhen(TEST_NAME); + recomputeUser(USER_MURRAY_OID, task, result); + + // THEN + TestUtil.displayThen(TEST_NAME); + result.computeStatus(); + TestUtil.assertSuccess(result); + + user = getUser(USER_MURRAY_OID); + assertEmployeeNumber(user); + } private void assertLocGov(PrismObject user, String expLoc, String expOrg) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { UserType userType = user.asObjectable(); @@ -741,6 +776,7 @@ private void assertUserNoRole(PrismObject user, String firstName, Stri display("User", user); assertUser(user, user.getOid(), username, firstName+" "+lastName, firstName, lastName); + assertEmployeeNumber(user); assertLinks(user, 1); assertAccount(user, RESOURCE_DUMMY_SOURCE_OID); assertAssignments(user, RoleType.class, 0); @@ -758,6 +794,7 @@ private void assertUserLdap(PrismObject user, String firstName, String display("User", user); assertUser(user, user.getOid(), username, firstName+" "+lastName, firstName, lastName); + assertEmployeeNumber(user); assertLinks(user, 2); assertAccount(user, RESOURCE_DUMMY_SOURCE_OID); @@ -771,6 +808,11 @@ private void assertUserLdap(PrismObject user, String firstName, String IntegrationTestTools.assertIcfsNameAttribute(shadow, "uid="+username+",ou=people,dc=example,dc=com"); } + private void assertEmployeeNumber(PrismObject user) { + String employeeNumber = user.asObjectable().getEmployeeNumber(); + assertEquals("Wrong employeeNumber in "+user, user.getOid(), employeeNumber); + } + private String getUsername(String firstName, String lastName, String orgName) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { String username = firstName+"."+lastName; if (orgName != null) { diff --git a/testing/story/src/test/resources/village/system-configuration.xml b/testing/story/src/test/resources/village/system-configuration.xml new file mode 100644 index 00000000000..80c497f57a4 --- /dev/null +++ b/testing/story/src/test/resources/village/system-configuration.xml @@ -0,0 +1,153 @@ + + + + + SystemConfiguration + + File Appender + INFO + + TRACE + com.evolveum.midpoint.common.LoggingConfigurationManager + + + TRACE + com.evolveum.midpoint.notifications + + + %date [%thread] %-5level \(%logger{46}\): %message%n + target/test.log + true + + + + UserType + + employeeNumber + true + + + + + + + + + + + + + + + + + + + + + recipient@evolveum.com + + dummy:accountPasswordNotifier + + + + + + recipient@evolveum.com + + dummy:userPasswordNotifier + + + + success + + + recipient@evolveum.com + + dummy:simpleAccountNotifier-SUCCESS + + + + failure + + + recipient@evolveum.com + + dummy:simpleAccountNotifier-FAILURE + + + + add + success + + + recipient@evolveum.com + + dummy:simpleAccountNotifier-ADD-SUCCESS + + + + delete + success + + + recipient@evolveum.com + + dummy:simpleAccountNotifier-DELETE-SUCCESS + + + + + + recipient@evolveum.com + + dummy:simpleUserNotifier + + + + + add + + + + + recipient@evolveum.com + + dummy:simpleUserNotifier-ADD + + + + + + delete + + + + + recipient@evolveum.com + + dummy:simpleUserNotifier-DELETE + + + + + target/mail-notifications.log + + + diff --git a/testing/story/src/test/resources/village/user-murray.xml b/testing/story/src/test/resources/village/user-murray.xml new file mode 100644 index 00000000000..66013731898 --- /dev/null +++ b/testing/story/src/test/resources/village/user-murray.xml @@ -0,0 +1,32 @@ + + + + murray + Murray + Murray + The Skull + + + enabled + + From 438e8bc20cffb8b83607e7a2eb5378e741215409 Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Wed, 23 Jul 2014 11:57:16 +0200 Subject: [PATCH 3/7] MID-1998 implementation + small work on BulkActions - requires one more step to work. --- .../evolveum/midpoint/web/page/PageBase.java | 12 ++++++---- .../admin/configuration/PageBulkAction.java | 15 +++++++++++- .../web/page/admin/users/PageOrgUnit.html | 24 +------------------ .../web/page/admin/users/PageOrgUnit.java | 5 ++++ .../security/MidPointApplication.properties | 1 + .../impl/controller/ModelController.java | 2 +- 6 files changed, 29 insertions(+), 30 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java index 669b82df92f..d1f22d2124f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/PageBase.java @@ -20,11 +20,7 @@ import com.evolveum.midpoint.common.validator.EventHandler; import com.evolveum.midpoint.common.validator.EventResult; import com.evolveum.midpoint.common.validator.Validator; -import com.evolveum.midpoint.model.api.ModelDiagnosticService; -import com.evolveum.midpoint.model.api.ModelInteractionService; -import com.evolveum.midpoint.model.api.ModelService; -import com.evolveum.midpoint.model.api.TaskService; -import com.evolveum.midpoint.model.api.WorkflowService; +import com.evolveum.midpoint.model.api.*; import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; @@ -59,6 +55,8 @@ public abstract class PageBase extends PageTemplate { private static final Trace LOGGER = TraceManager.getTrace(PageBase.class); + @SpringBean(name = "modelController") + private ScriptingService scriptingService; @SpringBean(name = "modelController") private ModelService modelService; @SpringBean(name = "modelController") @@ -121,6 +119,10 @@ public ModelService getModelService() { return modelService; } + public ScriptingService getScriptingService(){ + return scriptingService; + } + public TaskService getTaskService() { return taskService; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java index cc0f6c18588..50a1b538310 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java @@ -16,7 +16,11 @@ package com.evolveum.midpoint.web.page.admin.configuration; +import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.application.AuthorizationAction; import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.AceEditor; @@ -41,6 +45,11 @@ }) public class PageBulkAction extends PageAdminConfiguration { + private static final Trace LOGGER = TraceManager.getTrace(PageBulkAction.class); + + private static final String DOT_CLASS = PageBulkAction.class.getName() + "."; + private static final String OPERATION_PERFORM_BULK = "performBulkAction"; + private static final String ID_MAIN_FORM = "mainForm"; private static final String ID_START = "start"; private static final String ID_EDITOR = "editor"; @@ -80,6 +89,10 @@ protected void onSubmit(AjaxRequestTarget target, Form form) { private void startPerformed(AjaxRequestTarget target) { model.getObject(); - //todo implement + Task task = createSimpleTask(OPERATION_PERFORM_BULK); + OperationResult result = new OperationResult(OPERATION_PERFORM_BULK); + + //TODO - continue here - we need to find a way to serialize XML String to JAXBElement expression to continue +// getScriptingService().evaluateExpressionInBackground(, task, result); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.html index fc4dd20bbaa..31b6467df47 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.html @@ -35,30 +35,8 @@

- - - - - - - - - - - - - - - - - - - - - -
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java index a3c62e2cf0f..0098a54b1f9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java @@ -86,6 +86,7 @@ public class PageOrgUnit extends PageAdminUsers { private static final String ID_DISPLAY_NAME = "displayName"; private static final String ID_DESCRIPTION = "description"; private static final String ID_REQUESTABLE = "requestable"; + private static final String ID_TENANT = "tenant"; private static final String ID_IDENTIFIER = "identifier"; private static final String ID_COST_CENTER = "costCenter"; private static final String ID_LOCALITY = "locality"; @@ -205,6 +206,10 @@ private void initLayout() { OrgType.F_REQUESTABLE), createStringResource("OrgType.requestable"), ID_LABEL_SIZE, ID_INPUT_SIZE); form.add(requestable); + CheckFormGroup tenant = new CheckFormGroup(ID_TENANT, new PrismPropertyModel(orgModel, + OrgType.F_TENANT), createStringResource("OrgType.tenant"), ID_LABEL_SIZE, ID_INPUT_SIZE); + form.add(tenant); + TextFormGroup identifier = new TextFormGroup(ID_IDENTIFIER, new PrismPropertyModel(orgModel, OrgType.F_IDENTIFIER), createStringResource("OrgType.identifier"), ID_LABEL_SIZE, ID_INPUT_SIZE, false); form.add(identifier); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.properties index df61961c3e5..9396bea63ca 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.properties @@ -194,6 +194,7 @@ ObjectType.name=Name ObjectType.description=Description ObjectType.parentOrgRef=Parent org. units OrgType.requestable=Requestable +OrgType.tenant=Tenant OrgType.displayName=Display name OrgType.identifier=Identifier OrgType.costCenter=Cost center diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java index 94914705d73..af7d50ce2e5 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java @@ -1846,7 +1846,7 @@ public void releaseWorkItem(String workItemId, OperationResult parentResult) { } //endregion - //region Scripting (bulka actions) + //region Scripting (bulk actions) @Override public void evaluateExpressionInBackground(QName objectType, ObjectFilter filter, String actionName, Task task, OperationResult parentResult) throws SchemaException { scriptingExpressionEvaluator.evaluateExpressionInBackground(objectType, filter, actionName, task, parentResult); From 3cbb2d0f16930896f0426134cb02f957f9413c07 Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Wed, 23 Jul 2014 16:58:04 +0200 Subject: [PATCH 4/7] MID-1994 - tenant reference of assignments is now editable from GUI. --- .../assignment/AssignmentEditorDto.java | 48 ++++++++++++++++++- .../assignment/AssignmentEditorPanel.html | 7 +++ .../assignment/AssignmentEditorPanel.java | 42 +++++++++++++++- .../AssignmentEditorPanel.properties | 1 + .../assignment/AssignmentTablePanel.java | 6 +-- .../component/ChooseTypePanel.java | 10 ++++ .../web/page/admin/users/PageUser.java | 6 +-- 7 files changed, 112 insertions(+), 8 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java index f855ca87b29..021b1d127f3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java @@ -17,11 +17,16 @@ package com.evolveum.midpoint.web.component.assignment; import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.web.component.util.SelectableBean; +import com.evolveum.midpoint.web.page.PageBase; +import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.web.util.WebMiscUtil; +import com.evolveum.midpoint.web.util.WebModelUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; @@ -36,16 +41,21 @@ */ public class AssignmentEditorDto extends SelectableBean implements Comparable { + private static final String DOT_CLASS = AssignmentEditorDto.class.getName() + "."; + private static final String OPERATION_LOAD_ORG_TENANT = DOT_CLASS + "loadTenantOrg"; + public static final String F_TYPE = "type"; public static final String F_NAME = "name"; public static final String F_DESCRIPTION = "description"; public static final String F_ACTIVATION = "activation"; public static final String F_RELATION = "relation"; + public static final String F_TENANT_REF = "tenantRef"; private String name; private AssignmentEditorDtoType type; private UserDtoStatus status; private AssignmentType oldAssignment; + private ObjectViewDto tenantRef; private boolean showEmpty = false; private boolean minimized = true; @@ -53,7 +63,7 @@ public class AssignmentEditorDto extends SelectableBean implements Comparable attributes; - public AssignmentEditorDto(ObjectType targetObject, AssignmentEditorDtoType type, UserDtoStatus status, AssignmentType assignment) { + public AssignmentEditorDto(ObjectType targetObject, AssignmentEditorDtoType type, UserDtoStatus status, AssignmentType assignment, PageBase pageBase) { Validate.notNull(status, "User dto status must not be null."); Validate.notNull(type, "Type must not be null."); Validate.notNull(assignment, "Assignment must not be null."); @@ -76,6 +86,28 @@ public AssignmentEditorDto(ObjectType targetObject, AssignmentEditorDtoType type // } this.name = getNameForTargetObject(targetObject); + this.tenantRef = loadTenantReference(targetObject, assignment, pageBase); + } + + private ObjectViewDto loadTenantReference(ObjectType object, AssignmentType assignment, PageBase page){ + ObjectViewDto dto; + + if(object instanceof RoleType){ + if(assignment.getTenantRef() != null){ + ObjectReferenceType ref = assignment.getTenantRef(); + + OperationResult result = new OperationResult(OPERATION_LOAD_ORG_TENANT); + PrismObject org = WebModelUtils.loadObject(OrgType.class, ref.getOid(), result, page); + + dto = new ObjectViewDto(ref.getOid(), WebMiscUtil.getName(org.asObjectable())); + dto.setType(OrgType.class); + return dto; + } + } + + dto = new ObjectViewDto(); + dto.setType(OrgType.class); + return dto; } private String getNameForTargetObject(ObjectType object) { @@ -181,6 +213,12 @@ public PrismContainerValue getNewValue() throws SchemaException { newAssignment.setActivation(null); } + if(tenantRef != null){ + ObjectReferenceType ref = new ObjectReferenceType(); + ref.setOid(this.tenantRef.getOid()); + newAssignment.setTenantRef(ref); + } + ConstructionType construction = newAssignment.getConstruction(); if (construction == null) { return newAssignment.asPrismContainerValue(); @@ -245,4 +283,12 @@ private int getIndexOfType(AssignmentEditorDtoType type) { return 0; } + + public ObjectViewDto getTenantRef() { + return tenantRef; + } + + public void setTenantRef(ObjectViewDto tenantRef) { + this.tenantRef = tenantRef; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.html index e3e4a9130a9..7ed0d54d8f2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.html @@ -53,6 +53,13 @@
+
+
+ +
+
+
+

diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java index 42ce25bda48..2bcc477e3cf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java @@ -19,6 +19,9 @@ import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.query.EqualFilter; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; @@ -34,6 +37,9 @@ import com.evolveum.midpoint.web.component.util.SimplePanel; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.PageBase; +import com.evolveum.midpoint.web.page.admin.configuration.component.ChooseTypeDialog; +import com.evolveum.midpoint.web.page.admin.configuration.component.ChooseTypePanel; +import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto; import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -98,10 +104,11 @@ public class AssignmentEditorPanel extends SimplePanel { private static final String ID_TARGET = "target"; private static final String ID_TARGET_CONTAINER = "targetContainer"; private static final String ID_CONSTRUCTION_CONTAINER = "constructionContainer"; + private static final String ID_CONTAINER_TENANT_REF = "tenantRefContainer"; + private static final String ID_TENANT_CHOOSER = "tenantRefChooser"; private IModel> attributesModel; - public AssignmentEditorPanel(String id, IModel model) { super(id, model); @@ -250,6 +257,39 @@ private void initBodyLayout(WebMarkupContainer body) { relation.setEnabled(false); body.add(relation); + //TODO - add VisibleEnableBehaviour so we can only edit tenantRef in RoleAssignments + WebMarkupContainer tenantRefContainer = new WebMarkupContainer(ID_CONTAINER_TENANT_REF); + ChooseTypePanel tenantRef = new ChooseTypePanel(ID_TENANT_CHOOSER, + new PropertyModel(getModel(), AssignmentEditorDto.F_TENANT_REF)){ + + @Override + protected ObjectQuery getChooseQuery(){ + ObjectQuery query = new ObjectQuery(); + + ObjectFilter filter = EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, + getPageBase().getPrismContext(), null, true); + query.setFilter(filter); + + return query; + } + }; + tenantRefContainer.add(tenantRef); + tenantRefContainer.add(new VisibleEnableBehaviour(){ + + @Override + public boolean isVisible() { + AssignmentEditorDto dto = getModel().getObject(); + if(dto != null){ + if(AssignmentEditorDtoType.ROLE.equals(dto.getType())){ + return true; + } + } + + return false; + } + }); + body.add(tenantRefContainer); + WebMarkupContainer activationBlock = new WebMarkupContainer(ID_ACTIVATION_BLOCK); activationBlock.add(new VisibleEnableBehaviour() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.properties index 6f99fb0ed8f..c2b1bec1388 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.properties @@ -24,5 +24,6 @@ AssignmentEditorPanel.enabledFromTo={0}, from {1,date,medium} to {2,date,medium} AssignmentEditorPanel.enabledFrom={0}, from {1,date,medium} AssignmentEditorPanel.enabledTo={0}, to {1,date,medium} AssignmentEditorPanel.relation=Relation +AssignmentEditorPanel.tenantRef=Tenant diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java index deebfc8ef6c..8f5646564b6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java @@ -133,7 +133,7 @@ public List loadFromAssignmentTypeList(List } } - list.add(new AssignmentEditorDto(targetObject, type, UserDtoStatus.MODIFY, assignment)); + list.add(new AssignmentEditorDto(targetObject, type, UserDtoStatus.MODIFY, assignment, getPageBase())); } Collections.sort(list); @@ -383,7 +383,7 @@ private void addSelectedAssignablePerformed(AjaxRequestTarget target, List assignments = assignmentModel.getObject(); AssignmentEditorDto dto = new AssignmentEditorDto(resource, AssignmentEditorDtoType.ACCOUNT_CONSTRUCTION, - UserDtoStatus.ADD, assignment); + UserDtoStatus.ADD, assignment, getPageBase()); assignments.add(dto); dto.setMinimized(false); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java index 0a32e97652a..08396a46c15 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.web.page.admin.configuration.component; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.util.SimplePanel; @@ -94,11 +95,20 @@ private void initDialog(){ protected void chooseOperationPerformed(AjaxRequestTarget target, ObjectType object){ choosePerformed(target, object); } + + @Override + protected ObjectQuery getDataProviderQuery(){ + return getChooseQuery(); + } }; add(dialog); } + protected ObjectQuery getChooseQuery(){ + return null; + } + private void choosePerformed(AjaxRequestTarget target, ObjectType object){ ModalWindow window = (ModalWindow) get(MODAL_ID_SHOW_CHOOSE_OPTIONS); window.close(target); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java index 0525ae4d30b..bd605836697 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java @@ -743,7 +743,7 @@ private List loadAssignments() { } } - list.add(new AssignmentEditorDto(targetObject, type, UserDtoStatus.MODIFY, assignment)); + list.add(new AssignmentEditorDto(targetObject, type, UserDtoStatus.MODIFY, assignment, this)); } Collections.sort(list); @@ -1598,7 +1598,7 @@ private void addSelectedResourceAssignPerformed(ResourceType resource) { List assignments = assignmentsModel.getObject(); AssignmentEditorDto dto = new AssignmentEditorDto(resource, AssignmentEditorDtoType.ACCOUNT_CONSTRUCTION, - UserDtoStatus.ADD, assignment); + UserDtoStatus.ADD, assignment, this); assignments.add(dto); dto.setMinimized(false); @@ -1632,7 +1632,7 @@ private void addSelectedAssignablePerformed(AjaxRequestTarget target, List Date: Wed, 23 Jul 2014 21:58:48 +0200 Subject: [PATCH 5/7] MID-1994 - tenantRef GUI component small fix --- .../midpoint/web/component/assignment/AssignmentEditorDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java index 021b1d127f3..c37d6641002 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java @@ -213,7 +213,7 @@ public PrismContainerValue getNewValue() throws SchemaException { newAssignment.setActivation(null); } - if(tenantRef != null){ + if(tenantRef != null && AssignmentEditorDtoType.ROLE.equals(this.type)){ ObjectReferenceType ref = new ObjectReferenceType(); ref.setOid(this.tenantRef.getOid()); newAssignment.setTenantRef(ref); From 686990cfd814508764b853bfdc5e06ac337689f2 Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Wed, 23 Jul 2014 22:24:53 +0200 Subject: [PATCH 6/7] one more tenantRef GUI fix... --- .../web/component/assignment/AssignmentEditorDto.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java index c37d6641002..0cad19915be 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java @@ -214,9 +214,13 @@ public PrismContainerValue getNewValue() throws SchemaException { } if(tenantRef != null && AssignmentEditorDtoType.ROLE.equals(this.type)){ - ObjectReferenceType ref = new ObjectReferenceType(); - ref.setOid(this.tenantRef.getOid()); - newAssignment.setTenantRef(ref); + if(tenantRef.getOid() == null){ + newAssignment.setTenantRef(null); + } else { + ObjectReferenceType ref = new ObjectReferenceType(); + ref.setOid(this.tenantRef.getOid()); + newAssignment.setTenantRef(ref); + } } ConstructionType construction = newAssignment.getConstruction(); From 0737aac3b8b5e775b1fcf6e66ba4b9a99ea78e84 Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Thu, 24 Jul 2014 10:06:06 +0200 Subject: [PATCH 7/7] MID-2007 fix. --- .../admin/configuration/dto/NotificationConfigurationDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/NotificationConfigurationDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/NotificationConfigurationDto.java index 02283064dee..e0913d30a95 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/NotificationConfigurationDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/NotificationConfigurationDto.java @@ -68,7 +68,7 @@ public NotificationConfigurationDto(NotificationConfigurationType config){ username = serverConfig.getUsername(); if(serverConfig.getPassword() != null){ - password = "Set"; + password = ""; } else { password = null; }