blob: 3c6e1dbf2a789cf236f8d5b962fceb8ca9398e6f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2011 Chair for Applied Software Engineering,
* Technische Universitaet Muenchen.
* 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:
******************************************************************************/
package org.eclipse.emf.emfstore.client.model.changeTracking.notification.filter;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.emfstore.client.model.changeTracking.notification.NotificationInfo;
import org.eclipse.emf.emfstore.common.model.impl.ProjectImpl;
import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
/**
* Filter to ignore Reference Notifications to Elements outside of the project.
*
* @author koegel
*/
public class IgnoreOutsideProjectReferencesFilter implements NotificationFilter {
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.client.model.changeTracking.notification.filter.NotificationFilter#check(org.eclipse.emf.emfstore.client.model.changeTracking.notification.NotificationInfo)
*/
public boolean check(NotificationInfo notificationInfo) {
ProjectImpl project = (ProjectImpl) ModelUtil.getProject(notificationInfo.getNotifierModelElement());
if (project == null) {
return false;
}
if (!notificationInfo.isReferenceNotification()) {
return false;
}
if (!(notificationInfo.getFeature() instanceof EReference)) {
return false;
}
EReference reference = (EReference) notificationInfo.getFeature();
if (reference.isContainer() || reference.isContainment()) {
return false;
}
// we have a reference feature notification
if (notificationInfo.getNewValue() != null && notificationInfo.getNewValue() instanceof List) {
return checkNewValueList(notificationInfo, project);
} else if (notificationInfo.getOldValue() != null && notificationInfo.getOldValue() instanceof List) {
return checkOldValueList(notificationInfo, project);
} else {
return checkSingleReference(notificationInfo, project);
}
}
private boolean checkSingleReference(NotificationInfo notificationInfo, ProjectImpl project) {
// if new value is in project then do NOT filter
if (notificationInfo.getOldValue() != null && !notificationInfo.isMoveEvent()
&& isOrWasInProject(project, notificationInfo.getOldModelElementValue())) {
return false;
}
// if old value is in project then do NOT filter
if (notificationInfo.getNewValue() != null
&& isOrWasInProject(project, notificationInfo.getNewModelElementValue())) {
return false;
}
// neither old nor new value are in project => filter
return true;
}
@SuppressWarnings("unchecked")
private boolean checkOldValueList(NotificationInfo notificationInfo, ProjectImpl project) {
for (EObject referencedElement : ((List<EObject>) notificationInfo.getOldValue())) {
if (isOrWasInProject(project, referencedElement)) {
return false;
}
}
// all referenced elements are NOT in the project
return true;
}
@SuppressWarnings("unchecked")
private boolean checkNewValueList(NotificationInfo notificationInfo, ProjectImpl project) {
for (EObject referencedElement : ((List<EObject>) notificationInfo.getNewValue())) {
if (isOrWasInProject(project, referencedElement)) {
return false;
}
}
// all referenced elements are NOT in the project
return true;
}
private boolean isOrWasInProject(ProjectImpl project, EObject referencedElement) {
boolean b = project.containsInstance(referencedElement)
|| project.getDeletedModelElementId(referencedElement) != null;
return b;
}
}