/*******************************************************************************
* Copyright (c) 2016 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.lang.tooling.common.ops;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;
import melnorme.utilbox.concurrency.ICancelMonitor;
import melnorme.utilbox.concurrency.OperationCancellation;
import melnorme.utilbox.core.CommonException;
public interface IOperationMonitor extends ICancelMonitor {
String getOperationName();
void setTaskLabel(String taskLabel);
abstract IOperationSubMonitor enterSubTask(String subTaskName);
default void runSubTask(String subTaskName, Operation subOp) throws CommonException, OperationCancellation {
try(IOperationSubMonitor subMonitor = enterSubTask(subTaskName)) {
subOp.execute(subMonitor);
}
}
/* ----------------- ----------------- */
public abstract class BasicOperationMonitor implements IOperationMonitor {
protected final ICancelMonitor cm;
protected final String operationName; // can be null
public BasicOperationMonitor(ICancelMonitor cm) {
this(cm, null, true);
}
public BasicOperationMonitor(ICancelMonitor cm, String operationName, boolean initialize) {
this.cm = assertNotNull(cm);
this.operationName = operationName;
if(initialize) {
initializeLabel();
}
}
@Override
public final boolean isCancelled() {
return cm.isCancelled();
}
@Override
public String getOperationName() {
return operationName;
}
public void initializeLabel() {
if(getOperationName() != null) {
setTaskLabel(getOperationName());
}
}
@Override
public IOperationSubMonitor enterSubTask(String subTaskName) {
return new OperationSubMonitor(this, subTaskName);
}
}
public static interface IOperationSubMonitor extends IOperationMonitor, AutoCloseable {
@Override
abstract void close();
}
public class OperationSubMonitor extends BasicOperationMonitor implements IOperationSubMonitor {
protected final IOperationMonitor parentMonitor;
protected final String originalTaskName;
public OperationSubMonitor(IOperationMonitor parentMonitor, String operationName) {
super(parentMonitor, operationName, false);
this.parentMonitor = assertNotNull(parentMonitor);
this.originalTaskName = parentMonitor.getOperationName();
initializeLabel();
}
@Override
public void close() {
if(originalTaskName != null) {
parentMonitor.setTaskLabel(originalTaskName);
}
}
@Override
public void setTaskLabel(String taskName) {
parentMonitor.setTaskLabel(taskName);
}
}
public class NullOperationMonitor extends BasicOperationMonitor {
public NullOperationMonitor() {
this(new NullCancelMonitor());
}
public NullOperationMonitor(ICancelMonitor cm) {
super(cm, null, true);
}
@Override
public void setTaskLabel(String taskName) {
// Do nothing
}
}
/* ----------------- ----------------- */
public class DelegatingOperationMonitor implements IOperationMonitor {
protected final IOperationMonitor om;
public DelegatingOperationMonitor(IOperationMonitor om) {
this.om = assertNotNull(om);
}
@Override
public boolean isCancelled() {
return om.isCancelled();
}
@Override
public String getOperationName() {
return om.getOperationName();
}
@Override
public void setTaskLabel(String taskLabel) {
om.setTaskLabel(taskLabel);
}
@Override
public IOperationSubMonitor enterSubTask(String subTaskName) {
return new OperationSubMonitor(this, subTaskName);
}
}
}