blob: 57f3e7a23130b3b469df73a3111d9fa659f9ca40 [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.testutils;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.impl.EEnumImpl;
import org.eclipse.emf.ecore.impl.EEnumLiteralImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
public class NotificationHelper {
public static class TestAdapter extends AdapterImpl {
private Notification noti = null;
@Override
public void notifyChanged(Notification notification) {
setNoti(notification);
}
/**
* @param noti
* the {@link Notification} to set
*/
void setNoti(Notification noti) {
this.noti = noti;
}
/**
* @return the {@link Notification}
*/
Notification getNoti() {
return noti;
}
}// TestAdapter
protected static Notification getNotificationfrom(TestAdapter adapter) {
Notification noti = adapter.getNoti();
// this adapter removes itself once a notification is caught
if (adapter.getTarget() != null) {
adapter.getTarget().eAdapters().remove(adapter);
}
return noti;
}
public static Notification createAttributeChangeNotification(EObject notifier, EAttribute feature, Object oldValue,
Object newValue) {
EDataType dataType = feature.getEAttributeType();
boolean validOldValue = oldValue == null || dataType.isInstance(oldValue)
|| (feature.isMany() && oldValue instanceof EList<?> && dataType.isInstance(((EList<?>) oldValue).get(0))
|| dataType instanceof EEnumImpl && oldValue instanceof EEnumLiteralImpl && ((EEnumLiteralImpl)oldValue).getEEnum().equals(dataType));
boolean validNewValue = dataType.isInstance(newValue)
|| (feature.isMany() && newValue instanceof EList<?> && dataType.isInstance(((EList<?>) newValue).get(0))
|| dataType instanceof EEnumImpl && newValue instanceof EEnumLiteralImpl && ((EEnumLiteralImpl)newValue).getEEnum().equals(dataType));
if (feature.isChangeable() && validOldValue && validNewValue) {
if (oldValue != null) {
notifier.eSet(feature, oldValue);
}
TestAdapter myTestA = new TestAdapter();
notifier.eAdapters().add(myTestA);
notifier.eSet(feature, newValue);
return getNotificationfrom(myTestA);
}
System.err.println("Warning! Invalid parameters for NotificationHelper#createAttributeChangeNotification");
return null;
}
@SuppressWarnings("unchecked")
public static Notification createReferenceAddNotification(EObject notifier, EReference feature, EObject objectToAdd) {
boolean validObjectToAdd = feature.getEType().isInstance(objectToAdd);
if (feature.isChangeable() && validObjectToAdd) {
TestAdapter myTestA = new TestAdapter();
notifier.eAdapters().add(myTestA);
if (feature.isMany()) {
Object ob = notifier.eGet(feature);
if (ob != null && ob instanceof EList<?>) {
((EList<EObject>) ob).add(objectToAdd);
} else {
System.err.println("Warning! Invalid parameters for NotificationHelper#createReferenceAddNotification");
return null;
}
} else {
notifier.eSet(feature, objectToAdd);
}
return getNotificationfrom(myTestA);
}
System.err.println("Warning! Invalid parameters for NotificationHelper#createReferenceAddNotification");
return null;
}
@SuppressWarnings("unchecked")
public static Notification createReferenceRemoveNotification(EObject notifier, EReference feature, EObject objectToRemove) {
boolean validObjectToAdd = feature.getEType().isInstance(objectToRemove);
if (feature.isChangeable() && validObjectToAdd) {
TestAdapter myTestA = new TestAdapter();
notifier.eAdapters().add(myTestA);
if (feature.isMany()) {
Object ob = notifier.eGet(feature);
if (ob != null && ob instanceof EList<?>) {
((EList<EObject>) ob).remove(objectToRemove);
} else {
System.err.println("Warning! Invalid parameters for NotificationHelper#createReferenceRemoveNotification");
return null;
}
} else {
notifier.eUnset(feature);
}
return getNotificationfrom(myTestA);
}
System.err.println("Warning! Invalid parameters for NotificationHelper#createReferenceRemoveNotification");
return null;
}
@SuppressWarnings("unchecked")
public static Notification createReferenceChangeNotification(EObject notifier, EReference feature, EObject from, EObject to) {
boolean validFrom = feature.getEType().isInstance(from) || (from == null && to != null);
boolean validTo = feature.getEType().isInstance(to) || (to == null && from != null);
if (feature.isChangeable() && validFrom && validTo) {
TestAdapter myTestA = new TestAdapter();
notifier.eAdapters().add(myTestA);
if (feature.isMany()) {
Object ob = notifier.eGet(feature);
if (ob != null && ob instanceof EList<?>) {
EList<EObject> newValue = (EList<EObject>) ob;
if (from != null) {
newValue.remove(from);
}
if (to != null) {
newValue.add(to);
}
notifier.eSet(feature, newValue);
} else {
System.err.println("Warning! Invalid parameters for NotificationHelper#createReferenceChangeNotification");
return null;
}
} else {
notifier.eSet(feature, to);
}
return getNotificationfrom(myTestA);
}
System.err.println("Warning! Invalid parameters for NotificationHelper#createReferenceChangeNotification");
return null;
}
@SuppressWarnings("unchecked")
public static Notification createElementAddNotification(Notifier container, EReference ref, EObject target) {
TestAdapter myTestA = new TestAdapter();
container.eAdapters().add(myTestA);
if (ref != null) {
if (ref.isMany()) {
Object ob = ((EObject) container).eGet(ref);
if (ob != null && ob instanceof EList<?>) {
((EList<EObject>) ob).add(target);
} else {
System.err.println("Warning! Invalid parameters for NotificationHelper#createElementAddNotification");
return null;
}
} else {
((EObject) container).eSet(ref, target);
}
} else {
// container is a Resource or ResourceSet
if (container instanceof Resource){
((Resource)container).getContents().add(target);
} else {
throw new IllegalArgumentException("Events for adding Resources to ResourceSets should not reach the ImpactAnalyzer.");
}
}
return getNotificationfrom(myTestA);
}
public static Notification createElementDeleteNotification(EObject target) {
TestAdapter myTestA = new TestAdapter();
if(target.eContainer() != null){
target.eContainer().eAdapters().add(myTestA);
}else{
//System.out.println("Resource delete");
target.eResource().eAdapters().add(myTestA);
}
EcoreUtil.delete(target);
return getNotificationfrom(myTestA);
}
public static Notification createNewElementAddToResourceNotification(EObject objectToAdd, Resource target) {
TestAdapter myTestA = new TestAdapter();
target.eAdapters().add(myTestA);
target.getContents().add(objectToAdd);
return getNotificationfrom(myTestA);
}
}