Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Apr 25, 2024
2 parents 7f6aac2 + ace1659 commit f18689b
Show file tree
Hide file tree
Showing 23 changed files with 307 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ pathValue: SQUARE_BRACKET_LEFT argument SQUARE_BRACKET_RIGHT;

itemPathComponent: SHARP #IdentifierComponent
| AT_SIGN #DereferenceComponent
| prefixedName #ItemComponent
| itemName #ItemComponent
;

path: DOT #SelfPath
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.util.MiscUtil;

import com.evolveum.midpoint.util.annotation.OneUseOnly;
import com.evolveum.midpoint.util.annotation.Unused;

import org.apache.commons.lang3.BooleanUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand Down Expand Up @@ -97,7 +100,6 @@ default boolean hasCompleteDefinition() {
*
* TODO consider removing this method
*/
@VisibleForTesting
void setElementName(QName elementName);

/**
Expand Down Expand Up @@ -131,6 +133,7 @@ default String getDisplayName() {
*
* @return help message for the item
*/
@Unused
default String getHelp() {
return getDefinition() == null ? null : getDefinition().getHelp();
}
Expand Down Expand Up @@ -281,6 +284,7 @@ default V getAnyValue(@NotNull ValueSelector<V> selector) {
/**
* Type override, also for compatibility.
*/
@OneUseOnly("connectorConfiguration")
<X> X[] getRealValuesArray(Class<X> type);

/**
Expand All @@ -306,6 +310,7 @@ default V getAnyValue(@NotNull ValueSelector<V> selector) {
.collect(Collectors.toList());
}

@OneUseOnly("Delta serialization")
@Experimental // Do NOT use !!!!
@NotNull
default Collection<Object> getRealValuesOrRawTypes() {
Expand Down Expand Up @@ -360,6 +365,7 @@ default boolean add(@NotNull V newValue) throws SchemaException {
* or during overwriting existing value with a different one. The "difference" is taken using the
* DEFAULT_FOR_EQUALS (DATA) equivalence strategy.
*/
@OneUseOnly("convenience")
boolean add(@NotNull V newValue, @NotNull EquivalenceStrategy strategy) throws SchemaException;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.path.InfraItemName;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.util.annotation.Experimental;

Expand Down Expand Up @@ -38,7 +39,7 @@ public class PrismConstants {
public static final String PREFIX_NS_TYPES = "t";
public static final String NS_QUERY = NS_PREFIX + "query-3";
public static final String PREFIX_NS_QUERY = "q";
private static final String NS_METADATA = NS_PREFIX + "metadata-3";
public static final String NS_METADATA = NS_PREFIX + "metadata-3";

public static final String NS_MATCHING_RULE = NS_PREFIX + "matching-rule-3";

Expand Down Expand Up @@ -159,6 +160,16 @@ public class PrismConstants {
public static final String T_ID_LOCAL_PART = "id";
public static final ItemName T_ID = new ItemName(NS_TYPES, T_ID_LOCAL_PART);




public static final InfraItemName I_ID = InfraItemName.of(NS_TYPES, T_ID_LOCAL_PART);
public static final InfraItemName I_TYPE = InfraItemName.of(NS_TYPES, "type");

public static final InfraItemName I_PATH = InfraItemName.of(NS_TYPES, "path");

public static final InfraItemName I_METADATA = InfraItemName.of(NS_METADATA,"metadata").intern();

/**
* Self is a bit special, because the item path for self (.) is technically an empty path.
* So it's not a single-segment path with this QName in it and must be treated on some places.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,13 @@ public interface PrismContainer<C extends Containerable>
*/
void trim();

@Deprecated
<IV extends PrismValue,ID extends ItemDefinition<?>,I extends Item<IV,ID>> I findItem(QName itemQName, Class<I> type);

@Override
<IV extends PrismValue,ID extends ItemDefinition<?>> PartiallyResolvedItem<IV,ID> findPartial(ItemPath path);

@Deprecated
<IV extends PrismValue,ID extends ItemDefinition<?>,I extends Item<IV,ID>> I findCreateItem(QName itemQName, Class<I> type, boolean create) throws SchemaException;

<IV extends PrismValue,ID extends ItemDefinition<?>,I extends Item<IV,ID>> I findItem(ItemPath path, Class<I> type);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.util.stream.Collectors;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.util.annotation.Unused;
import com.evolveum.midpoint.util.exception.CommonException;

import org.jetbrains.annotations.Contract;
Expand Down Expand Up @@ -59,6 +60,7 @@ static <T extends Containerable> T asContainerable(PrismContainerValue<T> value)
* @return set of properties that the property container contains.
*/
@NotNull
@Unused
Set<PrismProperty<?>> getProperties();

Long getId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.evolveum.midpoint.prism.equivalence.ParameterizedEquivalenceStrategy;
import com.evolveum.midpoint.prism.metadata.MidpointOriginMetadata;
import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy;
import com.evolveum.midpoint.prism.path.InfraItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.DebugDumpable;
Expand Down Expand Up @@ -302,4 +303,5 @@ default boolean isOfType(@NotNull QName expectedTypeName) {
default boolean isObjectable() {
return getRealValueIfExists() instanceof Objectable;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

package com.evolveum.midpoint.prism.metadata;

import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.ValueMetadata;
import com.evolveum.midpoint.util.annotation.Experimental;

Expand All @@ -21,4 +23,8 @@ public interface ValueMetadataFactory {
@NotNull
ValueMetadata createEmpty();

default PrismContainerDefinition<?> getDefinition() {
return createEmpty().getDefinition();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@

import java.io.Serializable;

/**
* Fixme: Rename this to its actual use and meaning - item path representation normalized for textual search (used in indexing)
*
*/
public interface CanonicalItemPath extends Serializable {

int size();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
/*
* 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.path;

import java.util.AbstractMap;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.PrismConstants;

import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.Interner;
import com.google.common.collect.Interners;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.QNameUtil;

/**
*
* Item Name of Infra Model Items.
*
* Infra Model Items are not part of data model, but rather meta-model or infra model which is behind data model.
* They have namespace and local name, but they may be serialized differently according to language (using native features
* of data serialization format and/or other models already available natively for particular language), or they may be computed
* during runtime.
*
*
* FIXME: Maybe this should not extend ItemName
*/
public class InfraItemName extends ItemName {

private static final Interner<InfraItemName> INTERNER = Interners.newStrongInterner();


public static final InfraItemName ID = InfraItemName.of(PrismConstants.NS_TYPES, "id").intern();

public static final InfraItemName TYPE = InfraItemName.of(PrismConstants.NS_TYPES, "type").intern();

public static final InfraItemName PATH = InfraItemName.of(PrismConstants.NS_TYPES, "path").intern();
public static final InfraItemName METADATA = InfraItemName.of(PrismConstants.NS_METADATA,"metadata").intern();


private static final BiMap<InfraItemName, QName> SERIALIZATION_MAPPING = ImmutableBiMap.<InfraItemName, QName>builder()
.put(serializationEntry(ID))
.put(serializationEntry(TYPE))
.put(serializationEntry(PATH))
.put(serializationEntry(METADATA))
.build();

private static final BiMap<QName, InfraItemName> DESERIALIZATION_MAPPING = SERIALIZATION_MAPPING.inverse();



public InfraItemName(String namespaceURI, String localPart) {
super(namespaceURI, localPart);
}

public static InfraItemName of(String namespace, String localPart) {
return new InfraItemName(namespace, localPart);
}

public static InfraItemName fromQName(QName name) {
if (name == null) {
return null;
} else if (name instanceof InfraItemName infra) {
return infra;
} else {
return of(name.getNamespaceURI(), name.getLocalPart());
}
}

public static boolean isSerializedForm(QName qname) {
return DESERIALIZATION_MAPPING.containsKey(qname);
}

public static InfraItemName fromSerialized(QName qname) {
return DESERIALIZATION_MAPPING.get(qname);
}

public InfraItemName intern() {
return INTERNER.intern(this);
}

@Override
public boolean isEmpty() {
return false;
}

@NotNull
@Override
public List<?> getSegments() {
return Collections.singletonList(this);
}

@Override
public Object getSegment(int i) {
if (i == 0) {
return this;
} else {
throw new IndexOutOfBoundsException("Index: " + i + ", while accessing single-item path");
}
}

@Override
public int size() {
return 1;
}

@Override
public Object first() {
return this;
}

@NotNull
@Override
public ItemPath rest() {
return ItemPath.EMPTY_PATH;
}

@NotNull
@Override
public ItemPath rest(int n) {
if (n == 0) {
return this;
} else {
return EMPTY_PATH;
}
}

@Override
public String toString() {
return "@" + this.getLocalPart();
}


public boolean matches(QName other) {
throw new UnsupportedOperationException();
}

public QName asSerializationForm() {
return SERIALIZATION_MAPPING.get(this);
}

private static Map.Entry<InfraItemName,QName> serializationEntry(InfraItemName infraItem) {
return new AbstractMap.SimpleEntry<>(infraItem, new QName("@" + infraItem.getLocalPart()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,11 @@ static ItemPath fromString(@NotNull String value) {
return PrismContext.get().itemPathParser().asItemPath(value);
}

static boolean isInfraItem(QName name) {
// FIXME: Maybe also add check for namespace, localName? - this could cause problems now with ID segment
return name instanceof InfraItemName;
}

/**
* Returns true if the path is empty i.e. has no components.
*/
Expand Down Expand Up @@ -261,6 +266,14 @@ static boolean isName(Object segment) {
return ItemPathSegmentUtil.isName(segment);
}

static boolean isItemOrInfraItem(Object segment) {
if (segment instanceof InfraItemName) {
return true;
}
return isName(segment);
}


/**
* Returns a name corresponding to the name segment, or throw an exception otherwise.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ public abstract class ItemPathSegment implements Serializable, Cloneable {
public static String toString(Object segment) {
if (segment instanceof ItemPathSegment) {
return segment.toString();
} else if (segment instanceof InfraItemName) {
return segment.toString();
} else if (segment instanceof QName) {
return DebugUtil.formatElementName((QName) segment);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,18 @@ public NameItemPathSegment(@NotNull QName name) {
this.name = ItemName.fromQName(name);
}

public NameItemPathSegment(@NotNull InfraItemName name) {
this.name = name;
}

@NotNull
public ItemName getName() {
return name;
}

@Override
public String toString() {
return DebugUtil.formatElementName(name);
return name.toString();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ static UniformItemPath create(Object... segments) {
}

static ItemPathSegment createSegment(QName qname, boolean variable) {
if (InfraItemName.isSerializedForm(qname)) {
return new NameItemPathSegment(InfraItemName.fromSerialized(qname));
}
if (ParentPathSegment.QNAME.equals(qname)) {
return new ParentPathSegment();
} else if (ObjectReferencePathSegment.QNAME.equals(qname)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ public void shortDump(StringBuilder sb) {
}
String defaultNorm = PrismContext.get().getDefaultPolyStringNormalizer().normalize(orig);
if (Objects.equals(norm, defaultNorm)) {
sb.append(" (default norm)");
// nothing here
} else {
sb.append(" (");
if (norm == null) {
Expand Down

0 comments on commit f18689b

Please sign in to comment.