blob: 3a5c54abc006abf5afa7817c608c0a4eaa8ef480 [file] [log] [blame]
@namespace(uri="http://comrel/0.1", prefix="comrel")
@gmf(foo="bar")
package comrel;
@gmf.diagram(foo="bar", onefile="false")
class CompositeRefactoring extends ModelRefactoring{
val RefactoringUnit[1] mainRefactoringUnit;
val PortMapping[*] portMappings;
val ModelRefactoring[*] modelRefactorings;
val Helper[*] helper;
attr MappingVisualization[1] mappingVisualization = 0;
attr String customInitialCondition;
attr String customFinalCondition;
}
abstract interface NamedElement {
attr String name;
}
abstract interface DescribedElement {
attr String description;
}
abstract class RefactoringUnit extends NamedElement {
op InputPort[*] getAllInputPorts();
attr int seqExecutionOrder;
op void setSeqExecutionOrder(int seqExecutionOrder, boolean superCall);
op void setName(String newName, boolean updateContainer);
}
class ModelRefactoring extends NamedElement, DescribedElement{
attr String[1] refId;
attr String[1] label;
attr String[1] namespaceUri;
val SingleInputPort[*] inputPorts;
}
@gmf.node(foo="bar",label.icon="false",label="label,type",label.pattern="{0}:{1}")
class AtomicUnit extends RefactoringUnit {
@gmf.affixed(foo="bar")
val SingleInputPort[+] inputPorts;
attr String[1] unitId;
attr String[1] label;
attr String[1] namespaceUri;
readonly attr String type = "Atomic Unit";
ref ModelRefactoring[1] modelRefactoring;
attr boolean checkInitialConditionFlag = false;
attr boolean checkFinalConditionFlag = false;
}
abstract class CompositeUnit extends RefactoringUnit {
}
@gmf.node(foo="bar",label.icon="false",label="name,type,lblStrict",label.pattern="{0}:{1} -{2}-")
class SequentialUnit extends CompositeUnit {
@gmf.compartment(foo="bar")
val HelperUnit[*] helperUnits;
@gmf.compartment(foo="bar")
val RefactoringUnit[+] refactoringUnits;
@gmf.affixed(foo="bar")
val InputPort[+] inputPorts;
attr boolean strict = true;
readonly attr String type = "Sequential Unit";
attr String lblStrict = "strict";
op void updateSeqExecutionOrder();
}
@gmf.node(foo="bar",label.icon="false",label="name,type,spec",label.pattern="{0}:{1} -{2}-")
class ConditionCheck extends NamedElement, DescribedElement {
readonly attr String type = "Condition Check";
attr String spec;
}
@gmf.node(foo="bar",label.icon="false",label="name,type",label.pattern="{0}:{1}")
class ConditionalUnit extends CompositeUnit {
@gmf.compartment(foo="bar")
val ConditionCheck[1] if;
@gmf.compartment(foo="bar")
val HelperUnit[*] helperUnits;
@gmf.compartment(foo="bar")
val RefactoringUnit[1] then;
@gmf.compartment(foo="bar")
val RefactoringUnit else;
@gmf.affixed(foo="bar")
val InputPort[+] inputPorts;
readonly attr String type = "Conditional Unit";
}
abstract class QueuedUnit extends CompositeUnit {
op void init();
attr boolean strict = true;
}
@gmf.node(foo="bar",label.icon="false",label="name,type,lblStrict",label.pattern="{0}:{1} -{2}-")
class SingleQueuedUnit extends QueuedUnit {
@gmf.compartment(foo="bar")
val HelperUnit[*] helperUnits;
@gmf.compartment(foo="bar")
val RefactoringUnit[1] refactoringUnit;
@gmf.affixed(foo="bar")
val SingleInputPort[*] singleInputPorts;
@gmf.affixed(foo="bar")
val MultiInputPort[1] multiInputPort;
readonly attr String type = "Single Queued Unit";
attr String lblStrict = "strict";
}
abstract class TwicedQueuedUnit extends QueuedUnit {
}
@gmf.node(foo="bar",label.icon="false",label="name,type,lblStrict",label.pattern="{0}:{1} -{2}-")
class CartesianQueuedUnit extends TwicedQueuedUnit {
@gmf.compartment(foo="bar")
val HelperUnit[*] helperUnits;
@gmf.compartment(foo="bar")
val RefactoringUnit[1] refactoringUnit;
@gmf.affixed(foo="bar")
val SingleInputPort[*] singleInputPorts;
@gmf.affixed(foo="bar")
unique val MultiInputPort[2] multiInputPorts;
readonly attr String type = "Cartesian Queued Unit";
attr String lblStrict = "strict";
}
@gmf.node(foo="bar",label.icon="false",label="name,type,lblStrict",label.pattern="{0}:{1} -{2}-")
class ParallelQueuedUnit extends TwicedQueuedUnit {
@gmf.compartment(foo="bar")
val HelperUnit[*] helperUnits;
@gmf.compartment(foo="bar")
val RefactoringUnit[1] refactoringUnits;
@gmf.affixed(foo="bar")
val SingleInputPort[*] singleInputPorts;
@gmf.affixed(foo="bar")
unique val MultiInputPort[2] multiInputPorts;
readonly attr String type = "Parallel Queued Unit";
attr String lblStrict = "strict";
}
abstract class HelperUnit extends NamedElement, DescribedElement {
attr String[1] helperUnitId;
attr String[1] namespaceUri;
op InputPort[1] getInputPort();
op OutputPort[1] getOutputPort();
}
abstract class FeatureUnit extends HelperUnit {
}
@gmf.node(foo="bar",label.icon="false",label="name,type",label.pattern="{0}:{1}")
class SingleFeatureUnit extends FeatureUnit {
@gmf.affixed(foo="bar")
val SingleInputPort[1] inputPort;
@gmf.affixed(foo="bar")
val MultiInputPort[*] secondaryInputPorts;
@gmf.affixed(foo="bar")
val SingleOutputPort[1] outputPort;
ref SingleFeatureHelper[1] singleFeatureHelper;
readonly attr String type = "Single Feature Unit";
}
@gmf.node(foo="bar",label.icon="false",label="name,type",label.pattern="{0}:{1}")
class MultiFeatureUnit extends FeatureUnit {
@gmf.affixed(foo="bar")
val SingleInputPort[1] inputPort;
@gmf.affixed(foo="bar")
val MultiInputPort[*] secondaryInputPorts;
@gmf.affixed(foo="bar")
val MultiOutputPort[1] outputPort;
ref MultiFeatureHelper[1] multiFeatureHelper;
readonly attr String type = "Multi Feature Unit";
}
abstract class FilterUnit extends HelperUnit {
}
@gmf.node(foo="bar",label.icon="false",label="name,type",label.pattern="{0}:{1}")
class SingleFilterUnit extends FilterUnit{
@gmf.affixed(foo="bar")
val MultiInputPort[1] inputPort;
@gmf.affixed(foo="bar")
val SingleOutputPort[1] outputPort;
ref SingleFilterHelper[1] singleFilterHelper;
readonly attr String type = "Single Filter Unit";
}
@gmf.node(foo="bar",label.icon="false",label="name,type",label.pattern="{0}:{1}")
class MultiFilterUnit extends FilterUnit{
@gmf.affixed(foo="bar")
val MultiInputPort[1] inputPort;
@gmf.affixed(foo="bar")
val MultiOutputPort[1] outputPort;
ref MultiFilterHelper[1] multiFilterHelper;
readonly attr String type = "Multi Filter Unit";
}
abstract class Helper extends NamedElement, DescribedElement{
attr String[1] helperId;
attr String[1] namespaceUri;
}
abstract class FeatureHelper extends Helper{
val SingleInputPort[1] inputPort;
val MultiInputPort[*] secondaryInputPorts;
}
class SingleFeatureHelper extends FeatureHelper{
val SingleOutputPort[1] outputPort;
}
class MultiFeatureHelper extends FeatureHelper{
val MultiOutputPort[1] outputPort;
}
abstract class FilterHelper extends Helper{
val MultiInputPort[1] inputPort;
}
class SingleFilterHelper extends FilterHelper{
val SingleOutputPort[1] outputPort;
}
class MultiFilterHelper extends FilterHelper{
val MultiOutputPort[1] outputPort;
}
@gmf.node(foo="bar",label="name,type",label.icon="false",label.placement="external",label.pattern="{0}:{1}")
abstract class Port extends NamedElement, DescribedElement {
attr Class[1] type;
op void setType(Class newType, boolean initiator);
op void updatePortName(String singularPortName);
op String getSingularPortName();
}
abstract class SinglePort extends Port{
attr Object value;
}
@gmf.node(border.color="255,0,0",border.width="10")
abstract class MultiPort extends Port{
attr Object[*] value;
}
@gmf.node(figure="rectangle", size="20,20")
abstract class InputPort extends Port{
op Boolean isMappingTarget();
op Boolean isRootPort();
}
@gmf.node(figure="ellipse",size="20,20")
abstract class OutputPort extends Port{
}
class SingleInputPort extends SinglePort, InputPort{
}
class MultiInputPort extends MultiPort, InputPort{
}
class SingleOutputPort extends SinglePort, OutputPort{
}
class MultiOutputPort extends MultiPort, OutputPort{
}
abstract class PortMapping {
op Port getSource();
op InputPort getTarget();
op void updatePortTypesAndNames(Class type, String singularPortName);
op void updateMappingNumber();
op void updateVisualization();
}
@gmf.link(source="source", target="target", style="dot", width="2",target.decoration="arrow")
class SinglePortMapping extends PortMapping {
ref SinglePort source;
ref SingleInputPort target;
}
@gmf.link(source="source", target="target", style="dot", width="2", target.decoration="arrow")
class MultiPortMapping extends PortMapping {
ref MultiPort source;
ref MultiInputPort target;
}
@gmf.link(source="source", target="target", style="dot", width="2",target.decoration="arrow",tool.small.bundle="name")
class MultiSinglePortMapping extends PortMapping {
ref MultiPort source;
ref SingleInputPort target;
}
enum MappingVisualization {
arrows = 0;
coloredPorts = 1;
indices = 2;
arrowsAndColoredPorts = 3;
arrowsAndIndices = 4;
}