31st October, 2011 - Posted by rafael.chaves - 2 Comments
Here at Abstratt we are big believers of model-driven development and automated testing. I wrote here a couple of months ago about how one could represent requirements as test cases for executable models, or test-driven modeling. But another very interesting interaction between the model-driven and test-driven approaches is test-driven code generation.
You may have seen our plan for testing code generation before. We are glad to report that that plan has materialized and code generation tests are now supported in AlphaSimple. Follow the steps below for a quick tour over this cool new feature!
Create a project in AlphaSimple
First, you will need a model so you can generate code from. Create a project in AlphaSimple and a simple model.
package person;
enumeration Gender
Male, Female
end;
class Person
attribute name : String;
attribute gender : Gender;
end;
end.
Enable code generation and automated testing
Create a mdd.properties file in your project to set it up for code generation and automated testing:
# declares the code generation engine
mdd.target.engine=stringtemplate
# imports existing POJO generation template projects
mdd.importedProjects=http://alphasimple.com/mdd/publisher/rafael-800/,http://alphasimple.com/mdd/publisher/rafael-548/
# declares a code generation test suite in the project
mdd.target.my_tests.template=my_tests.stg
mdd.target.my_tests.testing=true
# enables automated tests (model and templates)
mdd.enableTests=true
Write a code generation test suite
A code generation test suite has the form of a template group file (extension .stg) configured as a test template (already done in the mdd.properties above).
Create a template group file named my_tests.stg (because that is the name we declared in mdd.properties), with the following contents:
group my_tests : pojo_struct;
actual_pojo_enumeration(element, elementName = "person::Gender") ::= "<element:pojoEnumeration()>"
expected_pojo_enumeration() ::= <<
enum Gender {
Male, Female
}
>>
A code generation test case is defined as a pair of templates: one that produces the expected contents, and another that produces the actual contents. Their names must be expected_<name> and actual_<name>. That pair of templates in the test suite above form a test case named “pojo_enumeration”, which unsurprisingly exercises generation of enumerations in Java. pojo_enumeration is a pre-existing template defined in the “Codegen – POJO templates” project, and that is why we have a couple of projects imported in the mdd.properties file, and that is why we declare our template suite as an extension of the pojo_struct template group. In the typical scenario, though, you may would have the templates being tested and the template tests in the same project.
Fix the test failures
If you followed the instructions up to here, you should be seeing a build error like this:
Line File Description
3 my_tests.stg Test "pojo_enumeration" failed: [-public -]enum Gender {\n Male, Female\n}
which is reporting the code generated is not exactly what was expected – the template generated the enumeration with an explicit public modifier, and your test case did not expect that. Turns out that in this case, the generated code is correct, and the test case is actually incorrect. Fix that by ensuring the expected contents also have the public modifier (note that spaces, newlines and tabs are significant and can cause a test to fail). Save and notice how the build failure goes away.
That is it!
That simple. We built this feature because otherwise crafting templates that can generate code from executable models is really hard to get right. We live by it, and hope you like it too. That is how we got the spanking new version of the POJO target platform to work (see post describing it and the actual project) – we actually wrote the test cases first before writing the templates, and wrote new test cases whenever we found a bug – in the true spirit of test-driven code generation.
Read More
31st October, 2011 - Posted by rafael.chaves - 3 Comments
Can you tell this code was fully generated from a UML model?
This is all live in AlphaSimple – every time you hit those URLs the code is being regenerated on the fly. If you are curious, the UML model is available in full in the TextUML’s textual notation, as well as in the conventional graphical notation. For looking at the entire project, including the code generation templates, check out the corresponding AlphaSimple project.
Preconditions
Operation preconditions impose rules on the target object state or the invocation parameters. For instance, for making a deposit, the amount must be a positive value:
operation deposit(amount : Double);
precondition (amount) { return amount > 0 }
begin
...
end;
which in Java could materialize like this:
public void deposit(Double amount) {
assert amount > 0;
...
}
Not related to preconditions, another case assertions can be automatically generated is if a property is required (lowerBound > 0):
public void setNumber(String number) {
assert number != null;
...
}
Imperative behavior
In order to achieve 100% code generation, models must specify not only structural aspects, but also behavior (i.e. they must be executable). For example, the massAdjust class operation in the model is defined like this:
static operation massAdjust(rate : Double);
begin
Account extent.forEach((a : Account) {
a.deposit(a.balance*rate)
});
end;
which in Java results in code like this:
public static void massAdjust(Double rate) {
for (Account a : Account.allInstances()) {
a.deposit(a.getBalance() * rate);
};
}
Derived properties
Another important need for full code generation is proper support for derived properties (a.k.a. calculated fields). For example, see the Account.inGoodStanding derived attribute below:
derived attribute inGoodStanding : Boolean := () : Boolean {
return self.balance >= 0
};
which results in the following Java code:
public Boolean isInGoodStanding() {
return this.getBalance() >= 0;
}
Set processing with higher-order functions
Any information management application will require a lot of manipulation of sets of objects. Such sets originate from class extents (akin to “#allInstances” for you Smalltalk heads) or association traversals. For that, TextUML supports the higher-order functions select (filter), collect (map) and reduce (fold), in addition to forEach already shown earlier. For example, the following method returns the best customers, or customers with account balances above a threshold:
static operation bestCustomers(threshold : Double) : Person[*];
begin
return
(Account extent
.select((a:Account) : Boolean { return a.balance >= threshold })
.collect((a:Account) : Person { return a->owner }) as Person);
end;
which even though Java does not yet support higher-order functions, results in the following code:
public static Set<Person> bestCustomers(Double threshold) {
Set<Person> result = new HashSet<Person>();
for (Account a : Account.allInstances()) {
if (a.getBalance() >= threshold) {
Person mapped = a.getOwner();
result.add(mapped);
}
}
return result;
}
which demonstrates the power of select and collect. For an example of reduce, look no further than the Person.totalWorth attribute:
derived attribute totalWorth : Double := () : Double {
return (self<-PersonAccounts->accounts.reduce(
(a : Account, partial : Double) : Double { return partial + a.balance }, 0
) as Double);
};
which (hopefully unsurprisingly) maps to the following Java code:
public Double getTotalWorth() {
Double partial;
partial = 0;
for (Account a : this.getAccounts()) {
partial = partial + a.getBalance();
}
return partial;
}
Would you hire AlphaSimple?
Would you hire a developer if they wrote Java code like AlphaSimple produces? For one thing, you can’t complain about the guy not being consistent.
Do you think the code AlphaSimple produces needs improvement? Where?
Want to try by yourself?
There are still some bugs in the code generation that we need to fix, but overall the “POJO” target platform is working quite well. If you would like to try by yourself, create an account in AlphaSimple and to make things easier, clone a public project that has code generation enabled (like the “AlphaSimple” project).
Read More
24th September, 2011 - Posted by rafael.chaves - No Comments
I had the honor of being interviewed by Todd Humphries, Software Engineer at Objektum Solutions, on my views on UML and model-driven development. Here is an excerpt of the interview:
Todd Humphries: Did you have a ‘Eureka!’ moment when modelling made sense for the first time and just became obvious or was there one particular time you can think of where your opinion changed?
Rafael Chaves: When I was first exposed to UML back in school it did feel cool to be able to think about systems at a higher level of abstraction, and be able to communicate your ideas before getting down to the code (we often would just model systems but never actually build them). The value of UML modeling for the purpose of communication was evident, but that was about it. I remember feeling a bit like I was cheating, as drawing diagrams gave me no confidence the plans I was making actually made a lot of sense.
After that, still early in my career, I had the opportunity of working in a team where we were using an in-house code generation tool (first, as many have done, using XML and XSLT, and later, using UML XMI and Velocity templates, also common choices). We would get reams of Java code, EJB configuration files and SQL DDL generated from the designer models, and it did feel a very productive strategy for writing all that code. But the interesting bits (business logic) were still left to be written in Java (using the generation gap pattern). It was much better than writing all that EJB boilerplate code by hand, but it was still cumbersome and there was no true gain in the level of abstraction, as we would model thinking of the code that would be generated – no surprise, as there was no escaping the facts that we would rely on the Java compiler and JUnit tests to figure out whether the model had problems, and in order to write the actual business logic in Java, we had to be very familiar with the code that was generated. So even though I could see the practical utility of modeling by witnessing the productivity gains we obtained, there was a hackish undertone to it, and while it worked, it didn’t feel like solid engineering.
It was only later, when…
Visit The Technical Diaries, Objektum team’s blog, for the full interview. Do you agree with my views? Have your say (here or there).
Read More
29th August, 2011 - Posted by rafael.chaves - 6 Comments
Executable models, as the name implies, are models that are complete and precise enough to be executed. One of the key benefits is that you can evaluate your model very early in the development life cycle. That allows you to ensure the model is generally correct and satisfies the requirements even before you have committed to a particular implementation platform.
One way to perform early validation is to automatically generate a prototype that non-technical stakeholders can play with and (manually) confirm the proposed model does indeed satisfy their needs (like this).
Another less obvious way to benefit from executable models since day one is automated testing.
The requirements
For instance, let’s consider an application that needs to deal with money sums:
- REQ1: a money sum is associated with a currency
- REQ2: you can add or subtract two money sums
- REQ3: you can convert a money sum to another currency given an exchange rate
- REQ4: you cannot combine money sums with different currencies
The solution
A possible solution for the requirements above could look like this (in TextUML):
package money;
class MixedCurrency
end;
class Money
attribute amount : Double;
attribute currency : String;
static operation make(amount : Double, currency : String) : Money;
begin
var m : Money;
m := new Money;
m.amount := amount;
m.currency := currency;
return m;
end;
operation add(another : Money) : Money;
precondition (another) raises MixedCurrency { return self.currency = another.currency }
begin
return Money#make(self.amount + another.amount, self.currency);
end;
operation subtract(another : Money) : Money;
precondition (another) raises MixedCurrency { return self.currency = another.currency }
begin
return Money#make(self.amount - another.amount, self.currency);
end;
operation convert(anotherCurrency : String, exchangeRate : Double) : Money;
begin
return Money#make(self.amount * exchangeRate, anotherCurrency);
end;
end;
end.
Now, did we get it right? I think so, but don’t take my word for it.
The proof
Let’s start from the beginning, and ensure we satisfy REQ1 (a money sum is a pair <amount, currency>:
[Test]
operation testBasic();
begin
var m1 : Money;
m1 := Money#make(12, "CHF");
Assert#assertEquals(12, m1.amount);
Assert#assertEquals("CHF", m1.currency);
end;
It can’t get any simpler. This test shows that you create a money object providing an amount and a currency.
Now let’s get to REQ2, which is more elaborate – you can add and subtract two money sums:
[Test]
operation testSimpleAddAndSubtract();
begin
var m1 : Money, m2 : Money, m3 : Money, m4 : Money;
m1 := Money#make(12, "CHF");
m2 := Money#make(14, "CHF");
m3 := m1.add(m2);
Assert#assertEquals(26, m3.amount);
Assert#assertEquals("CHF", m3.currency);
/* if m1 + m2 = m3, then m3 - m2 = m1 */
m4 := m3.subtract(m2);
Assert#assertEquals(m1.amount, m4.amount);
Assert#assertEquals(m1.currency, m4.currency);
end;
We add two values, check the result, them subtract one of them from the result and expect the get the other.
REQ3 is simple as well, and specifies how amounts can be converted across currencies:
[Test]
operation testConversion();
begin
var m1 : Money, result : Money;
m1 := Money#make(3, "CHF");
result := m1.convert("USD", 2.5);
Assert#assertEquals(7.5, result.amount);
Assert#assertEquals("USD", result.currency);
end;
We ensure conversion generates a Money object with the right amount and the expected currency.
Finally, REQ4 is not a feature, but a constraint (currencies cannot be mixed), so we need to test for rule violations:
[Test]
operation testMixedCurrency();
begin
try
Money#make(12, "CHF").add(Money#make(14, "USD"));
/* fail, should never get here */
Assert#fail("should have failed");
catch (expected : MixedCurrency)
/* success */
end;
end;
We expect the operation to fail due to a violation of a business rule. The business rule is identified by an object of a proper exception type.
There you go. Because we are using executable models, even before we decided what implementation platform we want to target, we already have a solution in which we have a high level of confidence that it addresses the domain-centric functional requirements for the application to be developed.
Can you say “Test-driven modeling”?
Imagine you could encode all non-technical functional requirements for the system in the form of acceptance tests. The tests will run against your models whenever a change (to model or test) occurs. Following the Test-Driven Development approach, you alternate between encoding the next requirement as a test case and enhancing the model to address the latest test added.
Whenever requirements change, you change the corresponding test and you can easily tell how the model must be modified to satisfy the new requirements. If you want to know why some aspect of the solution is the way it is, you change the model and see the affected tests fail. There is your requirement traceability right there.
See it by yourself
Would you like to give the mix of executable modeling and test-driven development a try? Sign up to AlphaSimple now, then open the public project repository and clone the “Test Infected” project (or just view it here).
P.S.: does this example model look familiar? It should – it was borrowed from “Test Infected: Programmers Love Writing Tests“, the classical introduction to unit testing, courtesy of Beck, Gamma et al.
Read More
15th May, 2011 - Posted by rafael.chaves - 2 Comments
Smalltalk, Ruby, Groovy and other languages allow one to implement loops using closures. But so does TextUML/UML. Given the primary use case of TextUML/UML is to generate code, one thorny question is how to generate code from a UML model using closures for implementing loops through collections into a language, like Java or C, just as one would normally write loops over collections in those closure-free languages.
Here are some examples of how to translate from closure-based loops (in TextUML, but the specific syntax shouldn’t matter) to ordinary loops (in Java, but again, syntax specifics shouldn’t matter):
forEach
In TextUML
self->units.forEach((u : Unit) {
link ProjectUnits(project := clone, units := u.clone()) }
);
In Java
for (Unit u : this.getUnits()) {
clone.addUnits(u.clone());
}
select
In TextUML
return Project extent.select((p : Project) : Boolean { return p.shared });
In Java
Set<Project> result = new HashSet<Project>();
for (Project p : Project.allInstances()) {
if (p.isShared()) {
result.add(p);
}
}
return result;
collect
In TextUML
return Project extent.collect((p : Project) : User { return p->owner });
In Java
Set<User> result = new HashSet<User>();
for (Project p : Project.allInstances()) {
User owner = p.getOwner();
result.add(owner);
}
return result;
count
In TextUML
return Project extent.count((p : Project) : Boolean { return p.shared });
In Java
int count = 0;
for (Project p : Project.allInstances()) {
if (p.isShared()) {
count++;
}
}
return count;
In AlphaSimple, we got much of what is needed above in place. There are though some additional challenges posed by the need of chaining those collection primitives, and the need for mapping the data flow that chains them together to an unchained form, using local variables in the target language. These last two aspects have been keeping me awake at night. If you feel like throwing a light (with strategies, references) on how to address that, by all means go for it, it is pretty dark in here right now… 
Read More
7th April, 2011 - Posted by rafael.chaves - 19 Comments
Found an old discussion on the MDSN site about a study on the productivity of UML, brought up by the DSM folks. You can see some of the common caveats raised in this comment by MetaCase’s Steve Kelly. Please read his points and come back here.
I actually didn’t notice it was an old thread and replied to it. Call me cheap, but I hate perfectly good arguments going to waste on a dead thread, so I am recycling my original response (now deleted) here as a blog post.
1) repeat with me, UML is not a graphical language – it has a graphical notation, but others are allowed. Criticism of UML as a whole based on the productivity issues around the graphical notation is cherry picking or (at best) a misinformed opinion. If you don’t like the default notation, create one (like we did!) to suit your taste (and it will still be UML). The specs are public, and there are good open source implementations of the metamodel, that are used by many tools.
2) you don’t need to give up on the semantics of UML to map a modeled class to multiple artifacts. That is just plain OO design mapping to real-world implementation technologies. UML is an OO language first and foremost.
3) There is no need to mix languages, UML has support for both structural and behavioral modeling (since 2002!). Action languages are not (or don’t have to be) “other languages” – but just a textual notation on top of the existing abstract syntax and semantics. That is not a marketing ploy, incorporating elements of the Shlaer-Mellor approach was just a sound strategic decision that made UML much better.
4) Annotations (or stereotypes) is an established (see C#, Java) and cost effective way of tailoring a general purpose language to one’s needs. Not everything calls for a DSL. Both approaches have pros and cons, one has to pick what is best for the situation at hand.
5) All the stories of failure or limited success with generating code from UML models I heard or read are caused by the decision of ignoring behavioral modeling in UML and doing partial code generation. That is a losing proposition, no matter the modeling language. Again, just like the notation issue, analyzing UML productivity based exclusively on those narrow minded cases is at best spreading misinformation. Kudos to MetaCase for promoting full code generation, that is the way to go. But full code generation is not an exclusivity of DSL, the Executable UML folk (and other modeling communities) have been doing it successfully for a long time as well.
Can we move away from the pissing contest between modeling approaches? That got old ages ago. There are way more commonalities than differences between DSM and executable modeling with GPLs like UML, productivity gains included. There is room for both approaches, and it would not be wise to limit oneself to one or another.
What is your opinion? Are you still using old school UML and limiting yourself to generating stubs? Why on earth haven’t you moved to the new world of executable models yet?
Read More
23rd February, 2011 - Posted by rafael.chaves - No Comments
We just released a new build of AlphaSimple with basic support for customized code generation using templates, more specifically, using StringTemplate templates. Let’s take a quick tour:
Create a model in AlphaSimple
Create your model in AlphaSimple. If you need help with the notation, check the tutorial. You can just start with the default contents you get when creating a new project:
package NewProject;
class NewProject
/* attributes */
attribute text : String;
attribute check : Boolean;
attribute number : Integer[0,1];
attribute date : Date[0,1];
/* relationships */
/* actions */
operation toggle();
begin
self.check := not self.check;
end;
/* queries */
end;
end.
Remember to save your file.
Create a template
AlphaSimple supports StringTemplate as template language (check out this 5-minute introduction). In order to define a template in your AlphaSimple project, create a file with the .stg extension (in StringTemplate lingo, it is a template group file). You can use the example below, which for every class in a model, creates a text file that shows its name, and the names of its attributes and operations:
group simple;
outputPath(class) ::= <<
<! The 'outputPath' template is optional and determines the path of the file generated (the default is the class name) !>
<class.name>.txt
>>
contents(class) ::= <<
<! The 'contents' template is mandatory and is the entry point for generating the contents of the file from a class. !>
Class: <class.name>
Attributes: <class.ownedAttributes:{attr|<attr.name>};separator=", ">
Operations: <class.ownedOperations:{op|<op.name>};separator=", ">
>>
Again, remember to save this file.
Declare your custom template
To enable custom templates, you need to create an AlphaSimple configuration file (mdd.properties). It is a configuration file that drives the compiler and code generation in AlphaSimple. Your file can be as simple as this:
# the template implementation we use
mdd.target.engine=stringtemplate
# the templates supported (always mdd.target.<name>.template=<template file name>
mdd.target.simple.template=simple.stg
Both entries are mandatory. Ensure the line declaring the template matches the name you chose when creating the template file. Save this file.
Test your template
In order to test your custom template, if you have been using a guest account, you will need to sign up first (it’s free). Your project contents will be preserved.
First, publish your project (see button in the editor). Then, from your list of projects (“My Projects”), share your project (open lock button). For any future modifications to model, template or configuration file, you will need to publish your changes again. This will not be required in the future.
We are almost there. Since there is no UI for triggering custom generation yet, you will need to use the REST API, which is quite easy. Find out the numeric id of your project (from any link pointing to it). Then hit a URI with this shape:
http://alphasimple.com/mdd/publisher/<username>-<project-id>/
For instance, for project 515, belonging to user simple, the URI would be:
http://alphasimple.com/mdd/publisher/simple-515/
which returns:
<workspace packageCount='1' timestamp='1298449947000'>
<model name='NewProject.uml'
uri='http://alphasimple.com/mdd/publisher/simple-515/NewProject.uml?secret='
graph='http://alphasimple.com/mdd/diagram/simple-515/NewProject.uml?secret='/>
<properties name='mdd.properties' uri='http://alphasimple.com/mdd/publisher/simple-515/mdd.properties?secret='/>
<source name='NewProject' uri='http://alphasimple.com/mdd/publisher/simple-515/NewProject?secret='/>
<source name='simple.stg' uri='http://alphasimple.com/mdd/publisher/simple-515/simple.stg?secret='/>
<generator platform="jpa" uri="http://alphasimple.com/mdd/generator/simple-515/jpa?secret="/>
<generator platform="pojo" uri="http://alphasimple.com/mdd/generator/simple-515/pojo?secret="/>
<generator platform="simple" uri="http://alphasimple.com/mdd/generator/simple-515/simple?secret="/>
<renderer uri="http://alphasimple.com/animator/index.jsp?repository=simple-515#"/>
</workspace>
which gives you access to all the objects that AlphaSimple project has: source files (model and template), the configuration file, the generated UML model and corresponding class diagram, and, what we are mostly interested here, all generators available. Note that it includes not only a generator for the custom template, but some other built-in generators as well. But lets ignore those for now, and open the generator URI for our custom template (named “simple”). Voila, this is what you should see:
Class: NewProject
Attributes: text, check, number, date
Operations: toggle
Conclusion
We hope this very simple example gave you an idea of how you can generate code from UML models using AlphaSimple and StringTemplate (even if it doesn’t really generate actual code). In the example template, we only navigate from a class to its operations and attributes, and access their names, but your template has virtually any information from the underlying UML model available to generate from.
If you would like to see more interesting models and actual code generation templates, browse the shared project area. For now, there is currently just one project with an elaborate template. Clone it and model (and generate) away. If you have any feedback, just post a comment here or check the AlphaSimple contact page.
Read More
6th February, 2011 - Posted by rafael.chaves - 10 Comments
Last November I did a lecture on Model-driven Development with Executable UML models to a class of Software Engineering undergrad students at UVic. Here are the slides:
I think it gives a good summary of my views on model driven development (with Executable UML or not):
- even though problem domains are typically not very complex, enterprise software is complex due to the abundance of secondary crosscutting concerns (persistence, concurrency, security, transactions etc)
- there are two dominant dimensions in enterprise software: business domain concerns and technological concerns
- they are completely different in nature (change rate, abstraction level) and require different approaches (tools, skills, reuse)
- MDD is a strategy that handles well that divide: models address business domain concerns, PIM->PSM transformation addresses technological concerns
- brainstorming, communication, documentation and understanding (rev. engineering) are not primary goals of MDD – to produce running code in a productive and rational way is
- models in MDD must be well-formed, precise, complete, executable, technology independent
- graphical representations are not suitable for executable modeling (textual notations are much better)
- diagrams != models, text != code (that would look good on a t-shirt!)
I guess those who know me won’t have seen anything new above (these ideas make the very foundations of the TextUML Toolkit and AlphaSimple).
Do you agree with those positions?
Read More
10th January, 2011 - Posted by rafael.chaves - 5 Comments
[What follows was adapted from a discussion on LinkedIn on why companies developing software don't use UML more]
UML proponents argue that by using UML one gains the ability to properly represent important knowledge on the problem domain and intended solution design. That leads to good things such as improved communication and better quality of the software.
I certainly don’t question that. The ability of devising a solution at the right level of abstraction is extremely important. Yet, that on its own is not enough. It doesn’t help if the language that allows you to specify a solution at the right level of abstraction does not lead to running code (via code generation or direct execution). If one has to specify a solution again by implementing by hand (say, in Java or C#) what the model describes (i.e. using the model as a reference), that greatly offsets any gains from modeling. As the agilists say: Don’t Repeat Yourself. I won’t bore you with the consequences of breaking that simple rule, it must be obvious to any developer worth their salt.
If you are going to be pragmatic, and you cannot generate running code from your models, from a developer’s point of view, there is no much value for UML in the development process.
Developers play an increasingly important role in software product development. Non-executable UML models are seen as fluff, an unnecessary burden to software developers, and hence the poor reputation with that crowd, as the majority of the places using UML is unfortunately using it that way.
I see two solutions for this: either get models to be executable, or get programming languages to support a higher level of abstraction. Even though I am a believer of the former (and our work at Abstratt follows that approach – see AlphaSimple and TextUML Toolkit), I won’t be surprised if the latter ends up being the winning approach (see RAD frameworks such as Grails and Rails).
Do you agree? Which approach do you prefer? Why?
Read More
5th January, 2011 - Posted by rafael.chaves - No Comments
As recently announced, shared models in AlphaSimple now sport UML class diagrams thanks to Graphviz support in the Google Charts API .
What I didn’t mention is that you can customize how diagrams are rendered by specifying query parameters on the image URL. For instance, compare the basic diagram from the previous post with the customized diagram below (click on it to see the URL). Can you spot the differences?

Here are all supported options:
- showAssociationEndOwnership (boolean)
- showStructuralFeatureVisibility (boolean)
- showAssociationEndMultiplicity (boolean)
- showAssociationName (boolean)
- showAssociationEndName (boolean)
- showClassifierCompartmentForPackage (Current, Immediate, Any)
- showClassifierStereotypes (boolean)
- showElementsInOtherPackage (Never, Immediate, Always)
- showEmptyClassifierCompartments (NotEmpty, Never, Always)
- showFeatureStereotypes (boolean)
- showParameterDirection (boolean)
- showPrimitives (boolean)
- showRelationshipStereotypes (boolean)
Give it a try (don’t forget you need to share your projects, and republish for changes to become visible to others). Are there more control options you would like to see?
Read More
2nd January, 2011 - Posted by AlphaSimple Team - 5 Comments
As briefly mentioned in a previous post, you can now render UML class diagrams using AlphaSimple. This is how you do it:
- sign up for AlphaSimple (it’s free)
- create a project
- create your models using the TextUML notation (tutorial, reference). Make sure you use no extension or use .tuml as file extension.
- once your project is valid, publish it
- back to your project list (“My Projects”), share the project by clicking the open lock button. Note that when you do that you make your project available for any users to see and copy.
- now on the shared project list (“Shared Projects”), find and open your project – you will see a “Model Diagram” tab – there is your diagram! If you want to share your diagram with others, you can copy the image location and pass that URL around.
Here is an example of diagram produced for project “Lesson #5 – All together now“:

How does it work?
If you are interested in understanding what is involved here:
- AlphaSimple uses the TextUML compiler from our open source TextUML Toolkit project translating TextUML source files into UML models (using the Eclipse UML2 format).
- AlphaSimple also uses the TextUML Toolkit component (based on the EclipseGraphviz project) for generating Graphviz dot diagrams from UML models.
- For rendering the actual diagram from the dot description, instead of directly using Graphviz, AlphaSimple uses Google’s Chart API support for rendering dot diagrams.
This is all very new, so there may be some rough spots. If you have any issues, or have suggestions, send them our way.
Read More
5th August, 2010 - Posted by rafael.chaves - 7 Comments
The TextUML Toolkit version 1.6 has been released. It is the same RC1 build mentioned here a week ago. The listing on the Eclipse Marketplace has been updated, so in addition to the regular update site (http://abstratt.com/update/), if you are using Eclipse 3.6, you can get it even more conveniently using the brand new Eclipse Marketplace Client.
Take a look at the new notation features:
- preconditions on operations
operation withdraw(amount : Real);
precondition { amount > 0 and amount < self.balance }
begin
self.balance := self.balance - amount;
end;
reference employees : Employee[*]
/* calculated field */
derived attribute employeeCount : Integer := ():Integer { return self->employees.size() };
- initial values on properties
attribute available : Boolean := true;
You can also try these new features online on AlphaSimple. Sign up or start a guest session to create, validate and run your models on the spot, there is nothing to install!
Read More
8th February, 2010 - Posted by rafael.chaves - 19 Comments
UML has been getting a lot of criticism from all sides, even from the modeling community. Sure, it has its warts:
- it is a huge language, that wants to be all things to all kinds of people (business analysts, designers, developers, users)
- it has a specification that is lengthy, hard to navigate and often vague, incomplete or inconsistent
- it is modular, but its composition mechanism (package merging) is esoteric and not well understood by most
- it is extensible, but language extensions (profiles and stereotypes) are 2nd-class citizens
- it lacks a reference implementation
- its model interchange specification is so vague that often two valid implementations won’t work with each other
- its committees work behind closed doors, there is no opportunity for non-members to provide feedback on specifications while they are in progress (membership is paid)
- <add your own grudges here>
However, even though I see a lot of room for improvement, I still don’t think there is anything better out there. The more I become familiar with the UML specification, the more impressed I am about its completeness, and how issues I had never thought about before were dealt with by its designers. And it seems that the OMG recognizes some of the issues I raised above as shortcomings and is working towards addressing them. Unfortunately, some fundamental problems are likely to remain.
In my opinion (hey, this is my blog!), for a modeling language to beat UML:
- it must be general purpose, not tailored to a specific architecture or style of software
- it must not be tailored to an implementation language
- it must be based on or compatible with the object paradigm
- it must not be limited to one of the dominant aspects of software (state, structure, behavior)
- it must be focused on executability/code generation (and thus suitable for MDD) as opposed to documentation/communication
- it must be modular, and user extensions should be 1st class citizens
- its specification should follow an open process
- it must not be owned/controlled by a single company
- it must not require royalties for adoption/implementation
My suspicion is that the next modeling language that will beat the UML as we know today is the future major release of UML. Honestly, I would rather see a new modeling language built from scratch, focused on building systems, that didn’t carry all that requirement/communication/documentation-oriented crap^H^H^H^Hbaggage that UML has (yes, I am talking about you, use case, sequence, instance and collaboration diagrams!), and developed in a more open and agile process than the OMG can possibly do. But I am not hopeful. The current divide between general purpose and domain specific modeling communities is not helping either.
So, what is your opinion? Do you think there are any better alternatives that address the shortcomings of UML without imposing any significant caveats of their own? Have your say.
Read More
17th January, 2010 - Posted by rafael.chaves - No Comments
The TextUML Toolkit has since release 1.2 had a metamodel extension package (inaptly named ‘meta’). This metamodel extension package defined new metaclasses not available in UML such as:
- closure – an activity that has another activity as context
- conversion action – an action that flows an input directly as output just changing the type
- literal double – a literal value for double precision numeric values
- signature – a classifier that contained parameters, the type of a closure
- meta value specification – a value specification for meta references
- collection literals – a value specification that aggregates other value specifications
Turns out extending the UML metamodel by definining new packages and metaclasses is a bad idea. Some reasons (yes, I am feeling ‘bullety’):
- it is non-standard
- other UML tools cannot read instances of your metaclasses, some won’t read your models at all if they have *any* unknown metaclasses
- there is little documentation on how to maintain these kinds of metamodel extensions
- since it is not the mainstream approach, we are bound to encounter more issues
Because of that, release 1.6 will rely exclusively on profiles and stereotypes for extending the UML metamodel.
What to expect
For conventional users of the Toolkit, this change might possibly go unnoticed, barring any potential bugs introduced in the process.
People using the built-in base package and the base_profile will be directly affected. The elements in these models are still provided, by they are now in the new mdd_extensions profile, or one of the new mdd_types, mdd_collections and mdd_console packages.
We apologize for any inconvenience these changes might bring, but we strongly believe they are required to make the TextUML Toolkit a better product. If you have any trouble moving to 1.6 (to be released later this month), make sure to hit the user forums or report issues.
Read More
29th November, 2009 - Posted by rafael.chaves - 1 Comment
I have been trying to figure out whether the TextUML notation for action semantics can be dealt with properly by tools such as Xtext and EMFText (class models and state machines should be fine). For example, given this structural model fragment:
class Advertisement
attribute summary : String;
attribute description : String;
attribute keywords : Keyword[*];
attribute category : Category;
operation addKeyword(keywordName : String);
static operation findByCategoryName(catName : String) : Advertisement[*];
end;
association AdvertisementKeyword
role Advertisement.keywords;
role advertisement : Advertisement;
end;
class Keyword specializes Object
attribute name : String;
end;
class Category specializes Object
attribute name : String;
attribute description : String;
end;
association AdvertisementCategory
role Advertisement.category;
role ad : Advertisement[*];
end;
Notice the Advertisement class declares two operations. Their behaviour in TextUML could be written as:
operation Advertisement.addKeyword;
begin
var newKeyword : Keyword;
newKeyword := new Keyword;
newKeyword.name := keywordName;
link AdvertisementKeyword(keywords := newKeyword, advertisement := self);
end;
operation Advertisement.findByCategoryName;
begin
return Advertisement extent.select(
(a : Advertisement) : Boolean {
return a->AdvertisementCategory->category.name = catName;
}
);
end;
Note that TextUML allows the behavior to be specified inline when declaring an operation in a class, or in separate, as above (that explains the lack of parameters, modifiers etc).
In the resulting UML model, the behaviour of Advertisement.addKeyword would roughly map to this (using a textual pseudo-notation for UML activities that is hopefully more readable than raw XMI):
activity(name: "addKeyword") {
structuredActivityNode {
variable(name: "newKeyword", type: #String)
writeVariable(variable: #newKeyword, value: createObject(class: #Keyword))
writeAttribute(
attribute: #Keyword.name,
target: readVariable(variable: #newKeyword),
value: readVariable(variable: #keywordName)
)
createLink(
association: #AdvertisementKeyword,
end1: #AdvertisementKeyword.keyword,
end1Value: readVariable(variable: #newKeyword),
end2: #AdvertisementKeyword.advertisement,
end2Value: readSelf()
)
}
}
and the behaviour Advertisement.findByCategoryName would map to this:
activity(name: "findByCategoryName") {
structuredActivityNode {
// implicit variable for return value
variable(name: "@result", type: #Advertisement, upperBound: *)
// implicit variable for parameter value
variable(name: "catName", type: #String)
writeVariable(
variable: #@result,
value: callOperation(
operation: #Advertisement.select,
target: readExtent(class: #Advertisement),
filter: metaValue(#@findByCategoryName_closure1)
)
)
}
}
// a closure is an activity that has a reference to a context activity
closure(name: "@findByCategoryName_closure1") {
// implicit variable for return value
variable(name: "@result", type: #Boolean)
// implicit variable for parameter value
variable(name: "a", type: #Advertisement)
writeVariable(
variable: #@result,
value: callOperation(
operation: #Object.equals,
// variables from the context activity are available here
target: readVariable(variable: #catName)
args: readAttribute(attribute: #Category.name, target: readLink(
association: #AdvertisementCategory,
fedEnd: #Advertisement.ad,
fedEndValue: readVariable(variable: #a),
readEnd: #Advertisement.category
))
)
)
}
Note that UML does not have closures, this is an extension to the UML metamodel which I wrote about here before.
Some background on the metaclasses involved: ReadVariableAction, CreateObjectAction, CreateLinkAction, ReadExtentAction etc are all action metaclasses. Actions are the building blocks for modeling activity behaviour in UML.
The million dollar question is: can Xtext and EMFText handle more complex textual notations like this? Is this out of the happy path? Has anyone done something similar? I am under the impression I could use Xtext or EMFText better if I used them based on a intermediate metamodel for behavior that would be closer to the concrete syntax (to get all the IDE bells and whistles for free) and then transformed that to UML in a separate step.
If you have the answers for any of these questions (or even if you have comments and questions of your own), please chime in.
Read More
13th April, 2009 - Posted by rafael.chaves - 3 Comments
Even though it has always been possible to open models generated by the TextUML Toolkit in UML2-based diagramming tools, until 1.2 the Toolkit assigned new ids to each element every time a model was regenerated. That meant that any diagrams based on the model being regenerated would become invalid as any cross-references from the diagram to the model would be broken.
Starting with 1.3 M1 (test build available from the milestones update site), the TextUML Toolkit is now better compatible with diagramming tools based on UML2. You can edit the source in TextUML and save it to cause model generation to occur, and any existing diagrams should still remain valid.
Here you can see the TextUML Toolkit being used side-by-side with the UML2 Tools graphical editor:

Actually, I found out that UML2 Tools can be a great companion for the TextUML Toolkit because it seems to just do the right thing when it notices the underlying model has been changed externally: new elements show up, removed elements disappear, preserved elements preserve their layout. I tried doing the same with Papyrus 1.11 and unfortunately it does not seem to handle external updates properly. I haven’t tried with other UML2-based diagram editors, so at this point I am not sure which one represents the trend here.
Read More
18th March, 2009 - Posted by rafael.chaves - 1 Comment
I strongly believe queries are an essential part of a domain model. As such, in our quest to have (UML) models that can fully (yet abstractly) describe object models for the common enterprise applications, we cannot leave out first class support for queries.
But how do you do queries in UML? The obvious answer seems to be OCL, but that is not the approach I am taking as OCL and UML have serious interoperability/duplication issues. Instead, I took the middleweight extension approach.
First, we model a protocol for manipulating collections of objects (showing only a subset here):
class Collection specializes Basic
operation includes(object : T) : Boolean;
operation isEmpty() : Boolean;
operation size() : Integer;
operation exists(predicate : {(:T) : Boolean}) : Boolean;
operation \any(predicate : {(:T) : Boolean}) : T;
operation select(filter : {(:T) : Boolean}) : T[*];
operation collect(mapping : {(:T) : any}) : any[*];
operation forEach(predicate : {(:T)});
operation union(another : T[*]) : T[*];
(...)
end;
That protocol is available against any collection of objects, which in UML can be obtained by navigating an association, reading an attribute, invoking an operation, obtaining the extent of a class (remember Smalltalk’s allInstances), anything where the resulting value has multiplicity greater than one.
Note most of the operations in the Collection protocol take blocks/closures as arguments. Closures are used in this context to define the filtering criterion for a select, or the mapping function for a collect.
For instance, for obtaining all accounts that currently do not have sufficient funds, this method would do it:
static operation findNSFAccounts() : Account[*];
begin
return Account extent.select(
(a : Account) : Boolean {return a.balance < 0}
);
end;
Note the starting collection is the extent of the Account class. That is very similar to what is done in the context of query languages for object-oriented databases, such as OQL or JDOQL. We then filter the class extent by selecting only those accounts that have a negative balance, by passing a block to the select operation.
When mapping that behavior to SQL, we could end up with a query like this:
select _account_.* from Account _account_ where _account_.balance < 0
Another example: we want to obtain all customers with a balance above a given amount, let’s say, to send them a letter to thank them for their business. The following method specifies that logic:
static operation findBestCustomers(minBalance : Real) : Customer[*];
begin
return (Account extent.select(
(a : Account) : Boolean { return a.balance >= minBalance }
).collect(
(a : Account) : Customer { return a->AccountOwner->owner }
) as Customer);
end;
Note that we start off with the extent of Account class, filter it down to the accounts with good balance using select, and then map from that collection to a collection with the respective account owners by traversing an association using collect.
If that was going to be mapped to SQL, one possible mapping would be:
select _customer_.* from Account _account_
inner join Customer _customer_
on _account_._accountID_ = _customer_._customerID_
where _account_.balance >= ?
Much of this can be already modeled if you try it out with the TextUML Toolkit 1.2. But, you might ask, once you model that, what can you do with UML models containing queries like the ones shown here?
Since the models are complete (include structure and behavior), you can:
- Execute them. Imagine writing automated tests against your models, or letting your customer play with them before you actually start working on the implementation.
- Generate complete code. The generated code will include even your custom queries, not only those basic ones (
findAll, findByPK) code generators can usually produce for you.
If you would like to see tools that support that vision, keep watching this blog.
So, what is your opinion?
Do you see value in being able to specify queries in your models? Is this the right direction? What would you do differently?
Read More
18th January, 2009 - Posted by rafael.chaves - 2 Comments
UML is known to be a huge language, and that has two problems: it is too complex, having way more features than most applications will ever need, and can still be insufficient, as no single language will ever cover everybody’s needs.
In the article “Customizing UML: Which Technique is Right for You?”, James Bruck and Kenn Hussey (both from the UML2 team) do a great job at covering the several options for extending (or restricting) UML (James also made a related presentation at last year’s EclipseCon, together with Christian Damus, of Eclipse OCL fame). Cutting to the chase, these are the options they identify:
- using keywords (featherweight extensions)
- using profiles, stereotypes and properties/tagged values (lightweight extensions)
- extending the metamodel by specializing the existing metaclasses (middleweight extensions)
- using package merges to select the parts of UML you need (heavyweight extensions)
Each option has its own strengths and weaknesses, as you can see in the referred article/presentation. At this time, the TextUML notation supports two of those approaches: profiles and metamodel extensions.
Adding closures to UML
Even though profiles are the most popular (and recommended) mechanism for extending UML, it is not enough in some cases/applications. That 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 food).
According to the wikipedia entry, “a closure is a function that is evaluated in an environment containing one or more bound variables. When called, the function can access these variables. ”
It really makes sense to (meta) model a closure as some kind of UML activity, which is basically a piece of behavior that can be fully specified in UML. Methods, for instance, are better modeled in UML as activities. Activities are composed of activity nodes and actions, which are similar to blocks of code and instructions, respectively.
The only thing that is missing in the standard Activity metaclass is the ability for a closure to have an activity node from another activity as context, so it can access context’s local variables. So here is a possible (meta) modeling of closures in UML using the TextUML syntax:
[Standard::Metamodel]
model meta;
apply Standard;
(*
A closure is a special kind of activity that has another
activity's activity node as context. A closure might
reference variables declared in the context activity node.
*)
[Standard::Metaclass]
class Closure specializes uml::Activity
(* The activity node that provides context to this closure. *)
reference contextNode : uml::StructuredActivityNode;
end;
end.
Or, for those of you who prefer a class diagram (courtesy of the EclipseGraphviz integration):

Note a model contributing language extensions must be applied the Standard::Metamodel stereotype, and each metaclass must be assigned the stereotype Standard::Metaclass.
Of course, there is no point in being able to metamodel closures, if there is no way to refer to them. We need a kind of type that we can use to declare variables and parameters that can hold references to closures. That also means we need to be able to invoke/dereference a closure reference, and there is no support for referring to metamodel elements in the UML action language. That means we need more language extensions. But I will leave that to another post. My goal here was to show how simple it is to create a simple UML metamodel extension with the TextUML Toolkit.
What about you, have you ever needed to extend UML using a metamodel extension? What for?
Read More
23rd December, 2008 - Posted by rafael.chaves - 5 Comments
No tool is an island. That is even more important when we are talking about highly focused single-purpose tools such as the TextUML Toolkit. As you probably know, the TextUML Toolkit is a tool for UML modeling using a textual notation, but that is about it. The TextUML Toolkit itself won’t help if you need features such as code generation, reverse engineering or graphical modeling/visualization. That might look as a negative thing to some, but that is by design. I am a strong believer of separation of concerns, component-based software and using the best tool for the job, and that is reflected in the design of the Toolkit.
This post will describe how to use models created by other UML2-compatible modeling tools from models you create using the TextUML Toolkit. I plan to cover other areas of integration in future posts.
Reading models created by other UML tools using the TextUML notation
If you have the TextUML Toolkit installed, one of the editors available for UML files is the TextUML Viewer. As the name implies, it is not really an editor, i.e., you cannot edit models with it, just visualize them using the TextUML notation. But it is an useful tool for reading UML models you don’t have the source for, i.e. models created by other UML2 modeling tools.
Using models created by other tools…
There are a few different ways of using models created by other UML modeling tools from your models created in TextUML.
…by co-location
In this method, you just drop the UML model you want to use to at the root of your TextUML (i.e. MDD) project. All models at the root of the same MDD project are considered to be in the same repository and thus you can make cross-model references by either using qualified names or importing the package and using simple names.
This method is dirty simple, but it forces you to keep the foreign model at a specific location, potentially forcing you to keep multiple copies of the model.
…with project references
In this method (available starting in version 1.2), the UML model you want to use is in a different project than the one you want to refer it from. You just open the properties dialog for your TextUML (MDD) project and add the project providing the UML model you want to use to the list of referenced projects. Now models at the root of that project will also be visible from your TextUML (MDD) project, in other words, they are also seen as part of the same repository.
This method is more powerful than the previous one, as now models can be shared by reference instead of by copying. There is a limitation still: the models you use ought to be part of some project in the workspace, so you cannot refer to models stored at arbitrary locations in the file system or models that are contributed by Eclipse bundles.
…by explicitly loading them
For this method, you use the load directive to load an external model located by a URI.
This method allows you to load any model, provided its location can be represented as a resolvable URI. That is the case of any file system path, or Eclipse platform URLs. The caveat is that some URIs such as file system URIs are not portable, so they are are bound to be invalid on other machines.
The entire truth…
…is that even if you are using only the TextUML Toolkit for building UML models, these are the same mechanisms for creating models that make cross-package references (see also the TextUML Guide). For the TextUML Toolkit, all UML2-compatible models are equal, no matter how they were created.
Read More
2nd December, 2008 - Posted by rafael.chaves - No Comments
Yesterday I checked in support for UML primitive types in the TextUML Toolkit. As an example of the syntax, here is the UMLPrimitiveTypes model, shipped in Eclipse UML2, rendered by the TextUML Source viewer:
[Standard::ModelLibrary]
model UMLPrimitiveTypes;
apply Standard;
primitive Boolean;
primitive Integer;
primitive String;
primitive UnlimitedNatural;
end.
As you can see, primitive types are declared using the keyword ‘primitive’, and cannot specialize other types or have structural features (thus there is no ‘end’ terminating the type declaration). To be honest, I am not sure this is the intended semantics, as the UML specification does not seem to explicitly disallow that.
Here is the breakdown of the change sets (r188-191):
- automated tests (r190)
- parser and model generation (r191)
- textual renderer (r189)
- editor (r188)
To be frank, the only test case added was quite trivial:
public void testPrimitiveType() throws CoreException {
String source = "";
source += "model someModel;\n";
source += "primitive Primitive1;\n";
source += "end.";
parseAndCheck(source);
PrimitiveType found = (PrimitiveType) getRepository().findNamedElement(
"someModel::Primitive1", IRepository.PACKAGE.getPrimitiveType(), null
);
assertNotNull(found);
}
But it is a good start. It ensures parsing works, and the model generated has the intended element created under the right parent package.
Any suggestions of what UML feature to cover next? And what is your take? Can UML primitive types have structural features or specialize other types/implement interfaces?
(By the way, if you want to understand how the TextUML Toolkit is implemented, feature posts like this are a good starting point)
Read More
Older Entries