/*******************************************************************************
* Copyright (c) 2012 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.eef.cdo.runtime.policies;
import java.util.List;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.eef.cdo.runtime.provider.ICDOLockStrategyProvider;
import org.eclipse.emf.eef.cdo.runtime.service.CDOLockStrategyProviderService;
import org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent;
import org.eclipse.emf.eef.runtime.impl.components.SinglePartPropertiesEditingComponent;
import org.eclipse.emf.eef.runtime.impl.parts.CompositePropertiesEditionPart;
import org.eclipse.emf.eef.runtime.policies.ILockPolicy;
import org.eclipse.emf.eef.runtime.ui.widgets.settings.EEFEditorSettings;
import org.eclipse.emf.eef.runtime.ui.widgets.settings.EEFEditorSettingsBuilder.EEFEditorSettingsImpl;
import org.eclipse.emf.spi.cdo.FSMUtil;
/**
* Lock policy for EEF wizard : lock the semantic elements and its EEFEditorSettings for SmartModelNavigation.
*
* @author <a href="mailto:nathalie.lepine@obeo.fr">Nathalie Lepine</a>
*
*/
public class EEFWizardLockPolicy implements ILockPolicy {
/**
* (non-Javadoc)
*
* @see org.eclipse.emf.eef.runtime.policies.ILockPolicy#lock(org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent)
*/
public void lock(IPropertiesEditionComponent propertiesEditingComponent) {
lock(propertiesEditingComponent.getEditingContext().getEObject());
if (propertiesEditingComponent instanceof SinglePartPropertiesEditingComponent && ((SinglePartPropertiesEditingComponent) propertiesEditingComponent).getEditingPart() instanceof CompositePropertiesEditionPart) {
lock(((CompositePropertiesEditionPart) ((SinglePartPropertiesEditingComponent) propertiesEditingComponent).getEditingPart()).getSettings());
}
}
private void lock(List<EEFEditorSettings> allSettings) {
for (EEFEditorSettings eefEditorSettings : allSettings) {
if (eefEditorSettings instanceof EEFEditorSettingsImpl) {
EObject significantObject = ((EEFEditorSettingsImpl) eefEditorSettings)
.getSignificantObject();
if (significantObject != null) {
lock(significantObject);
}
}
}
}
private void lock(EObject eObject) {
if (eObject != null && eObject.eResource() instanceof CDOResource) {
CDOObject cdoObject = CDOUtil.getCDOObject(eObject);
if (cdoObject != null && !FSMUtil.isTransient(cdoObject)) {
if (!CDOLockStrategyProviderService.getInstance().getProviders()
.isEmpty()) {
for (ICDOLockStrategyProvider provider : CDOLockStrategyProviderService.getInstance().getProviders()) {
provider.lock(cdoObject);
}
} else if (cdoObject.cdoWriteLock() != null) {
cdoObject.cdoWriteLock().tryLock();
}
}
}
}
private void unlock(List<EEFEditorSettings> allSettings) {
for (EEFEditorSettings eefEditorSettings : allSettings) {
if (eefEditorSettings instanceof EEFEditorSettingsImpl) {
EObject significantObject = ((EEFEditorSettingsImpl) eefEditorSettings)
.getSignificantObject();
if (significantObject != null) {
unlock(significantObject);
}
}
}
}
private void unlock(EObject eObject) {
if (eObject != null && eObject.eResource() instanceof CDOResource) {
CDOObject cdoObject = CDOUtil.getCDOObject(eObject);
if (cdoObject != null && !FSMUtil.isTransient(cdoObject) && cdoObject.cdoView() instanceof CDOTransaction) {
if (!CDOLockStrategyProviderService.getInstance().getProviders()
.isEmpty()) {
for (ICDOLockStrategyProvider provider : CDOLockStrategyProviderService.getInstance().getProviders()) {
provider.release(cdoObject);
}
} else if (cdoObject.cdoWriteLock() != null) {
cdoObject.cdoWriteLock().unlock();
}
}
}
}
/**
* (non-Javadoc)
*
* @see org.eclipse.emf.eef.runtime.policies.ILockPolicy#release(org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent)
*/
public void release(IPropertiesEditionComponent propertiesEditingComponent) {
unlock(propertiesEditingComponent.getEditingContext().getEObject());
if (propertiesEditingComponent instanceof SinglePartPropertiesEditingComponent && ((SinglePartPropertiesEditingComponent) propertiesEditingComponent).getEditingPart() instanceof CompositePropertiesEditionPart) {
unlock(((CompositePropertiesEditionPart) ((SinglePartPropertiesEditingComponent) propertiesEditingComponent).getEditingPart()).getSettings());
}
}
}