Executable models with TextUML Toolkit 1.2 M1
The first milestone build of the next TextUML Toolkit release is now available from the milestone update site. This preview build is the first to include support for modeling behavior using action semantics. I hinted at this capability here before, and I plan to cover action semantics in the TextUML notation in following posts. But most people will get the gist of the notation from the examples below:
Here is an example of a UML model of an Account class represented in TextUML:
model bank;
import base;
class Account
attribute accountNumber : String;
attribute balance : Integer;
operation withdraw(amount : Integer);
begin
self.balance := self.balance - amount;
end;
operation deposit(amount : Integer);
begin
self.balance := self.balance + amount;
end;
static operation newAccount(number : String,owner : Client): Account;
begin
var newAccount : Account;
newAccount := new Account;
newAccount.accountNumber := number;
newAccount.balance := 0;
link ClientAccount(owner := owner, accounts := newAccount);
return newAccount;
end;
end;
class Client specializes Object
attribute name : String;
static operation newClient(name : String): Client;
begin
var newClient : Client;
newClient := new Client;
newClient.name := name;
return newClient;
end;
end;
association ClientAccount
navigable role owner : Client[1];
navigable role accounts : Account[0, *];
end;
end.
And here an example of a test driver ‘program’ (note the use of a closure for looping through a collection of objects):
package test;
apply base_profile;
import bank;
import base;
class TestDriver
[entryPoint]
static operation run();
begin
var john : Client, mary : Client,
account1 : Account, account2 : Account, account3 : Account;
john := Client#newClient(”John Doe”);
mary := Client#newClient(”Mary Doe”);
Console#writeln(”Created: “.concat(john.name));
account1 := Account#newAccount(”1234-1″, john);
account2 := Account#newAccount(”1238-2″, mary);
account3 := Account#newAccount(”2231-7″, john);
Console#writeln(”account owner: “.concat(account1->ClientAccount->owner.name));
Console#writeln(”account number: “.concat(account1.accountNumber));
Console#writeln(”initial balance is: “.concat(account1.balance.toString()));
account1.deposit(2000);
Console#writeln(”after deposit, balance is: “.concat(account1.balance.toString()));
account1.withdraw(500);
Console#writeln(”after withdrawal, balance is: “.concat(account1.balance.toString()));
/* Now show information for all accounts. */
Account extent.forEach(
(a : Account) {
Console#writeln(”*******”);
Console#writeln(”Owner: “.concat(a->ClientAccount->owner.name));
Console#writeln(”Number: “.concat(a.accountNumber));
Console#writeln(”Balance: “.concat(a.balance.toString()));
}
);
end;
end;
end.
And here is the output of the test driver program, produced by running it on the Libra UML runtime (not part of the TextUML Toolkit):
Created: John Doe account owner: John Doe account number: 1234-1 initial balance is: 0 after deposit, balance is: 2000 after withdrawal, balance is: 1500 ******* Owner: Mary Doe Number: 1238-2 Balance: 0 ******* Owner: John Doe Number: 1234-1 Balance: 1500 ******* Owner: John Doe Number: 2231-7 Balance: 0
Alternatively, one could have generated 100% of the code for a target platform of choice, given that all the information necessary for that is in the model. Note that code generation is not part of the TextUML Toolkit.
Do you want to give it a try? Install M1 from the milestone update site. You can also fetch the example projects from here.
It is certainly a rough stone. I am counting on the community feedback to figure out what areas need to be smoothed first. Please provide your feedback or ask questions on the TextUML Toolkit forums.
[...] has been the case in the TextUML Toolkit, for instance, when implementing closures in the TextUML action language (yes, the Toolkit eats its own dog [...]
Pingback by Closures in UML? Extending the metamodel with the TextUML Toolkit | abstratt: news from the front — January 18, 2009 @ 12:07 am