Skip to content

Commit

Permalink
natural key and mergers moved to prism
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Apr 16, 2024
1 parent 239d237 commit 4eeafaa
Show file tree
Hide file tree
Showing 41 changed files with 399 additions and 1,270 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import com.evolveum.midpoint.gui.impl.util.ExecutedDeltaPostProcessor;
import com.evolveum.midpoint.prism.annotation.ItemDiagramSpecification;

import com.evolveum.midpoint.prism.delta.ItemMerger;
import com.evolveum.midpoint.prism.key.NaturalKey;
import com.evolveum.midpoint.schema.result.OperationResult;

import com.evolveum.midpoint.util.exception.CommonException;
Expand Down Expand Up @@ -545,13 +547,23 @@ public DisplayHint getDisplayHint() {
}

@Override
public @Nullable List<QName> getNaturalKey() {
return getItemDefinition().getNaturalKey();
public @Nullable List<QName> getNaturalKeyConstituents() {
return getItemDefinition().getNaturalKeyConstituents();
}

@Override
public @Nullable String getMerger() {
return getItemDefinition().getMerger();
public @Nullable String getMergerIdentifier() {
return getItemDefinition().getMergerIdentifier();
}

@Override
public @Nullable NaturalKey getNaturalKeyInstance() {
return getItemDefinition().getNaturalKeyInstance();
}

@Override
public @Nullable ItemMerger getMergerInstance(@NotNull MergeStrategy strategy, @Nullable OriginMarker originMarker) {
return getItemDefinition().getMergerInstance(strategy, originMarker);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import com.evolveum.midpoint.prism.annotation.ItemDiagramSpecification;
import com.evolveum.midpoint.prism.delta.ContainerDelta;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ItemMerger;
import com.evolveum.midpoint.prism.key.NaturalKey;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.result.OperationResult;
Expand Down Expand Up @@ -107,13 +109,23 @@ public DisplayHint getDisplayHint() {
}

@Override
public @Nullable String getMerger() {
return metadataValueWrapper.getMerger();
public @Nullable String getMergerIdentifier() {
return metadataValueWrapper.getMergerIdentifier();
}

@Override
public @Nullable List<QName> getNaturalKey() {
return metadataValueWrapper.getNaturalKey();
public @Nullable List<QName> getNaturalKeyConstituents() {
return metadataValueWrapper.getNaturalKeyConstituents();
}

@Override
public @Nullable ItemMerger getMergerInstance(@NotNull MergeStrategy strategy, @Nullable OriginMarker originMarker) {
return metadataValueWrapper.getMergerInstance(strategy, originMarker);
}

@Override
public @Nullable NaturalKey getNaturalKeyInstance() {
return metadataValueWrapper.getNaturalKeyInstance();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,20 @@
import java.util.Collections;
import javax.xml.XMLConstants;

import com.evolveum.midpoint.prism.impl.key.DefaultNaturalKeyImpl;
import com.evolveum.midpoint.prism.impl.GenericItemMerger;
import com.evolveum.midpoint.schema.merger.assignment.AssignmentMerger;
import com.evolveum.midpoint.schema.merger.objdef.LimitationsMerger;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;
import org.xml.sax.SAXException;

import com.evolveum.axiom.lang.antlr.AxiomModelStatementSource;
import com.evolveum.axiom.lang.spi.AxiomSyntaxException;
import com.evolveum.midpoint.prism.ItemMergerFactory;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.impl.ItemMergerFactoryImpl;
import com.evolveum.midpoint.prism.impl.PrismContextImpl;
import com.evolveum.midpoint.prism.impl.schema.SchemaDefinitionFactory;
import com.evolveum.midpoint.prism.impl.schema.SchemaRegistryImpl;
Expand All @@ -27,14 +35,12 @@
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.internals.InternalMonitor;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.merger.resource.ObjectTypeDefinitionMerger;
import com.evolveum.midpoint.schema.metadata.MidpointProvenanceEquivalenceStrategy;
import com.evolveum.midpoint.schema.metadata.MidpointValueMetadataFactory;
import com.evolveum.midpoint.schema.processor.MidPointSchemaDefinitionFactory;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ExtensionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ValueMetadataType;
import com.evolveum.midpoint.xml.ns._public.model.model_3.ObjectFactory;

/**
Expand Down Expand Up @@ -73,9 +79,142 @@ public PrismContext createPrismContext() throws SchemaException, IOException {
context.setValueMetadataFactory(new MidpointValueMetadataFactory(context));
context.setProvenanceEquivalenceStrategy(MidpointProvenanceEquivalenceStrategy.INSTANCE);
context.registerQueryExpressionFactory(new PrismQueryExpressionSupport());

context.setItemMergerFactory(buildItemMergerFactory());

return context;
}

private ItemMergerFactory buildItemMergerFactory() {
ItemMergerFactoryImpl factory = new ItemMergerFactoryImpl();

factory.registerMergerSupplier(
"ResourceObjectTypeDefinitionType",
ResourceObjectTypeDefinitionType.class,
m -> new ObjectTypeDefinitionMerger(m));
factory.registerMergerSupplier(
"PropertyLimitationsType",
PropertyLimitationsType.class,
m -> new LimitationsMerger(m));
factory.registerMergerSupplier(
"AssignmentType",
AssignmentType.class,
m -> new AssignmentMerger(m));

// todo this entry is incorrect since naturalKey is probably only "identifier" item (which is already defined
// in XSD in parent type UserInterfaceFeatureType, however for 4.8 both identifier and path were used.
// This should be reviewed and fixed in 4.9
factory.registerMergerSupplier(
"VirtualContainersSpecificationType",
VirtualContainersSpecificationType.class,
m -> new GenericItemMerger(
m,
DefaultNaturalKeyImpl.of(
VirtualContainersSpecificationType.F_IDENTIFIER,
VirtualContainersSpecificationType.F_PATH)));

// todo entries below this should be removed and should be handled by annotations in xsd,
// natural keys should be reviewed and most probably changed
factory.registerMergerSupplier(
"SearchItemType",
SearchItemType.class,
m -> new GenericItemMerger(
m,
DefaultNaturalKeyImpl.of(
SearchItemType.F_PATH, SearchItemType.F_FILTER, SearchItemType.F_FILTER_EXPRESSION)));
factory.registerMergerSupplier(
"GuiObjectDetailsPageType",
GuiObjectDetailsPageType.class,
m -> new GenericItemMerger(m, DefaultNaturalKeyImpl.of(GuiObjectDetailsPageType.F_TYPE)));
factory.registerMergerSupplier(
"GuiResourceDetailsPageType",
GuiResourceDetailsPageType.class,
m -> new GenericItemMerger(m, DefaultNaturalKeyImpl.of(
GuiResourceDetailsPageType.F_TYPE,
GuiResourceDetailsPageType.F_CONNECTOR_REF)));
factory.registerMergerSupplier(
"ExpressionEvaluatorProfileType",
ExpressionEvaluatorProfileType.class,
m -> new GenericItemMerger(m, DefaultNaturalKeyImpl.of(ExpressionEvaluatorProfileType.F_TYPE)));
factory.registerMergerSupplier(
"ScriptLanguageExpressionProfileType",
ScriptLanguageExpressionProfileType.class,
m -> new GenericItemMerger(
m, DefaultNaturalKeyImpl.of(ScriptLanguageExpressionProfileType.F_LANGUAGE)));
factory.registerMergerSupplier(
"ClassLoggerLevelOverrideType",
ClassLoggerLevelOverrideType.class,
m -> new GenericItemMerger(m, DefaultNaturalKeyImpl.of(ClassLoggerLevelOverrideType.F_LOGGER)));
factory.registerMergerSupplier(
"ObjectSelectorType",
ObjectSelectorType.class,
m -> new GenericItemMerger(
m,
DefaultNaturalKeyImpl.of(ObjectSelectorType.F_NAME, ObjectSelectorType.F_TYPE)));
factory.registerMergerSupplier(
"CollectionSpecificationType",
CollectionSpecificationType.class,
m -> new GenericItemMerger(
m, DefaultNaturalKeyImpl.of(CollectionSpecificationType.F_INTERPRETATION)));
factory.registerMergerSupplier(
"DashboardWidgetDataFieldType",
DashboardWidgetDataFieldType.class,
m -> new GenericItemMerger(m, DefaultNaturalKeyImpl.of(DashboardWidgetDataFieldType.F_FIELD_TYPE)));
factory.registerMergerSupplier(
"DashboardWidgetVariationType",
DashboardWidgetVariationType.class,
m -> new GenericItemMerger(
m,
DefaultNaturalKeyImpl.of(
DashboardWidgetVariationType.F_DISPLAY, DashboardWidgetVariationType.F_CONDITION)));
factory.registerMergerSupplier(
"AssignmentRelationType",
AssignmentRelationType.class,
m -> new GenericItemMerger(
m,
DefaultNaturalKeyImpl.of(
AssignmentRelationType.F_HOLDER_TYPE,
AssignmentRelationType.F_RELATION,
AssignmentRelationType.F_HOLDER_ARCHETYPE_REF)));
factory.registerMergerSupplier(
"ItemConstraintType",
ItemConstraintType.class,
m -> new GenericItemMerger(m, DefaultNaturalKeyImpl.of(ItemConstraintType.F_PATH)));
factory.registerMergerSupplier(
"ModificationPolicyConstraintType",
ModificationPolicyConstraintType.class,
m -> new GenericItemMerger(
m,
DefaultNaturalKeyImpl.of(
ModificationPolicyConstraintType.F_NAME,
ModificationPolicyConstraintType.F_OPERATION)));
factory.registerMergerSupplier(
"AbstractObjectTypeConfigurationType",
AbstractObjectTypeConfigurationType.class,
m -> new GenericItemMerger(
m,
DefaultNaturalKeyImpl.of(AbstractObjectTypeConfigurationType.F_TYPE)));
factory.registerMergerSupplier(
"GuiShadowDetailsPageType",
GuiShadowDetailsPageType.class,
m -> new GenericItemMerger(
m, DefaultNaturalKeyImpl.of(
GuiShadowDetailsPageType.F_TYPE,
GuiShadowDetailsPageType.F_RESOURCE_REF,
GuiShadowDetailsPageType.F_KIND,
GuiShadowDetailsPageType.F_INTENT)));
factory.registerMergerSupplier(
"SelectorQualifiedGetOptionType",
SelectorQualifiedGetOptionType.class,
m -> new GenericItemMerger(
m,
DefaultNaturalKeyImpl.of(
SelectorQualifiedGetOptionType.F_OPTIONS,
SelectorQualifiedGetOptionType.F_SELECTOR)));

return factory;
}

private SchemaDefinitionFactory createDefinitionFactory() {
return new MidPointSchemaDefinitionFactory();
}
Expand Down Expand Up @@ -104,7 +243,7 @@ private void registerAxiomSchemas(SchemaRegistryImpl schemaRegistry) {
try {
commonMetadata = AxiomModelStatementSource.fromResource("xml/ns/public/common/common-metadata-3.axiom");
} catch (AxiomSyntaxException | IOException e) {
throw new RuntimeException(e);
throw new RuntimeException(e);
}
axiomRegistry.addAxiomSource(commonMetadata);
}
Expand Down Expand Up @@ -137,7 +276,6 @@ private void registerBuiltinSchemas(SchemaRegistryImpl schemaRegistry) throws Sc
schemaRegistry.registerPrismSchemaResource("xml/ns/public/query-3.xsd", "q",
com.evolveum.prism.xml.ns._public.query_3.ObjectFactory.class.getPackage(), true); // declared by default


// midPoint schemas
schemaRegistry.registerPrismDefaultSchemaResource("xml/ns/public/common/common-3.xsd", "c",
com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory.class.getPackage()); // declared by default
Expand Down Expand Up @@ -172,7 +310,6 @@ private void registerBuiltinSchemas(SchemaRegistryImpl schemaRegistry) throws Sc

schemaRegistry.registerPrismSchemaResource("xml/ns/public/task/noop-3.xsd", "noop");


schemaRegistry.registerPrismSchemaResource("xml/ns/public/task/jdbc-ping-3.xsd", "jping");

schemaRegistry.registerPrismSchemaResource("xml/ns/public/task/extension-3.xsd", "taskext");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
/*
* Copyright (C) 2010-2022 Evolveum and contributors
* Copyright (C) 2010-2024 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.schema.merger;
package com.evolveum.midpoint.schema;

import com.evolveum.midpoint.prism.OriginMarker;

import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvenanceAcquisitionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvenanceMetadataType;
Expand All @@ -19,34 +18,7 @@

import javax.xml.namespace.QName;

/**
* Sets the origin information in prism values being merged.
*
* In order to track the origin of individual prism item values in the merged object, the mergers are obliged to fill-in
* this information on any values being processed. Specifically, when a prism value `V` is inherited from the source
* (super-)object `S`, this fact is recorded in the {@link ValueMetadataType} of `V` by setting `provenance/acquisition/originRef`
* to the reference to `S`.
*
* Notes:
*
* . When a composite value ({@link PrismContainerValue}) is inherited, only the root value gets the metadata. It's not necessary
* (and therefore it's avoided) to set the metadata on each of the contained ("inner") values.
* . When a value is passed through multiple layers of inheritance (e.g. inherited from `O1` to `O2` and finally to `O3`),
* only the "real" origin (i.e. `O1`) is recorded.
* . Origin for values not passing through the inheritance relation (i.e. values at the bottom of the inheritance hierarchy)
* are not marked - not even if the containing resource has an OID.
*
* For some examples please see `TestResourceTemplateMerge`.
*
* Important assumption:
*
* - The current implementation assumes that there is no value metadata stored in the (original) objects being merged; i.e.
* that all metadata come from this {@link OriginMarker}.
*/
public interface OriginMarker {

/** Imprints the origin into the value. */
void mark(PrismValue value) throws SchemaException;
public interface OriginMarkerMixin {

/** Marks values with oid/type pair. */
static @Nullable OriginMarker forOid(@Nullable String oid, QName typeName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@

package com.evolveum.midpoint.schema.merger;

import com.evolveum.midpoint.prism.OriginMarker;
import com.evolveum.midpoint.prism.impl.BaseItemMerger;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand Down

0 comments on commit 4eeafaa

Please sign in to comment.