/*
* Copyright (c) 2010-2015 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.web.page.admin.certification.dto;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.ConfigurationException;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
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.data.BaseSortableDataProvider;
import com.evolveum.midpoint.web.page.error.PageError;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType;
import org.apache.wicket.Component;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import static com.evolveum.midpoint.schema.GetOperationOptions.*;
import static com.evolveum.midpoint.schema.SelectorOptions.createCollection;
/**
* @author lazyman
* @author mederly
*/
public class CertCaseDtoProvider extends BaseSortableDataProvider<CertCaseOrWorkItemDto> {
private static final Trace LOGGER = TraceManager.getTrace(CertCaseDtoProvider.class);
private static final String DOT_CLASS = CertCaseDtoProvider.class.getName() + ".";
private static final String OPERATION_SEARCH_OBJECTS = DOT_CLASS + "searchObjects";
private static final String OPERATION_COUNT_OBJECTS = DOT_CLASS + "countObjects";
private String campaignOid;
// case query is stored in super.query
public CertCaseDtoProvider(Component component) {
super(component, false); // TODO make this cacheable
}
@Override
public Iterator<CertCaseOrWorkItemDto> internalIterator(long first, long count) {
LOGGER.trace("begin::iterator() from {} count {}.", first, count);
getAvailableData().clear();
Task task = getPage().createSimpleTask(OPERATION_SEARCH_OBJECTS);
OperationResult result = task.getResult();
try {
ObjectPaging paging = createPaging(first, count);
Collection<SelectorOptions<GetOperationOptions>> resolveNames = createCollection(createResolveNames());
List<AccessCertificationCaseType> caseList = searchCases(campaignOid, paging, resolveNames, task, result);
for (AccessCertificationCaseType _case : caseList) {
getAvailableData().add(new CertCaseDto(_case, getPage(), task, result));
}
} catch (Exception ex) {
result.recordFatalError("Couldn't list decisions.", ex);
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't list decisions", ex);
} finally {
result.computeStatusIfUnknown();
}
if (!WebComponentUtil.isSuccessOrHandledError(result)) {
handleNotSuccessOrHandledErrorInIterator(result);
}
LOGGER.trace("end::iterator()");
return getAvailableData().iterator();
}
private void handleNotSuccessOrHandledErrorInIterator(OperationResult result){
getPage().showResult(result);
throw new RestartResponseException(PageError.class);
}
// TODO replace searchCases with countCases (when it will be available)
@Override
protected int internalSize() {
LOGGER.trace("begin::internalSize()");
int count = 0;
OperationResult result = new OperationResult(OPERATION_COUNT_OBJECTS);
try {
Task task = getPage().createSimpleTask(OPERATION_COUNT_OBJECTS);
List<AccessCertificationCaseType> caseList = searchCases(campaignOid, null, null, task, result);
count = caseList.size();
} catch (Exception ex) {
result.recordFatalError("Couldn't count objects.", ex);
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't count objects", ex);
} finally {
result.computeStatusIfUnknown();
}
if (!WebComponentUtil.isSuccessOrHandledError(result)) {
getPage().showResult(result, false);
throw new RestartResponseException(PageError.class);
}
LOGGER.trace("end::internalSize()");
return count;
}
@SuppressWarnings("unused")
public String getCampaignOid() {
return campaignOid;
}
public void setCampaignOid(String campaignOid) {
this.campaignOid = campaignOid;
}
private List<AccessCertificationCaseType> searchCases(String campaignOid, ObjectPaging paging, Collection<SelectorOptions<GetOperationOptions>> options, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ConfigurationException, SecurityViolationException {
final InOidFilter inOidFilter = InOidFilter.createOwnerHasOidIn(campaignOid);
ObjectQuery query = getQuery();
if (query != null) {
query = query.clone();
if (query.getFilter() == null) {
query.setFilter(inOidFilter);
} else {
query.setFilter(AndFilter.createAnd(query.getFilter(), inOidFilter));
}
} else {
query = new ObjectQuery();
query.setFilter(inOidFilter);
}
query.setPaging(paging);
return getModel().searchContainers(AccessCertificationCaseType.class, query, options, task, result);
}
@NotNull
@Override
protected List<ObjectOrdering> createObjectOrderings(SortParam<String> sortParam) {
return SearchingUtils.createObjectOrderings(sortParam, false);
}
}