From 3869db3fb9452b580be321d9fb74b00dd0d66333 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Wed, 17 Jun 2020 15:10:07 +0200 Subject: [PATCH] repo-sql-impl: massive query(2)/definition cleanup + bit of generics --- .../common/container/ROperationExecution.java | 2 - .../repo/sql/query/definition/JaxbType.java | 14 ++-- .../sql/query/definition/OwnerGetter.java | 7 +- .../sql/query/definition/QueryEntity.java | 4 - .../query/definition/VirtualCollection.java | 10 +-- .../definition/ClassDefinitionParser.java | 74 +++++++------------ .../definition/JpaAnyContainerDefinition.java | 7 +- .../definition/JpaAnyPropertyDefinition.java | 4 +- .../definition/JpaAnyReferenceDefinition.java | 6 +- .../definition/JpaDataNodeDefinition.java | 41 +++++----- .../definition/JpaEntityDefinition.java | 35 ++++----- .../JpaEntityPointerDefinition.java | 9 ++- .../definition/JpaPropertyDefinition.java | 11 ++- .../definition/JpaReferenceDefinition.java | 16 ++-- .../VirtualAnyContainerDefinition.java | 11 +-- 15 files changed, 114 insertions(+), 137 deletions(-) diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/ROperationExecution.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/ROperationExecution.java index 56aa274b702..49ede3c4739 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/ROperationExecution.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/ROperationExecution.java @@ -22,7 +22,6 @@ import com.evolveum.midpoint.repo.sql.data.common.id.RContainerId; import com.evolveum.midpoint.repo.sql.query.definition.JaxbType; import com.evolveum.midpoint.repo.sql.query.definition.OwnerIdGetter; -import com.evolveum.midpoint.repo.sql.query.definition.QueryEntity; import com.evolveum.midpoint.repo.sql.query2.definition.IdQueryProperty; import com.evolveum.midpoint.repo.sql.query2.definition.NotQueryable; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; @@ -34,7 +33,6 @@ @JaxbType(type = OperationExecutionType.class) @Entity -@QueryEntity @IdClass(RContainerId.class) @Table(name = "m_operation_execution", indexes = { @Index(name = "iOpExecTaskOid", columnList = "taskRef_targetOid"), diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/JaxbType.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/JaxbType.java index 0af75bf5520..d728e46158e 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/JaxbType.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/JaxbType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -7,20 +7,18 @@ package com.evolveum.midpoint.repo.sql.query.definition; +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + import java.lang.annotation.Retention; import java.lang.annotation.Target; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - /** * @author lazyman */ -@Target({TYPE, METHOD, FIELD}) +@Target({ TYPE, METHOD, FIELD }) @Retention(RUNTIME) public @interface JaxbType { - Class type(); + Class type(); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/OwnerGetter.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/OwnerGetter.java index 418669ab548..99a0e466646 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/OwnerGetter.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/OwnerGetter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -18,9 +18,10 @@ * @author lazyman * @author mederly */ -@Target({ElementType.METHOD}) +@Target({ ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface OwnerGetter { - Class ownerClass(); + // hard to generify, can be but also a Container + Class ownerClass(); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/QueryEntity.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/QueryEntity.java index 88392b6f8a4..56bc9deccd0 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/QueryEntity.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/QueryEntity.java @@ -19,11 +19,7 @@ @Retention(RetentionPolicy.RUNTIME) public @interface QueryEntity { - VirtualProperty[] properties() default {}; - VirtualCollection[] collections() default {}; - VirtualEntity[] entities() default {}; - VirtualAny[] anyElements() default {}; } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/VirtualCollection.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/VirtualCollection.java index a6fddf3f90e..a150aa362ce 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/VirtualCollection.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/definition/VirtualCollection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -15,19 +15,19 @@ /** * @author lazyman */ -@Target({ElementType.TYPE}) +@Target({ ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface VirtualCollection { JaxbName jaxbName(); - Class jaxbType(); + Class jaxbType(); String jpaName(); - Class jpaType(); + Class jpaType(); VirtualQueryParam[] additionalParams() default {}; - Class collectionType(); + Class collectionType(); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/ClassDefinitionParser.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/ClassDefinitionParser.java index 085c89d310e..296f603dda5 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/ClassDefinitionParser.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/ClassDefinitionParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -7,7 +7,23 @@ package com.evolveum.midpoint.repo.sql.query2.definition; -import com.evolveum.midpoint.prism.path.*; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import javax.persistence.*; +import javax.xml.namespace.QName; + +import org.apache.commons.lang.StringUtils; +import org.hibernate.annotations.Index; + +import com.evolveum.midpoint.prism.path.IdentifierPathSegment; +import com.evolveum.midpoint.prism.path.ItemName; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.path.ParentPathSegment; import com.evolveum.midpoint.repo.sql.data.Marker; import com.evolveum.midpoint.repo.sql.data.common.ObjectReference; import com.evolveum.midpoint.repo.sql.data.common.RObject; @@ -19,23 +35,6 @@ import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import org.apache.commons.lang.StringUtils; -import org.hibernate.annotations.Index; - -import javax.persistence.Embeddable; -import javax.persistence.Embedded; -import javax.persistence.Entity; -import javax.persistence.Enumerated; -import javax.persistence.Lob; -import javax.persistence.Transient; -import javax.xml.namespace.QName; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; /** * @author lazyman @@ -45,7 +44,7 @@ public class ClassDefinitionParser { private static final Trace LOGGER = TraceManager.getTrace(ClassDefinitionParser.class); - public JpaEntityDefinition parseRootClass(Class jpaClass) { + public JpaEntityDefinition parseRootClass(Class jpaClass) { return parseClass(jpaClass); } @@ -107,7 +106,7 @@ private JpaLinkDefinition parseMethod(Method method) { ItemPath itemPath = getJaxbName(method); String jpaName = getJpaName(method); - Class jpaClass = getClass(returnedContentType); + Class jpaClass = getClass(returnedContentType); // sanity check if (Set.class.isAssignableFrom(jpaClass)) { @@ -167,9 +166,10 @@ private JpaLinkDefinition parseMethod(Method method) { return linkDefinition; } - private Class getClass(Type type) { + private Class getClass(Type type) { if (type instanceof Class) { - return ((Class) type); + //noinspection unchecked + return ((Class) type); } else if (type instanceof ParameterizedType) { return getClass(((ParameterizedType) type).getRawType()); } else { @@ -186,12 +186,11 @@ private void addVirtualDefinitions(Class jpaClass, JpaEntityDefinition entityDef } private void addVirtualDefinitionsForClass(Class jpaClass, JpaEntityDefinition entityDef) { - if (!jpaClass.isAnnotationPresent(QueryEntity.class)) { + QueryEntity qEntity = (QueryEntity) jpaClass.getAnnotation(QueryEntity.class); + if (qEntity == null) { return; } - QueryEntity qEntity = (QueryEntity) jpaClass.getAnnotation(QueryEntity.class); - for (VirtualAny any : qEntity.anyElements()) { ItemName jaxbName = new ItemName(any.jaxbNameNamespace(), any.jaxbNameLocalPart()); VirtualAnyContainerDefinition def = new VirtualAnyContainerDefinition(any.ownerType()); @@ -208,31 +207,12 @@ private void addVirtualDefinitionsForClass(Class jpaClass, JpaEntityDefinition e JpaLinkDefinition linkDefinition = new JpaLinkDefinition<>(jaxbName, jpaName, colSpec, false, content); entityDef.addDefinition(linkDefinition); } - - for (VirtualEntity entity : qEntity.entities()) { - ItemName jaxbName = createItemName(entity.jaxbName()); - String jpaName = normalizeJpaName(entity.jpaName()); - if (jpaName != null) { - throw new IllegalStateException("Only self-pointing virtual entities are supported for now; this one is not: " + jaxbName + " in " + entityDef); - } - JpaDataNodeDefinition target = new JpaEntityPointerDefinition(entityDef); // pointer to avoid loops - JpaLinkDefinition linkDefinition = new JpaLinkDefinition<>(jaxbName, jpaName, null, false, target); - entityDef.addDefinition(linkDefinition); - } } private ItemName createItemName(JaxbName name) { return new ItemName(name.namespace(), name.localPart()); } - private String normalizeJpaName(String name) { - if (StringUtils.isEmpty(name)) { - return null; // "" -> null - } else { - return name; - } - } - private boolean isEntity(Class type) { if (RPolyString.class.isAssignableFrom(type)) { //it's hibernate entity but from prism point of view it's property @@ -263,7 +243,7 @@ private ItemPath getJaxbName(Method method) { // second parameter is just to optimize private Class getJaxbClass(Method method, Class returnedClass) { - JaxbType annotation = (JaxbType) method.getAnnotation(JaxbType.class); + JaxbType annotation = method.getAnnotation(JaxbType.class); if (annotation != null) { return annotation.type(); } @@ -304,6 +284,6 @@ private String getPropertyName(String methodName) { } char first = Character.toLowerCase(methodName.charAt(startIndex)); - return Character.toString(first) + StringUtils.substring(methodName, startIndex + 1, methodName.length()); + return first + StringUtils.substring(methodName, startIndex + 1, methodName.length()); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyContainerDefinition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyContainerDefinition.java index 96b49e6e67a..7212d148e91 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyContainerDefinition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyContainerDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -19,9 +19,10 @@ /** * @author lazyman */ -public class JpaAnyContainerDefinition extends JpaDataNodeDefinition { +public class JpaAnyContainerDefinition> + extends JpaDataNodeDefinition { - public JpaAnyContainerDefinition(Class jpaClass) { + public JpaAnyContainerDefinition(Class jpaClass) { super(jpaClass, null); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyPropertyDefinition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyPropertyDefinition.java index b851ae28f39..2adc385f130 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyPropertyDefinition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyPropertyDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -16,7 +16,7 @@ * * @author mederly */ -public class JpaAnyPropertyDefinition extends JpaPropertyDefinition { +public class JpaAnyPropertyDefinition extends JpaPropertyDefinition { // enumerated extension items are not supported JpaAnyPropertyDefinition(Class jpaClass, Class jaxbClass) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyReferenceDefinition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyReferenceDefinition.java index 1b2c95578ea..405f4e7f839 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyReferenceDefinition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaAnyReferenceDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2017 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -10,13 +10,13 @@ /** * Specifies "any" reference. In contrast to other JPA definitions, it is not derived by analyzing R-class * structure, but created on demand in the process if ItemPath translation. - * + *

* It was created to ensure consistency of resolution mechanism, which should provide * HQL property + JPA definition for any item path provided. * * @author mederly */ -public class JpaAnyReferenceDefinition extends JpaReferenceDefinition { +public class JpaAnyReferenceDefinition extends JpaReferenceDefinition { public JpaAnyReferenceDefinition(Class jpaClass, Class referencedEntityJpaClass) { super(jpaClass, referencedEntityJpaClass); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaDataNodeDefinition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaDataNodeDefinition.java index dbb872e4e47..9277187e5e7 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaDataNodeDefinition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaDataNodeDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -7,61 +7,64 @@ package com.evolveum.midpoint.repo.sql.query2.definition; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.Visitable; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.query.QueryException; import com.evolveum.midpoint.repo.sql.query2.resolution.DataSearchResult; import com.evolveum.midpoint.util.DebugDumpable; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * Defines piece of JPA data - entity, property, reference, or "any" container. Used to convert ItemPath to HQL query, * or, specifically, to a property path with left outer joins where appropriate. - * + *

* The conversion works like running state machine where data definitions are states, and transitions are labeled * with non-empty ItemPaths. Input paths are used to navigate through states until all of input path is consumed. - * + *

* In addition to recognize input paths, this automaton produces HQL path and property joins. That's why * each possible transition is labeled with (ItemPath prefix, JPA name, other transition data) tuple. * ItemPath prefix is used to match the input path, while JPA name + other transition data, along * with target state information (potentially) are used to generate HQL property path with appropriate join, * if necessary. - * + *

* Note that some transitions may have empty JPA name - when the data is contained directly in owner entity * (e.g. object extension, shadow attributes). Most transitions have single item paths. However, some have two, * e.g. construction/resourceRef, owner/id, metadata/*. - * + *

* By other transition data we currently mean: collection specification, or "embedded" flag. - * + *

* Terminology: - * - state ~ data node (JpaDataNodeDefinition -> JpaEntityDefinition, JpaPropertyDefinition, ...) - * - transition ~ link node (JpaLinkDefinition) + * - state ~ data node (JpaDataNodeDefinition -> JpaEntityDefinition, JpaPropertyDefinition, ...) + * - transition ~ link node (JpaLinkDefinition) * * @author mederly */ -public abstract class JpaDataNodeDefinition implements DebugDumpable, Visitable { +public abstract class JpaDataNodeDefinition> + implements DebugDumpable, Visitable { /** * JPA class - either "composite" (RObject, RUser, RAssignment, ...) or "primitive" (String, Integer, int, ...) */ - @NotNull private final Class jpaClass; + @NotNull private final Class jpaClass; /** * JAXB class - either "composite" (ObjectType, UserType, AssignmentType, ...) or "primitive" (String, Integer, int, ...) * Null if not known. */ - @Nullable private final Class jaxbClass; + @Nullable private final Class jaxbClass; - public JpaDataNodeDefinition(@NotNull Class jpaClass, @Nullable Class jaxbClass) { + public JpaDataNodeDefinition(@NotNull Class jpaClass, @Nullable Class jaxbClass) { this.jpaClass = jpaClass; this.jaxbClass = jaxbClass; } @NotNull - public Class getJpaClass() { + public Class getJpaClass() { return jpaClass; } @@ -70,7 +73,7 @@ public String getJpaClassName() { } @Nullable - public Class getJaxbClass() { + public Class getJaxbClass() { return jaxbClass; } @@ -79,11 +82,9 @@ public Class getJaxbClass() { * * @param path A path to be resolved. Always non-null and non-empty. Should produce at least one transition. * @param itemDefinition Item definition for the item being sought. Needed only for "any" items. - * @return - * - Normally it returns the search result containing next item definition (entity, collection, ...) in the chain - * and the unresolved remainder of the path. The transition may be empty ("self") e.g. for metadata or construction. + * @return - Normally it returns the search result containing next item definition (entity, collection, ...) in the chain + * and the unresolved remainder of the path. The transition may be empty ("self") e.g. for metadata or construction. * - If the search was not successful, returns null. - * */ public abstract DataSearchResult nextLinkDefinition(ItemPath path, ItemDefinition itemDefinition, PrismContext prismContext) throws QueryException; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaEntityDefinition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaEntityDefinition.java index 59251b5d754..67336a3b04b 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaEntityDefinition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaEntityDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -7,37 +7,33 @@ package com.evolveum.midpoint.repo.sql.query2.definition; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; + +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.Visitable; import com.evolveum.midpoint.prism.Visitor; -import com.evolveum.midpoint.prism.path.*; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.query.QueryException; import com.evolveum.midpoint.repo.sql.query2.resolution.DataSearchResult; -import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.List; /** * @author lazyman * @author mederly */ -public class JpaEntityDefinition extends JpaDataNodeDefinition implements DebugDumpable, Visitable { - - private static final Trace LOGGER = TraceManager.getTrace(JpaEntityDefinition.class); +public class JpaEntityDefinition extends JpaDataNodeDefinition { /** * child definitions of this entity */ - private List definitions = new ArrayList<>(); + private final List> definitions = new ArrayList<>(); private JpaEntityDefinition superclassDefinition; - public JpaEntityDefinition(Class jpaClass, Class jaxbClass) { + public JpaEntityDefinition(Class jpaClass, Class jaxbClass) { super(jpaClass, jaxbClass); } @@ -85,9 +81,7 @@ public interface LinkDefinitionHandler { * @param path ItemPath to resolve. Non-empty! * @param itemDefinition Definition of the final path segment, if it's "any" property. * @param type Type of definition to be found - * @return - * - * If successful, returns correct definition + empty path. + * @return If successful, returns correct definition + empty path. * If unsuccessful, return null. */ public DataSearchResult findDataNodeDefinition(ItemPath path, @@ -98,7 +92,7 @@ public DataSearchResult findDataNodeDefinit public DataSearchResult findDataNodeDefinition(ItemPath path, ItemDefinition itemDefinition, Class type, LinkDefinitionHandler handler, PrismContext prismContext) throws QueryException { JpaDataNodeDefinition currentDefinition = this; - for (;;) { + for (; ; ) { DataSearchResult result = currentDefinition.nextLinkDefinition(path, itemDefinition, prismContext); if (result == null) { // oops return null; @@ -153,7 +147,6 @@ public DataSearchResult nextLinkDefinition(ItemPath path, ItemDefinition i } } - @Override public void accept(Visitor visitor) { visitor.visit(this); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaEntityPointerDefinition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaEntityPointerDefinition.java index 68fa38b672e..d36d33e6cb1 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaEntityPointerDefinition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaEntityPointerDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -11,6 +11,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.Visitor; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.query.QueryException; import com.evolveum.midpoint.repo.sql.query2.resolution.DataSearchResult; @@ -23,11 +24,11 @@ * * @author mederly */ -public class JpaEntityPointerDefinition extends JpaDataNodeDefinition { +public class JpaEntityPointerDefinition extends JpaDataNodeDefinition { - private JpaEntityDefinition resolvedEntityDefinition; // lazily evaluated + private JpaEntityDefinition resolvedEntityDefinition; // lazily evaluated - public JpaEntityPointerDefinition(Class jpaClass) { + public JpaEntityPointerDefinition(Class jpaClass) { super(jpaClass, null); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaPropertyDefinition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaPropertyDefinition.java index 3d9081824da..b3bb7ec639a 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaPropertyDefinition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaPropertyDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -11,12 +11,14 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.Visitor; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.query2.resolution.DataSearchResult; /** * @author lazyman */ -public class JpaPropertyDefinition extends JpaDataNodeDefinition { +public class JpaPropertyDefinition> + extends JpaDataNodeDefinition { private final boolean lob; private final boolean enumerated; @@ -24,8 +26,9 @@ public class JpaPropertyDefinition extends JpaDataNodeDefinition { private final boolean count; // "count"-type variable, like RShadow.pendingOperationCount private final boolean neverNull; - JpaPropertyDefinition(Class jpaClass, Class jaxbClass, boolean lob, boolean enumerated, boolean indexed, boolean count, - boolean neverNull) { + JpaPropertyDefinition( + Class jpaClass, Class jaxbClass, boolean lob, + boolean enumerated, boolean indexed, boolean count, boolean neverNull) { super(jpaClass, jaxbClass); this.lob = lob; this.enumerated = enumerated; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaReferenceDefinition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaReferenceDefinition.java index 5b91e59efb9..67c49eb7575 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaReferenceDefinition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/JpaReferenceDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -7,22 +7,26 @@ package com.evolveum.midpoint.repo.sql.query2.definition; +import org.apache.commons.lang.Validate; + import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.Visitor; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.query2.resolution.DataSearchResult; import com.evolveum.midpoint.schema.constants.SchemaConstants; -import org.apache.commons.lang.Validate; /** * @author lazyman */ -public class JpaReferenceDefinition extends JpaDataNodeDefinition { +public class JpaReferenceDefinition> + extends JpaDataNodeDefinition { - private JpaEntityPointerDefinition referencedEntityDefinition; // lazily evaluated + private final JpaEntityPointerDefinition referencedEntityDefinition; - public JpaReferenceDefinition(Class jpaClass, Class referencedEntityJpaClass) { + public JpaReferenceDefinition( + Class jpaClass, Class referencedEntityJpaClass) { super(jpaClass, null); // JAXB class not important here Validate.notNull(referencedEntityJpaClass, "referencedEntityJpaClass"); this.referencedEntityDefinition = new JpaEntityPointerDefinition(referencedEntityJpaClass); @@ -34,7 +38,7 @@ protected String getDebugDumpClassName() { } @Override - public DataSearchResult nextLinkDefinition(ItemPath path, ItemDefinition itemDefinition, PrismContext prismContext) { + public DataSearchResult nextLinkDefinition(ItemPath path, ItemDefinition itemDefinition, PrismContext prismContext) { if (ItemPath.isObjectReference(path.first())) { // returning artificially created transition definition, used to allow dereferencing target object in a generic way return new DataSearchResult<>( diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/VirtualAnyContainerDefinition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/VirtualAnyContainerDefinition.java index f72f033715c..216ae142057 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/VirtualAnyContainerDefinition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/definition/VirtualAnyContainerDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -7,19 +7,20 @@ package com.evolveum.midpoint.repo.sql.query2.definition; +import org.apache.commons.lang.Validate; + import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType; -import org.apache.commons.lang.Validate; /** * @author mederly */ -public class VirtualAnyContainerDefinition extends JpaAnyContainerDefinition { +public class VirtualAnyContainerDefinition extends JpaAnyContainerDefinition { - private RObjectExtensionType ownerType; // ObjectType (for extension) or ShadowType (for attributes) + private RObjectExtensionType ownerType; // ObjectType (for extension) or ShadowType (for attributes) public VirtualAnyContainerDefinition(RObjectExtensionType ownerType) { - super(RObject.class); // RObject is artificial - don't want to make jpaClass nullable just for this single situation + super(RObject.class); // RObject is artificial - don't want to make jpaClass nullable just for this single situation Validate.notNull(ownerType, "ownerType"); this.ownerType = ownerType; }