\begin{lstlisting}[caption=OCL Module for Validating Singletons, label=lst:CaseStudyOcl, language=OCL2] | |
package Foundation::Core | |
context Class | |
def isSingleton : | |
let isSingleton : Boolean = | |
self.stereotype->exists(s|s.name = 'singleton') | |
def getInstanceOperation : | |
let getInstanceOperation : Operation = | |
self.feature->select(f|f.oclIsTypeOf(Operation) | |
and f.name = 'getInstance')->first().oclAsType(Operation) | |
inv DefinesGetInstanceOperation : | |
if isSingleton | |
then getInstanceOperation.isDefined | |
else true | |
endif | |
inv GetInstanceOperationIsStatic : | |
if isSingleton then | |
if getInstanceOperation.isDefined | |
then getInstanceOperation.ownerScope = #classifier | |
else false | |
endif | |
else | |
true | |
endif | |
inv GetOperationReturnsSame : | |
if isSingleton then | |
if getInstanceOperation.isDefined then | |
if getInstanceOperation.returnParameter.isDefined | |
then getInstanceOperation.returnParameter.type = self | |
else false | |
endif | |
else | |
false | |
endif | |
else | |
true | |
endif | |
context Operation | |
def returnParameter : | |
let returnParameter : Parameter = | |
self.parameter->select(p|p.kind = #return)->first() | |
endpackage | |
\end{lstlisting} |