blob: a21932e775441c8589cf011ac9970cc657cc1d49 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2018 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* SAP AG - initial API and implementation
******************************************************************************/
package org.eclipse.ocl.examples.eventmanager;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
public class NotificationHelper {
/**
* Checks whether a {@link Notification} was caused by an attribute value change.
* @param n the {@link Notification} to check
* @return true if n was caused by an attribute value change, false otherwise
*/
public static boolean isAttributeValueChangeEvent(Notification n){
boolean result = false;
EStructuralFeature feature = getNotificationFeature(n);
if (feature != null){
result = feature instanceof EAttribute;
}
return result;
}
/**
* Checks whether a {@link Notification} was caused by a reference change.
* @param n the {@link Notification} to check
* @return true if n was caused by a reference change, false otherwise
*/
public static boolean isLinkLifeCycleEvent(Notification n) {
boolean result = false;
EStructuralFeature feature = getNotificationFeature(n);
if (feature != null){
result = feature instanceof EReference;
}
return result;
}
/**
* Checks whether a {@link Notification} was caused by an element creation/deletion.
* @param n the {@link Notification} to check
* @return true if n was caused by an element creation/deletion, false otherwise
*/
public static boolean isElementLifeCycleEvent(Notification n) {
// if there was an containment reference changed
if(n.getFeature()!=null && n.getFeature() instanceof EReference){
return ((EReference)n.getFeature()).isContainment();
}
// or an element was added / removed from a resource
else if(n.getFeature() == null && (n.getNotifier() instanceof Resource)){
return true;
}
return false;
}
/**
* Get the {@link EStructuralFeature} whose change caused the notification
* @param n the {@link Notification} to check
* @return the {@link EStructuralFeature} whose change caused the notification
*/
public static EStructuralFeature getNotificationFeature(Notification n){
return n.getFeature()==null?null:(EStructuralFeature)n.getFeature();
}
/**
* Checks whether the given event contains is a Many Event
* if true, one can handle the old/newValue objects as Lists
* @param event the {@link Notification} to check
* @return {@link Boolean} <code>true</code> if is a many notification
*/
public static boolean isManyEvent(Notification event) {
switch (event.getEventType()) {
case Notification.ADD_MANY:
case Notification.REMOVE_MANY:
return true;
}
return false;
}
/**
* Checks whether the given event represent an add of a value to the model.
* @param event {@link Notification} to check
* @return <code>true</code> if there is an {@link Notification#ADD} or {@link Notification#ADD_MANY} or a {@link Notification#SET} which set not to null
*/
public static boolean isAddEvent(Notification event) {
switch (event.getEventType()) {
case Notification.ADD:
case Notification.ADD_MANY:
return true;
case Notification.SET:
return event.getNewValue()!=null;
}
return false;
}
}