| /***************************************************************************** |
| * 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; |
| } |
| |
| } |