[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.modeling.mdt.ocl] Re: Expressions involving undefined values

Hi Ed,

Many thanks for the response and detailed explanation. I myself had found 
the OCL spec. rather confusing as to the semantics of undefined / invalid / 
null and your proposed revisions offer some reassurance that it wasn't just 
me being slow on the uptake.

I'm putting together a JUnit test case to illustrate the problems I've seen, 
will post to here and Bugzilla when complete. BTW the JUnit is not so 
straightforward since OCL does not have a syntax for declaring an empty 
explicitly typed collection literal. For example (using classes from the 
Ecore package for convenience) none of: OrderedSet(EClass)->first(), 
OrderedSet(EClass){}->first(), OrderedSet()->first() or 
OrderedSet{}->first() appear to be valid OCL. BTW the production 
CollectionLiteralExpCS ::= CollectionTypeIdentifierCS '{' 
CollectionLiteralPartsCS? '}' permits an empty element list but for the 
fourth example in the previous sentence MDT/OCL throws the parser exception 
"Argument is null, expected a List".

Thanks & regards,

Adrian.

"Ed Willink" <ed@xxxxxxxxxxxxx> wrote in message 
news:h7mk2f$p27$1@xxxxxxxxxxxxxxxxxxxx
> Hi Adrian
>
> The OCL 2.0 specification was never consistenly updated to redefine the 
> 'undefined' value as the 'null' and the 'invalid' functionality. Most
> of the MDT-OCL behaviour can be justified by one of the many contradictory 
> statements in the specification; though NPEs can never be right. Please 
> submit your example as a Bugzilla and we'll fix it.
>
> I posted a substantive revised text to resolve 'null' and 'invalid' as 
> http://www.omg.org/issues/ocl2-rtf#Issue14197. We are working to have an 
> unambiguous specification and an implementation compliant with it.
>
> The corresponding rationalisation of invalid/Invalid/OclInvalid was
> applied to CVS HEAD yesterday as part of 
> https://bugs.eclipse.org/bugs/show_bug.cgi?id=282882.
>
> We are currently resolving a variety of areas where the treatment of
> null and invalid is not quite right.
>
> Issue 14197 is our best guess at what is correct and we might have
> it implemented by M3 or perhaps M4.
>
> For now I'm afraid you just need to do excess empirical testing.
>
> Regards
>
> Ed Willink
>
>
> Adrian Price wrote:
>> Good day mdt.ocl,
>>
>> Many of our OCL constraints involve complex chained expressions 
>> referencing modelled features and query operations, any part of which 
>> could be undefined.
>>
>> According to "OCL 2.0 Specification  ptc/2005-06-06" Paragraph 7.4.11 (?) 
>> "Undefined Values":
>> "Some expressions will, when evaluated, have an undefined value. For 
>> instance, typecasting with oclAsType() to a type that the object does not 
>> support or getting the ->first() element of an empty collection will 
>> result in undefined. In general, an expression where one of the parts is 
>> undefined will itself be undefined..." However, in practice I see 
>> NullPointerExceptions when such expressions are evaluated. For example:
>>
>> inv inParamControlDisabled: let opposite : Bindable = 
>> getInboundValueBinding()->first().getOppositeEndpoint(self).target in 
>> enabled.value and opposite.oclIsKindOf(Parameter) implies 
>> opposite.oclAsType(Parameter).inout <> InOutType::IN
>>
>> throws NPE if getInboundValueBinding() returns an empty list, apparently 
>> as a result of attempting to using Java reflection APIs to invoke the 
>> getOppositeEndpoint() method on a null reference. At present the only way 
>> around this is to make the OCL expressions self-null-checking, which 
>> obviously makes them more complicated than the spec. suggests they need 
>> be, less readily comprehensible and (presumably) less performant.
>>
>> Is my understanding of the OCL spec. flawed or is this a bug?
>>
>> Thanks in advance,
>>
>> Adrian Price
>> Senior Architect
>> TIBCO Software, Inc.