Skip to content

Commit

Permalink
Added support for mappingAlias in mappings
Browse files Browse the repository at this point in the history
  • Loading branch information
tonydamage committed Jul 29, 2024
1 parent 25b56d4 commit 1e9fdaa
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5181,6 +5181,20 @@
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="mappingAlias" type="xsd:string" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
Short alias of the mapping. Used for provenance metadata management and debugging purposes.
Alias is usually previous name of the mapping and it is used to identify mapping values which
were emitted in previous version of the mapping.
</xsd:documentation>
<xsd:appinfo>
<a:displayName>MappingType.mappingAlias</a:displayName>
<a:since>4.9</a:since>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>

<xsd:element ref="tns:description" minOccurs="0">
<xsd:annotation>
<xsd:appinfo>
Expand Down Expand Up @@ -5681,6 +5695,9 @@
</xsd:element>
<xsd:element name="additionalMappingSpecification" type="c:MappingSpecificationType" minOccurs="0" maxOccurs="unbounded">
<xsd:annotation>
<xsd:appinfo>
<a:since>4.9</a:since>
</xsd:appinfo>
<xsd:documentation>
Specification of additional mappings, which are considered as part of value set. Ideal for migration
after rename of mapping.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@ public abstract class AbstractMappingImpl<V extends PrismValue, D extends ItemDe
* Value metadata computer to be used when expression is evaluated.
*/
transient private TransformationValueMetadataComputer valueMetadataComputer;
private MappingSpecificationType mappingAliasSpecification;
//endregion

//region Constructors and (relatively) simple getters
Expand Down Expand Up @@ -431,12 +432,15 @@ protected AbstractMappingImpl(AbstractMappingBuilder<V, D, MBT, ?> builder) {
targetItemName = builder.targetItemName;
mappingSpecification = builder.getMappingSpecification() != null ?
builder.getMappingSpecification() : createDefaultSpecification();
mappingAliasSpecification = createMappingAliasSpecification(mappingSpecification,mappingBean.getMappingAlias());
now = builder.getNow();
sources.addAll(builder.getAdditionalSources());
parser = new MappingParser<>(this);
valueMetadataDefinition = SchemaRegistry.get().findContainerDefinitionByCompileTimeClass(ValueMetadataType.class);
}



private MappingSpecificationType createDefaultSpecification() {
MappingSpecificationType specification = new MappingSpecificationType();
specification.setMappingName(mappingBean.getName());
Expand Down Expand Up @@ -973,12 +977,15 @@ private void checkExistingTargetValues(OperationResult result)
ModelCommonBeans.get().expressionFactory,
name,
mappingSpecification,
mappingAliasSpecification,
"range",
"range of " + name + " in " + getMappingContextDescription(),
task, result);
rangeSetDef.init();
rangeSetDef.setAdditionalVariables(variables);
for (V originalValue : originalTargetValues) {
// FIXME: Migrate legacy to new?

if (rangeSetDef.contains(originalValue)) {
addToMinusIfNecessary(originalValue, rangeSetDef);
}
Expand Down Expand Up @@ -1664,4 +1671,13 @@ public boolean isPushChanges() {
boolean shouldUseMatchingProvenance() {
return getOutputDefinition() != null && getOutputDefinition().isMultiValue() && mappingBean.getName() != null;
}

private static MappingSpecificationType createMappingAliasSpecification(MappingSpecificationType spec, String alias) {
if (spec == null || alias == null || alias.isEmpty()) {
return null;
}
return new MappingSpecificationType()
.definitionObjectRef(spec.getDefinitionObjectRef().clone())
.mappingName(alias);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ private <IV extends PrismValue, ID extends ItemDefinition<?>> Source<IV, ID> par
ModelCommonBeans.get().expressionFactory,
variableName,
null, // FIXME: Why?
null,
"domain of " + variableName,
"domain of " + variableName + " in " + m.getMappingContextDescription(),
m.getTask(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ public class ValueSetDefinition<IV extends PrismValue, D extends ItemDefinition<
private final ExpressionFactory expressionFactory;
private final String additionalVariableName;
private final MappingSpecificationType mappingSpecification;

private final MappingSpecificationType mappingAliasSpecification;
private final String localContextDescription;
private final String shortDesc;
private final Task task;
Expand All @@ -55,6 +57,7 @@ public ValueSetDefinition(
ExpressionFactory expressionFactory,
String additionalVariableName,
MappingSpecificationType mappingSpecification,
MappingSpecificationType mappingAliasSpecification,
String localContextDescription,
String shortDesc,
Task task,
Expand All @@ -68,6 +71,7 @@ public ValueSetDefinition(
this.expressionFactory = expressionFactory;
this.additionalVariableName = additionalVariableName;
this.mappingSpecification = mappingSpecification;
this.mappingAliasSpecification = mappingAliasSpecification;
this.localContextDescription = localContextDescription;
this.shortDesc = shortDesc;
this.task = task;
Expand Down Expand Up @@ -122,6 +126,11 @@ private boolean isOfMatchingProvenance(IV pval) {
if (ProvenanceMetadataUtil.valueHasMappingSpec(pval, mappingSpecification)) {
return true;
}
if (mappingAliasSpecification != null && ProvenanceMetadataUtil.valueHasMappingSpec(pval, mappingAliasSpecification)) {
// Value matches mappingAlias
return true;
}

List<MappingSpecificationType> additional = setDefinitionBean.getAdditionalMappingSpecification();
if (additional != null) {
for (var mapping : additional) {
Expand Down Expand Up @@ -235,6 +244,9 @@ public boolean hasMappingSpecification(@NotNull ValueMetadataType md) {
if (ProvenanceMetadataUtil.hasMappingSpecification(md, mappingSpecification)) {
return true;
}
if (mappingAliasSpecification != null && ProvenanceMetadataUtil.hasMappingSpecification(md, mappingAliasSpecification)) {
return true;
}
if (setDefinitionBean != null && setDefinitionBean.getAdditionalMappingSpecification() != null) {
for (var additionalMapping : setDefinitionBean.getAdditionalMappingSpecification()) {
if (ProvenanceMetadataUtil.hasMappingSpecification(md, additionalMapping)) {
Expand Down

0 comments on commit 1e9fdaa

Please sign in to comment.