Skip to content

Commit

Permalink
some preparation for reference search
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed Jan 24, 2023
1 parent bbe9231 commit ec2df32
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskSchedulingStateType.READY;

import java.io.PrintWriter;
import java.io.Serializable;
import java.io.StringWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
Expand Down Expand Up @@ -611,6 +612,23 @@ public static <T extends Containerable> QName containerClassToQName(PrismContext
return prismContext.getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(clazz).getTypeName();
}

public static <S extends Serializable> QName anyClassToQName(PrismContext prismContext, Class<S> clazz) {
if (ObjectReferenceType.class.equals(clazz)) {
return ObjectReferenceType.COMPLEX_TYPE;
}
if (ObjectType.class.isAssignableFrom(clazz)) {
return classToQName(prismContext, (Class<ObjectType>) clazz);
}
return containerClassToQName(prismContext, (Class<Containerable>) clazz);
}

public static <S extends Serializable> Class<S> qnameToAnyClass(PrismContext prismContext, QName qName) {
if (QNameUtil.match(ObjectReferenceType.COMPLEX_TYPE, qName)) {
return (Class<S>) ObjectReferenceType.class;
}
return (Class<S>) qnameToContainerClass(prismContext, qName);
}

public static <C extends Containerable> Class<C> qnameToContainerClass(PrismContext prismContext, QName type) {
PrismContainerDefinition<C> def = prismContext.getSchemaRegistry().findContainerDefinitionByType(type);
if (def == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import java.util.List;
import javax.xml.namespace.QName;

import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;

import org.apache.commons.lang3.StringUtils;

import com.evolveum.midpoint.gui.api.page.PageBase;
Expand All @@ -19,7 +21,6 @@
import com.evolveum.midpoint.gui.impl.component.search.wrapper.*;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.path.ItemPath;
Expand Down Expand Up @@ -231,7 +232,7 @@ public ObjectQuery createObjectQuery(VariablesMap variables, PageBase pageBase,
if (SearchBoxModeType.OID.equals(getSearchMode())) {
query = createObjectQueryOid(pageBase);
} else {
query = createObjectTypeItemQuery(pageBase);
query = createObjectTypeItemQuery();
ObjectQuery searchTypeQuery = null;
if (SearchBoxModeType.ADVANCED.equals(searchMode) || SearchBoxModeType.AXIOM_QUERY.equals(searchMode)) {
searchTypeQuery = createObjectQueryAdvanced(pageBase);
Expand All @@ -248,7 +249,10 @@ public ObjectQuery createObjectQuery(VariablesMap variables, PageBase pageBase,

query = mergeQueries(query, searchTypeQuery);
if (query == null) {
query = pageBase.getPrismContext().queryFor(getTypeClass()).build();
if (ObjectReferenceType.class.equals(getTypeClass())) {
query = pageBase.getPrismContext().queryForReferenceOwnedBy(ObjectType.class, null).build();
}
query = pageBase.getPrismContext().queryFor((Class<? extends Containerable>) getTypeClass()).build();
}

ObjectQuery archetypeQuery = evaluateCollectionFilter(pageBase);
Expand Down Expand Up @@ -288,13 +292,6 @@ private ObjectQuery createObjectQueryOid(PageBase pageBase) {

public OidSearchItemWrapper findOidSearchItemWrapper() {
return oidSearchItemWrapper;
// List<FilterableSearchItemWrapper> items = searchConfigurationWrapper.getItemsList();
// for (FilterableSearchItemWrapper item : items) {
// if (item instanceof OidSearchItemWrapper) {
// return (OidSearchItemWrapper) item;
// }
// }
// return null;
}

public ObjectCollectionSearchItemWrapper findObjectCollectionSearchItemWrapper() {
Expand All @@ -316,50 +313,76 @@ public AbstractRoleSearchItemWrapper findMemberSearchItem() {
return null;
}

private ObjectQuery createObjectTypeItemQuery(PageBase pageBase) {
ObjectQuery query;
if (getTypeClass() != null) {
query = pageBase.getPrismContext().queryFor(getTypeClass()).build();
} else {
query = pageBase.getPrismContext().queryFactory().createQuery();
}
private ObjectQuery createObjectTypeItemQuery() {
ObjectQuery query = PrismContext.get().queryFactory().createQuery();
return query;
}

private ObjectQuery evaluateCollectionFilter(PageBase pageBase) {
CompiledObjectCollectionView view;

OperationResult result = new OperationResult(OPERATION_EVALUATE_COLLECTION_FILTER);
Task task = pageBase.createSimpleTask(OPERATION_EVALUATE_COLLECTION_FILTER);
ObjectFilter collectionFilter = null;
if (findObjectCollectionSearchItemWrapper() != null && findObjectCollectionSearchItemWrapper().getObjectCollectionView() != null) {
view = findObjectCollectionSearchItemWrapper().getObjectCollectionView();
collectionFilter = view != null ? view.getFilter() : null;
} else if (StringUtils.isNotEmpty(getCollectionViewName())) {
view = pageBase.getCompiledGuiProfile()
.findObjectCollectionView(WebComponentUtil.containerClassToQName(pageBase.getPrismContext(), getTypeClass()),
getCollectionViewName());
collectionFilter = view != null ? view.getFilter() : null;
} else if (StringUtils.isNotEmpty(getCollectionRefOid())) {
try {
PrismObject<ObjectCollectionType> collection = WebModelServiceUtils.loadObject(ObjectCollectionType.class,
getCollectionRefOid(), pageBase, task, result);
if (collection != null && collection.asObjectable().getFilter() != null) {
collectionFilter = PrismContext.get().getQueryConverter().parseFilter(collection.asObjectable().getFilter(), getTypeClass());
}
} catch (SchemaException e) {
LOGGER.error("Failed to parse filter from object collection, oid {}, {}", getCollectionRefOid(), e.getStackTrace());
pageBase.error("Failed to parse filter from object collection, oid " + getCollectionRefOid());
}
}
ObjectFilter collectionFilter = getCollectionFilter(pageBase, task, result);

if (collectionFilter == null) {
return null;
}
ObjectQuery query = pageBase.getPrismContext().queryFor(getTypeClass()).build();
ObjectQuery query = pageBase.getPrismContext().queryFactory().createQuery();
query.addFilter(WebComponentUtil.evaluateExpressionsInFilter(collectionFilter, result, pageBase));
return query;

}

private ObjectFilter getCollectionFilter(PageBase pageBase, Task task, OperationResult result) {

CompiledObjectCollectionView view = determineObjectCollectionView(pageBase);
if (view != null) {
return getCollectionFilterFromView(view);
}

if (StringUtils.isNotEmpty(getCollectionRefOid())) {
return parseFilterFromCollectionRef(getCollectionRefOid(), pageBase, task, result);
}
return null;
}

private CompiledObjectCollectionView determineObjectCollectionView(PageBase pageBase) {
ObjectCollectionSearchItemWrapper objectCollectionSearchItemWrapper = findObjectCollectionSearchItemWrapper();
if (objectCollectionSearchItemWrapper != null && objectCollectionSearchItemWrapper.getObjectCollectionView() != null) {
return objectCollectionSearchItemWrapper.getObjectCollectionView();
}
if (StringUtils.isNotEmpty(getCollectionViewName())) {
return pageBase.getCompiledGuiProfile()
.findObjectCollectionView(WebComponentUtil.anyClassToQName(pageBase.getPrismContext(), getTypeClass()),
getCollectionViewName());
}
return null;
}

private ObjectFilter getCollectionFilterFromView(CompiledObjectCollectionView view) {
return view != null ? view.getFilter() : null;
}

private ObjectFilter parseFilterFromCollectionRef(String collectionRefOid, PageBase pageBase, Task task, OperationResult result) {
try {
PrismObject<ObjectCollectionType> collection = WebModelServiceUtils.loadObject(ObjectCollectionType.class,
collectionRefOid, pageBase, task, result);
SearchFilterType filter = getFilterFromCollection(collection);
if (filter == null) {
return null;
}
return PrismContext.get().getQueryConverter().parseFilter(filter, (Class<? extends Containerable>) getTypeClass());
} catch (SchemaException e) {
LOGGER.error("Failed to parse filter from object collection, oid {}, {}", getCollectionRefOid(), e.getStackTrace());
pageBase.error("Failed to parse filter from object collection, oid " + getCollectionRefOid());
}
return null;
}

private SearchFilterType getFilterFromCollection(PrismObject<ObjectCollectionType> collection) {
return collection != null ? collection.asObjectable().getFilter() : null;
}

private ObjectQuery mergeQueries(ObjectQuery origQuery, ObjectQuery query) {
if (query != null) {
if (origQuery == null) {
Expand All @@ -379,11 +402,7 @@ private ObjectQuery createObjectQuerySimple(VariablesMap defaultVariables, PageB

ObjectQuery query = null;
if (query == null) {
if (getTypeClass() != null) {
query = pageBase.getPrismContext().queryFor(getTypeClass()).build();
} else {
query = pageBase.getPrismContext().queryFactory().createQuery();
}
query = pageBase.getPrismContext().queryFactory().createQuery();
}
List<ObjectFilter> filters = getSearchItemFilterList(pageBase, defaultVariables);
if (filters != null) {
Expand Down

0 comments on commit ec2df32

Please sign in to comment.