diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectDeltaUpdater.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectDeltaUpdater.java index b2de44be0b2..21f4c3d754e 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectDeltaUpdater.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectDeltaUpdater.java @@ -7,6 +7,26 @@ package com.evolveum.midpoint.repo.sql.helpers; +import static com.evolveum.midpoint.repo.sql.helpers.modify.DeltaUpdaterUtils.*; + +import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; +import javax.persistence.metamodel.Attribute; +import javax.persistence.metamodel.ManagedType; + +import org.apache.commons.beanutils.PropertyUtils; +import org.apache.commons.lang.StringUtils; +import org.hibernate.Session; +import org.hibernate.collection.spi.PersistentCollection; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.path.ItemName; @@ -39,25 +59,6 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.apache.commons.beanutils.PropertyUtils; -import org.apache.commons.lang.StringUtils; -import org.hibernate.Session; -import org.hibernate.collection.spi.PersistentCollection; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.persistence.metamodel.Attribute; -import javax.persistence.metamodel.ManagedType; -import java.io.Serializable; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.*; -import java.util.function.BiConsumer; -import java.util.stream.Collectors; - -import static com.evolveum.midpoint.repo.sql.helpers.modify.DeltaUpdaterUtils.*; /** * @author Viliam Repan (lazyman). @@ -128,7 +129,7 @@ public RObject modifyObject(Class type, String oid, //noinspection unchecked RObject object = session.byId(objectClass).getReference(oid); - ManagedType mainEntityType = entityRegistry.getJaxbMapping(type); + ManagedType mainEntityType = entityRegistry.getJaxbMapping(type); boolean shadowPendingOperationModified = false; @@ -283,6 +284,7 @@ private boolean isDelete(ItemDelta delta) { return false; } + @SuppressWarnings("Duplicates") private void handleWholeMetadata(Metadata bean, ItemDelta delta) { PrismValue value = null; @@ -576,7 +578,7 @@ private static void markNewValuesTransientAndAddToExistingNoFetch(Collection /** * Similar to DeltaUpdaterUtils.markNewValuesTransientAndAddToExisting but simpler. - * + *

* We rely on the fact that SAVE/UPDATE is now cascaded to extension items. */ private static void markNewValuesTransientAndAddToExistingNoFetchNoPersist(Collection> dbCollection, @@ -598,12 +600,12 @@ private void deleteExtensionValues(Collection> dbCollecti .collect(Collectors.toList()); boolean collectionLoaded = dbCollection instanceof PersistentCollection && - ((PersistentCollection) dbCollection).wasInitialized(); + ((PersistentCollection) dbCollection).wasInitialized(); // Note: as for 4.0 "no fetch" deletion is available only for ROExtString (MID-5558). boolean noFetchDeleteSupported = Boolean.TRUE.equals(RepoModifyOptions.getUseNoFetchExtensionValuesDeletion(ctx.options)) && - rValuesToDelete.stream().allMatch(rValue -> rValue instanceof ROExtString); + rValuesToDelete.stream().allMatch(rValue -> rValue instanceof ROExtString); //System.out.println("Collection loaded = " + collectionLoaded + ", noFetchDeleteSupported = " + noFetchDeleteSupported + " for " + rValuesToDelete); if (!collectionLoaded && noFetchDeleteSupported) { @@ -848,7 +850,7 @@ private Attribute findAttribute(TypeValuePair typeValuePair, String nameLocalPar return attribute; } - Attribute attributeOverride = entityRegistry.findAttributeOverride(typeValuePair.type, nameLocalPart); + Attribute attributeOverride = entityRegistry.findAttributeOverride(typeValuePair.type, nameLocalPart); if (attributeOverride != null) { return attributeOverride; } @@ -962,7 +964,7 @@ private void handleAttribute(Attribute attribute, Object bean, ItemDelta delta, } } - private void handleBasicOrEmbedded(Object bean, ItemDelta delta, Attribute attribute) { + private void handleBasicOrEmbedded(Object bean, ItemDelta delta, Attribute attribute) { Class outputType = getRealOutputType(attribute); PrismValue prismValue; @@ -997,7 +999,7 @@ private void handleBasicOrEmbedded(Object bean, ItemDelta delta, Attribute } } - private PrismValue getSingleValue(Attribute attribute, Collection valuesToSet) { + private PrismValue getSingleValue(Attribute attribute, Collection valuesToSet) { Set uniqueValues = new HashSet<>(valuesToSet); // This uniqueness check might be too strict: the values can be different from the point of default equality, // yet the final verdict (when applying the delta to prism structure) can be that they are equal. @@ -1050,7 +1052,7 @@ private void handleOneToMany(Collection collection, ItemDelta delta, Attribute a } private Collection processDeltaValues(Collection values, Class outputType, - ItemDelta delta, Object bean) { + ItemDelta delta, Object bean) { if (values == null) { return new ArrayList<>(); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/modify/EntityRegistry.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/modify/EntityRegistry.java index 518014a75b6..71ede08bb69 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/modify/EntityRegistry.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/modify/EntityRegistry.java @@ -7,9 +7,23 @@ package com.evolveum.midpoint.repo.sql.helpers.modify; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import javax.annotation.PostConstruct; +import javax.persistence.metamodel.Attribute; +import javax.persistence.metamodel.EntityType; +import javax.persistence.metamodel.ManagedType; +import javax.xml.namespace.QName; + +import org.hibernate.Metamodel; +import org.hibernate.SessionFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.path.UniformItemPath; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.path.UniformItemPath; import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; import com.evolveum.midpoint.repo.sql.query.definition.JaxbName; @@ -17,20 +31,6 @@ import com.evolveum.midpoint.repo.sql.query.definition.JaxbType; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import org.hibernate.Metamodel; -import org.hibernate.SessionFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import javax.persistence.metamodel.Attribute; -import javax.persistence.metamodel.EntityType; -import javax.persistence.metamodel.ManagedType; -import javax.xml.namespace.QName; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; /** * @author Viliam Repan (lazyman) @@ -45,11 +45,13 @@ public class EntityRegistry { private Metamodel metamodel; - private Map jaxbMappings = new HashMap<>(); + // we know that some represent the same type in one entry, but there is no way to capture that information + + private Map, ManagedType> jaxbMappings = new HashMap<>(); - private Map> attributeNameOverrides = new HashMap<>(); + private Map, Map>> attributeNameOverrides = new HashMap<>(); - private Map> attributeNamePathOverrides = new HashMap<>(); + private Map, Map>> attributeNamePathOverrides = new HashMap<>(); @PostConstruct public void init() { @@ -57,18 +59,19 @@ public void init() { metamodel = sessionFactory.getMetamodel(); - for (EntityType entity : metamodel.getEntities()) { - Class javaType = entity.getJavaType(); - Ignore ignore = (Ignore) javaType.getAnnotation(Ignore.class); + for (EntityType entity : metamodel.getEntities()) { + Class javaType = entity.getJavaType(); + Ignore ignore = javaType.getAnnotation(Ignore.class); if (ignore != null) { continue; } - Class jaxb; + Class jaxb; if (RObject.class.isAssignableFrom(javaType)) { - jaxb = RObjectType.getType(javaType).getJaxbClass(); + //noinspection unchecked,rawtypes + jaxb = RObjectType.getType((Class) javaType).getJaxbClass(); } else { - JaxbType jaxbType = (JaxbType) javaType.getAnnotation(JaxbType.class); + JaxbType jaxbType = javaType.getAnnotation(JaxbType.class); if (jaxbType == null) { throw new IllegalStateException("Unknown jaxb type for " + javaType.getName()); } @@ -78,12 +81,12 @@ public void init() { jaxbMappings.put(jaxb, entity); // create override map - Map overrides = new HashMap<>(); - Map pathOverrides = new HashMap<>(); + Map> overrides = new HashMap<>(); + Map> pathOverrides = new HashMap<>(); - for (Attribute attribute : (Set) entity.getAttributes()) { - Class jType = attribute.getJavaType(); - JaxbPath[] paths = (JaxbPath[]) jType.getAnnotationsByType(JaxbPath.class); + for (Attribute attribute : entity.getAttributes()) { + Class jType = attribute.getJavaType(); + JaxbPath[] paths = jType.getAnnotationsByType(JaxbPath.class); if (paths == null || paths.length == 0) { paths = ((Method) attribute.getJavaMember()).getAnnotationsByType(JaxbPath.class); } @@ -121,33 +124,36 @@ public void init() { LOGGER.debug("Initialization finished"); } - public ManagedType getJaxbMapping(Class jaxbType) { - return jaxbMappings.get(jaxbType); + public ManagedType getJaxbMapping(Class jaxbType) { + //noinspection unchecked + return (ManagedType) jaxbMappings.get(jaxbType); } - public ManagedType getMapping(Class entityType) { + public ManagedType getMapping(Class entityType) { return metamodel.managedType(entityType); } - public Attribute findAttribute(ManagedType type, String name) { + public Attribute findAttribute(ManagedType type, String name) { try { - return type.getAttribute(name); + //noinspection unchecked + return (Attribute) type.getAttribute(name); } catch (IllegalArgumentException ex) { return null; } } - public Attribute findAttributeOverride(ManagedType type, String nameOverride) { - Map overrides = attributeNameOverrides.get(type); + public Attribute findAttributeOverride(ManagedType type, String nameOverride) { + Map> overrides = attributeNameOverrides.get(type); if (overrides == null) { return null; } - return overrides.get(nameOverride); + //noinspection unchecked + return (Attribute) overrides.get(nameOverride); } - public boolean hasAttributePathOverride(ManagedType type, ItemPath pathOverride) { - Map overrides = attributeNamePathOverrides.get(type); + public boolean hasAttributePathOverride(ManagedType type, ItemPath pathOverride) { + Map> overrides = attributeNamePathOverrides.get(type); if (overrides == null) { return false; } @@ -163,8 +169,9 @@ public boolean hasAttributePathOverride(ManagedType type, ItemPath pathOverride) return false; } - public Attribute findAttributePathOverride(ManagedType type, ItemPath pathOverride) { - Map overrides = attributeNamePathOverrides.get(type); + public Attribute findAttributePathOverride(ManagedType type, ItemPath pathOverride) { + //noinspection unchecked,rawtypes + Map> overrides = (Map) attributeNamePathOverrides.get(type); if (overrides == null) { return null; }