Issue 7051: StateMachine - Constraints (uml2-rtf) Source: (, ) Nature: Clarification Severity: Minor Summary: "[1] The classifier context of a state machine cannot be an interface" should be: [1] The context classifier of a state machine cannot be an interface. not redefinitionContext.oclIsKindOf(Interface) "[2] The context classifier of the method state machine of a behavioral feature must be the classifier that owns the behavioral feature." should be: [2] The context classifier of the method state machine of a behavioral feature must be one of the classifier that features the behavioral feature -- note that a behavorial feature can be associated with 1..* -- classifiers if self.specification->notEmpty() then self.specification.featuringClassifier->includes(redefinitionContext) endif "[3] The connection points of a state machine are pseudostates of kind entry point or exit point." should be: [3] The connection points of a state machine are pseudostates of kind entry point or exit point. connectionPoint->forAll(cp | cp.kind = #entryPoint or cp.kind = #exitPoint ) "[4] A state machine as the method for a behavioral feature cannot have entry/exit connection points." should be: [4] A state machine as the method for a behavioral feature cannot have entry/exit connection points. self.specification->notEmpty() implies ( self.connectionPoint->forAll(cp | not (cp.kind = #entryPoint or cp.kind = #exitPoint) ) ) Resolution: Discussion In UML 2.5, all of the above have been rewritten and corresponding OCL inserted. Disposition: Closed - No Change Revised Text: Actions taken: February 29, 2004: received issue February 20, 2015: closed issue Discussion: The OCL was left out of the final adopted specification and needs to be inserted. However, the OCL constraints recommended above are mostly incorrect. Instead, the following OCL expressions need to be inserted for constraints [1] through [4] of StateMachine on page 490 respectively: ?? context->notEmpty() implies not context.oclIsKindOf(Interface) ?? specification->notEmpty() implies (context->notEmpty() and specification->featuringClassifier-> exists (c | c = context)) ?? connectionPoint->forAll (c | c.kind = #entryPoint or c.kind = #exitPoint) ?? specification->notEmpty() implies connectionPoint->isEmpty() End of Annotations:===== m: webmaster@omg.org Date: 29 Feb 2004 15:50:13 -0500 To: Subject: Issue/Bug Report -------------------------------------------------------------------------------- Name: Karl Guggisberg Company: na mailFrom: karl.guggisberg@guggis.ch Notification: Yes Specification: Unified Modeling Language: Superstructure Section: 15.3.12 FormalNumber: ptc/03-08-02 Version: 2.0 RevisionDate: na Page: 490 Nature: Clarification Severity: Minor HTTP User Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322) Description StateMachine - Constraints "[1] The classifier context of a state machine cannot be an interface" should be: [1] The context classifier of a state machine cannot be an interface. not redefinitionContext.oclIsKindOf(Interface) "[2] The context classifier of the method state machine of a behavioral feature must be the classifier that owns the behavioral feature." should be: [2] The context classifier of the method state machine of a behavioral feature must be one of the classifier that features the behavioral feature -- note that a behavorial feature can be associated with 1..* -- classifiers if self.specification->notEmpty() then self.specification.featuringClassifier->includes(redefinitionContext) endif "[3] The connection points of a state machine are pseudostates of kind entry point or exit point." should be: [3] The connection points of a state machine are pseudostates of kind entry point or exit point. connectionPoint->forAll(cp | cp.kind = #entryPoint or cp.kind = #exitPoint ) "[4] A state machine as the method for a behavioral feature cannot have entry/exit connection points." should be: [4] A state machine as the method for a behavioral feature cannot have entry/exit connection points. self.specification->notEmpty() implies ( self.connectionPoint->forAll(cp | not (cp.kind = #entryPoint or cp.kind = #exitPoint) ) ) OMG Issue No: 7051 Title: StateMachine - Constraints Source: Karl Guggisberg karl.guggisberg@guggis.ch Summary: "[1] The classifier context of a state machine cannot be an interface" should be: [1] The context classifier of a state machine cannot be an interface. not redefinitionContext.oclIsKindOf(Interface) -------------------- "[2] The context classifier of the method state machine of a behavioral feature must be the classifier that owns the behavioral feature." should be: [2] The context classifier of the method state machine of a behavioral feature must be one of the classifier that features the behavioral feature -- note that a behavorial feature can be associated with 1..* -- classifiers if self.specification->notEmpty() then self.specification.featuringClassifier->includes(redefinitionContext) endif -------------------- "[3] The connection points of a state machine are pseudostates of kind entry point or exit point." should be: [3] The connection points of a state machine are pseudostates of kind entry point or exit point. connectionPoint->forAll(cp | cp.kind = #entryPoint or cp.kind = #exitPoint ) -------------------- "[4] A state machine as the method for a behavioral feature cannot have entry/exit connection points." should be: [4] A state machine as the method for a behavioral feature cannot have entry/exit connection points. self.specification->notEmpty() implies ( self.connectionPoint->forAll(cp | not (cp.kind = #entryPoint or cp.kind = #exitPoint) ) ) Discussion: The OCL was left out of the final adopted specification and needs to be inserted. However, the OCL constraints recommended above are mostly incorrect. Instead, the following OCL expressions need to be inserted for constraints [1] through [4] of StateMachine on page 490 respectively: · context->notEmpty() implies not context.oclIsKindOf(Interface) · specification->notEmpty() implies (context->notEmpty() and specification->featuringClassifier-> exists (c | c = context)) · connectionPoint->forAll (c | c.kind = #entryPoint or c.kind = #exitPoint) · specification->notEmpty() implies connectionPoint->isEmpty() Disposition: Resolved