From 035f531fa7321943e8b3371b04d71eaddb49e3a7 Mon Sep 17 00:00:00 2001
From: Katarina Valalikova
Date: Thu, 4 Jun 2020 16:14:47 +0200
Subject: [PATCH 01/12] diagnostics logging
---
.../wrapper/ShadowWrapperFactoryImpl.java | 7 +++++++
.../gui/impl/prism/panel/ShadowPanel.java | 13 +++++++++++-
.../FocusProjectionsTabPanel.java | 21 -------------------
.../web/page/admin/PageAdminFocus.java | 21 +++++++++++++++++++
4 files changed, 40 insertions(+), 22 deletions(-)
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ShadowWrapperFactoryImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ShadowWrapperFactoryImpl.java
index 332ed02748d..c09acb80310 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ShadowWrapperFactoryImpl.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ShadowWrapperFactoryImpl.java
@@ -6,6 +6,10 @@
*/
package com.evolveum.midpoint.gui.impl.factory.wrapper;
+import com.evolveum.midpoint.util.logging.Trace;
+
+import com.evolveum.midpoint.util.logging.TraceManager;
+
import org.springframework.stereotype.Component;
import com.evolveum.midpoint.gui.api.prism.ItemStatus;
@@ -23,8 +27,11 @@
@Component
public class ShadowWrapperFactoryImpl extends PrismObjectWrapperFactoryImpl {
+ private static final transient Trace LOGGER = TraceManager.getTrace(ShadowWrapperFactoryImpl.class);
+
@Override
public PrismObjectWrapper createObjectWrapper(PrismObject object, ItemStatus status) {
+ LOGGER.info("create shadow wrapper");
return new ShadowWrapperImpl(object, status);
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ShadowPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ShadowPanel.java
index 75c08c2513d..93dd0b7d42a 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ShadowPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ShadowPanel.java
@@ -59,33 +59,44 @@ private void initLayout() {
try {
+ long attributesStart = System.currentTimeMillis();
ItemPanelSettingsBuilder attributesSettingsBuilder = new ItemPanelSettingsBuilder()
.visibilityHandler(itemWrapper -> checkShadowContainerVisibility(itemWrapper, getModel()));
Panel attributesPanel = getPageBase().initItemPanel(ID_ATTRIBUTES, ShadowAttributesType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getModel(), ShadowType.F_ATTRIBUTES),
attributesSettingsBuilder.build());
add(attributesPanel);
+ long attributesEnd = System.currentTimeMillis();
+ LOGGER.info("Attributes finished in {} ms", attributesEnd - attributesStart);
+ long associationStart = System.currentTimeMillis();
ItemPanelSettingsBuilder associationBuilder = new ItemPanelSettingsBuilder()
.visibilityHandler(itemWrapper -> checkShadowContainerVisibility(itemWrapper, getModel()));
Panel associationsPanel = getPageBase().initItemPanel(ID_ASSOCIATIONS, ShadowAssociationType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getModel(), ShadowType.F_ASSOCIATION),
associationBuilder.build());
associationsPanel.add(new VisibleBehaviour(() -> checkAssociationsVisibility()));
add(associationsPanel);
+ long associationEnd = System.currentTimeMillis();
+ LOGGER.info("Association finished in {} ms", associationEnd - associationStart);
-
+ long activationStart = System.currentTimeMillis();
ItemPanelSettingsBuilder activationBuilder = new ItemPanelSettingsBuilder()
.visibilityHandler(itemWrapper -> checkShadowContainerVisibility(itemWrapper, getModel()));
Panel activationPanel = getPageBase().initItemPanel(ID_ACTIVATION, ActivationType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getModel(), ShadowType.F_ACTIVATION),
activationBuilder.build());
activationPanel.add(new VisibleBehaviour(() -> isActivationSupported()));
add(activationPanel);
+ long activationEnd = System.currentTimeMillis();
+ LOGGER.info("Activation finished in {} ms", activationEnd - activationStart);
+ long passwordStart = System.currentTimeMillis();
ItemPanelSettingsBuilder passwordSettingsBuilder = new ItemPanelSettingsBuilder()
.visibilityHandler(itemWrapper -> checkShadowContainerVisibility(itemWrapper, getModel()));
Panel passwordPanel = getPageBase().initItemPanel(ID_PASSWORD, PasswordType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getModel(), ItemPath.create(ShadowType.F_CREDENTIALS, CredentialsType.F_PASSWORD)),
passwordSettingsBuilder.build());
passwordPanel.add(new VisibleBehaviour(() -> isCredentialsSupported()));
add(passwordPanel);
+ long passwordEnd = System.currentTimeMillis();
+ LOGGER.info("Password finished in {} ms", passwordEnd - passwordStart);
} catch (SchemaException e) {
getSession().error("Cannot create panels for shadow, reason: " + e.getMessage());
LOGGER.error("Cannot create panels for shadow, reason: {}", e.getMessage(), e);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusProjectionsTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusProjectionsTabPanel.java
index f9a654282a8..e36665c2fe7 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusProjectionsTabPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusProjectionsTabPanel.java
@@ -475,27 +475,6 @@ private void addSelectedAccountPerformed(AjaxRequestTarget target, List> createEmptyShadowWrapperModel() {
- ShadowType shadow = new ShadowType();
- ShadowWrapper wrapper = null;
- Task task = getPageBase().createSimpleTask("create empty shadow wrapper");
- try {
- getPageBase().getPrismContext().adopt(shadow);
- wrapper = ((PageAdminFocus) getPage()).loadShadowWrapper(shadow.asPrismContainer(), task, task.getResult());
- } catch (SchemaException e) {
- getPageBase().showResult(task.getResult(), "pageAdminFocus.message.couldntCreateShadowWrapper");
- LOGGER.error("Couldn't create shadow wrapper", e);
- }
- final ShadowWrapper ret = wrapper;
- return new IModel>() {
-
- @Override
- public PrismContainerWrapper getObject() {
- return ret;
- }
- };
- }
-
private List createShadowMenu() {
List items = new ArrayList<>();
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 eba74e97bc5..8dbb37f3a08 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
@@ -136,6 +136,8 @@ public void continueEditing(AjaxRequestTarget target) {
}
private List loadShadowWrappers(boolean noFetch) {
+ LOGGER.info("Loading shadow wrapper");
+ long start = System.currentTimeMillis();
List list = new ArrayList<>();
PrismObjectWrapper focusWrapper = getObjectModel().getObject();
@@ -152,17 +154,22 @@ private List loadShadowWrappers(boolean noFetch) {
LOGGER.trace("Skiping reference for shadow with null oid");
continue; // default value
}
+ long shadowTimestampBefore = System.currentTimeMillis();
OperationResult subResult = task.getResult().createMinorSubresult(OPERATION_LOAD_SHADOW);
PrismObject projection = getPrismObjectForWrapper(ShadowType.class, reference.getOid(),
noFetch, task, subResult, createLoadOptionForShadowWrapper());
+ long shadowTimestampAfter = System.currentTimeMillis();
+ LOGGER.info("Got shadow: {} in {}", projection, shadowTimestampAfter - shadowTimestampBefore);
if(projection == null) {
// showResult(subResult, "pageAdminFocus.message.couldntLoadShadowProjection");
LOGGER.error("Couldn't load shadow projection");
continue;
}
+ long timestampWrapperStart = System.currentTimeMillis();
try {
+
ShadowWrapper wrapper = loadShadowWrapper(projection, task, subResult);
wrapper.setLoadWithNoFetch(noFetch);
@@ -178,7 +185,11 @@ private List loadShadowWrappers(boolean noFetch) {
showResult(subResult, "pageAdminFocus.message.couldntCreateShadowWrapper");
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't create shadow wrapper", e);
}
+ long timestampWrapperEnd = System.currentTimeMillis();
+ LOGGER.info("Load wrapper in {}", timestampWrapperEnd - timestampWrapperStart);
}
+ long end = System.currentTimeMillis();
+ LOGGER.info("Load projctions in {}", end - start);
return list;
}
@@ -198,6 +209,8 @@ public ShadowWrapper loadShadowWrapper(PrismObject projection, Task
}
public void loadFullShadow(PrismObjectValueWrapper shadowWrapperValue, AjaxRequestTarget target) {
+ LOGGER.info("Loading full shadow");
+ long start = System.currentTimeMillis();
if(shadowWrapperValue.getRealValue() == null) {
error(getString("pageAdminFocus.message.couldntCreateShadowWrapper"));
LOGGER.error("Couldn't create shadow wrapper, because RealValue is null in " + shadowWrapperValue);
@@ -206,9 +219,12 @@ public void loadFullShadow(PrismObjectValueWrapper shadowWrapperValu
String oid = shadowWrapperValue.getRealValue().getOid();
Task task = createSimpleTask(OPERATION_LOAD_SHADOW);
OperationResult result = task.getResult();
+ long loadStart = System.currentTimeMillis();
PrismObject projection = getPrismObjectForWrapper(ShadowType.class, oid, false, task,
result, createLoadOptionForShadowWrapper());
+ long loadEnd = System.currentTimeMillis();
+ LOGGER.info("Load projection in {} ms", loadEnd - loadStart);
if (projection == null) {
result.recordFatalError(getString("PageAdminFocus.message.loadFullShadow.fatalError", shadowWrapperValue.getRealValue()));
showResult(result);
@@ -216,6 +232,7 @@ public void loadFullShadow(PrismObjectValueWrapper shadowWrapperValu
return;
}
+ long wrapperStart = System.currentTimeMillis();
ShadowWrapper shadowWrapperNew;
try {
shadowWrapperNew = loadShadowWrapper(projection, task, result);
@@ -233,6 +250,10 @@ public void loadFullShadow(PrismObjectValueWrapper shadowWrapperValu
error(getString("pageAdminFocus.message.couldntCreateShadowWrapper"));
LOGGER.error("Couldn't create shadow wrapper", e);
}
+ long wrapperEnd = System.currentTimeMillis();
+ LOGGER.info("Wrapper loaded in {} ms", wrapperEnd - wrapperStart);
+ long end = System.currentTimeMillis();
+ LOGGER.info("Got full shadow in {} ms", end - start);
}
// @Override
From 9a788649c2016a6b6661c0addfa745d9adfdacaa Mon Sep 17 00:00:00 2001
From: Katarina Valalikova
Date: Fri, 5 Jun 2020 12:29:50 +0200
Subject: [PATCH 02/12] removing setSortChoices settings from PageTraceView
---
.../web/page/admin/configuration/PageTraceView.java | 8 --------
1 file changed, 8 deletions(-)
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageTraceView.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageTraceView.java
index 8b50d28bddd..4341dcd26ec 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageTraceView.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageTraceView.java
@@ -116,7 +116,6 @@ private void initLayout() {
GenericTraceVisualizationType.class, ID_CLOCKWORK_EXECUTION, createClockworkLevels(),
new PropertyModel<>(model, TraceViewDto.F_CLOCKWORK_EXECUTION),
this, false);
- clockworkExecutionChoice.setSortChoices(false);
clockworkExecutionChoice.setOutputMarkupId(true);
mainForm.add(clockworkExecutionChoice);
@@ -124,7 +123,6 @@ GenericTraceVisualizationType.class, ID_CLOCKWORK_EXECUTION, createClockworkLeve
GenericTraceVisualizationType.class, ID_CLOCKWORK_CLICK, createClockworkLevels(),
new PropertyModel<>(model, TraceViewDto.F_CLOCKWORK_CLICK),
this, false);
- clockworkClickChoice.setSortChoices(false);
clockworkClickChoice.setOutputMarkupId(true);
mainForm.add(clockworkClickChoice);
@@ -132,7 +130,6 @@ GenericTraceVisualizationType.class, ID_CLOCKWORK_CLICK, createClockworkLevels()
GenericTraceVisualizationType.class, ID_MAPPING_EVALUATION, createMappingLevels(),
new PropertyModel<>(model, TraceViewDto.F_MAPPING_EVALUATION),
this, false);
- mappingEvaluationChoice.setSortChoices(false);
mappingEvaluationChoice.setOutputMarkupId(true);
mainForm.add(mappingEvaluationChoice);
@@ -140,7 +137,6 @@ GenericTraceVisualizationType.class, ID_MAPPING_EVALUATION, createMappingLevels(
GenericTraceVisualizationType.class, ID_FOCUS_LOAD, createStandardLevels(),
new PropertyModel<>(model, TraceViewDto.F_FOCUS_LOAD),
this, false);
- focusLoadChoice.setSortChoices(false);
focusLoadChoice.setOutputMarkupId(true);
mainForm.add(focusLoadChoice);
@@ -148,7 +144,6 @@ GenericTraceVisualizationType.class, ID_FOCUS_LOAD, createStandardLevels(),
GenericTraceVisualizationType.class, ID_PROJECTION_LOAD, createStandardLevels(),
new PropertyModel<>(model, TraceViewDto.F_PROJECTION_LOAD),
this, false);
- projectionLoadChoice.setSortChoices(false);
projectionLoadChoice.setOutputMarkupId(true);
mainForm.add(projectionLoadChoice);
@@ -156,7 +151,6 @@ GenericTraceVisualizationType.class, ID_PROJECTION_LOAD, createStandardLevels(),
GenericTraceVisualizationType.class, ID_FOCUS_CHANGE, createStandardLevels(),
new PropertyModel<>(model, TraceViewDto.F_FOCUS_CHANGE),
this, false);
- focusChangeChoice.setSortChoices(false);
focusChangeChoice.setOutputMarkupId(true);
mainForm.add(focusChangeChoice);
@@ -164,7 +158,6 @@ GenericTraceVisualizationType.class, ID_FOCUS_CHANGE, createStandardLevels(),
GenericTraceVisualizationType.class, ID_PROJECTION_CHANGE, createStandardLevels(),
new PropertyModel<>(model, TraceViewDto.F_PROJECTION_CHANGE),
this, false);
- projectionChangeChoice.setSortChoices(false);
projectionChangeChoice.setOutputMarkupId(true);
mainForm.add(projectionChangeChoice);
@@ -172,7 +165,6 @@ GenericTraceVisualizationType.class, ID_PROJECTION_CHANGE, createStandardLevels(
GenericTraceVisualizationType.class, ID_OTHERS, createOthersLevels(),
new PropertyModel<>(model, TraceViewDto.F_OTHERS),
this, false);
- otherChoice.setSortChoices(false);
otherChoice.setOutputMarkupId(true);
mainForm.add(otherChoice);
From 13bdd395c71b0f64ea82591731212b7357fc3a8c Mon Sep 17 00:00:00 2001
From: Katarina Valalikova
Date: Fri, 5 Jun 2020 12:30:23 +0200
Subject: [PATCH 03/12] remove model sorting for DropDownChoicePanel
---
.../component/input/DropDownChoicePanel.java | 20 -------------------
1 file changed, 20 deletions(-)
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DropDownChoicePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DropDownChoicePanel.java
index 972458b5ed0..3afc9f23eba 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DropDownChoicePanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DropDownChoicePanel.java
@@ -29,8 +29,6 @@ public class DropDownChoicePanel extends InputPanel {
private static final long serialVersionUID = 1L;
private static final String ID_INPUT = "input";
- private boolean sortChoices = true;
-
public DropDownChoicePanel(String id, IModel model, IModel extends List extends T>> choices) {
this(id, model, choices, false);
}
@@ -66,16 +64,6 @@ protected String getNullValidDisplayValue() {
return DropDownChoicePanel.this.getNullValidDisplayValue();
}
- @Override
- public IModel extends List extends T>> getChoicesModel() {
- IModel extends List extends T>> choices = super.getChoicesModel();
- if (sortChoices) {
- return Model.ofList(WebComponentUtil.sortDropDownChoices(choices, renderer));
- } else {
- return choices;
- }
- }
-
@Override
public String getModelValue() {
T object = this.getModelObject();
@@ -108,12 +96,4 @@ public IModel getModel() {
protected String getNullValidDisplayValue() {
return getString("DropDownChoicePanel.notDefined");
}
-
- public boolean isSortChoices() {
- return sortChoices;
- }
-
- public void setSortChoices(boolean sortChoices) {
- this.sortChoices = sortChoices;
- }
}
From ff4afe2b5ffde41f5e40a040cec4565fe6345fcc Mon Sep 17 00:00:00 2001
From: Katarina Valalikova
Date: Fri, 5 Jun 2020 12:34:22 +0200
Subject: [PATCH 04/12] moving traces info -> trace level
---
.../wrapper/ShadowWrapperFactoryImpl.java | 7 +++++--
.../gui/impl/prism/panel/ShadowPanel.java | 10 +++++-----
.../midpoint/web/page/admin/PageAdminFocus.java | 16 ++++++++--------
3 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ShadowWrapperFactoryImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ShadowWrapperFactoryImpl.java
index c09acb80310..bfb6a2e6412 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ShadowWrapperFactoryImpl.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ShadowWrapperFactoryImpl.java
@@ -6,6 +6,7 @@
*/
package com.evolveum.midpoint.gui.impl.factory.wrapper;
+import com.evolveum.midpoint.gui.api.prism.wrapper.ShadowWrapper;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
@@ -31,8 +32,10 @@ public class ShadowWrapperFactoryImpl extends PrismObjectWrapperFactoryImpl createObjectWrapper(PrismObject object, ItemStatus status) {
- LOGGER.info("create shadow wrapper");
- return new ShadowWrapperImpl(object, status);
+ LOGGER.trace("create shadow wrapper");
+ ShadowWrapper shadowWrapper = new ShadowWrapperImpl(object, status);
+ LOGGER.trace("Shadow wrapper created: {}", shadowWrapper);
+ return shadowWrapper;
}
@Override
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ShadowPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ShadowPanel.java
index 93dd0b7d42a..6ff9aff84b1 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ShadowPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ShadowPanel.java
@@ -66,7 +66,7 @@ private void initLayout() {
attributesSettingsBuilder.build());
add(attributesPanel);
long attributesEnd = System.currentTimeMillis();
- LOGGER.info("Attributes finished in {} ms", attributesEnd - attributesStart);
+ LOGGER.trace("Attributes finished in {} ms", attributesEnd - attributesStart);
long associationStart = System.currentTimeMillis();
ItemPanelSettingsBuilder associationBuilder = new ItemPanelSettingsBuilder()
@@ -76,7 +76,7 @@ private void initLayout() {
associationsPanel.add(new VisibleBehaviour(() -> checkAssociationsVisibility()));
add(associationsPanel);
long associationEnd = System.currentTimeMillis();
- LOGGER.info("Association finished in {} ms", associationEnd - associationStart);
+ LOGGER.trace("Association finished in {} ms", associationEnd - associationStart);
long activationStart = System.currentTimeMillis();
ItemPanelSettingsBuilder activationBuilder = new ItemPanelSettingsBuilder()
@@ -86,7 +86,7 @@ private void initLayout() {
activationPanel.add(new VisibleBehaviour(() -> isActivationSupported()));
add(activationPanel);
long activationEnd = System.currentTimeMillis();
- LOGGER.info("Activation finished in {} ms", activationEnd - activationStart);
+ LOGGER.trace("Activation finished in {} ms", activationEnd - activationStart);
long passwordStart = System.currentTimeMillis();
ItemPanelSettingsBuilder passwordSettingsBuilder = new ItemPanelSettingsBuilder()
@@ -96,10 +96,10 @@ private void initLayout() {
passwordPanel.add(new VisibleBehaviour(() -> isCredentialsSupported()));
add(passwordPanel);
long passwordEnd = System.currentTimeMillis();
- LOGGER.info("Password finished in {} ms", passwordEnd - passwordStart);
+ LOGGER.trace("Password finished in {} ms", passwordEnd - passwordStart);
} catch (SchemaException e) {
getSession().error("Cannot create panels for shadow, reason: " + e.getMessage());
- LOGGER.error("Cannot create panels for shadow, reason: {}", e.getMessage(), e);
+ LOGGER.trace("Cannot create panels for shadow, reason: {}", e.getMessage(), e);
}
}
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 8dbb37f3a08..892a0c2b455 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
@@ -136,7 +136,7 @@ public void continueEditing(AjaxRequestTarget target) {
}
private List loadShadowWrappers(boolean noFetch) {
- LOGGER.info("Loading shadow wrapper");
+ LOGGER.trace("Loading shadow wrapper");
long start = System.currentTimeMillis();
List list = new ArrayList<>();
@@ -160,7 +160,7 @@ private List loadShadowWrappers(boolean noFetch) {
noFetch, task, subResult, createLoadOptionForShadowWrapper());
long shadowTimestampAfter = System.currentTimeMillis();
- LOGGER.info("Got shadow: {} in {}", projection, shadowTimestampAfter - shadowTimestampBefore);
+ LOGGER.trace("Got shadow: {} in {}", projection, shadowTimestampAfter - shadowTimestampBefore);
if(projection == null) {
// showResult(subResult, "pageAdminFocus.message.couldntLoadShadowProjection");
LOGGER.error("Couldn't load shadow projection");
@@ -186,10 +186,10 @@ private List loadShadowWrappers(boolean noFetch) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't create shadow wrapper", e);
}
long timestampWrapperEnd = System.currentTimeMillis();
- LOGGER.info("Load wrapper in {}", timestampWrapperEnd - timestampWrapperStart);
+ LOGGER.trace("Load wrapper in {}", timestampWrapperEnd - timestampWrapperStart);
}
long end = System.currentTimeMillis();
- LOGGER.info("Load projctions in {}", end - start);
+ LOGGER.trace("Load projctions in {}", end - start);
return list;
}
@@ -209,7 +209,7 @@ public ShadowWrapper loadShadowWrapper(PrismObject projection, Task
}
public void loadFullShadow(PrismObjectValueWrapper shadowWrapperValue, AjaxRequestTarget target) {
- LOGGER.info("Loading full shadow");
+ LOGGER.trace("Loading full shadow");
long start = System.currentTimeMillis();
if(shadowWrapperValue.getRealValue() == null) {
error(getString("pageAdminFocus.message.couldntCreateShadowWrapper"));
@@ -224,7 +224,7 @@ public void loadFullShadow(PrismObjectValueWrapper shadowWrapperValu
result, createLoadOptionForShadowWrapper());
long loadEnd = System.currentTimeMillis();
- LOGGER.info("Load projection in {} ms", loadEnd - loadStart);
+ LOGGER.trace("Load projection in {} ms", loadEnd - loadStart);
if (projection == null) {
result.recordFatalError(getString("PageAdminFocus.message.loadFullShadow.fatalError", shadowWrapperValue.getRealValue()));
showResult(result);
@@ -251,9 +251,9 @@ public void loadFullShadow(PrismObjectValueWrapper shadowWrapperValu
LOGGER.error("Couldn't create shadow wrapper", e);
}
long wrapperEnd = System.currentTimeMillis();
- LOGGER.info("Wrapper loaded in {} ms", wrapperEnd - wrapperStart);
+ LOGGER.trace("Wrapper loaded in {} ms", wrapperEnd - wrapperStart);
long end = System.currentTimeMillis();
- LOGGER.info("Got full shadow in {} ms", end - start);
+ LOGGER.trace("Got full shadow in {} ms", end - start);
}
// @Override
From 2033b81b8d2121cb4ca81fa3b547ae31e27d57f3 Mon Sep 17 00:00:00 2001
From: Katarina Valalikova
Date: Mon, 8 Jun 2020 17:46:11 +0200
Subject: [PATCH 05/12] adding possibility to define object selector for
autoassignments (MID-5497, MID-5734)
---
.../xml/ns/public/common/common-core-3.xsd | 13 +-
.../focus/ObjectTemplateProcessor.java | 47 +++---
.../model/intest/rbac/TestAutoassign.java | 149 ++++++++++++++++--
.../rbac/autoassign/role-unit-rider.xml | 48 ++++++
.../rbac/autoassign/role-unit-sleeper.xml | 3 +
.../rbac/autoassign/role-unit-walker.xml | 3 +
.../rbac/autoassign/role-unit-worker.xml | 3 +
7 files changed, 226 insertions(+), 40 deletions(-)
create mode 100644 model/model-intest/src/test/resources/rbac/autoassign/role-unit-rider.xml
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 baec7735e0d..1e6140b320c 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
@@ -13116,7 +13116,7 @@
(abstract) role.
- Use with care. MidPoint will will have to process all the roles that
+ Use with care. MidPoint will have to process all the roles that
have this flag set to true. All the roles will be looked up, autoassign
specification will be processed to see if the focus is matching.
This will happen all the time for all modification operations.
@@ -13181,6 +13181,15 @@
+
+
+
+
+ Restrics autoassignment to concrete focus type.
+
+
+
+
@@ -13621,7 +13630,7 @@
-
+
Selects some objects from all the objects in midPoint.
diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/ObjectTemplateProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/ObjectTemplateProcessor.java
index 316ccc949c6..91bcaa88589 100644
--- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/ObjectTemplateProcessor.java
+++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/ObjectTemplateProcessor.java
@@ -24,6 +24,11 @@
import com.evolveum.midpoint.prism.delta.*;
import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy;
import com.evolveum.midpoint.prism.path.ItemPathCollectionsUtil;
+import com.evolveum.midpoint.schema.ObjectSelector;
+import com.evolveum.midpoint.util.QNameUtil;
+import com.evolveum.midpoint.util.exception.*;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
+
import org.apache.commons.lang.BooleanUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -57,32 +62,8 @@
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.DebugUtil;
-import com.evolveum.midpoint.util.exception.CommunicationException;
-import com.evolveum.midpoint.util.exception.ConfigurationException;
-import com.evolveum.midpoint.util.exception.ExpressionEvaluationException;
-import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
-import com.evolveum.midpoint.util.exception.PolicyViolationException;
-import com.evolveum.midpoint.util.exception.SchemaException;
-import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.AutoassignMappingType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.AutoassignSpecificationType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.FocalAutoassignSpecificationType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingStrengthType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateItemDefinitionType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateMappingEvaluationPhaseType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateMappingType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleManagementConfigurationType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.VariableBindingDefinitionType;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import static com.evolveum.midpoint.model.impl.lens.projector.util.SkipWhenFocusDeleted.PRIMARY;
@@ -459,6 +440,11 @@ private void collectAutoassignMappings(LensCon
if (focalAutoassignSpec == null) {
return true;
}
+
+ if (!isApplicableFor(focalAutoassignSpec.getSelector(), context.getFocusContext(), objectResult)) {
+ return true;
+ }
+
for (AutoassignMappingType autoMapping: focalAutoassignSpec.getMapping()) {
AutoassignMappingType mapping = autoMapping.clone();
setMappingTarget(mapping, new ItemPathType(SchemaConstants.PATH_ASSIGNMENT));
@@ -470,6 +456,19 @@ private void collectAutoassignMappings(LensCon
cacheRepositoryService.searchObjectsIterative(AbstractRoleType.class, query, handler, GetOperationOptions.createReadOnlyCollection(), true, result);
}
+ private boolean isApplicableFor(ObjectSelectorType selector, LensFocusContext focusContext, OperationResult result) {
+ if (selector == null) {
+ return true;
+ }
+ try {
+ return cacheRepositoryService.selectorMatches(selector, focusContext.getObjectAny(), null, LOGGER, "");
+ } catch (SchemaException | SecurityViolationException | ExpressionEvaluationException | CommunicationException | ObjectNotFoundException | ConfigurationException e) {
+ LOGGER.error("Failed to evaluate selector constraints, selector {}, focusContext {}\nReason: {}", selector, focusContext, e.getMessage(), e);
+ result.recordFatalError("Failed to evaluate selector constrains, selector: " + selector + ", focusContext: " + focusContext + "\nReason: " + e.getMessage(), e);
+ throw new SystemException(e);
+ }
+ }
+
private void setMappingTarget(MappingType mapping, ItemPathType path) {
VariableBindingDefinitionType target = mapping.getTarget();
if (target == null) {
diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAutoassign.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAutoassign.java
index 08232a4986f..a772a2bfaae 100644
--- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAutoassign.java
+++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAutoassign.java
@@ -10,6 +10,10 @@
import javax.xml.datatype.XMLGregorianCalendar;
+import com.evolveum.midpoint.prism.path.ItemPath;
+
+import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
+
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ContextConfiguration;
@@ -20,11 +24,6 @@
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.DummyResourceContoller;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleManagementConfigurationType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
/**
* @author semancik
@@ -47,9 +46,14 @@ public class TestAutoassign extends AbstractRbacTest {
protected static final String ROLE_UNIT_WALKER_OID = "a2bc45fc-bfec-11e7-bdfd-af4b3e689502";
protected static final String ROLE_UNIT_WALKER_TITLE = "Walker";
+ protected static final File ROLE_UNIT_RIDER_FILE = new File(AUTOASSIGN_DIR, "role-unit-rider.xml");
+ protected static final String ROLE_UNIT_RIDER_OID = "9a60cdc6-f2ad-4414-964b-5fd1dfaec157";
+ protected static final String ROLE_UNIT_RIDER_TITLE = "Rider";
+
protected static final String UNIT_WORKER = "worker";
protected static final String UNIT_SLEEPER = "sleeper";
protected static final String UNIT_WALKER = "walker";
+ protected static final String UNIT_RIDER = "rider";
private static final XMLGregorianCalendar ROLE_SLEEPER_AUTOASSIGN_VALID_TO =
XmlTypeConverter.createXMLGregorianCalendar(2222, 1, 2, 3, 4, 5);
@@ -62,16 +66,13 @@ public void initSystem(Task initTask, OperationResult initResult)
repoAddObjectFromFile(ROLE_UNIT_WORKER_FILE, RoleType.class, initResult);
repoAddObjectFromFile(ROLE_UNIT_SLEEPER_FILE, RoleType.class, initResult);
repoAddObjectFromFile(ROLE_UNIT_WALKER_FILE, RoleType.class, initResult);
+ repoAddObjectFromFile(ROLE_UNIT_RIDER_FILE, RoleType.class, initResult);
+
+ repoAddObjectFromFile(ARCHETYPE_EMPLOYEE_FILE, ArchetypeType.class, initResult);
- // Temporarily using repository service because of MID-5497
- repositoryService.modifyObject(SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(),
- prismContext.deltaFor(SystemConfigurationType.class)
- .item(SystemConfigurationType.F_ROLE_MANAGEMENT, RoleManagementConfigurationType.F_AUTOASSIGN_ENABLED)
- .replace(true)
- .asItemDeltas(), initResult);
-// modifyObjectReplaceProperty(SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(),
-// ItemPath.create(SystemConfigurationType.F_ROLE_MANAGEMENT, RoleManagementConfigurationType.F_AUTOASSIGN_ENABLED),
-// initTask, initResult, Boolean.TRUE);
+ modifyObjectReplaceProperty(SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(),
+ ItemPath.create(SystemConfigurationType.F_ROLE_MANAGEMENT, RoleManagementConfigurationType.F_AUTOASSIGN_ENABLED),
+ initTask, initResult, Boolean.TRUE);
}
/**
@@ -239,6 +240,126 @@ public void test114ModifyUnitAddSleeper() throws Exception {
ROLE_UNIT_WORKER_TITLE, ROLE_UNIT_WALKER_TITLE, ROLE_UNIT_SLEEPER_TITLE);
}
+ @Test
+ public void test115ModifyUnitAddRider() throws Exception {
+ // GIVEN
+ Task task = getTestTask();
+ OperationResult result = task.getResult();
+
+ // WHEN
+ modifyUserAdd(USER_JACK_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result,
+ createPolyString(UNIT_RIDER));
+
+ // THEN
+ assertSuccess(result);
+
+ assertUserAfter(USER_JACK_OID)
+ .assertOrganizationalUnits(UNIT_WORKER, UNIT_WALKER, UNIT_SLEEPER, UNIT_RIDER)
+ .assignments()
+ .assertAssignments(3)
+ .assertRole(ROLE_UNIT_WORKER_OID)
+ .assertRole(ROLE_UNIT_WALKER_OID)
+ .assertRole(ROLE_UNIT_SLEEPER_OID)
+ .assertNoRole(ROLE_UNIT_RIDER_OID)
+ .end()
+ .links()
+ .single();
+
+ assertDummyAccountByUsername(null, USER_JACK_USERNAME)
+ .assertAttribute(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_TITLE_NAME,
+ ROLE_UNIT_WORKER_TITLE, ROLE_UNIT_WALKER_TITLE, ROLE_UNIT_SLEEPER_TITLE);
+ }
+
+ /**
+ * Prepare user guybrush for autoassignment
+ */
+ @Test
+ public void test200assignArchetypeGuybrush() throws Exception {
+ // GIVEN
+ Task task = getTestTask();
+ OperationResult result = task.getResult();
+
+ //WHEN
+ assignArchetype(USER_GUYBRUSH_OID, ARCHETYPE_EMPLOYEE_OID, task, result);
+
+ //THEN
+ assertUserAfter(USER_GUYBRUSH_OID)
+ .assertArchetypeRef(ARCHETYPE_EMPLOYEE_OID)
+ .assignments()
+ .assertAssignments(1)
+ .assertArchetype(ARCHETYPE_EMPLOYEE_OID)
+ .end();
+
+ }
+
+ @Test
+ public void test201addUnitRiderGuybrush() throws Exception {
+ //GIVEN
+ Task task = getTestTask();
+ OperationResult result = task.getResult();
+
+ //WHEN
+ modifyUserAdd(USER_GUYBRUSH_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result, createPolyString(UNIT_RIDER));
+
+ //THEN
+ assertUserAfter(USER_GUYBRUSH_OID)
+ .assertOrganizationalUnits(UNIT_RIDER)
+ .assertArchetypeRef(ARCHETYPE_EMPLOYEE_OID)
+ .assignments()
+ .assertAssignments(2)
+ .assertArchetype(ARCHETYPE_EMPLOYEE_OID)
+ .assertRole(ROLE_UNIT_RIDER_OID)
+ .end()
+ .links()
+ .single();
+ }
+
+ @Test
+ public void test202addUnitSleeperGuybrush() throws Exception {
+ //GIVEN
+ Task task = getTestTask();
+ OperationResult result = task.getResult();
+
+ //WHEN
+ modifyUserAdd(USER_GUYBRUSH_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result, createPolyString(UNIT_SLEEPER));
+
+ //THEN
+ assertUserAfter(USER_GUYBRUSH_OID)
+ .assertOrganizationalUnits(UNIT_RIDER, UNIT_SLEEPER)
+ .assertArchetypeRef(ARCHETYPE_EMPLOYEE_OID)
+ .assignments()
+ .assertAssignments(3)
+ .assertArchetype(ARCHETYPE_EMPLOYEE_OID)
+ .assertRole(ROLE_UNIT_RIDER_OID)
+ .assertRole(ROLE_UNIT_SLEEPER_OID)
+ .end()
+ .links()
+ .single();
+ }
+
+ @Test
+ public void test203removeUnitRiderGuybrush() throws Exception {
+ //GIVEN
+ Task task = getTestTask();
+ OperationResult result = task.getResult();
+
+ //WHEN
+ modifyUserDelete(USER_GUYBRUSH_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result, createPolyString(UNIT_RIDER));
+
+ //THEN
+ assertUserAfter(USER_GUYBRUSH_OID)
+ .assertArchetypeRef(ARCHETYPE_EMPLOYEE_OID)
+ .assignments()
+ .assertAssignments(2)
+ .assertArchetype(ARCHETYPE_EMPLOYEE_OID)
+ .assertNoRole(ROLE_UNIT_RIDER_OID)
+ .assertRole(ROLE_UNIT_SLEEPER_OID)
+ .end()
+ .links()
+ .single();
+ }
+
+
// TODO: org and relation
// TODO: combine autoassign with object template role assign
diff --git a/model/model-intest/src/test/resources/rbac/autoassign/role-unit-rider.xml b/model/model-intest/src/test/resources/rbac/autoassign/role-unit-rider.xml
new file mode 100644
index 00000000000..a25c84fe6ee
--- /dev/null
+++ b/model/model-intest/src/test/resources/rbac/autoassign/role-unit-rider.xml
@@ -0,0 +1,48 @@
+
+
+ Unit Rider
+
+
+
+ account
+
+ ri:title
+
+
+ Rider
+
+
+
+
+
+
+ true
+
+
+ UserType
+
+
+
+ autoassign-rider
+ true
+
+
+
+
+
+
+
+
diff --git a/model/model-intest/src/test/resources/rbac/autoassign/role-unit-sleeper.xml b/model/model-intest/src/test/resources/rbac/autoassign/role-unit-sleeper.xml
index bb2f8d1b9f5..51784033504 100644
--- a/model/model-intest/src/test/resources/rbac/autoassign/role-unit-sleeper.xml
+++ b/model/model-intest/src/test/resources/rbac/autoassign/role-unit-sleeper.xml
@@ -27,6 +27,9 @@
true
+
+ UserType
+ autoassign-sleepertrue
diff --git a/model/model-intest/src/test/resources/rbac/autoassign/role-unit-walker.xml b/model/model-intest/src/test/resources/rbac/autoassign/role-unit-walker.xml
index fac2063254c..56d4bbb0878 100644
--- a/model/model-intest/src/test/resources/rbac/autoassign/role-unit-walker.xml
+++ b/model/model-intest/src/test/resources/rbac/autoassign/role-unit-walker.xml
@@ -27,6 +27,9 @@
true
+
+ UserType
+ autoassign-walkertrue
diff --git a/model/model-intest/src/test/resources/rbac/autoassign/role-unit-worker.xml b/model/model-intest/src/test/resources/rbac/autoassign/role-unit-worker.xml
index c0befb16a17..9f079d52252 100644
--- a/model/model-intest/src/test/resources/rbac/autoassign/role-unit-worker.xml
+++ b/model/model-intest/src/test/resources/rbac/autoassign/role-unit-worker.xml
@@ -27,6 +27,9 @@
true
+
+ UserType
+ autoassign-workertrue
From 11c3628210b2dd7fb313281e41facedd9fdc043b Mon Sep 17 00:00:00 2001
From: Richard Richter
Date: Mon, 8 Jun 2020 23:16:37 +0200
Subject: [PATCH 06/12] repo: entity classes using RContainerId use simplified
id-based eq/hash
equals/hashCode is based only on ID value and nothing else, passes tests
---
.../container/RAccessCertificationCase.java | 65 +++++----
.../data/common/container/RAssignment.java | 129 +++++++++---------
.../common/container/ROperationExecution.java | 74 +++++-----
.../sql/data/common/container/RTrigger.java | 47 +++----
.../repo/sql/data/common/id/RContainerId.java | 30 ++--
.../data/common/other/RLookupTableRow.java | 72 ++++------
6 files changed, 196 insertions(+), 221 deletions(-)
diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java
index 30f49b8b5a2..435b5c81636 100644
--- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java
+++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2015 Evolveum and contributors
+ * Copyright (c) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
@@ -7,6 +7,19 @@
package com.evolveum.midpoint.repo.sql.data.common.container;
+import static com.evolveum.midpoint.schema.util.CertCampaignTypeUtil.norm;
+
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+import javax.persistence.*;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Persister;
+import org.jetbrains.annotations.NotNull;
+
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.repo.sql.SqlRepositoryServiceImpl;
@@ -29,24 +42,6 @@
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationWorkItemType;
-import org.hibernate.annotations.Cascade;
-import org.hibernate.annotations.GenericGenerator;
-import org.hibernate.annotations.Persister;
-import org.jetbrains.annotations.NotNull;
-
-import javax.persistence.*;
-import javax.xml.datatype.XMLGregorianCalendar;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
-
-import static com.evolveum.midpoint.schema.util.CertCampaignTypeUtil.norm;
-
-/**
- * @author lazyman
- * @author mederly
- */
@JaxbType(type = AccessCertificationCaseType.class)
@Entity
@@ -62,8 +57,6 @@ public class RAccessCertificationCase implements Container getWorkItems() {
return workItems;
}
@@ -254,6 +247,7 @@ public void setFullObject(byte[] fullObject) {
}
// Notes to equals/hashCode: don't include trans nor owner
+ /*
@Override
public boolean equals(Object o) {
if (this == o)
@@ -285,6 +279,26 @@ public int hashCode() {
reviewRequestedTimestamp, reviewDeadline, remediedTimestamp, currentStageOutcome, iteration, stageNumber,
outcome);
}
+ */
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof RAccessCertificationCase)) {
+ return false;
+ }
+
+ RAccessCertificationCase that = (RAccessCertificationCase) o;
+ return Objects.equals(ownerOid, that.ownerOid)
+ && Objects.equals(id, that.id);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ownerOid, id);
+ }
@Override
public String toString() {
@@ -322,9 +336,9 @@ public static RAccessCertificationCase toRepo(String ownerOid, AccessCertificati
return rCase;
}
- private static RAccessCertificationCase toRepo(RAccessCertificationCase rCase, AccessCertificationCaseType case1,
- RepositoryContext context) throws DtoTranslationException {
- rCase.setTransient(null); // we don't try to advise hibernate - let it do its work, even if it would cost some SELECTs
+ private static RAccessCertificationCase toRepo(RAccessCertificationCase rCase,
+ AccessCertificationCaseType case1, RepositoryContext context) throws DtoTranslationException {
+ rCase.setTransient(null); // we don't try to advise hibernate - let it do its work, even if it would cost some SELECTs
rCase.setId(RUtil.toInteger(case1.getId()));
rCase.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getObjectRef(), context.relationRegistry));
rCase.setTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getTargetRef(), context.relationRegistry));
@@ -376,6 +390,5 @@ public static AccessCertificationCaseType createJaxb(byte[] fullObject, PrismCon
LOGGER.debug("Couldn't parse certification case because of unexpected exception ({}):\nData: {}", e, xml);
throw e;
}
- //aCase.asPrismContainerValue().removeReference(AccessCertificationCaseType.F_CAMPAIGN_REF);
}
}
diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java
index e6bc9e64888..270de14a5ee 100644
--- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java
+++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2019 Evolveum and contributors
+ * Copyright (c) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
@@ -7,6 +7,18 @@
package com.evolveum.midpoint.repo.sql.data.common.container;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+import javax.persistence.*;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.apache.commons.lang.Validate;
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Persister;
+import org.hibernate.annotations.Where;
+
import com.evolveum.midpoint.repo.sql.data.RepositoryContext;
import com.evolveum.midpoint.repo.sql.data.common.Metadata;
import com.evolveum.midpoint.repo.sql.data.common.RObject;
@@ -21,51 +33,17 @@
import com.evolveum.midpoint.repo.sql.query.definition.JaxbPath;
import com.evolveum.midpoint.repo.sql.query.definition.JaxbType;
import com.evolveum.midpoint.repo.sql.query.definition.OwnerIdGetter;
-import com.evolveum.midpoint.repo.sql.query.definition.QueryEntity;
import com.evolveum.midpoint.repo.sql.query2.definition.IdQueryProperty;
import com.evolveum.midpoint.repo.sql.query2.definition.NotQueryable;
import com.evolveum.midpoint.repo.sql.util.DtoTranslationException;
import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult;
import com.evolveum.midpoint.repo.sql.util.MidPointSingleTablePersister;
import com.evolveum.midpoint.repo.sql.util.RUtil;
-import com.evolveum.midpoint.util.logging.Trace;
-import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
-import org.apache.commons.lang.Validate;
-import org.hibernate.annotations.*;
-import javax.persistence.*;
-import javax.persistence.Entity;
-import javax.persistence.ForeignKey;
-import javax.persistence.Index;
-import javax.persistence.Table;
-import javax.xml.datatype.XMLGregorianCalendar;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author lazyman
- */
@JaxbType(type = AssignmentType.class)
@Entity
-@QueryEntity(
- entities = {
-// @VirtualEntity(
-// jaxbName = @JaxbName(localPart = "metadata"),
-// jaxbType = MetadataType.class,
-// jpaName = "",
-// jpaType = Serializable.class // dummy value (ignored)
-// )
-// ,
-// @VirtualEntity(
-// jaxbName = @JaxbName(localPart = "construction"),
-// jaxbType = ConstructionType.class,
-// jpaName = "",
-// jpaType = Serializable.class // dummy value (ignored)
-// )
- }
-)
@IdClass(RContainerId.class)
// TODO prefix last 4 index names with "iAssignment" (some day)
@Table(name = "m_assignment", indexes = {
@@ -76,18 +54,11 @@
@Index(name = "iTargetRefTargetOid", columnList = "targetRef_targetOid"),
@Index(name = "iTenantRefTargetOid", columnList = "tenantRef_targetOid"),
@Index(name = "iOrgRefTargetOid", columnList = "orgRef_targetOid"),
- @Index(name = "iResourceRefTargetOid", columnList = "resourceRef_targetOid")})
+ @Index(name = "iResourceRefTargetOid", columnList = "resourceRef_targetOid") })
@Persister(impl = MidPointSingleTablePersister.class)
-public class RAssignment implements Container, Metadata {
+public class RAssignment implements Container, Metadata {
public static final String F_OWNER = "owner";
- /**
- * enum identifier of object class which owns this assignment. It's used because we have to
- * distinguish between assignments and inducements (all of them are the same kind) in {@link com.evolveum.midpoint.repo.sql.data.common.RAbstractRole}.
- */
- public static final String F_ASSIGNMENT_OWNER = "assignmentOwner";
-
- private static final Trace LOGGER = TraceManager.getTrace(RAssignment.class);
private Boolean trans;
@@ -180,8 +151,8 @@ public REmbeddedReference getResourceRef() {
}
@com.evolveum.midpoint.repo.sql.query.definition.Any(jaxbNameLocalPart = "extension")
- @OneToOne(optional = true, orphanRemoval = true)
- @Cascade({org.hibernate.annotations.CascadeType.ALL})
+ @OneToOne(orphanRemoval = true)
+ @Cascade({ org.hibernate.annotations.CascadeType.ALL })
@JoinColumns(value = {
@JoinColumn(name = "extOid", referencedColumnName = "owner_owner_oid"),
@JoinColumn(name = "extId", referencedColumnName = "owner_id")
@@ -202,7 +173,7 @@ public Integer getOrder() {
@Where(clause = RAssignmentReference.REFERENCE_TYPE + "= 0")
@OneToMany(fetch = FetchType.LAZY, mappedBy = RAssignmentReference.F_OWNER, orphanRemoval = true)
- @Cascade({org.hibernate.annotations.CascadeType.ALL})
+ @Cascade({ org.hibernate.annotations.CascadeType.ALL })
@JaxbPath(itemPath = { @JaxbName(localPart = "metadata"), @JaxbName(localPart = "createApproverRef") })
public Set getCreateApproverRef() {
if (createApproverRef == null) {
@@ -235,7 +206,7 @@ public REmbeddedReference getModifierRef() {
@Where(clause = RAssignmentReference.REFERENCE_TYPE + "= 1")
@OneToMany(fetch = FetchType.LAZY, mappedBy = RAssignmentReference.F_OWNER, orphanRemoval = true)
- @Cascade({org.hibernate.annotations.CascadeType.ALL})
+ @Cascade({ org.hibernate.annotations.CascadeType.ALL })
@JaxbPath(itemPath = { @JaxbName(localPart = "metadata"), @JaxbName(localPart = "modifyApproverRef") })
public Set getModifyApproverRef() {
if (modifyApproverRef == null) {
@@ -268,10 +239,10 @@ public String getLifecycleState() {
@CollectionTable(name = "m_assignment_policy_situation",
foreignKey = @ForeignKey(name = "fk_assignment_policy_situation"),
joinColumns = {
- @JoinColumn(name = "assignment_oid", referencedColumnName = "owner_oid"),
- @JoinColumn(name = "assignment_id", referencedColumnName = "id")
- })
- @Cascade({org.hibernate.annotations.CascadeType.ALL})
+ @JoinColumn(name = "assignment_oid", referencedColumnName = "owner_oid"),
+ @JoinColumn(name = "assignment_id", referencedColumnName = "id")
+ })
+ @Cascade({ org.hibernate.annotations.CascadeType.ALL })
public Set getPolicySituation() {
return policySituation;
}
@@ -280,7 +251,6 @@ public void setPolicySituation(Set policySituation) {
this.policySituation = policySituation;
}
-
public void setLifecycleState(String lifecycleState) {
this.lifecycleState = lifecycleState;
}
@@ -382,27 +352,30 @@ public void setResourceRef(REmbeddedReference resourceRef) {
this.resourceRef = resourceRef;
}
+ /*
@Override
public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
+ if (this == o) { return true; }
+ if (o == null || getClass() != o.getClass()) { return false; }
RAssignment that = (RAssignment) o;
- if (activation != null ? !activation.equals(that.activation) : that.activation != null) return false;
- if (extension != null ? !extension.equals(that.extension) : that.extension != null) return false;
- if (targetRef != null ? !targetRef.equals(that.targetRef) : that.targetRef != null) return false;
- if (assignmentOwner != null ? !assignmentOwner.equals(that.assignmentOwner) : that.assignmentOwner != null)
+ if (activation != null ? !activation.equals(that.activation) : that.activation != null) { return false; }
+ if (extension != null ? !extension.equals(that.extension) : that.extension != null) { return false; }
+ if (targetRef != null ? !targetRef.equals(that.targetRef) : that.targetRef != null) { return false; }
+ if (assignmentOwner != null ? !assignmentOwner.equals(that.assignmentOwner) : that.assignmentOwner != null) {
return false;
- if (order != null ? !order.equals(that.order) : that.order != null)
+ }
+ if (order != null ? !order.equals(that.order) : that.order != null) { return false; }
+ if (tenantRef != null ? !tenantRef.equals(that.tenantRef) : that.tenantRef != null) { return false; }
+ if (orgRef != null ? !orgRef.equals(that.orgRef) : that.orgRef != null) { return false; }
+ if (resourceRef != null ? !resourceRef.equals(that.resourceRef) : that.resourceRef != null) { return false; }
+ if (lifecycleState != null ? !lifecycleState.equals(that.lifecycleState) : that.lifecycleState != null) { return false; }
+ if (policySituation != null ? !policySituation.equals(that.policySituation) : that.policySituation != null) {
return false;
- if (tenantRef != null ? !tenantRef.equals(that.tenantRef) : that.tenantRef != null) return false;
- if (orgRef != null ? !orgRef.equals(that.orgRef) : that.orgRef != null) return false;
- if (resourceRef != null ? !resourceRef.equals(that.resourceRef) : that.resourceRef != null) return false;
- if (lifecycleState != null ? !lifecycleState.equals(that.lifecycleState) : that.lifecycleState != null) return false;
- if (policySituation != null ? !policySituation.equals(that.policySituation) : that.policySituation != null) return false;
+ }
- if (!MetadataFactory.equals(this, that)) return false;
+ if (!MetadataFactory.equals(this, that)) { return false; }
return true;
}
@@ -423,9 +396,29 @@ public int hashCode() {
return result;
}
+ */
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof RAssignment)) {
+ return false;
+ }
+
+ RAssignment that = (RAssignment) o;
+ return Objects.equals(ownerOid, that.ownerOid)
+ && Objects.equals(id, that.id);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ownerOid, id);
+ }
public static void fromJaxb(AssignmentType jaxb, RAssignment repo, RObject parent,
- RepositoryContext repositoryContext) throws DtoTranslationException{
+ RepositoryContext repositoryContext) throws DtoTranslationException {
fromJaxb(jaxb, repo, repositoryContext, null);
repo.setOwner(parent);
}
@@ -437,7 +430,7 @@ public static void fromJaxb(AssignmentType jaxb, RAssignment repo, ObjectType pa
}
private static void fromJaxb(AssignmentType jaxb, RAssignment repo, RepositoryContext repositoryContext,
- IdGeneratorResult generatorResult) throws DtoTranslationException {
+ IdGeneratorResult generatorResult) throws DtoTranslationException {
Validate.notNull(repo, "Repo object must not be null.");
Validate.notNull(jaxb, "JAXB object must not be null.");
diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/ROperationExecution.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/ROperationExecution.java
index 82ed27f932f..56aa274b702 100644
--- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/ROperationExecution.java
+++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/ROperationExecution.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Evolveum and contributors
+ * Copyright (c) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
@@ -7,6 +7,14 @@
package com.evolveum.midpoint.repo.sql.data.common.container;
+import java.util.Objects;
+import javax.persistence.*;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Persister;
+import org.jetbrains.annotations.NotNull;
+
import com.evolveum.midpoint.repo.sql.data.RepositoryContext;
import com.evolveum.midpoint.repo.sql.data.common.RObject;
import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference;
@@ -21,21 +29,9 @@
import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult;
import com.evolveum.midpoint.repo.sql.util.MidPointSingleTablePersister;
import com.evolveum.midpoint.repo.sql.util.RUtil;
-import com.evolveum.midpoint.util.logging.Trace;
-import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationExecutionType;
-import org.hibernate.annotations.GenericGenerator;
-import org.hibernate.annotations.Persister;
-import org.jetbrains.annotations.NotNull;
-import javax.persistence.*;
-import javax.xml.datatype.XMLGregorianCalendar;
-import java.util.Objects;
-
-/**
- * @author mederly
- */
@JaxbType(type = OperationExecutionType.class)
@Entity
@QueryEntity
@@ -45,14 +41,10 @@
@Index(name = "iOpExecInitiatorOid", columnList = "initiatorRef_targetOid"),
@Index(name = "iOpExecStatus", columnList = "status"),
@Index(name = "iOpExecStatus", columnList = "status"),
- @Index(name = "iOpExecOwnerOid", columnList = "owner_oid")})
+ @Index(name = "iOpExecOwnerOid", columnList = "owner_oid") })
@Persister(impl = MidPointSingleTablePersister.class)
public class ROperationExecution implements Container {
- public static final String F_OWNER = "owner";
-
- private static final Trace LOGGER = TraceManager.getTrace(ROperationExecution.class);
-
private Boolean trans;
private RObject owner;
@@ -160,42 +152,21 @@ public void setTransient(Boolean trans) {
this.trans = trans;
}
- @Override
- public boolean equals(Object o) {
- if (this == o)
- return true;
- if (!(o instanceof ROperationExecution))
- return false;
- ROperationExecution that = (ROperationExecution) o;
- return Objects.equals(trans, that.trans) &&
- Objects.equals(getOwnerOid(), that.getOwnerOid()) &&
- Objects.equals(id, that.id) &&
- Objects.equals(initiatorRef, that.initiatorRef) &&
- Objects.equals(taskRef, that.taskRef) &&
- Objects.equals(timestamp, that.timestamp) &&
- status == that.status;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(trans, getOwnerOid(), id, initiatorRef, taskRef, status);
- }
-
public static void fromJaxb(@NotNull OperationExecutionType jaxb, @NotNull ROperationExecution repo,
- RObject parent, RepositoryContext repositoryContext) throws DtoTranslationException {
+ RObject parent, RepositoryContext repositoryContext) throws DtoTranslationException {
repo.setOwner(parent);
fromJaxb(jaxb, repo, repositoryContext, null);
}
public static void fromJaxb(@NotNull OperationExecutionType jaxb, @NotNull ROperationExecution repo,
ObjectType parent, RepositoryContext repositoryContext,
- IdGeneratorResult generatorResult) throws DtoTranslationException {
+ IdGeneratorResult generatorResult) {
repo.setOwnerOid(parent.getOid());
fromJaxb(jaxb, repo, repositoryContext, generatorResult);
}
private static void fromJaxb(@NotNull OperationExecutionType jaxb, @NotNull ROperationExecution repo,
- RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException {
+ RepositoryContext repositoryContext, IdGeneratorResult generatorResult) {
if (generatorResult != null) {
repo.setTransient(generatorResult.isTransient(jaxb.asPrismContainerValue()));
}
@@ -206,6 +177,25 @@ private static void fromJaxb(@NotNull OperationExecutionType jaxb, @NotNull ROpe
repo.setTimestamp(jaxb.getTimestamp());
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof ROperationExecution)) {
+ return false;
+ }
+
+ ROperationExecution that = (ROperationExecution) o;
+ return Objects.equals(ownerOid, that.ownerOid)
+ && Objects.equals(id, that.id);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ownerOid, id);
+ }
+
@Override
public String toString() {
return "ROperationExecution{" +
diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RTrigger.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RTrigger.java
index 2592ce3a48d..65489903765 100644
--- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RTrigger.java
+++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RTrigger.java
@@ -1,11 +1,18 @@
/*
- * Copyright (c) 2010-2019 Evolveum and contributors
+ * Copyright (c) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.repo.sql.data.common.container;
+import java.util.Objects;
+import javax.persistence.*;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.apache.commons.lang.Validate;
+import org.hibernate.annotations.GenericGenerator;
+
import com.evolveum.midpoint.repo.sql.data.RepositoryContext;
import com.evolveum.midpoint.repo.sql.data.common.RObject;
import com.evolveum.midpoint.repo.sql.data.common.id.RContainerId;
@@ -18,16 +25,11 @@
import com.evolveum.midpoint.repo.sql.util.RUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType;
-import org.apache.commons.lang.Validate;
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
-import javax.xml.datatype.XMLGregorianCalendar;
@JaxbType(type = TriggerType.class)
@Entity
@IdClass(RContainerId.class)
-@Table(indexes = {@Index(name = "iTriggerTimestamp", columnList = RTrigger.C_TIMESTAMP)})
+@Table(indexes = { @Index(name = "iTriggerTimestamp", columnList = RTrigger.C_TIMESTAMP) })
public class RTrigger implements Container {
public static final String F_OWNER = "owner";
@@ -120,28 +122,24 @@ public void setHandlerUri(String handlerUri) {
@Override
public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof RTrigger)) {
+ return false;
+ }
RTrigger that = (RTrigger) o;
-
- if (handlerUri != null ? !handlerUri.equals(that.handlerUri) :
- that.handlerUri != null) return false;
- if (timestamp != null ? !timestamp.equals(that.timestamp) :
- that.timestamp != null) return false;
-
- return true;
+ return Objects.equals(ownerOid, that.ownerOid)
+ && Objects.equals(id, that.id);
}
@Override
public int hashCode() {
- int result = handlerUri != null ? handlerUri.hashCode() : 0;
- result = 31 * result + (timestamp != null ? timestamp.hashCode() : 0);
- return result;
+ return Objects.hash(ownerOid, id);
}
- public static void copyToJAXB(RTrigger repo, TriggerType jaxb) throws
- DtoTranslationException {
+ public static void copyToJAXB(RTrigger repo, TriggerType jaxb) {
Validate.notNull(repo, "Repo object must not be null.");
Validate.notNull(jaxb, "JAXB object must not be null.");
@@ -158,14 +156,13 @@ public static void fromJaxb(TriggerType jaxb, RTrigger repo, RObject parent,
}
public static void fromJaxb(TriggerType jaxb, RTrigger repo, ObjectType parent,
- RepositoryContext repositoryContext, IdGeneratorResult generatorResult)
- throws DtoTranslationException {
+ RepositoryContext repositoryContext, IdGeneratorResult generatorResult) {
repo.setOwnerOid(parent.getOid());
fromJaxb(jaxb, repo, repositoryContext, generatorResult);
}
private static void fromJaxb(TriggerType jaxb, RTrigger repo, RepositoryContext repositoryContext,
- IdGeneratorResult generatorResult) throws DtoTranslationException {
+ IdGeneratorResult generatorResult) {
Validate.notNull(repo, "Repo object must not be null.");
Validate.notNull(jaxb, "JAXB object must not be null.");
@@ -179,7 +176,7 @@ private static void fromJaxb(TriggerType jaxb, RTrigger repo, RepositoryContext
repo.setTimestamp(jaxb.getTimestamp());
}
- public TriggerType toJAXB() throws DtoTranslationException {
+ public TriggerType toJAXB() {
TriggerType object = new TriggerType();
RTrigger.copyToJAXB(this, object);
return object;
diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/id/RContainerId.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/id/RContainerId.java
index 00e2531f6a4..04c5bc2c49c 100644
--- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/id/RContainerId.java
+++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/id/RContainerId.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2013 Evolveum and contributors
+ * Copyright (c) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
@@ -8,22 +8,17 @@
package com.evolveum.midpoint.repo.sql.data.common.id;
import java.io.Serializable;
+import java.util.Objects;
-/**
- * @author lazyman
- */
public class RContainerId implements Serializable {
private String ownerOid;
private Integer id;
+ @SuppressWarnings("unused")
public RContainerId() {
}
- public RContainerId(String oid) {
- this(0, oid);
- }
-
public RContainerId(Integer id, String oid) {
this.id = id;
this.ownerOid = oid;
@@ -47,22 +42,21 @@ public void setOwnerOid(String oid) {
@Override
public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof RContainerId)) {
+ return false;
+ }
RContainerId that = (RContainerId) o;
-
- if (id != null ? !id.equals(that.id) : that.id != null) return false;
- if (ownerOid != null ? !ownerOid.equals(that.ownerOid) : that.ownerOid != null) return false;
-
- return true;
+ return Objects.equals(ownerOid, that.ownerOid)
+ && Objects.equals(id, that.id);
}
@Override
public int hashCode() {
- int result = ownerOid != null ? ownerOid.hashCode() : 0;
- result = 31 * result + (id != null ? id.hashCode() : 0);
- return result;
+ return Objects.hash(ownerOid, id);
}
@Override
diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/other/RLookupTableRow.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/other/RLookupTableRow.java
index 7c2ad24236e..6ac32806b43 100644
--- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/other/RLookupTableRow.java
+++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/other/RLookupTableRow.java
@@ -1,11 +1,18 @@
/*
- * Copyright (c) 2010-2019 Evolveum and contributors
+ * Copyright (c) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.repo.sql.data.common.other;
+import java.util.Date;
+import java.util.Objects;
+import javax.persistence.*;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.hibernate.annotations.GenericGenerator;
+
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.repo.sql.data.common.RLookupTable;
import com.evolveum.midpoint.repo.sql.data.common.container.Container;
@@ -19,25 +26,11 @@
import com.evolveum.midpoint.repo.sql.util.RUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType;
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
-import javax.xml.datatype.XMLGregorianCalendar;
-import java.util.Date;
-/**
- * @author Viliam Repan (lazyman)
- */
@Ignore
@Entity
-@Table(indexes = {
-//todo create indexes after lookup api is created (when we know how we will search through lookup table [lazyman]
-// @Index(name = "iRowKey", columnList = "key"),
-// @Index(name = "iRowLabelOrig", columnList = "label.orig"),
-// @Index(name = "iRowLabelNorm", columnList = "label.norm")
-},
-uniqueConstraints = {
- @UniqueConstraint(name = "uc_row_key", columnNames = {"owner_oid", "row_key"})
+@Table(uniqueConstraints = {
+ @UniqueConstraint(name = "uc_row_key", columnNames = { "owner_oid", "row_key" })
})
@IdClass(RContainerId.class)
public class RLookupTableRow implements Container {
@@ -75,6 +68,7 @@ public String getOwnerOid() {
}
public static final String ID_COLUMN_NAME = "id";
+
@Id
@GeneratedValue(generator = "ContainerIdGenerator")
@GenericGenerator(name = "ContainerIdGenerator", strategy = "com.evolveum.midpoint.repo.sql.util.ContainerIdGenerator")
@@ -145,31 +139,6 @@ public void setTransient(Boolean trans) {
this.trans = trans;
}
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- RLookupTableRow that = (RLookupTableRow) o;
-
- if (key != null ? !key.equals(that.key) : that.key != null) return false;
- if (label != null ? !label.equals(that.label) : that.label != null) return false;
- if (lastChangeTimestamp != null ? !lastChangeTimestamp.equals(that.lastChangeTimestamp) : that.lastChangeTimestamp != null)
- return false;
- if (value != null ? !value.equals(that.value) : that.value != null) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = key != null ? key.hashCode() : 0;
- result = 31 * result + (value != null ? value.hashCode() : 0);
- result = 31 * result + (label != null ? label.hashCode() : 0);
- result = 31 * result + (lastChangeTimestamp != null ? lastChangeTimestamp.hashCode() : 0);
- return result;
- }
-
public LookupTableRowType toJAXB(PrismContext prismContext) {
LookupTableRowType row = new LookupTableRowType();
row.setId(Long.valueOf(id));
@@ -212,6 +181,25 @@ private static RLookupTableRow toRepo(LookupTableRowType row) throws SchemaExcep
return rRow;
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof RLookupTableRow)) {
+ return false;
+ }
+
+ RLookupTableRow that = (RLookupTableRow) o;
+ return Objects.equals(ownerOid, that.ownerOid)
+ && Objects.equals(id, that.id);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ownerOid, id);
+ }
+
@Override
public String toString() {
return "RLookupTableRow{" +
From a526085c1b69261cf8856ce04eb9f56612b389a5 Mon Sep 17 00:00:00 2001
From: kate
Date: Tue, 9 Jun 2020 22:42:43 +0200
Subject: [PATCH 07/12] attempt to create reference autocomplpete field
---
.../AutoCompleteReferenceRenderer.java | 33 +++++++++
.../autocomplete/AutoCompleteTextPanel.java | 15 ++--
.../autocomplete/ReferenceConverter.java | 68 ++++++++++++++++++
.../search/ReferenceAutocomplete.java | 71 +++++++++++++++++++
.../component/search/ReferencePopupPanel.html | 8 ++-
.../component/search/ReferencePopupPanel.java | 47 ++++++++++--
6 files changed, 230 insertions(+), 12 deletions(-)
create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteReferenceRenderer.java
create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/ReferenceConverter.java
create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteReferenceRenderer.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteReferenceRenderer.java
new file mode 100644
index 00000000000..7d87ac9f839
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteReferenceRenderer.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2020 Evolveum and contributors
+ *
+ * This work is dual-licensed under the Apache License 2.0
+ * and European Union Public License. See LICENSE file for details.
+ */
+package com.evolveum.midpoint.gui.api.component.autocomplete;
+
+import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
+
+import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AbstractAutoCompleteRenderer;
+import org.apache.wicket.request.Response;
+
+/**
+ * @author honchar
+ */
+public class AutoCompleteReferenceRenderer extends AbstractAutoCompleteRenderer {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected String getTextValue(ObjectReferenceType object) {
+ return WebComponentUtil.getName(object);
+ }
+
+ @Override
+ protected void renderChoice(ObjectReferenceType object, Response response, String criteria) {
+ String textValue = getTextValue(object);
+ response.write(textValue);
+
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteTextPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteTextPanel.java
index a715ecc0852..492dbf20d9e 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteTextPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteTextPanel.java
@@ -78,12 +78,7 @@ protected void updateAjaxAttributes(AjaxRequestAttributes attributes){
@Override
public IConverter getConverter(Class type) {
IConverter converter = super.getConverter(type);
- if (lookupTable == null) {
- return converter;
- }
-
- return new LookupTableConverter<>(converter, lookupTable, getBaseFormComponent(), strict);
-
+ return getAutoCompleteConverter(type, converter);
}
};
@@ -114,6 +109,14 @@ protected void updateAjaxAttributes(AjaxRequestAttributes attributes){
* */
public abstract Iterator getIterator(String input);
+ protected IConverter getAutoCompleteConverter(Class type, IConverter originConverter){
+ if (lookupTable == null) {
+ return originConverter;
+ }
+
+ return new LookupTableConverter<>(originConverter, lookupTable, getBaseFormComponent(), strict);
+ }
+
@Override
public FormComponent getBaseFormComponent() {
return (FormComponent) get(ID_INPUT);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/ReferenceConverter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/ReferenceConverter.java
new file mode 100644
index 00000000000..2af853ffdab
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/ReferenceConverter.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2020 Evolveum and contributors
+ *
+ * This work is dual-licensed under the Apache License 2.0
+ * and European Union Public License. See LICENSE file for details.
+ */
+package com.evolveum.midpoint.gui.api.component.autocomplete;
+
+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.PrismObject;
+import com.evolveum.midpoint.prism.query.ObjectQuery;
+import com.evolveum.midpoint.schema.result.OperationResult;
+import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;
+
+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.commons.collections.CollectionUtils;
+import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.util.convert.ConversionException;
+import org.apache.wicket.util.convert.IConverter;
+
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * @author honchar
+ */
+public class ReferenceConverter implements IConverter {
+
+ private static final long serialVersionUID = 1L;
+ private IConverter originConverter;
+ private List referenceList = null;
+ private FormComponent baseComponent;
+
+ private PageBase pageBase;
+
+ public ReferenceConverter(IConverter originConverter, List referenceList, FormComponent baseComponent, PageBase pageBase) {
+ this.originConverter = originConverter;
+ this.referenceList = referenceList;
+ this.baseComponent = baseComponent;
+ this.pageBase = pageBase;
+ }
+
+ @Override
+ public ObjectReferenceType convertToObject(String value, Locale locale) throws ConversionException {
+ ObjectQuery query = pageBase.getPrismContext().queryFor(AbstractRoleType.class)
+ .item(ObjectType.F_NAME)
+ .eq(value)
+ .matchingOrig()
+ .build();
+ List> objectsList = WebModelServiceUtils.searchObjects(AbstractRoleType.class, query,
+ new OperationResult("searchObjects"), pageBase);
+ if (CollectionUtils.isNotEmpty(objectsList)){
+ return ObjectTypeUtil.createObjectRefWithFullObject(objectsList.get(0), pageBase.getPrismContext());
+ }
+ return originConverter.convertToObject(value, locale);
+
+ }
+
+ @Override
+ public String convertToString(ObjectReferenceType ref, Locale arg1) {
+ return ref != null ? WebComponentUtil.getName(ref) : "";
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java
new file mode 100644
index 00000000000..47ac3f894a8
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2020 Evolveum and contributors
+ *
+ * This work is dual-licensed under the Apache License 2.0
+ * and European Union Public License. See LICENSE file for details.
+ */
+package com.evolveum.midpoint.web.component.search;
+
+import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel;
+
+import com.evolveum.midpoint.gui.api.component.autocomplete.ReferenceConverter;
+import com.evolveum.midpoint.gui.api.page.PageBase;
+import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
+import com.evolveum.midpoint.prism.PrismObject;
+
+import com.evolveum.midpoint.prism.query.ObjectQuery;
+import com.evolveum.midpoint.schema.result.OperationResult;
+import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;
+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.commons.lang.StringUtils;
+import org.apache.wicket.extensions.ajax.markup.html.autocomplete.IAutoCompleteRenderer;
+import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.util.convert.IConverter;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author honchar
+ */
+public abstract class ReferenceAutocomplete extends AutoCompleteTextPanel {
+ private static final long serialVersionUID = 1L;
+
+ private PageBase pageBase;
+
+ public ReferenceAutocomplete(String id, final IModel model, IAutoCompleteRenderer renderer, PageBase pageBase) {
+ super(id, model, ObjectReferenceType.class, renderer);
+ this.pageBase = pageBase;
+ }
+
+
+ @Override
+ public Iterator getIterator(String input) {
+ FormComponent inputField = getBaseFormComponent();
+ if (inputField == null || StringUtils.isEmpty(inputField.getRawInput())){
+ return null;
+ }
+ ObjectQuery query = pageBase.getPrismContext().queryFor(AbstractRoleType.class)
+ .item(ObjectType.F_NAME)
+ .containsPoly(inputField.getRawInput())
+ .matchingNorm()
+ .build();
+ List> objectsList = WebModelServiceUtils.searchObjects(AbstractRoleType.class, query,
+ new OperationResult("searchObjects"), pageBase);
+ return (Iterator) ObjectTypeUtil.objectListToReferences(objectsList);
+ }
+
+ @Override
+ protected IConverter getAutoCompleteConverter(Class type, IConverter originConverter){
+ IConverter converter = super.getAutoCompleteConverter(type, originConverter);
+ return (IConverter) new ReferenceConverter((IConverter)converter, new ArrayList<>(), getBaseFormComponent(), pageBase);
+ }
+
+ protected abstract Class getReferenceTargetObjectType();
+
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.html
index 8948e32ea0b..56cd2ccb275 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.html
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.html
@@ -13,9 +13,15 @@