/*
* Copyright (c) 2010-2013 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.server.dto;
import com.evolveum.midpoint.gui.api.page.PageBase;
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.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.data.BaseSortableDataProvider;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import org.apache.wicket.Component;
import javax.xml.namespace.QName;
import java.util.*;
/**
* @author lazyman
*/
public class TaskDtoProvider extends BaseSortableDataProvider<TaskDto> {
private static final transient Trace LOGGER = TraceManager.getTrace(TaskDtoProvider.class);
private static final String DOT_CLASS = TaskDtoProvider.class.getName() + ".";
private static final String OPERATION_LIST_TASKS = DOT_CLASS + "listTasks";
private static final String OPERATION_COUNT_TASKS = DOT_CLASS + "countTasks";
private TaskDtoProviderOptions options;
private Component component;
public TaskDtoProvider(Component component, TaskDtoProviderOptions options) {
super(component);
this.options = options;
this.component = component;
}
public TaskDtoProvider(Component component) {
this(component, TaskDtoProviderOptions.fullOptions());
}
@Override
public Iterator<? extends TaskDto> internalIterator(long first, long count) {
Collection<String> selectedOids = getSelectedOids();
getAvailableData().clear();
OperationResult result = new OperationResult(OPERATION_LIST_TASKS);
Task operationTask = getTaskManager().createTaskInstance(OPERATION_LIST_TASKS);
try {
ObjectPaging paging = createPaging(first, count);
ObjectQuery query = getQuery();
if (query == null){
query = new ObjectQuery();
}
query.setPaging(paging);
List<QName> propertiesToGet = new ArrayList<>();
if (options.isUseClusterInformation()) {
propertiesToGet.add(TaskType.F_NODE_AS_OBSERVED);
}
if (options.isGetNextRunStartTime()) {
propertiesToGet.add(TaskType.F_NEXT_RUN_START_TIMESTAMP);
propertiesToGet.add(TaskType.F_NEXT_RETRY_TIMESTAMP);
}
Collection<SelectorOptions<GetOperationOptions>> searchOptions =
GetOperationOptions.createRetrieveAttributesOptions(propertiesToGet.toArray(new QName[0]));
List<PrismObject<TaskType>> tasks = getModel().searchObjects(TaskType.class, query, searchOptions, operationTask, result);
for (PrismObject<TaskType> task : tasks) {
try {
TaskDto taskDto = createTaskDto(task, operationTask, result);
getAvailableData().add(taskDto);
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Unhandled exception when getting task {} details", ex, task.getOid());
result.recordPartialError("Couldn't get details of task " + task.getOid(), ex);
// todo display the result somehow
}
}
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Unhandled exception when listing tasks", ex);
result.recordFatalError("Couldn't list tasks.", ex);
} finally {
if (result.hasUnknownStatus()) {
result.recomputeStatus();
}
}
setSelectedOids(selectedOids);
return getAvailableData().iterator();
}
private Collection<String> getSelectedOids() {
Set<String> oids = new HashSet<>();
for (TaskDto taskDto : getAvailableData()) {
if (taskDto.isSelected()) {
oids.add(taskDto.getOid());
}
}
return oids;
}
private void setSelectedOids(Collection<String> selectedOids) {
for (TaskDto taskDto : getAvailableData()) {
if (selectedOids.contains(taskDto.getOid())) {
taskDto.setSelected(true);
}
}
}
public TaskDto createTaskDto(PrismObject<TaskType> task, Task opTask, OperationResult result)
throws SchemaException, ObjectNotFoundException {
return new TaskDto(task.asObjectable(), getModel(), getTaskService(),
getModelInteractionService(), getTaskManager(), getWorkflowManager(), options, opTask, result, (PageBase)component);
}
@Override
protected int internalSize() {
int count = 0;
OperationResult result = new OperationResult(OPERATION_COUNT_TASKS);
Task task = getTaskManager().createTaskInstance(OPERATION_COUNT_TASKS);
try {
count = getModel().countObjects(TaskType.class, getQuery(), null, task, result);
result.recomputeStatus();
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Unhandled exception when counting tasks", ex);
result.recordFatalError("Couldn't count tasks.", ex);
}
if (!result.isSuccess()) {
getPage().showResult(result);
}
return count;
}
}