| 1 |
comment |
|---|
| 2 |
vim:sw=4:et:syntax=python |
|---|
| 3 |
|
|---|
| 4 |
This is a file with custom definitions for Gaphors data model. |
|---|
| 5 |
|
|---|
| 6 |
Parts are separated by '%%' (no training spaces) on a line. |
|---|
| 7 |
Comment parts start with 'comment' on the line belowe the percentage |
|---|
| 8 |
symbols, 'override' is used to define a overridden variable. |
|---|
| 9 |
|
|---|
| 10 |
%% |
|---|
| 11 |
override Element |
|---|
| 12 |
from element import Element |
|---|
| 13 |
%% |
|---|
| 14 |
override Diagram |
|---|
| 15 |
from diagram import Diagram |
|---|
| 16 |
%% |
|---|
| 17 |
override MultiplicityElement.lower |
|---|
| 18 |
|
|---|
| 19 |
def _get(self): |
|---|
| 20 |
return self.lowerValue and self.lowerValue.value |
|---|
| 21 |
def _set(self, value): |
|---|
| 22 |
if not self.lowerValue: |
|---|
| 23 |
self.lowerValue = self._factory.create(LiteralString) |
|---|
| 24 |
self.lowerValue.value = value |
|---|
| 25 |
def _del(self): |
|---|
| 26 |
if self.lowerValue: |
|---|
| 27 |
del self.lowerValue.value |
|---|
| 28 |
|
|---|
| 29 |
MultiplicityElement.lower = property(_get, _set, _del) |
|---|
| 30 |
del _get, _set, _del |
|---|
| 31 |
%% |
|---|
| 32 |
override MultiplicityElement.upper |
|---|
| 33 |
|
|---|
| 34 |
def _get(self): |
|---|
| 35 |
return self.upperValue and self.upperValue.value |
|---|
| 36 |
def _set(self, value): |
|---|
| 37 |
if not self.upperValue: |
|---|
| 38 |
self.upperValue = self._factory.create(LiteralString) |
|---|
| 39 |
self.upperValue.value = value |
|---|
| 40 |
def _del(self): |
|---|
| 41 |
if self.upperValue: |
|---|
| 42 |
del self.upperValue.value |
|---|
| 43 |
|
|---|
| 44 |
MultiplicityElement.upper = property(_get, _set, _del) |
|---|
| 45 |
del _get, _set, _del |
|---|
| 46 |
%% |
|---|
| 47 |
override Class.extension |
|---|
| 48 |
def class_extension(self): |
|---|
| 49 |
extension = [] |
|---|
| 50 |
for e in self._factory.select(lambda e: e.isKindOf(Extension) and self in e.endType): |
|---|
| 51 |
|
|---|
| 52 |
extension.append(e) |
|---|
| 53 |
return extension |
|---|
| 54 |
|
|---|
| 55 |
Class.extension = property(class_extension, doc=""" |
|---|
| 56 |
References the Extensions that specify additional properties of the |
|---|
| 57 |
metaclass. The property is derived from the extensions whose memberEnds |
|---|
| 58 |
are typed by the Class.""") |
|---|
| 59 |
del class_extension |
|---|
| 60 |
%% |
|---|
| 61 |
override Extension.metaclass |
|---|
| 62 |
def extension_metaclass(self): |
|---|
| 63 |
ownedEnd = self.ownedEnd |
|---|
| 64 |
return [c for c in self.memberEnd if c not in ownedEnd][0].type |
|---|
| 65 |
|
|---|
| 66 |
Extension.metaclass = property(extension_metaclass, doc=""" |
|---|
| 67 |
References the Class that is extended through an Extension. The |
|---|
| 68 |
property is derived from the type of the memberEnd that is not the |
|---|
| 69 |
ownedEnd.""") |
|---|
| 70 |
del extension_metaclass |
|---|
| 71 |
%% |
|---|
| 72 |
override Classifier.inheritedMember |
|---|
| 73 |
Classifier.inheritedMember = derivedunion('inheritedMember', 0, '*') |
|---|
| 74 |
%% |
|---|
| 75 |
override Classifier.general |
|---|
| 76 |
def classifier_general(self): |
|---|
| 77 |
return [g.general for g in self.generalization] |
|---|
| 78 |
|
|---|
| 79 |
Classifier.general = property(classifier_general, doc=""" |
|---|
| 80 |
Return a list of all superclasses for class (iterating the Generalizations. |
|---|
| 81 |
""") |
|---|
| 82 |
del classifier_general |
|---|
| 83 |
%% |
|---|
| 84 |
override Class.superClass |
|---|
| 85 |
Class.superClass = Classifier.general |
|---|
| 86 |
%% |
|---|
| 87 |
override Namespace.importedMember |
|---|
| 88 |
Namespace.importedMember = derivedunion('importedMember', 0, '*') |
|---|
| 89 |
%% |
|---|
| 90 |
override Property.opposite |
|---|
| 91 |
|
|---|
| 92 |
def property_opposite(self): |
|---|
| 93 |
""" |
|---|
| 94 |
In the case where the property is one navigable end of a binary |
|---|
| 95 |
association with both ends navigable, this gives the other end. |
|---|
| 96 |
|
|---|
| 97 |
For Gaphor the property on the other end is returned regardless the |
|---|
| 98 |
navigability. |
|---|
| 99 |
""" |
|---|
| 100 |
|
|---|
| 101 |
|
|---|
| 102 |
|
|---|
| 103 |
|
|---|
| 104 |
|
|---|
| 105 |
if self.association is not None and len(self.association.memberEnd) == 2: |
|---|
| 106 |
return self.association.memberEnd[0] is self \ |
|---|
| 107 |
and self.association.memberEnd[1] \ |
|---|
| 108 |
or self.association.memberEnd[0] |
|---|
| 109 |
return None |
|---|
| 110 |
|
|---|
| 111 |
Property.opposite = property(property_opposite, doc=property_opposite.__doc__) |
|---|
| 112 |
|
|---|
| 113 |
del property_opposite |
|---|
| 114 |
|
|---|
| 115 |
%% |
|---|
| 116 |
override Property.isComposite |
|---|
| 117 |
Property.isComposite = property(lambda self: self.aggregation == intern('composite')) |
|---|
| 118 |
%% |
|---|
| 119 |
override Constraint.context |
|---|
| 120 |
Constraint.context = derivedunion('context', 0, 1) |
|---|
| 121 |
%% |
|---|
| 122 |
override Association.endType |
|---|
| 123 |
|
|---|
| 124 |
Association.endType = property(lambda self: [end.type for end in self.memberEnd if end], doc=""" |
|---|
| 125 |
References the classifiers that are used as types of the ends of the |
|---|
| 126 |
association.""") |
|---|
| 127 |
|
|---|
| 128 |
%% |
|---|
| 129 |
override Property.parse |
|---|
| 130 |
from umllex import parse_property |
|---|
| 131 |
Property.parse = parse_property |
|---|
| 132 |
del parse_property |
|---|
| 133 |
%% |
|---|
| 134 |
override Property.render |
|---|
| 135 |
from umllex import render_property |
|---|
| 136 |
Property.render = render_property |
|---|
| 137 |
del render_property |
|---|
| 138 |
%% |
|---|
| 139 |
override Operation.type |
|---|
| 140 |
Operation.type = derivedunion('type', 0, 1) |
|---|
| 141 |
%% |
|---|
| 142 |
override Operation.parse |
|---|
| 143 |
from umllex import parse_operation |
|---|
| 144 |
Operation.parse = parse_operation |
|---|
| 145 |
del parse_operation |
|---|
| 146 |
%% |
|---|
| 147 |
override Operation.render |
|---|
| 148 |
from umllex import render_operation |
|---|
| 149 |
Operation.render = render_operation |
|---|
| 150 |
del render_operation |
|---|
| 151 |
%% |
|---|
| 152 |
override Lifeline.parse |
|---|
| 153 |
from umllex import parse_lifeline |
|---|
| 154 |
Lifeline.parse = parse_lifeline |
|---|
| 155 |
del parse_lifeline |
|---|
| 156 |
%% |
|---|
| 157 |
override Lifeline.render |
|---|
| 158 |
from umllex import render_lifeline |
|---|
| 159 |
Lifeline.render = render_lifeline |
|---|
| 160 |
del render_lifeline |
|---|
| 161 |
%% |
|---|
| 162 |
override Extenstion.metaclass |
|---|
| 163 |
|
|---|
| 164 |
def extension_metaclass(self): |
|---|
| 165 |
""" |
|---|
| 166 |
References the Class that is extended through an Extension. The |
|---|
| 167 |
property is derived from the type of the memberEnd that is not the |
|---|
| 168 |
ownedEnd. |
|---|
| 169 |
""" |
|---|
| 170 |
for m in self.memberEnd: |
|---|
| 171 |
if m not in self.ownedEnd: |
|---|
| 172 |
return m |
|---|
| 173 |
return None |
|---|
| 174 |
|
|---|
| 175 |
Extenstion.metaclass = property(extension_metaclass, doc=extension_metaclass.__doc__) |
|---|
| 176 |
del extension_metaclass |
|---|
| 177 |
%% |
|---|
| 178 |
override Component.provided |
|---|
| 179 |
import itertools |
|---|
| 180 |
|
|---|
| 181 |
def _pr_interface_deps(classifier, dep_type): |
|---|
| 182 |
""" |
|---|
| 183 |
Return all interfaces, which are connected to a classifier with given |
|---|
| 184 |
dependency type. |
|---|
| 185 |
""" |
|---|
| 186 |
return (dep.supplier[0] for dep in classifier.clientDependency \ |
|---|
| 187 |
if dep.isKindOf(dep_type) and dep.supplier[0].isKindOf(UML.Interface)) |
|---|
| 188 |
|
|---|
| 189 |
def _pr_rc_interface_deps(component, dep_type): |
|---|
| 190 |
""" |
|---|
| 191 |
Return all interfaces, which are connected to realizing classifiers of |
|---|
| 192 |
specified component. Returned interfaces are connected to realizing |
|---|
| 193 |
classifiers with given dependency type. |
|---|
| 194 |
|
|---|
| 195 |
Generator of generators is returned. Do not forget to flat it later. |
|---|
| 196 |
""" |
|---|
| 197 |
return (_pr_interface_deps(r.realizingClassifier, dep_type) for r in component.realization) |
|---|
| 198 |
|
|---|
| 199 |
def component_provided(self): |
|---|
| 200 |
implementations = (impl.contract[0] for impl in self.implementation if impl.isKindOf(Implementation)) |
|---|
| 201 |
realizations = _pr_interface_deps(self, Realization) |
|---|
| 202 |
|
|---|
| 203 |
|
|---|
| 204 |
|
|---|
| 205 |
rc_realizations = _pr_rc_interface_deps(self, Realization) |
|---|
| 206 |
|
|---|
| 207 |
return tuple(set(itertools.chain(implementations, realizations, *rc_realizations))) |
|---|
| 208 |
|
|---|
| 209 |
Component.provided = property(component_provided, doc=""" |
|---|
| 210 |
Interfaces provided to component environment. |
|---|
| 211 |
""") |
|---|
| 212 |
del component_provided |
|---|
| 213 |
%% |
|---|
| 214 |
override Component.required |
|---|
| 215 |
def component_required(self): |
|---|
| 216 |
usages = _pr_interface_deps(self, Usage) |
|---|
| 217 |
|
|---|
| 218 |
|
|---|
| 219 |
|
|---|
| 220 |
rc_usages = _pr_rc_interface_deps(self, Usage) |
|---|
| 221 |
|
|---|
| 222 |
return tuple(set(itertools.chain(usages, *rc_usages))) |
|---|
| 223 |
|
|---|
| 224 |
Component.required = property(component_required, doc=""" |
|---|
| 225 |
Interfaces required by component. |
|---|
| 226 |
""") |
|---|
| 227 |
del component_required |
|---|
| 228 |
%% |
|---|
| 229 |
override Message.messageKind |
|---|
| 230 |
|
|---|
| 231 |
def message_messageKind(self): |
|---|
| 232 |
kind = 'unknown' |
|---|
| 233 |
if self.sendEvent: |
|---|
| 234 |
kind = 'lost' |
|---|
| 235 |
if self.receiveEvent: |
|---|
| 236 |
kind = 'complete' |
|---|
| 237 |
elif self.receiveEvent: |
|---|
| 238 |
kind = 'found' |
|---|
| 239 |
return kind |
|---|
| 240 |
|
|---|
| 241 |
Message.messageKind = property(message_messageKind, doc=""" |
|---|
| 242 |
MessageKind |
|---|
| 243 |
""") |
|---|
| 244 |
del message_messageKind |
|---|
| 245 |
|
|---|