From c62bb4966ab5031bb9da9b711ffdc9a65de0f27f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 23 Feb 2017 10:09:15 +0100 Subject: [PATCH 1/5] First working version (although not configurable for now). --- .../repo/sql/QueryInterpreter2Test.java | 25 ++-- .../midpoint/repo/sql/SearchTest.java | 135 ++++++++++++------ .../src/test/resources/basic/objects.xml | 12 +- .../repo/sql/data/common/RObject.java | 5 +- .../repo/sql/data/common/RObjectTextInfo.java | 99 +++++++++++-- .../query2/resolution/ItemPathResolver.java | 49 ++----- .../restriction/FullTextRestriction.java | 11 +- 7 files changed, 219 insertions(+), 117 deletions(-) diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index 3b8ffc9409a..61fcbb64d63 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -3351,18 +3351,19 @@ public void test940FullTextSimple() throws Exception { .build(); String real = getInterpretedQuery2(session, UserType.class, query); - String expected = "select\n" + - " u.fullObject,\n" + - " u.stringsCount,\n" + - " u.longsCount,\n" + - " u.datesCount,\n" + - " u.referencesCount,\n" + - " u.polysCount,\n" + - " u.booleansCount\n" + - "from\n" + - " RUser u\n" + - "where\n" + - " lower(u.name.norm) like :norm\n"; + String expected = "select\n" + + " u.fullObject,\n" + + " u.stringsCount,\n" + + " u.longsCount,\n" + + " u.datesCount,\n" + + " u.referencesCount,\n" + + " u.polysCount,\n" + + " u.booleansCount\n" + + "from\n" + + " RUser u\n" + + " left join u.textInfoItems t\n" + + "where\n" + + " t.text like :text"; assertEqualsIgnoreWhitespace(expected, real); } finally { close(session); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java index b5e6a1c5c40..79e2459e079 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java @@ -20,22 +20,14 @@ import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.match.PolyStringOrigMatchingRule; -import com.evolveum.midpoint.prism.match.PolyStringStrictMatchingRule; +import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.AndFilter; -import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.prism.query.NotFilter; import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.OrderDirection; -import com.evolveum.midpoint.prism.query.RefFilter; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.PrismTestUtil; -import com.evolveum.midpoint.schema.MidPointPrismContextFactory; -import com.evolveum.midpoint.schema.ResultHandler; -import com.evolveum.midpoint.schema.SearchResultList; +import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.exception.SchemaException; @@ -565,94 +557,149 @@ public void caseInsensitiveSearchTest() throws Exception { final String emailLowerCase = "testuserx00003@example.com"; final String emailVariousCase = "TeStUsErX00003@EXAmPLE.com"; - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_FULL_NAME).eqPoly(existingNameNorm).matchingNorm() .build(), - 1); + false, 1); - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_FULL_NAME).eqPoly(existingNameOrig).matchingNorm() .build(), - 1); + false, 1); - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_EMAIL_ADDRESS).eq(emailLowerCase).matchingCaseIgnore() .build(), - 1); + false, 1); - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_EMAIL_ADDRESS).eq(emailVariousCase).matchingCaseIgnore() .build(), - 1); + false, 1); // comparing polystrings, but providing plain String - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_FULL_NAME).eq(existingNameNorm).matchingNorm() .build(), - 1); + false, 1); - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_FULL_NAME).eq(existingNameOrig).matchingNorm() .build(), - 1); + false, 1); - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_FULL_NAME).containsPoly(existingNameNorm).matchingNorm() .build(), - 1); + false, 1); - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_FULL_NAME).containsPoly(existingNameOrig).matchingNorm() .build(), - 1); + false, 1); - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_EMAIL_ADDRESS).contains(emailLowerCase).matchingCaseIgnore() .build(), - 1); + false, 1); - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_EMAIL_ADDRESS).contains(emailVariousCase).matchingCaseIgnore() .build(), - 1); + false, 1); // comparing polystrings, but providing plain String - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_FULL_NAME).contains(existingNameNorm).matchingNorm() .build(), - 1); + false, 1); - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_FULL_NAME).contains(existingNameOrig).matchingNorm() .build(), - 1); + false, 1); } @Test public void fullTextSearch() throws Exception { - assertObjectsFound(QueryBuilder.queryFor(UserType.class, prismContext) - .fullText("test userx00003") + + OperationResult result = new OperationResult("fullTextSearch"); + + Collection> distinct = + SelectorOptions.createCollection(GetOperationOptions.createDistinct()); + + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) + .fullText("atestuserX00003") + .build(), + false, 1); + + List> users = assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) + .fullText("Pellentesque") .build(), - 1); + true, 1); + + assertUsersFound(QueryBuilder.queryFor(UserType.class, prismContext) + .fullText("sollicitudin") + .build(), + true, 0); + + String newDescription = "\n" + + "\t\t\tUt pellentesque massa elit, in varius justo pellentesque ac. Vivamus gravida lectus non odio tempus iaculis sed quis\n" + + "\t\t\tenim. Praesent sed ante nunc. Etiam euismod urna sit amet mi commodo luctus. Morbi dictum suscipit mauris ac\n" + + "\t\t\tfacilisis. Phasellus congue luctus nibh, eu gravida sem iaculis in. Fusce bibendum quam sit amet tortor venenatis\n" + + "\t\t\tmalesuada. Nam non varius nibh. Ut porta sit amet dui ut mollis. Etiam tincidunt ex viverra purus condimentum\n" + + "\t\t\tinterdum. Sed ornare lacinia finibus. Pellentesque ac tortor scelerisque, sagittis diam nec, vehicula ligula.\n" + + "\t\t\tPhasellus sodales felis quis fermentum volutpat. Orci varius natoque penatibus et magnis dis parturient montes,\n" + + "\t\t\tnascetur ridiculus mus. Suspendisse mattis efficitur ligula et pharetra. Morbi risus erat, mollis nec suscipit vel,\n" + + "\t\t\tconvallis eu ex.\n" + + "\n" + + "\t\t\tPellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur cursus\n" + + "\t\t\tplacerat nisl, quis egestas ante semper at. Aenean semper nulla in elit tincidunt fringilla. Proin tristique sapien ac\n" + + "\t\t\tenim blandit, a faucibus dui maximus. Curabitur sodales eget nulla eget mattis. Sed mollis blandit sapien. Aenean\n" + + "\t\t\tpulvinar condimentum condimentum. Ut et venenatis arcu. Nam a nisl at nibh aliquam luctus. Phasellus eleifend non\n" + + "\t\t\ttellus eget varius.\n" + + "\n" + + "\t\t\tNunc tincidunt sed lacus congue iaculis. Donec vel orci nulla. Phasellus fringilla, erat ac elementum lacinia, ex enim\n" + + "\t\t\tdictum magna, accumsan dignissim elit mauris vel quam. Fusce vel tellus magna. Quisque sed tellus lectus. Donec id\n" + + "\t\t\tnibh a lorem rutrum pharetra. Vestibulum vehicula leo ac eros pulvinar, eget tristique purus porta. Aliquam cursus\n" + + "\t\t\tturpis sed libero eleifend interdum. Sed ac nisi a turpis finibus consectetur. Sed a velit vel nisi semper commodo.\n" + + "\t\t\tVestibulum vel pulvinar ligula, vitae rutrum leo. Sed efficitur dignissim augue in placerat. Aliquam dapibus mauris\n" + + "\t\t\teget diam pharetra molestie. Morbi vitae nulla sollicitudin, dignissim tellus a, tincidunt neque.\n"; + + repositoryService.modifyObject(UserType.class, users.get(0).getOid(), + DeltaBuilder.deltaFor(UserType.class, prismContext) + .item(UserType.F_DESCRIPTION).replace(newDescription) + .asItemDeltas(), + result); + + assertUsersFoundBySearch(QueryBuilder.queryFor(UserType.class, prismContext) + .fullText("sollicitudin") + .build(), + distinct, 1); } @SuppressWarnings("SameParameterValue") - private void assertObjectsFound(ObjectQuery query, int expectedCount) throws Exception { - assertObjectsFoundBySearch(query, expectedCount); - assertObjectsFoundByCount(query, expectedCount); + private List> assertUsersFound(ObjectQuery query, boolean distinct, int expectedCount) throws Exception { + Collection> options = distinct ? + SelectorOptions.createCollection(GetOperationOptions.createDistinct()) : null; + assertObjectsFoundByCount(query, options, expectedCount); + return assertUsersFoundBySearch(query, options, expectedCount); } - private void assertObjectsFoundBySearch(ObjectQuery query, int expectedCount) throws Exception { + private List> assertUsersFoundBySearch(ObjectQuery query, + Collection> options, int expectedCount) throws Exception { OperationResult result = new OperationResult("search"); - List> users = repositoryService.searchObjects(UserType.class, query, null, result); + List> users = repositoryService.searchObjects(UserType.class, query, options, result); result.recomputeStatus(); assertTrue(result.isSuccess()); assertEquals("Wrong # of results found: " + query, expectedCount, users.size()); + return users; } - private void assertObjectsFoundByCount(ObjectQuery query, int expectedCount) throws Exception { + private void assertObjectsFoundByCount(ObjectQuery query, Collection> options, + int expectedCount) throws Exception { OperationResult result = new OperationResult("count"); - int count = repositoryService.countObjects(UserType.class, query, result); + int count = repositoryService.countObjects(UserType.class, query, options, result); result.recomputeStatus(); assertTrue(result.isSuccess()); assertEquals("Wrong # of results found: " + query, expectedCount, count); diff --git a/repo/repo-sql-impl-test/src/test/resources/basic/objects.xml b/repo/repo-sql-impl-test/src/test/resources/basic/objects.xml index 876ac28f72e..1eef43fd93d 100644 --- a/repo/repo-sql-impl-test/src/test/resources/basic/objects.xml +++ b/repo/repo-sql-impl-test/src/test/resources/basic/objects.xml @@ -148,8 +148,18 @@ atestuserX00003 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut dapibus, felis tincidunt pellentesque + ullamcorper, nisi orci accumsan turpis, quis lobortis quam libero at lectus. Quisque auctor, urna ut elementum + volutpat, sapien neque imperdiet elit, luctus viverra arcu nisl sed nibh. Vestibulum justo lorem, rhoncus a faucibus + ac, pulvinar a justo. Nam tincidunt suscipit congue. Proin auctor dapibus lacus sit amet ultricies. Duis feugiat + viverra nibh, nec ultricies libero ultrices eleifend. Nullam sed quam consectetur, rutrum arcu eu, imperdiet nibh. + Pellentesque a molestie tortor, vitae elementum nulla. Morbi lacus ex, commodo quis aliquam eget, condimentum sed + lorem. Suspendisse maximus est euismod, porta est a, vulputate magna. Morbi blandit accumsan mattis. Cras commodo + cursus ante. Phasellus in nulla eget odio tristique dapibus. Pellentesque at orci at nisl blandit efficitur id ut leo. + Sed laoreet iaculis turpis quis scelerisque. + - + diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java index 294caf48718..1b808a9d8c5 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java @@ -145,8 +145,9 @@ public abstract class RObject implements Metadata>, EntityState, Serializable { public static final String F_OBJECT_TYPE_CLASS = "objectTypeClass"; + public static final String F_TEXT_INFO_ITEMS = "textInfoItems"; - private Boolean trans; + private Boolean trans; private String oid; private int version; @@ -692,7 +693,7 @@ public static void copyFromJAXB(ObjectType jaxb, RObject< copyFromJAXB(jaxb.getExtension().asPrismContainerValue(), repo, prismContext, RObjectExtensionType.EXTENSION); } - repo.getTextInfoItems().addAll(RObjectTextInfo.createSet(jaxb, repo)); + repo.getTextInfoItems().addAll(RObjectTextInfo.createItemsSet(jaxb, repo, prismContext)); } @Deprecated diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java index 38f7a990b03..7ebdade7ef6 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java @@ -16,17 +16,22 @@ package com.evolveum.midpoint.repo.sql.data.common; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.repo.sql.query2.definition.NotQueryable; import com.evolveum.midpoint.repo.sql.util.RUtil; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import org.apache.commons.lang3.StringUtils; import org.hibernate.annotations.ForeignKey; import org.jetbrains.annotations.NotNull; import javax.persistence.*; import java.io.Serializable; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; +import java.util.*; import static com.evolveum.midpoint.repo.sql.data.common.RObjectTextInfo.COLUMN_OWNER_OID; import static com.evolveum.midpoint.repo.sql.data.common.RObjectTextInfo.TABLE_NAME; @@ -39,8 +44,13 @@ @Index(name = "iTextInfoOid", columnList = COLUMN_OWNER_OID)}) public class RObjectTextInfo implements Serializable { + private static final Trace LOGGER = TraceManager.getTrace(RObjectTextInfo.class); + public static final String TABLE_NAME = "m_object_text_info"; public static final String COLUMN_OWNER_OID = "owner_oid"; + public static final String F_TEXT = "text"; + + public static final int MAX_TEXT_SIZE = 255; private Integer id; @@ -52,7 +62,12 @@ public class RObjectTextInfo implements Serializable { public RObjectTextInfo() { } - @Id + public RObjectTextInfo(RObject owner, String text) { + this.owner = owner; + this.text = text; + } + + @Id @GeneratedValue public Integer getId() { return id; @@ -112,18 +127,74 @@ public int hashCode() { return Objects.hash(owner, ownerOid, id, text); } - public static Set createSet(@NotNull ObjectType object, @NotNull RObject repo) { - Set rv = new HashSet<>(); - if (object.getName() != null) { - rv.add(create(repo, object.getName().getOrig())); - } - if (object.getDescription() != null) { - rv.add(create(repo, object.getDescription())); - } - return rv; + public static Set createItemsSet(@NotNull ObjectType object, @NotNull RObject repo, + @NotNull PrismContext prismContext) { + List allWords = new ArrayList<>(); + append(allWords, object.getName(), prismContext); + append(allWords, object.getDescription(), prismContext); + if (object instanceof UserType) { + UserType user = (UserType) object; + append(allWords, user.getFullName(), prismContext); + append(allWords, user.getGivenName(), prismContext); + append(allWords, user.getFamilyName(), prismContext); + append(allWords, user.getAdditionalName(), prismContext); + append(allWords, user.getEmailAddress(), prismContext); + } else if (object instanceof AbstractRoleType) { + AbstractRoleType role = (AbstractRoleType) object; + append(allWords, role.getDisplayName(), prismContext); + append(allWords, role.getIdentifier(), prismContext); + } + return createItemsSet(repo, allWords); } - private static RObjectTextInfo create(RObject repo, String text) { + private static Set createItemsSet(RObject repo, List allWords) { + Set rv = new HashSet<>(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < allWords.size(); i++) { + String word = allWords.get(i); + if (sb.length() + word.length() + 2 <= MAX_TEXT_SIZE) { + sb.append(" ").append(word); + } else { + if (sb.length() > 0) { + sb.append(" "); + rv.add(new RObjectTextInfo(repo, sb.toString())); + sb = new StringBuilder(); + } else { + // a problem - too large string + LOGGER.warn("Word too long to be correctly indexed: {}", word); + rv.add(new RObjectTextInfo(repo, " " + word.substring(0, MAX_TEXT_SIZE - 2) + " ")); + allWords.set(i, word.substring(MAX_TEXT_SIZE - 2)); + i--; // to reiterate + } + } + } + if (sb.length() > 0) { + sb.append(" "); + rv.add(new RObjectTextInfo(repo, sb.toString())); + } + return rv; + } + + private static void append(List allWords, String text, PrismContext prismContext) { + if (StringUtils.isBlank(text)) { + return; + } + String normalized = prismContext.getDefaultPolyStringNormalizer().normalize(text); + String[] words = StringUtils.split(normalized); + for (String word : words) { + if (StringUtils.isNotBlank(word)) { + allWords.add(word); + } + } + } + + private static void append(List allWords, PolyStringType text, PrismContext prismContext) { + if (text != null) { + append(allWords, text.getOrig(), prismContext); + } + } + + private static RObjectTextInfo create(RObject repo, String text) { RObjectTextInfo rv = new RObjectTextInfo(); rv.setOwner(repo); rv.setText(text); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/resolution/ItemPathResolver.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/resolution/ItemPathResolver.java index 158fec48ad4..73466b1ea83 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/resolution/ItemPathResolver.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/resolution/ItemPathResolver.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.any.RAnyValue; import com.evolveum.midpoint.repo.sql.query.QueryException; import com.evolveum.midpoint.repo.sql.query.definition.VirtualQueryParam; @@ -128,46 +129,14 @@ String addJoin(JpaLinkDefinition joinedItemDefinition, String currentHqlPath) th return joinedItemAlias; } -// String addTextInfoJoin(String currentHqlPath) throws QueryException { -// RootHibernateQuery hibernateQuery = context.getHibernateQuery(); -// String joinedItemJpaName = "textInfoItems"; -// String joinedItemFullPath = currentHqlPath + "." + joinedItemJpaName; -// String joinedItemAlias; -// if (!joinedItemDefinition.isMultivalued()) { -// /* -// * Let's check if we were already here i.e. if we had already created this join. -// * This is to avoid useless creation of redundant joins for singleton items. -// * -// * But how can we be sure that item is singleton if we look only at the last segment (which is single-valued)? -// * Imagine we are creating join for single-valued entity of u.abc.(...).xyz.ent where -// * ent is single-valued and not embedded (so we are to create something like "left join u.abc.(...).xyz.ent e"). -// * Then "u" is certainly a single value: either the root object, or some value pointed to by Exists restriction. -// * Also, abc, ..., xyz are surely single-valued: otherwise they would be connected by a join. So, -// * u.abc.(...).xyz.ent is a singleton. -// * -// * Look at it in other way: if e.g. xyz was multivalued, then we would have something like: -// * left join u.abc.(...).uvw.xyz x -// * left join x.ent e -// * And, therefore we would not be looking for u.abc.(...).xyz.ent. -// */ -// -// JoinSpecification existingJoin = hibernateQuery.getPrimaryEntity().findJoinFor(joinedItemFullPath); -// if (existingJoin != null) { -// // but let's check the condition as well -// String existingAlias = existingJoin.getAlias(); -// // we have to create condition for existing alias, to be matched to existing condition -// Condition conditionForExistingAlias = createJoinCondition(existingAlias, joinedItemDefinition, hibernateQuery); -// if (ObjectUtils.equals(conditionForExistingAlias, existingJoin.getCondition())) { -// LOGGER.trace("Reusing alias '{}' for joined path '{}'", existingAlias, joinedItemFullPath); -// return existingAlias; -// } -// } -// } -// joinedItemAlias = hibernateQuery.createAlias(joinedItemDefinition); -// Condition condition = createJoinCondition(joinedItemAlias, joinedItemDefinition, hibernateQuery); -// hibernateQuery.getPrimaryEntity().addJoin(new JoinSpecification(joinedItemAlias, joinedItemFullPath, condition)); -// return joinedItemAlias; -// } + public String addTextInfoJoin(String currentHqlPath) throws QueryException { + RootHibernateQuery hibernateQuery = context.getHibernateQuery(); + String joinedItemJpaName = RObject.F_TEXT_INFO_ITEMS; + String joinedItemFullPath = currentHqlPath + "." + joinedItemJpaName; + String joinedItemAlias = hibernateQuery.createAlias(joinedItemJpaName, false); + hibernateQuery.getPrimaryEntity().addJoin(new JoinSpecification(joinedItemAlias, joinedItemFullPath, null)); + return joinedItemAlias; + } private Condition createJoinCondition(String joinedItemAlias, JpaLinkDefinition joinedItemDefinition, RootHibernateQuery hibernateQuery) throws QueryException { Condition condition = null; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/FullTextRestriction.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/FullTextRestriction.java index 9894131a63a..304d7c8cc0a 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/FullTextRestriction.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/FullTextRestriction.java @@ -17,10 +17,12 @@ package com.evolveum.midpoint.repo.sql.query2.restriction; import com.evolveum.midpoint.prism.query.FullTextFilter; +import com.evolveum.midpoint.repo.sql.data.common.RObjectTextInfo; import com.evolveum.midpoint.repo.sql.query.QueryException; import com.evolveum.midpoint.repo.sql.query2.InterpretationContext; import com.evolveum.midpoint.repo.sql.query2.definition.JpaEntityDefinition; import com.evolveum.midpoint.repo.sql.query2.hqm.condition.Condition; +import org.apache.commons.lang3.StringUtils; import org.hibernate.criterion.MatchMode; /** @@ -35,15 +37,16 @@ public FullTextRestriction(InterpretationContext context, FullTextFilter filter, @Override public Condition interpret() throws QueryException { - String hqlPath = getBaseHqlEntity().getHqlPath() + "."; + String textInfoItemsAlias = getItemPathResolver().addTextInfoJoin(getBaseHqlEntity().getHqlPath()); + String textPath = textInfoItemsAlias + "." + RObjectTextInfo.F_TEXT; - // TODO implement seriously - hqlPath += "name.norm"; // TODO implement multiple values if (filter.getValues().size() != 1) { throw new QueryException("FullText filter currently supports only a single string"); } String text = filter.getValues().iterator().next(); - return getContext().getHibernateQuery().createLike(hqlPath, text, MatchMode.ANYWHERE, true); + String normalized = getContext().getPrismContext().getDefaultPolyStringNormalizer().normalize(text); + normalized = StringUtils.normalizeSpace(normalized); + return getContext().getHibernateQuery().createLike(textPath, normalized, MatchMode.ANYWHERE, false); } } From f738f38f94abaaea3dab57e2a6a9acdead9acb71 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 24 Feb 2017 09:32:08 +0100 Subject: [PATCH 2/5] Removed artificial index from RObjectTextInfo. --- .../midpoint/repo/sql/SearchTest.java | 9 +++ .../repo/sql/data/common/RObject.java | 7 +- .../repo/sql/data/common/RObjectTextInfo.java | 59 +++++++--------- .../sql/data/common/id/RObjectTextInfoId.java | 68 +++++++++++++++++++ 4 files changed, 104 insertions(+), 39 deletions(-) create mode 100644 repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/id/RObjectTextInfoId.java diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java index 79e2459e079..a6ba8c54459 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java @@ -666,12 +666,21 @@ public void fullTextSearch() throws Exception { + "\t\t\tVestibulum vel pulvinar ligula, vitae rutrum leo. Sed efficitur dignissim augue in placerat. Aliquam dapibus mauris\n" + "\t\t\teget diam pharetra molestie. Morbi vitae nulla sollicitudin, dignissim tellus a, tincidunt neque.\n"; + LOGGER.info("## changing description ##"); repositoryService.modifyObject(UserType.class, users.get(0).getOid(), DeltaBuilder.deltaFor(UserType.class, prismContext) .item(UserType.F_DESCRIPTION).replace(newDescription) .asItemDeltas(), result); + // just to see SQL used + LOGGER.info("## changing telephoneNumber ##"); + repositoryService.modifyObject(UserType.class, users.get(0).getOid(), + DeltaBuilder.deltaFor(UserType.class, prismContext) + .item(UserType.F_TELEPHONE_NUMBER).replace("123456") + .asItemDeltas(), + result); + assertUsersFoundBySearch(QueryBuilder.queryFor(UserType.class, prismContext) .fullText("sollicitudin") .build(), diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java index 1b808a9d8c5..a7f765c14e4 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java @@ -53,12 +53,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; -import org.hibernate.annotations.Cascade; -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.NamedQueries; -import org.hibernate.annotations.NamedQuery; -import org.hibernate.annotations.Persister; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.*; import javax.persistence.Column; import javax.persistence.Embedded; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java index 7ebdade7ef6..67b755288ab 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.common.id.RObjectTextInfoId; import com.evolveum.midpoint.repo.sql.query2.definition.NotQueryable; import com.evolveum.midpoint.repo.sql.util.RUtil; import com.evolveum.midpoint.util.logging.Trace; @@ -40,6 +41,7 @@ * @author mederly */ @Entity +@IdClass(RObjectTextInfoId.class) @Table(name = TABLE_NAME, indexes = { @Index(name = "iTextInfoOid", columnList = COLUMN_OWNER_OID)}) public class RObjectTextInfo implements Serializable { @@ -52,8 +54,6 @@ public class RObjectTextInfo implements Serializable { public static final int MAX_TEXT_SIZE = 255; - private Integer id; - private RObject owner; private String ownerOid; @@ -67,16 +67,6 @@ public RObjectTextInfo(RObject owner, String text) { this.text = text; } - @Id - @GeneratedValue - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - @ForeignKey(name = "fk_reference_owner") @MapsId("owner") @ManyToOne(fetch = FetchType.LAZY) @@ -103,6 +93,8 @@ public void setOwnerOid(String ownerOid) { this.ownerOid = ownerOid; } + @Id + @Column(name = "text", length = MAX_TEXT_SIZE) public String getText() { return text; } @@ -111,23 +103,23 @@ public void setText(String text) { this.text = text; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - RObjectTextInfo that = (RObjectTextInfo) o; - return Objects.equals(owner, that.owner) && - Objects.equals(ownerOid, that.ownerOid) && - Objects.equals(id, that.id) && - Objects.equals(text, that.text); - } + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof RObjectTextInfo)) + return false; + RObjectTextInfo that = (RObjectTextInfo) o; + return Objects.equals(getOwnerOid(), that.getOwnerOid()) && + Objects.equals(getText(), that.getText()); + } - @Override - public int hashCode() { - return Objects.hash(owner, ownerOid, id, text); - } + @Override + public int hashCode() { + return Objects.hash(getOwnerOid(), getText()); + } - public static Set createItemsSet(@NotNull ObjectType object, @NotNull RObject repo, + public static Set createItemsSet(@NotNull ObjectType object, @NotNull RObject repo, @NotNull PrismContext prismContext) { List allWords = new ArrayList<>(); append(allWords, object.getName(), prismContext); @@ -194,10 +186,11 @@ private static void append(List allWords, PolyStringType text, PrismCont } } - private static RObjectTextInfo create(RObject repo, String text) { - RObjectTextInfo rv = new RObjectTextInfo(); - rv.setOwner(repo); - rv.setText(text); - return rv; - } + @Override + public String toString() { + return "RObjectTextInfo{" + + "ownerOid='" + getOwnerOid()+ '\'' + + ", text='" + text + '\'' + + '}'; + } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/id/RObjectTextInfoId.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/id/RObjectTextInfoId.java new file mode 100644 index 00000000000..b63704e3fda --- /dev/null +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/id/RObjectTextInfoId.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2010-2017 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.repo.sql.data.common.id; + +import com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType; + +import java.io.Serializable; +import java.util.Objects; + +/** + * @author mederly + */ +public class RObjectTextInfoId implements Serializable { + + private String ownerOid; + private String text; + + public String getOwnerOid() { + return ownerOid; + } + + public void setOwnerOid(String ownerOid) { + this.ownerOid = ownerOid; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof RObjectTextInfoId)) + return false; + RObjectTextInfoId that = (RObjectTextInfoId) o; + return Objects.equals(ownerOid, that.ownerOid) && + Objects.equals(text, that.text); + } + + @Override + public int hashCode() { + return Objects.hash(ownerOid, text); + } + + @Override + public String toString() { + return "RObjectTextInfoId[" + ownerOid + "," + text + "]"; + } +} From 3d2a40134cc47b8457c044c78bf04e8e7fad0437 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 24 Feb 2017 15:54:32 +0100 Subject: [PATCH 3/5] Configurable indexing for full text search. --- .../common/ProfilingConfigurationManager.java | 16 +-- .../xml/ns/_public/types_3/ObjectType.java | 4 +- .../schema/constants/ObjectTypes.java | 40 +++++-- .../xml/ns/public/common/common-core-3.xsd | 64 ++++++++++- .../SystemConfigurationHandler.java | 24 ++-- .../midpoint/repo/api/RepositoryService.java | 10 +- .../midpoint/repo/cache/RepositoryCache.java | 18 +-- .../midpoint/repo/sql/SearchTest.java | 10 +- .../repo/sql/SqlRepositoryServiceImpl.java | 23 ++-- .../repo/sql/data/RepositoryContext.java | 34 ++++++ .../repo/sql/data/common/RAbstractRole.java | 17 ++- .../common/RAccessCertificationCampaign.java | 11 +- .../RAccessCertificationDefinition.java | 7 +- .../repo/sql/data/common/RConnector.java | 9 +- .../repo/sql/data/common/RConnectorHost.java | 7 +- .../midpoint/repo/sql/data/common/RFocus.java | 20 ++-- .../midpoint/repo/sql/data/common/RForm.java | 5 +- .../repo/sql/data/common/RGenericObject.java | 5 +- .../repo/sql/data/common/RLookupTable.java | 7 +- .../midpoint/repo/sql/data/common/RNode.java | 7 +- .../repo/sql/data/common/RObject.java | 23 ++-- .../sql/data/common/RObjectReference.java | 6 +- .../repo/sql/data/common/RObjectTemplate.java | 9 +- .../repo/sql/data/common/RObjectTextInfo.java | 104 ++++++++++++++---- .../midpoint/repo/sql/data/common/ROrg.java | 7 +- .../repo/sql/data/common/RReport.java | 8 +- .../repo/sql/data/common/RReportOutput.java | 10 +- .../repo/sql/data/common/RResource.java | 14 +-- .../midpoint/repo/sql/data/common/RRole.java | 7 +- .../repo/sql/data/common/RSecurityPolicy.java | 10 +- .../repo/sql/data/common/RSequence.java | 7 +- .../repo/sql/data/common/RService.java | 5 +- .../repo/sql/data/common/RShadow.java | 12 +- .../sql/data/common/RSystemConfiguration.java | 7 +- .../midpoint/repo/sql/data/common/RTask.java | 17 +-- .../midpoint/repo/sql/data/common/RUser.java | 9 +- .../repo/sql/data/common/RValuePolicy.java | 7 +- .../data/common/any/RAssignmentExtension.java | 10 +- .../container/RAccessCertificationCase.java | 28 ++--- .../RAccessCertificationDecision.java | 10 +- .../data/common/container/RAssignment.java | 18 +-- .../common/container/RCertCaseReference.java | 2 +- .../common/container/RContainerReference.java | 2 +- .../sql/data/common/container/RExclusion.java | 7 +- .../sql/data/common/container/RTrigger.java | 3 +- .../sql/data/common/embedded/RActivation.java | 3 +- .../embedded/REmbeddedNamedReference.java | 4 +- .../common/embedded/REmbeddedReference.java | 2 +- .../common/embedded/ROperationalState.java | 2 +- .../sql/data/factory/MetadataFactory.java | 2 +- .../sql/helpers/CertificationCaseHelper.java | 30 ++--- .../repo/sql/helpers/ObjectUpdater.java | 5 +- .../midpoint/repo/sql/util/RUtil.java | 10 +- .../quartzimpl/cluster/ClusterManager.java | 34 +++--- 54 files changed, 493 insertions(+), 279 deletions(-) create mode 100644 repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/RepositoryContext.java diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/ProfilingConfigurationManager.java b/infra/common/src/main/java/com/evolveum/midpoint/common/ProfilingConfigurationManager.java index a10dcb37cfb..e77e0b9654d 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/ProfilingConfigurationManager.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/ProfilingConfigurationManager.java @@ -37,7 +37,7 @@ public class ProfilingConfigurationManager { private static final String APPENDER_IDM_PROFILE = "IDM-PROFILE_LOG"; /** - * In this method, we perform the check of systemConfiguration object, searching for any changes + * In this method, we perform the check of systemConfiguration object, searching for any data * related to profilingConfiguration * */ public static LoggingConfigurationType checkSystemProfilingConfiguration(PrismObject systemConfigurationPrism){ @@ -48,9 +48,9 @@ public static LoggingConfigurationType checkSystemProfilingConfiguration(PrismOb ProfilingConfigurationType profilingConfig = systemConfig.getProfilingConfiguration(); boolean isSubsystemConfig; - if(profilingConfig == null || !profilingConfig.isEnabled()) + if (profilingConfig == null || !profilingConfig.isEnabled()) { return systemConfig.getLogging(); - else{ + } else { isSubsystemConfig = applySubsystemProfiling(systemConfig); return applyProfilingConfiguration(systemConfigurationPrism, profilingConfig, isSubsystemConfig); } @@ -61,8 +61,8 @@ private static LoggingConfigurationType applyProfilingConfiguration(PrismObject< LoggingConfigurationType loggingConfig = systemConfig.getLogging(); - if(loggingConfig != null){ - if(checkXsdBooleanValue(profilingConfig.isRequestFilter())){ + if (loggingConfig != null) { + if (checkXsdBooleanValue(profilingConfig.isRequestFilter())) { ClassLoggerConfigurationType requestFilterLogger = new ClassLoggerConfigurationType(); requestFilterLogger.setPackage(REQUEST_FILTER_LOGGER_CLASS_NAME); requestFilterLogger.setLevel(LoggingLevelType.TRACE); @@ -71,7 +71,7 @@ private static LoggingConfigurationType applyProfilingConfiguration(PrismObject< loggingConfig.getClassLogger().add(requestFilterLogger); } - if(subsystemProfiling){ + if (subsystemProfiling) { ClassLoggerConfigurationType subsystemLogger = new ClassLoggerConfigurationType(); subsystemLogger.setPackage(SUBSYSTEM_PROFILING_LOGGER); subsystemLogger.setLevel(LoggingLevelType.DEBUG); @@ -83,10 +83,10 @@ private static LoggingConfigurationType applyProfilingConfiguration(PrismObject< } LOGGER.info("Applying profiling configuration."); - return loggingConfig; + return loggingConfig; } - private static boolean applySubsystemProfiling(SystemConfigurationType systemConfig){ + private static boolean applySubsystemProfiling(SystemConfigurationType systemConfig) { ProfilingConfigurationType profilingConfig = systemConfig.getProfilingConfiguration(); Map profiledSubsystems = new HashMap<>(); diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ObjectType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ObjectType.java index e3d37e76bab..e9fb87ecb91 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ObjectType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ObjectType.java @@ -34,9 +34,7 @@ @XmlType(name = "ObjectType", propOrder = { }) -public class ObjectType{ - - +public class ObjectType { public PrismObject asPrismObject(){ return null; } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/ObjectTypes.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/ObjectTypes.java index e07dcf38d8d..13f7af9c09c 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/ObjectTypes.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/ObjectTypes.java @@ -20,13 +20,11 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.xml.namespace.QName; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.ResourceBundle; +import java.util.*; /** * @author lazyman @@ -101,8 +99,22 @@ public enum ObjectTypes { // this should be at end, because otherwise it presents itself as entry for all subtypes of ObjectType OBJECT(SchemaConstants.C_OBJECT_TYPE, SchemaConstants.C_OBJECT, ObjectType.class, ObjectManager.MODEL, "objects"); - - public static enum ObjectManager { + + public List thisAndSupertypes() { + List rv = new ArrayList<>(); + rv.add(this); + ObjectTypes superType = superType(); + if (superType != null) { + rv.addAll(superType.thisAndSupertypes()); + } + return rv; + } + + public ObjectTypes superType() { + return getObjectTypeIfKnown(classDefinition.getSuperclass()); + } + + public static enum ObjectManager { PROVISIONING, TASK_MANAGER, MODEL, WORKFLOW, REPOSITORY; } @@ -217,7 +229,16 @@ public static Class getObjectTypeClass(String objectType) } @SuppressWarnings("unchecked") + @NotNull public static ObjectTypes getObjectType(Class objectType) { + ObjectTypes rv = getObjectTypeIfKnown(objectType); + if (rv == null) { + throw new IllegalArgumentException("Unsupported object type " + objectType); + } + return rv; + } + + public static ObjectTypes getObjectTypeIfKnown(Class objectType) { for (ObjectTypes type : values()) { if (type.getClassDefinition().equals(objectType)) { return type; @@ -225,11 +246,10 @@ public static ObjectTypes getObjectType(Class objectType) } // No match. Try with superclass. Class superclass = objectType.getSuperclass(); - if (superclass != null && !superclass.equals(ObjectType.class)) { - return getObjectType((Class) superclass); + if (superclass != null) { + return getObjectTypeIfKnown(superclass); } - - throw new IllegalArgumentException("Unsupported object type " + objectType); + return null; } public static boolean isManagedByProvisioning(ObjectType object) { diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index c97c416b106..e233af7d832 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -9921,13 +9921,75 @@ + + + + Configuration of the full text search feature. + + + 3.6 + + + + - + + + + Configuration of the full text search feature. + + + 3.6 + + + + + + + Whether full text search indexing is enabled. The default is true, if there are any indexed entries defined. + (This property is to allow temporary disabling existing configuration.) + + + + + + + + + + + + What items to index. + + + 3.6 + + + + + + + To what object type(s) should this entry be applied. + Empty list means "all object types". + + + + + + + What items to index for the given object type(s). + + + + + + + Various internals configuration elements. diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java index 840222a204f..3bf74905dba 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java @@ -58,14 +58,14 @@ public class SystemConfigurationHandler implements ChangeHook { public static final String HOOK_URI = "http://midpoint.evolveum.com/model/sysconfig-hook-1"; - @Autowired(required = true) + @Autowired private HookRegistry hookRegistry; - @Autowired(required = true) + @Autowired @Qualifier("cacheRepositoryService") private transient RepositoryService cacheRepositoryService; - @Autowired(required = true) + @Autowired private MidpointConfiguration startupConfiguration; @PostConstruct @@ -77,19 +77,15 @@ public void postInit(PrismObject systemConfiguration, O SystemConfigurationHolder.setCurrentConfiguration(systemConfiguration.asObjectable()); Configuration systemConfigFromFile = startupConfiguration.getConfiguration(MidpointConfiguration.SYSTEM_CONFIGURATION_SECTION); - boolean skip = false; - if (systemConfigFromFile != null) { - skip = systemConfigFromFile.getBoolean(LoggingConfigurationManager.SYSTEM_CONFIGURATION_SKIP_REPOSITORY_LOGGING_SETTINGS, false); - } - if (skip) { + if (systemConfigFromFile != null && systemConfigFromFile + .getBoolean(LoggingConfigurationManager.SYSTEM_CONFIGURATION_SKIP_REPOSITORY_LOGGING_SETTINGS, false)) { LOGGER.warn("Skipping application of repository logging configuration because {}=true", LoggingConfigurationManager.SYSTEM_CONFIGURATION_SKIP_REPOSITORY_LOGGING_SETTINGS); } else { LoggingConfigurationType loggingConfig = ProfilingConfigurationManager.checkSystemProfilingConfiguration(systemConfiguration); - if (loggingConfig != null) { - applyLoggingConfiguration(loggingConfig, systemConfiguration.asObjectable().getVersion(), parentResult); - //applyLoggingConfiguration(systemConfiguration.asObjectable().getLogging(), systemConfiguration.asObjectable().getVersion(), parentResult); - } + applyLoggingConfiguration(loggingConfig, systemConfiguration.asObjectable().getVersion(), parentResult); } + + cacheRepositoryService.applyFullTextSearchConfiguration(systemConfiguration.asObjectable().getFullTextSearch()); } private void applyLoggingConfiguration(LoggingConfigurationType loggingConfig, String version, OperationResult parentResult) { @@ -152,8 +148,10 @@ public HookOperationMode invoke(@NotNull ModelContext SystemConfigurationHolder.setCurrentConfiguration(config.asObjectable()); - //ProfilingConfigurationManager.checkSystemProfilingConfiguration(config); applyLoggingConfiguration(ProfilingConfigurationManager.checkSystemProfilingConfiguration(config), config.asObjectable().getVersion(), result); + + cacheRepositoryService.applyFullTextSearchConfiguration(config.asObjectable().getFullTextSearch()); + result.recordSuccessIfUnknown(); } catch (ObjectNotFoundException e) { diff --git a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java index 9b04f9f958c..97cbe489b5f 100644 --- a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java +++ b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java @@ -28,11 +28,7 @@ import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSelectorType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import javax.xml.namespace.QName; @@ -605,4 +601,8 @@ boolean selectorMatches(ObjectSelectorType objectSelector * on PolyString), the result may be arbitrary. TODO think again also about this */ QName getApproximateSupportedMatchingRule(Class dataType, QName originalMatchingRule); + + void applyFullTextSearchConfiguration(FullTextSearchConfigurationType fullTextSearch); + + FullTextSearchConfigurationType getFullTextSearchConfiguration(); } diff --git a/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java index 0449d1bd717..2f792b618d0 100644 --- a/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java +++ b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java @@ -30,13 +30,7 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSelectorType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SequenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.Validate; @@ -442,4 +436,14 @@ public RepositoryQueryDiagResponse executeQueryDiagnostics(RepositoryQueryDiagRe public QName getApproximateSupportedMatchingRule(Class dataType, QName originalMatchingRule) { return repository.getApproximateSupportedMatchingRule(dataType, originalMatchingRule); } + + @Override + public void applyFullTextSearchConfiguration(FullTextSearchConfigurationType fullTextSearch) { + repository.applyFullTextSearchConfiguration(fullTextSearch); + } + + @Override + public FullTextSearchConfigurationType getFullTextSearchConfiguration() { + return repository.getFullTextSearchConfiguration(); + } } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java index a6ba8c54459..8d770b3aca1 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java @@ -64,7 +64,15 @@ public void beforeClass() throws Exception { PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); - List> objects = prismContext.parserFor(new File(FOLDER_BASIC, "objects.xml")).parseObjects(); + FullTextSearchConfigurationType fullTextConfig = new FullTextSearchConfigurationType(); + FullTextSearchIndexedItemsConfigurationType entry = new FullTextSearchIndexedItemsConfigurationType(); + entry.getItem().add(new ItemPath(ObjectType.F_NAME).asItemPathType()); + entry.getItem().add(new ItemPath(ObjectType.F_DESCRIPTION).asItemPathType()); + fullTextConfig.getIndexed().add(entry); + repositoryService.applyFullTextSearchConfiguration(fullTextConfig); + LOGGER.info("Applying full text search configuration: {}", fullTextConfig); + + List> objects = prismContext.parserFor(new File(FOLDER_BASIC, "objects.xml")).parseObjects(); objects.addAll(prismContext.parserFor(new File(FOLDER_BASIC, "objects-2.xml")).parseObjects()); OperationResult result = new OperationResult("add objects"); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java index 26afe274eed..f50b19a3ef7 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java @@ -52,12 +52,7 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSelectorType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.apache.commons.lang.Validate; @@ -121,9 +116,11 @@ public class SqlRepositoryServiceImpl extends SqlBaseService implements Reposito @Autowired private BaseHelper baseHelper; - @Autowired(required = true) + @Autowired private MatchingRuleRegistry matchingRuleRegistry; + private FullTextSearchConfigurationType fullTextSearchConfiguration; + public SqlRepositoryServiceImpl(SqlRepositoryFactory repositoryFactory) { super(repositoryFactory); } @@ -1003,4 +1000,16 @@ public QName getApproximateSupportedMatchingRule(Class dataType, QName origin return DefaultMatcher.getApproximateSupportedMatchingRule(originalMatchingRule); } } + + @Override + public void applyFullTextSearchConfiguration(FullTextSearchConfigurationType fullTextSearch) { + LOGGER.info("Applying full text search configuration ({} entries)", + fullTextSearch != null ? fullTextSearch.getIndexed().size() : 0); + fullTextSearchConfiguration = fullTextSearch; + } + + @Override + public FullTextSearchConfigurationType getFullTextSearchConfiguration() { + return fullTextSearchConfiguration; + } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/RepositoryContext.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/RepositoryContext.java new file mode 100644 index 00000000000..9ea5022e706 --- /dev/null +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/RepositoryContext.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2010-2017 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.repo.sql.data; + +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.api.RepositoryService; +import org.jetbrains.annotations.NotNull; + +/** + * @author mederly + */ +public class RepositoryContext { + @NotNull public final RepositoryService repositoryService; + @NotNull public final PrismContext prismContext; + + public RepositoryContext(@NotNull RepositoryService repositoryService, @NotNull PrismContext prismContext) { + this.repositoryService = repositoryService; + this.prismContext = prismContext; + } +} diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAbstractRole.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAbstractRole.java index e8e71a7e58d..fea20abbbca 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAbstractRole.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAbstractRole.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.repo.sql.data.common; -import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.container.RAssignment; import com.evolveum.midpoint.repo.sql.data.common.container.RExclusion; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; @@ -194,11 +194,10 @@ public int hashCode() { } public static void copyFromJAXB(AbstractRoleType jaxb, RAbstractRole repo, - PrismContext prismContext, - IdGeneratorResult generatorResult) - throws DtoTranslationException { + RepositoryContext repositoryContext, IdGeneratorResult generatorResult) + throws DtoTranslationException { - RFocus.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + RFocus.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setRequestable(jaxb.isRequestable()); repo.setDisplayName(RPolyString.copyFromJAXB(jaxb.getDisplayName())); @@ -207,20 +206,20 @@ public static void copyFromJAXB(AbstractRoleType ja for (AssignmentType inducement : jaxb.getInducement()) { RAssignment rInducement = new RAssignment(repo, RAssignmentOwner.ABSTRACT_ROLE); - RAssignment.copyFromJAXB(inducement, rInducement, jaxb, prismContext, generatorResult); + RAssignment.copyFromJAXB(inducement, rInducement, jaxb, repositoryContext, generatorResult); repo.getAssignments().add(rInducement); } for (ExclusionPolicyConstraintType exclusion : jaxb.getExclusion()) { RExclusion rExclusion = new RExclusion(repo); - RExclusion.copyFromJAXB(exclusion, rExclusion, jaxb, prismContext, generatorResult); + RExclusion.copyFromJAXB(exclusion, rExclusion, jaxb, repositoryContext, generatorResult); repo.getExclusion().add(rExclusion); } for (ObjectReferenceType approverRef : jaxb.getApproverRef()) { - RObjectReference ref = RUtil.jaxbRefToRepo(approverRef, prismContext, repo, RReferenceOwner.ROLE_APPROVER); + RObjectReference ref = RUtil.jaxbRefToRepo(approverRef, repositoryContext.prismContext, repo, RReferenceOwner.ROLE_APPROVER); if (ref != null) { repo.getApproverRef().add(ref); } @@ -230,6 +229,6 @@ public static void copyFromJAXB(AbstractRoleType ja repo.setApprovalProcess(jaxb.getApprovalProcess()); - repo.setOwnerRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), prismContext)); + repo.setOwnerRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.prismContext)); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationCampaign.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationCampaign.java index 7e467110200..04af9171fb8 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationCampaign.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationCampaign.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.container.RAccessCertificationCase; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; @@ -182,24 +183,24 @@ public int hashCode() { } public static void copyFromJAXB(AccessCertificationCampaignType jaxb, RAccessCertificationCampaign repo, - PrismContext prismContext, IdGeneratorResult generatorResult) + RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); - repo.setDefinitionRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getDefinitionRef(), prismContext)); + repo.setDefinitionRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getDefinitionRef(), repositoryContext.prismContext)); List cases = jaxb.getCase(); if (!cases.isEmpty()) { for (AccessCertificationCaseType case1 : cases) { case1.setCampaignRef(ObjectTypeUtil.createObjectRef(jaxb)); - RAccessCertificationCase rCase = RAccessCertificationCase.toRepo(repo, case1, prismContext); + RAccessCertificationCase rCase = RAccessCertificationCase.toRepo(repo, case1, repositoryContext); rCase.setTransient(generatorResult.isTransient(case1.asPrismContainerValue())); // redundant? repo.getCase().add(rCase); } } - repo.setOwnerRefCampaign(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), prismContext)); + repo.setOwnerRefCampaign(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.prismContext)); repo.setHandlerUri(jaxb.getHandlerUri()); repo.setStart(jaxb.getStart()); repo.setEnd(jaxb.getEnd()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationDefinition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationDefinition.java index 43ae82d855c..32d2d3cd04e 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationDefinition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationDefinition.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.query.definition.JaxbName; @@ -135,14 +136,14 @@ public int hashCode() { } public static void copyFromJAXB(AccessCertificationDefinitionType jaxb, RAccessCertificationDefinition repo, - PrismContext prismContext, IdGeneratorResult generatorResult) + RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); repo.setHandlerUri(jaxb.getHandlerUri()); - repo.setOwnerRefDefinition(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), prismContext)); + repo.setOwnerRefDefinition(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.prismContext)); repo.setLastCampaignStartedTimestamp(jaxb.getLastCampaignStartedTimestamp()); repo.setLastCampaignClosedTimestamp(jaxb.getLastCampaignClosedTimestamp()); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnector.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnector.java index d351a0af52e..0ad4f00d6a9 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnector.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnector.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; @@ -153,16 +154,16 @@ public int hashCode() { return result; } - public static void copyFromJAXB(ConnectorType jaxb, RConnector repo, PrismContext prismContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + public static void copyFromJAXB(ConnectorType jaxb, RConnector repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); repo.setConnectorBundle(jaxb.getConnectorBundle()); repo.setConnectorType(jaxb.getConnectorType()); repo.setConnectorVersion(jaxb.getConnectorVersion()); repo.setFramework(jaxb.getFramework()); - repo.setConnectorHostRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConnectorHostRef(), prismContext)); + repo.setConnectorHostRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConnectorHostRef(), repositoryContext.prismContext)); if (jaxb.getConnectorHost() != null) { LOGGER.warn("Connector host from connector type won't be saved. It should be " + diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnectorHost.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnectorHost.java index fe998a7272c..ad30f7ff145 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnectorHost.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnectorHost.java @@ -18,6 +18,7 @@ import java.util.Collection; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; import com.evolveum.midpoint.repo.sql.util.MidPointJoinedPersister; import org.hibernate.annotations.Persister; @@ -99,9 +100,9 @@ public int hashCode() { return result; } - public static void copyFromJAXB(ConnectorHostType jaxb, RConnectorHost repo, PrismContext prismContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + public static void copyFromJAXB(ConnectorHostType jaxb, RConnectorHost repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); repo.setHostname(jaxb.getHostname()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFocus.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFocus.java index 529cb0b7752..94c749f571f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFocus.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFocus.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.repo.sql.data.common; -import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.container.RAssignment; import com.evolveum.midpoint.repo.sql.data.common.embedded.RActivation; import com.evolveum.midpoint.repo.sql.data.common.other.RAssignmentOwner; @@ -33,10 +33,8 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import org.hibernate.annotations.*; -import org.hibernate.annotations.CascadeType; import org.hibernate.annotations.ForeignKey; import org.hibernate.annotations.Index; -import org.hibernate.annotations.Table; import javax.persistence.*; import javax.persistence.Entity; @@ -202,32 +200,32 @@ public int hashCode() { return result; } - public static void copyFromJAXB(FocusType jaxb, RFocus repo, PrismContext prismContext, - IdGeneratorResult generatorResult) + public static void copyFromJAXB(FocusType jaxb, RFocus repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.getLinkRef().addAll( - RUtil.safeListReferenceToSet(jaxb.getLinkRef(), prismContext, repo, RReferenceOwner.USER_ACCOUNT)); + RUtil.safeListReferenceToSet(jaxb.getLinkRef(), repositoryContext.prismContext, repo, RReferenceOwner.USER_ACCOUNT)); repo.getRoleMembershipRef().addAll( - RUtil.safeListReferenceToSet(jaxb.getRoleMembershipRef(), prismContext, repo, RReferenceOwner.ROLE_MEMBER)); + RUtil.safeListReferenceToSet(jaxb.getRoleMembershipRef(), repositoryContext.prismContext, repo, RReferenceOwner.ROLE_MEMBER)); repo.getDelegatedRef().addAll( - RUtil.safeListReferenceToSet(jaxb.getDelegatedRef(), prismContext, repo, RReferenceOwner.DELEGATED)); + RUtil.safeListReferenceToSet(jaxb.getDelegatedRef(), repositoryContext.prismContext, repo, RReferenceOwner.DELEGATED)); repo.setPolicySituation(RUtil.listToSet(jaxb.getPolicySituation())); for (AssignmentType assignment : jaxb.getAssignment()) { RAssignment rAssignment = new RAssignment(repo, RAssignmentOwner.FOCUS); - RAssignment.copyFromJAXB(assignment, rAssignment, jaxb, prismContext, generatorResult); + RAssignment.copyFromJAXB(assignment, rAssignment, jaxb, repositoryContext, generatorResult); repo.getAssignments().add(rAssignment); } if (jaxb.getActivation() != null) { RActivation activation = new RActivation(); - RActivation.copyFromJAXB(jaxb.getActivation(), activation, prismContext); + RActivation.copyFromJAXB(jaxb.getActivation(), activation, repositoryContext); repo.setActivation(activation); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RForm.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RForm.java index a93a3134e97..3b925672e7d 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RForm.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RForm.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; @@ -72,9 +73,9 @@ public int hashCode() { return Objects.hash(super.hashCode(), name); } - public static void copyFromJAXB(FormType jaxb, RForm repo, PrismContext prismContext, + public static void copyFromJAXB(FormType jaxb, RForm repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RGenericObject.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RGenericObject.java index 801799bab03..2060c1cb8dc 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RGenericObject.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RGenericObject.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; @@ -85,9 +86,9 @@ public int hashCode() { return result; } - public static void copyFromJAXB(GenericObjectType jaxb, RGenericObject repo, PrismContext prismContext, + public static void copyFromJAXB(GenericObjectType jaxb, RGenericObject repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); repo.setObjectType(jaxb.getObjectType()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RLookupTable.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RLookupTable.java index af4a6eb873b..b7e7fbd21aa 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RLookupTable.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RLookupTable.java @@ -1,6 +1,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.data.common.other.RLookupTableRow; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; @@ -50,15 +51,15 @@ public void setName(RPolyString name) { this.name = name; } - public static void copyFromJAXB(LookupTableType jaxb, RLookupTable repo, PrismContext prismContext, + public static void copyFromJAXB(LookupTableType jaxb, RLookupTable repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException, SchemaException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); List rows = jaxb.getRow(); if (!rows.isEmpty()) { - repo.setRows(new HashSet()); + repo.setRows(new HashSet<>()); for (LookupTableRowType row : rows) { RLookupTableRow rRow = RLookupTableRow.toRepo(repo, row); rRow.setTransient(generatorResult.isTransient(row.asPrismContainerValue())); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RNode.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RNode.java index 82dd4a7f258..f59324669f8 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RNode.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RNode.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; @@ -85,9 +86,9 @@ public int hashCode() { return result; } - public static void copyFromJAXB(NodeType jaxb, RNode repo, PrismContext prismContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + public static void copyFromJAXB(NodeType jaxb, RNode repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); repo.setNodeIdentifier(jaxb.getNodeIdentifier()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java index a7f765c14e4..d2c44327226 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.any.RAnyConverter; import com.evolveum.midpoint.repo.sql.data.common.any.RAnyValue; import com.evolveum.midpoint.repo.sql.data.common.any.ROExtBoolean; @@ -653,8 +654,8 @@ protected static void copyToJAXB(RObject repo, ObjectT } } - public static void copyFromJAXB(ObjectType jaxb, RObject repo, PrismContext prismContext, - IdGeneratorResult generatorResult) + public static void copyFromJAXB(ObjectType jaxb, RObject repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { Validate.notNull(jaxb, "JAXB object must not be null."); Validate.notNull(repo, "Repo object must not be null."); @@ -671,24 +672,24 @@ public static void copyFromJAXB(ObjectType jaxb, RObject< .getVersion()) : 0; repo.setVersion(version); - repo.getParentOrgRef().addAll(RUtil.safeListReferenceToSet(jaxb.getParentOrgRef(), prismContext, + repo.getParentOrgRef().addAll(RUtil.safeListReferenceToSet(jaxb.getParentOrgRef(), repositoryContext.prismContext, repo, RReferenceOwner.OBJECT_PARENT_ORG)); for (TriggerType trigger : jaxb.getTrigger()) { RTrigger rTrigger = new RTrigger(null); - RTrigger.copyFromJAXB(trigger, rTrigger, jaxb, prismContext, generatorResult); + RTrigger.copyFromJAXB(trigger, rTrigger, jaxb, repositoryContext, generatorResult); repo.getTrigger().add(rTrigger); } - MetadataFactory.fromJAXB(jaxb.getMetadata(), repo, prismContext); - repo.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTenantRef(), prismContext)); + MetadataFactory.fromJAXB(jaxb.getMetadata(), repo, repositoryContext.prismContext); + repo.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTenantRef(), repositoryContext.prismContext)); if (jaxb.getExtension() != null) { - copyFromJAXB(jaxb.getExtension().asPrismContainerValue(), repo, prismContext, RObjectExtensionType.EXTENSION); + copyFromJAXB(jaxb.getExtension().asPrismContainerValue(), repo, repositoryContext, RObjectExtensionType.EXTENSION); } - repo.getTextInfoItems().addAll(RObjectTextInfo.createItemsSet(jaxb, repo, prismContext)); + repo.getTextInfoItems().addAll(RObjectTextInfo.createItemsSet(jaxb, repo, repositoryContext)); } @Deprecated @@ -700,9 +701,9 @@ public String toString() { return RUtil.getDebugString(this); } - public static void copyFromJAXB(PrismContainerValue containerValue, RObject repo, PrismContext prismContext, - RObjectExtensionType ownerType) throws DtoTranslationException { - RAnyConverter converter = new RAnyConverter(prismContext); + public static void copyFromJAXB(PrismContainerValue containerValue, RObject repo, RepositoryContext repositoryContext, + RObjectExtensionType ownerType) throws DtoTranslationException { + RAnyConverter converter = new RAnyConverter(repositoryContext.prismContext); Set values = new HashSet(); try { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectReference.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectReference.java index 746584ccdf5..b14c12ee8d7 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectReference.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectReference.java @@ -178,7 +178,7 @@ public int hashCode() { return result; } - public static void copyToJAXB(RObjectReference repo, ObjectReferenceType jaxb, PrismContext prismContext) { + public static void copyToJAXB(RObjectReference repo, ObjectReferenceType jaxb) { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); @@ -187,7 +187,7 @@ public static void copyToJAXB(RObjectReference repo, ObjectReferenceType jaxb, P jaxb.setRelation(RUtil.stringToQName(repo.getRelation())); } - public static void copyFromJAXB(ObjectReferenceType jaxb, RObjectReference repo, PrismContext prismContext) { + public static void copyFromJAXB(ObjectReferenceType jaxb, RObjectReference repo) { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); Validate.notEmpty(jaxb.getOid(), "Target oid must not be null."); @@ -200,7 +200,7 @@ public static void copyFromJAXB(ObjectReferenceType jaxb, RObjectReference repo, public ObjectReferenceType toJAXB(PrismContext prismContext) { ObjectReferenceType ref = new ObjectReferenceType(); - copyToJAXB(this, ref, prismContext); + copyToJAXB(this, ref); return ref; } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTemplate.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTemplate.java index 966123fe975..1f88cdacac5 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTemplate.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTemplate.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.data.common.enums.RObjectTemplateType; import com.evolveum.midpoint.repo.sql.data.common.other.RReferenceOwner; @@ -109,15 +110,15 @@ public int hashCode() { return result; } - public static void copyFromJAXB(ObjectTemplateType jaxb, RObjectTemplate repo, PrismContext prismContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + public static void copyFromJAXB(ObjectTemplateType jaxb, RObjectTemplate repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setType(RUtil.getRepoEnumValue(jaxb.asPrismObject().getElementName(), RObjectTemplateType.class)); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); repo.getIncludeRef().addAll(RUtil.safeListReferenceToSet( - jaxb.getIncludeRef(), prismContext, repo, RReferenceOwner.INCLUDE)); + jaxb.getIncludeRef(), repositoryContext.prismContext, repo, RReferenceOwner.INCLUDE)); } @Override diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java index 67b755288ab..ad9c9c049f5 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java @@ -16,23 +16,32 @@ package com.evolveum.midpoint.repo.sql.data.common; +import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.id.RObjectTextInfoId; import com.evolveum.midpoint.repo.sql.query2.definition.NotQueryable; import com.evolveum.midpoint.repo.sql.util.RUtil; +import com.evolveum.midpoint.schema.constants.ObjectTypes; +import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import org.apache.commons.lang3.StringUtils; import org.hibernate.annotations.ForeignKey; import org.jetbrains.annotations.NotNull; import javax.persistence.*; +import javax.xml.namespace.QName; import java.io.Serializable; import java.util.*; +import java.util.Objects; +import java.util.stream.Collectors; import static com.evolveum.midpoint.repo.sql.data.common.RObjectTextInfo.COLUMN_OWNER_OID; import static com.evolveum.midpoint.repo.sql.data.common.RObjectTextInfo.TABLE_NAME; @@ -120,25 +129,78 @@ public int hashCode() { } public static Set createItemsSet(@NotNull ObjectType object, @NotNull RObject repo, - @NotNull PrismContext prismContext) { - List allWords = new ArrayList<>(); - append(allWords, object.getName(), prismContext); - append(allWords, object.getDescription(), prismContext); - if (object instanceof UserType) { - UserType user = (UserType) object; - append(allWords, user.getFullName(), prismContext); - append(allWords, user.getGivenName(), prismContext); - append(allWords, user.getFamilyName(), prismContext); - append(allWords, user.getAdditionalName(), prismContext); - append(allWords, user.getEmailAddress(), prismContext); - } else if (object instanceof AbstractRoleType) { - AbstractRoleType role = (AbstractRoleType) object; - append(allWords, role.getDisplayName(), prismContext); - append(allWords, role.getIdentifier(), prismContext); + @NotNull RepositoryContext repositoryContext) { + + FullTextSearchConfigurationType config = repositoryContext.repositoryService.getFullTextSearchConfiguration(); + if (config == null || config.getIndexed().isEmpty() || Boolean.FALSE.equals(config.isEnabled())) { + return Collections.emptySet(); + } + List types = + ObjectTypes.getObjectType(object.getClass()).thisAndSupertypes().stream() + .map(ot -> ot.getTypeQName()) + .collect(Collectors.toList()); + Set paths = new HashSet<>(); + for (FullTextSearchIndexedItemsConfigurationType indexed : config.getIndexed()) { + if (isApplicable(indexed, types)) { + for (ItemPathType itemPathType : indexed.getItem()) { + ItemPath path = itemPathType.getItemPath(); + if (path.isEmpty()) { + LOGGER.debug("Empty path in full time index configuration; skipping."); + } else if (!ItemPath.containsEquivalent(paths, path)) { + paths.add(path); + } + } + } + } + + List values = new ArrayList<>(); + for (ItemPath path : paths) { + Object o = object.asPrismObject().find(path); + if (o == null) { + // shouldn't occur + } else if (o instanceof PrismValue) { + values.add((PrismValue) o); + } else if (o instanceof Item) { + values.addAll(((Item) o).getValues()); + } else { + throw new IllegalStateException("Unexpected value " + o + " in " + object + " at " + path); + } + } + + List allWords = new ArrayList<>(); + for (PrismValue value : values) { + if (value == null) { + continue; + } + if (value instanceof PrismPropertyValue) { + Object realValue = value.getRealValue(); + if (realValue == null) { + // skip + } else if (realValue instanceof String) { + append(allWords, (String) realValue, repositoryContext.prismContext); + } else if (realValue instanceof PolyString) { + append(allWords, (PolyString) realValue, repositoryContext.prismContext); + } else { + append(allWords, realValue.toString(), repositoryContext.prismContext); + } + } } - return createItemsSet(repo, allWords); + LOGGER.trace("Indexing {}:\n items: {}\n values: {}\n words: {}", object, paths, values, allWords); + return createItemsSet(repo, allWords); } + private static boolean isApplicable(FullTextSearchIndexedItemsConfigurationType indexed, List types) { + if (indexed.getObjectType().isEmpty()) { + return true; + } + for (QName type : types) { + if (QNameUtil.matchAny(type, indexed.getObjectType())) { + return true; + } + } + return false; + } + private static Set createItemsSet(RObject repo, List allWords) { Set rv = new HashSet<>(); StringBuilder sb = new StringBuilder(); @@ -180,7 +242,7 @@ private static void append(List allWords, String text, PrismContext pris } } - private static void append(List allWords, PolyStringType text, PrismContext prismContext) { + private static void append(List allWords, PolyString text, PrismContext prismContext) { if (text != null) { append(allWords, text.getOrig(), prismContext); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/ROrg.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/ROrg.java index 025f3b919f2..2c1accf30bb 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/ROrg.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/ROrg.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; @@ -135,9 +136,9 @@ public int hashCode() { return result; } - public static void copyFromJAXB(OrgType jaxb, ROrg repo, PrismContext prismContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { - RAbstractRole.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + public static void copyFromJAXB(OrgType jaxb, ROrg repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RAbstractRole.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); repo.setCostCenter(jaxb.getCostCenter()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReport.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReport.java index 919de8e669f..8b89aff74a5 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReport.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReport.java @@ -1,6 +1,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.data.common.enums.RExportType; import com.evolveum.midpoint.repo.sql.data.common.enums.ROrientationType; @@ -111,11 +112,10 @@ public int hashCode() { return result; } - public static void copyFromJAXB(ReportType jaxb, RReport repo, PrismContext prismContext, - IdGeneratorResult generatorResult) - throws DtoTranslationException { + public static void copyFromJAXB(ReportType jaxb, RReport repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); repo.setOrientation(RUtil.getRepoEnumValue(jaxb.getOrientation(), ROrientationType.class)); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReportOutput.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReportOutput.java index e0109b5cef3..3e9f79c7f5f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReportOutput.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReportOutput.java @@ -2,6 +2,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; @@ -71,13 +72,12 @@ public int hashCode() { return result; } - public static void copyFromJAXB(ReportOutputType jaxb, RReportOutput repo, PrismContext prismContext, - IdGeneratorResult generatorResult) throws - DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + public static void copyFromJAXB(ReportOutputType jaxb, RReportOutput repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); - repo.setReportRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getReportRef(), prismContext)); + repo.setReportRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getReportRef(), repositoryContext.prismContext)); } @Override diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RResource.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RResource.java index bec0a3255be..bae579b272e 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RResource.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RResource.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.embedded.ROperationalState; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; @@ -139,13 +140,12 @@ public int hashCode() { return result; } - public static void copyFromJAXB(ResourceType jaxb, RResource repo, PrismContext prismContext, - IdGeneratorResult generatorResult) - throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + public static void copyFromJAXB(ResourceType jaxb, RResource repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); - repo.setConnectorRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConnectorRef(), prismContext)); + repo.setConnectorRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConnectorRef(), repositoryContext.prismContext)); if (jaxb.getConnector() != null) { LOGGER.warn("Connector from resource type won't be saved. It should be translated to connector reference."); @@ -155,13 +155,13 @@ public static void copyFromJAXB(ResourceType jaxb, RResource repo, PrismContext if (jaxb.getBusiness() != null) { ResourceBusinessConfigurationType business = jaxb.getBusiness(); repo.getApproverRef().addAll(RUtil.safeListReferenceToSet(business.getApproverRef(), - prismContext, repo, RReferenceOwner.RESOURCE_BUSINESS_CONFIGURATON_APPROVER)); + repositoryContext.prismContext, repo, RReferenceOwner.RESOURCE_BUSINESS_CONFIGURATON_APPROVER)); repo.setAdministrativeState(RUtil.getRepoEnumValue(business.getAdministrativeState(), RResourceAdministrativeState.class)); } if (jaxb.getOperationalState() != null) { ROperationalState repoOpState = new ROperationalState(); - ROperationalState.copyFromJAXB(jaxb.getOperationalState(), repoOpState, prismContext); + ROperationalState.copyFromJAXB(jaxb.getOperationalState(), repoOpState); repo.setOperationalState(repoOpState); } } catch (Exception ex) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RRole.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RRole.java index e819a210c23..77954b6fb12 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RRole.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RRole.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; @@ -92,9 +93,9 @@ public int hashCode() { return result; } - public static void copyFromJAXB(RoleType jaxb, RRole repo, PrismContext prismContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { - RAbstractRole.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + public static void copyFromJAXB(RoleType jaxb, RRole repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RAbstractRole.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setRoleType(jaxb.getRoleType()); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSecurityPolicy.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSecurityPolicy.java index 5c2f815139f..e98ce5c5bdb 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSecurityPolicy.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSecurityPolicy.java @@ -1,6 +1,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; @@ -57,12 +58,9 @@ public int hashCode() { return result; } - public static void copyFromJAXB(SecurityPolicyType jaxb, RSecurityPolicy repo, PrismContext prismContext, - IdGeneratorResult generatorResult) - throws DtoTranslationException { - - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); - + public static void copyFromJAXB(SecurityPolicyType jaxb, RSecurityPolicy repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSequence.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSequence.java index 13489aa70ce..8acd3094557 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSequence.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSequence.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; @@ -74,9 +75,9 @@ public int hashCode() { return result; } - public static void copyFromJAXB(SequenceType jaxb, RSequence repo, PrismContext prismContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + public static void copyFromJAXB(SequenceType jaxb, RSequence repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RService.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RService.java index f15d4e2cc7a..553d6ea8bd2 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RService.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RService.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; @@ -111,9 +112,9 @@ public int hashCode() { return Arrays.hashCode(new Object[]{name, serviceType, locality, displayOrder}); } - public static void copyFromJAXB(ServiceType jaxb, RService repo, PrismContext prismContext, + public static void copyFromJAXB(ServiceType jaxb, RService repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { - RAbstractRole.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + RAbstractRole.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setDisplayOrder(jaxb.getDisplayOrder()); repo.setLocality(RPolyString.copyFromJAXB(jaxb.getLocality())); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RShadow.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RShadow.java index d6b111a96e2..9789f5bd1d9 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RShadow.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RShadow.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.data.common.enums.RFailedOperationType; @@ -237,9 +238,8 @@ public int hashCode() { } public static void copyFromJAXB(ShadowType jaxb, RShadow repo, - PrismContext prismContext, IdGeneratorResult generatorResult) - throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); repo.setObjectClass(RUtil.qnameToString(jaxb.getObjectClass())); @@ -248,7 +248,7 @@ public static void copyFromJAXB(ShadowType jaxb, RShadow< repo.setFullSynchronizationTimestamp(jaxb.getFullSynchronizationTimestamp()); ItemDefinition def = jaxb.asPrismObject().getDefinition(); - RUtil.copyResultFromJAXB(def, ShadowType.F_RESULT, jaxb.getResult(), repo, prismContext); + RUtil.copyResultFromJAXB(def, ShadowType.F_RESULT, jaxb.getResult(), repo, repositoryContext.prismContext); if (jaxb.getSynchronizationSituation() != null) { repo.setSynchronizationSituation(RUtil.getRepoEnumValue(jaxb.getSynchronizationSituation(), @@ -256,7 +256,7 @@ public static void copyFromJAXB(ShadowType jaxb, RShadow< } repo.setSynchronizationTimestamp(jaxb.getSynchronizationTimestamp()); - repo.setResourceRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getResourceRef(), prismContext)); + repo.setResourceRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getResourceRef(), repositoryContext.prismContext)); repo.setAttemptNumber(jaxb.getAttemptNumber()); repo.setExists(jaxb.isExists()); @@ -269,7 +269,7 @@ public static void copyFromJAXB(ShadowType jaxb, RShadow< } if (jaxb.getAttributes() != null) { - copyFromJAXB(jaxb.getAttributes().asPrismContainerValue(), repo, prismContext, RObjectExtensionType.ATTRIBUTES); + copyFromJAXB(jaxb.getAttributes().asPrismContainerValue(), repo, repositoryContext, RObjectExtensionType.ATTRIBUTES); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSystemConfiguration.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSystemConfiguration.java index 4f559421e60..4617929c623 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSystemConfiguration.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSystemConfiguration.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; @@ -77,10 +78,8 @@ public int hashCode() { } public static void copyFromJAXB(SystemConfigurationType jaxb, RSystemConfiguration repo, - PrismContext prismContext, IdGeneratorResult generatorResult) - throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); - + RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java index f07f156076e..4e95e2d9647 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.data.common.enums.*; @@ -396,9 +397,9 @@ public int hashCode() { return result1; } - public static void copyFromJAXB(TaskType jaxb, RTask repo, PrismContext prismContext, + public static void copyFromJAXB(TaskType jaxb, RTask repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); PrismObjectDefinition taskDefinition = jaxb.asPrismObject().getDefinition(); @@ -417,22 +418,22 @@ public static void copyFromJAXB(TaskType jaxb, RTask repo, PrismContext prismCon repo.setCategory(jaxb.getCategory()); repo.setParent(jaxb.getParent()); - repo.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getObjectRef(), prismContext)); - repo.setOwnerRefTask(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), prismContext)); + repo.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getObjectRef(), repositoryContext.prismContext)); + repo.setOwnerRefTask(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.prismContext)); repo.setWaitingReason(RUtil.getRepoEnumValue(jaxb.getWaitingReason(), RTaskWaitingReason.class)); repo.setDependent(RUtil.listToSet(jaxb.getDependent())); WfContextType wfc = jaxb.getWorkflowContext(); if (wfc != null) { repo.setWfProcessInstanceId(wfc.getProcessInstanceId()); - repo.setWfRequesterRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getRequesterRef(), prismContext)); - repo.setWfObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getObjectRef(), prismContext)); - repo.setWfTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getTargetRef(), prismContext)); + repo.setWfRequesterRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getRequesterRef(), repositoryContext.prismContext)); + repo.setWfObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getObjectRef(), repositoryContext.prismContext)); + repo.setWfTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getTargetRef(), repositoryContext.prismContext)); repo.setWfStartTimestamp(wfc.getStartTimestamp()); repo.setWfEndTimestamp(wfc.getEndTimestamp()); } - RUtil.copyResultFromJAXB(taskDefinition, jaxb.F_RESULT, jaxb.getResult(), repo, prismContext); + RUtil.copyResultFromJAXB(taskDefinition, jaxb.F_RESULT, jaxb.getResult(), repo, repositoryContext.prismContext); } @Override diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RUser.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RUser.java index baa7438081a..bcdc64ad1ff 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RUser.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RUser.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.data.common.enums.ROperationResultStatus; import com.evolveum.midpoint.repo.sql.query.definition.JaxbName; @@ -341,9 +342,9 @@ public int hashCode() { return result; } - public static void copyFromJAXB(UserType jaxb, RUser repo, PrismContext prismContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { - RFocus.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + public static void copyFromJAXB(UserType jaxb, RUser repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RFocus.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); repo.setFullName(RPolyString.copyFromJAXB(jaxb.getFullName())); @@ -365,7 +366,7 @@ public static void copyFromJAXB(UserType jaxb, RUser repo, PrismContext prismCon repo.setNickName(RPolyString.copyFromJAXB(jaxb.getNickName())); ItemDefinition def = jaxb.asPrismObject().getDefinition(); - RUtil.copyResultFromJAXB(def, jaxb.F_RESULT, jaxb.getResult(), repo, prismContext); + RUtil.copyResultFromJAXB(def, jaxb.F_RESULT, jaxb.getResult(), repo, repositoryContext.prismContext); //sets repo.setEmployeeType(RUtil.listToSet(jaxb.getEmployeeType())); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RValuePolicy.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RValuePolicy.java index 64f711a3cb8..fdf7040e51a 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RValuePolicy.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RValuePolicy.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; @@ -76,9 +77,9 @@ public int hashCode() { return result; } - public static void copyFromJAXB(ValuePolicyType jaxb, RValuePolicy repo, PrismContext prismContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { - RObject.copyFromJAXB(jaxb, repo, prismContext, generatorResult); + public static void copyFromJAXB(ValuePolicyType jaxb, RValuePolicy repo, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setName(RPolyString.copyFromJAXB(jaxb.getName())); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAssignmentExtension.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAssignmentExtension.java index 44d5a9ec417..8f71b9a7ca1 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAssignmentExtension.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAssignmentExtension.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.container.RAssignment; import com.evolveum.midpoint.repo.sql.data.common.id.RAssignmentExtensionId; import com.evolveum.midpoint.repo.sql.data.common.type.RAssignmentExtensionType; @@ -265,17 +265,17 @@ public int hashCode() { } public static void copyFromJAXB(ExtensionType jaxb, RAssignmentExtension repo, RAssignmentExtensionType type, - PrismContext prismContext) throws DtoTranslationException { + RepositoryContext repositoryContext) throws DtoTranslationException { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); - copyFromJAXB(jaxb.asPrismContainerValue(), repo, type, prismContext); + copyFromJAXB(jaxb.asPrismContainerValue(), repo, type, repositoryContext); } private static void copyFromJAXB(PrismContainerValue containerValue, RAssignmentExtension repo, - RAssignmentExtensionType type, PrismContext prismContext) throws + RAssignmentExtensionType type, RepositoryContext repositoryContext) throws DtoTranslationException { - RAnyConverter converter = new RAnyConverter(prismContext); + RAnyConverter converter = new RAnyConverter(repositoryContext.prismContext); Set values = new HashSet(); try { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java index 216c07eebef..85522429b2d 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.RAccessCertificationCampaign; import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.embedded.RActivation; @@ -60,7 +61,6 @@ import javax.persistence.Table; import javax.persistence.Transient; import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.namespace.QName; import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -355,33 +355,33 @@ public void setTransient(Boolean trans) { this.trans = trans; } - public static RAccessCertificationCase toRepo(RAccessCertificationCampaign owner, AccessCertificationCaseType case1, PrismContext prismContext) throws DtoTranslationException { - RAccessCertificationCase rCase = toRepo(case1, prismContext); + public static RAccessCertificationCase toRepo(RAccessCertificationCampaign owner, AccessCertificationCaseType case1, RepositoryContext context) throws DtoTranslationException { + RAccessCertificationCase rCase = toRepo(case1, context); rCase.setOwner(owner); return rCase; } - public static RAccessCertificationCase toRepo(String ownerOid, AccessCertificationCaseType case1, PrismContext prismContext) throws DtoTranslationException { - RAccessCertificationCase rCase = toRepo(case1, prismContext); + public static RAccessCertificationCase toRepo(String ownerOid, AccessCertificationCaseType case1, RepositoryContext context) throws DtoTranslationException { + RAccessCertificationCase rCase = toRepo(case1, context); rCase.setOwnerOid(ownerOid); return rCase; } - private static RAccessCertificationCase toRepo(AccessCertificationCaseType case1, PrismContext prismContext) throws DtoTranslationException { + private static RAccessCertificationCase toRepo(AccessCertificationCaseType case1, RepositoryContext context) throws DtoTranslationException { RAccessCertificationCase rCase = new RAccessCertificationCase(); rCase.setTransient(null); // we don't try to advise hibernate - let it do its work, even if it would cost some SELECTs rCase.setId(RUtil.toInteger(case1.getId())); - rCase.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getObjectRef(), prismContext)); - rCase.setTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getTargetRef(), prismContext)); - rCase.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getTenantRef(), prismContext)); - rCase.setOrgRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getOrgRef(), prismContext)); + rCase.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getObjectRef(), context.prismContext)); + rCase.setTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getTargetRef(), context.prismContext)); + rCase.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getTenantRef(), context.prismContext)); + rCase.setOrgRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getOrgRef(), context.prismContext)); if (case1.getActivation() != null) { RActivation activation = new RActivation(); - RActivation.copyFromJAXB(case1.getActivation(), activation, prismContext); + RActivation.copyFromJAXB(case1.getActivation(), activation, context); rCase.setActivation(activation); } rCase.getReviewerRef().addAll(RCertCaseReference.safeListReferenceToSet( - case1.getCurrentReviewerRef(), prismContext, rCase, RCReferenceOwner.CASE_REVIEWER)); + case1.getCurrentReviewerRef(), context.prismContext, rCase, RCReferenceOwner.CASE_REVIEWER)); rCase.setReviewRequestedTimestamp(case1.getCurrentReviewRequestedTimestamp()); rCase.setReviewDeadline(case1.getCurrentReviewDeadline()); rCase.setRemediedTimestamp(case1.getRemediedTimestamp()); @@ -389,14 +389,14 @@ private static RAccessCertificationCase toRepo(AccessCertificationCaseType case1 rCase.setCurrentStageNumber(case1.getCurrentStageNumber()); rCase.setOverallOutcome(RUtil.getRepoEnumValue(case1.getOverallOutcome(), RAccessCertificationResponse.class)); for (AccessCertificationDecisionType decision : case1.getDecision()) { - RAccessCertificationDecision rDecision = RAccessCertificationDecision.toRepo(rCase, decision, prismContext); + RAccessCertificationDecision rDecision = RAccessCertificationDecision.toRepo(rCase, decision, context); rCase.getDecision().add(rDecision); } PrismContainerValue cvalue = case1.asPrismContainerValue(); String xml; try { - xml = prismContext.xmlSerializer().serialize(cvalue, SchemaConstantsGenerated.C_VALUE); + xml = context.prismContext.xmlSerializer().serialize(cvalue, SchemaConstantsGenerated.C_VALUE); } catch (SchemaException e) { throw new IllegalStateException("Couldn't serialize certification case to string", e); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationDecision.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationDecision.java index c0bf44a4b4f..5b1876a396a 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationDecision.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationDecision.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.repo.sql.data.common.container; -import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.enums.RAccessCertificationResponse; import com.evolveum.midpoint.repo.sql.data.common.id.RL2ContainerId; @@ -183,13 +183,13 @@ public void setTransient(Boolean trans) { this.trans = trans; } - public static RAccessCertificationDecision toRepo(RAccessCertificationCase owningCase, AccessCertificationDecisionType decision, PrismContext prismContext) { - RAccessCertificationDecision rDecision = toRepo(decision, prismContext); + public static RAccessCertificationDecision toRepo(RAccessCertificationCase owningCase, AccessCertificationDecisionType decision, RepositoryContext context) { + RAccessCertificationDecision rDecision = toRepo(decision, context); rDecision.setOwner(owningCase); return rDecision; } - private static RAccessCertificationDecision toRepo(AccessCertificationDecisionType decision, PrismContext prismContext) { + private static RAccessCertificationDecision toRepo(AccessCertificationDecisionType decision, RepositoryContext context) { RAccessCertificationDecision rDecision = new RAccessCertificationDecision(); rDecision.setTransient(null); // we don't try to advise hibernate - let it do its work, even if it would cost some SELECTs Integer idInt = RUtil.toInteger(decision.getId()); @@ -201,7 +201,7 @@ private static RAccessCertificationDecision toRepo(AccessCertificationDecisionTy throw new IllegalArgumentException("No stage number for access certification decision: " + decision); } rDecision.setStageNumber(decision.getStageNumber()); - rDecision.setReviewerRef(RUtil.jaxbRefToEmbeddedRepoRef(decision.getReviewerRef(), prismContext)); + rDecision.setReviewerRef(RUtil.jaxbRefToEmbeddedRepoRef(decision.getReviewerRef(), context.prismContext)); rDecision.setResponse(RUtil.getRepoEnumValue(decision.getResponse(), RAccessCertificationResponse.class)); rDecision.setComment(decision.getComment()); rDecision.setTimestamp(decision.getTimestamp()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java index 1b1f634dd44..c3ce0ebe26d 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.repo.sql.data.common.container; -import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.Metadata; import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.any.RAssignmentExtension; @@ -419,7 +419,7 @@ public int hashCode() { return result; } - public static void copyFromJAXB(AssignmentType jaxb, RAssignment repo, ObjectType parent, PrismContext prismContext, + public static void copyFromJAXB(AssignmentType jaxb, RAssignment repo, ObjectType parent, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); @@ -438,12 +438,12 @@ public static void copyFromJAXB(AssignmentType jaxb, RAssignment repo, ObjectTyp repo.setExtension(extension); RAssignmentExtension.copyFromJAXB(jaxb.getExtension(), extension, RAssignmentExtensionType.EXTENSION, - prismContext); + repositoryContext); } if (jaxb.getActivation() != null) { RActivation activation = new RActivation(); - RActivation.copyFromJAXB(jaxb.getActivation(), activation, prismContext); + RActivation.copyFromJAXB(jaxb.getActivation(), activation, repositoryContext); repo.setActivation(activation); } @@ -451,17 +451,17 @@ public static void copyFromJAXB(AssignmentType jaxb, RAssignment repo, ObjectTyp LOGGER.warn("Target from assignment type won't be saved. It should be translated to target reference."); } - repo.setTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTargetRef(), prismContext)); + repo.setTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTargetRef(), repositoryContext.prismContext)); - repo.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTenantRef(), prismContext)); + repo.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTenantRef(), repositoryContext.prismContext)); - repo.setOrgRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOrgRef(), prismContext)); + repo.setOrgRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOrgRef(), repositoryContext.prismContext)); if (jaxb.getConstruction() != null) { - repo.setResourceRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConstruction().getResourceRef(), prismContext)); + repo.setResourceRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConstruction().getResourceRef(), repositoryContext.prismContext)); } - MetadataFactory.fromJAXB(jaxb.getMetadata(), repo, prismContext); + MetadataFactory.fromJAXB(jaxb.getMetadata(), repo, repositoryContext.prismContext); } @Override diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCertCaseReference.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCertCaseReference.java index 04f2fa5ff5c..aa2159e51f7 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCertCaseReference.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCertCaseReference.java @@ -176,7 +176,7 @@ public static RCertCaseReference jaxbRefToRepo(ObjectReferenceType reference, Pr RCertCaseReference repoRef = new RCertCaseReference(); repoRef.setReferenceType(refOwner); repoRef.setOwner(owner); - RCertCaseReference.copyFromJAXB(reference, repoRef, prismContext); + RCertCaseReference.copyFromJAXB(reference, repoRef); // repoRef.setTargetName(RPolyString.toRepo(reference.asReferenceValue().getTargetName())); return repoRef; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RContainerReference.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RContainerReference.java index a3c478dbb25..3b61583dd59 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RContainerReference.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RContainerReference.java @@ -155,7 +155,7 @@ public static void copyToJAXB(RContainerReference repo, ObjectReferenceType jaxb jaxb.setRelation(RUtil.stringToQName(repo.getRelation())); } - public static void copyFromJAXB(ObjectReferenceType jaxb, RContainerReference repo, PrismContext prismContext) { + public static void copyFromJAXB(ObjectReferenceType jaxb, RContainerReference repo) { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); Validate.notEmpty(jaxb.getOid(), "Target oid must not be null."); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RExclusion.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RExclusion.java index 63859a5f3ab..900a323da70 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RExclusion.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RExclusion.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common.container; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.enums.RExclusionPolicy; @@ -178,8 +179,8 @@ public static void copyToJAXB(RExclusion repo, ExclusionPolicyConstraintType jax } } - public static void copyFromJAXB(ExclusionPolicyConstraintType jaxb, RExclusion repo, ObjectType parent, PrismContext prismContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { + public static void copyFromJAXB(ExclusionPolicyConstraintType jaxb, RExclusion repo, ObjectType parent, + RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); @@ -188,7 +189,7 @@ public static void copyFromJAXB(ExclusionPolicyConstraintType jaxb, RExclusion r repo.setId(RUtil.toInteger(jaxb.getId())); repo.setPolicy(RUtil.getRepoEnumValue(jaxb.getPolicy(), RExclusionPolicy.class)); - repo.setTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTargetRef(), prismContext)); + repo.setTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTargetRef(), repositoryContext.prismContext)); } public ExclusionPolicyConstraintType toJAXB(PrismContext prismContext) throws DtoTranslationException { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RTrigger.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RTrigger.java index 07047cfe147..395be862ec4 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RTrigger.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RTrigger.java @@ -1,6 +1,7 @@ package com.evolveum.midpoint.repo.sql.data.common.container; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.id.RContainerId; import com.evolveum.midpoint.repo.sql.query.definition.JaxbType; @@ -153,7 +154,7 @@ public static void copyToJAXB(RTrigger repo, TriggerType jaxb, PrismContext pris } public static void copyFromJAXB(TriggerType jaxb, RTrigger repo, ObjectType parent, - PrismContext prismContext, IdGeneratorResult generatorResult) + RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/RActivation.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/RActivation.java index 55b6855ee5e..0012c49c41c 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/RActivation.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/RActivation.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common.embedded; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.enums.RActivationStatus; import com.evolveum.midpoint.repo.sql.data.common.enums.RTimeIntervalStatus; import com.evolveum.midpoint.repo.sql.query.definition.JaxbType; @@ -193,7 +194,7 @@ public String toString() { return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE); } - public static void copyFromJAXB(ActivationType jaxb, RActivation repo, PrismContext prismContext) throws + public static void copyFromJAXB(ActivationType jaxb, RActivation repo, RepositoryContext repositoryContext) throws DtoTranslationException { Validate.notNull(jaxb, "JAXB object must not be null."); Validate.notNull(repo, "Repo object must not be null."); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/REmbeddedNamedReference.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/REmbeddedNamedReference.java index 4d0da3afecd..328745aaef8 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/REmbeddedNamedReference.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/REmbeddedNamedReference.java @@ -101,11 +101,11 @@ public static void copyToJAXB(REmbeddedNamedReference repo, ObjectReferenceType jaxb.setTargetName(RPolyString.copyToJAXB(repo.getTargetName())); } - public static void copyFromJAXB(ObjectReferenceType jaxb, REmbeddedNamedReference repo, PrismContext prismContext) { + public static void copyFromJAXB(ObjectReferenceType jaxb, REmbeddedNamedReference repo) { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); Validate.notEmpty(jaxb.getOid(), "Target oid must not be null."); - REmbeddedReference.copyFromJAXB(jaxb, repo, prismContext); + REmbeddedReference.copyFromJAXB(jaxb, repo); repo.setTargetName(RPolyString.copyFromJAXB(jaxb.getTargetName())); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/REmbeddedReference.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/REmbeddedReference.java index 552b45d65f8..4447347cad2 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/REmbeddedReference.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/REmbeddedReference.java @@ -135,7 +135,7 @@ public static void copyToJAXB(REmbeddedReference repo, ObjectReferenceType jaxb, } } - public static void copyFromJAXB(ObjectReferenceType jaxb, REmbeddedReference repo, PrismContext prismContext) { + public static void copyFromJAXB(ObjectReferenceType jaxb, REmbeddedReference repo) { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); if (jaxb.getFilter() == null) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/ROperationalState.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/ROperationalState.java index 0693b80f9d3..6e5425a4f7a 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/ROperationalState.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/embedded/ROperationalState.java @@ -83,7 +83,7 @@ public static void copyToJAXB(ROperationalState repo, OperationalStateType jaxb, } } - public static void copyFromJAXB(OperationalStateType jaxb, ROperationalState repo, PrismContext prismContext) throws + public static void copyFromJAXB(OperationalStateType jaxb, ROperationalState repo) throws DtoTranslationException { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/factory/MetadataFactory.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/factory/MetadataFactory.java index 7fa9a11594b..41868ffce7c 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/factory/MetadataFactory.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/factory/MetadataFactory.java @@ -148,7 +148,7 @@ public static RAssignmentReference jaxbRefToRepo(ObjectReferenceType reference, RAssignmentReference repoRef = new RAssignmentReference(); repoRef.setReferenceType(refOwner); repoRef.setOwner(owner); - RAssignmentReference.copyFromJAXB(reference, repoRef, prismContext); + RAssignmentReference.copyFromJAXB(reference, repoRef); return repoRef; } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/CertificationCaseHelper.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/CertificationCaseHelper.java index 182cea443c1..9d41eb544d4 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/CertificationCaseHelper.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/CertificationCaseHelper.java @@ -24,6 +24,8 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.ItemPathSegment; import com.evolveum.midpoint.repo.api.RepoModifyOptions; +import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.RAccessCertificationCampaign; import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.container.RAccessCertificationCase; @@ -49,6 +51,7 @@ import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -69,17 +72,11 @@ public class CertificationCaseHelper { private static final Trace LOGGER = TraceManager.getTrace(CertificationCaseHelper.class); - @Autowired - private PrismContext prismContext; - - @Autowired - private GeneralHelper generalHelper; - - @Autowired - private NameResolutionHelper nameResolutionHelper; - - @Autowired - private ObjectRetriever objectRetriever; + @Autowired private PrismContext prismContext; + @Autowired private GeneralHelper generalHelper; + @Autowired private NameResolutionHelper nameResolutionHelper; + @Autowired private ObjectRetriever objectRetriever; + @Autowired private RepositoryService repositoryService; public void addCertificationCampaignCases(Session session, RObject object, boolean deleteBeforeAdd) { if (!(object instanceof RAccessCertificationCampaign)) { @@ -112,13 +109,18 @@ public void addCertificationCampaignCases(Session session, String campaignOid, C PrismIdentifierGenerator generator = new PrismIdentifierGenerator(); generator.generate(caseType, PrismIdentifierGenerator.Operation.MODIFY); - RAccessCertificationCase row = RAccessCertificationCase.toRepo(campaignOid, caseType, prismContext); + RAccessCertificationCase row = RAccessCertificationCase.toRepo(campaignOid, caseType, createRepositoryContext()); row.setId(RUtil.toInteger(caseType.getId())); affectedIds.add(caseType.getId()); session.save(row); } } + @NotNull + private RepositoryContext createRepositoryContext() { + return new RepositoryContext(repositoryService, prismContext); + } + public void deleteCertificationCampaignCases(Session session, String oid) { // TODO couldn't this cascading be done by hibernate itself? Query deleteDecisions = session.getNamedQuery("delete.campaignCasesDecisions"); @@ -253,7 +255,7 @@ private void updateCasesContent(Session session, String campaignOid, Collection< PrismIdentifierGenerator generator = new PrismIdentifierGenerator(); generator.generate(aCase, PrismIdentifierGenerator.Operation.MODIFY); - RAccessCertificationCase rCase = RAccessCertificationCase.toRepo(campaignOid, aCase, prismContext); + RAccessCertificationCase rCase = RAccessCertificationCase.toRepo(campaignOid, aCase, createRepositoryContext()); session.merge(rCase); LOGGER.trace("Access certification case {} merged", rCase); @@ -274,7 +276,7 @@ private void updateCasesContent(Session session, String campaignOid, Collection< AccessCertificationCaseType aCase = RAccessCertificationCase.createJaxb(fullObject, prismContext, false); Long id = aCase.getId(); if (id != null && casesAddedOrDeleted != null && !casesAddedOrDeleted.contains(id) && !casesModified.contains(id)) { - RAccessCertificationCase rCase = RAccessCertificationCase.toRepo(campaignOid, aCase, prismContext); + RAccessCertificationCase rCase = RAccessCertificationCase.toRepo(campaignOid, aCase, createRepositoryContext()); session.merge(rCase); LOGGER.trace("Access certification case {} refreshed", rCase); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java index d9afa8c022e..f7ba802b564 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java @@ -31,6 +31,7 @@ import com.evolveum.midpoint.repo.sql.SerializationRelatedException; import com.evolveum.midpoint.repo.sql.SqlRepositoryConfiguration; import com.evolveum.midpoint.repo.sql.SqlRepositoryServiceImpl; +import com.evolveum.midpoint.repo.sql.data.RepositoryContext; import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.util.ClassMapper; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; @@ -534,8 +535,8 @@ public RObject createDataObjectFromJAXB(PrismObject pr try { rObject = clazz.newInstance(); Method method = clazz.getMethod("copyFromJAXB", object.getClass(), clazz, - PrismContext.class, IdGeneratorResult.class); - method.invoke(clazz, object, rObject, prismContext, generatorResult); + RepositoryContext.class, IdGeneratorResult.class); + method.invoke(clazz, object, rObject, new RepositoryContext(repositoryService, prismContext), generatorResult); } catch (Exception ex) { String message = ex.getMessage(); if (StringUtils.isEmpty(message) && ex.getCause() != null) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java index 2f61dc6824b..98d3ce807d5 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java @@ -151,7 +151,7 @@ public static List safeSetReferencesToList(Set list = new ArrayList<>(); for (RObjectReference str : set) { ObjectReferenceType ort = new ObjectReferenceType(); - RObjectReference.copyToJAXB(str, ort, prismContext); + RObjectReference.copyToJAXB(str, ort); list.add(ort); } return list; @@ -185,7 +185,7 @@ public static RObjectReference jaxbRefToRepo(ObjectReferenceType reference, Pris RObjectReference repoRef = new RObjectReference(); repoRef.setReferenceType(refOwner); repoRef.setOwner(owner); - RObjectReference.copyFromJAXB(reference, repoRef, prismContext); + RObjectReference.copyFromJAXB(reference, repoRef); return repoRef; } @@ -196,17 +196,17 @@ public static REmbeddedReference jaxbRefToEmbeddedRepoRef(ObjectReferenceType ja return null; } REmbeddedReference ref = new REmbeddedReference(); - REmbeddedReference.copyFromJAXB(jaxb, ref, prismContext); + REmbeddedReference.copyFromJAXB(jaxb, ref); return ref; } - public static REmbeddedNamedReference jaxbRefToEmbeddedNamedRepoRef(ObjectReferenceType jaxb, PrismContext prismContext) { + public static REmbeddedNamedReference jaxbRefToEmbeddedNamedRepoRef(ObjectReferenceType jaxb) { if (jaxb == null) { return null; } REmbeddedNamedReference ref = new REmbeddedNamedReference(); - REmbeddedNamedReference.copyFromJAXB(jaxb, ref, prismContext); + REmbeddedNamedReference.copyFromJAXB(jaxb, ref); return ref; } diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/cluster/ClusterManager.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/cluster/ClusterManager.java index 47d1f027b76..a3881b52318 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/cluster/ClusterManager.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/cluster/ClusterManager.java @@ -274,22 +274,24 @@ public void checkSystemConfigurationChanged(OperationResult parentResult) { // we do not try to determine which one is "newer" - we simply use the one from repo if (!versionInRepo.equals(versionApplied)) { - - Configuration systemConfigFromFile = taskManager.getMidpointConfiguration().getConfiguration(MidpointConfiguration.SYSTEM_CONFIGURATION_SECTION); - boolean skip = false; - if (systemConfigFromFile != null && versionApplied == null) { - skip = systemConfigFromFile.getBoolean(LoggingConfigurationManager.SYSTEM_CONFIGURATION_SKIP_REPOSITORY_LOGGING_SETTINGS, false); - } - if (skip) { - LOGGER.warn("Skipping application of repository logging configuration because {}=true (version={})", LoggingConfigurationManager.SYSTEM_CONFIGURATION_SKIP_REPOSITORY_LOGGING_SETTINGS, versionInRepo); - // But pretend that this was applied so the next update works normally - LoggingConfigurationManager.setCurrentlyUsedVersion(versionInRepo); - } else { - LoggingConfigurationType loggingConfig = ProfilingConfigurationManager.checkSystemProfilingConfiguration(config); - LoggingConfigurationManager.configure(loggingConfig, versionInRepo, result); - } - - SystemConfigurationHolder.setCurrentConfiguration(config.asObjectable()); // we rely on LoggingConfigurationManager to correctly record the current version + Configuration systemConfigFromFile = taskManager.getMidpointConfiguration() + .getConfiguration(MidpointConfiguration.SYSTEM_CONFIGURATION_SECTION); + if (systemConfigFromFile != null && versionApplied == null && systemConfigFromFile + .getBoolean(LoggingConfigurationManager.SYSTEM_CONFIGURATION_SKIP_REPOSITORY_LOGGING_SETTINGS, false)) { + LOGGER.warn("Skipping application of repository logging configuration because {}=true (version={})", + LoggingConfigurationManager.SYSTEM_CONFIGURATION_SKIP_REPOSITORY_LOGGING_SETTINGS, versionInRepo); + // But pretend that this was applied so the next update works normally + LoggingConfigurationManager.setCurrentlyUsedVersion(versionInRepo); + } else { + LoggingConfigurationType loggingConfig = ProfilingConfigurationManager + .checkSystemProfilingConfiguration(config); + LoggingConfigurationManager.configure(loggingConfig, versionInRepo, result); + } + + SystemConfigurationHolder.setCurrentConfiguration( + config.asObjectable()); // we rely on LoggingConfigurationManager to correctly record the current version + + getRepositoryService().applyFullTextSearchConfiguration(config.asObjectable().getFullTextSearch()); } else { if (LOGGER.isTraceEnabled()) { LOGGER.trace("System configuration change check: version in repo = version currently applied = {}", versionApplied); From 0e6d8c2508a24b572ba2e22b559c4ef533a7838e Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 24 Feb 2017 17:17:41 +0100 Subject: [PATCH 4/5] Applying full text indexing (and logging) configuration earlier in the startup sequence. Other minor tweaks. --- .../midpoint/init/ModelInitialSetup.java | 4 +- .../midpoint/init/RepoInitialSetup.java | 53 ++++++++++++++ .../src/main/webapp/WEB-INF/ctx-init.xml | 4 ++ .../impl/controller/ModelController.java | 20 +----- .../SystemConfigurationHandler.java | 18 ----- .../midpoint/repo/api/RepositoryService.java | 2 + .../midpoint/repo/cache/RepositoryCache.java | 5 ++ .../repo/sql/SqlRepositoryServiceImpl.java | 58 ++++++++++----- .../repo/sql/data/common/RObjectTextInfo.java | 11 +-- .../midpoint/init/RepositoryFactory.java | 13 ++-- samples/objects/full-text-search.xml | 72 +++++++++++++++++++ 11 files changed, 191 insertions(+), 69 deletions(-) create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/init/RepoInitialSetup.java create mode 100644 samples/objects/full-text-search.xml diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/ModelInitialSetup.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/ModelInitialSetup.java index 0917f851e95..ef5da3384e5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/ModelInitialSetup.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/ModelInitialSetup.java @@ -40,10 +40,10 @@ public void setModel(ModelService model) { public void init() { LOGGER.info("Model post initialization."); - OperationResult mainResult = new OperationResult("Model Post Initialisation"); + OperationResult mainResult = new OperationResult("Model Post Initialization"); try { model.postInit(mainResult); - LOGGER.info("Model post initialization finished successful."); + LOGGER.info("Model post initialization finished successfully."); } catch (Exception ex) { LoggingUtils.logUnexpectedException(LOGGER, "Model post initialization failed", ex); mainResult.recordFatalError("Model post initialization failed.", ex); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/RepoInitialSetup.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/RepoInitialSetup.java new file mode 100644 index 00000000000..d847953a471 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/RepoInitialSetup.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2010-2017 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.init; + +import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.util.logging.LoggingUtils; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import org.jetbrains.annotations.NotNull; + +/** + * @author mederly + */ +public class RepoInitialSetup { + + private static final Trace LOGGER = TraceManager.getTrace(RepoInitialSetup.class); + + @NotNull private RepositoryService repositoryService; + + public RepoInitialSetup(@NotNull RepositoryService repositoryService) { + this.repositoryService = repositoryService; + } + + public void init() { + LOGGER.info("Repository post initialization."); + + OperationResult result = new OperationResult(RepoInitialSetup.class.getName() + ".init"); + try { + repositoryService.postInit(result); + LOGGER.info("Repository post initialization finished successfully."); + } catch (Exception ex) { + LoggingUtils.logUnexpectedException(LOGGER, "Repository post initialization failed", ex); + result.recordFatalError("Repository post initialization failed.", ex); + } finally { + result.computeStatus("Repository post initialization failed."); + } + } +} diff --git a/gui/admin-gui/src/main/webapp/WEB-INF/ctx-init.xml b/gui/admin-gui/src/main/webapp/WEB-INF/ctx-init.xml index 549e6ff3c5c..1479c5d70df 100644 --- a/gui/admin-gui/src/main/webapp/WEB-INF/ctx-init.xml +++ b/gui/admin-gui/src/main/webapp/WEB-INF/ctx-init.xml @@ -25,6 +25,10 @@ + + + + diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java index 8606fe2616e..37c2afd960e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java @@ -161,17 +161,11 @@ public class ModelController implements ModelService, TaskService, WorkflowServi @Autowired(required = true) private ChangeExecutor changeExecutor; - @Autowired(required = true) - SystemConfigurationHandler systemConfigurationHandler; - @Autowired(required = true) private AuditService auditService; @Autowired(required = true) private SecurityEnforcer securityEnforcer; - - @Autowired(required = true) - private AuthenticationEvaluator authenticationEvaluator; @Autowired(required = true) private UserProfileService userProfileService; @@ -1674,19 +1668,7 @@ public void postInit(OperationResult parentResult) { securityEnforcer.setUserProfileService(userProfileService); // TODO: initialize repository - PrismObject systemConfiguration; - try { - systemConfiguration = objectResolver.getSystemConfiguration(result); - systemConfigurationHandler.postInit(systemConfiguration, result); - } catch (ObjectNotFoundException e) { - String message = "No system configuration found, skipping application of initial system settings"; - LOGGER.error(message + ": " + e.getMessage(), e); - result.recordWarning(message, e); - } catch (SchemaException e) { - String message = "Schema error in system configuration, skipping application of initial system settings"; - LOGGER.error(message + ": " + e.getMessage(), e); - result.recordWarning(message, e); - } + // repository (including logging config) is initialized in its own method taskManager.postInit(result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java index 3bf74905dba..108b2bcebe9 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java @@ -65,29 +65,11 @@ public class SystemConfigurationHandler implements ChangeHook { @Qualifier("cacheRepositoryService") private transient RepositoryService cacheRepositoryService; - @Autowired - private MidpointConfiguration startupConfiguration; - @PostConstruct public void init() { hookRegistry.registerChangeHook(HOOK_URI, this); } - public void postInit(PrismObject systemConfiguration, OperationResult parentResult) { - SystemConfigurationHolder.setCurrentConfiguration(systemConfiguration.asObjectable()); - - Configuration systemConfigFromFile = startupConfiguration.getConfiguration(MidpointConfiguration.SYSTEM_CONFIGURATION_SECTION); - if (systemConfigFromFile != null && systemConfigFromFile - .getBoolean(LoggingConfigurationManager.SYSTEM_CONFIGURATION_SKIP_REPOSITORY_LOGGING_SETTINGS, false)) { - LOGGER.warn("Skipping application of repository logging configuration because {}=true", LoggingConfigurationManager.SYSTEM_CONFIGURATION_SKIP_REPOSITORY_LOGGING_SETTINGS); - } else { - LoggingConfigurationType loggingConfig = ProfilingConfigurationManager.checkSystemProfilingConfiguration(systemConfiguration); - applyLoggingConfiguration(loggingConfig, systemConfiguration.asObjectable().getVersion(), parentResult); - } - - cacheRepositoryService.applyFullTextSearchConfiguration(systemConfiguration.asObjectable().getFullTextSearch()); - } - private void applyLoggingConfiguration(LoggingConfigurationType loggingConfig, String version, OperationResult parentResult) { if (loggingConfig != null) { LoggingConfigurationManager.configure(loggingConfig, version, parentResult); diff --git a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java index 97cbe489b5f..befe2e52108 100644 --- a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java +++ b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java @@ -605,4 +605,6 @@ boolean selectorMatches(ObjectSelectorType objectSelector void applyFullTextSearchConfiguration(FullTextSearchConfigurationType fullTextSearch); FullTextSearchConfigurationType getFullTextSearchConfiguration(); + + void postInit(OperationResult result) throws SchemaException; } diff --git a/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java index 2f792b618d0..69f2d957cdb 100644 --- a/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java +++ b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java @@ -446,4 +446,9 @@ public void applyFullTextSearchConfiguration(FullTextSearchConfigurationType ful public FullTextSearchConfigurationType getFullTextSearchConfiguration() { return repository.getFullTextSearchConfiguration(); } + + @Override + public void postInit(OperationResult result) throws SchemaException { + repository.postInit(result); + } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java index f50b19a3ef7..e5573af1fa8 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java @@ -16,6 +16,10 @@ package com.evolveum.midpoint.repo.sql; +import com.evolveum.midpoint.common.LoggingConfigurationManager; +import com.evolveum.midpoint.common.ProfilingConfigurationManager; +import com.evolveum.midpoint.common.SystemConfigurationHolder; +import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration; import com.evolveum.midpoint.common.crypto.CryptoUtil; import com.evolveum.midpoint.prism.ConsistencyCheckScope; import com.evolveum.midpoint.prism.Containerable; @@ -55,6 +59,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import org.apache.commons.configuration.Configuration; import org.apache.commons.lang.Validate; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -101,23 +106,13 @@ public class SqlRepositoryServiceImpl extends SqlBaseService implements Reposito private static final String DETAILS_HIBERNATE_DIALECT = "hibernateDialect"; private static final String DETAILS_HIBERNATE_HBM_2_DDL = "hibernateHbm2ddl"; - @Autowired - private SequenceHelper sequenceHelper; - - @Autowired - private ObjectRetriever objectRetriever; - - @Autowired - private ObjectUpdater objectUpdater; - - @Autowired - private OrgClosureManager closureManager; - - @Autowired - private BaseHelper baseHelper; - - @Autowired - private MatchingRuleRegistry matchingRuleRegistry; + @Autowired private SequenceHelper sequenceHelper; + @Autowired private ObjectRetriever objectRetriever; + @Autowired private ObjectUpdater objectUpdater; + @Autowired private OrgClosureManager closureManager; + @Autowired private BaseHelper baseHelper; + @Autowired private MatchingRuleRegistry matchingRuleRegistry; + @Autowired private MidpointConfiguration midpointConfiguration; private FullTextSearchConfigurationType fullTextSearchConfiguration; @@ -1012,4 +1007,33 @@ public void applyFullTextSearchConfiguration(FullTextSearchConfigurationType ful public FullTextSearchConfigurationType getFullTextSearchConfiguration() { return fullTextSearchConfiguration; } + + @Override + public void postInit(OperationResult result) throws SchemaException { + + SystemConfigurationType systemConfiguration; + try { + systemConfiguration = getObject(SystemConfigurationType.class, + SystemObjectsType.SYSTEM_CONFIGURATION.value(), null, result).asObjectable(); + } catch (ObjectNotFoundException e) { + // ok, no problem e.g. for tests or initial startup + LOGGER.debug("System configuration not found, exiting postInit method."); + return; + } + + SystemConfigurationHolder.setCurrentConfiguration(systemConfiguration); + + Configuration systemConfigFromFile = midpointConfiguration.getConfiguration(MidpointConfiguration.SYSTEM_CONFIGURATION_SECTION); + if (systemConfigFromFile != null && systemConfigFromFile + .getBoolean(LoggingConfigurationManager.SYSTEM_CONFIGURATION_SKIP_REPOSITORY_LOGGING_SETTINGS, false)) { + LOGGER.warn("Skipping application of repository logging configuration because {}=true", LoggingConfigurationManager.SYSTEM_CONFIGURATION_SKIP_REPOSITORY_LOGGING_SETTINGS); + } else { + LoggingConfigurationType loggingConfig = ProfilingConfigurationManager.checkSystemProfilingConfiguration( + systemConfiguration.asPrismObject()); + if (loggingConfig != null) { + LoggingConfigurationManager.configure(loggingConfig, systemConfiguration.getVersion(), result); + } + } + applyFullTextSearchConfiguration(systemConfiguration.getFullTextSearch()); + } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java index ad9c9c049f5..152c96d54d1 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTextInfo.java @@ -51,8 +51,7 @@ */ @Entity @IdClass(RObjectTextInfoId.class) -@Table(name = TABLE_NAME, indexes = { - @Index(name = "iTextInfoOid", columnList = COLUMN_OWNER_OID)}) +@Table(name = TABLE_NAME) public class RObjectTextInfo implements Serializable { private static final Trace LOGGER = TraceManager.getTrace(RObjectTextInfo.class); @@ -76,7 +75,7 @@ public RObjectTextInfo(RObject owner, String text) { this.text = text; } - @ForeignKey(name = "fk_reference_owner") + @ForeignKey(name = "fk_object_text_info_owner") @MapsId("owner") @ManyToOne(fetch = FetchType.LAZY) @NotQueryable @@ -167,7 +166,7 @@ public static Set createItemsSet(@NotNul } } - List allWords = new ArrayList<>(); + List allWords = new ArrayList<>(); // not a (hash) set in order to preserve order for (PrismValue value : values) { if (value == null) { continue; @@ -237,7 +236,9 @@ private static void append(List allWords, String text, PrismContext pris String[] words = StringUtils.split(normalized); for (String word : words) { if (StringUtils.isNotBlank(word)) { - allWords.add(word); + if (!allWords.contains(word)) { + allWords.add(word); + } } } } diff --git a/repo/system-init/src/main/java/com/evolveum/midpoint/init/RepositoryFactory.java b/repo/system-init/src/main/java/com/evolveum/midpoint/init/RepositoryFactory.java index 17ec74bea7b..b119aefe5a8 100644 --- a/repo/system-init/src/main/java/com/evolveum/midpoint/init/RepositoryFactory.java +++ b/repo/system-init/src/main/java/com/evolveum/midpoint/init/RepositoryFactory.java @@ -33,7 +33,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; - public class RepositoryFactory implements ApplicationContextAware, RuntimeConfiguration { private static final String REPOSITORY_CONFIGURATION = "midpoint.repository"; @@ -45,7 +44,7 @@ public class RepositoryFactory implements ApplicationContextAware, RuntimeConfig MidpointConfiguration midpointConfiguration; @Autowired private PrismContext prismContext; - //Repository factory + //Repository factory private RepositoryServiceFactory factory; private RepositoryServiceFactory cacheFactory; //Repository services @@ -113,14 +112,11 @@ public synchronized RepositoryService getRepositoryService() { try { LOGGER.debug("Creating repository service using factory {}", factory); repositoryService = factory.getRepositoryService(); - } catch (RepositoryServiceFactoryException ex) { - LoggingUtils.logException(LOGGER, "Failed to get repository service from factory " + factory, ex); - throw new SystemException("Failed to get repository service from factory " + factory, ex); - } catch (RuntimeException ex) { - LoggingUtils.logException(LOGGER, "Failed to get repository service from factory " + factory, ex); + } catch (RepositoryServiceFactoryException | RuntimeException ex) { + LoggingUtils.logUnexpectedException(LOGGER, "Failed to get repository service from factory " + factory, ex); throw new SystemException("Failed to get repository service from factory " + factory, ex); } catch (Error ex) { - LoggingUtils.logException(LOGGER, "Failed to get repository service from factory " + factory, ex); + LoggingUtils.logUnexpectedException(LOGGER, "Failed to get repository service from factory " + factory, ex); throw ex; } } @@ -154,4 +150,5 @@ public synchronized RepositoryService getCacheRepositoryService() { public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } + } diff --git a/samples/objects/full-text-search.xml b/samples/objects/full-text-search.xml new file mode 100644 index 00000000000..9cc303afd80 --- /dev/null +++ b/samples/objects/full-text-search.xml @@ -0,0 +1,72 @@ + + + + + + dummy + + + + + + name + description + + + UserType + fullName + givenName + familyName + additionalName + nickName + emailAddress + telephoneNumber + honorificPrefix + honorificSuffix + title + employeeNumber + employeeType + costCenter + organization + organizationalUnit + locality + + + AbstractRoleType + displayName + identifier + + + RoleType + roleType + + + OrgType + orgType + costCenter + locality + mailDomain + + + ServiceType + serviceType + locality + + + + \ No newline at end of file From b2e5dd601e6168619cb650c7cc467ef0251c0a4a Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 24 Feb 2017 17:37:41 +0100 Subject: [PATCH 5/5] Migration scripts. --- config/sql/midpoint/3.6/h2/h2-3.6.sql | 11 +++++++++++ config/sql/midpoint/3.6/h2/h2-upgrade-3.5-3.6.sql | 11 +++++++++++ config/sql/midpoint/3.6/mysql/mysql-3.6.sql | 14 ++++++++++++++ .../midpoint/3.6/mysql/mysql-upgrade-3.5-3.6.sql | 13 +++++++++++++ config/sql/midpoint/3.6/oracle/oracle-3.6.sql | 11 +++++++++++ .../midpoint/3.6/oracle/oracle-upgrade-3.5-3.6.sql | 11 +++++++++++ .../sql/midpoint/3.6/postgresql/postgresql-3.6.sql | 11 +++++++++++ .../3.6/postgresql/postgresql-upgrade-3.5-3.6.sql | 10 ++++++++++ .../sql/midpoint/3.6/sqlserver/sqlserver-3.6.sql | 11 +++++++++++ .../3.6/sqlserver/sqlserver-upgrade-3.5-3.6.sql | 12 ++++++++++++ 10 files changed, 115 insertions(+) diff --git a/config/sql/midpoint/3.6/h2/h2-3.6.sql b/config/sql/midpoint/3.6/h2/h2-3.6.sql index 4b3025f05df..03eea41fcb5 100644 --- a/config/sql/midpoint/3.6/h2/h2-3.6.sql +++ b/config/sql/midpoint/3.6/h2/h2-3.6.sql @@ -527,6 +527,12 @@ CREATE TABLE m_object_template ( PRIMARY KEY (oid) ); +CREATE TABLE m_object_text_info ( + owner_oid VARCHAR(36) NOT NULL, + text VARCHAR(255) NOT NULL, + PRIMARY KEY (owner_oid, text) +); + CREATE TABLE m_org ( costCenter VARCHAR(255), displayOrder INTEGER, @@ -1145,6 +1151,11 @@ ADD CONSTRAINT fk_object_template FOREIGN KEY (oid) REFERENCES m_object; +ALTER TABLE m_object_text_info + ADD CONSTRAINT fk_object_text_info_owner +FOREIGN KEY (owner_oid) +REFERENCES m_object; + ALTER TABLE m_org ADD CONSTRAINT fk_org FOREIGN KEY (oid) diff --git a/config/sql/midpoint/3.6/h2/h2-upgrade-3.5-3.6.sql b/config/sql/midpoint/3.6/h2/h2-upgrade-3.5-3.6.sql index c349c89ef7f..bba36a1de8b 100644 --- a/config/sql/midpoint/3.6/h2/h2-upgrade-3.5-3.6.sql +++ b/config/sql/midpoint/3.6/h2/h2-upgrade-3.5-3.6.sql @@ -48,3 +48,14 @@ ALTER TABLE m_audit_ref_value FOREIGN KEY (record_id) REFERENCES m_audit_event; +CREATE TABLE m_object_text_info ( + owner_oid VARCHAR(36) NOT NULL, + text VARCHAR(255) NOT NULL, + PRIMARY KEY (owner_oid, text) +); + +ALTER TABLE m_object_text_info + ADD CONSTRAINT fk_object_text_info_owner +FOREIGN KEY (owner_oid) +REFERENCES m_object; + diff --git a/config/sql/midpoint/3.6/mysql/mysql-3.6.sql b/config/sql/midpoint/3.6/mysql/mysql-3.6.sql index 96548ffddbf..27706350c44 100644 --- a/config/sql/midpoint/3.6/mysql/mysql-3.6.sql +++ b/config/sql/midpoint/3.6/mysql/mysql-3.6.sql @@ -663,6 +663,15 @@ CREATE TABLE m_object_template ( COLLATE utf8_bin ENGINE = InnoDB; +CREATE TABLE m_object_text_info ( + owner_oid VARCHAR(36) NOT NULL, + text VARCHAR(255) NOT NULL, + PRIMARY KEY (owner_oid, text) +) + DEFAULT CHARACTER SET utf8 + COLLATE utf8_bin + ENGINE = InnoDB; + CREATE TABLE m_org ( costCenter VARCHAR(255), displayOrder INTEGER, @@ -1349,6 +1358,11 @@ ADD CONSTRAINT fk_object_template FOREIGN KEY (oid) REFERENCES m_object (oid); +ALTER TABLE m_object_text_info + ADD CONSTRAINT fk_object_text_info_owner +FOREIGN KEY (owner_oid) +REFERENCES m_object (oid); + ALTER TABLE m_org ADD CONSTRAINT fk_org FOREIGN KEY (oid) diff --git a/config/sql/midpoint/3.6/mysql/mysql-upgrade-3.5-3.6.sql b/config/sql/midpoint/3.6/mysql/mysql-upgrade-3.5-3.6.sql index 4dcdd6231b5..28eb769138f 100644 --- a/config/sql/midpoint/3.6/mysql/mysql-upgrade-3.5-3.6.sql +++ b/config/sql/midpoint/3.6/mysql/mysql-upgrade-3.5-3.6.sql @@ -57,3 +57,16 @@ ALTER TABLE m_audit_ref_value FOREIGN KEY (record_id) REFERENCES m_audit_event (id); +CREATE TABLE m_object_text_info ( + owner_oid VARCHAR(36) NOT NULL, + text VARCHAR(255) NOT NULL, + PRIMARY KEY (owner_oid, text) +) + DEFAULT CHARACTER SET utf8 + COLLATE utf8_bin + ENGINE = InnoDB; + +ALTER TABLE m_object_text_info + ADD CONSTRAINT fk_object_text_info_owner +FOREIGN KEY (owner_oid) +REFERENCES m_object (oid); diff --git a/config/sql/midpoint/3.6/oracle/oracle-3.6.sql b/config/sql/midpoint/3.6/oracle/oracle-3.6.sql index fad4c602c62..23ab5a02a53 100644 --- a/config/sql/midpoint/3.6/oracle/oracle-3.6.sql +++ b/config/sql/midpoint/3.6/oracle/oracle-3.6.sql @@ -530,6 +530,12 @@ CREATE TABLE m_object_template ( PRIMARY KEY (oid) ) INITRANS 30; +CREATE TABLE m_object_text_info ( + owner_oid VARCHAR2(36 CHAR) NOT NULL, + text VARCHAR2(255 CHAR) NOT NULL, + PRIMARY KEY (owner_oid, text) +) INITRANS 30; + CREATE TABLE m_org ( costCenter VARCHAR2(255 CHAR), displayOrder NUMBER(10, 0), @@ -1155,6 +1161,11 @@ ADD CONSTRAINT fk_object_template FOREIGN KEY (oid) REFERENCES m_object; +ALTER TABLE m_object_text_info + ADD CONSTRAINT fk_object_text_info_owner +FOREIGN KEY (owner_oid) +REFERENCES m_object; + ALTER TABLE m_org ADD CONSTRAINT fk_org FOREIGN KEY (oid) diff --git a/config/sql/midpoint/3.6/oracle/oracle-upgrade-3.5-3.6.sql b/config/sql/midpoint/3.6/oracle/oracle-upgrade-3.5-3.6.sql index 8dbae73a8e2..fb1694f8bb1 100644 --- a/config/sql/midpoint/3.6/oracle/oracle-upgrade-3.5-3.6.sql +++ b/config/sql/midpoint/3.6/oracle/oracle-upgrade-3.5-3.6.sql @@ -48,3 +48,14 @@ ALTER TABLE m_audit_ref_value ADD CONSTRAINT fk_audit_ref_value FOREIGN KEY (record_id) REFERENCES m_audit_event; + +CREATE TABLE m_object_text_info ( + owner_oid VARCHAR2(36 CHAR) NOT NULL, + text VARCHAR2(255 CHAR) NOT NULL, + PRIMARY KEY (owner_oid, text) +) INITRANS 30; + +ALTER TABLE m_object_text_info + ADD CONSTRAINT fk_object_text_info_owner +FOREIGN KEY (owner_oid) +REFERENCES m_object; diff --git a/config/sql/midpoint/3.6/postgresql/postgresql-3.6.sql b/config/sql/midpoint/3.6/postgresql/postgresql-3.6.sql index e55c75ac002..2d28eab2c9c 100644 --- a/config/sql/midpoint/3.6/postgresql/postgresql-3.6.sql +++ b/config/sql/midpoint/3.6/postgresql/postgresql-3.6.sql @@ -527,6 +527,12 @@ CREATE TABLE m_object_template ( PRIMARY KEY (oid) ); +CREATE TABLE m_object_text_info ( + owner_oid VARCHAR(36) NOT NULL, + text VARCHAR(255) NOT NULL, + PRIMARY KEY (owner_oid, text) +); + CREATE TABLE m_org ( costCenter VARCHAR(255), displayOrder INT4, @@ -1145,6 +1151,11 @@ ADD CONSTRAINT fk_object_template FOREIGN KEY (oid) REFERENCES m_object; +ALTER TABLE m_object_text_info + ADD CONSTRAINT fk_object_text_info_owner +FOREIGN KEY (owner_oid) +REFERENCES m_object; + ALTER TABLE m_org ADD CONSTRAINT fk_org FOREIGN KEY (oid) diff --git a/config/sql/midpoint/3.6/postgresql/postgresql-upgrade-3.5-3.6.sql b/config/sql/midpoint/3.6/postgresql/postgresql-upgrade-3.5-3.6.sql index b885072e2c3..b61605cd545 100644 --- a/config/sql/midpoint/3.6/postgresql/postgresql-upgrade-3.5-3.6.sql +++ b/config/sql/midpoint/3.6/postgresql/postgresql-upgrade-3.5-3.6.sql @@ -48,3 +48,13 @@ ALTER TABLE m_audit_ref_value FOREIGN KEY (record_id) REFERENCES m_audit_event; +CREATE TABLE m_object_text_info ( + owner_oid VARCHAR(36) NOT NULL, + text VARCHAR(255) NOT NULL, + PRIMARY KEY (owner_oid, text) +); + +ALTER TABLE m_object_text_info + ADD CONSTRAINT fk_object_text_info_owner +FOREIGN KEY (owner_oid) +REFERENCES m_object; diff --git a/config/sql/midpoint/3.6/sqlserver/sqlserver-3.6.sql b/config/sql/midpoint/3.6/sqlserver/sqlserver-3.6.sql index cf49e3f8f68..712d877ffc9 100644 --- a/config/sql/midpoint/3.6/sqlserver/sqlserver-3.6.sql +++ b/config/sql/midpoint/3.6/sqlserver/sqlserver-3.6.sql @@ -527,6 +527,12 @@ CREATE TABLE m_object_template ( PRIMARY KEY (oid) ); +CREATE TABLE m_object_text_info ( + owner_oid NVARCHAR(36) COLLATE database_default NOT NULL, + text NVARCHAR(255) COLLATE database_default NOT NULL, + PRIMARY KEY (owner_oid, text) +); + CREATE TABLE m_org ( costCenter NVARCHAR(255) COLLATE database_default, displayOrder INT, @@ -1145,6 +1151,11 @@ ADD CONSTRAINT fk_object_template FOREIGN KEY (oid) REFERENCES m_object; +ALTER TABLE m_object_text_info + ADD CONSTRAINT fk_object_text_info_owner +FOREIGN KEY (owner_oid) +REFERENCES m_object; + ALTER TABLE m_org ADD CONSTRAINT fk_org FOREIGN KEY (oid) diff --git a/config/sql/midpoint/3.6/sqlserver/sqlserver-upgrade-3.5-3.6.sql b/config/sql/midpoint/3.6/sqlserver/sqlserver-upgrade-3.5-3.6.sql index f4f3d62ff32..303409693f8 100644 --- a/config/sql/midpoint/3.6/sqlserver/sqlserver-upgrade-3.5-3.6.sql +++ b/config/sql/midpoint/3.6/sqlserver/sqlserver-upgrade-3.5-3.6.sql @@ -47,3 +47,15 @@ ALTER TABLE m_audit_ref_value ADD CONSTRAINT fk_audit_ref_value FOREIGN KEY (record_id) REFERENCES m_audit_event; + +CREATE TABLE m_object_text_info ( + owner_oid NVARCHAR(36) COLLATE database_default NOT NULL, + text NVARCHAR(255) COLLATE database_default NOT NULL, + PRIMARY KEY (owner_oid, text) +); + +ALTER TABLE m_object_text_info + ADD CONSTRAINT fk_object_text_info_owner +FOREIGN KEY (owner_oid) +REFERENCES m_object; +