Skip to content

Commit

Permalink
MID-9278 always use equals annotation now support marking "self" not …
Browse files Browse the repository at this point in the history
…only container items
  • Loading branch information
1azyman committed Nov 14, 2023
1 parent 7916417 commit a39d24e
Show file tree
Hide file tree
Showing 12 changed files with 113 additions and 24 deletions.
Expand Up @@ -72,6 +72,8 @@ default boolean isOptional() {
*/
boolean isOperational();

boolean isAlwaysUseForEquals();

/**
* If true, this item is not stored in XML representation in repo.
*
Expand Down
Expand Up @@ -31,6 +31,8 @@ public interface MutableItemDefinition<I extends Item> extends ItemDefinition<I>

void setOperational(boolean operational);

void setAlwaysUseForEquals(boolean alwaysUseForEquals);

void setDynamic(boolean value);

// use with care
Expand Down
Expand Up @@ -27,6 +27,11 @@
@Experimental
public class DummyPrismObjectDefinition implements PrismObjectDefinition<Objectable> {

@Override
public boolean isAlwaysUseForEquals() {
throw new UnsupportedOperationException();
}

@Override
public DisplayHint getDisplay() {
throw new UnsupportedOperationException();
Expand Down
Expand Up @@ -51,6 +51,8 @@ public abstract class ItemDefinitionImpl<I extends Item<?, ?>>
private int minOccurs = 1;
private int maxOccurs = 1;
private boolean operational = false;

private boolean alwaysUseForEquals;
private boolean dynamic;
private boolean canAdd = true;
private boolean canRead = true;
Expand Down Expand Up @@ -151,6 +153,17 @@ public void setOperational(boolean operational) {
this.operational = operational;
}

@Override
public boolean isAlwaysUseForEquals() {
return alwaysUseForEquals;
}

@Override
public void setAlwaysUseForEquals(boolean alwaysUseForEquals) {
checkMutable();
this.alwaysUseForEquals = alwaysUseForEquals;
}

@Override
public boolean isDynamic() {
return dynamic;
Expand Down
Expand Up @@ -1169,7 +1169,7 @@ private boolean isOperationalOnly(Item item, ItemDefinition itemDef) {
return false;
}

if (itemDef != null && itemDef.isOperational()) {
if (itemDef != null && itemDef.isOperational() && !itemDef.isAlwaysUseForEquals()) {
return true;
}
if (item.isEmpty()) {
Expand Down
Expand Up @@ -12,6 +12,7 @@
import com.evolveum.midpoint.prism.annotation.DiagramElementInclusionType;
import com.evolveum.midpoint.prism.annotation.ItemDiagramSpecification;
import com.evolveum.midpoint.prism.impl.*;
import com.evolveum.midpoint.prism.impl.schema.annotation.Annotation;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.schema.MutablePrismSchema;
import com.evolveum.midpoint.prism.schema.SchemaRegistry;
Expand Down
@@ -0,0 +1,50 @@
/*
* Copyright (C) 2010-2023 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.prism.impl.schema.annotation;

import java.util.List;
import java.util.stream.Collectors;
import javax.xml.namespace.QName;

import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Element;

import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.MutableItemDefinition;
import com.evolveum.midpoint.prism.MutablePrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.SchemaException;

public class AlwaysUseForEqualsProcessor extends AnnotationProcessor<MutableItemDefinition<?>, QName> {

public AlwaysUseForEqualsProcessor() {
super(PrismConstants.A_ALWAYS_USE_FOR_EQUALS, QName.class, ItemDefinition.class, null, null);
}

@Override
public void process(@NotNull MutableItemDefinition<?> definition, @NotNull List<Element> elements) throws SchemaException {
if (elements.isEmpty()) {
return;
}

if (elements.size() == 1 && elements.get(0).getTextContent().isEmpty()) {
definition.setAlwaysUseForEquals(true);
definition.setAnnotation(PrismConstants.A_ALWAYS_USE_FOR_EQUALS, null);

return;
}

if (definition instanceof MutablePrismContainerDefinition<?> pcd) {
List<QName> qnames = elements.stream().map(DOMUtil::getQNameValue).collect(Collectors.toList());
pcd.setAlwaysUseForEquals(qnames);

pcd.setAnnotation(PrismConstants.A_ALWAYS_USE_FOR_EQUALS, qnames);
}
}
}
Expand Up @@ -5,10 +5,11 @@
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.prism.impl.schema;
package com.evolveum.midpoint.prism.impl.schema.annotation;

import static com.evolveum.midpoint.prism.PrismConstants.*;

import java.util.List;
import javax.xml.namespace.QName;

import com.sun.xml.xsom.XSAnnotation;
Expand All @@ -20,6 +21,7 @@
import com.evolveum.midpoint.prism.MutableDefinition;
import com.evolveum.midpoint.prism.MutableItemDefinition;
import com.evolveum.midpoint.prism.MutablePrismReferenceDefinition;
import com.evolveum.midpoint.prism.impl.schema.SchemaProcessorUtil;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.SchemaException;

Expand All @@ -28,6 +30,8 @@
*/
public enum Annotation {

ALWAYS_USE_FOR_EQUALS(new AlwaysUseForEqualsProcessor()),

DEPRECATED(new AnnotationProcessor<>(
A_DEPRECATED, Boolean.class, MutableDefinition::setDeprecated, true)),

Expand Down Expand Up @@ -118,11 +122,11 @@ public static void processAnnotation(MutableDefinition definition, XSAnnotation
return;
}

Element element = SchemaProcessorUtil.getAnnotationElement(xsAnnotation, annotation.processor.name);
if (element == null) {
List<Element> elements = SchemaProcessorUtil.getAnnotationElements(xsAnnotation, annotation.processor.name);
if (elements == null || elements.isEmpty()) {
return;
}

annotation.processor.process(definition, element);
annotation.processor.process(definition, elements);
}
}
Expand Up @@ -5,23 +5,25 @@
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.prism.impl.schema;
package com.evolveum.midpoint.prism.impl.schema.annotation;

import com.evolveum.midpoint.prism.MutableDefinition;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.util.exception.SchemaException;
import java.util.List;
import java.util.function.BiConsumer;
import javax.xml.namespace.QName;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.w3c.dom.Element;

import javax.xml.namespace.QName;
import java.util.function.BiConsumer;
import com.evolveum.midpoint.prism.MutableDefinition;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.util.exception.SchemaException;

/**
* Helper base class to process annotations in different ways.
* Annotation processor base class.
*
* Non-null value is stored in annotation map via {@link MutableDefinition#setAnnotation(QName, Object)}.
* Non-null value is stored in definition via setter if provided and in annotation map via {@link MutableDefinition#setAnnotation(QName, Object)}.
* This implementation doesn't take multi-value annotations into account, only first one is processed.
*/
public class AnnotationProcessor<D extends MutableDefinition, T> {

Expand Down Expand Up @@ -60,8 +62,12 @@ public AnnotationProcessor(QName name, Class<T> type, Class definitionType, BiCo
return XmlTypeConverter.toJavaValue(element, type);
}

public void process(@NotNull D definition, @NotNull Element element) throws SchemaException {
T value = convert(element);
public void process(@NotNull D definition, @NotNull List<Element> elements) throws SchemaException {
if (elements.isEmpty()) {
return;
}

T value = convert(elements.get(0));
if (value == null) {
return;
}
Expand Down
Expand Up @@ -5,7 +5,7 @@
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.prism.impl.schema;
package com.evolveum.midpoint.prism.impl.schema.annotation;

import com.evolveum.midpoint.prism.MutableDefinition;

Expand Down
Expand Up @@ -5,17 +5,19 @@
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.prism.impl.schema;
package com.evolveum.midpoint.prism.impl.schema.annotation;

import static com.evolveum.midpoint.prism.PrismConstants.A_IGNORE;
import com.evolveum.midpoint.prism.ItemProcessing;
import com.evolveum.midpoint.prism.MutableDefinition;
import com.evolveum.midpoint.prism.PrismConstants;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.w3c.dom.Element;

import com.evolveum.midpoint.prism.ItemProcessing;
import com.evolveum.midpoint.prism.MutableDefinition;
import com.evolveum.midpoint.prism.PrismConstants;
import java.util.List;

import static com.evolveum.midpoint.prism.PrismConstants.A_IGNORE;

/**
* Processes {@link PrismConstants#A_IGNORE} annotation.
Expand All @@ -39,8 +41,12 @@ public IgnoreProcessor() {
}

@Override
public void process(@NotNull MutableDefinition definition, @NotNull Element element) {
ItemProcessing value = convert(element);
public void process(@NotNull MutableDefinition definition, @NotNull List<Element> elements) {
if (elements.isEmpty()) {
return;
}

ItemProcessing value = convert(elements.get(0));
if (value == null) {
return;
}
Expand Down
Expand Up @@ -5,7 +5,7 @@
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.prism.impl.schema;
package com.evolveum.midpoint.prism.impl.schema.annotation;

import com.evolveum.midpoint.prism.ItemProcessing;
import com.evolveum.midpoint.prism.MutableItemDefinition;
Expand Down

0 comments on commit a39d24e

Please sign in to comment.