From 829792648e53c687dca701a91df74296af685de7 Mon Sep 17 00:00:00 2001
From: Radovan Semancik
Date: Wed, 18 Feb 2015 14:01:26 +0100
Subject: [PATCH] Repo API for lookup table (MID-2206)
---
.../repo/api/LookupTableSearchType.java | 24 ++++++++
.../midpoint/repo/api/RepositoryService.java | 57 ++++++++++++++-----
.../midpoint/repo/cache/RepositoryCache.java | 13 +++++
.../repo/sql/SqlRepositoryServiceImpl.java | 9 +++
4 files changed, 88 insertions(+), 15 deletions(-)
create mode 100644 repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/LookupTableSearchType.java
diff --git a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/LookupTableSearchType.java b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/LookupTableSearchType.java
new file mode 100644
index 00000000000..01c146a0f36
--- /dev/null
+++ b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/LookupTableSearchType.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2015 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.api;
+
+/**
+ * @author semancik
+ *
+ */
+public enum LookupTableSearchType {
+ EXACT, STARTS_WITH, SUBSTRING;
+}
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 d59fcc1604f..5d75b12afb9 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
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2014 Evolveum
+ * Copyright (c) 2010-2015 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,9 +19,11 @@
import java.util.List;
import javax.xml.datatype.Duration;
+import javax.xml.namespace.QName;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ItemDelta;
+import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.RepositoryDiag;
@@ -36,6 +38,8 @@
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CleanupPolicyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
@@ -48,7 +52,7 @@
* Status: public
* Stability: stable
*
- * @version 3.0
+ * @version 3.1.1
* @author Radovan Semancik
*
* This service provides repository for objects that are commonly found
@@ -163,7 +167,7 @@ public interface RepositoryService {
* @throws IllegalArgumentException
* wrong OID format, etc.
*/
- public PrismObject getObject(Class type,String oid, Collection> options,
+ PrismObject getObject(Class type,String oid, Collection> options,
OperationResult parentResult)
throws ObjectNotFoundException, SchemaException;
@@ -188,7 +192,7 @@ public PrismObject getObject(Class type,String oid,
* @throws IllegalArgumentException
* wrong OID format, etc.
*/
- public String getVersion(Class type,String oid, OperationResult parentResult)
+ String getVersion(Class type,String oid, OperationResult parentResult)
throws ObjectNotFoundException, SchemaException;
/**
@@ -228,7 +232,7 @@ public String getVersion(Class type,String oid, Operat
* @throws IllegalArgumentException
* wrong OID format, etc.
*/
- public String addObject(PrismObject object, RepoAddOptions options, OperationResult parentResult)
+ String addObject(PrismObject object, RepoAddOptions options, OperationResult parentResult)
throws ObjectAlreadyExistsException, SchemaException;
@@ -262,7 +266,7 @@ public String addObject(PrismObject object, RepoAddOpt
* unknown property used in search query
*/
- public SearchResultList> searchObjects(Class type, ObjectQuery query,
+ SearchResultList> searchObjects(Class type, ObjectQuery query,
Collection> options, OperationResult parentResult)
throws SchemaException;
@@ -297,7 +301,7 @@ public SearchResultList> searchObjects(Cl
* unknown property used in search query
*/
- public SearchResultMetadata searchObjectsIterative(Class type, ObjectQuery query,
+ SearchResultMetadata searchObjectsIterative(Class type, ObjectQuery query,
ResultHandler handler, Collection> options, OperationResult parentResult)
throws SchemaException;
@@ -323,7 +327,7 @@ public SearchResultMetadata searchObjectsIterative(Class<
* @throws SchemaException
* unknown property used in search query
*/
- public int countObjects(Class type, ObjectQuery query, OperationResult parentResult)
+ int countObjects(Class type, ObjectQuery query, OperationResult parentResult)
throws SchemaException;
boolean isAnySubordinate(String upperOrgOid, Collection lowerObjectOids) throws SchemaException;
@@ -358,7 +362,7 @@ public int countObjects(Class type, ObjectQuery query,
* @throws IllegalArgumentException
* wrong OID format, described change is not applicable
*/
- public void modifyObject(Class type, String oid, Collection extends ItemDelta> modifications, OperationResult parentResult)
+ void modifyObject(Class type, String oid, Collection extends ItemDelta> modifications, OperationResult parentResult)
throws ObjectNotFoundException, SchemaException, ObjectAlreadyExistsException;
/**
@@ -377,7 +381,7 @@ public void modifyObject(Class type, String oid, Colle
* @throws IllegalArgumentException
* wrong OID format, described change is not applicable
*/
- public void deleteObject(Class type, String oid, OperationResult parentResult) throws ObjectNotFoundException;
+ void deleteObject(Class type, String oid, OperationResult parentResult) throws ObjectNotFoundException;
/**
* Returns the User object representing owner of specified account (account
@@ -409,7 +413,7 @@ public void modifyObject(Class type, String oid, Colle
* wrong OID format
*/
@Deprecated
- public PrismObject listAccountShadowOwner(String accountOid, OperationResult parentResult)
+ PrismObject listAccountShadowOwner(String accountOid, OperationResult parentResult)
throws ObjectNotFoundException;
/**
@@ -440,7 +444,7 @@ public PrismObject listAccountShadowOwner(String accountOid, Operation
* @throws IllegalArgumentException
* wrong OID format
*/
- public PrismObject searchShadowOwner(String shadowOid, Collection> options, OperationResult parentResult)
+ PrismObject searchShadowOwner(String shadowOid, Collection> options, OperationResult parentResult)
throws ObjectNotFoundException;
/**
@@ -471,14 +475,37 @@ public PrismObject searchShadowOwner(String shadowOid,
* @throws IllegalArgumentException
* wrong OID format
*/
- public List> listResourceObjectShadows(String resourceOid,
+ List> listResourceObjectShadows(String resourceOid,
Class resourceObjectShadowType, OperationResult parentResult) throws ObjectNotFoundException,
SchemaException;
+ /**
+ * Select specified rows from the lookup table.
+ *
+ * This operation works only on lookup tables. If OID of any other object
+ * is specified as a parameter it results in an error.
+ *
+ *
+ * @param lookupTableOid OID of the lookup table
+ * @param column name of the column to search
+ * @param searchValue value to search for
+ * @param searchType type of search (exact, substring, ...)
+ * @param paging paging parameters (page offset and size)
+ * @return selected table rows
+ *
+ * @throws ObjectNotFoundException
+ * specified object does not exist
+ * @throws SchemaException
+ * object is not of type {@link LookupTableType}
+ */
+ List searchLookupTable(String lookupTableOid, QName column, String searchValue,
+ LookupTableSearchType searchType, ObjectPaging paging) throws ObjectNotFoundException,
+ SchemaException;
+
/**
* Provide repository run-time configuration and diagnostic information.
*/
- public RepositoryDiag getRepositoryDiag();
+ RepositoryDiag getRepositoryDiag();
/**
* Runs a short, non-descructive repository self test.
@@ -492,7 +519,7 @@ public List> listResourceObjectShadows(Str
* If the repository has no self-tests then the method should return immediately
* without changing the result structure. It must not throw an exception in this case.
*/
- public void repositorySelfTest(OperationResult parentResult);
+ void repositorySelfTest(OperationResult parentResult);
/**
* Checks a closure for consistency, repairing any problems found.
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 643ef227edd..b3bed118010 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
@@ -18,7 +18,9 @@
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ItemDelta;
+import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
+import com.evolveum.midpoint.repo.api.LookupTableSearchType;
import com.evolveum.midpoint.repo.api.RepoAddOptions;
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.schema.GetOperationOptions;
@@ -34,15 +36,19 @@
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.LookupTableRowType;
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.TaskType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
+
import org.apache.commons.lang.Validate;
import java.util.Collection;
import java.util.List;
+import javax.xml.namespace.QName;
+
/**
* Read-through write-through per-session repository cache.
*
@@ -347,4 +353,11 @@ private void log(String message, Object... params) {
PERFORMANCE_ADVISOR.trace(message, params);
}
}
+
+ @Override
+ public List searchLookupTable(String lookupTableOid, QName column,
+ String searchValue, LookupTableSearchType searchType, ObjectPaging paging)
+ throws ObjectNotFoundException, SchemaException {
+ return repository.searchLookupTable(lookupTableOid, column, searchValue, searchType, paging);
+ }
}
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 6a67a27c016..7ee92cc06f3 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
@@ -26,6 +26,7 @@
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.query.*;
+import com.evolveum.midpoint.repo.api.LookupTableSearchType;
import com.evolveum.midpoint.repo.api.RepoAddOptions;
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.repo.sql.data.common.*;
@@ -1653,4 +1654,12 @@ private boolean isAnySubordinateAttempt(String upperOrgOid, Collection l
throw new SystemException("isAnySubordinateAttempt failed somehow, this really should not happen.");
}
+
+ @Override
+ public List searchLookupTable(String lookupTableOid, QName column,
+ String searchValue, LookupTableSearchType searchType, ObjectPaging paging)
+ throws ObjectNotFoundException, SchemaException {
+ // TODO implement
+ throw new UnsupportedOperationException();
+ }
}