Home » Modeling » M2T (model-to-text transformation) » [Acceleo 3 / MTL] Problems when wrapping java methods in MTL
[Acceleo 3 / MTL] Problems when wrapping java methods in MTL [message #633081] |
Fri, 15 October 2010 06:12  |
Eclipse User |
|
|
|
Dear all,
I want to call a java method from my MTL code. Therefore, I've used the Acceleo 3 wizard to generate the MTL's wrapper. Nevertheless, the generated MTL wrapper doesn't compiles.
The java method specification which I need to call is:
public static Object getNestedValue (Element self, List<String> NameValues)
and the MTL wrapper generated by the wizard is:
[query public getNestedValue(arg0 : Element, arg1 : Sequence(OclAny)) : OclAny
= invoke('Reflexion.Debug', 'getNestedValue(org.eclipse.uml2.uml.Element, java.util.List)', Sequence{arg0, arg1}) /]
As it's said before, the problem is that this wrapper doesn't compiles. I get the next error:
Type mismatch. No common supertype: (Element), (Sequence(OclAny)) debug.mtl /org.eclipse.acceleo.module.sample/src/org/eclipse/acceleo/m odule/sample/files line 7 Acceleo Problem
I think that the problem is that "java.util.List" doesn't match with the MTL's Sequence (in this case, of strings) type. But I were not able to discover which java type matches with Sequence type.
So, I'm a bit confusing. Any help will be welcome.
Thank you in advance.
Regards,
Emilio.
|
|
|
Re: [Acceleo 3 / MTL] Problems when wrapping java methods in MTL [message #633098 is a reply to message #633081] |
Fri, 15 October 2010 07:04   |
Eclipse User |
|
|
|
This is a multi-part message in MIME format.
--------------040104050507070604010009
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Hi Emilio,
The problem you have is that OCL doesn't allow for a Sequence containing
an element and a list, Sequence{'a', 'z', 'e'} is valid, but
Sequence{'a', Sequence{'z', 'e'}} is not.
As such, it is currently impossible to call, from Acceleo, Java services
which take a collection as parameter. This is a known limitation which
we have little options to try and circumvent. Do you really need a list
as parameter, or can you workaround this limitation by calling the
service multiple times (one for each of your list's content)?
Laurent Goubet
Obeo
Emilio Salazar wrote:
> Dear all,
>
> I want to call a java method from my MTL code. Therefore, I've used the
> Acceleo 3 wizard to generate the MTL's wrapper. Nevertheless, the
> generated MTL wrapper doesn't compiles.
>
> The java method specification which I need to call is:
>
> public static Object getNestedValue (Element self, List<String> NameValues)
>
> and the MTL wrapper generated by the wizard is:
>
> [query public getNestedValue(arg0 : Element, arg1 : Sequence(OclAny)) :
> OclAny
> = invoke('Reflexion.Debug',
> 'getNestedValue(org.eclipse.uml2.uml.Element, java.util.List)',
> Sequence{arg0, arg1}) /]
>
> As it's said before, the problem is that this wrapper doesn't compiles.
> I get the next error:
>
> Type mismatch. No common supertype: (Element), (Sequence(OclAny))
> debug.mtl
> /org.eclipse.acceleo.module.sample/src/org/eclipse/acceleo/m
> odule/sample/files line 7 Acceleo Problem
>
> I think that the problem is that "java.util.List" doesn't match with
> the MTL's Sequence (in this case, of strings) type. But I were not able
> to discover which java type matches with Sequence type.
> So, I'm a bit confusing. Any help will be welcome.
>
> Thank you in advance.
>
> Regards,
> Emilio.
>
--------------040104050507070604010009
Content-Type: text/x-vcard; charset=utf-8;
name="laurent_goubet.vcf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="laurent_goubet.vcf"
YmVnaW46dmNhcmQNCmZuOkxhdXJlbnQgR291YmV0DQpuOkdvdWJldDtMYXVy ZW50DQpvcmc6
PGEgaHJlZj0iaHR0cDovL3d3dy5vYmVvLmZyIj5PYmVvPC9hPg0KZW1haWw7 aW50ZXJuZXQ6
bGF1cmVudC5nb3ViZXRAb2Jlby5mcg0KdXJsOmh0dHA6Ly93d3cub2Jlby5m cg0KdmVyc2lv
bjoyLjENCmVuZDp2Y2FyZA0KDQo=
--------------040104050507070604010009--
|
|
| |
Re: [Acceleo 3 / MTL] Problems when wrapping java methods in MTL [message #633142 is a reply to message #633098] |
Fri, 15 October 2010 09:48   |
Eclipse User |
|
|
|
Hi Emilio, Laurent
> The problem you have is that OCL doesn't allow for a Sequence
> containing an element and a list, Sequence{'a', 'z', 'e'} is valid,
> but Sequence{'a', Sequence{'z', 'e'}} is not.
This is true of OMG OCL 2.0 and MDT/OCL 3.0.
OCL 2.2 changed Collection to conform to OclAny, so the above is valid
in OCL 2.2, which hopefully will be supported by MDT/OCL 3.1.
Regards
Ed Willink
|
|
|
Re: [Acceleo 3 / MTL] Problems when wrapping java methods in MTL [message #639840 is a reply to message #633142] |
Wed, 17 November 2010 23:54   |
Eclipse User |
|
|
|
thank you very much for your help!!!
I was trying to do some workaround, and at the end I saw what was making me noise all the time.
In fact, this is what I can't understand:
[for (a : Association | class.getAssociations() )]
[numberOfRelations(a, class.name)/]
[if (numberOfRelations(a, class.name)>0)]
inside
[/if]
[/for]
where:
[query public numberOfRelations(a : Association, sourceClass : String) : Integer = a.ownedElement->asSequence().oclAsType(Property)->select(type.name.equalsIgnoreCase(sourceClass))->upper.oclAsType(Integer) /]
and this is the output:
So, I have to believe that my query "numberOfRelations" is returning some integer (1,1,2) but if I what to use the result as a number... I can't!, so this operation fails: if (numberOfRelations(a, class.name)>0)]
And If I try:
[query public numberOfRelations(a : Association, sourceClass : String) : Integer = 2 /]
then this is the output:
2
inside
2
inside
2
inside
so, Why this can't be treated as an Integer?:
[query public [B]numberOfRelations[/B](a : Association, sourceClass : String) : Integer = a.ownedElement->asSequence().oclAsType(Property)->select(type.name.equalsIgnoreCase(sourceClass))->upper/]
Thank you!!!
|
|
| | |
Re: [Acceleo 3 / MTL] Problems when wrapping java methods in MTL [message #870736 is a reply to message #640064] |
Wed, 09 May 2012 09:42  |
Eclipse User |
|
|
|
Hi,
I am merging a plug-in written in Acceleo 2 to the new version Acceleo 3. In the old plug-in there are several calls to some java services with collection parameters. When I try to pass a collection to a Java service, I receive errors. I would like to know if it is possible to pass a collection from a template to a Java service as a parameter?
Thanks in advance.
|
|
|
Goto Forum:
Current Time: Sun Jul 06 05:18:23 EDT 2025
Powered by FUDForum. Page generated in 0.06435 seconds
|