/******************************************************************************* | |
* Copyright (c) 2004-2011 Abel Hegedus and Daniel Varro | |
* 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: | |
* Abel Hegedus - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.viatra2.core.tracebased; | |
import org.eclipse.viatra2.core.EDeleteSemantics; | |
import org.eclipse.viatra2.core.IEntity; | |
import org.eclipse.viatra2.core.IModelElement; | |
import org.eclipse.viatra2.core.IModelManager; | |
import org.eclipse.viatra2.core.IRelation; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObject; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectCreateEntity; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectCreateInstanceOf; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectCreateRelation; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectCreateSupertypeOf; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectDeleteContainment; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectDeleteEntity; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectDeleteInstanceOf; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectDeleteRelation; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectDeleteSupertypeOf; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectMoveTo; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectSetName; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectSetRelationFrom; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectSetRelationTo; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectSetValue; | |
import org.eclipse.viatra2.core.notification.ICoreNotificationObjectSetViewInfo; | |
import org.eclipse.viatra2.core.notification.NotificationType; | |
import org.eclipse.viatra2.core.simple.SimpleEntity; | |
import org.eclipse.viatra2.core.simple.SimpleModelElement; | |
import org.eclipse.viatra2.core.simple.SimpleRelation; | |
import org.eclipse.viatra2.errors.VPMCoreException; | |
import org.eclipse.viatra2.errors.VPMCoreNullParameterException; | |
import org.eclipse.viatra2.framework.IFramework; | |
import org.eclipse.viatra2.logger.Logger; | |
/** | |
* @author Abel Hegedus | |
* | |
*/ | |
public class TraceNotificationProcessor { | |
private TraceModelManager mManager; | |
private Logger logger; | |
/** | |
* | |
*/ | |
public TraceNotificationProcessor(TraceTreeManager manager, IFramework fw, IModelManager mManager) { | |
this.mManager = (TraceModelManager) mManager; | |
logger = fw.getLogger(); | |
} | |
public boolean doExecuteEvent(ICoreNotificationObject note) throws TraceException{ | |
// based on the event type and contents, manipulate the model | |
try{ | |
NotificationType action = note.getActionTypeEnum(); | |
switch(action){ | |
case ACTION_ATOMIC_STEP_READY: | |
return false; | |
case ACTION_CREATE_ENTITY: | |
ICoreNotificationObjectCreateEntity _note = (ICoreNotificationObjectCreateEntity) note; | |
IEntity ent = _note.getCreated(); | |
mManager.undoCreateEntity((SimpleEntity)ent, (SimpleEntity)_note.getContainer()); | |
mManager.undoCreateContainment((SimpleEntity) _note.getContainer(), (SimpleEntity) ent); | |
return true; | |
case ACTION_DELETE_ENTITY: | |
ICoreNotificationObjectDeleteEntity _note1 = (ICoreNotificationObjectDeleteEntity) note; | |
IEntity ent1 = _note1.getDeleted(); | |
mManager.deleteEntity(ent1, EDeleteSemantics.DELETE_SEMANTICS_FORCE); | |
return true; | |
case ACTION_CREATE_RELATION: | |
ICoreNotificationObjectCreateRelation _note2 = (ICoreNotificationObjectCreateRelation) note; | |
IRelation rel = _note2.getNewRelation(); | |
mManager.undoCreateRelation((SimpleRelation) rel, | |
(SimpleModelElement) _note2.getFrom(), | |
(SimpleModelElement) _note2.getTo()); | |
return true; | |
case ACTION_DELETE_RELATION: | |
ICoreNotificationObjectDeleteRelation _note3 = (ICoreNotificationObjectDeleteRelation) note; | |
mManager.deleteRelation(_note3.getDeleted(), EDeleteSemantics.DELETE_SEMANTICS_FORCE); | |
return true; | |
case ACTION_CREATE_INSTANCEOF: | |
ICoreNotificationObjectCreateInstanceOf _note4 = (ICoreNotificationObjectCreateInstanceOf) note; | |
SimpleModelElement sup = (SimpleModelElement) _note4.getType(); | |
SimpleModelElement sub = (SimpleModelElement) _note4.getInstance(); | |
mManager.newInstanceOfEditor(sup, sub); | |
return true; | |
case ACTION_DELETE_INSTANCEOF: | |
ICoreNotificationObjectDeleteInstanceOf _note5 = (ICoreNotificationObjectDeleteInstanceOf) note; | |
sup = (SimpleModelElement) _note5.getType(); | |
sub = (SimpleModelElement) _note5.getInstance(); | |
mManager.deleteInstanceOfEditor(sup, sub); | |
return true; | |
case ACTION_CREATE_SUPERTYPEOF: | |
ICoreNotificationObjectCreateSupertypeOf _note6 = (ICoreNotificationObjectCreateSupertypeOf) note; | |
sup = (SimpleModelElement) _note6.getSuper(); | |
sub = (SimpleModelElement) _note6.getSub(); | |
mManager.newSupertypeOfEditor(sup, sub); | |
return true; | |
case ACTION_DELETE_SUPERTYPEOF: | |
ICoreNotificationObjectDeleteSupertypeOf _note7 = (ICoreNotificationObjectDeleteSupertypeOf) note; | |
sup = (SimpleModelElement) _note7.getSuper(); | |
sub = (SimpleModelElement) _note7.getSub(); | |
mManager.deleteSupertypeOfEditor(sup, sub); | |
return true; | |
case ACTION_DELETE_CONTAINMENT: | |
// ICoreNotificationObjectDeleteContainment _note8 = (ICoreNotificationObjectDeleteContainment) note; | |
// SimpleEntity container = (SimpleEntity) _note8.getParent(); | |
// SimpleEntity child = (SimpleEntity) _note8.getChild(); | |
// mManager.undoCreateContainment(container, child); | |
// FIXME only called from delete entity, we can ignore it | |
return false; | |
case ACTION_MOVE_ELEMENT_TO: | |
ICoreNotificationObjectMoveTo _note11 = (ICoreNotificationObjectMoveTo) note; | |
ent = (SimpleEntity) _note11.getElement(); | |
SimpleEntity to = (SimpleEntity) _note11.getNewContainer(); | |
mManager.moveEntityTo(ent, to); | |
return true; | |
case ACTION_SET_VALUE: | |
ICoreNotificationObjectSetValue _note9 = (ICoreNotificationObjectSetValue) note; | |
ent = (SimpleEntity) _note9.getEntity(); | |
String newValue = _note9.getNewValue(); | |
mManager.setValue(ent, newValue); | |
return true; | |
case ACTION_SET_NAME: | |
ICoreNotificationObjectSetName _note10 = (ICoreNotificationObjectSetName) note; | |
SimpleModelElement elem = (SimpleModelElement) _note10.getElement(); | |
String newName = _note10.getNewName(); | |
mManager.setName(elem, newName); | |
return true; | |
case ACTION_SET_RELATION_FROM: | |
ICoreNotificationObjectSetRelationFrom _note12 = (ICoreNotificationObjectSetRelationFrom) note; | |
rel = (SimpleRelation) _note12.getRelation(); | |
SimpleModelElement newFrom = (SimpleModelElement) _note12 | |
.getNewFrom(); | |
mManager.setRelationFrom(rel, newFrom); | |
return true; | |
case ACTION_SET_RELATION_TO: | |
ICoreNotificationObjectSetRelationTo _note13 = (ICoreNotificationObjectSetRelationTo) note; | |
rel = (SimpleRelation) _note13.getRelation(); | |
SimpleModelElement newTo = (SimpleModelElement) _note13.getNewTo(); | |
mManager.setRelationTo(rel, newTo); | |
return true; | |
case ACTION_SET_VIEW_INFO: | |
ICoreNotificationObjectSetViewInfo _note14 = (ICoreNotificationObjectSetViewInfo) note; | |
mManager.setViewInfo(_note14.getElement(), _note14.getNewViewInfo()); | |
return true; | |
case USER_MARK: | |
return false; | |
} | |
}catch (VPMCoreNullParameterException e) { | |
logger.fatal("Error performing doExecute; [VPMNullParameterException] message: " | |
+ e.getMessage()); | |
} catch (VPMCoreException e) { | |
throw (TraceException) new TraceException("Error performing doExecute; [VPMCoreException] message: " | |
+ e.getMessage()).fillInStackTrace(); | |
} | |
/* | |
* Added a comment to this code to stop the undo manager from throwing unnecessary error messages | |
* which slowes down undo operations. | |
throw new VPMCoreRuntimeException("undo step not defined for step:" | |
+ note.toString()); | |
*/ | |
//logger.warning("undo step not defined for step:"+ note.toString()); | |
return false; | |
} | |
public boolean undoEvent(ICoreNotificationObject note) throws TraceException{ | |
// based on the event type and contents, reverse the model manipulation (see undo manager) | |
try{ | |
NotificationType action = note.getActionTypeEnum(); | |
switch(action){ | |
case ACTION_ATOMIC_STEP_READY: | |
return false; | |
case ACTION_CREATE_ENTITY: | |
ICoreNotificationObjectCreateEntity _note = (ICoreNotificationObjectCreateEntity) note; | |
IEntity ent = _note.getCreated(); | |
mManager | |
.deleteEntity(ent, EDeleteSemantics.DELETE_SEMANTICS_FORCE); | |
return true; | |
case ACTION_DELETE_ENTITY: | |
ICoreNotificationObjectDeleteEntity _note1 = (ICoreNotificationObjectDeleteEntity) note; | |
IEntity ent1 = _note1.getDeleted(); | |
IEntity parent = _note1.getParent(); | |
mManager | |
.undoCreateEntity((SimpleEntity) ent1, (SimpleEntity) parent); | |
return true; | |
case ACTION_CREATE_RELATION: | |
ICoreNotificationObjectCreateRelation _note2 = (ICoreNotificationObjectCreateRelation) note; | |
IRelation rel = _note2.getNewRelation(); | |
mManager.deleteRelation(rel, | |
EDeleteSemantics.DELETE_SEMANTICS_FORCE); | |
return true; | |
case ACTION_DELETE_RELATION: | |
ICoreNotificationObjectDeleteRelation _note3 = (ICoreNotificationObjectDeleteRelation) note; | |
mManager.undoCreateRelation((SimpleRelation) _note3.getDeleted(), | |
(SimpleModelElement) _note3.getFrom(), | |
(SimpleModelElement) _note3.getTo()); | |
return true; | |
case ACTION_CREATE_INSTANCEOF: | |
ICoreNotificationObjectCreateInstanceOf _note4 = (ICoreNotificationObjectCreateInstanceOf) note; | |
SimpleModelElement sup = (SimpleModelElement) _note4.getType(); | |
SimpleModelElement sub = (SimpleModelElement) _note4.getInstance(); | |
mManager.deleteInstanceOfEditor(sup, sub); | |
return true; | |
case ACTION_DELETE_INSTANCEOF: | |
ICoreNotificationObjectDeleteInstanceOf _note5 = (ICoreNotificationObjectDeleteInstanceOf) note; | |
sup = (SimpleModelElement) _note5.getType(); | |
sub = (SimpleModelElement) _note5.getInstance(); | |
mManager.newInstanceOfEditor(sup, sub); | |
return true; | |
case ACTION_CREATE_SUPERTYPEOF: | |
ICoreNotificationObjectCreateSupertypeOf _note6 = (ICoreNotificationObjectCreateSupertypeOf) note; | |
sup = (SimpleModelElement) _note6.getSuper(); | |
sub = (SimpleModelElement) _note6.getSub(); | |
mManager.deleteSupertypeOfEditor(sup, sub); | |
return true; | |
case ACTION_DELETE_SUPERTYPEOF: | |
ICoreNotificationObjectDeleteSupertypeOf _note7 = (ICoreNotificationObjectDeleteSupertypeOf) note; | |
sup = (SimpleModelElement) _note7.getSuper(); | |
sub = (SimpleModelElement) _note7.getSub(); | |
mManager.newSupertypeOfEditor(sup, sub); | |
return true; | |
case ACTION_DELETE_CONTAINMENT: | |
ICoreNotificationObjectDeleteContainment _note8 = (ICoreNotificationObjectDeleteContainment) note; | |
SimpleEntity container = (SimpleEntity) _note8.getParent(); | |
SimpleEntity child = (SimpleEntity) _note8.getChild(); | |
mManager.undoCreateContainment(container, child); | |
return true; | |
case ACTION_SET_VALUE: | |
ICoreNotificationObjectSetValue _note9 = (ICoreNotificationObjectSetValue) note; | |
ent = (SimpleEntity) _note9.getEntity(); | |
String oldValue = _note9.getOldValue(); | |
mManager.setValue(ent, oldValue); | |
return true; | |
case ACTION_SET_NAME: | |
ICoreNotificationObjectSetName _note10 = (ICoreNotificationObjectSetName) note; | |
SimpleModelElement elem = (SimpleModelElement) _note10.getElement(); | |
String oldName = _note10.getOldName(); | |
mManager.setName(elem, oldName); | |
return true; | |
case ACTION_MOVE_ELEMENT_TO: | |
ICoreNotificationObjectMoveTo _note11 = (ICoreNotificationObjectMoveTo) note; | |
ent = (SimpleEntity) _note11.getElement(); | |
SimpleEntity from = (SimpleEntity) _note11.getOldContainer(); | |
mManager.moveEntityTo(ent, from); | |
return true; | |
case ACTION_SET_RELATION_FROM: | |
ICoreNotificationObjectSetRelationFrom _note12 = (ICoreNotificationObjectSetRelationFrom) note; | |
rel = (SimpleRelation) _note12.getRelation(); | |
SimpleModelElement oldFrom = (SimpleModelElement) _note12 | |
.getOldFrom(); | |
mManager.setRelationFrom(rel, oldFrom); | |
return true; | |
case ACTION_SET_RELATION_TO: | |
ICoreNotificationObjectSetRelationTo _note13 = (ICoreNotificationObjectSetRelationTo) note; | |
rel = (SimpleRelation) _note13.getRelation(); | |
SimpleModelElement oldTo = (SimpleModelElement) _note13.getOldTo(); | |
mManager.setRelationTo(rel, oldTo); | |
return true; | |
case ACTION_SET_VIEW_INFO: | |
undoSetViewInfo((ICoreNotificationObjectSetViewInfo) note); | |
return true; | |
case USER_MARK: | |
return false; | |
} | |
}catch (VPMCoreNullParameterException e) { | |
logger.fatal("Error performing undo; [VPMNullParameterException] message: " | |
+ e.getMessage()); | |
} catch (VPMCoreException e) { | |
throw (TraceException) new TraceException("Error performing undo; [VPMCoreException] message: " | |
+ e.getMessage()).fillInStackTrace(); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
/* | |
* Added a comment to this code to stop the undo manager from throwing unnecessary error messages | |
* which slowes down undo operations. | |
throw new VPMCoreRuntimeException("undo step not defined for step:" | |
+ note.toString()); | |
*/ | |
//logger.warning("undo step not defined for step:"+ note.toString()); | |
return false; | |
} | |
void undoSetViewInfo(ICoreNotificationObjectSetViewInfo note) { | |
IModelElement me = note.getElement(); | |
String oldViewInfo = note.getOldViewInfo(); | |
try { | |
mManager.setViewInfo(me, oldViewInfo); | |
} catch (VPMCoreException e) { | |
logger.fatal("Error performing undo; message: " + e.getMessage()); | |
// e.printStackTrace(); | |
} | |
} | |
} |