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
28th September, 2011 - Posted by rafael.chaves - 9 Comments
I prepared the following slides for my Eclipse DemoCamp presentation on AlphaSimple but ended up not having time to cover them. The goal was not to try to convert the audience, but to make them understand where we are coming from, and why AlphaSimple is the way it is.
And here they are again for the sake of searchability:
I – Enterprise Software is much harder than it should be, lack of separation of concerns is to blame.
II – Domain and architectural/implementation concerns are completely different beasts and should be addressed separately and differently.
III – What makes a language good for implementation makes it suboptimal for modeling, and vice-versa.
IV – Domain concerns can and should be fully addressed during modeling, implementation should be a trivial mapping.
V – A model that fully addresses domain concerns will expose gaps in requirements much earlier.
VI – A model that fully addresses domain concerns allows the solution to be validated much earlier.
VII – No modeling language is more understandable to end-users than a running application (or prototype).
VIII – A single architecture can potentially serve applications of completely unrelated domains.
IX – A same application can potentially be implemented according to many different architectures.
X – Implementation decisions are based on known guidelines applied consistently throughout the application, and beg for automation.
XI – The target platform should not dictate the development tools, and vice-versa.
I truly believe in those principles, and feel frustrated when I realize how far the software industry is from abiding by them.
So, what do you think? Do you agree these are important principles and values? Would you call B.S. on any of them? What are your principles and values that drive your vision of what software development should look like?
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
1st August, 2011 - Posted by rafael.chaves - 5 Comments
We would like to support automated testing of templates in AlphaSimple projects. I have been “test-infected” for most of my career, and the idea of writing code generation templates that are verified manually screams “unsustainable” to me. We need a cheap and easily repeatable way of ensuring code generation templates produce what they intend to produce.
Back-of-a-napkin design for code generation testing:
- by convention, for each test case, declare two transformations: one will hardcode the expected results, and another will trigger the transformation to test with some set of parameters (typically, an element of a model). We can pair transformations based on their names: “expected_foo” and “actual_foo” for a test case named “foo”
- if the results are identical, the test passes; otherwise, the test fails (optionally, use a warning for the cases where the only differences are around layout, i.e., non significant chars like spaces/newlines – optionally, because people generating Python code will care about layout)
- just as we do for model test failures, report template test failures as build errors
- run template tests after model tests, and only if those pass
- (cherry on top) report text differences in a sane way (some libraries out there can do text diff’ng)
Does that make sense? Any suggestions/comments (simpler is better)? Have you done or seen anything similar?
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
5th April, 2011 - Posted by rafael.chaves - 21 Comments
So it finally hits Ted, The Enterprise Developer: all his enterprise applications consisted of the same architectural style applied ad nauseum to each of the entities they dealt with. And Ted asks himself: “why am I wasting so much time of my life doing the same stuff again and again, for each new application, module or entity in the system? The implementation is always the same, only the data model and business rules change from entity to entity!”
The Epiphany
So Ted figures: “just like I write code to test my code, I will write code to write my code!”.
Ted decides that, for his next project, he will take the approach of code generation. Ted is going to model all domain entities as UML classes, and have the code generator produce not only the Java (or C#, or whatever) classes, properties, relationships and methods, but all the boilerplate that goes along with it (constructors, getters, setters, lazy initialization, etc). “This is going to be awesome.”
The Compromise
One of the first things Ted realizes is that since his UML models are pretty dumb and contain no behavior (“UML models can have no behavior, right?”), there is no way to fully generate the code. Bummer.
“Wait a minute, that is not totally true.” Ted’s models contain operation names, parameter lists and return types, so Ted can at least generate empty methods (stubs), complete with Javadoc with the operation description. “This *is* awesome!”
Ted still has all these empty methods that need to be filled in for the application to be fully functional. So he starts filling them in with handwritten code.
Reality Kicks In
Things are looking great. Ted is already filling in the stubbed methods for the tenth entity in the system. But then he realizes there is a problem in the generated code. It would be an easy fix in his generator, and rerunning it will fix the problem everywhere (isn’t that beautiful?). However, Ted would end up losing all changes he had made so far. Argh.
Any way out?
Ted thinks: “shoot, this was going so well, look at how much code I produced in so little time. There must be a solution for this.”
He almost feels like backing up his current code somewhere, regenerating the code (losing his changes) with the new generator, and then adding his handwritten code back (“Just this once!”)”. But he knows better. At some point he will need to regenerate the code again (and then again, and again…), and his team won’t buy the approach if it is that complicated to fix problems or to react to changes. It will look pretty bad.
He opens a new browser tab, and starts thinking about the best search terms he should use to search for a solution to this problem…
In the next episode, Ted, The Enterprise Developer, continues his saga in search for a fix to his (currently) broken approach to code generation. If you have any ideas of what he should try next, let me know in the comments.
Read More
6th March, 2011 - Posted by rafael.chaves - No Comments
This just in: you can now generate code for AlphaSimple projects from within your Maven-based project build! That gives you a convenient way of getting the code generated by AlphaSimple into your (and your teammates’) development environment, or in your automated builds.
How do you do that? Let’s see.
Step 0: create your model(s) and template(s)
You must have an existing project in AlphaSimple. This was the subject of a previous post. Read it first if you don’t know how to create models and templates in AlphaSimple. Make sure your project is shared.
Feeling lazy?
Okay… just copy and paste the pom definition from this file into your pom.xml. You can skip down to step 3, and it will work out of the box (generating code from a pre-existing shared project).
Step 1: Enable the Abstratt repository
<project ...>
...
<pluginRepositories>
...
<pluginRepository>
<id>abstratt</id>
<name>Abstratt Technologies Maven repository</name>
<url>http://abstratt.com/maven/</url>
</pluginRepository>
...
</pluginRepositories>
...
<project>
This is required because the AlphaSimple Maven plug-in is not available from Maven Central or other public repository (yet).
Step 2: Include the AlphaSimple Maven plugin in your pom.xml
<project ...>
...
<build>
...
<plugins>
...
<plugin>
<groupId>com.abstratt</groupId>
<artifactId>com.abstratt.alphasimple.mojo</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<uri>http://alphasimple.com/mdd/generator/rafael-276/simple</uri>
<targetRoot>${project.build.directory}/generated-src/main/java</targetRoot>
</configuration>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>
Which in summary is executing the generate goal of the AlphaSimple plugin during the generate-sources phase of the Maven lifecycle.
In the example above, the plug-in is configured to execute the generator at http://alphasimple.com/mdd/generator/rafael-276/simple, for the AlphaSimple sample project (see this post for how to obtain a similar URI for your own project).
Also, files will be generated at the specified location (which in the example above will map to target/generated-src/main/java). In order for them to be seen by the Java compiler, that location must be configured as a source directory, for instance, by specifying a non-standard source location in your module:
<project ...>
...
<build>
...
<sourceDirectory>${project.build.directory}/generated-src/main/java</sourceDirectory>
...
</build>
...
</project>
Step 3: run Maven
mvn clean generate-sources
will get you something like this:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building AlphaSimple Code Generation example 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.3:clean (default-clean) @ com.alphasimple.examples.pojo ---
[INFO] Deleting file set: C:\dev\com.alphasimple.examples.pojo\target (included: [**], excluded: [])
[INFO]
[INFO] --- com.abstratt.alphasimple.mojo:1.0-SNAPSHOT:generate (default) @ com.alphasimple.examples.pojo ---
[INFO] Generating at C:\dev\com.alphasimple.examples.pojo\target\generated-src\main\java\alphasimple\Project.java
[INFO] Generating at C:\dev\com.alphasimple.examples.pojo\target\generated-src\main\java\alphasimple\Session.java
[INFO] Generating at C:\dev\com.alphasimple.examples.pojo\target\generated-src\main\java\alphasimple\Unit.java
[INFO] Generating at C:\dev\com.alphasimple.examples.pojo\target\generated-src\main\java\alphasimple\User.java
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.486s
[INFO] Finished at: Sun Mar 06 16:48:36 PST 2011
[INFO] Final Memory: 2M/58M
[INFO] ------------------------------------------------------------------------
The generate-sources phase or any other phase that follows (such as compile, package, install etc see lifecycle reference) will cause the code to be regenerated. As you make changes to your models or templates in AlphaSimple, further runs of the generate goal will take those changes into account.
In the case of generating Java code, you will want to include at least the compile phase so you can tell whether the generated code is valid (if you get an error about generics not allowed in source level 3, see this).
What just happened?
The AlphaSimple Maven plugin does not know how to generate code, nor has dependencies on other Maven artifacts that do. All it does is to hit the code generation endpoint in the AlphaSimple REST API, and request code to be generated for the chosen target platform. It then just extracts that ZIP stream into the chosen location in the file system.
Conclusion
Once you create your models and templates in AlphaSimple (see previous post), it is very easy to include the generated code in your Maven-based projects. All you need to do is to include an execution of the AlphaSimple plug-in and point it to the generator of your choice. It is that easy. But don’t take our word for it, try it yourself and give us your opinion!
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
13th February, 2011 - Posted by rafael.chaves - No Comments
The first release candidate build for TextUML Toolkit 1.7 is now available! If you already have the Toolkit already installed, please update now. If you don’t, the easiest way to install it is via the marketplace client (built into Eclipse 3.6). Or else, point the Eclipse update manager to http://abstratt.com/update.
Here is a summary of the new features:
- the editor will auto-format your source files as you save them (you must turn this feature on via the TextUML preference page)
- fine control over the outline contents (you can toggle attributes, operations and inner associations on and off via the TextUML preference page) – thanks to Attila Bak for contributing this feature.
- notation features: you can apply stereotypes to parameters, and you can declare attributes as read-only – also, attributes are now public by default.
More details here.
If you find any issues, please let us know (here or on the forum) so we can fix them before declaring a release.
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
25th January, 2011 - Posted by rafael.chaves - 3 Comments
For those of you who didn’t know, AlphaSimple, our web-based modeling tool, is strongly based on Eclipse technologies:
- the server runs Equinox with the web server (Jetty) running as an OSGi bundle
- we use UML2 for building models (during model compilation), or for traversing them for execution, code generation, diagram rendering etc
UML2 is quite a piece of software. It implements the huge UML spec more thoroughly than any other alternative library (open source or not). Much of what I learned about UML in the last 5 years I learned by dealing with the UML2 API. Kenn Hussey and James Bruck have done a great job on the front of compliance.
On the not-so-great side, development seems to have stopped. IBM, which founded (and funded) the project, apparently pulled the plug last year. The current UML version supported is 2.2 whereas UML 2.4 is coming out soon. The newsgroup has no one that actually knows the code answering questions (I try, but I am far from familiar with the internals of UML2). This is not only an impediment to adoption, but may scare existing adopters away.
But even ignoring those strategic issues, there are technical problems as well: the one we faced with UML2 is thread-safety, which currently makes it unusable for long-running/highly concurrent applications. For a server-side application like AlphaSimple, that is a showstopper. Case at hand: even if we create, load and dispose UML2 resources in a single thread, internally UML2 uses a singleton object that caches cross-references between elements – for all models, and across all threads. That introduces unnecessary contention between threads that are doing fundamentally unrelated work, but worse, this cache is not fully thread-safe (see bugs 335135 and 332057), and I suspect can’t be made thread-safe by design.
Q: how does one deal with showstoppers? A: with drastic measures.
In the case of AlphaSimple, where we explicitly unload all UML2/EMF resources in the same thread we loaded them (instead of relying on garbage collection), there really is no place for a singleton complex data structure that is intensively used for anything model-related. So our drastic measure (which I am not proud of) was to patch UML2 so the cache adapter is thread specific (by replacing CacheAdapter.INSTANCE with CacheAdapter.getInstance() and returning a thread-specific “singleton”). Luckily the changes required were quite small:
org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ElementImpl.java
retrieving revision 1.43
diff -r1.43 ElementImpl.java
818c818,819
< return CacheAdapter.INSTANCE;
---
> //RC - hack to avoid thread safety issues with CacheAdapter
> return CacheAdapter.getInstance();
org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLUtil.java
retrieving revision 1.88
diff -r1.88 UMLUtil.java
197,198c197,198
<
< CacheAdapter.INSTANCE.adapt(stereotypeApplication);
---
> //RC - hack to avoid thread safety issues with CacheAdapter
> CacheAdapter.getInstance().adapt(stereotypeApplication);
org.eclipse.uml2/plugins/org.eclipse.uml2.common/src/org/eclipse/uml2/common/util/CacheAdapter.java
retrieving revision 1.26
diff -r1.26 CacheAdapter.java
119,120d118
< public static final CacheAdapter INSTANCE = createCacheAdapter();
<
537a536,546
> //RC - hack to avoid thread safety issues with CacheAdapter
> private static final ThreadLocal<CacheAdapter> INSTANCE = new ThreadLocal<CacheAdapter>() {
> protected CacheAdapter initialValue() {
> return createCacheAdapter();
> }
> };
>
> public static CacheAdapter getInstance() {
> return INSTANCE.get();
> }
>
This is not a real fix in the sense that it may not work for all applications – for instance, applications that read/create models across different threads. So now we need to manage this patch instead of just getting UML2 from the target platform. But comparing to having a server that keeps failing, we are quite happy with that.
If you can see an issue with this workaround, or if you think I am wrong by believing UML2 cannot be made thread-safe without radical modifications, speak up.
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
21st November, 2010 - Posted by rafael.chaves - 1 Comment
There was some strong (but polite) reaction to some comments I made about the role of model-to-model (M2M) transformations in model-driven development.
My thinking is that what really matters to modeling users (i.e. developers) is that:
- they can “program” (i.e. model) at the right level of abstraction, with proper separation of concerns
- they can automatically produce running code from those models without further manual elaboration
In that context, M2M is not a requirement. That is not to say that to support #2 above, tools cannot use model-to-model transformations. But that is probably just an implementation detail of that tool, all that modeling users care is that they are able to model their solutions and produce working applications. Of course, modeling experts will be interested in less mundane things, and more advanced aspects of modeling.
Also, my comments were about model-driven development (MDD), and not model-driven engineering (it seems most people disagreeing with me are from the MDE camp). To be honest, I didn’t even know what MDE meant until recently (and I know that MDE contains MDD), and have just a superficial grasp now. To be even more honest, I am not interested in the possibilities of the larger MDE field. At least not for now. I will explain.
You see, I think we still live in the dark ages of software development. I want that situation to change, and the most obvious single thing that will let us do that is to move away from general purpose 3GLs to the next level, where developers can express themselves at the right level of abstraction, and businesses can preserve their investment in understanding their domain while at the same time being able to take advantage of technological innovation. Hence, my deep interest in making MDD mainstream.
I see value in the things beyond MDD that MDE seems to be concerned with (mining existing systems for models, model-level optimization). I just don’t think they are essential for MDD to succeed. Thus, I prefer to just cross that stuff off for now. We need to lower the barrier to adoption as much as we can, and we need to focus our efforts on the essentials. The less concepts we need to cram into people’s minds in order to take MDD to the mainstream, the better. It is already hard enough to get buy-in for MDD (even from very smart developers) as it is now. It does not matter how powerful model technology can be, if it never becomes accessible to the people that create most of the software in the world.
Read More
7th August, 2010 - Posted by rafael.chaves - 4 Comments
Model interpretation vs. code generation? There were recently two interesting posts on this topic, both generating interesting discussions. I am not going to try to define or do an analysis of pros and cons of each approach as those two articles already do a good job at that. What I have to add is that if you use model-driven development, even if you have decided for code generation to take an application to production, it still makes a lot of sense to adopt model interpretation during development time.
For one, model interpretation allows you to execute a model with the fastest turnaround. If the model is valid, it is ready to run. Model interpretation allows you to:
- play with your model as you go (for instance, using a dynamically generated UI, like AlphaSimple does)
- run automated tests against it
- debug it
All without having to generate code to some target platform, which often involves multiple steps of transformation (generating source code, compiling source code to object code, linking with static libraries, regenerating the database schema, redeploying to the application server/emulator, etc).
But it is not just a matter of turnaround. It really makes a lot more sense:
- you and other stakeholders can play with the model on day 1. No need to commit to a specific target platform, or develop or buy code generators, when all you want to validate is the model itself and whether it satisfies the requirements from the point of view of the domain. Heck, you might not even know yet your target platform!
- failures during automated model testing expose problems that are clearly in the model, not in the code generation. And there is no need to try to trace back from the generated artifact where the failure occurred back to model element that originated it, which is often hard (and is a common drawback raised against model-driven development);
- debugging the model itself prevents the debugging context from being littered with runtime information related to implementation concerns. Anyone debugging Java code in enterprise applications will relate to that, where most of the frames on the execution stack belong to 3rd-party middleware code for things such as remoting, security, concurrency etc, making it really hard to find a stack frame with your own code.
Model-driven development is really all about separation of concerns, obviously with a strong focus on models. Forcing one to generate code all the way to the target platform before models can be tried, tested or debugged misses that important point. Not only it is inefficient in terms of turnaround, it also adds a lot of clutter that gets in the way of how one understands the models.
In summary, regardless what strategy you choose for building and deploying your application, I strongly believe model interpretation provides a much more natural and efficient way for developing the models themselves.
What are your thoughts?
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
26th July, 2010 - Posted by rafael.chaves - 4 Comments
TextUML Toolkit 1.6 RC1 is now available! You can install it using the Marketplace Client or by pointing Eclipse to the update site:
http://abstratt.com/update
If you find any problems installing this build, please let us know asap so it can be addressed before the final release.
New features
Much of the work in this release went into improving the model building infrastructure to be even more notation agnostic. That work is still ongoing and should be completed in 1.7. But there were plenty of user-facing feature additions as well:
- preconditions on operations (2986923 and 3002571)
- support for a default notation (so file extensions can be optional) (2995372)
- support for implicitly applying profiles/stereotypes (so models are less verbose) (2981580)
- support for derived properties (2928428)
- support for initial values in properties (2115439)
- advanced features (closures, constraints) are now implemented using profiles instead of metamodel extensions (2933692)
In other news
The reason it took so long for a new TextUML Toolkit release to come about was that I have been busy working on AlphaSimple, which went on public beta today. AlphaSimple is an online tool for domain-driven prototyping that currently uses TextUML as modeling notation. Thus, AlphaSimple is also the driving force behind most of the changes that happened in the 1.6 cycle, and you can try them right away by starting a guest session and studying the example projects.
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
Older Entries