Skip to content

Commit

Permalink
Support for generic oid-bound properties (MID-1988). Lightly tested.
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Jul 22, 2014
1 parent 0876dc6 commit 2d71af1
Show file tree
Hide file tree
Showing 8 changed files with 261 additions and 88 deletions.
77 changes: 64 additions & 13 deletions infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd
Expand Up @@ -7248,18 +7248,36 @@
</xsd:annotation>
</xsd:element>

<xsd:element name="objectTemplate" type="tns:ObjectTypeTemplateType" minOccurs="0" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation>
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).
</xsd:documentation>
<xsd:appinfo>
<a:container/>
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="objectTemplate" type="tns:ObjectPolicyConfigurationType" minOccurs="0" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation>
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.
</xsd:documentation>
<xsd:appinfo>
<a:container/>
<a:deprecated>true</a:deprecated>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>

<xsd:element name="defaultObjectPolicyConfiguration" type="tns:ObjectPolicyConfigurationType" minOccurs="0" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation>
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).
</xsd:documentation>
<xsd:appinfo>
<a:container/>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>


<xsd:element name="connectorFramework" minOccurs="0" maxOccurs="1" type="tns:ConnectorFrameworkType">
<xsd:annotation>
Expand Down Expand Up @@ -7302,10 +7320,12 @@
<xsd:element name="systemConfiguration" type="tns:SystemConfigurationType"/>


<xsd:complexType name="ObjectTypeTemplateType">
<xsd:complexType name="ObjectPolicyConfigurationType">
<xsd:annotation>
<xsd:documentation>
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.
</xsd:documentation>
<xsd:appinfo>
<a:container/>
Expand All @@ -7329,11 +7349,42 @@
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="propertyConstraint" type="tns:PropertyConstraintType" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="oidNameBoundMode" type="xsd:boolean" minOccurs="0" default="false">
<xsd:annotation>
<xsd:documentation>
A mode in which OID and name of the speciefied object are the same.
</xsd:documentation>
<xsd:appinfo>
<a:deprecated>true</a:deprecated>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="PropertyConstraintType">
<xsd:annotation>
<xsd:documentation>
Definition of a property constraints.
</xsd:documentation>
<xsd:appinfo>
<a:container/>
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="path" type="t:ItemPathType" minOccurs="1" maxOccurs="1">
</xsd:element>
<!-- TODO: uniqueness constraint -->
<xsd:element name="oidBound" type="xsd:boolean" minOccurs="0" default="false">
<xsd:annotation>
<xsd:documentation>
The property value will be bound to OID. This property will be set to the value
of OID and it cannot be changed.
</xsd:documentation>
<xsd:appinfo>
<a:deprecated>true</a:deprecated>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -148,22 +149,16 @@ public <O extends ObjectType> void executeChanges(LensContext<O> syncContext, Ta

LensFocusContext<O> focusContext = syncContext.getFocusContext();
if (focusContext != null) {
ObjectDelta<O> userDelta = focusContext.getWaveDelta(syncContext.getExecutionWave());
if (userDelta != null) {
ObjectDelta<O> focusDelta = focusContext.getWaveDelta(syncContext.getExecutionWave());
if (focusDelta != null) {

ObjectTypeTemplateType objectPolicyConfigurationType = focusContext.getObjectPolicyConfigurationType();
if (objectPolicyConfigurationType != null && BooleanUtils.isTrue(objectPolicyConfigurationType.isOidNameBoundMode())) {
PrismObject<O> 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();

Expand Down Expand Up @@ -313,6 +308,31 @@ public <O extends ObjectType> void executeChanges(LensContext<O> syncContext, Ta

}

private <O extends ObjectType> void applyObjectPolicy(LensFocusContext<O> focusContext, ObjectDelta<O> focusDelta,
ObjectPolicyConfigurationType objectPolicyConfigurationType) {
if (objectPolicyConfigurationType == null) {
return;
}
PrismObject<O> 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<Object> 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 <P extends ObjectType> void recordProjectionExecutionException(Exception e, LensProjectionContext accCtx,
OperationResult subResult, SynchronizationPolicyDecision decision) {
subResult.recordFatalError(e);
Expand Down
@@ -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.
Expand Down Expand Up @@ -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;

Expand All @@ -56,7 +56,7 @@ public class LensFocusContext<O extends ObjectType> extends LensElementContext<O
private ObjectDeltaWaves<O> secondaryDeltas = new ObjectDeltaWaves<O>();

transient private ValuePolicyType orgPasswordPolicy;
transient private ObjectTypeTemplateType objectPolicyConfigurationType;
transient private ObjectPolicyConfigurationType objectPolicyConfigurationType;

private int getProjectionWave() {
return getLensContext().getProjectionWave();
Expand All @@ -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;
}

Expand Down
@@ -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.
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -1118,26 +1119,61 @@ public static <F extends ObjectType> void checkContextSanity(LensContext<F> 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<F> 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 <F extends ObjectType> void checkObjectPolicy(LensFocusContext<F> focusContext, ObjectPolicyConfigurationType objectPolicyConfigurationType) throws SchemaException, PolicyViolationException {
if (objectPolicyConfigurationType == null) {
return;
}
PrismObject<F> focusObjectNew = focusContext.getObjectNew();
ObjectDelta<F> 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<Object> 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<Object> nameDelta = focusDelta.findPropertyDelta(FocusType.F_NAME);
if (nameDelta != null) {
throw new PolicyViolationException("Cannot change name in name-oid bound mode");
}
} else {
PropertyDelta<Object> 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<Object> nameDelta = focusDelta.findPropertyDelta(FocusType.F_NAME);
if (nameDelta != null) {
throw new PolicyViolationException("Cannot change name in name-oid bound mode");
}
}
}
}
Expand Down
Expand Up @@ -387,15 +387,33 @@ private <F extends ObjectType> PrismObject<ObjectTemplateType> determineFocusTem
Class<F> 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;
}
}
}

Expand Down

0 comments on commit 2d71af1

Please sign in to comment.