Skip to content

Commit

Permalink
query translation almost implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Aug 20, 2015
1 parent 49ddfc6 commit bed42c6
Show file tree
Hide file tree
Showing 4 changed files with 140 additions and 92 deletions.
@@ -1,11 +1,18 @@
package com.evolveum.midpoint.web.component.search;

import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
* @author Viliam Repan (lazyman)
Expand All @@ -15,15 +22,17 @@ public class Search implements Serializable {
public static final String F_AVAILABLE_DEFINITIONS = "availableDefinitions";
public static final String F_ITEMS = "items";

private List<ItemDefinition> allDefinitions;
private Class<? extends ObjectType> type;
private Map<ItemPath, ItemDefinition> allDefinitions;

private List<ItemDefinition> availableDefinitions = new ArrayList<>();
private List<SearchItem> items = new ArrayList<>();

public Search(List<ItemDefinition> allDefinitions) {
public Search(Class<? extends ObjectType> type, Map<ItemPath, ItemDefinition> allDefinitions) {
this.type = type;
this.allDefinitions = allDefinitions;

availableDefinitions.addAll(allDefinitions);
availableDefinitions.addAll(allDefinitions.values());
}

public List<SearchItem> getItems() {
Expand All @@ -34,18 +43,91 @@ public List<ItemDefinition> getAvailableDefinitions() {
return Collections.unmodifiableList(availableDefinitions);
}

public void add(SearchItem item) {
if (!availableDefinitions.contains(item.getDefinition())) {
return;
public SearchItem addItem(ItemDefinition def) {
if (!availableDefinitions.contains(def)) {
return null;
}

ItemPath path = null;
for (Map.Entry<ItemPath, ItemDefinition> entry : allDefinitions.entrySet()) {
if (entry.getValue().equals(def)) {
path = entry.getKey();
break;
}
}

if (path == null) {
return null;
}

SearchItem item = new SearchItem(this, path, def);
items.add(item);
availableDefinitions.remove(item.getDefinition());

return item;
}

public void delete(SearchItem item) {
if (items.remove(item)) {
availableDefinitions.add(item.getDefinition());
}
}

public Class<? extends ObjectType> getType() {
return type;
}

public ObjectQuery createObjectQuery(PrismContext ctx) {
List<SearchItem> searchItems = getItems();
if (searchItems.isEmpty()) {
return null;
}

List<ObjectFilter> conditions = new ArrayList<>();
for (SearchItem item : searchItems) {
ObjectFilter filter = createFilterFromItem(item, ctx);
if (filter != null) {
conditions.add(filter);
}
}

switch (conditions.size()) {
case 0:
return null;
case 1:
return ObjectQuery.createObjectQuery(conditions.get(0));
default:
AndFilter and = AndFilter.createAnd(conditions);
return ObjectQuery.createObjectQuery(and);
}
}

private ObjectFilter createFilterFromItem(SearchItem item, PrismContext ctx) {
if (item.getValue() == null) {
return null;
}

ItemDefinition definition = item.getDefinition();
ItemPath path = item.getPath();

if (definition instanceof PrismReferenceDefinition) {
DisplayableValue<PrismReferenceValue> displayableValue = (DisplayableValue) item.getValue();
PrismReferenceValue value = displayableValue.getValue();
return RefFilter.createReferenceEqual(path, (PrismReferenceDefinition) definition, value);
}

PrismPropertyDefinition propDef = (PrismPropertyDefinition) definition;
if (propDef.getAllowedValues() != null && !propDef.getAllowedValues().isEmpty()) {
//we're looking for enum value, therefore equals filter is ok
DisplayableValue displayableValue = (DisplayableValue) item.getValue();
Object value = displayableValue.getValue();
return EqualFilter.createEqual(path, propDef, value);
}

//we're looking for string value, therefore substring filter should be used
String text = (String) item.getValue();
PolyStringNormalizer normalizer = ctx.getDefaultPolyStringNormalizer();
String value = normalizer.normalize(text);
return SubstringFilter.createSubstring(path, propDef, PolyStringNormMatchingRule.NAME, value);
}
}
Expand Up @@ -5,105 +5,107 @@
import com.evolveum.midpoint.prism.schema.SchemaRegistry;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @author Viliam Repan (lazyman)
*/
public class SearchFactory {

public static <T extends ObjectType> Search createSearch(Class<T> type, PrismContext ctx) {
List<ItemDefinition> availableDefs = getAvailableDefinitionsForUser(ctx);
Map<ItemPath, ItemDefinition> availableDefs = getAvailableDefinitionsForUser(ctx);

Search search = new Search(availableDefs);
Search search = new Search(type, availableDefs);

SchemaRegistry registry = ctx.getSchemaRegistry();
PrismObjectDefinition objDef = registry.findObjectDefinitionByCompileTimeClass(ObjectType.class);
PrismPropertyDefinition def = objDef.findPropertyDefinition(ObjectType.F_NAME);

SearchItem item = new SearchItem(search, def);
search.add(item);
search.addItem(def);

return search;
}

private static List<ItemDefinition> getAvailableDefinitionsForObject(PrismContext ctx) {
List<ItemDefinition> list = new ArrayList<>();
private static Map<ItemPath, ItemDefinition> getAvailableDefinitionsForObject(PrismContext ctx) {
Map<ItemPath, ItemDefinition> map = new HashMap<>();

List<ItemDefinition> object = createAvailableDefinitions(UserType.class, ctx,
Map<ItemPath, ItemDefinition> object = createAvailableDefinitions(UserType.class, ctx,
new ItemPath(ObjectType.F_NAME),
new ItemPath(ObjectType.F_PARENT_ORG_REF),
new ItemPath(ObjectType.F_TENANT_REF));
list.addAll(object);
map.putAll(object);

return list;
return map;
}

private static List<ItemDefinition> getAvailableDefinitionsForFocus(PrismContext ctx) {
List<ItemDefinition> list = getAvailableDefinitionsForObject(ctx);
private static Map<ItemPath, ItemDefinition> getAvailableDefinitionsForFocus(PrismContext ctx) {
Map<ItemPath, ItemDefinition> map = getAvailableDefinitionsForObject(ctx);

List<ItemDefinition> user = createAvailableDefinitions(UserType.class, ctx,
Map<ItemPath, ItemDefinition> user = createAvailableDefinitions(UserType.class, ctx,
new ItemPath(FocusType.F_LINK_REF),
new ItemPath(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF),
new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS));
list.addAll(user);
map.putAll(user);

return list;
return map;
}

private static List<ItemDefinition> getAvailableDefinitionsForUser(PrismContext ctx) {
List<ItemDefinition> list = getAvailableDefinitionsForFocus(ctx);
private static Map<ItemPath, ItemDefinition> getAvailableDefinitionsForUser(PrismContext ctx) {
Map<ItemPath, ItemDefinition> map = getAvailableDefinitionsForFocus(ctx);

list.addAll(createExtensionDefinitionList(UserType.class, ctx));
map.putAll(createExtensionDefinitionList(UserType.class, ctx));

List<ItemDefinition> user = createAvailableDefinitions(UserType.class, ctx,
Map<ItemPath, ItemDefinition> user = createAvailableDefinitions(UserType.class, ctx,
new ItemPath(UserType.F_GIVEN_NAME),
new ItemPath(UserType.F_FAMILY_NAME),
new ItemPath(UserType.F_FULL_NAME),
new ItemPath(UserType.F_ADDITIONAL_NAME),
new ItemPath(UserType.F_COST_CENTER));
list.addAll(user);
map.putAll(user);

return list;
return map;
}

private static <T extends ObjectType> List<ItemDefinition> createExtensionDefinitionList(
private static <T extends ObjectType> Map<ItemPath, ItemDefinition> createExtensionDefinitionList(
Class<T> type, PrismContext ctx) {

List<ItemDefinition> list = new ArrayList<>();
Map<ItemPath, ItemDefinition> map = new HashMap<>();

SchemaRegistry registry = ctx.getSchemaRegistry();
PrismObjectDefinition objDef = registry.findObjectDefinitionByCompileTimeClass(type);

ItemPath extensionPath = new ItemPath(ObjectType.F_EXTENSION);

PrismContainerDefinition ext = objDef.findContainerDefinition(ObjectType.F_EXTENSION);
for (ItemDefinition def : (List<ItemDefinition>) ext.getDefinitions()) {
if (!(def instanceof PrismPropertyDefinition)
&& !(def instanceof PrismReferenceDefinition)) {
continue;
}

list.add(def);
map.put(new ItemPath(extensionPath, def.getName()), def);
}

return list;
return map;
}

private static <T extends ObjectType> List<ItemDefinition> createAvailableDefinitions(
private static <T extends ObjectType> Map<ItemPath, ItemDefinition> createAvailableDefinitions(
Class<T> type, PrismContext ctx, ItemPath... paths) {

List<ItemDefinition> list = new ArrayList<>();
Map<ItemPath, ItemDefinition> map = new HashMap<>();

SchemaRegistry registry = ctx.getSchemaRegistry();
PrismObjectDefinition objDef = registry.findObjectDefinitionByCompileTimeClass(type);

for (ItemPath path : paths) {
ItemDefinition def = objDef.findItemDefinition(path);
if (def != null) {
list.add(def);
map.put(path, def);
}
}

return list;
return map;
}
}
Expand Up @@ -3,6 +3,7 @@
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.PrismReferenceDefinition;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.DisplayableValue;
import org.apache.commons.lang.StringUtils;
Expand All @@ -26,11 +27,13 @@ public enum Type {

private Search search;

private ItemPath path;
private ItemDefinition definition;
private T value;
private String displayValue;

public SearchItem(Search search, ItemDefinition definition) {
public SearchItem(Search search, ItemPath path, ItemDefinition definition) {
Validate.notNull(path, "Item path must not be null.");
Validate.notNull(definition, "Item definition must not be null.");

if (!(definition instanceof PrismPropertyDefinition)
Expand All @@ -39,9 +42,14 @@ public SearchItem(Search search, ItemDefinition definition) {
}

this.search = search;
this.path = path;
this.definition = definition;
}

public ItemPath getPath() {
return path;
}

public ItemDefinition getDefinition() {
return definition;
}
Expand Down Expand Up @@ -83,7 +91,7 @@ public void setValue(T value) {
if (value instanceof DisplayableValue) {
DisplayableValue dv = (DisplayableValue) value;
displayValue = dv.getLabel();
} else if (value != null){
} else if (value != null) {
displayValue = value.toString();
}
setDisplayValue(displayValue);
Expand Down

0 comments on commit bed42c6

Please sign in to comment.