Skip to content

Commit

Permalink
SelectableBeanObjectDataProvider: cleanup, mainly about collection work
Browse files Browse the repository at this point in the history
  • Loading branch information
virgo47 committed Jun 19, 2020
1 parent 8c0d3c9 commit b34376b
Showing 1 changed file with 34 additions and 66 deletions.
@@ -1,33 +1,30 @@
/*
* 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.
*/

package com.evolveum.midpoint.web.component.data;

import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;

import static com.evolveum.midpoint.schema.DefinitionProcessingOption.FULL;
import static com.evolveum.midpoint.schema.DefinitionProcessingOption.ONLY_IF_EXISTS;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;

import com.evolveum.midpoint.schema.GetOperationOptionsBuilder;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import org.apache.commons.lang.Validate;
import org.apache.wicket.Component;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.GetOperationOptionsBuilder;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
Expand All @@ -36,14 +33,11 @@
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.component.util.SelectableBeanImpl;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import org.jetbrains.annotations.NotNull;

import static com.evolveum.midpoint.schema.DefinitionProcessingOption.FULL;
import static com.evolveum.midpoint.schema.DefinitionProcessingOption.ONLY_IF_EXISTS;
import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;

/**
* @author lazyman
Expand All @@ -70,17 +64,10 @@ public class SelectableBeanObjectDataProvider<O extends ObjectType> extends Base
// at least for the shadows.
private int defaultCountIfNull = 0;

/**
* The number of all objects that the query can return. Defaults to a really big number
* if we cannot count the number of objects.
* TODO: make this default more reasonable. -1 or something like that (MID-3339)
*/
// private int size = Integer.MAX_VALUE;

private Class<? extends O> type;
private Collection<SelectorOptions<GetOperationOptions>> options;

public SelectableBeanObjectDataProvider(Component component, Class<? extends O> type, Set<? extends O> selected ) {
public SelectableBeanObjectDataProvider(Component component, Class<? extends O> type, Set<? extends O> selected) {
super(component, false, true);

Validate.notNull(type);
Expand All @@ -90,7 +77,7 @@ public SelectableBeanObjectDataProvider(Component component, Class<? extends O>
this.type = type;
}

public void clearSelectedObjects(){
public void clearSelectedObjects() {
selected.clear();
}

Expand All @@ -99,33 +86,29 @@ public List<O> getSelectedData() {
preprocessSelectedDataInternal();
for (SelectableBean<O> selectable : super.getAvailableData()) {
if (selectable.isSelected() && selectable.getValue() != null) {
((Set)selected).add(selectable.getValue());
((Set) selected).add(selectable.getValue());
}
}
List<O> allSelected = new ArrayList<>();
allSelected.addAll(selected);
return allSelected;
return new ArrayList<>(selected);
}

private void preprocessSelectedData() {
preprocessSelectedDataInternal();
getAvailableData().clear();
preprocessSelectedDataInternal();
getAvailableData().clear();
}

private void preprocessSelectedDataInternal() {
for (SelectableBean<O> available : getAvailableData()) {
if (available.isSelected() && available.getValue() != null) {
((Set)selected).add(available.getValue());
}
}

for (SelectableBean<O> available : getAvailableData()) {
if (!available.isSelected()) {
if (selected.contains(available.getValue())) {
selected.remove(available.getValue());
}
}
}
((Set) selected).add(available.getValue());
}
}

for (SelectableBean<O> available : getAvailableData()) {
if (!available.isSelected()) {
selected.remove(available.getValue());
}
}
}

@Override
Expand All @@ -135,11 +118,7 @@ protected boolean checkOrderingSettings() {

@Override
public Iterator<SelectableBean<O>> internalIterator(long offset, long pageSize) {
LOGGER.trace("begin::iterator() offset {} pageSize {}.", new Object[]{offset, pageSize});
// if (pageSize > 1000000) {
// // Failsafe. Do not even try this. This can have huge impact on the resource. (MID-3336)
// throw new IllegalArgumentException("Requested huge page size: "+pageSize);
// }
LOGGER.trace("begin::iterator() offset {} pageSize {}.", new Object[] { offset, pageSize });

preprocessSelectedData();

Expand All @@ -149,9 +128,9 @@ public Iterator<SelectableBean<O>> internalIterator(long offset, long pageSize)
Task task = getPage().createSimpleTask(OPERATION_SEARCH_OBJECTS);

ObjectQuery query = getQuery();
if (query == null){
if (query == null) {
if (emptyListOnNullQuery) {
return new ArrayList<SelectableBean<O>>().iterator();
return Collections.emptyIterator();
}
query = getPrismContext().queryFactory().createQuery();
}
Expand All @@ -175,7 +154,7 @@ public Iterator<SelectableBean<O>> internalIterator(long offset, long pageSize)
}
}
optionsBuilder.mergeFrom(getDistinctRelatedOptions());
List<PrismObject<? extends O>> list = (List)getModel().searchObjects(type, query, optionsBuilder.build(), task, result);
List<PrismObject<? extends O>> list = (List) getModel().searchObjects(type, query, optionsBuilder.build(), task, result);

if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Query {} resulted in {} objects", type.getSimpleName(), list.size());
Expand All @@ -184,7 +163,6 @@ public Iterator<SelectableBean<O>> internalIterator(long offset, long pageSize)
for (PrismObject<? extends O> object : list) {
getAvailableData().add(createDataObjectWrapper(object.asObjectable()));
}
// result.recordSuccess();
} catch (Exception ex) {
result.recordFatalError(getPage().createStringResource("ObjectDataProvider.message.listObjects.fatalError").getString(), ex);
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't list objects", ex);
Expand All @@ -210,16 +188,16 @@ protected Iterator<SelectableBean<O>> handleNotSuccessOrHandledErrorInIterator(O
}

public SelectableBean<O> createDataObjectWrapper(O obj) {
SelectableBean<O> selectable = new SelectableBeanImpl<O>(obj);
SelectableBean<O> selectable = new SelectableBeanImpl<>(obj);

if (!WebComponentUtil.isSuccessOrHandledError(obj.getFetchResult())) {
try {
selectable.setResult(obj.getFetchResult());
} catch (SchemaException e) {
throw new SystemException(e.getMessage(), e);
}
}
for (O s : selected){
for (O s : selected) {
if (s.getOid().equals(obj.getOid())) {
selectable.setSelected(true);
}
Expand Down Expand Up @@ -258,8 +236,6 @@ protected int internalSize() {
return count;
}



@Override
protected CachedSize getCachedSize(Map<Serializable, CachedSize> cache) {
return cache.get(new TypedCacheKey(getQuery(), type));
Expand All @@ -277,7 +253,7 @@ public void setType(Class<O> type) {
clearCache();
}

protected boolean isUseObjectCounting(){
protected boolean isUseObjectCounting() {
return useObjectCounting;
}

Expand Down Expand Up @@ -312,12 +288,4 @@ public void setExport(boolean export) {
public void setDefaultCountIfNull(int defaultCountIfNull) {
this.defaultCountIfNull = defaultCountIfNull;
}

// public int getSize() {
// return size;
// }
//
// public void setSize(int size) {
// this.size = size;
// }
}

0 comments on commit b34376b

Please sign in to comment.