diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java index 5093fe73c1f..cd8c6bf3f27 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java @@ -48,6 +48,7 @@ public class RefinedAttributeDefinition extends ResourceAttributeDefinition impl private String description; private boolean tolerant = true; private boolean isExclusiveStrong = false; + protected boolean secondaryIdentifier = false; private List intolerantValuePattern; private List tolerantValuePattern; private ResourceAttributeDefinition attributeDefinition; @@ -75,6 +76,14 @@ public void setTolerant(boolean tolerant) { this.tolerant = tolerant; } + public boolean isSecondaryIdentifier() { + return secondaryIdentifier; + } + + public void setSecondaryIdentifier(boolean secondaryIdentifier) { + this.secondaryIdentifier = secondaryIdentifier; + } + @Override public boolean canAdd() { return canAdd(DEFAULT_LAYER); @@ -328,6 +337,7 @@ static RefinedAttributeDefinition parse(ResourceAttributeDefinition schemaAttrDe schemaLimitations.getAccess().setModify(schemaAttrDef.canModify()); schemaLimitations.getAccess().setRead(schemaAttrDef.canRead()); + if (schemaHandlingAttrDefType != null) { if (schemaHandlingAttrDefType.getDescription() != null) { @@ -340,6 +350,12 @@ static RefinedAttributeDefinition parse(ResourceAttributeDefinition schemaAttrDe rAttrDef.tolerant = schemaHandlingAttrDefType.isTolerant(); } + if (schemaHandlingAttrDefType.isSecondaryIdentifier() == null){ + rAttrDef.secondaryIdentifier = false; + } else { + rAttrDef.secondaryIdentifier = schemaHandlingAttrDefType.isSecondaryIdentifier(); + } + rAttrDef.tolerantValuePattern = schemaHandlingAttrDefType.getTolerantValuePattern(); rAttrDef.intolerantValuePattern = schemaHandlingAttrDefType.getIntolerantValuePattern(); @@ -365,6 +381,8 @@ static RefinedAttributeDefinition parse(ResourceAttributeDefinition schemaAttrDe limitations.getAccess().setAdd(previousLimitations.getAccess().isAdd()); limitations.getAccess().setRead(previousLimitations.getAccess().isRead()); limitations.getAccess().setModify(previousLimitations.getAccess().isModify()); + limitations.setSecondaryIdentifier(previousLimitations.isSecondaryIdentifier()); + limitations.setUnique(previousLimitations.isUnique()); } previousLimitations = limitations; if (schemaHandlingAttrDefType != null) { @@ -408,6 +426,7 @@ private static void applyLimitationsType(PropertyLimitations limitations, Proper limitations.getAccess().setModify(accessType.isModify()); } } + } private static PropertyLimitationsType getLimitationsType(List limitationsTypes, LayerType layer) throws SchemaException { diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java index 12517f5c97b..2211be3b61c 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java @@ -576,7 +576,7 @@ private void processIdentifiers(RefinedAttributeDefinition rAttrDef, ObjectClass if (objectClassDef.isIdentifier(attrName)) { ((Collection)getIdentifiers()).add(rAttrDef); } - if (objectClassDef.isSecondaryIdentifier(attrName)) { + if (objectClassDef.isSecondaryIdentifier(attrName) || rAttrDef.isSecondaryIdentifier()) { ((Collection)getSecondaryIdentifiers()).add(rAttrDef); } } 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 1322670f293..96546f3d009 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 @@ -3567,6 +3567,16 @@ + + + + Indicated if the attribute should be considered as secondary identifier. If set to true, + this attribue is stored in repository and user for example by synchronization (correlation + rule), consistency mechanism, etc. + + + + diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java index 2b37b481cb4..05ab5b29b73 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java @@ -389,16 +389,6 @@ private void processProjections(LensContext context, } LOGGER.trace("User {} satisfies correlation rules.", context.getFocusContext().getObjectNew()); -// result.computeStatus(); -// // if the result is fatal error, it may mean that the -// // already exists expection occures before..but in this -// // scenario it means, the exception was handled and we -// // can mute the result to give better understanding of -// // the situation which happend -// if (result.isError()){ -// result.muteError(); -// } -// // Re-do this same iteration again (do not increase iteration count). // It will recompute the values and therefore enforce the user deltas and enable reconciliation skipUniquenessCheck = true; // to avoid endless loop diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java index 400e58b1e88..5416f1544f9 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.OrFilter; import com.evolveum.midpoint.prism.query.RefFilter; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.provisioning.api.ResourceObjectShadowChangeDescription; @@ -124,21 +125,29 @@ public T handleError(T shadow, FailedOperation op, Except private ObjectQuery createQueryByIcfName(ShadowType shadow) throws SchemaException { // TODO: error handling TODO TODO TODO set matching rule instead of null in equlas filter Collection> secondaryIdentifiers = ShadowUtil.getSecondaryIdentifiers(shadow); - PrismProperty nameProperty = null; - if (secondaryIdentifiers.size() != 1){ - nameProperty = shadow.getAttributes().asPrismContainerValue() - .findProperty(new QName(SchemaConstants.NS_ICF_SCHEMA, "name")); - } else { - nameProperty = secondaryIdentifiers.iterator().next(); + + List secondaryIdentifierFilters = new ArrayList(); + + for (ResourceAttribute secondaryIdentifier : secondaryIdentifiers){ + EqualFilter equal = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, secondaryIdentifier.getElementName()), secondaryIdentifier); + secondaryIdentifierFilters.add(equal); } + OrFilter orSecondary = OrFilter.createOr((List)secondaryIdentifierFilters); +// PrismProperty nameProperty = null; +// if (secondaryIdentifiers.size() != 1){ +// nameProperty = shadow.getAttributes().asPrismContainerValue() +// .findProperty(new QName(SchemaConstants.NS_ICF_SCHEMA, "name")); +// } else { +// nameProperty = secondaryIdentifiers.iterator().next(); +// } - EqualFilter nameFilter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, nameProperty.getDefinition().getName()),nameProperty); +// EqualFilter nameFilter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, nameProperty.getDefinition().getName()),nameProperty); RefFilter resourceRefFilter = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, prismContext, shadow.getResourceRef().getOid()); EqualFilter objectClassFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, null, shadow.getObjectClass()); - ObjectQuery query = ObjectQuery.createObjectQuery(AndFilter.createAnd(nameFilter, resourceRefFilter, + ObjectQuery query = ObjectQuery.createObjectQuery(AndFilter.createAnd(orSecondary, resourceRefFilter, objectClassFilter)); return query; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java index ac1f0a995b5..36937c78166 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java @@ -197,7 +197,10 @@ public static String getResourceOidFromFilter(List condi return values.get(0).getOid(); } if (NaryLogicalFilter.class.isAssignableFrom(f.getClass())){ - return getResourceOidFromFilter(((NaryLogicalFilter) f).getConditions()); + String resourceOid = getResourceOidFromFilter(((NaryLogicalFilter) f).getConditions()); + if (resourceOid != null){ + return resourceOid; + } } } @@ -221,7 +224,10 @@ public static T getValueFromFilter(List conditions, return (T) ((PrismPropertyValue)values.get(0)).getValue(); } if (NaryLogicalFilter.class.isAssignableFrom(f.getClass())){ - return getValueFromFilter(((NaryLogicalFilter) f).getConditions(), propertyName); + T value = getValueFromFilter(((NaryLogicalFilter) f).getConditions(), propertyName); + if (value != null){ + return value; + } } }