Skip to content

Commit

Permalink
merge: fixes in mergers and handling of naturalKey
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Mar 22, 2024
1 parent ea81e42 commit 38cf10e
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 95 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public abstract class BaseItemMerger<T extends Item<?, ?>> implements ItemMerger
/** Marks any values inherited from "source" to "target" with appropriate (presumably source-related) origin. */
@Nullable protected final OriginMarker originMarker;

private MergeStrategy strategy;
@NotNull private MergeStrategy strategy = MergeStrategy.OVERLAY;

protected BaseItemMerger(@Nullable OriginMarker originMarker) {
this.originMarker = originMarker;
Expand All @@ -52,7 +52,7 @@ public MergeStrategy getStrategy() {
return strategy;
}

public void setStrategy(MergeStrategy strategy) {
public void setStrategy(@NotNull MergeStrategy strategy) {
this.strategy = strategy;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,14 @@ public class GenericItemMerger extends BaseItemMerger<Item<?, ?>> {
private GenericItemMerger(
@Nullable OriginMarker originMarker,
@Nullable NaturalKey naturalKey,
@NotNull PathKeyedMap<ItemMerger> childrenMergers) {
@NotNull PathKeyedMap<ItemMerger> childrenMergers,
@NotNull MergeStrategy strategy) {
super(originMarker);
this.naturalKey = naturalKey;
this.childrenMergers = childrenMergers;

setStrategy(strategy);

// In the future this may be parameterized on instance creation.
this.identifierSpecificMergers = TypeSpecificMergersConfigurator.createMergersMap(originMarker);
this.typeSpecificMergers = this.identifierSpecificMergers.values().stream()
Expand All @@ -82,14 +85,21 @@ private GenericItemMerger(
public GenericItemMerger(
@Nullable OriginMarker originMarker,
@NotNull PathKeyedMap<ItemMerger> childrenMergers) {
this(originMarker, null, childrenMergers);
this(originMarker, childrenMergers, MergeStrategy.OVERLAY);
}

public GenericItemMerger(
@Nullable OriginMarker originMarker,
@NotNull PathKeyedMap<ItemMerger> childrenMergers,
@NotNull MergeStrategy strategy) {
this(originMarker, null, childrenMergers, strategy);
}

@SuppressWarnings("WeakerAccess")
public GenericItemMerger(
@Nullable OriginMarker originMarker,
NaturalKey naturalKey) {
this(originMarker, naturalKey, new PathKeyedMap<>());
this(originMarker, naturalKey, new PathKeyedMap<>(), MergeStrategy.OVERLAY);
}

void mergeContainerValues(@NotNull PrismContainerValue<?> targetPcv, @NotNull PrismContainerValue<?> sourcePcv)
Expand Down Expand Up @@ -168,7 +178,7 @@ private ItemMerger findMergerByAnnotationRecursively(Definition def) {
}

ItemMerger merger = findMergerByAnnotation(ctd);
if (merger != null ) {
if (merger != null) {
return merger;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,96 +44,123 @@ static Map<String, TypedMergerSupplier> createMergersMap(@Nullable OriginMarker
"AssignmentType",
new TypedMergerSupplier(
AssignmentType.class,
() -> new AssignmentMerger(marker)))
);
}
() -> new AssignmentMerger(marker))),

@Deprecated
static Map<Class<?>, Supplier<ItemMerger>> createStandardTypeSpecificMergersMap(@Nullable OriginMarker marker) {
return Map.ofEntries(
// todo entries below this should be removed and should be handled by annotations in xsd,
// natural keys should be reviewed and most probably changed

entry(
"SearchItemType",
new TypedMergerSupplier(
SearchItemType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(
SearchItemType.F_PATH, SearchItemType.F_FILTER, SearchItemType.F_FILTER_EXPRESSION)))),
entry(
"GuiObjectDetailsPageType",
new TypedMergerSupplier(
GuiObjectDetailsPageType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(GuiObjectDetailsPageType.F_TYPE)))),
entry(
"GuiResourceDetailsPageType",
new TypedMergerSupplier(
GuiResourceDetailsPageType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(
GuiResourceDetailsPageType.F_TYPE,
GuiResourceDetailsPageType.F_CONNECTOR_REF)))),
entry(
"ExpressionEvaluatorProfileType",
new TypedMergerSupplier(
ExpressionEvaluatorProfileType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(ExpressionEvaluatorProfileType.F_TYPE)))),
entry(
"ScriptLanguageExpressionProfileType",
new TypedMergerSupplier(
ScriptLanguageExpressionProfileType.class,
() -> new GenericItemMerger(
marker, DefaultNaturalKeyImpl.of(ScriptLanguageExpressionProfileType.F_LANGUAGE)))),
entry(
"ClassLoggerLevelOverrideType",
new TypedMergerSupplier(
ClassLoggerLevelOverrideType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(ClassLoggerLevelOverrideType.F_LOGGER)))),
entry(
SearchItemType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(
SearchItemType.F_PATH, SearchItemType.F_FILTER, SearchItemType.F_FILTER_EXPRESSION))),
entry(
GuiObjectDetailsPageType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(GuiObjectDetailsPageType.F_TYPE))),
entry(
GuiResourceDetailsPageType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(
GuiResourceDetailsPageType.F_TYPE,
GuiResourceDetailsPageType.F_CONNECTOR_REF))),
entry(
ExpressionEvaluatorProfileType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(ExpressionEvaluatorProfileType.F_TYPE))),
entry(
ScriptLanguageExpressionProfileType.class,
() -> new GenericItemMerger(
marker, DefaultNaturalKeyImpl.of(ScriptLanguageExpressionProfileType.F_LANGUAGE))),
entry(
TracingTypeProfileType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(
TracingTypeProfileType.F_LEVEL, TracingTypeProfileType.F_OPERATION_TYPE))),
entry(
ClassLoggerLevelOverrideType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(ClassLoggerLevelOverrideType.F_LOGGER))),
entry(
ObjectSelectorType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(ObjectSelectorType.F_NAME, ObjectSelectorType.F_TYPE))),
entry(
CollectionSpecificationType.class,
() -> new GenericItemMerger(
marker, DefaultNaturalKeyImpl.of(CollectionSpecificationType.F_INTERPRETATION))),
entry(
DashboardWidgetDataFieldType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(DashboardWidgetDataFieldType.F_FIELD_TYPE))),
entry(
DashboardWidgetVariationType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(
DashboardWidgetVariationType.F_DISPLAY, DashboardWidgetVariationType.F_CONDITION))),
entry(
AssignmentRelationType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(
AssignmentRelationType.F_HOLDER_TYPE,
AssignmentRelationType.F_RELATION,
AssignmentRelationType.F_HOLDER_ARCHETYPE_REF))),
entry(
ItemConstraintType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(ItemConstraintType.F_PATH))),
entry(
ModificationPolicyConstraintType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(
ModificationPolicyConstraintType.F_NAME,
ModificationPolicyConstraintType.F_OPERATION))),
entry(
AbstractObjectTypeConfigurationType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(AbstractObjectTypeConfigurationType.F_TYPE))),
entry(
GuiShadowDetailsPageType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(
GuiShadowDetailsPageType.F_TYPE,
GuiShadowDetailsPageType.F_RESOURCE_REF,
GuiShadowDetailsPageType.F_KIND,
GuiShadowDetailsPageType.F_INTENT))),
entry(
SelectorQualifiedGetOptionType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(
SelectorQualifiedGetOptionType.F_OPTIONS,
SelectorQualifiedGetOptionType.F_SELECTOR)))
"ObjectSelectorType",
new TypedMergerSupplier(
ObjectSelectorType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(ObjectSelectorType.F_NAME, ObjectSelectorType.F_TYPE)))),
entry(
"CollectionSpecificationType",
new TypedMergerSupplier(
CollectionSpecificationType.class,
() -> new GenericItemMerger(
marker, DefaultNaturalKeyImpl.of(CollectionSpecificationType.F_INTERPRETATION)))),
entry(
"DashboardWidgetDataFieldType",
new TypedMergerSupplier(
DashboardWidgetDataFieldType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(DashboardWidgetDataFieldType.F_FIELD_TYPE)))),
entry(
"DashboardWidgetVariationType",
new TypedMergerSupplier(
DashboardWidgetVariationType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(
DashboardWidgetVariationType.F_DISPLAY, DashboardWidgetVariationType.F_CONDITION)))),
entry(
"AssignmentRelationType",
new TypedMergerSupplier(
AssignmentRelationType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(
AssignmentRelationType.F_HOLDER_TYPE,
AssignmentRelationType.F_RELATION,
AssignmentRelationType.F_HOLDER_ARCHETYPE_REF)))),
entry(
"ItemConstraintType",
new TypedMergerSupplier(
ItemConstraintType.class,
() -> new GenericItemMerger(marker, DefaultNaturalKeyImpl.of(ItemConstraintType.F_PATH)))),
entry(
"ModificationPolicyConstraintType",
new TypedMergerSupplier(
ModificationPolicyConstraintType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(
ModificationPolicyConstraintType.F_NAME,
ModificationPolicyConstraintType.F_OPERATION)))),
entry(
"AbstractObjectTypeConfigurationType",
new TypedMergerSupplier(
AbstractObjectTypeConfigurationType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(AbstractObjectTypeConfigurationType.F_TYPE)))),
entry(
"GuiShadowDetailsPageType",
new TypedMergerSupplier(
GuiShadowDetailsPageType.class,
() -> new GenericItemMerger(
marker, DefaultNaturalKeyImpl.of(
GuiShadowDetailsPageType.F_TYPE,
GuiShadowDetailsPageType.F_RESOURCE_REF,
GuiShadowDetailsPageType.F_KIND,
GuiShadowDetailsPageType.F_INTENT)))),
entry(
"SelectorQualifiedGetOptionType",
new TypedMergerSupplier(
SelectorQualifiedGetOptionType.class,
() -> new GenericItemMerger(
marker,
DefaultNaturalKeyImpl.of(
SelectorQualifiedGetOptionType.F_OPTIONS,
SelectorQualifiedGetOptionType.F_SELECTOR))))
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import java.util.ArrayList;
import java.util.List;

import com.evolveum.midpoint.prism.path.UniformItemPath;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.PrismContainerValue;
Expand Down Expand Up @@ -96,7 +98,7 @@ public void mergeMatchingKeys(PrismContainerValue<?> targetValue, PrismContainer
.replace(
PrismContext.get().itemFactory().createPropertyValue(
new ItemPathType(
ItemPath.create(combinedPathSegments))));
UniformItemPath.create(combinedPathSegments))));
} catch (SchemaException e) {
throw SystemException.unexpected(e, "when updating '" + keyItemName + "'");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2496,6 +2496,8 @@
<a:experimental>true</a:experimental>
<a:container>true</a:container>
<a:since>4.0</a:since>
<a:naturalKey>operationType</a:naturalKey>
<a:naturalKey>level</a:naturalKey>
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
Expand Down

0 comments on commit 38cf10e

Please sign in to comment.