Variables
Any non-trivial SPL file will require variables. Some variables are predefined by the code generator, and new variables may be created simply by assigning values to them.
The $ character is used when declaring or using a variable, a variable name is always prefixed by $. Variable names are case sensitive.
Variables types:
•integer - also used as boolean, where 0 is false and everything else is true
•string
•object - provided by UModel
•iterator - see foreach statement
Variable types are declared by first assignment:
[$x = 0] |
x is now an integer.
[$x = "teststring"] |
x is now treated as a string.
Strings
String constants are always enclosed in double quotes, like in the example above. \n and \t inside double quotes are interpreted as newline and tab, \" is a literal double quote, and \\ is a backslash. String constants can also span multiple lines.
String concatenation uses the & character:
[$BasePath = $outputpath & "/" & $JavaPackageDir] |
Objects
Objects represent the information contained in the UModel project. Objects have properties, which can be accessed using the . operator. It is not possible to create new objects in SPL (they are predefined by the code generator, derived from the input), but it is possible to assign objects to variables.
Example:
class [=$class.Name] |
This example outputs the word "class", followed by a space and the value of the Name property of the $class object.
The following table shows the relationship between UML elements their SPL equivalents along with a short description.
Predefined variables
UML element | SPL property | Multiplicity | UML Attribute / | UModel Attribute / Association | Description |
---|---|---|---|---|---|
BehavioralFeature | isAbstract | isAbstract:Boolean | |||
BehavioralFeature | raisedException | * | raisedException:Type | ||
BehavioralFeature | ownedParameter | * | ownedParameter:Parameter | ||
BehavioredClassifier | interfaceRealization | * | interfaceRealization:InterfaceRealization | ||
Class | ownedOperation | * | ownedOperation:Operation | ||
Class | nestedClassifier | * | nestedClassifier:Classifier | ||
Classifier | namespace | * | namespace:Package | packages with code language <<namespace>> set | |
Classifier | rootNamespace | * | project root namespace:String | VB only - root namespace | |
Classifier | generalization | * | generalization:Generalization | ||
Classifier | isAbstract | isAbstract:Boolean | |||
ClassifierTemplateParameter | constrainingClassifier | * | constrainingClassifier | ||
Comment | body | body:String | |||
DataType | ownedAttribute | * | ownedAttribute:Property | ||
DataType | ownedOperation | * | ownedOperation:Operation | ||
Element | kind | kind:String | |||
Element | owner | 0..1 | owner:Element | ||
Element | appliedStereotype | * | appliedStereotype:StereotypeApplication | applied stereotypes | |
Element | ownedComment | * | ownedComment:Comment | ||
ElementImport | importedElement | 1 | importedElement:PackageableElement | ||
Enumeration | ownedLiteral | * | ownedLiteral:EnumerationLiteral | ||
Enumeration | nestedClassifier | * | nestedClassifier::Classifier | ||
Enumeration | interfaceRealization | * | interfaceRealization:Interface | ||
EnumerationLiteral | ownedAttribute | * | ownedAttribute:Property | ||
EnumerationLiteral | ownedOperation | * | ownedOperation:Operation | ||
EnumerationLiteral | nestedClassifier | * | nestedClassifier:Classifier | ||
Feature | isStatic | isStatic:Boolean | |||
Generalization | general | 1 | general:Classifier | ||
Interface | ownedAttribute | * | ownedAttribute:Property | ||
Interface | ownedOperation | * | ownedOperation:Operation | ||
Interface | nestedClassifier | * | nestedClassifier:Classifier | ||
InterfaceRealization | contract | 1 | contract:Interface | ||
MultiplicityElement | lowerValue | 0..1 | lowerValue:ValueSpecification | ||
MultiplicityElement | upperValue | 0..1 | upperValue:ValueSpecification | ||
NamedElement | name | name:String | |||
NamedElement | visibility | visibility:VisibilityKind | |||
NamedElement | isPublic | isPublic:Boolean | visibility <public> | ||
NamedElement | isProtected | isProtected:Boolean | visibility <protected> | ||
NamedElement | isPrivate | isPrivate:Boolean | visibility <private> | ||
NamedElement | isPackage | isPackage:Boolean | visibility <package> | ||
NamedElement | namespacePrefix | namespacePrefix:String | XSD only - namespace prefix when exists | ||
NamedElement | parseableName | parseableName:String | CSharp, VB only - name with escaped keywords (@) | ||
Namespace | elementImport | * | elementImport:ElementImport | ||
Operation | ownedReturnParameter | 0..1 | ownedReturnParameter:Parameter | parameter with direction return set | |
Operation | type | 0..1 | type | type of parameter with direction return set | |
Operation | ownedOperationParameter | * | ownedOperationParameter:Parameter | all parameters excluding parameter with direction return set | |
Operation | implementedInterface | 1 | implementedInterface:Interface | CSharp only - the implemented interface | |
Operation | ownedOperationImplementations | * | implementedOperation:OperationImplementation | VB only - the implemented interfaces/operations | |
OperationImplementation | implementedOperationOwner | 1 | implementedOperationOwner:Interface | interface implemented by the operation | |
OperationImplementation | implementedOperationName | name:String | name of the implemented operation | ||
OperationImplementation | implementedOperationParseableName | parseableName:String | name of the implemented operation with escaped keywords | ||
Package | namespace | * | namespace:Package | packages with code language <<namespace>> set | |
PackageableElement | owningPackage | 0..1 | owningPackage | set if owner is a package | |
PackageableElement | owningNamespacePackage | 0..1 | owningNamespacePackage:Package | owning package with code language <<namespace>> set | |
Parameter | direction | direction:ParameterDirectionKind | |||
Parameter | isIn | isIn:Boolean | direction <in> | ||
Parameter | isInOut | isInOut:Boolean | direction <inout> | ||
Parameter | isOut | isOut:Boolean | direction <out> | ||
Parameter | isReturn | isReturn:Boolean | direction <return> | ||
Parameter | isVarArgList | isVarArgList:Boolean | true if parameter is a variable argument list | ||
Parameter | defaultValue | 0..1 | defaultValue:ValueSpecification | ||
Property | defaultValue | 0..1 | defaultValue:ValueSpecification | ||
RedefinableElement | isLeaf | isLeaf:Boolean | |||
Slot | name | name:String | name of the defining feature | ||
Slot | values | * | value:ValueSpecification | ||
Slot | value | value:String | value of the first value specification | ||
StereotypeApplication | name | name:String | name of applied stereotype | ||
StereotypeApplication | taggedValue | * | taggedValue:Slot | first slot of the instance specification | |
StructuralFeature | isReadOnly | isReadOnly | |||
StructuredClassifier | ownedAttribute | * | ownedAttribute:Property | ||
TemplateBinding | signature | 1 | signature:TemplateSignature | ||
TemplateBinding | parameterSubstitution | * | parameterSubstitution:TemplateParameterSubstitution | ||
TemplateParameter | paramDefault | paramDefault:String | template parameter default value | ||
TemplateParameter | ownedParameteredElement | 1 | ownedParameteredElement:ParameterableElement | ||
TemplateParameterSubstitution | parameterSubstitution | parameterSubstitution:String | Java only - code wildcard handling | ||
TemplateParameterSubstitution | parameterDimensionCount | parameterDimensionCount:Integer | code dimension count of the actual parameter | ||
TemplateParameterSubstitution | actual | 1 | OwnedActual:ParameterableElement | ||
TemplateParameterSubstitution | formal | 1 | formal:TemplateParameter | ||
TemplateSignature | template | 1 | template:TemplateableElement | ||
TemplateSignature | ownedParameter | * | ownedParameter:TemplateParameter | ||
TemplateableElement | isTemplate | isTemplate:Boolean | true if template signature set | ||
TemplateableElement | ownedTemplateSignature | 0..1 | ownedTemplateSignature:TemplateSignature | ||
TemplateableElement | templateBinding | * | templateBinding:TemplateBinding | ||
Type | typeName | * | typeName:PackageableElement | qualified code type names | |
TypedElement | type | 0..1 | type:Type | ||
TypedElement | postTypeModifier | postTypeModifier:String | postfix code modifiers | ||
ValueSpecification | value | value:String | string value of the value specification |
Adding a prefix to attributes of a class during code generation
You might need to prefix all new attributes with the "m_" characters in your project.
All new coding elements are written using the SPL templates. For example, if you open UModelSPL\C#[Java]\Default\Attribute.spl, you can change the way the name is written. Namely, you can replace
write $Property.name |
with
write "m_" & $Property.name |
It is highly recommended that you immediately update your model from code after code generation, to ensure that code and model are synchronized.
Note: | As previously mentioned, copy the SPL templates one directory higher (i.e. above the default directory to UModelSPL\C#) before modifying them. This ensures that they are not overwritten when you install a new version of UModel. Please make sure that the "user-defined override default" check box is activated in the Code from Model tab of the "Synchronization Settings" dialog box. |
SPL Templates
SPL templates can be specified per UModel project using the menu option Project | Project Settings (as shown in the screenshot below). Relative paths are also supported. Templates which are not found in the specified directory, are searched for in the local default directory.
![splTemplateRelative](./images/spltemplaterelative.png)
Global objects
$Options | an object holding global options: |
generateComments:bool generate doc comments (true/false) | |
$Indent | a string used to indent generated code and represent the current nesting level |
$IndentStep | a string, used to indent generated code and represent one nesting level |
$NamespacePrefix | XSD only – the target namespace prefix if present |
String manipulation routines
integer Compare(s) |
The return value indicates the lexicographic relation of the string to s (case sensitive):
<0: | the string is less than s |
0: | the string is identical to s |
>0: | the string is greater than s |
integer CompareNoCase(s) |
The return value indicates the lexicographic relation of the string to s (case insensitive):
<0: | the string is less than s |
0: | the string is identical to s |
>0: | the string is greater than s |
integer Find(s) |
Searches the string for the first match of a substring s. Returns the zero-based index of the first character of s or -1 if s is not found.
string Left(n) |
Returns the first n characters of the string.
integer Length() |
Returns the length of the string.
string MakeUpper() |
Returns a string converted to upper case.
string MakeUpper(n) |
Returns a string, with the first n characters converted to upper case.
string MakeLower() |
Returns a string converted to lower case.
string MakeLower(n) |
Returns a string, with the first n characters converted to lower case.
string Mid(n) |
Returns a string starting with the zero-based index position n
string Mid(n,m) |
Returns a string starting with the zero-based index position n and the length m
string RemoveLeft(s) |
Returns a string excluding the substring s if Left( s.Length() ) is equal to substring s.
string RemoveLeftNoCase(s) |
Returns a string excluding the substring s if Left( s.Length() ) is equal to substring s (case insensitive).
string RemoveRight(s) |
Returns a string excluding the substring s if Right( s.Length() ) is equal to substring s.
string RemoveRightNoCase(s) |
Returns a string excluding the substring s if Right( s.Length() ) is equal to substring s (case insensitive).
string Repeat(s,n) |
Returns a string containing substring s repeated n times.
string Right(n) |
Returns the last n characters of the string.