Skip to content

Commit 36ec5fa

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 453281c + 7d93ca3 commit 36ec5fa

File tree

61 files changed

+2038
-896
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+2038
-896
lines changed

docs/concepts/mark/index.adoc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,15 @@ Used in the same way as "Protected" when you have different reasons than for the
355355
|Shadow object that has bad data and should be ignored by synchronization. Used in the same way as "Protected" but with a different semantic meaning.
356356
|===
357357

358+
If reconciliation repeatedly fails on a subset of resource objects due to invalid or corrupted data, you can quarantine the failing shadows by applying a shadow policy mark such as _Invalid data_.
359+
Once applied, the mark disables synchronization (inbound/outbound) and provisioning operations for those shadows.
360+
Subsequent reconciliation runs can then skip the marked shadows (until unmarked) instead of repeatedly processing them.
361+
362+
This can be automated using a composite task containing two activities.
363+
While the first activity runs a reconciliation, the second activity immediately processes only the failed objects (using `failedObjectsSelector`) and applies a mark.
364+
After you fix the source data, remove the mark from the shadows (in Accounts/Entitlements list of a resource in GUI), and then reconcile the objects manually.
365+
See a link:https://github.com/Evolveum/midpoint-samples/blob/master/samples/tasks/recon-task-csv-mark-invalid.xml[composite task example].
366+
358367
== Best practices
359368

360369
* Use clear and descriptive names for marks, such as "inactive", "requires-approval", or "archived".

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -814,10 +814,6 @@ protected PageStorage getPageStorage(String storageKey) {
814814
}
815815

816816
public PageStorage getPageStorage() {
817-
if (isCollectionViewPanelForWidget()) {
818-
return null;
819-
}
820-
821817
String storageKey = getStorageKey();
822818
if (StringUtils.isNotEmpty(storageKey)) {
823819
return getPageStorage(storageKey);
@@ -1298,7 +1294,6 @@ private boolean isExportDataLinkVisible() {
12981294
}
12991295

13001296
protected String getStorageKey() {
1301-
13021297
CompiledObjectCollectionView compiledView = getCompiledCollectionViewFromPanelConfiguration();
13031298
if (compiledView != null) {
13041299
return WebComponentUtil.getObjectListPageStorageKey(compiledView.getViewIdentifier());
@@ -1440,7 +1435,7 @@ protected boolean isCollectionViewPanelForWidget() {
14401435
return false;
14411436
}
14421437

1443-
private String getWidgetNameOfCollection() {
1438+
protected String getWidgetNameOfCollection() {
14441439
PageParameters parameters = getPageBase().getPageParameters();
14451440
return parameters == null ? null : parameters.get(PageBase.PARAMETER_DASHBOARD_WIDGET_NAME).toString();
14461441
}

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/search/Search.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ public String getDslQuery() {
176176
}
177177

178178
public void setDslQuery(String dslQuery) {
179-
axiomQueryWrapper = new AxiomQueryWrapper(null);
179+
axiomQueryWrapper = new AxiomQueryWrapper(null, getTypeClass());
180180
axiomQueryWrapper.setDslQuery(dslQuery);
181181
}
182182

@@ -279,20 +279,13 @@ private boolean isSearchTypeAvailable() {
279279

280280
private QueryWrapper determineQueryWrapper() {
281281
SearchBoxModeType searchMode = getSearchMode();
282-
283-
switch (searchMode) {
284-
case OID:
285-
return oidSearchItemWrapper;
286-
case ADVANCED:
287-
return advancedQueryWrapper;
288-
case AXIOM_QUERY:
289-
return axiomQueryWrapper;
290-
case FULLTEXT:
291-
return fulltextQueryWrapper;
292-
case BASIC:
293-
return basicQueryWrapper;
294-
}
295-
return null;
282+
return switch (searchMode) {
283+
case OID -> oidSearchItemWrapper;
284+
case ADVANCED -> advancedQueryWrapper;
285+
case AXIOM_QUERY -> axiomQueryWrapper;
286+
case FULLTEXT -> fulltextQueryWrapper;
287+
case BASIC -> basicQueryWrapper;
288+
};
296289
}
297290

298291
// private ObjectQuery createObjectQueryAdvanced(PageBase pageBase) {

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/search/SearchBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ public ItemDefinition<?> getDefinitionOverride() {
251251
}
252252

253253
private Search<C> createSearch(SearchBoxConfigurationType mergedConfig, BasicQueryWrapper basicSearchWrapper) {
254-
AxiomQueryWrapper axiomWrapper = new AxiomQueryWrapper(getDefinitionOverride());
254+
AxiomQueryWrapper axiomWrapper = new AxiomQueryWrapper(getDefinitionOverride(), type);
255255
AdvancedQueryWrapper advancedQueryWrapper = new AdvancedQueryWrapper(null);
256256
FulltextQueryWrapper fulltextQueryWrapper = new FulltextQueryWrapper(null);
257257
if (AssignmentType.class.equals(type)) {

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/search/panel/AxiomSearchPanel.java

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,18 @@
99
import com.evolveum.midpoint.gui.api.component.BasePanel;
1010
import com.evolveum.midpoint.gui.impl.component.search.wrapper.AdvancedQueryWrapper;
1111
import com.evolveum.midpoint.gui.impl.component.search.wrapper.AxiomQueryWrapper;
12-
import com.evolveum.midpoint.prism.Containerable;
1312

1413
import com.evolveum.midpoint.prism.ItemDefinition;
15-
import com.evolveum.midpoint.prism.PrismContext;
1614
import com.evolveum.midpoint.prism.impl.query.lang.AxiomQueryContentAssistImpl;
17-
import com.evolveum.midpoint.prism.query.AxiomQueryContentAssist;
18-
import com.evolveum.midpoint.prism.query.ContentAssist;
1915
import com.evolveum.midpoint.prism.query.Suggestion;
2016
import com.evolveum.midpoint.util.logging.Trace;
2117
import com.evolveum.midpoint.util.logging.TraceManager;
2218
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
2319
import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour;
2420

2521
import com.evolveum.midpoint.web.page.admin.configuration.component.QueryPlaygroundPanel;
26-
import com.evolveum.midpoint.web.security.MidPointAuthWebSession;
27-
import com.evolveum.midpoint.web.session.SessionStorage;
28-
29-
import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchBoxModeType;
30-
3122
import com.fasterxml.jackson.databind.ObjectMapper;
3223
import org.apache.commons.lang3.StringUtils;
33-
import org.apache.wicket.Component;
34-
import org.apache.wicket.Session;
3524
import org.apache.wicket.ajax.AjaxRequestTarget;
3625
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
3726
import org.apache.wicket.ajax.attributes.ThrottlingSettings;
@@ -40,22 +29,22 @@
4029
import org.apache.wicket.markup.head.IHeaderResponse;
4130
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
4231
import org.apache.wicket.markup.html.basic.Label;
43-
import org.apache.wicket.markup.html.form.DropDownChoice;
4432
import org.apache.wicket.markup.html.form.TextField;
4533
import org.apache.wicket.model.IModel;
46-
import org.apache.wicket.model.Model;
4734
import org.apache.wicket.model.PropertyModel;
4835
import org.apache.wicket.request.IRequestParameters;
4936
import org.apache.wicket.request.cycle.RequestCycle;
5037

5138
import javax.xml.namespace.QName;
39+
import java.io.Serial;
5240
import java.time.Duration;
53-
import java.util.Arrays;
5441
import java.util.Comparator;
5542
import java.util.List;
5643

5744
public class AxiomSearchPanel extends BasePanel<AxiomQueryWrapper> {
5845

46+
@Serial private static final long serialVersionUID = 1L;
47+
5948
private static final Trace LOGGER = TraceManager.getTrace(QueryPlaygroundPanel.class);
6049
private static final String ID_AXIOM_QUERY_FIELD = "axiomQueryField";
6150
private static final String ID_ADVANCED_ERROR = "advancedError";
@@ -74,6 +63,8 @@ protected void onInitialize() {
7463
private void initLayout() {
7564
TextField<String> queryDslField = new TextField<>(ID_AXIOM_QUERY_FIELD,
7665
new PropertyModel<>(getModel(), AxiomQueryWrapper.F_DSL_QUERY)) {
66+
@Serial private static final long serialVersionUID = 1L;
67+
7768
@Override
7869
protected boolean shouldTrimInput() {
7970
return false;
@@ -107,6 +98,8 @@ protected boolean shouldTrimInput() {
10798
ObjectMapper mapper = new ObjectMapper();
10899

109100
queryDslField.add(new AjaxFormComponentUpdatingBehavior("keydown") {
101+
@Serial private static final long serialVersionUID = 1L;
102+
110103
@Override
111104
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
112105
super.updateAjaxAttributes(attributes);

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/search/panel/ObjectCollectionSearchItemPanel.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
import com.evolveum.midpoint.web.component.data.column.AjaxLinkPanel;
1818
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectCollectionType;
1919

20+
import java.io.Serial;
21+
2022
public class ObjectCollectionSearchItemPanel extends SingleSearchItemPanel<ObjectCollectionSearchItemWrapper> {
23+
@Serial private static final long serialVersionUID = 1L;
2124

2225
public ObjectCollectionSearchItemPanel(String id, IModel<ObjectCollectionSearchItemWrapper> searchItemModel) {
2326
super(id, searchItemModel);
@@ -34,7 +37,7 @@ protected Component initSearchItemField(String id) {
3437
}
3538
String finalOid = oid;
3639
AjaxLinkPanel ajaxLinkPanel = new AjaxLinkPanel(id, nameModel) {
37-
private static final long serialVersionUID = 1L;
40+
@Serial private static final long serialVersionUID = 1L;
3841

3942
@Override
4043
public void onClick(AjaxRequestTarget target) {

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/search/panel/SearchPanel.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ public void initSpecificSearchPanel(String panelId, Form form) {
174174
break;
175175
case AXIOM_QUERY:
176176
PropertyModel<AxiomQueryWrapper> propModel = new PropertyModel<>(getModel(), Search.F_AXIOM_SEARCH);
177-
propModel.getObject().setTypeClass(getModel().getObject().getTypeClass());
178177
AxiomSearchPanel axiomSearchPanel = new AxiomSearchPanel(panelId, propModel);
179178
axiomSearchPanel.setOutputMarkupId(true);
180179
form.addOrReplace(axiomSearchPanel);

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/search/panel/SingleSearchItemPanel.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package com.evolveum.midpoint.gui.impl.component.search.panel;
88

9+
import java.io.Serial;
910
import java.util.ArrayList;
1011
import java.util.Iterator;
1112
import java.util.List;
@@ -41,7 +42,7 @@
4142

4243
public abstract class SingleSearchItemPanel<S extends AbstractSearchItemWrapper> extends AbstractSearchItemPanel<S> {
4344

44-
private static final long serialVersionUID = 1L;
45+
@Serial private static final long serialVersionUID = 1L;
4546

4647
private static final String ID_SEARCH_ITEM_CONTAINER = "searchItemContainer";
4748
private static final String ID_SEARCH_ITEM_FIELD = "searchItemField";
@@ -122,7 +123,7 @@ public String getDataPlacement() {
122123

123124
CheckPanel checkPanel = new CheckPanel(ID_CHECK_DISABLE_FIELD, new PropertyModel<>(getModel(), FilterableSearchItemWrapper.F_APPLY_FILTER));
124125
(checkPanel).getBaseFormComponent().add(new OnChangeAjaxBehavior() {
125-
private static final long serialVersionUID = 1L;
126+
@Serial private static final long serialVersionUID = 1L;
126127

127128
@Override
128129
protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) {
@@ -136,14 +137,14 @@ protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) {
136137
searchItemContainer.add(checkPanel);
137138

138139
AjaxSubmitButton removeButton = new AjaxSubmitButton(ID_REMOVE_BUTTON) {
139-
private static final long serialVersionUID = 1L;
140+
@Serial private static final long serialVersionUID = 1L;
140141

141142
@Override
142143
public void onSubmit(AjaxRequestTarget target) {
143144
deletePerformed(target);
144145
}
145146
};
146-
removeButton.add(new VisibleBehaviour(() -> canRemoveSearchItem()));
147+
removeButton.add(new VisibleBehaviour(this::canRemoveSearchItem));
147148
removeButton.setOutputMarkupId(true);
148149
removeButton.add(AttributeModifier.replace("title",
149150
getParentPage().createStringResource("SingleSearchItemPanel.removeProperty", createLabelModel().getObject())));
@@ -154,10 +155,6 @@ protected boolean isFieldEnabled() {
154155
return getModelObject().isEnabled();
155156
}
156157

157-
protected WebMarkupContainer getSearchItemContainer() {
158-
return (WebMarkupContainer) get(ID_SEARCH_ITEM_CONTAINER);
159-
}
160-
161158
private IModel<String> createHelpModel() {
162159
if (getModelObject() == null) {
163160
return () -> "";
@@ -214,7 +211,7 @@ protected AutoCompleteTextPanel createAutoCompetePanel(String id, IModel<String>
214211
AutoCompleteTextPanel<String> autoCompletePanel = new AutoCompleteTextPanel<>(id, model, String.class,
215212
true, lookupTableOid) {
216213

217-
private static final long serialVersionUID = 1L;
214+
@Serial private static final long serialVersionUID = 1L;
218215

219216
@Override
220217
public Iterator<String> getIterator(String input) {
@@ -224,7 +221,7 @@ public Iterator<String> getIterator(String input) {
224221

225222
(autoCompletePanel).getBaseFormComponent().add(new Behavior() {
226223

227-
private static final long serialVersionUID = 1L;
224+
@Serial private static final long serialVersionUID = 1L;
228225

229226
@Override
230227
public void bind(Component component) {

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/search/wrapper/AbstractRoleSearchItemWrapper.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.commons.lang3.StringUtils;
2727
import org.apache.wicket.model.IModel;
2828
import org.apache.wicket.model.Model;
29+
import org.jetbrains.annotations.NotNull;
2930

3031
import javax.xml.namespace.QName;
3132
import java.util.List;
@@ -179,7 +180,7 @@ public Class<? extends AbstractSearchItemPanel> getSearchItemPanelClass() {
179180
}
180181

181182
@Override
182-
public IModel<String> getName() {
183+
public @NotNull IModel<String> getName() {
183184
return StringUtils.isNotEmpty(name.getObject()) ? name : Model.of();
184185
}
185186

@@ -188,12 +189,12 @@ public void setName(IModel<String> name) {
188189
}
189190

190191
@Override
191-
public IModel<String> getHelp() {
192+
public @NotNull IModel<String> getHelp() {
192193
return StringUtils.isNotEmpty(help.getObject()) ? help : Model.of();
193194
}
194195

195196
@Override
196-
public IModel<String> getTitle() {
197+
public @NotNull IModel<String> getTitle() {
197198
return Model.of();
198199
}
199200

gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/search/wrapper/AssociationSearchItemWrapper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.evolveum.midpoint.util.DisplayableValue;
2020

2121
import org.apache.wicket.model.IModel;
22+
import org.jetbrains.annotations.NotNull;
2223

2324
import java.util.ArrayList;
2425
import java.util.List;
@@ -56,7 +57,7 @@ public DisplayableValue<ItemName> getDefaultValue() {
5657
}
5758

5859
@Override
59-
public IModel<String> getName() {
60+
public @NotNull IModel<String> getName() {
6061
return PageBase.createStringResourceStatic("ConstructionType.association");
6162
}
6263

0 commit comments

Comments
 (0)