blob: 532da0ad8deb8e1e43ab0f3b8fdadc76ac236181 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2013, 2017 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* CEA LIST - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.cdo.internal.core.importer;
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.papyrus.cdo.core.importer.IModelTransferOperation;
/**
* This is the ReentrantOperationContext type. Enjoy.
*/
public class ReentrantOperationContext
implements IModelTransferOperation.Context {
private final IModelTransferOperation.Context delegate;
private AtomicInteger depth = new AtomicInteger();
public ReentrantOperationContext(IModelTransferOperation.Context delegate) {
super();
this.delegate = delegate;
}
@Override
public Diagnostic run(IModelTransferOperation operation) {
Diagnostic result;
try {
if (depth.getAndIncrement() == 0) {
// let the delegate run it
result = delegate.run(operation);
} else {
// run it directly, assuming we are still in the context of the
// delegate
result = operation.run(new NullProgressMonitor());
}
} finally {
depth.decrementAndGet();
}
return result;
}
}