blob: 501dd04fe2c651fde3d0a6d4abe626a780f62d6a [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 v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* CEA LIST - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.cdo.internal.ui.decorators;
import java.util.Collections;
import java.util.Set;
import org.eclipse.emf.cdo.dawn.spi.DawnState;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import com.google.common.collect.Sets;
/**
* An adapter that caches the current Dawn
*/
public class CDOStateAdapter
extends AdapterImpl {
private DawnState state = DawnState.CLEAN;
CDOStateAdapter() {
super();
}
public static CDOStateAdapter require(Notifier notifier) {
CDOStateAdapter result = get(notifier);
if (result == null) {
result = new CDOStateAdapter();
notifier.eAdapters().add(result);
}
return result;
}
public static CDOStateAdapter get(Notifier notifier) {
return (CDOStateAdapter) EcoreUtil.getExistingAdapter(notifier,
DawnState.class);
}
public static DawnState getState(Notifier notifier) {
CDOStateAdapter adapter = get(notifier);
return (adapter == null)
? DawnState.CLEAN
: adapter.getState();
}
public static void setState(Notifier notifier, DawnState state) {
if (state == DawnState.CLEAN) {
CDOStateAdapter adapter = get(notifier);
if (adapter != null) {
notifier.eAdapters().remove(adapter);
}
} else {
require(notifier).setState(state);
}
}
public static Iterable<CDOStateAdapter> getAll(ResourceSet resourceSet) {
Iterable<CDOStateAdapter> result;
Tracker tracker = Tracker.get(resourceSet);
if (tracker == null) {
result = Collections.emptySet();
} else {
result = tracker.getStateAdapters();
}
return result;
}
@Override
public boolean isAdapterForType(Object type) {
return type == DawnState.class;
}
public DawnState getState() {
return state;
}
public void setState(DawnState state) {
this.state = (state == null)
? DawnState.CLEAN
: state;
}
@Override
public void setTarget(Notifier newTarget) {
super.setTarget(newTarget);
if (newTarget instanceof EObject) {
Resource res = ((EObject) newTarget).eResource();
if (res != null) {
ResourceSet rset = res.getResourceSet();
if (rset != null) {
Tracker.require(rset).add(this);
}
}
}
}
@Override
public void unsetTarget(Notifier oldTarget) {
if (oldTarget instanceof EObject) {
Resource res = ((EObject) oldTarget).eResource();
if (res != null) {
ResourceSet rset = res.getResourceSet();
if (rset != null) {
Tracker tracker = Tracker.get(rset);
if (tracker != null) {
tracker.remove(this);
}
}
}
}
super.unsetTarget(oldTarget);
}
//
// Nested types
//
private static final class Tracker
extends AdapterImpl {
private final Set<CDOStateAdapter> stateAdapters = Sets.newHashSet();
static Tracker get(ResourceSet resourceSet) {
Tracker result = null;
for (Object next : resourceSet.eAdapters()) {
if (next instanceof Tracker) {
result = (Tracker) next;
break;
}
}
return result;
}
static Tracker require(ResourceSet resourceSet) {
Tracker result = get(resourceSet);
if (result == null) {
result = new Tracker();
resourceSet.eAdapters().add(result);
}
return result;
}
void add(CDOStateAdapter stateAdapter) {
stateAdapters.add(stateAdapter);
}
void remove(CDOStateAdapter stateAdapter) {
stateAdapters.remove(stateAdapter);
}
Iterable<CDOStateAdapter> getStateAdapters() {
return stateAdapters;
}
}
}