diff --git a/build-system/pom.xml b/build-system/pom.xml
index aaf561f3b18..057e40f7977 100644
--- a/build-system/pom.xml
+++ b/build-system/pom.xml
@@ -83,7 +83,7 @@
5.22.0
1.3
2.0.6
- 1.4.3.41
+ 1.4.3.43
6.5.0
10.11.1.1
1.8.0
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/DisplayNamePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/DisplayNamePanel.java
index 63d314f58df..05d55ad025a 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/DisplayNamePanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/DisplayNamePanel.java
@@ -163,8 +163,7 @@ private boolean isIdentifierVisible() {
// TODO: maybe move relation methods to subclass if we want this panel to be really reusable
private boolean isRelationVisible() {
- QName relation = getRelation();
- return relation != null && !QNameUtil.match(SchemaConstants.ORG_DEFAULT, relation);
+ return !WebComponentUtil.isDefaultRelation(getRelation());
}
private boolean isKindIntentVisible(IModel kindIntentLabelModel) {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MemberPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MemberPopupTabPanel.java
index 9fa35cdaa4b..8611200336c 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MemberPopupTabPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MemberPopupTabPanel.java
@@ -18,24 +18,17 @@
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
-import com.evolveum.midpoint.schema.constants.ObjectTypes;
-import com.evolveum.midpoint.schema.constants.RelationTypes;
-import com.evolveum.midpoint.schema.constants.SchemaConstants;
-import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
-import com.evolveum.midpoint.web.component.input.DropDownChoicePanel;
import com.evolveum.midpoint.web.component.input.RelationDropDownChoicePanel;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
-import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.collections.CollectionUtils;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.Fragment;
-import org.apache.wicket.model.Model;
import javax.xml.namespace.QName;
import java.util.ArrayList;
@@ -94,8 +87,7 @@ protected ObjectDelta prepareDelta(){
Class classType = WebComponentUtil.qnameToClass(pageBase.getPrismContext(), getObjectType().getTypeQName());
delta = ObjectDelta.createEmptyModifyDelta(classType, "fakeOid", pageBase.getPrismContext());
AssignmentType newAssignment = new AssignmentType();
- ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getAbstractRoleTypeObject());
- ref.setRelation(getRelationValue());
+ ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getAbstractRoleTypeObject(), getRelationValue());
newAssignment.setTargetRef(ref);
pageBase.getPrismContext().adopt(newAssignment);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MultiTypesMemberPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MultiTypesMemberPopupTabPanel.java
index 17e47e8ebd1..e721fd817f3 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MultiTypesMemberPopupTabPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MultiTypesMemberPopupTabPanel.java
@@ -19,15 +19,9 @@
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
-import com.evolveum.midpoint.schema.constants.RelationTypes;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
-import com.evolveum.midpoint.task.api.Task;
-import com.evolveum.midpoint.task.api.TaskCategory;
-import com.evolveum.midpoint.util.exception.SchemaException;
-import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
-import com.evolveum.midpoint.web.page.admin.roles.AbstractRoleMemberPanel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -35,8 +29,6 @@
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.EnumChoiceRenderer;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
import javax.xml.namespace.QName;
import java.util.ArrayList;
@@ -93,8 +85,7 @@ protected void onUpdate(AjaxRequestTarget target) {
@Override
protected ObjectDelta prepareDelta(){
Class classType = WebComponentUtil.qnameToClass(getPageBase().getPrismContext(), getObjectType().getTypeQName());
- ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getAbstractRoleTypeObject());
- ref.setRelation(getRelationValue());
+ ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getAbstractRoleTypeObject(), getRelationValue());
return ObjectDelta.createModificationAddReference(classType, "fakeOid",
ObjectType.F_PARENT_ORG_REF, getPageBase().getPrismContext(),
ref.asReferenceValue());
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java
index c4215ced7e2..103dcfb3f41 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java
@@ -161,7 +161,9 @@ protected Map getSelectedAssignmentsMap(){
ShadowKindType kind = getKindValue();
String intent = getIntentValue();
selectedObjects.forEach(selectedObject -> {
- assignmentList.put(selectedObject.getOid(), ObjectTypeUtil.createAssignmentWithConstruction(selectedObject.asPrismObject(), kind, intent));
+ assignmentList.put(selectedObject.getOid(),
+ ObjectTypeUtil.createAssignmentWithConstruction(
+ selectedObject.asPrismObject(), kind, intent, getPageBase().getPrismContext()));
});
return assignmentList;
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/TypedAssignablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/TypedAssignablePanel.java
index 367d98f31dd..33fc2f84b1b 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/TypedAssignablePanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/TypedAssignablePanel.java
@@ -364,7 +364,7 @@ private QName getSelectedRelation(){
DropDownChoicePanel relationPanel = (DropDownChoicePanel) get(ID_RELATION_CONTAINER).get(ID_RELATION);
RelationTypes relation = relationPanel.getModel().getObject();
if (relation == null) {
- return SchemaConstants.ORG_DEFAULT;
+ return WebComponentUtil.getDefaultRelationOrFail();
}
return relation.getRelation();
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java
index 04a19e6d8ea..fcb08ae61a0 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java
@@ -47,6 +47,7 @@
import com.evolveum.midpoint.repo.common.expression.ExpressionFactory;
import com.evolveum.midpoint.repo.common.expression.ExpressionVariables;
import com.evolveum.midpoint.report.api.ReportManager;
+import com.evolveum.midpoint.schema.RelationRegistry;
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
@@ -164,9 +165,7 @@
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
-import javax.xml.namespace.QName;
-import java.io.Serializable;
import java.util.*;
/**
@@ -357,7 +356,7 @@ protected Integer load() {
Task task = createSimpleTask(OPERATION_LOAD_WORK_ITEM_COUNT);
S_FilterEntryOrEmpty q = QueryBuilder.queryFor(WorkItemType.class, getPrismContext());
ObjectQuery query = QueryUtils.filterForAssignees(q, getPrincipal(),
- OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS).build();
+ OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getRelationRegistry()).build();
return getModelService().countContainers(WorkItemType.class, query, null, task, task.getResult());
} catch (SchemaException | SecurityViolationException | ExpressionEvaluationException | ObjectNotFoundException | CommunicationException | ConfigurationException e) {
LoggingUtils.logExceptionAsWarning(LOGGER, "Couldn't load work item count", e);
@@ -471,6 +470,10 @@ public PrismContext getPrismContext() {
return getMidpointApplication().getPrismContext();
}
+ public RelationRegistry getRelationRegistry() {
+ return getMidpointApplication().getRelationRegistry();
+ }
+
public ExpressionFactory getExpressionFactory() {
return getMidpointApplication().getExpressionFactory();
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java
index 680715cb6cd..dfa74ed13ff 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java
@@ -16,7 +16,6 @@
package com.evolveum.midpoint.gui.api.util;
import static com.evolveum.midpoint.gui.api.page.PageBase.createStringResourceStatic;
-import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.normalizeRelation;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -41,8 +40,6 @@
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
-import javax.xml.datatype.DatatypeConfigurationException;
-import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
@@ -52,13 +49,10 @@
import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty;
-import com.evolveum.midpoint.schema.GetOperationOptions;
-import com.evolveum.midpoint.schema.SelectorOptions;
+import com.evolveum.midpoint.schema.*;
import com.evolveum.midpoint.schema.util.LocalizationUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.*;
-import com.evolveum.midpoint.util.exception.CommunicationException;
-import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.web.component.breadcrumbs.Breadcrumb;
import com.evolveum.midpoint.web.component.breadcrumbs.BreadcrumbPageClass;
import com.evolveum.midpoint.web.component.breadcrumbs.BreadcrumbPageInstance;
@@ -66,8 +60,6 @@
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction;
import com.evolveum.midpoint.web.component.prism.*;
-import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails;
-import com.evolveum.midpoint.web.page.admin.reports.dto.ReportDeleteDialogDto;
import com.evolveum.midpoint.web.util.ObjectTypeGuiDescriptor;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.collections4.CollectionUtils;
@@ -138,8 +130,6 @@
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
-import com.evolveum.midpoint.schema.DeltaConvertor;
-import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
@@ -205,7 +195,11 @@ public final class WebComponentUtil {
private static final String KEY_BOOLEAN_TRUE = "Boolean.TRUE";
private static final String KEY_BOOLEAN_FALSE = "Boolean.FALSE";
- private static DatatypeFactory df = null;
+ /**
+ * To be used only for tests when there's no MidpointApplication.
+ * (Quite a hack. Replace eventually by a more serious solution.)
+ */
+ private static RelationRegistry staticallyProvidedRelationRegistry;
private static Map, Class extends PageBase>> objectDetailsPageMap;
@@ -481,14 +475,6 @@ public String getChannel() {
}
}
- static {
- try {
- df = DatatypeFactory.newInstance();
- } catch (DatatypeConfigurationException dce) {
- throw new IllegalStateException("Exception while obtaining Datatype Factory instance", dce);
- }
- }
-
public static DateValidator getRangeValidator(Form> form, ItemPath path) {
DateValidator validator = null;
List validators = form.getBehaviors(DateValidator.class);
@@ -1113,8 +1099,8 @@ public static String getDisplayName(PrismContainerValu
if (prismContainerValue.canRepresent(AssignmentType.class)) {
AssignmentType assignmentType = (AssignmentType) prismContainerValue.asContainerable();
if (assignmentType.getTargetRef() != null){
- ObjectReferenceType assignemntTargetRef = assignmentType.getTargetRef();
- return getName(assignemntTargetRef) + " - " + normalizeRelation(assignemntTargetRef.getRelation()).getLocalPart();
+ ObjectReferenceType assignmentTargetRef = assignmentType.getTargetRef();
+ return getName(assignmentTargetRef) + " - " + normalizeRelation(assignmentTargetRef.getRelation()).getLocalPart();
} else {
return "AssignmentTypeDetailsPanel.containerTitle";
}
@@ -1192,6 +1178,10 @@ public static String getDisplayName(PrismContainerValu
return "ContainerPanel.containerProperties";
}
+ public static QName normalizeRelation(QName relation) {
+ return getRelationRegistry().normalizeRelation(relation);
+ }
+
public static String getDisplayNameOrName(PrismObject object) {
if (object == null) {
return null;
@@ -1667,6 +1657,79 @@ public static String getBoxThinCssClasses(QName objectTyp
}
}
+ // can this implementation be made more efficient? [pm]
+ @SuppressWarnings("WeakerAccess")
+ public static boolean isOfKind(QName relation, RelationKindType kind) {
+ return getRelationRegistry().isOfKind(relation, kind);
+ }
+
+ protected static RelationRegistry getRelationRegistry() {
+ if (staticallyProvidedRelationRegistry != null) {
+ return staticallyProvidedRelationRegistry;
+ } else {
+ return MidPointApplication.get().getRelationRegistry();
+ }
+ }
+
+ public static boolean isManagerRelation(QName relation) {
+ return isOfKind(relation, RelationKindType.MANAGER);
+ }
+
+ public static boolean isDefaultRelation(QName relation) {
+ return getRelationRegistry().isDefault(relation);
+ }
+
+ @SuppressWarnings("WeakerAccess")
+ public static QName getDefaultRelation() {
+ return getRelationRegistry().getDefaultRelation();
+ }
+
+ @NotNull
+ public static QName getDefaultRelationOrFail() {
+ QName relation = getDefaultRelation();
+ if (relation != null) {
+ return relation;
+ } else {
+ throw new IllegalStateException("No default relation is defined");
+ }
+ }
+
+ @SuppressWarnings("WeakerAccess")
+ @Nullable
+ public static QName getDefaultRelationFor(RelationKindType kind) {
+ return getRelationRegistry().getDefaultRelationFor(kind);
+ }
+
+ @NotNull
+ public static QName getDefaultRelationOrFail(RelationKindType kind) {
+ QName relation = getDefaultRelationFor(kind);
+ if (relation != null) {
+ return relation;
+ } else {
+ throw new IllegalStateException("No default relation for kind " + kind);
+ }
+ }
+
+ @NotNull
+ public static String getRelationHeaderLabelKey(QName relation) {
+ String label = getRelationHeaderLabelKeyIfKnown(relation);
+ if (label != null) {
+ return label;
+ } else {
+ return relation != null ? relation.getLocalPart() : "default";
+ }
+ }
+
+ @Nullable
+ public static String getRelationHeaderLabelKeyIfKnown(QName relation) {
+ RelationDefinitionType definition = getRelationRegistry().getRelationDefinition(relation);
+ if (definition != null && definition.getDisplay() != null && definition.getDisplay().getLabel() != null) {
+ return definition.getDisplay().getLabel();
+ } else {
+ return null;
+ }
+ }
+
public static String createUserIcon(PrismObject object) {
UserType user = object.asObjectable();
@@ -1688,7 +1751,7 @@ public static String createUserIcon(PrismObject object) {
boolean isManager = false;
for (ObjectReferenceType parentOrgRef : user.getParentOrgRef()) {
- if (ObjectTypeUtil.isManagerRelation(parentOrgRef.getRelation())) {
+ if (isManagerRelation(parentOrgRef.getRelation())) {
isManager = true;
break;
}
@@ -2003,7 +2066,7 @@ public static boolean isObjectOrgManager(PrismObject extends ObjectType> objec
List parentOrgRefs = objectType.getParentOrgRef();
for (ObjectReferenceType ref : parentOrgRefs) {
- if (ObjectTypeUtil.isManagerRelation(ref.getRelation())) {
+ if (isManagerRelation(ref.getRelation())) {
return true;
}
}
@@ -2426,7 +2489,8 @@ public static boolean getElementVisibility(UserInterfaceElementVisibilityType vi
return true;
}
- public static IModel createAbstractRoleConfirmationMessage(String actionName, ColumnMenuAction action, MainObjectListPanel abstractRoleTable, PageBase pageBase) {
+ public static IModel createAbstractRoleConfirmationMessage(String actionName,
+ ColumnMenuAction action, MainObjectListPanel abstractRoleTable, PageBase pageBase) {
List selectedRoles = new ArrayList<>();
if (action.getRowModel() == null) {
selectedRoles.addAll(abstractRoleTable.getSelectedObjects());
@@ -2436,7 +2500,11 @@ public static IModel createAbstractRoleCon
OperationResult result = new OperationResult("Search Members");
boolean atLeastOneWithMembers = false;
for (AR selectedRole : selectedRoles) {
- ObjectQuery query = QueryBuilder.queryFor(FocusType.class, pageBase.getPrismContext()).item(FocusType.F_ROLE_MEMBERSHIP_REF).ref(ObjectTypeUtil.createObjectRef(selectedRole).asReferenceValue()).maxSize(1).build();
+ ObjectQuery query = QueryBuilder.queryFor(FocusType.class, pageBase.getPrismContext())
+ .item(FocusType.F_ROLE_MEMBERSHIP_REF)// TODO MID-3581
+ .ref(ObjectTypeUtil.createObjectRef(selectedRole, pageBase.getPrismContext()).asReferenceValue())
+ .maxSize(1)
+ .build();
List> members = WebModelServiceUtils.searchObjects(FocusType.class, query, result, pageBase);
if (CollectionUtils.isNotEmpty(members)) {
atLeastOneWithMembers = true;
@@ -2518,32 +2586,28 @@ public static ItemVisibility checkShadowActivationAndPasswordVisibility(ItemWrap
public static List getCategoryRelationChoices(AreaCategoryType category, ModelServiceLocator pageBase){
List relationsList = new ArrayList<>();
List defList = getRelationDefinitions(pageBase);
- if (defList != null) {
- defList.forEach(def -> {
- if (def.getCategory() != null && def.getCategory().contains(category)) {
- relationsList.add(def.getRef());
- }
- });
- }
+ defList.forEach(def -> {
+ if (def.getCategory() != null && def.getCategory().contains(category)) {
+ relationsList.add(def.getRef());
+ }
+ });
return relationsList;
}
public static List getAllRelations(ModelServiceLocator pageBase) {
- List allRelationdefinitions = getRelationDefinitions(pageBase);
- List allRelationsQName = new ArrayList<>(allRelationdefinitions.size());
- allRelationdefinitions.stream().forEach(relation -> allRelationsQName.add(relation.getRef()));
+ List allRelationDefinitions = getRelationDefinitions(pageBase);
+ List allRelationsQName = new ArrayList<>(allRelationDefinitions.size());
+ allRelationDefinitions.forEach(relation -> allRelationsQName.add(relation.getRef()));
return allRelationsQName;
}
- public static List getRelationDefinitions(ModelServiceLocator pageBase){
- OperationResult result = new OperationResult("get relation definitions");
- try {
- return pageBase.getModelInteractionService().getRelationDefinitions(result);
- } catch (ObjectNotFoundException | SchemaException ex){
- result.computeStatus();
- LOGGER.error("Unable to load relation definitions, " + ex.getLocalizedMessage());
- }
- return null;
+ @NotNull
+ public static List getRelationDefinitions(ModelServiceLocator pageBase) {
+ return pageBase.getModelInteractionService().getRelationDefinitions();
+ }
+
+ public static RelationDefinitionType getRelationDefinition(QName relation) {
+ return getRelationRegistry().getRelationDefinition(relation);
}
public static DropDownChoice createTriStateCombo(String id, IModel model) {
@@ -2728,7 +2792,16 @@ private Map prepareExtensionValues(Collection oids) throw
});
return menuItems;
}
-
+
+ @SuppressWarnings("unused")
+ public static RelationRegistry getStaticallyProvidedRelationRegistry() {
+ return staticallyProvidedRelationRegistry;
+ }
+
+ public static void setStaticallyProvidedRelationRegistry(RelationRegistry staticallyProvidedRelationRegistry) {
+ WebComponentUtil.staticallyProvidedRelationRegistry = staticallyProvidedRelationRegistry;
+ }
+
public static String loadHelpText(IModel model, Panel panel) {
if(model == null || model.getObject() == null) {
return null;
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java
index 91834255daa..9e5a9af7b2b 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java
@@ -33,7 +33,6 @@
import com.evolveum.midpoint.web.component.prism.ItemWrapper;
import com.evolveum.midpoint.web.component.prism.ObjectWrapper;
import com.evolveum.midpoint.web.component.prism.ObjectWrapperFactory;
-import com.evolveum.midpoint.web.component.prism.PropertyOrReferenceWrapper;
import com.evolveum.midpoint.web.component.prism.ValueStatus;
import com.evolveum.midpoint.web.page.error.PageError;
import com.evolveum.midpoint.web.page.login.PageLogin;
@@ -160,7 +159,7 @@ public static List createObjectRefer
for(PrismObject object: objects){
referenceMap.put(object.getOid(), WebComponentUtil.getName(object));
- references.add(ObjectTypeUtil.createObjectRef(object));
+ references.add(ObjectTypeUtil.createObjectRef(object, page.getPrismContext()));
}
return references;
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointErrorPageRegistrar.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointErrorPageRegistrar.java
new file mode 100644
index 00000000000..c0866d9c0f5
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointErrorPageRegistrar.java
@@ -0,0 +1,23 @@
+package com.evolveum.midpoint.web.boot;
+
+import org.springframework.boot.web.server.ErrorPage;
+import org.springframework.boot.web.server.ErrorPageRegistrar;
+import org.springframework.boot.web.server.ErrorPageRegistry;
+import org.springframework.http.HttpStatus;
+
+import com.evolveum.midpoint.web.security.MidPointApplication;
+
+public class MidPointErrorPageRegistrar implements ErrorPageRegistrar {
+
+ @Override
+ public void registerErrorPages(ErrorPageRegistry registry) {
+
+ registry.addErrorPages(
+ new ErrorPage(HttpStatus.UNAUTHORIZED, MidPointApplication.MOUNT_UNAUTHORIZED_ERROR),
+ new ErrorPage(HttpStatus.FORBIDDEN, MidPointApplication.MOUNT_FORBIDEN_ERROR),
+ new ErrorPage(HttpStatus.NOT_FOUND, MidPointApplication.MOUNT_NOT_FOUND_ERROR),
+ new ErrorPage(HttpStatus.GONE, MidPointApplication.MOUNT_GONE_ERROR),
+ new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, MidPointApplication.MOUNT_INTERNAL_SERVER_ERROR));
+ }
+
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java
index 1487119ba27..ffd9a69d0ce 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java
@@ -16,13 +16,11 @@
package com.evolveum.midpoint.web.boot;
-import com.evolveum.midpoint.gui.impl.util.ReportPeerQueryInterceptor;
-import com.evolveum.midpoint.init.StartupConfiguration;
-import com.evolveum.midpoint.model.api.authentication.NodeAuthenticationEvaluator;
-import com.evolveum.midpoint.prism.schema.CatalogImpl;
-import com.evolveum.midpoint.util.logging.Trace;
-import com.evolveum.midpoint.util.logging.TraceManager;
-import com.evolveum.midpoint.web.util.MidPointProfilingServletFilter;
+import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.time.Duration;
+
+import javax.servlet.DispatcherType;
import org.apache.catalina.Valve;
import org.apache.commons.lang.StringUtils;
@@ -35,27 +33,23 @@
import org.springframework.boot.ExitCodeGenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
-import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
-import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration;
-import org.springframework.boot.actuate.autoconfigure.web.mappings.MappingsEndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration;
-import org.springframework.boot.actuate.endpoint.EndpointFilter;
-import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
-import org.springframework.boot.actuate.endpoint.web.EndpointServlet;
-import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointDiscoverer;
-import org.springframework.boot.actuate.health.HealthEndpoint;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration;
import org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration;
import org.springframework.boot.autoconfigure.web.ServerProperties;
-import org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration;
-import org.springframework.boot.autoconfigure.web.servlet.*;
+import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
+import org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration;
+import org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration;
+import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryCustomizer;
+import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.ErrorPage;
+import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
@@ -70,14 +64,16 @@
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextListener;
import org.springframework.web.filter.DelegatingFilterProxy;
-import ro.isdc.wro.http.WroFilter;
-import javax.servlet.DispatcherType;
-import javax.servlet.Servlet;
+import com.evolveum.midpoint.gui.impl.util.ReportPeerQueryInterceptor;
+import com.evolveum.midpoint.init.StartupConfiguration;
+import com.evolveum.midpoint.model.api.authentication.NodeAuthenticationEvaluator;
+import com.evolveum.midpoint.prism.schema.CatalogImpl;
+import com.evolveum.midpoint.util.logging.Trace;
+import com.evolveum.midpoint.util.logging.TraceManager;
+import com.evolveum.midpoint.web.util.MidPointProfilingServletFilter;
-import java.io.File;
-import java.lang.management.ManagementFactory;
-import java.time.Duration;
+import ro.isdc.wro.http.WroFilter;
/**
* Created by Viliam Repan (lazyman).
@@ -188,23 +184,24 @@ private static SpringApplicationBuilder configureApplication(SpringApplicationBu
}
@Bean
- public ServletListenerRegistrationBean requestContextListener() {
- return new ServletListenerRegistrationBean(new RequestContextListener());
+ public ServletListenerRegistrationBean requestContextListener() {
+ return new ServletListenerRegistrationBean<>(new RequestContextListener());
}
@Bean
- public FilterRegistrationBean midPointProfilingServletFilter() {
- FilterRegistrationBean registration = new FilterRegistrationBean();
+ public FilterRegistrationBean midPointProfilingServletFilter() {
+ FilterRegistrationBean registration = new FilterRegistrationBean<>();
registration.setFilter(new MidPointProfilingServletFilter());
+// registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
registration.addUrlPatterns("/*");
return registration;
}
@Bean
- public FilterRegistrationBean wicket() {
- FilterRegistrationBean registration = new FilterRegistrationBean();
+ public FilterRegistrationBean wicket() {
+ FilterRegistrationBean registration = new FilterRegistrationBean<>();
registration.setFilter(new WicketFilter());
- registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ERROR);
+ registration.setDispatcherTypes(DispatcherType.ERROR, DispatcherType.REQUEST, DispatcherType.FORWARD);
registration.addUrlPatterns("/*");
registration.addInitParameter(WicketFilter.FILTER_MAPPING_PARAM, "/*");
registration.addInitParameter(Application.CONFIGURATION, "deployment"); // development
@@ -215,16 +212,16 @@ public FilterRegistrationBean wicket() {
}
@Bean
- public FilterRegistrationBean springSecurityFilterChain() {
- FilterRegistrationBean registration = new FilterRegistrationBean();
+ public FilterRegistrationBean springSecurityFilterChain() {
+ FilterRegistrationBean registration = new FilterRegistrationBean<>();
registration.setFilter(new DelegatingFilterProxy());
registration.addUrlPatterns("/*");
return registration;
}
@Bean
- public FilterRegistrationBean webResourceOptimizer(WroFilter wroFilter) {
- FilterRegistrationBean registration = new FilterRegistrationBean();
+ public FilterRegistrationBean webResourceOptimizer(WroFilter wroFilter) {
+ FilterRegistrationBean registration = new FilterRegistrationBean<>();
registration.setFilter(wroFilter);
registration.addUrlPatterns("/wro/*");
return registration;
@@ -239,8 +236,8 @@ public FilterRegistrationBean webResourceOptimizer(WroFilter wroFilter) {
// }
@Bean
- public ServletRegistrationBean cxfServlet() {
- ServletRegistrationBean registration = new ServletRegistrationBean();
+ public ServletRegistrationBean cxfServlet() {
+ ServletRegistrationBean registration = new ServletRegistrationBean<>();
registration.setServlet(new CXFServlet());
registration.addInitParameter("service-list-path", "midpointservices");
registration.setLoadOnStartup(1);
@@ -250,8 +247,8 @@ public ServletRegistrationBean cxfServlet() {
}
@Bean
- public ServletRegistrationBean reportPeerQueryInterceptor() {
- ServletRegistrationBean registration = new ServletRegistrationBean();
+ public ServletRegistrationBean reportPeerQueryInterceptor() {
+ ServletRegistrationBean registration = new ServletRegistrationBean<>();
registration.setServlet(new ReportPeerQueryInterceptor(nodeAuthenticator));
registration.addUrlMappings("/report");
@@ -259,8 +256,8 @@ public ServletRegistrationBean reportPeerQueryInterceptor() {
}
@Bean
- public ServletRegistrationBean staticWebServlet() {
- ServletRegistrationBean registration = new ServletRegistrationBean();
+ public ServletRegistrationBean staticWebServlet() {
+ ServletRegistrationBean registration = new ServletRegistrationBean<>();
StaticWebServlet servlet = new StaticWebServlet(
new File(startupConfiguration.getMidpointHome(), "static-web"));
registration.setServlet(servlet);
@@ -268,6 +265,12 @@ public ServletRegistrationBean staticWebServlet() {
return registration;
}
+ @Bean
+ public ErrorPageRegistrar errorPageRegistrar() {
+ return new MidPointErrorPageRegistrar();
+ }
+
+
@Component
public class ServerCustomization implements WebServerFactoryCustomizer {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java
index fba6fbbf773..a5a1217f7da 100755
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java
@@ -23,6 +23,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
+import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.context.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.Environment;
@@ -163,7 +164,7 @@ protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(requestHeaderAuthenticationFilter(), LogoutFilter.class);
}
}
-
+
@Bean
@Override
protected AuthenticationManager authenticationManager() throws Exception {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractAssignmentListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractAssignmentListPanel.java
index d49a9b8ac91..9d4bb2b4b60 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractAssignmentListPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractAssignmentListPanel.java
@@ -16,8 +16,8 @@
package com.evolveum.midpoint.web.component.assignment;
import com.evolveum.midpoint.gui.api.component.BasePanel;
+import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.path.ItemPath;
-import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
@@ -28,7 +28,6 @@
import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
@@ -138,7 +137,7 @@ protected AssignmentEditorDto createAssignmentFromSelectedObjects(ObjectType obj
}
if (object instanceof UserType) {
AssignmentEditorDto dto = AssignmentEditorDto.createDtoAddFromSelectedObject(object,
- SchemaConstants.ORG_DEPUTY, getPageBase());
+ WebComponentUtil.getDefaultRelationOrFail(RelationKindType.DELEGATION), getPageBase());
dto.getTargetRef().setRelation(relation);
return dto;
} else {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.java
index 40b93d7160e..1657d5a2029 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.java
@@ -21,20 +21,38 @@
import java.util.List;
import com.evolveum.midpoint.gui.api.component.AssignmentPopup;
+import com.evolveum.midpoint.gui.api.page.PageBase;
+import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
+import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.*;
+import com.evolveum.midpoint.prism.path.ItemPath;
+import com.evolveum.midpoint.prism.query.ObjectPaging;
+import com.evolveum.midpoint.prism.query.ObjectQuery;
+import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.query.NotFilter;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
+import com.evolveum.midpoint.schema.constants.RelationTypes;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
-import com.evolveum.midpoint.web.component.prism.*;
+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.web.component.AjaxButton;
+import com.evolveum.midpoint.web.component.input.DropDownChoicePanel;
+import com.evolveum.midpoint.web.component.prism.ContainerValueWrapper;
+import com.evolveum.midpoint.web.component.prism.ContainerWrapper;
+import com.evolveum.midpoint.web.component.prism.PropertyOrReferenceWrapper;
+import com.evolveum.midpoint.web.component.prism.ValueWrapper;
import com.evolveum.midpoint.web.component.search.SearchFactory;
import com.evolveum.midpoint.web.component.search.SearchItemDefinition;
+import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.PageAdminFocus;
-import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto;
import com.evolveum.midpoint.web.page.admin.users.component.AllAssignmentsPreviewDialog;
+import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto;
+import com.evolveum.midpoint.web.session.UserProfileStorage;
+import com.evolveum.midpoint.web.session.UserProfileStorage.TableId;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
-
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
@@ -46,6 +64,11 @@
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
+import javax.xml.namespace.QName;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
@@ -261,9 +284,11 @@ protected int getItemsPerPage() {
}
protected ObjectQuery createObjectQuery() {
+ Collection delegationRelations = getParentPage().getRelationRegistry()
+ .getAllRelationsFor(RelationKindType.DELEGATION);
ObjectFilter deputyFilter = QueryBuilder.queryFor(AssignmentType.class, getParentPage().getPrismContext())
.item(new ItemPath(AssignmentType.F_TARGET_REF))
- .ref(SchemaConstants.ORG_DEPUTY)
+ .ref(delegationRelations.toArray(new QName[0]))
.buildFilter();
ObjectQuery query = QueryBuilder.queryFor(AssignmentType.class, getParentPage().getPrismContext())
.not()
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ApplicablePolicyGroupPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ApplicablePolicyGroupPanel.java
index 7f6a21487dd..c24b4d16806 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ApplicablePolicyGroupPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ApplicablePolicyGroupPanel.java
@@ -20,7 +20,6 @@
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
-import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.ObjectQuery;
@@ -30,7 +29,6 @@
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
-import com.evolveum.midpoint.web.component.data.column.IsolatedCheckBoxPanel;
import com.evolveum.midpoint.web.component.prism.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -174,7 +172,7 @@ private void onPolicyAddedOrRemoved(PrismObject assignmentTarg
if (added){
//TODO: not sure if this is correct way of creating new value.. this value is added directly to the origin object... what about deltas??
PrismContainerValue newAssignment = assignmentsModel.getObject().getItem().createNewValue();
- ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(assignmentTargetObject);
+ ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(assignmentTargetObject, getPageBase().getPrismContext());
AssignmentType assignmentType = newAssignment.asContainerable();
assignmentType.setTargetRef(ref);
Task task = getPageBase().createSimpleTask("Creating new applicable policy");
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDto.java
deleted file mode 100644
index bd68c9e6854..00000000000
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDto.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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.web.component.assignment;
-
-import java.io.Serializable;
-import java.util.Collection;
-
-import javax.xml.namespace.QName;
-
-import org.apache.commons.lang.Validate;
-
-import com.evolveum.midpoint.prism.delta.ItemDelta;
-import com.evolveum.midpoint.schema.constants.RelationTypes;
-import com.evolveum.midpoint.schema.constants.SchemaConstants;
-import com.evolveum.midpoint.web.component.util.Selectable;
-import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
-
-public class AssignmentDto extends Selectable implements Comparable, Serializable{
-
- private static final long serialVersionUID = 1L;
-
- private AssignmentType assignment;
- private UserDtoStatus status;
- private AssignmentType oldAssignment;
-// private RelationTypes relationType;
-
- public static final String F_VALUE = "assignment";
- public static final String F_RELATION_TYPE = "relationType";
-
- public AssignmentDto(AssignmentType assignment, UserDtoStatus status) {
- this.assignment = assignment;
- this.oldAssignment = assignment.clone();
- this.status = status;
- }
-
- public Collection extends ItemDelta> computeAssignmentDelta() {
- Collection extends ItemDelta> deltas = oldAssignment.asPrismContainerValue().diff(assignment.asPrismContainerValue());
- return deltas;
- }
-
- public void revertChanges() {
- assignment = oldAssignment.clone();
- }
-
- public QName getRelation() {
-
- //TODO: what kind of rlation should be returned for the PERSONA CONSTRUCTION?
-
- if (assignment.getConstruction() != null) {
- return SchemaConstants.ORG_DEFAULT;
- }
-
- if (assignment.getTargetRef() == null) {
- return null;
- }
-
- return assignment.getTargetRef().getRelation();
-
- }
-
- public RelationTypes getRelationType() {
- return RelationTypes.getRelationType(getRelation());
- }
-
- public void setRelationType(RelationTypes relationType){
- if (assignment.getTargetRef() == null) {
- return;
- }
-
- assignment.getTargetRef().setRelation(relationType.getRelation());
- }
-
-
- public AssignmentType getAssignment() {
- return assignment;
- }
-
- @Override
- public int compareTo(AssignmentDto other) {
- Validate.notNull(other, "Can't compare assignment editor dto with null.");
-
- String name1 = "";//getName() != null ? getName() : "";
- String name2 = "";//other.getName() != null ? other.getName() : "";
-
- return String.CASE_INSENSITIVE_ORDER.compare(name1, name2);
- }
-
- public UserDtoStatus getStatus() {
- return status;
- }
-
- public void setStatus(UserDtoStatus status) {
- this.status = status;
- }
-
-}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java
index d30a6555b2b..56a9e62aa8c 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java
@@ -24,9 +24,8 @@
import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.path.ItemPath;
+import com.evolveum.midpoint.schema.RelationRegistry;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
-import com.evolveum.midpoint.schema.constants.RelationTypes;
-import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
@@ -41,7 +40,6 @@
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.util.ItemPathUtil;
-import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
@@ -148,7 +146,7 @@ public AssignmentEditorDto(UserDtoStatus status, AssignmentType assignment, Page
this.altName = getAlternativeName(assignment);
this.attributes = prepareAssignmentAttributes(assignment, pageBase);
- this.isOrgUnitManager = determineUserOrgRelation(assignment);
+ this.isOrgUnitManager = isOrgUnitManager(assignment);
this.privilegeLimitationList = getAssignmentPrivilegesList(assignment);
}
@@ -164,7 +162,7 @@ public static AssignmentEditorDto createDtoAddFromSelectedObject(ObjectType obje
PageBase pageBase, UserType delegationOwner) {
AssignmentEditorDto dto = createDtoFromObject(object, UserDtoStatus.ADD, relation, pageBase);
dto.setDelegationOwner(delegationOwner);
- if (SchemaConstants.ORG_DEPUTY.equals(relation)){
+ if (pageBase.getRelationRegistry().isDelegation(relation)) {
OtherPrivilegesLimitationType limitations = new OtherPrivilegesLimitationType();
WorkItemSelectorType approvalWorkItemSelector = new WorkItemSelectorType();
@@ -245,18 +243,11 @@ private List getAssignmentPrivilegesList(AssignmentType assig
}
return list;
}
- private Boolean determineUserOrgRelation(AssignmentType assignment) {
-
- if (assignment == null || assignment.getTargetRef() == null
- || ObjectTypeUtil.isDefaultRelation(assignment.getTargetRef().getRelation())) {
- return Boolean.FALSE;
- }
-
- if (ObjectTypeUtil.isManagerRelation(assignment.getTargetRef().getRelation())) {
- return Boolean.TRUE;
- }
-
- return Boolean.FALSE;
+ private boolean isOrgUnitManager(AssignmentType assignment) {
+ RelationRegistry relationRegistry = pageBase.getRelationRegistry();
+ return assignment != null
+ && assignment.getTargetRef() != null
+ && relationRegistry.isManager(assignment.getTargetRef().getRelation());
}
private List prepareAssignmentAttributes(AssignmentType assignment, PageBase pageBase) {
@@ -439,7 +430,9 @@ private String getNameForTargetObject(AssignmentType assignment) {
}
if (assignment.getTargetRef() != null && assignment.getTargetRef().getRelation() != null) {
- sb.append(" - " + RelationTypes.getRelationType(assignment.getTargetRef().getRelation()).getHeaderLabel());
+ String relationName = pageBase
+ .getString(WebComponentUtil.getRelationHeaderLabelKey(assignment.getTargetRef().getRelation()));
+ sb.append(" - ").append(relationName);
}
return sb.toString();
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java
index 9f4ac7f8ab2..dbfdc000776 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java
@@ -422,10 +422,13 @@ public String getObject() {
}
AssignmentEditorDto object = getModel().getObject();
- String propertyKey = RelationTypes.class.getSimpleName() + "." +
- (object.getTargetRef() == null || object.getTargetRef().getRelation() == null ?
- RelationTypes.MEMBER : RelationTypes.getRelationType(object.getTargetRef().getRelation()));
- return createStringResource(propertyKey).getString();
+ if (object.getTargetRef() != null) {
+ QName relation = object.getTargetRef() != null ? object.getTargetRef().getRelation() : null;
+ String propertyKey = WebComponentUtil.getRelationHeaderLabelKey(relation);
+ return createStringResource(propertyKey).getString();
+ } else {
+ return "";
+ }
}
});
relationLabel.setOutputMarkupId(true);
@@ -986,7 +989,7 @@ private void addRelationDropDown(WebMarkupContainer relationContainer){
QName assignmentRelation = getModelObject().getTargetRef() != null ? getModelObject().getTargetRef().getRelation() : null;
RelationDropDownChoicePanel relationDropDown = new RelationDropDownChoicePanel(ID_RELATION,
- assignmentRelation != null ? assignmentRelation : SchemaConstants.ORG_DEFAULT, getSupportedRelations(), false); relationDropDown.setEnabled(getModel().getObject().isEditable());
+ assignmentRelation != null ? assignmentRelation : WebComponentUtil.getDefaultRelationOrFail(), getSupportedRelations(), false); relationDropDown.setEnabled(getModel().getObject().isEditable());
relationDropDown.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@@ -1011,33 +1014,32 @@ private List getSupportedRelations() {
}
}
-
- protected IModel getRelationModel(){
- return new IModel() {
- private static final long serialVersionUID = 1L;
-
- @Override
- public RelationTypes getObject() {
- if (getModelObject().getTargetRef() == null) {
- return RelationTypes.MEMBER;
- }
- return RelationTypes.getRelationType(getModelObject().getTargetRef().getRelation());
- }
-
- @Override
- public void setObject(RelationTypes newValue) {
- ObjectReferenceType ref = getModelObject().getTargetRef();
- if (ref != null){
- ref.setRelation(newValue.getRelation());
- }
- }
-
- @Override
- public void detach() {
-
- }
- };
- }
+// protected IModel getRelationModel() {
+// return new IModel() {
+// private static final long serialVersionUID = 1L;
+//
+// @Override
+// public RelationTypes getObject() {
+// if (getModelObject().getTargetRef() == null) {
+// return RelationTypes.MEMBER;
+// }
+// return RelationTypes.getRelationType(getModelObject().getTargetRef().getRelation());
+// }
+//
+// @Override
+// public void setObject(RelationTypes newValue) {
+// ObjectReferenceType ref = getModelObject().getTargetRef();
+// if (ref != null){
+// ref.setRelation(newValue.getRelation());
+// }
+// }
+//
+// @Override
+// public void detach() {
+//
+// }
+// };
+// }
private PrismObject getTargetObject(AssignmentEditorDto dto)
throws ObjectNotFoundException, SchemaException, SecurityViolationException,
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java
index 53edf29eb85..7fa426be713 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java
@@ -242,7 +242,7 @@ public void onClick(AjaxRequestTarget target) {
protected void assignSelectedOrgPerformed(List selectedOrgs,
AjaxRequestTarget target) {
// TODO Auto-generated method stub
- addSelectedAssignablePerformed(target, (List) selectedOrgs, SchemaConstants.ORG_DEFAULT,
+ addSelectedAssignablePerformed(target, (List) selectedOrgs, WebComponentUtil.getDefaultRelationOrFail(),
getPageBase().getMainPopup().getId());
reloadMainFormButtons(target);
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java
index 5ba2551b239..cb82ac9309f 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java
@@ -297,12 +297,9 @@ private static void appendRelation(AssignmentType assignment, StringBuilder sb,
return;
}
- RelationDefinitionType relationDef = ObjectTypeUtil.findRelationDefinition(
- WebComponentUtil.getRelationDefinitions(pageBase),
- assignment.getTargetRef().getRelation());
- if (relationDef != null && relationDef.getDisplay() != null &&
- !relationDef.getDisplay().getLabel().isEmpty()) {
- sb.append(" - " + pageBase.createStringResource(relationDef.getDisplay().getLabel()).getString());
+ String labelKey = WebComponentUtil.getRelationHeaderLabelKeyIfKnown(assignment.getTargetRef().getRelation());
+ if (StringUtils.isNotEmpty(labelKey)) {
+ sb.append(" - ").append(pageBase.createStringResource(labelKey).getString());
}
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/RoleCatalogItemButton.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/RoleCatalogItemButton.java
index fd3351807ca..c7e3450309f 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/RoleCatalogItemButton.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/RoleCatalogItemButton.java
@@ -318,7 +318,7 @@ private void addAssignmentPerformed(AssignmentEditorDto assignment, AjaxRequestT
protected void assignmentAddedToShoppingCartPerformed(AjaxRequestTarget target){
}
- protected QName getNewAssignmentRelation(){
- return SchemaConstants.ORG_DEFAULT;
+ protected QName getNewAssignmentRelation() {
+ return WebComponentUtil.getDefaultRelationOrFail();
}
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SimpleRoleSelector.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SimpleRoleSelector.java
index f25f32a4b5a..992d7f3b43e 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SimpleRoleSelector.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SimpleRoleSelector.java
@@ -160,7 +160,7 @@ private void toggleRole(PrismObject role) {
}
}
- AssignmentType newAssignment = ObjectTypeUtil.createAssignmentTo(role);
+// AssignmentType newAssignment = ObjectTypeUtil.createAssignmentTo(role, prismContext);
//TODO
//create ContainerValueWrapper for new assignment
// getAssignmentModel().getObject().add(newAssignment);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java
index 8962aefa2e2..08a772e7372 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java
@@ -27,6 +27,7 @@
import com.evolveum.midpoint.prism.query.OrderDirection;
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.schema.GetOperationOptions;
+import com.evolveum.midpoint.schema.RelationRegistry;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
@@ -116,6 +117,11 @@ protected PrismContext getPrismContext() {
return application.getPrismContext();
}
+ protected RelationRegistry getRelationRegistry() {
+ MidPointApplication application = MidPointApplication.get();
+ return application.getRelationRegistry();
+ }
+
protected TaskService getTaskService() {
MidPointApplication application = MidPointApplication.get();
return application.getTaskService();
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/ValueChoosePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/ValueChoosePanel.java
index ee2f2c0924e..d9c0dc150c6 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/ValueChoosePanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/ValueChoosePanel.java
@@ -125,7 +125,7 @@ protected boolean isEditButtonEnabled() {
}
protected void replaceIfEmpty(ObjectType object) {
- ObjectReferenceType ort = ObjectTypeUtil.createObjectRef(object);
+ ObjectReferenceType ort = ObjectTypeUtil.createObjectRef(object, getPageBase().getPrismContext());
getModel().setObject((T) ort.asReferenceValue());
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RelationDropDownChoicePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RelationDropDownChoicePanel.java
index fab210b8052..f3370e51ac5 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RelationDropDownChoicePanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RelationDropDownChoicePanel.java
@@ -108,8 +108,7 @@ public QName getObject(String id, IModel choices) {
@Override
public Object getDisplayValue(QName object) {
- RelationDefinitionType def =
- ObjectTypeUtil.findRelationDefinition(WebComponentUtil.getRelationDefinitions(RelationDropDownChoicePanel.this.getPageBase()), object);
+ RelationDefinitionType def = WebComponentUtil.getRelationDefinition(object);
if (def != null){
DisplayType display = def.getDisplay();
if (display != null){
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/ObjectHistoryTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/ObjectHistoryTabPanel.java
index 87e7d6b6ed9..a2bd645e3d5 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/ObjectHistoryTabPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/ObjectHistoryTabPanel.java
@@ -48,14 +48,12 @@
import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails;
import com.evolveum.midpoint.web.page.admin.reports.component.AuditLogViewerPanel;
import com.evolveum.midpoint.web.page.admin.reports.dto.AuditSearchDto;
-import com.evolveum.midpoint.web.page.admin.users.PageUserHistory;
import com.evolveum.midpoint.web.page.admin.users.PageXmlDataReview;
import com.evolveum.midpoint.web.session.AuditLogStorage;
import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType;
import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventStageType;
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.UserType;
/**
* Created by honchar.
@@ -166,7 +164,7 @@ protected long getCurrentPage() {
private AuditSearchDto createAuditSearchDto(F focus) {
AuditSearchDto searchDto = new AuditSearchDto();
- ObjectReferenceType ort = ObjectTypeUtil.createObjectRef(focus);
+ ObjectReferenceType ort = ObjectTypeUtil.createObjectRef(focus, getPrismContext());
searchDto.setTargetNames(asList(ort));
searchDto.setEventStage(AuditEventStageType.EXECUTION);
return searchDto;
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/UserDelegationsTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/UserDelegationsTabPanel.java
index 6df7c812b22..8241d1157f7 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/UserDelegationsTabPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/UserDelegationsTabPanel.java
@@ -23,7 +23,6 @@
import com.evolveum.midpoint.prism.query.InOidFilter;
import com.evolveum.midpoint.prism.query.NotFilter;
import com.evolveum.midpoint.prism.query.ObjectFilter;
-import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
@@ -39,6 +38,7 @@
import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
@@ -192,7 +192,7 @@ protected void addSelectedAssignablePerformed(AjaxRequestTarget target, List)getObjectWrapper().getObject()).asObjectable(),
- SchemaConstants.ORG_DEPUTY, getPageBase(), (UserType) object);
+ WebComponentUtil.getDefaultRelationOrFail(RelationKindType.DELEGATION), getPageBase(), (UserType) object);
dto.setPrivilegeLimitationList(privilegesListModel.getObject());
delegationsModel.getObject().add(dto);
} catch (Exception e) {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.java
index 51cda0140bd..c05d5b462a4 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.java
@@ -42,8 +42,6 @@
import org.apache.wicket.model.*;
import org.jetbrains.annotations.NotNull;
-import java.util.List;
-
/**
* @author mederly
*/
@@ -147,7 +145,7 @@ public void onClick(AjaxRequestTarget target) {
PrismContainerValue> value = getModelObject().getScene().getSourceValue();
if (value != null && value.getParent() instanceof PrismObject) {
PrismObject extends ObjectType> object = (PrismObject extends ObjectType>) value.getParent();
- WebComponentUtil.dispatchToObjectDetailsPage(ObjectTypeUtil.createObjectRef(object), getPageBase(), false);
+ WebComponentUtil.dispatchToObjectDetailsPage(ObjectTypeUtil.createObjectRef(object, getPageBase().getPrismContext()), getPageBase(), false);
}
}
};
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java
index 98444188f31..1bb0c3732ce 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java
@@ -17,11 +17,7 @@
package com.evolveum.midpoint.web.component.search;
import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
@@ -36,7 +32,6 @@
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.schema.SchemaRegistry;
import com.evolveum.midpoint.schema.ResourceShadowDiscriminator;
-import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.FullTextSearchConfigurationUtil;
import com.evolveum.midpoint.task.api.Task;
@@ -60,8 +55,6 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.GenericObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectListViewType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectListViewsType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.LifecycleStateModelType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.LifecycleStateType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectPolicyConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
@@ -360,10 +353,9 @@ public static void addSearchRefDef(PrismContainerDefin
return;
}
if (pageBase == null) {
- defs.add(new SearchItemDefinition(path, refDef, Arrays.asList(SchemaConstants.ORG_DEFAULT)));
+ defs.add(new SearchItemDefinition(path, refDef, Collections.singletonList(WebComponentUtil.getDefaultRelationOrFail())));
return;
}
- OperationResult result = new OperationResult("resolve applicable relations");
defs.add(new SearchItemDefinition(path, refDef, WebComponentUtil.getCategoryRelationChoices(category, pageBase)));
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java
index 0315869c7ca..4c961e1b2e7 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java
@@ -449,7 +449,7 @@ public void applyState() {
ResourceType resourceType = resource.asObjectable();
resourceType.setName(PolyStringType.fromOrig(resourceNameModel.getObject()));
resourceType.setDescription(resourceDescriptionModel.getObject());
- resourceType.setConnectorRef(ObjectTypeUtil.createObjectRef(connector));
+ resourceType.setConnectorRef(ObjectTypeUtil.createObjectRef(connector, prismContext));
delta = ObjectDelta.createAddDelta(resource);
} else {
PrismObject oldResourceObject =
@@ -470,7 +470,7 @@ public void applyState() {
String oldConnectorOid = oldResource.getConnectorRef() != null ? oldResource.getConnectorRef().getOid() : null;
String newConnectorOid = connector.getOid();
if (!StringUtils.equals(oldConnectorOid, newConnectorOid)) {
- i = i.item(ResourceType.F_CONNECTOR_REF).replace(ObjectTypeUtil.createObjectRef(connector).asReferenceValue());
+ i = i.item(ResourceType.F_CONNECTOR_REF).replace(ObjectTypeUtil.createObjectRef(connector, prismContext).asReferenceValue());
}
if (!isConfigurationSchemaCompatible(connector)) {
i = i.item(ResourceType.F_CONNECTOR_CONFIGURATION).replace();
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java
index 1593280f1fe..6e9c0628184 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java
@@ -822,7 +822,7 @@ public List showAllAssignmentsPerformed(AjaxRequestTarget aja
DeltaSetTriple extends EvaluatedAssignmentTarget> targetsTriple = evaluatedAssignment.getRoles();
Collection extends EvaluatedAssignmentTarget> targets = targetsTriple.getNonNegativeValues();
for (EvaluatedAssignmentTarget target : targets) {
- if (target.appliesToFocusWithAnyRelation()) {
+ if (target.appliesToFocusWithAnyRelation(getRelationRegistry())) {
assignmentInfoDtoSet.add(createAssignmentsPreviewDto(target, task, result));
}
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java
index 29f33676916..4648b729b2a 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java
@@ -142,7 +142,7 @@ private ObjectQuery createQuery() throws SchemaException, ObjectNotFoundExceptio
} else {
// not authorized to see all => sees only allocated to him (not quite what is expected, but sufficient for the time being)
query = QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(),
- OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS)
+ OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getRelationRegistry())
.and().item(CaseWorkItemType.F_CLOSE_TIMESTAMP).isNull().build();
}
IsolatedCheckBoxPanel includeClosedCases = (IsolatedCheckBoxPanel) getCaseWorkItemsSearchField(ID_SEARCH_FILTER_INCLUDE_CLOSED_CASES);
@@ -161,8 +161,10 @@ private ObjectQuery createQuery() throws SchemaException, ObjectNotFoundExceptio
ObjectType resource = resources.get(0);
if (resource != null) {
query.addFilter(
+ // TODO MID-3581
QueryBuilder.queryFor(CaseWorkItemType.class, getPrismContext())
- .item(PrismConstants.T_PARENT, CaseType.F_OBJECT_REF).ref(ObjectTypeUtil.createObjectRef(resource).asReferenceValue()).buildFilter()
+ .item(PrismConstants.T_PARENT, CaseType.F_OBJECT_REF).ref(ObjectTypeUtil.createObjectRef(resource,
+ getPrismContext()).asReferenceValue()).buildFilter()
);
}
}
@@ -175,9 +177,10 @@ private ObjectQuery createQuery() throws SchemaException, ObjectNotFoundExceptio
if (assignees != null && assignees.size() > 0) {
ObjectType assignee = assignees.get(0);
if (assignee != null) {
+ // TODO MID-3581
query.addFilter(
QueryBuilder.queryFor(CaseWorkItemType.class, getPrismContext())
- .item(CaseWorkItemType.F_ASSIGNEE_REF).ref(ObjectTypeUtil.createObjectRef(assignee).asReferenceValue()).buildFilter()
+ .item(CaseWorkItemType.F_ASSIGNEE_REF).ref(ObjectTypeUtil.createObjectRef(assignee, getPrismContext()).asReferenceValue()).buildFilter()
);
}
}
@@ -432,7 +435,7 @@ private void searchFilterPerformed(AjaxRequestTarget target) {
private Function objectReferenceTransformer =
(Function & Serializable) (ObjectType o) ->
- ObjectTypeUtil.createObjectRef(o);
+ ObjectTypeUtil.createObjectRef(o, getPrismContext());
private static class ButtonBar extends Fragment {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrWorkItemDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrWorkItemDto.java
index 0e08d6b8bb0..d3eb32690cf 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrWorkItemDto.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrWorkItemDto.java
@@ -57,12 +57,14 @@ public class CertCaseOrWorkItemDto extends Selectable {
private String objectName;
private String targetName;
private String deadlineAsString;
+ private QName defaultRelation;
CertCaseOrWorkItemDto(@NotNull AccessCertificationCaseType _case, PageBase page) {
this.certCase = _case;
this.objectName = getName(_case.getObjectRef());
this.targetName = getName(_case.getTargetRef());
this.deadlineAsString = computeDeadlineAsString(page);
+ this.defaultRelation = page.getPrismContext().getDefaultRelation();
}
// ugly hack (for now) - we extract the name from serialization metadata
@@ -107,7 +109,7 @@ public QName getTargetType() {
}
public ObjectReferenceType getCampaignRef() {
- return ObjectTypeUtil.createObjectRef(getCampaign());
+ return ObjectTypeUtil.createObjectRef(getCampaign(), defaultRelation);
}
public Long getCaseId() {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java
index 6d06dfbde20..154f0630d80 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java
@@ -16,6 +16,7 @@
package com.evolveum.midpoint.web.page.admin.configuration;
+import java.io.Serializable;
import java.util.Collection;
import javax.xml.namespace.QName;
@@ -359,9 +360,11 @@ private void validateObject(OperationResult result, Holder objectHol
}
- class DebugViewOptions {
+ class DebugViewOptions implements Serializable {
- private final static String ID_ENCRYPT = "encrypt";
+ private static final long serialVersionUID = 1L;
+
+ private final static String ID_ENCRYPT = "encrypt";
private final static String ID_SAVE_AS_RAW = "saveAsRaw";
private final static String ID_REEVALUATE_SEARCH_FILTERS = "reevaluateSearchFilters";
private final static String ID_VALIDATE_SCHEMA = "validateSchema";
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java
index 6149d8f023b..d4bb14ce59a 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java
@@ -51,7 +51,6 @@
import com.evolveum.midpoint.audit.api.AuditEventRecord;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.component.button.CsvDownloadButtonPanel;
-import com.evolveum.midpoint.gui.api.component.path.ItemPathDto;
import com.evolveum.midpoint.gui.api.component.path.ItemPathPanel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
@@ -363,7 +362,7 @@ public boolean isVisible() {
// Serializable as it becomes part of panel which is serialized
private Function objectReferenceTransformer =
(Function & Serializable) (ObjectType o) ->
- ObjectTypeUtil.createObjectRef(o);
+ ObjectTypeUtil.createObjectRef(o, getPageBase().getPrismContext());
// Serializable as it becomes part of panel which is serialized
private Function stringTransformer =
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java
index bd4f7d5a55e..7b274d97afc 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java
@@ -22,10 +22,8 @@
import javax.xml.namespace.QName;
-import com.evolveum.midpoint.gui.api.GuiConstants;
import com.evolveum.midpoint.gui.api.component.PendingOperationPanel;
import com.evolveum.midpoint.web.component.menu.cog.ButtonInlineMenuItem;
-import com.evolveum.midpoint.web.component.prism.ObjectWrapper;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -99,7 +97,6 @@
import com.evolveum.midpoint.web.component.data.column.ColumnMenuAction;
import com.evolveum.midpoint.web.component.data.column.ColumnTypeDto;
import com.evolveum.midpoint.web.component.data.column.ColumnUtils;
-import com.evolveum.midpoint.web.component.data.column.InlineMenuHeaderColumn;
import com.evolveum.midpoint.web.component.data.column.LinkColumn;
import com.evolveum.midpoint.web.component.data.column.ObjectLinkColumn;
import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel;
@@ -108,7 +105,6 @@
import com.evolveum.midpoint.web.component.search.Search;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
-import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction;
import com.evolveum.midpoint.web.page.admin.resources.ResourceContentTabPanel.Operation;
import com.evolveum.midpoint.web.page.admin.resources.content.PageAccount;
import com.evolveum.midpoint.web.page.admin.server.PageTaskAdd;
@@ -446,7 +442,7 @@ private void newTaskPerformed(String category, AjaxRequestTarget target) {
}
PrismObject resource = getResourceModel().getObject();
- taskType.setObjectRef(ObjectTypeUtil.createObjectRef(resource));
+ taskType.setObjectRef(ObjectTypeUtil.createObjectRef(resource, getPageBase().getPrismContext()));
taskType.setCategory(category);
setResponsePage(new PageTaskAdd(taskType));
@@ -1147,7 +1143,7 @@ private void changeOwner(ShadowType selected, AjaxRequestTarget target, FocusTyp
if (owner != null) {
delta = ReferenceDelta.createModificationDelete(FocusType.F_LINK_REF,
getFocusDefinition(),
- ObjectTypeUtil.createObjectRef(shadow).asReferenceValue());
+ ObjectTypeUtil.createObjectRef(shadow, getPageBase().getPrismContext()).asReferenceValue());
((Collection) modifications).add(delta);
changeOwnerInternal(owner.getOid(), modifications, target);
@@ -1163,7 +1159,7 @@ private void changeOwner(ShadowType selected, AjaxRequestTarget target, FocusTyp
FocusType owner = loadShadowOwner(shadow.getOid());
if (owner != null) {
delta = ReferenceDelta.createModificationDelete(FocusType.F_LINK_REF,
- getFocusDefinition(), ObjectTypeUtil.createObjectRef(shadow).asReferenceValue());
+ getFocusDefinition(), ObjectTypeUtil.createObjectRef(shadow, getPageBase().getPrismContext()).asReferenceValue());
((Collection) modifications).add(delta);
changeOwnerInternal(owner.getOid(), modifications, target);
@@ -1171,7 +1167,7 @@ private void changeOwner(ShadowType selected, AjaxRequestTarget target, FocusTyp
modifications = new ArrayList<>();
delta = ReferenceDelta.createModificationAdd(FocusType.F_LINK_REF, getFocusDefinition(),
- ObjectTypeUtil.createObjectRef(shadow).asReferenceValue());
+ ObjectTypeUtil.createObjectRef(shadow, getPageBase().getPrismContext()).asReferenceValue());
((Collection) modifications).add(delta);
changeOwnerInternal(ownerToChange.getOid(), modifications, target);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/AbstractRoleMemberPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/AbstractRoleMemberPanel.java
index 731bb04c5a2..77bfa582b05 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/AbstractRoleMemberPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/AbstractRoleMemberPanel.java
@@ -38,7 +38,6 @@
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.AbstractExportableColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.repeater.Item;
@@ -52,13 +51,11 @@
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.PrismContext;
-import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.query.AndFilter;
import com.evolveum.midpoint.prism.query.NotFilter;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
-import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
@@ -666,7 +663,7 @@ protected ObjectQuery createAllMemberQuery(Collection relations) {
protected ObjectReferenceType createReference() {
- ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getModelObject());
+ ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getModelObject(), getPageBase().getPrismContext());
return ref;
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java
index d4c0841bc92..6e3c09fb37a 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java
@@ -158,15 +158,18 @@ public static void initObject
public static ObjectQuery createDirectMemberQuery(R targetObject, QName objectType, Collection relations, ObjectViewDto tenant, ObjectViewDto project, PrismContext prismContext) {
ObjectQuery query;
+ // We assume tenantRef.relation and orgRef.relation are always default ones (see also MID-3581)
S_AtomicFilterExit q = QueryBuilder.queryFor(FocusType.class, prismContext)
.item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF)
.ref(createReferenceValuesList(targetObject, relations));
if (tenant != null && tenant.getObjectType() != null) {
- q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_TENANT_REF).ref(ObjectTypeUtil.createObjectRef(tenant.getObjectType()).asReferenceValue());
+ q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_TENANT_REF).ref(ObjectTypeUtil.createObjectRef(tenant.getObjectType(),
+ prismContext).asReferenceValue());
}
- if (project != null && project.getObjectType() !=null) {
- q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_ORG_REF).ref(ObjectTypeUtil.createObjectRef(project.getObjectType()).asReferenceValue());
+ if (project != null && project.getObjectType() != null) {
+ q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_ORG_REF).ref(ObjectTypeUtil.createObjectRef(project.getObjectType(),
+ prismContext).asReferenceValue());
}
query = q.build();
@@ -183,9 +186,8 @@ public static ObjectQuery createDirectMemberQuery(R
public static List createReferenceValuesList(R targetObject, Collection relations) {
List referenceValuesList = new ArrayList<>();
- relations.stream().forEach(relation -> referenceValuesList.add(createReference(targetObject, relation).asReferenceValue()));
+ relations.forEach(relation -> referenceValuesList.add(createReference(targetObject, relation).asReferenceValue()));
return referenceValuesList;
-
}
public static ObjectQuery createSelectedObjectsQuery(List selectedObjects) {
@@ -311,7 +313,8 @@ protected static ObjectDelta getDeleteAssignmentDel
protected static ObjectDelta getAddParentOrgDelta(R targetObject, Collection relations, PrismContext prismContext) throws SchemaException {
ObjectDelta delta = ObjectDelta.createEmptyModifyDelta(ObjectType.class, "fakeOid", prismContext);
if (relations == null || relations.isEmpty()) {
- delta.addModificationAddReference(ObjectType.F_PARENT_ORG_REF, ObjectTypeUtil.createObjectRef(targetObject).asReferenceValue());
+ delta.addModificationAddReference(ObjectType.F_PARENT_ORG_REF, ObjectTypeUtil.createObjectRef(targetObject,
+ prismContext).asReferenceValue());
return delta;
}
@@ -324,7 +327,7 @@ protected static ObjectDelta getAddParentOrgDelta(R
protected static ObjectDelta getDeleteParentOrgDelta(R targetObject, Collection relations, PrismContext prismContext) throws SchemaException {
if (relations == null || relations.isEmpty()) {
return ObjectDelta.createModificationDeleteReference(ObjectType.class, "fakeOid",
- ObjectType.F_PARENT_ORG_REF, prismContext, ObjectTypeUtil.createObjectRef(targetObject).asReferenceValue());
+ ObjectType.F_PARENT_ORG_REF, prismContext, ObjectTypeUtil.createObjectRef(targetObject, prismContext).asReferenceValue());
}
ObjectDelta delta = ObjectDelta.createEmptyModifyDelta(ObjectType.class, "fakeOid", prismContext);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskController.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskController.java
index 573128e6f5a..a3460a73f73 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskController.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskController.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Evolveum
+ * Copyright (c) 2010-2018 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -78,7 +78,7 @@ public void deleteSyncTokenPerformed(AjaxRequestTarget target) {
if (property == null) {
result.recordWarning("Token is not present in this task."); // should be treated by isVisible
} else {
- final ObjectDelta extends ObjectType> delta = (ObjectDelta extends ObjectType>)
+ final ObjectDelta extends ObjectType> delta =
DeltaBuilder.deltaFor(TaskType.class, parentPage.getPrismContext())
.item(new ItemPath(TaskType.F_EXTENSION, SchemaConstants.SYNC_TOKEN), property.getDefinition()).replace()
.asObjectDelta(parentPage.getTaskDto().getOid());
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskBasicTabPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskBasicTabPanel.html
index 197c13f92fd..c089569fdd4 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskBasicTabPanel.html
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskBasicTabPanel.html
@@ -23,44 +23,46 @@
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskSchedulingTabPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskSchedulingTabPanel.html
index c9e85bcfa13..f1c08c93ecd 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskSchedulingTabPanel.html
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskSchedulingTabPanel.html
@@ -22,94 +22,98 @@
-
-
- |
- |
-
-
- |
- |
-
-
- |
- |
-
-
- |
- |
-
-
+
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+ |
+ |
+
+
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/DefaultHandlerPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/DefaultHandlerPanel.html
index 6d00e5c1d25..89251fb65a9 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/DefaultHandlerPanel.html
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/DefaultHandlerPanel.html
@@ -21,13 +21,15 @@
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/QueryBasedHandlerPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/QueryBasedHandlerPanel.html
index bb1e72e599d..f4d379ea137 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/QueryBasedHandlerPanel.html
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/QueryBasedHandlerPanel.html
@@ -21,17 +21,19 @@
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.html
index 4d2c916c9a6..c73e721f6e1 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.html
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.html
@@ -21,34 +21,36 @@
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ScannerHandlerPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ScannerHandlerPanel.html
index 7cfc4ebf242..0c820175ceb 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ScannerHandlerPanel.html
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ScannerHandlerPanel.html
@@ -21,12 +21,14 @@
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ScriptExecutionHandlerPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ScriptExecutionHandlerPanel.html
index c2c6a7b0f35..bd93bcd2ef7 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ScriptExecutionHandlerPanel.html
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ScriptExecutionHandlerPanel.html
@@ -21,12 +21,14 @@
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java
index a90ee7c82b7..381100f8888 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java
@@ -52,7 +52,6 @@
import com.evolveum.midpoint.web.component.objectdetails.FocusMainPanel;
import com.evolveum.midpoint.web.component.objectdetails.FocusPersonasTabPanel;
import com.evolveum.midpoint.web.component.objectdetails.UserDelegationsTabPanel;
-import com.evolveum.midpoint.web.component.prism.ContainerStatus;
import com.evolveum.midpoint.web.page.admin.PageAdminFocus;
import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails;
import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto;
@@ -61,6 +60,7 @@
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -329,7 +329,7 @@ private List loadDelegatedByMeAssignments() {
PrismReferenceValue referenceValue = new PrismReferenceValue(getObjectWrapper().getOid(),
UserType.COMPLEX_TYPE);
- referenceValue.setRelation(SchemaConstants.ORG_DEPUTY);
+ referenceValue.setRelation(WebComponentUtil.getDefaultRelationOrFail(RelationKindType.DELEGATION));
ObjectFilter refFilter = QueryBuilder.queryFor(UserType.class, getPrismContext())
.item(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(referenceValue)
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentInfoDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentInfoDto.java
index 2c5ba533a04..762b9b87b8d 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentInfoDto.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentInfoDto.java
@@ -17,7 +17,7 @@
package com.evolveum.midpoint.web.page.admin.users.component;
import com.evolveum.midpoint.gui.api.page.PageBase;
-import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
+import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.web.component.util.Selectable;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.Component;
@@ -258,7 +258,12 @@ private int getClassOrder(Class targetClass) {
}
public IModel getRelationDisplayNameModel(Component component) {
- String localizationKey = ObjectTypeUtil.getRelationNameLocalizationKey(relation, true);
+ String localizationKey;
+ if (WebComponentUtil.isDefaultRelation(relation)) {
+ localizationKey = null;
+ } else {
+ localizationKey = WebComponentUtil.getRelationHeaderLabelKey(relation);
+ }
return localizationKey != null ? PageBase.createStringResourceStatic(component, localizationKey) : Model.of("");
}
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java
index 7562dcea0ad..a7cbdf4cda3 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java
@@ -25,7 +25,6 @@
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
-import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.delta.ContainerDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.query.ObjectQuery;
@@ -33,7 +32,6 @@
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.RetrieveOption;
import com.evolveum.midpoint.schema.SelectorOptions;
-import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.task.api.Task;
@@ -41,7 +39,6 @@
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
-import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.FocusSummaryPanel;
import com.evolveum.midpoint.web.component.data.column.ColumnMenuAction;
import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel;
@@ -51,8 +48,6 @@
import com.evolveum.midpoint.web.component.util.ObjectWrapperUtil;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction;
import com.evolveum.midpoint.web.component.util.SelectableBean;
-import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
-import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction;
import com.evolveum.midpoint.web.page.admin.orgs.OrgTreeAssignablePanel;
import com.evolveum.midpoint.web.page.admin.orgs.OrgTreePanel;
import com.evolveum.midpoint.web.page.admin.users.PageOrgTree;
@@ -63,8 +58,6 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.AbstractReadOnlyModel;
@@ -201,9 +194,8 @@ private WebMarkupContainer createManagerPanel(OrgType org) {
}
private ObjectQuery createManagerQuery(OrgType org) {
- ObjectQuery query = QueryBuilder.queryFor(FocusType.class, getPageBase().getPrismContext())
- .item(FocusType.F_PARENT_ORG_REF).ref(ObjectTypeUtil.createObjectRef(org, SchemaConstants.ORG_MANAGER).asReferenceValue())
- .build();
+ ObjectQuery query = ObjectTypeUtil.createManagerQuery(FocusType.class, org.getOid(),
+ parentPage.getRelationRegistry(), parentPage.getPrismContext());
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Searching members of org {} with query:\n{}", org.getOid(), query.debugDump());
}
@@ -366,7 +358,7 @@ public InlineMenuItemAction initAction() {
public void onClick(AjaxRequestTarget target) {
try {
initObjectForAdd(
- ObjectTypeUtil.createObjectRef(getRowModel().getObject().getValue()),
+ ObjectTypeUtil.createObjectRef(getRowModel().getObject().getValue(), getPageBase().getPrismContext()),
OrgType.COMPLEX_TYPE, null, target);
} catch (SchemaException e) {
throw new SystemException(e.getMessage(), e);
@@ -404,7 +396,7 @@ private void initObjectForAdd(ObjectReferenceType parentOrgRef, QName type, QNam
// TODO: fix MID-3234
if (parentOrgRef == null) {
ObjectType org = getTreePanel().getSelected().getValue();
- parentOrgRef = ObjectTypeUtil.createObjectRef(org);
+ parentOrgRef = ObjectTypeUtil.createObjectRef(org, prismContext);
parentOrgRef.setRelation(relation);
objType.getParentOrgRef().add(parentOrgRef);
} else {
@@ -462,7 +454,7 @@ private void moveConfirmPerformed(SelectableBean orgToMove, SelectableB
try {
for (OrgType parentOrg : toMove.getParentOrg()) {
AssignmentType oldRoot = new AssignmentType();
- oldRoot.setTargetRef(ObjectTypeUtil.createObjectRef(parentOrg));
+ oldRoot.setTargetRef(ObjectTypeUtil.createObjectRef(parentOrg, getPageBase().getPrismContext()));
moveOrgDelta.addModification(ContainerDelta.createModificationDelete(OrgType.F_ASSIGNMENT,
OrgType.class, getPageBase().getPrismContext(), oldRoot.asPrismContainerValue()));
@@ -472,7 +464,7 @@ private void moveConfirmPerformed(SelectableBean orgToMove, SelectableB
}
AssignmentType newRoot = new AssignmentType();
- newRoot.setTargetRef(ObjectTypeUtil.createObjectRef(selected.getValue()));
+ newRoot.setTargetRef(ObjectTypeUtil.createObjectRef(selected.getValue(), getPageBase().getPrismContext()));
moveOrgDelta.addModification(ContainerDelta.createModificationAdd(OrgType.F_ASSIGNMENT,
OrgType.class, getPageBase().getPrismContext(), newRoot.asPrismContainerValue()));
// moveOrgDelta.addModification(ReferenceDelta.createModificationAdd(OrgType.F_PARENT_ORG_REF,
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/UserSummaryPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/UserSummaryPanel.java
index 4b39338827b..d36b0c29ec2 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/UserSummaryPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/UserSummaryPanel.java
@@ -19,14 +19,12 @@
import javax.xml.namespace.QName;
-import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
-import com.evolveum.midpoint.util.QNameUtil;
+import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import org.apache.wicket.model.IModel;
import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
-import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.web.component.FocusSummaryPanel;
import com.evolveum.midpoint.web.component.prism.ObjectWrapper;
import com.evolveum.midpoint.web.component.util.SummaryTag;
@@ -67,7 +65,7 @@ protected void initialize(ObjectWrapper wrapper) {
continue;
}
QName relation = assignment.getTargetRef().getRelation();
- if (relation != null && !QNameUtil.match(SchemaConstants.ORG_DEFAULT, relation)) {
+ if (!WebComponentUtil.isDefaultRelation(relation)) {
continue;
}
if (SystemObjectsType.ROLE_SUPERUSER.value().equals(assignment.getTargetRef().getOid())) {
@@ -106,7 +104,7 @@ protected void initialize(ObjectWrapper wrapper) {
boolean isManager = false;
boolean isMember = false;
for (ObjectReferenceType parentOrgRef: wrapper.getObject().asObjectable().getParentOrgRef()) {
- if (ObjectTypeUtil.isManagerRelation(parentOrgRef.getRelation())) {
+ if (WebComponentUtil.isManagerRelation(parentOrgRef.getRelation())) {
isManager = true;
} else {
isMember = true;
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java
index 63817b0173b..286693a4e78 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java
@@ -348,7 +348,7 @@ private void delegateConfirmedPerformed(AjaxRequestTarget target, UserType deleg
OperationResult result = new OperationResult(OPERATION_DELEGATE_WORK_ITEM);
try {
WorkItemDto dto = workItemDtoModel.getObject();
- List delegates = Collections.singletonList(ObjectTypeUtil.createObjectRef(delegate));
+ List delegates = Collections.singletonList(ObjectTypeUtil.createObjectRef(delegate, getPrismContext()));
try {
assumePowerOfAttorneyIfRequested(result);
getWorkflowService().delegateWorkItem(dto.getWorkItemId(), delegates, WorkItemDelegationMethodType.ADD_ASSIGNEES, result);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java
index 9f69418e05e..ae798ca4427 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java
@@ -181,11 +181,11 @@ private ObjectQuery createQuery(OperationResult result) throws SchemaException {
if (WorkItemsPageType.ALL.equals(workItemsPageType) && authorizedToSeeAll) {
return q.build();
} else if (WorkItemsPageType.CLAIMABLE.equals(workItemsPageType)) {
- return QueryUtils.filterForGroups(q, currentUserOid(), getRepositoryService(), result).build();
+ return QueryUtils.filterForGroups(q, currentUserOid(), getRepositoryService(), getRelationRegistry(), result).build();
} else {
// not authorized to see all => sees only allocated to him (not quite what is expected, but sufficient for the time being)
return QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(),
- OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS).build();
+ OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getRelationRegistry()).build();
}
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java
index 4bb19d39718..365e2e984e2 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java
@@ -337,8 +337,8 @@ private UserType getTargetUser(){
protected void assignmentAddedToShoppingCartPerformed(AjaxRequestTarget target){
}
- protected QName getNewAssignmentRelation(){
- return SchemaConstants.ORG_DEFAULT;
+ protected QName getNewAssignmentRelation() {
+ return WebComponentUtil.getDefaultRelationOrFail();
}
protected RoleCatalogStorage getRoleCatalogStorage(){
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java
index 569c48ea2d8..e4e3451a81f 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java
@@ -288,7 +288,7 @@ private CallableResult> loadWorkItems() {
// (Note that the current code is consistent with the other places where work items are displayed.)
S_FilterEntryOrEmpty q = QueryBuilder.queryFor(WorkItemType.class, getPrismContext());
ObjectQuery query = QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(),
- OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS)
+ OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getRelationRegistry())
.desc(F_CREATE_TIMESTAMP)
.build();
Collection> options =
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/UserViewTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/UserViewTabPanel.java
index 97f7f9177d9..600fe36e733 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/UserViewTabPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/UserViewTabPanel.java
@@ -160,8 +160,7 @@ public IModel getBody() {
if (relation == null){
return createStringResource("RelationTypes.ANY");
}
- List defList = WebComponentUtil.getRelationDefinitions(UserViewTabPanel.this.getPageBase());
- RelationDefinitionType def = ObjectTypeUtil.findRelationDefinition(defList, model.getObject());
+ RelationDefinitionType def = WebComponentUtil.getRelationDefinition(model.getObject());
if (def != null) {
DisplayType display = def.getDisplay();
if (display != null) {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java
index e3c41603025..63e1a3f1ed0 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java
@@ -30,6 +30,7 @@
import com.evolveum.midpoint.prism.match.MatchingRuleRegistry;
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.repo.common.expression.ExpressionFactory;
+import com.evolveum.midpoint.schema.RelationRegistry;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.SchemaDebugUtil;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
@@ -158,6 +159,8 @@ public class MidPointApplication extends AuthenticatedWebApplication {
@Autowired
transient ModelInteractionService modelInteractionService;
@Autowired
+ transient RelationRegistry relationRegistry;
+ @Autowired
transient TaskService taskService;
@Autowired
transient PrismContext prismContext;
@@ -193,6 +196,12 @@ public class MidPointApplication extends AuthenticatedWebApplication {
transient ApplicationContext applicationContext;
private WebApplicationConfiguration webApplicationConfiguration;
+
+ public static final String MOUNT_INTERNAL_SERVER_ERROR = "/error";
+ public static final String MOUNT_UNAUTHORIZED_ERROR = "/error/401";
+ public static final String MOUNT_FORBIDEN_ERROR = "/error/403";
+ public static final String MOUNT_NOT_FOUND_ERROR = "/error/404";
+ public static final String MOUNT_GONE_ERROR = "/error/410";
@Override
public Class extends PageBase> getHomePage() {
@@ -249,11 +258,11 @@ public void init() {
appSettings.setInternalErrorPage(PageError.class);
appSettings.setPageExpiredErrorPage(PageError.class);
- mount(new MountedMapper("/error", PageError.class, new PageParametersEncoder()));
- mount(new MountedMapper("/error/401", PageError401.class, new PageParametersEncoder()));
- mount(new MountedMapper("/error/403", PageError403.class, new PageParametersEncoder()));
- mount(new MountedMapper("/error/404", PageError404.class, new PageParametersEncoder()));
- mount(new MountedMapper("/error/410", PageError410.class, new PageParametersEncoder()));
+ mount(new MountedMapper(MOUNT_INTERNAL_SERVER_ERROR, PageError.class, new PageParametersEncoder()));
+ mount(new MountedMapper(MOUNT_UNAUTHORIZED_ERROR, PageError401.class, new PageParametersEncoder()));
+ mount(new MountedMapper(MOUNT_FORBIDEN_ERROR, PageError403.class, new PageParametersEncoder()));
+ mount(new MountedMapper(MOUNT_NOT_FOUND_ERROR, PageError404.class, new PageParametersEncoder()));
+ mount(new MountedMapper(MOUNT_GONE_ERROR, PageError410.class, new PageParametersEncoder()));
getRequestCycleListeners().add(new LoggingRequestCycleListener(this));
@@ -491,6 +500,10 @@ public ModelInteractionService getModelInteractionService() {
return modelInteractionService;
}
+ public RelationRegistry getRelationRegistry() {
+ return relationRegistry;
+ }
+
public static boolean containsLocale(Locale locale) {
if (locale == null) {
return false;
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java
index c81e994e350..66e4653a720 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java
@@ -20,6 +20,7 @@
import com.evolveum.midpoint.util.aspect.ProfilingDataManager;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
+import org.apache.catalina.connector.ClientAbortException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
@@ -68,7 +69,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
try {
chain.doFilter(request, response);
} catch (IOException | ServletException | RuntimeException | Error e) {
- LOGGER.debug("Encountered exception: {}: {}", e.getClass().getName(), e.getMessage(), e);
+ logException(e);
throw e;
}
@@ -85,7 +86,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
try {
chain.doFilter(request, response);
} catch (IOException | ServletException | RuntimeException | Error e) {
- LOGGER.debug("Encountered exception: {}: {}", e.getClass().getName(), e.getMessage(), e);
+ logException(e);
throw e;
}
}
@@ -99,5 +100,15 @@ private void prepareRequestProfilingEvent(ServletRequest request, long elapsed,
ProfilingDataManager.getInstance().prepareRequestProfilingEvent(event);
}
+ private void logException(Throwable t) throws IOException, ServletException {
+ if (t instanceof ClientAbortException) {
+ if (LOGGER.isDebugEnabled()) {
+ // client abort exceptions are quite OK as they are not an application/server problem
+ LOGGER.debug("Encountered exception: {}: {}", t.getClass().getName(), t.getMessage(), t);
+ }
+ return;
+ }
+ LOGGER.error("Encountered exception: {}: {}", t.getClass().getName(), t.getMessage(), t);
+ }
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java
index ea62e9c3649..bd23765693a 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java
@@ -18,9 +18,6 @@
import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
-import com.evolveum.midpoint.schema.constants.SchemaConstants;
-
-import javax.xml.namespace.QName;
/**
* @author lazyman
@@ -67,8 +64,6 @@ public enum ObjectTypeGuiDescriptor {
SECURITY_POLICY(ObjectTypes.SECURITY_POLICY, "ObjectTypeGuiDescriptor.securityPolicy", "", ""),
- USER_ORG_MANAGER(SchemaConstants.ORG_MANAGER, "ObjectTypeGuiDescriptor.orgManager", "silk-user_red", "silk-user_red"),
-
LOOKUP_TABLE(ObjectTypes.LOOKUP_TABLE, "ObjectTypeGuiDescriptor.lookupTable", "", ""),
ACCESS_CERTIFICATION_DEFINITION(ObjectTypes.ACCESS_CERTIFICATION_DEFINITION, "ObjectTypeGuiDescriptor.accessCertificationDefinition", "", ""),
@@ -89,7 +84,6 @@ public enum ObjectTypeGuiDescriptor {
public static final String ERROR_LOCALIZATION_KEY = "ObjectTypeGuiDescriptor.unknown";
private ObjectTypes type;
- private QName relation;
private String localizationKey;
private String coloredIcon;
private String blackIcon;
@@ -101,13 +95,6 @@ public enum ObjectTypeGuiDescriptor {
this.type = type;
}
- ObjectTypeGuiDescriptor(QName relation, String localizationKey, String coloredIcon, String blackIcon) {
- this.coloredIcon = coloredIcon;
- this.blackIcon = blackIcon;
- this.localizationKey = localizationKey;
- this.relation = relation;
- }
-
@SuppressWarnings("unused")
public String getColoredIcon() {
return coloredIcon;
@@ -125,10 +112,6 @@ public ObjectTypes getType() {
return type;
}
- public QName getRelation() {
- return relation;
- }
-
public static ObjectTypeGuiDescriptor getDescriptor(Class type) {
for (ObjectTypeGuiDescriptor descr : ObjectTypeGuiDescriptor.values()) {
if (descr.getType() != null && descr.getType().getClassDefinition().equals(type)) {
@@ -151,14 +134,4 @@ public static ObjectTypeGuiDescriptor getDescriptor(ObjectTypes type) {
return null;
}
-
- public static ObjectTypeGuiDescriptor getDescriptor(QName relation) {
- for (ObjectTypeGuiDescriptor descr : ObjectTypeGuiDescriptor.values()) {
- if (descr.getRelation() != null && descr.getRelation().equals(relation)) {
- return descr;
- }
- }
-
- return null;
- }
}
diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java
index 4aa78b926a6..aa655f8d302 100644
--- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java
+++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java
@@ -22,7 +22,7 @@
import com.evolveum.midpoint.common.LocalizationService;
import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
-import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
+import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.model.api.ModelInteractionService;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.model.test.AbstractModelIntegrationTest;
@@ -31,9 +31,9 @@
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.repo.common.expression.ExpressionFactory;
+import com.evolveum.midpoint.schema.RelationRegistry;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
-import com.evolveum.midpoint.security.api.MidPointPrincipal;
import com.evolveum.midpoint.security.api.SecurityContextManager;
import com.evolveum.midpoint.security.enforcer.api.SecurityEnforcer;
import com.evolveum.midpoint.task.api.Task;
@@ -44,7 +44,6 @@
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.application.DescriptorLoader;
import com.evolveum.midpoint.web.security.MidPointApplication;
-import com.evolveum.midpoint.web.security.SecurityUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
@@ -113,10 +112,12 @@ public abstract class AbstractGuiIntegrationTest extends AbstractModelIntegratio
@Autowired private ApplicationContext appContext;
@Autowired protected PrismContext prismContext;
@Autowired protected ExpressionFactory expressionFactory;
+ @Autowired protected RelationRegistry relationRegistry;
@Override
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
super.initSystem(initTask, initResult);
+ WebComponentUtil.setStaticallyProvidedRelationRegistry(relationRegistry);
}
@PostConstruct
diff --git a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/AbstractDummyConnector.java b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/AbstractDummyConnector.java
index a5cc62910e4..47fee87865a 100644
--- a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/AbstractDummyConnector.java
+++ b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/AbstractDummyConnector.java
@@ -23,6 +23,7 @@
import org.identityconnectors.framework.common.exceptions.ConnectorException;
import org.identityconnectors.framework.common.exceptions.ConnectorIOException;
import org.identityconnectors.framework.common.exceptions.InvalidAttributeValueException;
+import org.identityconnectors.framework.common.exceptions.InvalidPasswordException;
import org.identityconnectors.framework.common.exceptions.UnknownUidException;
import org.identityconnectors.framework.common.objects.*;
@@ -390,7 +391,8 @@ public Schema schema() {
throw new UnsupportedOperationException();
}
- SchemaBuilder builder = new SchemaBuilder(AbstractDummyConnector.class);
+ SchemaBuilder builder = new SchemaBuilder(this.getClass());
+ log.ok("Building schema for {0}", this.getClass());
try {
@@ -418,11 +420,17 @@ public Schema schema() {
builder.defineOperationOption(OperationOptionInfoBuilder.buildPageSize(), SearchOp.class);
builder.defineOperationOption(OperationOptionInfoBuilder.buildSortKeys(), SearchOp.class);
}
+
+ extendSchema(builder);
log.info("schema::end");
return builder.build();
}
+ protected void extendSchema(SchemaBuilder builder) {
+ // for subclasses
+ }
+
private String getAccountObjectClassName() {
if (configuration.getUseLegacySchema()) {
return ObjectClass.ACCOUNT_NAME;
@@ -1598,6 +1606,32 @@ private boolean attributesToGetHasAttribute(Collection attributesToGet,
}
return attributesToGet.contains(attrName);
}
+
+ protected void applyModifyMetadata(DummyObject object, OperationOptions options) throws ConnectException, FileNotFoundException, SchemaViolationException, ConflictException {
+ String runAsUser = options.getRunAsUser();
+ if (runAsUser != null) {
+ if (!configuration.getSupportRunAs()) {
+ throw new UnsupportedOperationException("runAsUser option is not supported");
+ }
+ DummyAccount runAsAccount = resource.getAccountByUsername(runAsUser);
+ if (runAsAccount == null) {
+ new ConfigurationException("No runAsUser "+runAsUser);
+ }
+ GuardedString runWithPassword = options.getRunWithPassword();
+ if (runWithPassword != null) {
+ runWithPassword.access((clearChars) -> {
+ if (!runAsAccount.getPassword().equals(new String(clearChars))) {
+ throw new InvalidPasswordException("Wrong runWithPassword");
+ }
+ });
+ } else {
+ throw new InvalidPasswordException("No runWithPassword");
+ }
+ object.setLastModifier(runAsAccount.getName());
+ } else {
+ object.setLastModifier(null);
+ }
+ }
public void validate(ObjectClass oc) {
if (oc == null) {
diff --git a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConfiguration.java b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConfiguration.java
index 0e6a3788027..c816942e080 100644
--- a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConfiguration.java
+++ b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConfiguration.java
@@ -45,6 +45,7 @@ public class DummyConfiguration extends AbstractConfiguration {
private boolean supportSchema = true;
private boolean supportActivation = true;
private boolean supportValidity = false;
+ private boolean supportRunAs = true;
private String uidMode = UID_MODE_NAME;
private boolean enforceUniqueName = true;
private String passwordReadabilityMode = PASSWORD_READABILITY_MODE_UNREADABLE;
@@ -126,6 +127,16 @@ public boolean getSupportValidity() {
public void setSupportValidity(boolean supportValidity) {
this.supportValidity = supportValidity;
}
+
+ @ConfigurationProperty(displayMessageKey = "UI_SUPPORT_RUN_AS",
+ helpMessageKey = "UI_SUPPORT_RUN_AS_HELP")
+ public boolean getSupportRunAs() {
+ return supportRunAs;
+ }
+
+ public void setSupportRunAs(boolean supportRunAs) {
+ this.supportRunAs = supportRunAs;
+ }
@ConfigurationProperty(displayMessageKey = "UI_UID_MODE",
helpMessageKey = "UI_UID_MODE_HELP")
diff --git a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java
index 51c1fd8eaff..df5e37a839d 100644
--- a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java
+++ b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java
@@ -23,6 +23,7 @@
import org.identityconnectors.framework.common.exceptions.ConnectorException;
import org.identityconnectors.framework.common.exceptions.ConnectorIOException;
import org.identityconnectors.framework.common.exceptions.InvalidAttributeValueException;
+import org.identityconnectors.framework.common.exceptions.InvalidPasswordException;
import org.identityconnectors.framework.common.exceptions.UnknownUidException;
import org.identityconnectors.framework.common.objects.*;
@@ -125,6 +126,7 @@ public Set updateDelta(final ObjectClass objectClass, final Uid
if (account == null) {
throw new UnknownUidException("Account with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(account, options);
// we do this before setting attribute values, in case when description itself would be changed
resource.changeDescriptionIfNeeded(account);
@@ -174,6 +176,7 @@ public Set updateDelta(final ObjectClass objectClass, final Uid
}
}
+
} else if (ObjectClass.GROUP.is(objectClass.getObjectClassValue())) {
@@ -188,6 +191,7 @@ public Set updateDelta(final ObjectClass objectClass, final Uid
if (group == null) {
throw new UnknownUidException("Group with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(group, options);
for (AttributeDelta delta : modifications) {
if (delta.is(Name.NAME)) {
@@ -219,6 +223,7 @@ public Set updateDelta(final ObjectClass objectClass, final Uid
applyOrdinaryAttributeDelta(group, delta, valuesTransformer);
}
}
+
} else if (objectClass.is(OBJECTCLASS_PRIVILEGE_NAME)) {
@@ -233,6 +238,7 @@ public Set updateDelta(final ObjectClass objectClass, final Uid
if (priv == null) {
throw new UnknownUidException("Privilege with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(priv, options);
for (AttributeDelta delta : modifications) {
if (delta.is(Name.NAME)) {
@@ -257,6 +263,7 @@ public Set updateDelta(final ObjectClass objectClass, final Uid
applyOrdinaryAttributeDelta(priv, delta, null);
}
}
+
} else if (objectClass.is(OBJECTCLASS_ORG_NAME)) {
@@ -271,6 +278,7 @@ public Set updateDelta(final ObjectClass objectClass, final Uid
if (org == null) {
throw new UnknownUidException("Org with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(org, options);
for (AttributeDelta delta : modifications) {
if (delta.is(Name.NAME)) {
@@ -295,7 +303,7 @@ public Set updateDelta(final ObjectClass objectClass, final Uid
applyOrdinaryAttributeDelta(org, delta, null);
}
}
-
+
} else {
throw new ConnectorException("Unknown object class "+objectClass);
@@ -321,7 +329,7 @@ public Set updateDelta(final ObjectClass objectClass, final Uid
log.info("update::end {0}", instanceName);
return sideEffectChanges;
}
-
+
private void applyAuxiliaryObjectClassDelta(DummyObject dummyObject, AttributeDelta delta) {
List replaceValues = getReplaceValues(delta, String.class);
if (replaceValues != null) {
@@ -490,4 +498,15 @@ protected void addAdditionalCommonAttributes(ConnectorObjectBuilder builder, Dum
}
}
+ @Override
+ protected void extendSchema(SchemaBuilder builder) {
+ super.extendSchema(builder);
+
+ if (configuration.getSupportRunAs()) {
+ log.ok("Adding runAs options to schema");
+ builder.defineOperationOption(OperationOptionInfoBuilder.buildRunWithUser(), UpdateDeltaOp.class);
+ builder.defineOperationOption(OperationOptionInfoBuilder.buildRunWithPassword(), UpdateDeltaOp.class);
+ }
+ }
+
}
diff --git a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnectorLegacyUpdate.java b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnectorLegacyUpdate.java
index 046ccc3505c..f3d1c2eef8a 100644
--- a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnectorLegacyUpdate.java
+++ b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnectorLegacyUpdate.java
@@ -116,6 +116,7 @@ public Uid update(ObjectClass objectClass, Uid uid, Set replaceAttrib
if (account == null) {
throw new UnknownUidException("Account with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(account, options);
// we do this before setting attribute values, in case when description itself would be changed
resource.changeDescriptionIfNeeded(account);
@@ -179,6 +180,7 @@ public Uid update(ObjectClass objectClass, Uid uid, Set replaceAttrib
if (group == null) {
throw new UnknownUidException("Group with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(group, options);
for (Attribute attr : replaceAttributes) {
if (attr.is(Name.NAME)) {
@@ -229,6 +231,7 @@ public Uid update(ObjectClass objectClass, Uid uid, Set replaceAttrib
if (priv == null) {
throw new UnknownUidException("Privilege with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(priv, options);
for (Attribute attr : replaceAttributes) {
if (attr.is(Name.NAME)) {
@@ -271,6 +274,7 @@ public Uid update(ObjectClass objectClass, Uid uid, Set replaceAttrib
if (org == null) {
throw new UnknownUidException("Org with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(org, options);
for (Attribute attr : replaceAttributes) {
if (attr.is(Name.NAME)) {
@@ -346,6 +350,7 @@ public Uid addAttributeValues(ObjectClass objectClass, Uid uid, Set v
if (account == null) {
throw new UnknownUidException("Account with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(account, options);
// we could change the description here, but don't do that not to collide with ADD operation
// TODO add the functionality if needed
@@ -391,6 +396,7 @@ public Uid addAttributeValues(ObjectClass objectClass, Uid uid, Set v
if (group == null) {
throw new UnknownUidException("Group with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(group, options);
for (Attribute attr : valuesToAdd) {
@@ -435,6 +441,7 @@ public Uid addAttributeValues(ObjectClass objectClass, Uid uid, Set v
if (priv == null) {
throw new UnknownUidException("Privilege with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(priv, options);
for (Attribute attr : valuesToAdd) {
@@ -471,6 +478,7 @@ public Uid addAttributeValues(ObjectClass objectClass, Uid uid, Set v
if (org == null) {
throw new UnknownUidException("Org with UID "+uid+" does not exist on resource");
}
+ applyModifyMetadata(org, options);
for (Attribute attr : valuesToAdd) {
@@ -538,6 +546,7 @@ public Uid removeAttributeValues(ObjectClass objectClass, Uid uid, Set auxiliaryObjectClassNames = new HashSet<>();
@@ -117,6 +118,14 @@ public void setValidTo(Date validTo) throws ConnectException, FileNotFoundExcept
recordModify();
}
+ public String getLastModifier() {
+ return lastModifier;
+ }
+
+ public void setLastModifier(String lastModifier) {
+ this.lastModifier = lastModifier;
+ }
+
public BreakMode getModifyBreakMode() {
return modifyBreakMode;
}
@@ -460,11 +469,6 @@ protected String toStringContent() {
return "name=" + name + ", attributes=" + attributes + ", enabled=" + enabled;
}
- @Override
- public String debugDump() {
- return debugDump(0);
- }
-
@Override
public String debugDump(int indent) {
StringBuilder sb = new StringBuilder();
@@ -483,6 +487,8 @@ public String debugDump(int indent) {
sb.append(" ").append(PrettyPrinter.prettyPrint(validFrom)).append(" - ").append(PrettyPrinter.prettyPrint(validTo));
}
sb.append("\n");
+ DebugUtil.debugDumpWithLabel(sb, "lastModifier", lastModifier, indent + 1);
+ sb.append("\n");
DebugUtil.debugDumpWithLabel(sb, "Attributes", attributes, indent + 1);
extendDebugDump(sb, indent);
return sb.toString();
diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/ResourceObjectPattern.java b/infra/common/src/main/java/com/evolveum/midpoint/common/ResourceObjectPattern.java
index 15e099c2841..0e783df9b27 100644
--- a/infra/common/src/main/java/com/evolveum/midpoint/common/ResourceObjectPattern.java
+++ b/infra/common/src/main/java/com/evolveum/midpoint/common/ResourceObjectPattern.java
@@ -28,6 +28,7 @@
import com.evolveum.midpoint.prism.match.MatchingRuleRegistry;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
+import com.evolveum.midpoint.schema.RelationRegistry;
import com.evolveum.midpoint.schema.processor.ResourceAttribute;
import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
@@ -61,18 +62,19 @@ public void addIdentifier(ResourceAttribute> identifier) {
}
public static boolean matches(PrismObject shadowToMatch,
- Collection protectedAccountPatterns, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException {
+ Collection protectedAccountPatterns, MatchingRuleRegistry matchingRuleRegistry,
+ RelationRegistry relationRegistry) throws SchemaException {
for (ResourceObjectPattern pattern: protectedAccountPatterns) {
- if (pattern.matches(shadowToMatch, matchingRuleRegistry)) {
+ if (pattern.matches(shadowToMatch, matchingRuleRegistry, relationRegistry)) {
return true;
}
}
return false;
}
- public boolean matches(PrismObject shadowToMatch, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException {
+ public boolean matches(PrismObject shadowToMatch, MatchingRuleRegistry matchingRuleRegistry, RelationRegistry relationRegistry) throws SchemaException {
if (objectFilter != null) {
- ObjectTypeUtil.normalizeFilter(objectFilter); // we suppose references in shadowToMatch are normalized (on return from repo)
+ ObjectTypeUtil.normalizeFilter(objectFilter, relationRegistry); // we suppose references in shadowToMatch are normalized (on return from repo)
return ObjectQuery.match(shadowToMatch, objectFilter, matchingRuleRegistry);
} else {
// Deprecated method
diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java
new file mode 100644
index 00000000000..375fd18c739
--- /dev/null
+++ b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2010-2018 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.common.refinery;
+
+import com.evolveum.midpoint.schema.RelationRegistry;
+import com.evolveum.midpoint.util.QNameUtil;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationDefinitionType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType;
+import org.jetbrains.annotations.NotNull;
+
+import javax.xml.namespace.QName;
+import java.util.Collection;
+import java.util.List;
+
+import static com.evolveum.midpoint.schema.constants.SchemaConstants.ORG_DEFAULT;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singleton;
+import static java.util.Collections.singletonList;
+
+/**
+ * Temporary workaround: in TestRefinedSchema we don't have spring context.
+ * @author mederly
+ */
+class RelationRegistryDummyImpl implements RelationRegistry {
+
+ @Override
+ public List getRelationDefinitions() {
+ return emptyList();
+ }
+
+ @Override
+ public RelationDefinitionType getRelationDefinition(QName relation) {
+ return null;
+ }
+
+ @Override
+ public boolean isOfKind(QName relation, RelationKindType kind) {
+ return kind == RelationKindType.MEMBERSHIP && (relation == null || QNameUtil.match(relation, ORG_DEFAULT));
+ }
+
+ @Override
+ public boolean isManager(QName relation) {
+ return false;
+ }
+
+ @Override
+ public boolean isDelegation(QName relation) {
+ return false;
+ }
+
+ @Override
+ public boolean isMembership(QName relation) {
+ return isOfKind(relation, RelationKindType.MEMBERSHIP);
+ }
+
+ @Override
+ public boolean isOwner(QName relation) {
+ return false;
+ }
+
+ @Override
+ public boolean isApprover(QName relation) {
+ return false;
+ }
+
+ @Override
+ public boolean processRelationOnLogin(QName relation) {
+ return false;
+ }
+
+ @Override
+ public boolean processRelationOnRecompute(QName relation) {
+ return false;
+ }
+
+ @Override
+ public boolean includeIntoParentOrgRef(QName relation) {
+ return false;
+ }
+
+ @Override
+ public QName getDefaultRelation() {
+ return ORG_DEFAULT;
+ }
+
+ @NotNull
+ @Override
+ public Collection getAllRelationsFor(RelationKindType kind) {
+ return kind == RelationKindType.MEMBERSHIP ? singletonList(ORG_DEFAULT) : emptyList();
+ }
+
+ @Override
+ public QName getDefaultRelationFor(RelationKindType kind) {
+ return kind == RelationKindType.MEMBERSHIP ? ORG_DEFAULT : null;
+ }
+
+ @NotNull
+ @Override
+ public QName normalizeRelation(QName relation) {
+ return relation == null ? ORG_DEFAULT : relation;
+ }
+
+ @Override
+ public void applyRelationConfiguration(SystemConfigurationType relationsDefinition) {
+ }
+
+ @Override
+ public boolean isDefault(QName relation) {
+ return relation == null || QNameUtil.match(relation, ORG_DEFAULT);
+ }
+
+ @NotNull
+ @Override
+ public Collection getAliases(QName relation) {
+ return singleton(relation);
+ }
+}
diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java
index 428eb663361..193d5cad641 100644
--- a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java
+++ b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java
@@ -33,6 +33,7 @@
import com.evolveum.midpoint.prism.ConsistencyCheckScope;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
+import com.evolveum.midpoint.schema.RelationRegistry;
import com.evolveum.midpoint.schema.processor.*;
import org.testng.Assert;
import org.testng.AssertJUnit;
@@ -85,6 +86,8 @@ public class TestRefinedSchema {
private static final QName OBJECT_CLASS_INETORGPERSON_QNAME = new QName(MidPointConstants.NS_RI, "inetOrgPerson");
+ private final RelationRegistry relationRegistry = new RelationRegistryDummyImpl();
+
@BeforeSuite
public void setup() throws SchemaException, SAXException, IOException {
PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX);
@@ -544,9 +547,9 @@ private void assertDeprecatedProtectedAccount(String message, ResourceObjectPatt
ResourceAttribute confusingAttr2 = createStringAttribute(new QName("http://whatever.com","confuseMeAgain"), "WoodchuckWouldChuckNoWoodAsWoodchuckCannotChuckWood");
attributesContainer.add(confusingAttr2);
- assertTrue("Test attr not matched in "+message, protectedPattern.matches(shadow, null));
+ assertTrue("Test attr not matched in "+message, protectedPattern.matches(shadow, null, relationRegistry));
nameAttr.setRealValue("huhulumululul");
- assertFalse("Test attr nonsense was matched in "+message, protectedPattern.matches(shadow, null));
+ assertFalse("Test attr nonsense was matched in "+message, protectedPattern.matches(shadow, null, relationRegistry));
}
private ResourceAttribute createStringAttribute(QName attrName, String value) {
diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java
index b6c55b92306..b51e64b072d 100644
--- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java
+++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java
@@ -36,6 +36,7 @@
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.util.List;
/**
*
@@ -267,8 +268,20 @@ void adopt(PrismContainerValue relationQuery, QName relation);
+
}
diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java
index 9276c2051d3..1bb56f77a2a 100644
--- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java
+++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java
@@ -31,6 +31,7 @@
import com.evolveum.midpoint.prism.util.PrismMonitor;
import com.evolveum.midpoint.prism.util.PrismPrettyPrinter;
import com.evolveum.midpoint.prism.xnode.RootXNode;
+import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.util.logging.Trace;
@@ -46,6 +47,7 @@
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.util.List;
/**
* @author semancik
@@ -475,4 +477,28 @@ public O createKnownObjectable(@NotNull Class clazz) {
public LexicalProcessorRegistry getLexicalProcessorRegistry() {
return lexicalProcessorRegistry;
}
+
+ @Override
+ public boolean isDefaultRelation(QName relation) {
+ return relation == null || defaultRelation != null && QNameUtil.match(relation, defaultRelation);
+ }
+
+ @Override
+ public boolean relationsEquivalent(QName relation1, QName relation2) {
+ if (isDefaultRelation(relation1)) {
+ return isDefaultRelation(relation2);
+ } else {
+ return QNameUtil.match(relation1, relation2);
+ }
+ }
+
+ @Override
+ public boolean relationMatches(QName relationQuery, QName relation) {
+ return QNameUtil.match(relationQuery, PrismConstants.Q_ANY) || relationsEquivalent(relationQuery, relation);
+ }
+
+ @Override
+ public boolean relationMatches(@NotNull List relationQuery, QName relation) {
+ return relationQuery.stream().anyMatch(rq -> relationMatches(rq, relation));
+ }
}
diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java
index 97d55403604..d8e653629a2 100644
--- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java
+++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java
@@ -1178,10 +1178,29 @@ public void merge(ItemDelta deltaToMerge) {
mergeValuesToDelete(PrismValue.cloneValues(deltaToMerge.valuesToDelete));
}
}
+
+ if (CollectionUtils.isNotEmpty(deltaToMerge.estimatedOldValues)) {
+ mergeOldValues(PrismValue.cloneValues(deltaToMerge.estimatedOldValues));
+ }
+
// We do not want to clean up the sets during merging (e.g. in removeValue methods) because the set
// may become empty and the a values may be added later. So just clean it up when all is done.
removeEmptySets();
}
+
+ private void mergeOldValues(Collection oldValues) {
+ if (estimatedOldValues == null) {
+ estimatedOldValues = newValueCollection();
+ }
+
+ for (V oldValue : oldValues) {
+ if (containsEquivalentValue(estimatedOldValues, oldValue)) {
+ continue;
+ }
+
+ estimatedOldValues.add(oldValue);
+ }
+ }
private void removeEmptySets() {
// Do not remove replace set, even if it is empty.
diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/DeltaBuilder.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/DeltaBuilder.java
index 6eadc1e9af3..1af1aab7ded 100644
--- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/DeltaBuilder.java
+++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/DeltaBuilder.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2015 Evolveum
+ * Copyright (c) 2010-2018 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -199,6 +199,14 @@ public S_ValuesEntry oldRealValues(Collection> realValues) {
}
return this;
}
+
+ @Override
+ public S_ValuesEntry oldRealValue(T realValue) {
+ if (realValue != null) {
+ currentDelta.addEstimatedOldValue(toPrismValue(currentDelta, realValue));
+ }
+ return this;
+ }
@Override
public S_ValuesEntry old(PrismValue... values) {
diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/S_ItemEntry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/S_ItemEntry.java
index ee323185ee1..34e869b4504 100644
--- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/S_ItemEntry.java
+++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/S_ItemEntry.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2015 Evolveum
+ * Copyright (c) 2010-2018 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@ public interface S_ItemEntry {
S_ValuesEntry item(ItemPath path, ItemDefinition itemDefinition);
List> asObjectDeltas(String oid);
- ObjectDelta> asObjectDelta(String oid);
+ ObjectDelta asObjectDelta(String oid);
// TEMPORARY HACK
@SuppressWarnings("unchecked")
diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/S_ValuesEntry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/S_ValuesEntry.java
index 25237c86a6d..7973340c7aa 100644
--- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/S_ValuesEntry.java
+++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/builder/S_ValuesEntry.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2015 Evolveum
+ * Copyright (c) 2010-2018 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -44,6 +44,7 @@ public interface S_ValuesEntry {
S_ItemEntry replace(Collection extends PrismValue> values);
S_ValuesEntry old(Object... realValues);
S_ValuesEntry oldRealValues(Collection> realValues);
+ S_ValuesEntry oldRealValue(T realValue);
S_ValuesEntry old(PrismValue... values);
S_ValuesEntry old(Collection extends PrismValue> values);
}
diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java
index 6da5e097aa1..170f475b0ae 100644
--- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java
+++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java
@@ -222,11 +222,13 @@ public S_MatchingRuleEntry containsPoly(String orig) {
}
@Override
- public S_AtomicFilterExit ref(QName relation) {
- PrismReferenceValue ref = new PrismReferenceValue();
- ref.setRelation(relation);
- List values = new ArrayList<>();
- values.add(ref);
+ public S_AtomicFilterExit ref(QName... relations) {
+ List values = new ArrayList<>();
+ for (QName relation : relations) {
+ PrismReferenceValue ref = new PrismReferenceValue();
+ ref.setRelation(relation);
+ values.add(ref);
+ }
RefFilter filter = RefFilter.createReferenceEqual(itemPath, referenceDefinition, values);
filter.setOidNullAsAny(true);
filter.setTargetTypeNullAsAny(true);
diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java
index 319409fbbd6..e6236cda526 100644
--- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java
+++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java
@@ -48,7 +48,7 @@ public interface S_ConditionEntry {
S_MatchingRuleEntry contains(Object value);
S_MatchingRuleEntry containsPoly(String orig, String norm);
S_MatchingRuleEntry containsPoly(String orig);
- S_AtomicFilterExit ref(QName relation); // TODO is this supported by repo query interpreter?
+ S_AtomicFilterExit ref(QName... relations); // TODO is this supported by repo query interpreter?
S_AtomicFilterExit ref(PrismReferenceValue... value);
S_AtomicFilterExit ref(Collection values);
S_AtomicFilterExit ref(Collection values, boolean nullTypeAsAny); // beware, 'nullTypeAsAny' is supported only by built-in match(..) method
diff --git a/infra/schema/pom.xml b/infra/schema/pom.xml
index 31b099603ab..9b01e988a34 100644
--- a/infra/schema/pom.xml
+++ b/infra/schema/pom.xml
@@ -42,6 +42,18 @@
util
3.9-SNAPSHOT
+
+ org.springframework
+ spring-core
+
+
+ org.springframework
+ spring-beans
+
+
+ org.springframework
+ spring-context
+
commons-collections
commons-collections
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java
new file mode 100644
index 00000000000..8179135b910
--- /dev/null
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2010-2018 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.schema;
+
+import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationDefinitionType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType;
+import org.jetbrains.annotations.NotNull;
+
+import javax.xml.namespace.QName;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * TODO think about precise place of this interface
+ *
+ * @author mederly
+ */
+public interface RelationRegistry {
+
+ List getRelationDefinitions();
+
+ RelationDefinitionType getRelationDefinition(QName relation);
+
+ // SchemaException is thrown as SystemException as it really should not occur
+
+ boolean isOfKind(QName relation, RelationKindType kind);
+
+ boolean isManager(QName relation);
+
+ boolean isDelegation(QName relation);
+
+ boolean isMembership(QName relation);
+
+ boolean isOwner(QName relation);
+
+ boolean isApprover(QName relation);
+
+ boolean processRelationOnLogin(QName relation);
+
+ boolean processRelationOnRecompute(QName relation);
+
+ boolean includeIntoParentOrgRef(QName relation);
+
+ QName getDefaultRelation();
+
+ @NotNull
+ Collection getAllRelationsFor(RelationKindType kind);
+
+ QName getDefaultRelationFor(RelationKindType kind);
+
+ @NotNull
+ QName normalizeRelation(QName relation);
+
+ void applyRelationConfiguration(SystemConfigurationType relationsDefinition);
+
+ boolean isDefault(QName relation);
+
+ /**
+ * Returns aliases of a relation. Currently these are:
+ * - unnormalized version of the relation QNme
+ * - null if the relation is the default one
+ *
+ * In the future we might return some other values (e.g. explicitly configured aliases) as well.
+ * But we would need to adapt prismContext.relationsEquivalent method and other comparison methods as well.
+ * It is perhaps not worth the effort.
+ */
+ @NotNull
+ Collection getAliases(QName relation);
+}
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java
index fddfab68477..a70c494dfd6 100755
--- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java
@@ -16,11 +16,16 @@
package com.evolveum.midpoint.schema.constants;
-import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
-import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AreaCategoryType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType;
+import org.jetbrains.annotations.NotNull;
import javax.xml.namespace.QName;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import static com.evolveum.midpoint.xml.ns._public.common.common_3.AreaCategoryType.*;
+import static java.util.Collections.singletonList;
/**
* Built-in (hardcoded) relations.
@@ -29,22 +34,31 @@
*/
public enum RelationTypes {
- MEMBER(SchemaConstants.ORG_DEFAULT, "", AreaCategoryType.ADMINISTRATION, AreaCategoryType.ORGANIZATION, AreaCategoryType.SELF_SERVICE),
- MANAGER(SchemaConstants.ORG_MANAGER, "Manager", AreaCategoryType.ADMINISTRATION, AreaCategoryType.GOVERNANCE, AreaCategoryType.ORGANIZATION, AreaCategoryType.SELF_SERVICE),
- META(SchemaConstants.ORG_META, "Meta", AreaCategoryType.POLICY),
- DEPUTY(SchemaConstants.ORG_DEPUTY, "Deputy" /* no values */),
- APPROVER(SchemaConstants.ORG_APPROVER, "Approver", AreaCategoryType.ADMINISTRATION, AreaCategoryType.GOVERNANCE, AreaCategoryType.ORGANIZATION, AreaCategoryType.SELF_SERVICE),
- OWNER(SchemaConstants.ORG_OWNER, "Owner", AreaCategoryType.ADMINISTRATION, AreaCategoryType.GOVERNANCE, AreaCategoryType.ORGANIZATION, AreaCategoryType.SELF_SERVICE),
- CONSENT(SchemaConstants.ORG_CONSENT, "Consent", AreaCategoryType.DATA_PROTECTION),;
-
+ MEMBER(SchemaConstants.ORG_DEFAULT, "", RelationKindType.MEMBERSHIP, null, ADMINISTRATION, ORGANIZATION, SELF_SERVICE),
+ MANAGER(SchemaConstants.ORG_MANAGER, "Manager", RelationKindType.MANAGER, singletonList(RelationKindType.MEMBERSHIP), ADMINISTRATION, GOVERNANCE, ORGANIZATION, SELF_SERVICE),
+ META(SchemaConstants.ORG_META, "Meta", RelationKindType.META, singletonList(RelationKindType.MEMBERSHIP), POLICY),
+ DEPUTY(SchemaConstants.ORG_DEPUTY, "Deputy", RelationKindType.DELEGATION, null /* no values */),
+ APPROVER(SchemaConstants.ORG_APPROVER, "Approver", RelationKindType.APPROVER, null, ADMINISTRATION, GOVERNANCE, ORGANIZATION, SELF_SERVICE),
+ OWNER(SchemaConstants.ORG_OWNER, "Owner", RelationKindType.OWNER, null, ADMINISTRATION, GOVERNANCE, ORGANIZATION, SELF_SERVICE),
+ CONSENT(SchemaConstants.ORG_CONSENT, "Consent", RelationKindType.CONSENT, null, DATA_PROTECTION);
private final QName relation;
private final String headerLabel;
+ private final RelationKindType defaultFor;
+ @NotNull private final Collection kinds;
private final AreaCategoryType[] categories;
- RelationTypes(QName relation, String headerLabel, AreaCategoryType... categories) {
+ RelationTypes(QName relation, String headerLabel, RelationKindType defaultFor, Collection additionalKinds, AreaCategoryType... categories) {
this.relation = relation;
this.headerLabel = headerLabel;
+ this.kinds = new ArrayList<>();
+ if (defaultFor != null) {
+ kinds.add(defaultFor);
+ }
+ if (additionalKinds != null) {
+ kinds.addAll(additionalKinds);
+ }
+ this.defaultFor = defaultFor;
this.categories = categories;
}
@@ -59,20 +73,17 @@ public String getHeaderLabel() {
public String getLabelKey() {
return RelationTypes.class.getSimpleName() + "." + relation.getLocalPart();
}
-
+
+ public RelationKindType getDefaultFor() {
+ return defaultFor;
+ }
+
+ @NotNull
+ public Collection getKinds() {
+ return kinds;
+ }
+
public AreaCategoryType[] getCategories() {
return categories;
}
-
- public static RelationTypes getRelationType(QName relation) {
- if (ObjectTypeUtil.isDefaultRelation(relation)) {
- return RelationTypes.MEMBER;
- }
- for (RelationTypes relationTypes : RelationTypes.values()) {
- if (QNameUtil.match(relation, relationTypes.getRelation())) {
- return relationTypes;
- }
- }
- return RelationTypes.MEMBER;
- }
}
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java
index 58e5f65b884..5abdc08bf1e 100644
--- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java
@@ -139,64 +139,54 @@ public abstract class SchemaConstants {
// public static final QName T_PROTECTED_BYTE_ARRAY_TYPE = new QName(NS_C,
// "ProtectedByteArrayType");
+ /*
+ * Constants for default relations.
+ *
+ * Please DO NOT use these in production code. Use RelationKind values instead.
+ * ===========================================
+ *
+ * You can, however, freely use these in tests.
+ */
+
/**
- * Default relation, usually meaning "has" or "is member of". Used as a relation value in object references.
- * Specifies that the subject is a member of organization, or that the subject
- * has been assigned a role in a way that he gets authorizations and other content
- * provided by that role.
+ * Default membership relation. Used as a relation value in object references.
+ * See RelationKind.MEMBERSHIP for more details.
*/
public static final QName ORG_DEFAULT = new QName(NS_ORG, "default");
/**
- * Relation "is manager of". Used as a relation value in object references.
- * Specifies that the subject is a manager of organizational unit.
+ * Default 'manager' relation. Used as a relation value in object references.
+ * See RelationKind.MANAGER for more details.
*/
public static final QName ORG_MANAGER = new QName(NS_ORG, "manager");
/**
- * Relation used for metarole assignments. Sometimes it is important to
- * distinguish metarole and member assignments. This relation is used
- * for that purpose.
+ * Default 'metarole assignment' relation. Used as a relation value in object references.
+ * See RelationKind.META for more details.
*/
public static final QName ORG_META = new QName(NS_ORG, "meta");
/**
- * Relation "is deputy of". Used as a relation value in object references.
- * Specifies that the subject is a deputy of another user.
+ * Default delegation relation. Used as a relation value in object references.
+ * See RelationKind.DELEGATION for more details.
*/
public static final QName ORG_DEPUTY = new QName(NS_ORG, "deputy");
/**
- * Relation "is approver of". Used as a relation value in object references.
- * Specifies that the subject is a (general) approver of specified (abstract) role.
- * The approver will be asked for decision if the role is assigned, if there is
- * a rule conflict during assignment (e.g. SoD conflict) or if there is any similar
- * situation.
- *
- * This is a generic approver used for all the situation. The system may be customized
- * with more specific approver roles, e.g. technicalApprover, securityApprover, etc.
- *
- * This approver is responsible for the use of the role, which mostly means
- * that he decides about role assignment. It is NOT meant to approve role changes.
- * Role owner is meant for that purpose.
+ * Default 'approver' relation. Used as a relation value in object references.
+ * See RelationKind.APPROVER for more details.
*/
public static final QName ORG_APPROVER = new QName(NS_ORG, "approver");
/**
- * Relation "is owner of". Used as a relation value in object references.
- * Specifies that the subject is a (business) owner of specified (abstract) role.
- * The owner will be asked for decision if the role is modified, when the associated
- * policy changes and so on.
- *
- * This owner is responsible for maintaining role definition and policies. It is
- * NPT necessarily concerned with role use (e.g. assignment). The approver relation
- * is meant for that purpose.
+ * Default 'owner' relation. Used as a relation value in object references.
+ * See RelationKind.OWNER for more details.
*/
public static final QName ORG_OWNER = new QName(NS_ORG, "owner");
/**
- * Relation "is consent for". Used as a relation value in object references.
- * Specifies that the subject gave a consent for using personnel information related to this role.
+ * Default 'consent' relation. Used as a relation value in object references.
+ * See RelationKind.CONSENT for more details.
*/
public static final QName ORG_CONSENT = new QName(NS_ORG, "consent");
@@ -399,12 +389,24 @@ public abstract class SchemaConstants {
public static final String NS_GUI = NS_MIDPOINT_PUBLIC + "/gui";
public static final String NS_GUI_CHANNEL = NS_GUI + "/channels-3";
+
+ // Init channel, used when system is initializing itself
public static final QName CHANNEL_GUI_INIT_QNAME = new QName(NS_GUI_CHANNEL, "init");
public static final String CHANNEL_GUI_INIT_URI = QNameUtil.qNameToUri(CHANNEL_GUI_INIT_QNAME);
+
public static final QName CHANNEL_GUI_SELF_REGISTRATION_QNAME = new QName(NS_GUI_CHANNEL, "selfRegistration");
public static final String CHANNEL_GUI_SELF_REGISTRATION_URI = QNameUtil.qNameToUri(CHANNEL_GUI_SELF_REGISTRATION_QNAME);
+
+ // Channel for self-service part of the user interface. These are the pages when user is changing his own data.
+ // E.g. update of his own profile and password change are considered to be self-service.
+ public static final QName CHANNEL_GUI_SELF_SERVICE_QNAME = new QName(NS_GUI_CHANNEL, "selfService");
+ public static final String CHANNEL_GUI_SELF_SERVICE_URI = QNameUtil.qNameToUri(CHANNEL_GUI_SELF_SERVICE_QNAME);
+
+ // Password reset channel. This is *reset*, which means that the user does not know the old password and cannot log in.
public static final QName CHANNEL_GUI_RESET_PASSWORD_QNAME = new QName(NS_GUI_CHANNEL, "resetPassword");
public static final String CHANNEL_GUI_RESET_PASSWORD_URI = QNameUtil.qNameToUri(CHANNEL_GUI_RESET_PASSWORD_QNAME);
+
+ // Catch-all channel for all user operations in user interface.
public static final QName CHANNEL_GUI_USER_QNAME = new QName(NS_GUI_CHANNEL, "user");
public static final String CHANNEL_GUI_USER_URI = QNameUtil.qNameToUri(CHANNEL_GUI_USER_QNAME);
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceObjectIdentification.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceObjectIdentification.java
index 2c1d699c67b..c2a4ccf8003 100644
--- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceObjectIdentification.java
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceObjectIdentification.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2015-2016 Evolveum
+ * Copyright (c) 2015-2018 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
import com.evolveum.midpoint.schema.util.ShadowUtil;
import com.evolveum.midpoint.util.PrettyPrinter;
@@ -72,6 +73,19 @@ public ResourceAttribute getSecondaryIdentifier() throws SchemaException
return (ResourceAttribute) secondaryIdentifiers.iterator().next();
}
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public Collection extends ResourceAttribute>> getAllIdentifiers() {
+ if (primaryIdentifiers == null) {
+ return secondaryIdentifiers;
+ }
+ if (secondaryIdentifiers == null) {
+ return primaryIdentifiers;
+ }
+ List allIdentifiers = new ArrayList<>(primaryIdentifiers.size() + secondaryIdentifiers.size());
+ allIdentifiers.addAll(primaryIdentifiers);
+ allIdentifiers.addAll(secondaryIdentifiers);
+ return allIdentifiers;
+ }
public ObjectClassComplexTypeDefinition getObjectClassDefinition() {
return objectClassDefinition;
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java
new file mode 100644
index 00000000000..fc4e1b52504
--- /dev/null
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright (c) 2010-2018 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.schema.relation;
+
+import com.evolveum.midpoint.schema.constants.RelationTypes;
+import com.evolveum.midpoint.schema.constants.SchemaConstants;
+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.RelationDefinitionType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType;
+import org.apache.commons.collections4.ListValuedMap;
+import org.apache.commons.collections4.SetValuedMap;
+import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
+import org.apache.commons.collections4.multimap.HashSetValuedHashMap;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.util.CollectionUtils;
+
+import javax.xml.namespace.QName;
+import java.util.*;
+
+import static java.util.Collections.singleton;
+import static org.apache.commons.collections4.CollectionUtils.emptyIfNull;
+
+/**
+ * Relation definitions indexed for fast querying by the relation registry.
+ * It is intentionally package-private. Should be used only for RelationRegistryImpl.
+ *
+ * @author mederly
+ */
+class IndexedRelationDefinitions {
+
+ private static final Trace LOGGER = TraceManager.getTrace(IndexedRelationDefinitions.class);
+
+ /**
+ * All valid definitions are here; duplicates and invalid ones are filtered out.
+ */
+ @NotNull private final List definitions;
+ /**
+ * Looking up relation definition by its name.
+ *
+ * All variants of relation name are present in keySet, e.g. both 'org:approver' and 'approver' (in default configuration)
+ * There's also an entry with key=null, denoting the default relation.
+ */
+ @NotNull private final Map relationDefinitionsByRelationName;
+ /**
+ * Looking up relation kinds by its name. It is returned as HashSet to allow for quick determination of presence of specified kinds.
+ *
+ * Both qualified and unqualified forms of relation name are listed here, e.g. both 'org:approver' and 'approver'.
+ * Also an entry with key=null is present.
+ */
+ @NotNull private final SetValuedMap kindsByRelationName;
+ /**
+ * Looking up relations by its kind.
+ *
+ * Each relation is listed only once in values; e.g. there's 'org:approver' but not 'approver' (in default configuration)
+ */
+ @NotNull private final SetValuedMap relationsByKind;
+ /**
+ * Default relation for each kind.
+ * There should be exactly one for each kind.
+ */
+ @NotNull private final Map defaultRelationByKind;
+ /**
+ * Relations to be processed on login. Each relation is listed here under all its names.
+ */
+ @NotNull private final Set relationsToProcessOnLogin;
+ /**
+ * Relations to be processed on recompute. Each relation is listed here under all its names.
+ */
+ @NotNull private final Set relationsToProcessOnRecompute;
+ /**
+ * Aliases for each normalized relation QName.
+ */
+ @NotNull private final SetValuedMap aliases;
+
+ //region Initialization
+
+ IndexedRelationDefinitions(@NotNull List definitions) {
+ List validatedDefinitions = validateDefinitions(definitions);
+ this.definitions = validatedDefinitions;
+ relationDefinitionsByRelationName = initializeRelationDefinitionsByRelationName(validatedDefinitions);
+ kindsByRelationName = computeKindsByRelationName();
+ relationsByKind = computeRelationsByKind();
+ defaultRelationByKind = computeDefaultRelationByKind();
+
+ addDefaultRelationToMaps();
+
+ relationsToProcessOnLogin = computeRelationsToProcessOnLogin();
+ relationsToProcessOnRecompute = computeRelationsToProcessOnRecompute();
+
+ aliases = computeAliases();
+ logState();
+ }
+
+ private void addDefaultRelationToMaps() {
+ QName defaultRelation = defaultRelationByKind.get(RelationKindType.MEMBERSHIP);
+ if (defaultRelation != null) {
+ relationDefinitionsByRelationName.put(null, relationDefinitionsByRelationName.get(defaultRelation));
+ kindsByRelationName.putAll(null, kindsByRelationName.get(defaultRelation));
+ }
+ }
+
+ private void logState() {
+ if (LOGGER.isTraceEnabled()) {
+ LOGGER.trace("relation definitions = {}", definitions);
+ LOGGER.trace("relationDefinitionsByRelationName = {}", relationDefinitionsByRelationName);
+ LOGGER.trace("relationsByKind = {}", relationsByKind);
+ LOGGER.trace("defaultRelationByKind = {}", defaultRelationByKind);
+ LOGGER.trace("relationsToProcessOnLogin = {}", relationsToProcessOnLogin);
+ LOGGER.trace("relationsToProcessOnRecompute = {}", relationsToProcessOnRecompute);
+ LOGGER.trace("aliases = {}", aliases);
+ }
+ }
+
+ private List validateDefinitions(@NotNull List definitions) {
+ List validatedDefinitions = new ArrayList<>(definitions.size());
+ boolean membershipRelationExists = false;
+ for (RelationDefinitionType definition : definitions) {
+ if (definition.getRef() == null) {
+ LOGGER.error("Relation definition with null ref; ignoring: {}", definition);
+ } else {
+ if (QNameUtil.isUnqualified(definition.getRef())) {
+ LOGGER.warn("Unqualified relation name '{}'; please fix it as soon as possible; in {}", definition.getRef(), definition);
+ }
+ validatedDefinitions.add(definition);
+ if (!membershipRelationExists && definition.getKind().contains(RelationKindType.MEMBERSHIP)) {
+ membershipRelationExists = true;
+ }
+ }
+ }
+ if (!membershipRelationExists) {
+ LOGGER.error("No 'member' relation was defined. This would be a fatal condition, so we define one.");
+ validatedDefinitions.add(RelationRegistryImpl.createRelationDefinitionFromStaticDefinition(RelationTypes.MEMBER));
+ }
+ return validatedDefinitions;
+ }
+
+ /**
+ * Removes duplicate definitions as well.
+ */
+ @NotNull
+ private Map initializeRelationDefinitionsByRelationName(List definitions) {
+ Map map = new HashMap<>();
+ ListValuedMap expansions = new ArrayListValuedHashMap<>();
+ for (Iterator iterator = definitions.iterator(); iterator.hasNext(); ) {
+ RelationDefinitionType definition = iterator.next();
+ if (map.containsKey(definition.getRef())) {
+ LOGGER.error("Duplicate relation definition for '{}'; ignoring: {}", definition.getRef(), definition);
+ iterator.remove();
+ } else {
+ map.put(definition.getRef(), definition);
+ expansions.put(definition.getRef().getLocalPart(), definition.getRef());
+ }
+ }
+ // add entries for unqualified versions of the relation names
+ for (String unqualified : expansions.keySet()) {
+ List names = expansions.get(unqualified);
+ if (names.contains(new QName(unqualified))) {
+ continue; // cannot expand unqualified if the expanded value is also unqualified
+ }
+ assert !names.isEmpty();
+ assert names.stream().allMatch(QNameUtil::isQualified);
+ @NotNull QName chosenExpansion;
+ if (names.size() == 1) {
+ chosenExpansion = names.get(0);
+ } else {
+ QName nameInOrgNamespace = names.stream()
+ .filter(n -> SchemaConstants.NS_ORG.equals(n.getNamespaceURI()))
+ .findFirst().orElse(null);
+ if (nameInOrgNamespace != null) {
+ // org:xxx expansion will be the default one
+ chosenExpansion = nameInOrgNamespace;
+ } else {
+ chosenExpansion = names.get(0);
+ LOGGER.warn("Multiple resolutions of unqualified relation name '{}' ({}); "
+ + "using the first one as default: '{}'. Please reconsider this as it could lead to "
+ + "unpredictable behavior.", unqualified, names, chosenExpansion);
+ }
+ }
+ assert QNameUtil.isQualified(chosenExpansion);
+ map.put(new QName(unqualified), map.get(chosenExpansion));
+ }
+ return map;
+ }
+
+ private SetValuedMap computeKindsByRelationName() {
+ SetValuedMap rv = new HashSetValuedHashMap<>();
+ for (Map.Entry entry : relationDefinitionsByRelationName.entrySet()) {
+ for (RelationKindType kind : entry.getValue().getKind()) {
+ rv.put(entry.getKey(), kind);
+ }
+ }
+ return rv;
+ }
+
+ private SetValuedMap computeRelationsByKind() {
+ SetValuedMap rv = new HashSetValuedHashMap<>();
+ for (RelationDefinitionType definition : definitions) {
+ for (RelationKindType kind : definition.getKind()) {
+ rv.put(kind, definition.getRef());
+ }
+ }
+ return rv;
+ }
+
+ // not optimized for speed
+ @NotNull
+ private Collection getAllRelationNamesFor(RelationKindType kind) {
+ Set rv = new HashSet<>();
+ for (Map.Entry entry : relationDefinitionsByRelationName.entrySet()) {
+ if (entry.getValue().getKind().contains(kind)) {
+ rv.add(entry.getKey());
+ }
+ }
+ return rv;
+ }
+
+ private Map computeDefaultRelationByKind() {
+ Map rv = new HashMap<>();
+ for (RelationKindType kind : RelationKindType.values()) {
+ Set relationNames = relationsByKind.get(kind);
+ if (relationNames.isEmpty()) {
+ LOGGER.warn("No relations defined for kind {}, please define at least one", kind);
+ continue;
+ }
+ Set defaultRelationNames = new HashSet<>();
+ for (QName relationName : relationNames) {
+ RelationDefinitionType definition = relationDefinitionsByRelationName.get(relationName);
+ assert definition != null;
+ if (definition.getDefaultFor() == kind) {
+ defaultRelationNames.add(relationName);
+ }
+ }
+ QName chosen;
+ if (defaultRelationNames.size() > 1) {
+ chosen = defaultRelationNames.iterator().next();
+ LOGGER.error("More than one default relation set up for kind '{}': {}. Please choose one! Temporarily selecting '{}'",
+ kind, defaultRelationNames, chosen);
+ } else if (defaultRelationNames.size() == 1) {
+ chosen = defaultRelationNames.iterator().next();
+ } else {
+ chosen = relationNames.iterator().next(); // maybe we could select org:xxx here but let's not bother now
+ LOGGER.warn("No default relation set up for kind '{}'. Please choose one! Temporarily selecting '{}'", kind, chosen);
+ }
+ rv.put(kind, chosen);
+ }
+ return rv;
+ }
+
+ // We want to make this configurable in the future MID-3581
+ private Set computeRelationsToProcessOnLogin() {
+ HashSet rv = new HashSet<>();
+ rv.addAll(getAllRelationNamesFor(RelationKindType.MEMBERSHIP));
+ rv.addAll(getAllRelationNamesFor(RelationKindType.DELEGATION));
+ return rv;
+ }
+
+ // We want to make this configurable in the future MID-3581
+ private Set computeRelationsToProcessOnRecompute() {
+ HashSet rv = new HashSet<>();
+ rv.addAll(getAllRelationsFor(RelationKindType.MEMBERSHIP));
+ rv.addAll(getAllRelationsFor(RelationKindType.MANAGER));
+ rv.addAll(getAllRelationsFor(RelationKindType.DELEGATION));
+ return rv;
+ }
+
+ private SetValuedMap computeAliases() {
+ SetValuedMap rv = new HashSetValuedHashMap<>();
+ for (Map.Entry entry : relationDefinitionsByRelationName.entrySet()) {
+ rv.put(entry.getValue().getRef(), entry.getKey());
+ }
+ return rv;
+ }
+
+ //endregion
+
+ //region Querying
+ @NotNull
+ List getDefinitions() {
+ return definitions;
+ }
+
+ RelationDefinitionType getRelationDefinition(QName relation) {
+ return relationDefinitionsByRelationName.get(relation);
+ }
+
+ boolean isOfKind(QName relation, RelationKindType kind) {
+ Set relationKinds = kindsByRelationName.get(relation);
+ return relationKinds != null && relationKinds.contains(kind);
+ }
+
+ boolean processRelationOnLogin(QName relation) {
+ return relationsToProcessOnLogin.contains(relation);
+ }
+
+ boolean processRelationOnRecompute(QName relation) {
+ return relationsToProcessOnRecompute.contains(relation);
+ }
+
+ // We want to make this configurable in the future MID-3581
+ public boolean includeIntoParentOrgRef(QName relation) {
+ return isOfKind(relation, RelationKindType.MEMBERSHIP) && !isOfKind(relation, RelationKindType.META);
+ }
+
+ QName getDefaultRelationFor(RelationKindType kind) {
+ return defaultRelationByKind.get(kind);
+ }
+
+ @NotNull
+ Collection getAllRelationsFor(RelationKindType kind) {
+ return emptyIfNull(relationsByKind.get(kind));
+ }
+
+ @NotNull
+ QName normalizeRelation(QName relation) {
+ RelationDefinitionType definition = getRelationDefinition(relation);
+ assert !(relation == null && definition == null); // there is always a default definition
+ return definition != null ? definition.getRef() : relation;
+ }
+
+ @NotNull
+ Collection getAliases(QName relation) {
+ Set aliases = this.aliases.get(normalizeRelation(relation));
+ if (!CollectionUtils.isEmpty(aliases)) {
+ return aliases;
+ } else {
+ // for unknown relations we would like to return at least the provided name
+ return singleton(relation);
+ }
+ }
+ //endregion
+}
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java
new file mode 100644
index 00000000000..f1455e777dc
--- /dev/null
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2010-2018 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.schema.relation;
+
+import com.evolveum.midpoint.prism.PrismContext;
+import com.evolveum.midpoint.schema.RelationRegistry;
+import com.evolveum.midpoint.schema.constants.RelationTypes;
+import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
+import com.evolveum.midpoint.util.logging.Trace;
+import com.evolveum.midpoint.util.logging.TraceManager;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
+import org.apache.commons.lang.BooleanUtils;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.xml.namespace.QName;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import static java.util.Collections.emptyList;
+
+/**
+ * @author mederly
+ * @author semancik
+ */
+@Component
+public class RelationRegistryImpl implements RelationRegistry {
+
+ private static final Trace LOGGER = TraceManager.getTrace(RelationRegistryImpl.class);
+
+ @Autowired private PrismContext prismContext;
+
+ @NotNull
+ private IndexedRelationDefinitions indexedRelationDefinitions = createAndIndexRelationDefinitions(null);
+
+ @Override
+ public void applyRelationConfiguration(SystemConfigurationType systemConfiguration) {
+ RoleManagementConfigurationType roleManagement = systemConfiguration != null ? systemConfiguration.getRoleManagement() : null;
+ RelationsDefinitionType relationsDef = roleManagement != null ? roleManagement.getRelations() : null;
+ LOGGER.info("Applying relation configuration ({} entries)", relationsDef != null ? relationsDef.getRelation().size() : 0);
+ indexedRelationDefinitions = createAndIndexRelationDefinitions(relationsDef);
+ prismContext.setDefaultRelation(indexedRelationDefinitions.getDefaultRelationFor(RelationKindType.MEMBERSHIP));
+ }
+
+ public List getRelationDefinitions() {
+ return indexedRelationDefinitions.getDefinitions();
+ }
+
+ @NotNull
+ private IndexedRelationDefinitions createAndIndexRelationDefinitions(RelationsDefinitionType relationsDef) {
+ List configuredRelations = emptyList();
+ boolean includeDefaultRelations = true;
+ if (relationsDef != null) {
+ configuredRelations = relationsDef.getRelation();
+ if (BooleanUtils.isFalse(relationsDef.isIncludeDefaultRelations())) {
+ includeDefaultRelations = false;
+ }
+ }
+ List relations = new ArrayList<>();
+ for (RelationDefinitionType configuredRelation: configuredRelations) {
+ relations.add(cloneAndNormalize(configuredRelation));
+ }
+ if (includeDefaultRelations) {
+ addDefaultRelations(relations);
+ }
+ return new IndexedRelationDefinitions(relations);
+ }
+
+ private RelationDefinitionType cloneAndNormalize(RelationDefinitionType definition) {
+ RelationDefinitionType clone = definition.clone();
+ if (clone.getDefaultFor() != null && !clone.getKind().contains(clone.getDefaultFor())) {
+ clone.getKind().add(clone.getDefaultFor());
+ }
+ return clone;
+ }
+
+ private void addDefaultRelations(List relations) {
+ for (RelationTypes defaultRelationDefinition : RelationTypes.values()) {
+ if (ObjectTypeUtil.findRelationDefinition(relations, defaultRelationDefinition.getRelation()) == null) {
+ relations.add(createRelationDefinitionFromStaticDefinition(defaultRelationDefinition));
+ }
+ }
+ }
+
+ @NotNull
+ static RelationDefinitionType createRelationDefinitionFromStaticDefinition(RelationTypes defaultRelationDefinition) {
+ RelationDefinitionType relationDef = new RelationDefinitionType();
+ relationDef.setRef(defaultRelationDefinition.getRelation());
+ DisplayType display = new DisplayType();
+ display.setLabel(defaultRelationDefinition.getLabelKey());
+ relationDef.setDisplay(display);
+ relationDef.setDefaultFor(defaultRelationDefinition.getDefaultFor());
+ relationDef.getKind().addAll(defaultRelationDefinition.getKinds());
+ relationDef.getCategory().addAll(Arrays.asList(defaultRelationDefinition.getCategories()));
+ return relationDef;
+ }
+
+ //region =============================================================================================== query methods
+
+ @Override
+ public RelationDefinitionType getRelationDefinition(QName relation) {
+ return indexedRelationDefinitions.getRelationDefinition(relation);
+ }
+
+ @Override
+ public boolean isOfKind(QName relation, RelationKindType kind) {
+ return indexedRelationDefinitions.isOfKind(relation, kind);
+ }
+
+ @Override
+ public boolean isMembership(QName relation) {
+ return isOfKind(relation, RelationKindType.MEMBERSHIP);
+ }
+
+ @Override
+ public boolean isManager(QName relation) {
+ return isOfKind(relation, RelationKindType.MANAGER);
+ }
+
+ @Override
+ public boolean isDelegation(QName relation) {
+ return isOfKind(relation, RelationKindType.DELEGATION);
+ }
+
+ @Override
+ public boolean isOwner(QName relation) {
+ return isOfKind(relation, RelationKindType.OWNER);
+ }
+
+ @Override
+ public boolean isApprover(QName relation) {
+ return isOfKind(relation, RelationKindType.APPROVER);
+ }
+
+ @Override
+ public boolean processRelationOnLogin(QName relation) {
+ return indexedRelationDefinitions.processRelationOnLogin(relation);
+ }
+
+ @Override
+ public boolean processRelationOnRecompute(QName relation) {
+ return indexedRelationDefinitions.processRelationOnRecompute(relation);
+ }
+
+ @Override
+ public boolean includeIntoParentOrgRef(QName relation) {
+ return indexedRelationDefinitions.includeIntoParentOrgRef(relation);
+ }
+
+ @Override
+ public QName getDefaultRelationFor(RelationKindType kind) {
+ return indexedRelationDefinitions.getDefaultRelationFor(kind);
+ }
+
+ @NotNull
+ @Override
+ public Collection getAllRelationsFor(RelationKindType kind) {
+ return indexedRelationDefinitions.getAllRelationsFor(kind);
+ }
+
+ @Override
+ public QName getDefaultRelation() {
+ return getDefaultRelationFor(RelationKindType.MEMBERSHIP);
+ }
+
+ @NotNull
+ @Override
+ public QName normalizeRelation(QName relation) {
+ return indexedRelationDefinitions.normalizeRelation(relation);
+ }
+
+ @Override
+ public boolean isDefault(QName relation) {
+ return prismContext.isDefaultRelation(relation);
+ }
+
+ @Override
+ @NotNull
+ public Collection getAliases(QName relation) {
+ return indexedRelationDefinitions.getAliases(relation);
+ }
+
+ //endregion
+}
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/FocusTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/FocusTypeUtil.java
index ff53b82bdb3..502057f68cb 100644
--- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/FocusTypeUtil.java
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/FocusTypeUtil.java
@@ -20,6 +20,7 @@
import javax.xml.namespace.QName;
+import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentSelectorType;
@@ -106,12 +107,13 @@ public static String dumpInducementConstraints(AssignmentType assignmentType) {
return sb.toString();
}
- public static boolean selectorMatches(AssignmentSelectorType assignmentSelector, AssignmentType assignmentType) {
+ public static boolean selectorMatches(AssignmentSelectorType assignmentSelector, AssignmentType assignmentType,
+ PrismContext prismContext) {
if (assignmentType.getTargetRef() == null) {
return false;
}
for (ObjectReferenceType selectorTargetRef: assignmentSelector.getTargetRef()) {
- if (MiscSchemaUtil.referenceMatches(selectorTargetRef, assignmentType.getTargetRef())) {
+ if (MiscSchemaUtil.referenceMatches(selectorTargetRef, assignmentType.getTargetRef(), prismContext)) {
return true;
}
}
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java
index 18a6835c4b8..c2ff7c0fa3e 100644
--- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java
@@ -305,10 +305,6 @@ public static AssignmentPolicyEnforcementType getAssignmentPolicyEnforcementType
return assignmentPolicyEnforcement;
}
- public static boolean compareRelation(QName query, QName refRelation) {
- return ObjectTypeUtil.relationMatches(query, refRelation);
- }
-
public static PrismReferenceValue objectReferenceTypeToReferenceValue(ObjectReferenceType refType) {
if (refType == null) {
return null;
@@ -397,14 +393,15 @@ public static void serializeFaultMessage(Detail detail, FaultMessage faultMessag
}
}
- public static boolean referenceMatches(ObjectReferenceType refPattern, ObjectReferenceType ref) {
+ public static boolean referenceMatches(ObjectReferenceType refPattern, ObjectReferenceType ref,
+ PrismContext prismContext) {
if (refPattern.getOid() != null && !refPattern.getOid().equals(ref.getOid())) {
return false;
}
if (refPattern.getType() != null && !QNameUtil.match(refPattern.getType(), ref.getType())) {
return false;
}
- if (!ObjectTypeUtil.relationMatches(refPattern.getRelation(), ref.getRelation())) {
+ if (!prismContext.relationMatches(refPattern.getRelation(), ref.getRelation())) {
return false;
}
return true;
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java
index 34c405bb98d..c04b69ee70b 100644
--- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java
@@ -27,6 +27,8 @@
import com.evolveum.midpoint.prism.query.Visitor;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit;
+import com.evolveum.midpoint.schema.RelationRegistry;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.Validate;
import org.apache.commons.lang.mutable.MutableBoolean;
@@ -38,13 +40,11 @@
import com.evolveum.midpoint.schema.ResourceShadowDiscriminator;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import com.evolveum.prism.xml.ns._public.query_3.QueryType;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;
import org.jetbrains.annotations.NotNull;
+import static java.util.Collections.singleton;
import static java.util.Collections.singletonList;
import static org.apache.commons.collections4.CollectionUtils.isEmpty;
@@ -544,6 +544,23 @@ public static FilterComponents factorOutOrFilter(ObjectFilter filter, ItemPath..
return components;
}
+ // Creates references for querying
+ public static List createReferences(String oid, RelationKindType kind,
+ RelationRegistry relationRegistry) {
+ return createReferences(singleton(oid), kind, relationRegistry);
+ }
+
+ public static List createReferences(Collection oids, RelationKindType kind,
+ RelationRegistry relationRegistry) {
+ List rv = new ArrayList<>();
+ for (QName relation : relationRegistry.getAllRelationsFor(kind)) {
+ for (String oid : oids) {
+ rv.add(new ObjectReferenceType().oid(oid).relation(relation).asReferenceValue());
+ }
+ }
+ return rv;
+ }
+
/**
* Describes how to treat a filter when factoring out a query/filter.
*/
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java
index ada0fb9438a..273a295610c 100644
--- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java
@@ -23,14 +23,19 @@
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.query.ObjectFilter;
+import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.RefFilter;
+import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.util.ItemPathUtil;
+import com.evolveum.midpoint.schema.RelationRegistry;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.util.LocalizableMessage;
import com.evolveum.midpoint.util.LocalizableMessageBuilder;
import com.evolveum.midpoint.util.QNameUtil;
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.*;
import com.evolveum.prism.xml.ns._public.types_3.ItemDeltaType;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
@@ -60,6 +65,8 @@
*/
public class ObjectTypeUtil {
+ private static final Trace LOGGER = TraceManager.getTrace(ObjectTypeUtil.class);
+
/**
* Never returns null. Returns empty collection instead.
*/
@@ -237,8 +244,9 @@ public static AssignmentType createAssignmentTo(@NotNull
}
@NotNull
- public static AssignmentType createAssignmentTo(@NotNull PrismObject object) {
- return createAssignmentTo(object, SchemaConstants.ORG_DEFAULT);
+ public static AssignmentType createAssignmentTo(@NotNull PrismObject object,
+ PrismContext prismContext) {
+ return createAssignmentTo(object, prismContext.getDefaultRelation());
}
@NotNull
@@ -255,10 +263,11 @@ public static AssignmentType createAssignmentTo(@NotNull
}
@NotNull
- public static AssignmentType createAssignmentWithConstruction(@NotNull PrismObject object, ShadowKindType kind, String intent) {
- AssignmentType assignment = new AssignmentType(object.getPrismContext());
- ConstructionType construction = new ConstructionType(object.getPrismContext());
- construction.setResourceRef(createObjectRef(object));
+ public static AssignmentType createAssignmentWithConstruction(@NotNull PrismObject object, ShadowKindType kind,
+ String intent, PrismContext prismContext) {
+ AssignmentType assignment = new AssignmentType(prismContext);
+ ConstructionType construction = new ConstructionType(prismContext);
+ construction.setResourceRef(createObjectRef(object, prismContext));
construction.setKind(kind);
construction.setIntent(intent);
assignment.setConstruction(construction);
@@ -276,15 +285,18 @@ public static ObjectReferenceType createObjectRef(PrismReferenceValue prv) {
return ort;
}
- public static ObjectReferenceType createObjectRefWithFullObject(ObjectType objectType) {
+ public static ObjectReferenceType createObjectRefWithFullObject(ObjectType objectType, PrismContext prismContext) {
if (objectType == null) {
return null;
}
- return createObjectRefWithFullObject(objectType.asPrismObject());
+ return createObjectRefWithFullObject(objectType.asPrismObject(), prismContext);
}
- public static ObjectReferenceType createObjectRef(ObjectType objectType) {
- return createObjectRef(objectType, SchemaConstants.ORG_DEFAULT);
+ public static ObjectReferenceType createObjectRef(ObjectType object, PrismContext prismContext) {
+ if (object == null) {
+ return null;
+ }
+ return createObjectRef(object, prismContext.getDefaultRelation());
}
public static ObjectReferenceType createObjectRef(ObjectType objectType, QName relation) {
@@ -294,8 +306,11 @@ public static ObjectReferenceType createObjectRef(ObjectType objectType, QName r
return createObjectRef(objectType.asPrismObject(), relation);
}
- public static ObjectReferenceType createObjectRef(PrismObject object) {
- return createObjectRef(object, SchemaConstants.ORG_DEFAULT);
+ public static ObjectReferenceType createObjectRef(PrismObject object, PrismContext prismContext) {
+ if (object == null) {
+ return null;
+ }
+ return createObjectRef(object, prismContext.getDefaultRelation());
}
public static ObjectReferenceType createObjectRef(PrismObject object, QName relation) {
@@ -313,11 +328,12 @@ public static ObjectReferenceType createObjectRef(PrismOb
return ref;
}
- public static ObjectReferenceType createObjectRefWithFullObject(PrismObject object) {
+ public static ObjectReferenceType createObjectRefWithFullObject(PrismObject object,
+ PrismContext prismContext) {
if (object == null) {
return null;
}
- ObjectReferenceType ref = createObjectRef(object);
+ ObjectReferenceType ref = createObjectRef(object, prismContext);
ref.asReferenceValue().setObject(object);
return ref;
}
@@ -629,83 +645,48 @@ public static T getExtensionItemRealValue(@Nullable ExtensionType extension,
return item != null ? (T) item.getRealValue() : null;
}
- @NotNull
- public static QName normalizeRelation(QName name) {
- if (name == null) {
- return SchemaConstants.ORG_DEFAULT;
- } else {
- return QNameUtil.setNamespaceIfMissing(name, SchemaConstants.NS_ORG, SchemaConstants.PREFIX_NS_ORG);
- }
- }
-
- public static void normalizeRelation(ObjectReferenceType reference) {
+ public static void normalizeRelation(ObjectReferenceType reference, RelationRegistry relationRegistry) {
if (reference != null) {
- reference.setRelation(normalizeRelation(reference.getRelation()));
+ reference.setRelation(relationRegistry.normalizeRelation(reference.getRelation()));
}
}
- public static void normalizeRelation(PrismReferenceValue reference) {
+ public static void normalizeRelation(PrismReferenceValue reference, RelationRegistry relationRegistry) {
if (reference != null) {
- reference.setRelation(normalizeRelation(reference.getRelation()));
+ reference.setRelation(relationRegistry.normalizeRelation(reference.getRelation()));
}
}
- public static void normalizeAllRelations(PrismValue value) {
+ public static void normalizeAllRelations(PrismValue value, RelationRegistry relationRegistry) {
if (value != null) {
- value.accept(createNormalizingVisitor());
+ value.accept(createNormalizingVisitor(relationRegistry));
}
}
- public static void normalizeAllRelations(Item,?> item) {
+ public static void normalizeAllRelations(Item, ?> item, RelationRegistry relationRegistry) {
if (item != null) {
- item.accept(createNormalizingVisitor());
+ item.accept(createNormalizingVisitor(relationRegistry));
}
}
- private static Visitor createNormalizingVisitor() {
+ private static Visitor createNormalizingVisitor(RelationRegistry relationRegistry) {
return v -> {
if (v instanceof PrismReferenceValue) {
- normalizeRelation((PrismReferenceValue) v);
+ normalizeRelation((PrismReferenceValue) v, relationRegistry);
}
};
}
- public static void normalizeFilter(ObjectFilter filter) {
+ public static void normalizeFilter(ObjectFilter filter, RelationRegistry relationRegistry) {
if (filter != null) {
filter.accept(f -> {
if (f instanceof RefFilter) {
- emptyIfNull(((RefFilter) f).getValues()).forEach(v -> normalizeRelation(v));
+ emptyIfNull(((RefFilter) f).getValues()).forEach(v -> normalizeRelation(v, relationRegistry));
}
});
}
}
- // This is not the right place for this. But let's leave it here for now.
- // See MID-3581
- public static boolean isDelegationRelation(QName relation) {
- return QNameUtil.match(relation, SchemaConstants.ORG_DEPUTY);
- }
-
- // This is not the right place for this. But let's leave it here for now.
- // See MID-3581
- public static boolean isMembershipRelation(QName relation) {
- return isDefaultRelation(relation)
- || isManagerRelation(relation)
- || QNameUtil.match(relation, SchemaConstants.ORG_META);
- }
-
- // This is not the right place for this. But let's leave it here for now.
- // See MID-3581
- public static boolean isManagerRelation(QName relation) {
- return QNameUtil.match(relation, SchemaConstants.ORG_MANAGER);
- }
-
- // This is not the right place for this. But let's leave it here for now.
- // See MID-3581
- public static boolean isDefaultRelation(QName relation) {
- return relation == null || QNameUtil.match(relation, SchemaConstants.ORG_DEFAULT);
- }
-
public static RelationDefinitionType findRelationDefinition(List relationDefinitions, QName qname) {
for (RelationDefinitionType relation: relationDefinitions) {
if (QNameUtil.match(qname, relation.getRef())) {
@@ -715,33 +696,8 @@ public static RelationDefinitionType findRelationDefinition(List relationQuery, QName relation) {
- return relationQuery.stream().anyMatch(rq -> relationMatches(rq, relation));
- }
-
- public static boolean relationsEquivalent(QName relation1, QName relation2) {
- if (ObjectTypeUtil.isDefaultRelation(relation1)) {
- return ObjectTypeUtil.isDefaultRelation(relation2);
- } else {
- return QNameUtil.match(relation1, relation2);
- }
- }
-
- public static boolean referenceMatches(ObjectReferenceType ref, String targetOid, QName targetType, QName relation) {
+ public static boolean referenceMatches(ObjectReferenceType ref, String targetOid, QName targetType, QName relation,
+ PrismContext prismContext) {
if (ref == null) {
return false;
}
@@ -756,7 +712,7 @@ public static boolean referenceMatches(ObjectReferenceType ref, String targetOid
}
}
if (relation != null) {
- if (!relationMatches(relation, ref.getRelation())) {
+ if (!prismContext.relationMatches(relation, ref.getRelation())) {
return false;
}
}
@@ -838,15 +794,6 @@ public static LocalizableMessage createTypeDisplayInformation(String objectClass
.build();
}
- @Nullable
- public static String getRelationNameLocalizationKey(@Nullable QName relation, boolean defaultAsNull) {
- if (relation == null || defaultAsNull && QNameUtil.match(relation, SchemaConstants.ORG_DEFAULT)) {
- return null;
- } else {
- return SchemaConstants.RELATION_NAME_KEY_PREFIX + relation.getLocalPart();
- }
- }
-
@NotNull
@Deprecated
public static Collection getSubtypeValues(@NotNull PrismObject object) {
@@ -903,4 +850,24 @@ private static void addRealValue(Item extensionItem,
extensionItem.add(PrismValue.fromRealValue(value).clone());
}
}
+
+ @NotNull
+ public static ObjectQuery createManagerQuery(Class extends ObjectType> objectTypeClass, String orgOid,
+ RelationRegistry relationRegistry, PrismContext prismContext) {
+ Collection managerRelations = relationRegistry.getAllRelationsFor(RelationKindType.MANAGER);
+ if (managerRelations.isEmpty()) {
+ LOGGER.warn("No manager relation is defined");
+ return QueryBuilder.queryFor(objectTypeClass, prismContext).none().build();
+ }
+
+ List referencesToFind = new ArrayList<>();
+ for (QName managerRelation : managerRelations) {
+ PrismReferenceValue parentOrgRefVal = new PrismReferenceValue(orgOid, OrgType.COMPLEX_TYPE);
+ parentOrgRefVal.setRelation(managerRelation);
+ referencesToFind.add(parentOrgRefVal);
+ }
+ return QueryBuilder.queryFor(objectTypeClass, prismContext)
+ .item(ObjectType.F_PARENT_ORG_REF).ref(referencesToFind)
+ .build();
+ }
}
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 a854df26278..49f58266f8f 100755
--- 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
@@ -16264,19 +16264,172 @@
+
+
+