Skip to content

Commit

Permalink
task tabs visibility
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Mar 4, 2020
1 parent 6c21e9f commit 20e262e
Show file tree
Hide file tree
Showing 3 changed files with 179 additions and 88 deletions.
Expand Up @@ -6,6 +6,23 @@
*/
package com.evolveum.midpoint.web.page.admin.server;

import com.evolveum.midpoint.gui.api.prism.ItemWrapper;
import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper;
import com.evolveum.midpoint.gui.api.prism.PrismObjectWrapper;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.model.api.ModelPublicConstants;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.statistics.StatisticsUtil;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;

import java.io.Serializable;

/**
Expand All @@ -14,6 +31,9 @@
* @author mederly
*/
class TaskTabsVisibility implements Serializable {

private static final transient Trace LOGGER = TraceManager.getTrace(TaskTabsVisibility.class);

private boolean basicVisible;
private boolean schedulingVisible;
private boolean subtasksAndThreadsVisible;
Expand All @@ -23,94 +43,157 @@ class TaskTabsVisibility implements Serializable {
private boolean resultVisible;
private boolean errorsVisible;

// public boolean computeBasicVisible(PageTaskEdit parentPage) {
// basicVisible = parentPage.isShowAdvanced() || !parentPage.getTaskDto().isWorkflow();
// return basicVisible;
// }
//
// public boolean computeSchedulingVisible(PageTaskEdit parentPage) {
// schedulingVisible = (parentPage.isShowAdvanced() || !parentPage.getTaskDto().isWorkflow())
// && parentPage.isReadableSomeOf(
// TaskType.F_LAST_RUN_START_TIMESTAMP, TaskType.F_LAST_RUN_FINISH_TIMESTAMP,
// TaskType.F_NEXT_RUN_START_TIMESTAMP, TaskType.F_NEXT_RETRY_TIMESTAMP,
// TaskType.F_RECURRENCE, TaskType.F_BINDING, TaskType.F_SCHEDULE, TaskType.F_THREAD_STOP_ACTION);
//
// return schedulingVisible;
// }
//
// public boolean computeSubtasksAndThreadsVisible(PageTaskEdit parentPage) {
// if (parentPage.isEdit()) {
// subtasksAndThreadsVisible = parentPage.getTaskDto().configuresWorkerThreads()
// && parentPage.isExtensionReadable(SchemaConstants.MODEL_EXTENSION_WORKER_THREADS);
// } else if (parentPage.isShowAdvanced() || !parentPage.getTaskDto().isWorkflow()) {
// IModel<TaskDto> taskDtoModel = parentPage.getTaskDtoModel();
// subtasksAndThreadsVisible =
// (parentPage.getTaskDto().configuresWorkerThreads() && parentPage.isExtensionReadable(SchemaConstants.MODEL_EXTENSION_WORKER_THREADS))
// || !taskDtoModel.getObject().getSubtasks().isEmpty() || !taskDtoModel.getObject().getTransientSubtasks().isEmpty();
// } else {
// subtasksAndThreadsVisible = false;
// }
// return subtasksAndThreadsVisible;
// }
//
// public boolean computeProgressVisible(PageTaskEdit parentPage) {
// progressVisible = !parentPage.isEdit();
// return progressVisible;
// }
//
// public boolean computeEnvironmentalPerformanceVisible(PageTaskEdit parentPage) {
// final OperationStatsType operationStats = parentPage.getTaskDto().getTaskType().getOperationStats();
// environmentalPerformanceVisible = !parentPage.isEdit()
// && parentPage.isReadable(TaskType.F_OPERATION_STATS)
// && operationStats != null
// && !StatisticsUtil.isEmpty(operationStats.getEnvironmentalPerformanceInformation());
// return environmentalPerformanceVisible;
// }
//
// public boolean computeInternalPerformanceVisible(PageTaskEdit parentPage) {
// final OperationStatsType operationStats = parentPage.getTaskDto().getTaskType().getOperationStats();
// environmentalPerformanceVisible = !parentPage.isEdit()
// && parentPage.isReadable(TaskType.F_OPERATION_STATS)
// && operationStats != null;
// return environmentalPerformanceVisible;
// }
//
// public boolean computeOperationVisible(PageTaskEdit parentPage) {
// operationVisible = !parentPage.isEdit()
// && parentPage.isReadable(TaskType.F_MODEL_OPERATION_CONTEXT)
// && parentPage.getTaskDto().getTaskType().getModelOperationContext() != null
// // The following is an ugly hack because ItemWrapperFactoryImpl.createWrapper creates
// // empty containers for TaskType, including for modelOperationContext! Therefore,
// // getModelOperationContext() is non-null even if no context was in the task.
// && parentPage.getTaskDto().getTaskType().getModelOperationContext().getState() != null
// && (!parentPage.getTaskDto().isWorkflow() || parentPage.isShowAdvanced());
// return operationVisible;
// }
//
// public boolean computeResultVisible(PageTaskEdit parentPage) {
// resultVisible = !parentPage.isEdit()
// && parentPage.isReadable(TaskType.F_RESULT)
// && (parentPage.isShowAdvanced() || !parentPage.getTaskDto().isWorkflow());
// return resultVisible;
// }
//
// public boolean computeErrorsVisible(PageTaskEdit parentPage) {
// //TODO what are the correct visibility conditions?
// errorsVisible = !parentPage.isEdit()
// && (parentPage.isShowAdvanced() || !parentPage.getTaskDto().isWorkflow());
// return errorsVisible;
// }
//
// public void computeAll(PageTaskEdit parentPage) {
// computeBasicVisible(parentPage);
// computeSchedulingVisible(parentPage);
// computeSubtasksAndThreadsVisible(parentPage);
// computeProgressVisible(parentPage);
// computeEnvironmentalPerformanceVisible(parentPage);
// computeOperationVisible(parentPage);
// computeResultVisible(parentPage);
// computeErrorsVisible(parentPage);
// }
public boolean computeBasicVisible(PageTask parentPage, TaskType task) {
basicVisible = !WebComponentUtil.isWorkflowTask(task);
return basicVisible;
}

public boolean computeSchedulingVisible(PageTask parentPage, TaskType task) {
schedulingVisible = !WebComponentUtil.isWorkflowTask(task);
return schedulingVisible;
}

public boolean computeSubtasksAndThreadsVisible(PageTask parentPage, PrismObjectWrapper<TaskType> taskWrapper) {
boolean isThreadsReadable = isTaskItemReadable(taskWrapper, ItemPath.create(TaskType.F_EXTENSION, SchemaConstants.MODEL_EXTENSION_WORKER_THREADS));
TaskType task = taskWrapper.getObject().asObjectable();
if (parentPage.isEditingFocus() && !WebComponentUtil.isWorkflowTask(taskWrapper.getObject().asObjectable())) {
subtasksAndThreadsVisible = configuresWorkerThreads(task) && isThreadsReadable
|| !CollectionUtils.isNotEmpty(task.getSubtask());
} else {
subtasksAndThreadsVisible = false;
}
return subtasksAndThreadsVisible;
}

public boolean configuresWorkerThreads(TaskType task) {
return isReconciliation(task) || isImport(task) || isRecomputation(task) || isExecuteChanges(task.getHandlerUri())
|| isShadowIntegrityCheck(task.getHandlerUri()) || isFocusValidityScanner(task.getHandlerUri()) || isTriggerScanner(task.getHandlerUri());
}

public boolean computeEnvironmentalPerformanceVisible(PageTask parentPage, PrismObjectWrapper<TaskType> taskWrapper) {
final OperationStatsType operationStats = taskWrapper.getObject().asObjectable().getOperationStats();
environmentalPerformanceVisible = !parentPage.isEditingFocus()
&& isTaskItemReadable(taskWrapper, TaskType.F_OPERATION_STATS)
&& operationStats != null
&& !StatisticsUtil.isEmpty(operationStats.getEnvironmentalPerformanceInformation());
return environmentalPerformanceVisible;
}

public boolean computeInternalPerformanceVisible(PageTask parentPage, PrismObjectWrapper<TaskType> taskWrapper) {
environmentalPerformanceVisible = !parentPage.isEditingFocus()
&& isTaskItemReadable(taskWrapper, TaskType.F_OPERATION_STATS)
&& taskWrapper.getObject().asObjectable().getOperationStats() != null;
return environmentalPerformanceVisible;
}

public boolean computeOperationVisible(PageTask parentPage, PrismObjectWrapper<TaskType> taskWrapper) {
PrismContainerWrapper lensContext = null;
try{
lensContext = taskWrapper.findContainer(TaskType.F_MODEL_OPERATION_CONTEXT);
} catch (SchemaException ex){
LOGGER.warn("Unable to find modelOperationContext in task {}", taskWrapper.getObject().asObjectable());
}
operationVisible = !parentPage.isEditingFocus()
&& isTaskItemReadable(taskWrapper, TaskType.F_MODEL_OPERATION_CONTEXT)
&& lensContext != null && !lensContext.isEmpty()
&& !WebComponentUtil.isWorkflowTask(taskWrapper.getObject().asObjectable());
return operationVisible;
}

public boolean computeResultVisible(PageTask parentPage, PrismObjectWrapper<TaskType> taskWrapper) {
resultVisible = !parentPage.isEditingFocus()
&& isTaskItemReadable(taskWrapper, TaskType.F_RESULT)
&& !WebComponentUtil.isWorkflowTask(taskWrapper.getObject().asObjectable());
return resultVisible;
}

public boolean computeErrorsVisible(PageTask parentPage, TaskType task) {
errorsVisible = !parentPage.isEditingFocus()
&& !WebComponentUtil.isWorkflowTask(task);
return errorsVisible;
}

public void computeAll(PageTask parentPage, PrismObjectWrapper<TaskType> taskWrapper) {
computeBasicVisible(parentPage, taskWrapper.getObject().asObjectable());
computeSchedulingVisible(parentPage, taskWrapper.getObject().asObjectable());
computeSubtasksAndThreadsVisible(parentPage, taskWrapper);
computeProgressVisible(parentPage);
computeEnvironmentalPerformanceVisible(parentPage, taskWrapper);
computeOperationVisible(parentPage, taskWrapper);
computeResultVisible(parentPage, taskWrapper);
computeErrorsVisible(parentPage, taskWrapper.getObject().asObjectable());
}

public boolean computeProgressVisible(PageTask parentPage) {
progressVisible = !parentPage.isEditingFocus();
return progressVisible;
}

private boolean isShadowIntegrityCheck(String handlerUri) {
return ModelPublicConstants.SHADOW_INTEGRITY_CHECK_TASK_HANDLER_URI.equals(handlerUri);
}

private boolean isFocusValidityScanner(String handlerUri) {
return ModelPublicConstants.FOCUS_VALIDITY_SCANNER_TASK_HANDLER_URI.equals(handlerUri)
|| ModelPublicConstants.DEPRECATED_FOCUS_VALIDITY_SCANNER_TASK_HANDLER_URI.equals(handlerUri);
}

private boolean isTriggerScanner(String handlerUri) {
return ModelPublicConstants.TRIGGER_SCANNER_TASK_HANDLER_URI.equals(handlerUri);
}

private boolean isExecuteChanges(String handlerUri) {
return ModelPublicConstants.EXECUTE_CHANGES_TASK_HANDLER_URI.equals(handlerUri);
}

private boolean isReconciliation(TaskType task){
ObjectReferenceType archetypeRef = getArchetypeReference(task);
if (archetypeRef == null){
return false;
}
return SystemObjectsType.ARCHETYPE_RECONCILIATION_TASK.value().equals(archetypeRef.getOid());
}

private boolean isRecomputation(TaskType task){
ObjectReferenceType archetypeRef = getArchetypeReference(task);
if (archetypeRef == null){
return false;
}
return SystemObjectsType.ARCHETYPE_RECOMPUTATION_TASK.value().equals(archetypeRef.getOid());
}

private boolean isImport(TaskType task){
ObjectReferenceType archetypeRef = getArchetypeReference(task);
if (archetypeRef == null){
return false;
}
return SystemObjectsType.ARCHETYPE_IMPORT_TASK.value().equals(archetypeRef.getOid());
}

private ObjectReferenceType getArchetypeReference(TaskType task) {
ObjectReferenceType archetypeRef = null;
if (task.getAssignment() == null || task.getAssignment().size() == 0) {
return archetypeRef;
}
for (AssignmentType assignment : task.getAssignment()) {
if (StringUtils.isNotEmpty(assignment.getTargetRef().getOid())
&& assignment.getTargetRef() != null && QNameUtil.match(assignment.getTargetRef().getType(), ArchetypeType.COMPLEX_TYPE)) {
archetypeRef = assignment.getTargetRef();
}
}
return archetypeRef;
}

private boolean isTaskItemReadable(PrismObjectWrapper<TaskType> taskWrapper, ItemPath itemPath){
ItemWrapper taskProperty = null;
try {
taskProperty = taskWrapper.findProperty(itemPath);
} catch (SchemaException ex){
LOGGER.warn("Unable to find {} property in task object {}, {}", itemPath,
taskWrapper.getObject().asObjectable(), ex.getLocalizedMessage());
}
return taskProperty != null && taskProperty.canRead();
}

public boolean isBasicVisible() {
return basicVisible;
Expand Down
Expand Up @@ -21462,6 +21462,13 @@
</xsd:appinfo>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="00000000-0000-0000-0000-000000000502">
<xsd:annotation>
<xsd:appinfo>
<jaxb:typesafeEnumMember name="ARCHETYPE_RECOMPUTATION_TASK"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="00000000-0000-0000-0000-000000000503">
<xsd:annotation>
<xsd:appinfo>
Expand Down
Expand Up @@ -40,5 +40,6 @@ public class ModelPublicConstants {
public static final String SCRIPT_EXECUTION_TASK_HANDLER_URI = SchemaConstants.NS_MODEL + "/scripting/handler-3";
public static final String ITERATIVE_SCRIPT_EXECUTION_TASK_HANDLER_URI = SchemaConstants.NS_MODEL + "/iterative-scripting/handler-3";
public static final String EXECUTE_DELTAS_TASK_HANDLER_URI = SchemaConstants.NS_MODEL + "/execute-deltas/handler-3";
public static final String EXECUTE_CHANGES_TASK_HANDLER_URI = NS_SYNCHRONIZATION_TASK_PREFIX + "/execute/handler-3";
public static final String DELETE_NOT_UPDATE_SHADOW_TASK_HANDLER_URI = NS_SYNCHRONIZATION_TASK_PREFIX + "/delete-not-updated-shadow/handler-3";
}

0 comments on commit 20e262e

Please sign in to comment.