# Acceleo Equivalence

Authors: | Laurent Goubet
Contact: | laurent.goubet@obeo.fr

Copyright © 2008, 2010 Obeo™.

# Introduction

## Goals

This document lists equivalences between Acceleo 2 and Acceleo 3 expressions.

# Equivalences

## Miscellaneous

> Acceleo 2 Expression | Acceleo 3 Expression (OCL)
> --- | ---
> <%metamodel http://www.eclipse.org/uml2/2.0.0/UML%> | [module module_name('http://www.eclipse.org/uml2/2.0.0/UML')/]
> <%import module.mt%> | [import module/]
> <%import service.java%> | Services no longer need to be imported
> <%list + object%> | [list->including(object)/]
> <%object + list%> | [object->union(list)/]
> <%list1 + list2%> | [list1->union(list2)/]
> <%string + object%> | [string + object/]
> <%list - object%> | [list->excluding(object)/]
> <%list1 - list2%> | [list1->asSet() - list2->asSet()/] (Note that this no longer keeps duplicates, which is not strictly equivalent to Acceleo 2)
> <%list1 || list2%> | [list1->union(list2)/]
> <%list && object%> | [list->select(element | element = object)/]
> <%list1 && list2%> | [list1->iterate(element; result : Sequence(T) = Sequence{} | if list2->includes(element) then result->including(element) else result endif)/]
> <%list1 == list2%> | [list1 = list2/]
> <%list1 != list2%> | [list1 <> list2/]
> <%object != object%> | [object <> object/]
> <%! boolean%> | [not boolean/]

## EObject Services

> Acceleo 2 Expression | Acceleo 3 Expression (OCL)
> --- | ---
> <%x.eAllContents%> | [x.eAllContents()/]
> <%x.eAllContents("EClass")%> | [x.eAllContents(EClass)/]
> <%x.eClass%> | [x.eClass()/]
> <%x.eContainer%> | [x.eContainer()/]
> <%x.eContainer("EPackage")%> | [x.eContainer(EPackage)/]
> <%x.eContainingFeature%> | [x.eContainingFeature()/]
> <%x.eContainmentFeature%> | [x.eContainmnentFeature()/]
> <%x.eContents%> | [x.eContents()/]
> <%x.eCrossReferences%> | [x.eCrossReferences()/]
> <%x.eResource%> | [x.eResource()/]
> <%x.eResourceName%> |
> <%x.getRootContainer%> | [x.ancestors()->last()/]
> <%load("//UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2")%> | No direct equivalent : Acceleo 3 accepts more than one model element as arguments of a generation. An alternative would be to use a custom Java service for this need.

## Request Services

> Acceleo 2 Expression | Acceleo 3 Expression (OCL)
> --- | ---
> <%list.select("eAttributes.nSize() > 0")%> | [list->select(eAttributes->size() > 0)/]
> <%list.select("eAttributes.nSize()", "0")%> | [list->select(eAttributes->size() = 0)/]
> <%list.delete("eAttributes.nSize() > 0")%> | [list->reject(eAttributes->size() > 0)/]
> <%list.delete("eAttributes.nSize()", "0")%> | [list->reject(eAttributes->size() = 0)/]
> <%evaluate("2 + 4")%> |

## Resource Services

> Acceleo 2 Expression | Acceleo 3 Expression (OCL)
> --- | ---
> <%getFileContent("C:/Obeo/models/MyModel.xmi")%> |
> <%getChainPath%> |

## String Services

> Acceleo 2 Expression | Acceleo 3 Expression (OCL)
> --- | ---
> <%x.length%> | [x.size()/]
> <%x.toUpperCase%> | [x.toUpper()/]
> <%x.toLowerCase%> | [x.toLower()/]
> <%x.toU1Case%> | [x.toUpperFirst()/]
> <%x.toL1Case%> | [x.toLowerFirst()/]
> <%x.substring(1, 3)%> | [x.substring(2, 3)/]
> <%x.substring(1)%> | [x.substring(2)/]
> <%x.replaceAll("test", "replaced")%> | [x.replaceAll('test', 'replaced')/]
> <%x.replaceAll("\w", "$0")%> | [x.replaceAll('\\w', '$0')/]
> <%x.replaceFirst("test", "replaced")%> | [x.replace('test', 'replaced')/]
> <%x.replaceFirst("\w", "$0")%> | [x.replace('\\w', '$0')/]
> <%x.trim%> | [x.trim()/]
> <%x.startsWith(y)%> | [x.startsWith(y)/]
> <%x.endsWith(y)%> | [x.endsWith(y)/]
> <%x.equalsIgnoreCase(y)%> | [x.equalsIgnoreCase(y)/]
> <%x.matches(y)%> | [x.matches(y)/]
> <%x.charAt(4)%> | [x.substring(5, 5)/]
> <%x.indexOf(y)%> | [x.index(y)/]
> <%x.indexOf(y, 4)%> | [x.substring(5, x.size()).index(y) + 4/]
> <%x.lastIndexOf(y)%> | [x.lastIndex(y)/]
> <%x.lastIndexOf(y, 4)%> | [x.substring(5, x.size()).lastIndex(y) + 4/]
> <%x.split(y)%> | No direct equivalent, use String::tokenize(String)
> <%x.indentSpace%> | [x.replaceAll('\r\n|\r|\n', '$0 ')/]
> <%x.indentTab%> | [x.replaceAll('\r\n|\r|\n', '$0t')/]

## System Services

> Acceleo 2 Expression | Acceleo 3 Expression (OCL)
> --- | ---
> <%i()%> | [i/]
> <%args(0)%> | arguments are explicit and named in Acceleo 3

## XPath Services

> Acceleo 2 Expression | Acceleo 3 Expression (OCL)
> --- | ---
> <%x.ancestor%> | [x.ancestors()/]
> <%x.parent%> | [x.eContainer()/]
> <%self%> | [self/]
> <%x.child%> | [x.eContents()/]
> <%x.descendant%> | [x.eAllContents()/]
> <%x.precedingSibling%> | [x.precedingSiblings()/]
> <%x.preceding%> |
> <%x.followingSibling%> | [x.followingSiblings()/]
> <%x.following%> |

## ENode Services

> Acceleo 2 Expression | Acceleo 3 Expression (OCL)
> --- | ---
> <%eObject.adapt("EObject")%> | [eObject/]
> <%eObject.adapt("ENodeList")%> | [if (eObject.oclIsUndefined())][Sequence{}/][else][Sequence{eObject}/][/if]
> <%eObject.adapt("String")%> | [if (eObject.oclIsUndefined())][''/][else][eObject.toString()/][/if]
> <%eObject.adapt("Boolean")%> | [not eObject.oclIsUndefined()/]
> <%eObject.adapt("int")%> | [eObject->size()/]
> <%eObject.adapt("double")%> | [eObject->size().toString().toReal()/]
> <%eObject.adapt("List")%> | [if (eObject.oclIsUndefined())][Sequence{}/][else][Sequence{eObject}/][/if]
> <%eObject.adapt("ENode")%> | [eObject/]
> <%list.adapt("EObject")%> | [if (list.oclIsUndefined())][null/][elseif (list->size() == 0)][else][list.at(0)/][/if]
> <%list.adapt("ENodeList")%> | [if (list.oclIsUndefined())][Sequence{}/][else][list/][/if]
> <%list.adapt("String")%> | [if (list.oclIsUndefined())][''/][else][list.toString()/][/if]
> <%list.adapt("Boolean")% | [list->size() > 0/]
> <%list.adapt("int")%> | [list->size()/]
> <%list.adapt("double")%> | [list->size().toString().toReal()/]
> <%list.adapt("List")%> | [if (list.oclIsUndefined())][Sequence{}/][else][list/][/if]
> <%list.adapt("ENode")%> | [list/]
> <%string.adapt("EObject")%> | can only return empty enodes in Acceleo 2, so migration is simply "nothing"
> <%string.adapt("ENodeList")%> | [if (string.oclIsUndefined())][Sequence{}/][else][Sequence{string}/][/if]
> <%string.adapt("String")%> | [string/]
> <%string.adapt("Boolean")%> | [string.equalsIgnoreCase('true')/]
> <%string.adapt("int")%> | [string.toInt()/]
> <%string.adapt("double")%> | [string.toReal()/]
> <%string.adapt("List")%> | [if (string.oclIsUndefined())][Sequence{}/][else][Sequence{string}/][/if]
> <%string.adapt("ENode")%> | [string/]
> <%boolean.adapt("EObject")%> | can only return empty enodes in Acceleo 2, so migration is simply "nothing"
> <%boolean.adapt("ENodeList")%> | [if (boolean.oclIsUndefined())][Sequence{}/][else][Sequence{boolean}/][/if]
> <%boolean.adapt("String")%> | [if (boolean.oclIsUndefined())][''/][else][boolean.toString()/][/if]
> <%boolean.adapt("Boolean")%> | [not boolean.oclIsUndefined() and boolean/]
> <%boolean.adapt("int")%> | [if (not boolean.oclIsUndefined() and boolean)][1/][else][0/][/if]
> <%boolean.adapt("double")%> | [if (not boolean.oclIsUndefined() and boolean)][1.0/][else][0.0/][/if]
> <%boolean.adapt("List")%> | [if (boolean.oclIsUndefined())][Sequence{}/][else][Sequence{boolean}/][/if]
> <%boolean.adapt("ENode")%> | [boolean/]
> <%int.adapt("EObject")%> | can only return empty enodes in Acceleo 2, so migration is simply "nothing"
> <%int.adapt("ENodeList")%> | [if (int.oclIsUndefined())][Sequence{}/][else][Sequence{int}/][/if]
> <%int.adapt("String")%> | [if (int.oclIsUndefined())][''/][else][int.toString()/][/if]
> <%int.adapt("Boolean")%> | [not int.oclIsUndefined() and int > 0/]
> <%int.adapt("int")%> | [if (int.oclIsUndefined())][0/][else][int/][/if]
> <%int.adapt("double")%> | [if (int.oclIsUndefined())][0.0/][else][int.toString().toReal()/][/if]
> <%int.adapt("List")%> | [if (int.oclIsUndefined())][Sequence{}/][else][Sequence{int}/][/if]
> <%int.adapt("ENode")%> | [int/]
> <%double.adapt("EObject")%> | can only return empty enodes in Acceleo 2, so migration is simply "nothing"
> <%double.adapt("ENodeList")%> | [if (double.oclIsUndefined())][Sequence{}/][else][Sequence{double}/][/if]
> <%double.adapt("String")%> | [if (double.oclIsUndefined())][''/][else][double.toString()/][/if]
> <%double.adapt("Boolean")%> | [not double.oclIsUndefined() and double > 0/]
> <%double.adapt("int")%> | [if (double.oclIsUndefined())][0/][else][double.toString().toInt()/][/if]
> <%double.adapt("double")%> | [if (double.oclIsUndefined())][0.0/][else][double/][/if]
> <%double.adapt("List")%> | [if (double.oclIsUndefined())][Sequence{}/][else][Sequence{double}/][/if]
> <%double.adapt("ENode")%> | [double/]
> <%list.cast("EClass")%> | [list->select(not oclIsKindOf(EObject) or oclIsKindOf(EClass))/]
> <%list.filter("EClass")%> | [list->select(not oclIsKindOf(EObject) or oclIsKindOf(EClass))/]
> <%current()%> | [self/]
> <%current(1)%> | iterator variables are named in Acceleo 3
> <%node.debug%> |
> <%node.trace%> |
> <%node.trace("name")%> |
> <%nPut("key", object)%> |
> <%nGet("key")%> |
> <%nPeek%> |
> <%nPop%> |
> <%nPush%> |
> <%list.nMinimize%> | [list->asOrderedSet()->asSequence()/]
> <%list.minimize%> | [list->asOrderedSet()->asSequence()/]
> <%list.nContains(item)%> | [list->includes(item)/]
> <%list.nFirst%> | [list->first()/]
> <%list.nLast%> | [list->last()/]
> <%list.nGet(0)%> | [list->at(0)/]
> <%list.nGet(0, 1)%> | [list->subSequence(1, 2)/]
> <%list.nReverse%> | [list->reverse()/]
> <%list.reverse%> | [list->reverse()/]
> <%list.nSize%> | [list->size()/]
> <%list.nSort%> | [list->sortedBy(toString())/]
> <%list.nSort(name)%> | [list->sortedBy(name)/]
> <%list.sort%> | [list->sortedBy(toString())->asOrderedSet()->asSequence()/]
> <%list.sort(name)%> | [list->sortedBy(name)->asOrderedSet()->asSequence()/]
> <%list.sep(",")%> | [list->sep(',')/]
> <%list.sepStr(",")%> | [list->sep(',')/]
> <%node.toString%> | [node.toString()/]
> <%eObject.until("eContainer", "EClass")%> |

## Context Services

> Acceleo 2 Expression | Acceleo 3 Expression (OCL)
> --- | ---
> <%get("key")%> |
> <%peek%> |
> <%pop%> |
> <%push%> |
> <%put("key", object) |

## Properties Services

> Acceleo 2 Expression | Acceleo 3 Expression (OCL)
> --- | ---
> <%getBestProperty("partial.key")%> |
> <%getProperty("key")%> | [getProperty('key')/]
> <%getProperty("propertiesFile", "key")%> | [getProperty('propertiesFile', 'key')/]