<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>abstratt&#039;s blog</title>
	<atom:link href="http://abstratt.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://abstratt.com/blog</link>
	<description>We have one obsession: stopping people from writing so much code</description>
	<lastBuildDate>Tue, 06 Dec 2011 22:27:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>MDD meets TDD (part II): Code Generation</title>
		<link>http://abstratt.com/blog/2011/10/31/mdd-meets-tdd-code-generation/</link>
		<comments>http://abstratt.com/blog/2011/10/31/mdd-meets-tdd-code-generation/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 06:43:55 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=685</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Here at Abstratt we are big believers of model-driven development and automated testing. I wrote <a href="http://abstratt.com/blog/2011/08/29/modeling-requirements-the-pragmatic-way-or-when-xunit-meets-xuml/">here</a> a couple of months ago about how one could represent requirements as test cases for executable models, or <em>test-driven modeling</em>. But another very interesting interaction between the model-driven and test-driven approaches is <em><strong>test-driven code generation</strong></em>.</p>
<p>You may have seen our plan for testing code generation <a href="http://abstratt.com/blog/2011/08/01/testing-code-generation-templates/">before</a>. We are glad to report that that plan has materialized and code generation tests are now supported in <a href="http://alphasimple.com">AlphaSimple</a>. Follow the steps below for a quick tour over this cool new feature!</p>
<h3>Create a project in AlphaSimple</h3>
<p>First, you will need a model so you can generate code from. Create a project in AlphaSimple and a simple model.</p>
<pre><code>
package person;

enumeration Gender
  Male, Female
end; 

class Person
    attribute name : String;
    attribute gender : Gender;
end;

end.
</code></pre>
<h3>Enable code generation and automated testing</h3>
<p>Create a mdd.properties file in your project to set it up for code generation and automated testing:</p>
<pre><code>
# 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
</code></pre>
<h3>Write a code generation test suite</h3>
<p>A <em>code generation test suite</em> has the form of a template group file (extension .stg) configured as a test template (already done in the mdd.properties above).</p>
<p>Create a template group file named my_tests.stg (because that is the name we declared in mdd.properties), with the following contents:</p>
<pre><code>
group my_tests : pojo_struct;

actual_pojo_enumeration(element, elementName = "person::Gender") ::= "&lt;element:pojoEnumeration()&gt;"

expected_pojo_enumeration() ::= &lt;&lt;
enum Gender {
    Male, Female
}
&gt;&gt;
</code></pre>
<p>A <em>code generation test case</em> is defined as a pair of templates: one that produces the expected contents, and another that produces the actual contents. Their names must be <code>expected_&lt;name&gt;</code> and <code>actual_&lt;name&gt;</code>. That pair of templates in the test suite above form a test case named &#8220;pojo_enumeration&#8221;, which unsurprisingly exercises generation of enumerations in Java. <code>pojo_enumeration</code> is a pre-existing template defined in the &#8220;Codegen &#8211; POJO templates&#8221; 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.</p>
<h3>Fix the test failures</h3>
<p>If you followed the instructions up to here, you should be seeing a build error like this:</p>
<hr />
<pre><code>
Line	File		Description
3	my_tests.stg	Test "pojo_enumeration" failed: [-public -]enum Gender {\n Male, Female\n}
</code></pre>
<hr />
<p>which is reporting the code generated is not exactly what was expected &#8211; the template generated the enumeration with an explicit <code>public</code> 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 <code>public</code> 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.</p>
<h3>That is it!</h3>
<p>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 <a href="http://abstratt.com/blog/2011/10/31/can-you-tell-this-is-100-generated-code-from-a-uml-model/">post</a> describing it and the actual <a href="http://alphasimple.com/project/show/548#file-1134">project</a>) &#8211; we actually wrote the test cases first before writing the templates, and wrote new test cases whenever we found a bug &#8211; in the true spirit of test-driven code generation. </p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/10/31/mdd-meets-tdd-code-generation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Can you tell this is 100% generated code?</title>
		<link>http://abstratt.com/blog/2011/10/31/can-you-tell-this-is-100-generated-code-from-a-uml-model/</link>
		<comments>http://abstratt.com/blog/2011/10/31/can-you-tell-this-is-100-generated-code-from-a-uml-model/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 07:33:23 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=707</guid>
		<description><![CDATA[Can you tell this code was fully generated from a UML model? Person class Account class This is all live in AlphaSimple &#8211; 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&#8217;s textual notation, as well [...]]]></description>
			<content:encoded><![CDATA[<p>Can you tell this code was fully generated from a UML model?</p>
<ul>
<li><a href="http://alphasimple.com/mdd/generator/rafael-548/POJO?class=banking::Person" rel="nofollow">Person</a> class</li>
<li><a href="http://alphasimple.com/mdd/generator/rafael-548/POJO?class=banking::Account" rel="nofollow">Account</a> class</li>
</ul>
<p>This is all live in <a href="http://alphasimple.com">AlphaSimple</a> &#8211; 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 <a rel="nofollow" href="http://alphasimple.com/mdd/publisher/rafael-548/banking">TextUML&#8217;s textual notation</a>, as well as in the conventional<a rel="nofollow" href="http://alphasimple.com/mdd/diagram/rafael-548/banking.uml"> graphical notation</a>. For looking at the entire project, including the code generation templates, check out the corresponding <a rel="nofollow" href="http://alphasimple.com/project/show/548">AlphaSimple project</a>. </p>
<h3>Preconditions</h3>
<p>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:</p>
<pre><code>
operation deposit(amount : Double);
<i><b>precondition (amount) { return amount > 0 }</b></i>
begin
    ...
end;
</code></pre>
<p>which in Java could materialize like this:</p>
<pre><code>
public void deposit(Double amount) {
    <i><b>assert amount > 0;</b></i>
    ...
}
</code></pre>
<p>Not related to preconditions, another case assertions can be automatically generated is if a property is required (lowerBound > 0):</p>
<pre><code>
public void setNumber(String number) {
    <i><b>assert number != null;</b></i>
    ...
}
</code></pre>
<h3>Imperative behavior</h3>
<p>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 <code>massAdjust</code> class operation in the model is defined like this:</p>
<pre><code>
static operation massAdjust(rate : Double);
begin
    Account extent.forEach((a : Account) {
        a.deposit(a.balance*rate)
    });
end;
</code></pre>
<p>which in Java results in code like this:</p>
<pre><code>
public static void massAdjust(Double rate) {
    for (Account a : Account.allInstances()) {
        a.deposit(a.getBalance() * rate);
    };
}
</code></pre>
<h3>Derived properties</h3>
<p>Another important need for full code generation is proper support for derived properties (a.k.a. calculated fields). For example, see the <code>Account.inGoodStanding</code> derived attribute below:</p>
<pre><code>
derived attribute inGoodStanding : Boolean := () : Boolean {
    return self.balance >= 0
};
</code></pre>
<p>which results in the following Java code:</p>
<pre><code>
public Boolean isInGoodStanding() {
    return this.getBalance() >= 0;
}
</code></pre>
<h3>Set processing with higher-order functions</h3>
<p>Any information management application will require a lot of manipulation of sets of objects. Such sets originate from class extents (akin to &#8220;<code>#allInstances</code>&#8221; 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:</p>
<pre><code>
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;
</code></pre>
<p>which even though Java does not yet support higher-order functions, results in the following code:</p>
<pre><code>
public static Set&lt;Person&gt; bestCustomers(Double threshold) {
    Set&lt;Person&gt; result = new HashSet&lt;Person&gt;();
    for (Account a : Account.allInstances()) {
        if (a.getBalance() &gt;= threshold) {
            Person mapped = a.getOwner();
            result.add(mapped);
        }
    }
    return result;
}</code></pre>
<p>which demonstrates the power of <code>select</code> and <code>collect</code>. For an example of <code>reduce</code>, look no further than the <code>Person.totalWorth</code> attribute:</p>
<pre><code>
derived attribute totalWorth : Double := () : Double {
    return (self<-PersonAccounts->accounts.reduce(
        (a : Account, partial : Double) : Double { return partial + a.balance }, 0
    ) as Double);
};
</code></pre>
<p>which (hopefully unsurprisingly) maps to the following Java code:</p>
<pre><code>
public Double getTotalWorth() {
    Double partial;
    partial = 0;
    for (Account a : this.getAccounts()) {
        partial = partial + a.getBalance();
    }
    return partial;
}
</code></pre>
<h3>Would you hire AlphaSimple?</h3>
<p>Would you hire a developer if they wrote Java code like AlphaSimple produces? For one thing, you can&#8217;t complain about the guy not being consistent. <img src='http://abstratt.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Do you think the code AlphaSimple produces needs improvement? Where?</p>
<h3>Want to try by yourself?</h3>
<p>There are still some bugs in the code generation that we need to fix, but overall the &#8220;POJO&#8221; target platform is working quite well. If you would like to try by yourself, create an account in <a rel="nofollow" href="http://alphasimple.com">AlphaSimple</a> and to make things easier, clone a public project that has code generation enabled (like the &#8220;AlphaSimple&#8221; project).</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/10/31/can-you-tell-this-is-100-generated-code-from-a-uml-model/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>11 Dogmas of Model-Driven Development</title>
		<link>http://abstratt.com/blog/2011/09/28/11-dogmas-of-model-driven-development/</link>
		<comments>http://abstratt.com/blog/2011/09/28/11-dogmas-of-model-driven-development/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 05:10:33 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=697</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>I prepared the following slides for my <a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Vancouver">Eclipse DemoCamp</a> 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.</p>
<div style="width:425px" id="__ss_9466650"><iframe src="http://www.slideshare.net/slideshow/embed_code/9466650" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></div>
<p>And here they are again for the sake of searchability:<strong></strong></p>
<p><strong>I &#8211; Enterprise Software is much harder than it should be, lack of separation of concerns is to blame.</strong></p>
<p><strong>II &#8211; Domain and architectural/implementation concerns are completely different beasts and should be addressed separately and differently.</strong></p>
<p><strong>III &#8211; What makes a language good for implementation makes it suboptimal for modeling, and vice-versa.</strong></p>
<p><strong>IV &#8211; Domain concerns can and should be fully addressed during modeling, implementation should be a trivial mapping.</strong></p>
<p><strong>V &#8211; A model that fully addresses domain concerns will expose gaps in requirements much earlier.</strong></p>
<p><strong>VI &#8211; A model that fully addresses domain concerns allows the solution to be validated much earlier.</strong></p>
<p><strong>VII &#8211; No modeling language is more understandable to end-users than a running application (or prototype).</strong></p>
<p><strong>VIII &#8211; A single architecture can potentially serve applications of completely unrelated domains.</strong></p>
<p><strong>IX &#8211; A same application can potentially be implemented according to many different architectures.</strong></p>
<p><strong>X &#8211; Implementation decisions are based on known guidelines applied consistently throughout the application, and beg for automation.</strong></p>
<p><strong>XI &#8211; The target platform should not dictate the development tools, and vice-versa.</strong></p>
<p>I truly believe in those principles, and feel frustrated when I realize how far the software industry is from abiding by them.</p>
<p>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?<a href="http://alphasimple.com"></p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/09/28/11-dogmas-of-model-driven-development/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Interview on perspectives on MDD and UML</title>
		<link>http://abstratt.com/blog/2011/09/24/interview-mdd-and-uml/</link>
		<comments>http://abstratt.com/blog/2011/09/24/interview-mdd-and-uml/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 03:09:31 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[editorial]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=688</guid>
		<description><![CDATA[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 &#8216;Eureka!&#8217; moment when modelling made sense for the first time and just became obvious or was there one particular [...]]]></description>
			<content:encoded><![CDATA[<p>I had the honor of being interviewed by Todd Humphries, Software Engineer at <a href="http://www.objektum-solutions.com/">Objektum Solutions</a>, on my views on UML and model-driven development. Here is an excerpt of the interview:</p>
<blockquote><p>
<strong>Todd Humphries</strong>: Did you have a &#8216;Eureka!&#8217; 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?</p>
<p><strong>Rafael Chaves</strong>: 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.</p>
<p>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 &#8211; 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&#8217;t feel like solid engineering.</p>
<p>It was only later, when&#8230;
</p></blockquote>
<p>Visit <a href="http://the-technical-diaries.blogspot.com/2011/09/model-based-development-past-and-future.html">The Technical Diaries</a>, Objektum team&#8217;s blog, for the full interview. Do you agree with my views? Have your say (here or there).</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/09/24/interview-mdd-and-uml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MDD meets TDD: mapping requirements as model test cases</title>
		<link>http://abstratt.com/blog/2011/08/29/modeling-requirements-the-pragmatic-way-or-when-xunit-meets-xuml/</link>
		<comments>http://abstratt.com/blog/2011/08/29/modeling-requirements-the-pragmatic-way-or-when-xunit-meets-xuml/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 05:13:25 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=633</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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. </p>
<p>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 <a href="http://alphasimple.com/project/published/25">this</a>).</p>
<p>Another less obvious way to benefit from executable models since day one is <em>automated testing</em>. </p>
<h3>The requirements</h3>
<p>For instance, let&#8217;s consider an application that needs to deal with money sums:</p>
<ul>
<li>REQ1: a money sum is associated with a currency</li>
<li>REQ2: you can add or subtract two money sums</li>
<li>REQ3: you can convert a money sum to another currency given an exchange rate</li>
<li>REQ4: you cannot combine money sums with different currencies</li>
</ul>
<h3>The solution</h3>
<p>A possible solution for the requirements above could look like this (in TextUML):</p>
<pre>
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.</pre>
<p>Now, did we get it right? I think so, but don&#8217;t take my word for it.</p>
<h3>The proof</h3>
<p>Let&#8217;s start from the beginning, and ensure we satisfy REQ1 (a money sum is a pair &lt;amount, currency&gt;:</p>
<p><pre>
[Test]
operation testBasic();
begin
    var m1 : Money;
    m1 := Money#make(12, "CHF");
    Assert#assertEquals(12, m1.amount);
    Assert#assertEquals("CHF", m1.currency);
end;
</pre>
</p>
<p>It can&#8217;t get any simpler. This test shows that you create a money object providing an amount and a currency.</p>
<p>Now let&#8217;s get to REQ2, which is more elaborate &#8211; you can add and subtract two money sums:</p>
<p><pre>
[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;
</pre>
</p>
<p>We add two values, check the result, them subtract one of them from the result and expect the get the other.</p>
<p>REQ3 is simple as well, and specifies how amounts can be converted across currencies:</p>
<p><pre>
[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;
</pre>
</p>
<p>We ensure conversion generates a Money object with the right amount and the expected currency.</p>
<p>Finally, REQ4 is not a feature, but a constraint (currencies cannot be mixed), so we need to test for rule violations:</p>
<p><pre>
[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;
</pre>
</p>
<p>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.</p>
<p>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.</p>
<h3>Can you say &#8220;Test-driven modeling&#8221;?</h3>
<p>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. </p>
<p>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.</p>
<h3>See it by yourself</h3>
<p>Would you like to give the mix of executable modeling and test-driven development a try? <a href="http://alphasimple.com/user/create">Sign up to AlphaSimple now</a>, then open the <a href="http://alphasimple.com/project/shared">public project repository</a> and clone the <strong>&#8220;Test Infected&#8221;</strong> project (or just <a href="http://alphasimple.com/project/show/807">view</a> it here).</p>
<p><cite>P.S.: does this example model look familiar? It should &#8211; it was borrowed from &#8220;<a href="http://junit.sourceforge.net/doc/testinfected/testing.htm">Test Infected: Programmers Love Writing Tests</a>&#8220;, the classical introduction to unit testing, courtesy of Beck, Gamma et al.</cite></p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/08/29/modeling-requirements-the-pragmatic-way-or-when-xunit-meets-xuml/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Testing code generation templates &#8211; brainstorming</title>
		<link>http://abstratt.com/blog/2011/08/01/testing-code-generation-templates/</link>
		<comments>http://abstratt.com/blog/2011/08/01/testing-code-generation-templates/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 19:46:39 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=619</guid>
		<description><![CDATA[We would like to support automated testing of templates in AlphaSimple projects. I have been &#8220;test-infected&#8221; for most of my career, and the idea of writing code generation templates that are verified manually screams &#8220;unsustainable&#8221; to me. We need a cheap and easily repeatable way of ensuring code generation templates produce what they intend to [...]]]></description>
			<content:encoded><![CDATA[<p>We would like to support automated testing of templates in <a href="http://alphasimple.com">AlphaSimple</a> projects. I have been &#8220;test-infected&#8221; for most of my career, and the idea of writing code generation templates that are verified manually screams &#8220;unsustainable&#8221; to me. We need a cheap and easily repeatable way of ensuring code generation templates produce what they intend to produce.</p>
<p>Back-of-a-napkin design for code generation testing:</p>
<ol>
<li>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: &#8220;expected_foo&#8221; and &#8220;actual_foo&#8221; for a test case named &#8220;foo&#8221;</li>
<li>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 &#8211; optionally, because people generating Python code will care about layout)</li>
<li>just as we do for model test failures, report template test failures as build errors</li>
<li>run template tests <em>after</em> model tests, and only if those pass</li>
<li>(cherry on top) report text differences in a sane way (some libraries out there can do text diff&#8217;ng)</li>
</ol>
<p>Does that make sense? Any suggestions/comments (simpler is better)? Have you done or seen anything similar?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/08/01/testing-code-generation-templates/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>What is the focus of analysis: problem or solution?</title>
		<link>http://abstratt.com/blog/2011/07/30/what-is-the-goal-of-ooa-problem-or-solution/</link>
		<comments>http://abstratt.com/blog/2011/07/30/what-is-the-goal-of-ooa-problem-or-solution/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 20:23:19 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[editorial]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=595</guid>
		<description><![CDATA[Is the purpose of an analysis model understanding the problem or proposing a solution? I have discussed this a few times with different people. This is how I used to see it: Analysis deals with understanding the problem domain and requirements in detail Design deals with actually addressing those (functional and non-functional) requirements A detailed [...]]]></description>
			<content:encoded><![CDATA[<p>Is the purpose of an analysis model understanding the problem or proposing a solution? I have discussed this a few times with different people. This is how I used to see it:</p>
<ul>
<li>Analysis deals with <em>understanding</em> the problem domain and requirements in detail</li>
<li>Design deals with actually <em>addressing</em> those (functional and non-functional) requirements</li>
<li>A detailed design model can be automatically transformed into a working implementation</li>
<li>An analysis model can&#8217;t, as in the general case, it is not possible to automatically derive a solution based on the statement of a problem.</li>
</ul>
<p>Rumbaugh, Blaha et al in &#8220;<a href="http://www.amazon.com/Object-Oriented-Modeling-Design-James-Rumbaugh/dp/0136298419">Object-oriented modeling and design</a>&#8221; (one of the first OO modeling books) state the purpose of analysis in OO is to model the real-world system so it can be understood; and the outcome of analysis is understanding the problem in preparation for design.</p>
<p>Jacobson, Booch and Rumbaugh (again, now with the other &#8220;two amigos&#8221;) in &#8220;<a href="http://www.amazon.com/Unified-Software-Development-Process/dp/0201571692/">The unified software development process</a>&#8221; state that &#8220;an analysis model yields a more precise specification of the requirements than we have in the results from requirements capture&#8221; and &#8220;before one starts to design and implement, one should have a precise and detailed understanding of the requirements&#8221;.</p>
<p>Ok, so I thought I was in good company there. However, while reading the excellent &#8220;<a href="http://www.amazon.com/Model-Based-Development-Applications-H-S-Lahman/dp/0321774078/">Model-based development: applications</a>&#8220;, to my great surprise, H. S. Lahman clearly states that contrary to structured development, where the focus of analysis is problem analysis, in the object-oriented paradigm, problem analysis is done during requirements elicitation, and the goal of object-oriented analysis is to specify the <em>solution</em> in terms of the problem space, addressing functional requirements only, in a way that is independent of the actual computing environment. Also, Lahman states that the OOA model is the same as the platform-independent model (PIM) in MDA lingo, so it can actually be automatically translated into running code.</p>
<p>That is the first time I have seen this position defended by an expert. I am not familiar with the Shlaer-Mellor method, but I won&#8217;t be surprised if it has a similar view of analysis, given that Lahman&#8217;s method is derived from Shlaer-Mellor. Incidentally, Mellor/Balcer&#8217;s &#8220;<a href="http://www.amazon.com/Executable-UML-Foundation-Model-Driven-Architecture/dp/0201748045/">Executable UML: a foundation for model-driven architecture</a>&#8221; is not the least concerned with the software lifecycle, briefly mentions use cases as a way of textually gathering requirements, and focuses heavily on solution modeling.</p>
<p>My suspicion is that for the Shlaer-Mellor/Executable UML camp, since models are fully executable, one can start solving the problem (in a way that is removed from the actual concrete implementation) since the very beginning, so there is nothing to be gained by strictly separating problem from a high-level, problem-space focused solution. Of course, other aspects of the solution, concerned with non-functional requirements or somehow tied with the target computing environment, are still left to be addressed during design.</p>
<p>And now I see how that all makes sense &#8211; I struggled myself with how to name what you are doing when you model a solution in <a href="http://alphasimple.com">AlphaSimple</a>. We have been calling it <em>design</em> based on the more traditional view of analysis vs. design &#8211; since AlphaSimple models specify a (highly abstract) solution, it couldn&#8217;t be analysis. But now I think I understand: for approaches based on executable modeling, the divide between understanding the problem and specifying a high-level solution is so narrow and so cheap to cross, that both activities can and should be brought closer together, and the result of analysis <em>in approaches based on executable modeling</em> is indeed a model that is ready to be translated automatically into a running application (and can be quickly validated by the customer). </p>
<p>But for everybody else (which is the vast majority of software development practitioners &#8211; executable modeling is still not well known and seldom practiced) that is just not true, and the classical interpretation still applies: there is value in thoroughly understanding the requirements before building a solution, given that the turnaround between problem comprehension, solution building and validation is so damn expensive.</p>
<p>For those of you thinking that this smells of <a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front">BigDesignUpFront</a>, and that is not an issue with agile or iterative approaches in general &#8211; I disagree. At least as far as typical iterative approaches go, where iterations need to comprise all/several phases of the software development life cycle so they can finally deliver results that can be validated by non-technical stakeholders. As such they are still very wasteful (the use of the word <em>agile</em> feels like a bad joke to me). </p>
<p>Approaches based on executable modeling, on the other hand, greatly shrink the chasm between problem analysis and conceptual solution modeling and user acceptance, allowing for much more efficient and seamless collaboration between the problem domain expert and the solution expert. Iterations become so action packed that they are hardly discernible. Instead of iterations taking weeks to allow for customer feedback, and a project taking months to fully cover all functional requirements, you may get a <em>fully specified solution</em> after locking a customer and a modeler in a boardroom for just a day, or maybe a week for bigger projects.</p>
<p>So, long story short, to answer the question posed at the beginning of this post, the answer is <strong>both</strong>, but only if you are following an approach based on executable modeling.</p>
<p>What is your view? Do you agree with that? Are you an executable modeling believer or skeptic?</p>
<p><em>UPDATE: make sure to check <a href="https://plus.google.com/117995734724351188884/posts/hj7hLRUmogf">the thread on Google+</a> as well.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/07/30/what-is-the-goal-of-ooa-problem-or-solution/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Upcoming presentation on code generation and executable models @ VIJUG</title>
		<link>http://abstratt.com/blog/2011/05/21/upcoming-presentation-on-code-generation-and-executable-models-vijug/</link>
		<comments>http://abstratt.com/blog/2011/05/21/upcoming-presentation-on-code-generation-and-executable-models-vijug/#comments</comments>
		<pubDate>Sat, 21 May 2011 10:11:35 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[editorial]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=391</guid>
		<description><![CDATA[This coming Thursday I will be doing a presentation entitled &#8220;Code generation &#8211; going all the way&#8221; to the Vancouver Island Java User Group. The plan is to take the audience from the most basic ideas around generating code from models, visiting approaches increasingly more sophisticated, analyzing their pros and cons, all the way to [...]]]></description>
			<content:encoded><![CDATA[<p>This coming Thursday I will be doing a presentation entitled &#8220;Code generation &#8211; going all the way&#8221; to the Vancouver Island Java User Group.</p>
<p>The plan is to take the audience from the most basic ideas around generating code from models, visiting approaches increasingly more sophisticated, analyzing their pros and cons, all the way to full code generation based on executable models.</p>
<p>In the process, we will be taking a cursory look at some code generation tools in the market, culminating with a preview of the upcoming release of <a href="http://alphasimple.com">AlphaSimple</a>, our online modeling tool, which will support executable modeling and full code generation.</p>
<p><strong>What</strong>:</p>
<p>May 2011 VIJUG Meeting – Code generation: going all the way (<a href="http://www.mosabuam.com/vijug/blog/2011/05/11/may-2011-vijug-meeting-code-generation-going-all-the-way/">official announcement</a>)</p>
<p><strong>Where</strong>:    </p>
<blockquote><p>Vancouver Island Technology Park, Conference Center Room – 4464 Markham Street, Victoria, BC</p></blockquote>
<p><strong>When</strong>:</p>
<blockquote><p>    Thursday, 26th May 2011, 18:00-20:00</p></blockquote>
<p>If you are in Victoria and think developing business applications got just way too complicated and labor-intensive, and that there must be a saner way to build and evolve them (no matter what platforms you use), come to this presentation and learn how executable models and full code generation can fix that.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/05/21/upcoming-presentation-on-code-generation-and-executable-models-vijug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Help wanted: Converting closure-based iterators into plain loops</title>
		<link>http://abstratt.com/blog/2011/05/15/converting-closure-based-iterators-into-plain-loops/</link>
		<comments>http://abstratt.com/blog/2011/05/15/converting-closure-based-iterators-into-plain-loops/#comments</comments>
		<pubDate>Sun, 15 May 2011 22:24:27 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=516</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Smalltalk, Ruby, Groovy and other languages allow one to implement loops using closures. But so does <a href="http://abstratt.com/docs?title=TextUML_Action_Language#Collection_operations">TextUML</a>/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.</p>
<p>Here are some examples of how to translate from closure-based loops (in TextUML, but the specific syntax shouldn&#8217;t matter) to ordinary loops (in Java, but again, syntax specifics shouldn&#8217;t matter):</p>
<h3>forEach</h3>
<h4>In TextUML</h4>
<pre>

self->units.forEach((u : Unit) {
    link ProjectUnits(project := clone, units := u.clone()) }
);
</pre>
<h4>In Java</h4>
<pre>

for (Unit u : this.getUnits()) {
    clone.addUnits(u.clone());
}
</pre>
<h3>select</h3>
<h4>In TextUML</h4>
<pre>

return Project extent.select((p : Project) : Boolean { return p.shared });
</pre>
<h4>In Java</h4>
<pre>

Set&lt;Project&gt; result = new HashSet&lt;Project&gt;();
for (Project p : Project.allInstances()) {
    if (p.isShared()) {
        result.add(p);
    }
}
return result;
</pre>
<h3>collect</h3>
<h4>In TextUML</h4>
<pre>

return Project extent.collect((p : Project) : User { return p->owner });
</pre>
<h4>In Java</h4>
<pre>

Set&lt;User&gt; result = new HashSet&lt;User&gt;();
for (Project p : Project.allInstances()) {
    User owner = p.getOwner();
    result.add(owner);
}
return result;
</pre>
<h3>count</h3>
<h4>In TextUML</h4>
<pre>

return Project extent.count((p : Project) : Boolean { return p.shared });
</pre>
<h4>In Java</h4>
<pre>

int count = 0;
for (Project p : Project.allInstances()) {
    if (p.isShared()) {
        count++;
    }
}
return count;
</pre>
<p>
In <a href="http://alphasimple.com">AlphaSimple</a>, 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&#8230; <img src='http://abstratt.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/05/15/converting-closure-based-iterators-into-plain-loops/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Pitching AlphaSimple</title>
		<link>http://abstratt.com/blog/2011/04/18/pitching-alphasimple/</link>
		<comments>http://abstratt.com/blog/2011/04/18/pitching-alphasimple/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 07:14:35 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[business of software]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=395</guid>
		<description><![CDATA[Not clear on what AlphaSimple is about? Isn&#8217;t the value we aim to provide clear? Does this 7-slide pitch deck (including title) help you understand it? If not, please let us know. Or if it is clear, but you don&#8217;t think it would work, please help us understand why. Or even if you think it [...]]]></description>
			<content:encoded><![CDATA[<p>Not clear on what <a href="http://alphasimple.com">AlphaSimple</a> is about? Isn&#8217;t the value we aim to provide clear?</p>
<p>Does this 7-slide pitch deck (including title) help you understand it?</p>
<p><iframe src="http://www.slideshare.net/slideshow/embed_code/6834006" width="575" height="477" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> </div>
<p>If not, please let us know. Or if it is clear, but you don&#8217;t think it would work, please help us understand why. Or even if you think it is right on the money, some reassurance is always welcome.</p>
<p>Note that the web site hasn&#8217;t yet changed to reflect the more recent focus on code generation that the slide deck hints at (in addition to the existing focus on requirements and solution design validation). That is on our to-do list. Expect significant changes (messaging and service features) this Spring.</p>
<hr />
<p>
<em>This is the inaugural post on the &#8220;<a href="http://abstratt.com/blog/category/business-of-software/">business of software</a>&#8221; category. Expect many more in the future as we work on turning AlphaSimple into a product that fulfills our mission: to bring model-driven development to the masses, and stopping hordes of developers from writing so much code. Stay tuned.</em></p>
<hr />
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/04/18/pitching-alphasimple/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Pesquisa sobre modelagem e geração de código</title>
		<link>http://abstratt.com/blog/2011/04/10/pesquisa-sobre-modelagem-e-geracao-de-codigo/</link>
		<comments>http://abstratt.com/blog/2011/04/10/pesquisa-sobre-modelagem-e-geracao-de-codigo/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 06:17:37 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[pt_BR]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=435</guid>
		<description><![CDATA[Recentemente, nós conduzimos uma pesquisa com membros da UML-BR, provavelmente a maior comunidade de UML do Brasil. Os membros dessa lista são principalmente usuários da linguagem/praticantes de modelagem, ao invés de fabricantes de ferramentas. Nosso objetivo com essa pesquisa era primariamente entender o quão comum é a prática de geração de código a partir de [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente, nós conduzimos uma pesquisa com membros da <a href="http://br.groups.yahoo.com/group/UML-BR/">UML-BR</a>, provavelmente a maior comunidade de UML do Brasil. Os membros dessa lista são principalmente usuários da linguagem/praticantes de modelagem, ao invés de fabricantes de ferramentas. Nosso objetivo com essa pesquisa era primariamente entender o quão comum é a prática de geração de código a partir de modelos (UML ou não), em que modalidade é praticada, e entre os que não praticam, por que não o fazem.</p>
<p>O número de participantes foi bastante pequeno (14 respostas), o que limita bastante a significância estatística dos dados obtidos. De qualquer forma, há valor em analisar essa pequena amostra qualitativamente.</p>
<h3>Resultados da pesquisa</h3>
<p><img src="https://spreadsheets.google.com/oimg?key=0ApWq_saU5c8DdC1RZG44c1NpbXdDeGZSalgxRW5vR3c&#038;oid=3&#038;zx=d7ry4yf1zp2f" alt="Que linguagens de programação a sua equipe usa?"/></p>
<p>Esta primeira pergunta serviu apenas para fornecer contexto para qualificar as respostas seguintes. Por exemplo, para ajudar a identificar que tecnologias de implementação são mais frequentemente associadas com geração de código. Como já era esperado, fica claro o domínio de Java (como linguagem ou plataforma) e .Net (tanto C# como VB.net). Destaque para as presenças de COBOL (!), Visual Dataflex e Apex (os dois últimos aparentemente como única linguagem na empresa). </p>
<p><img src="https://spreadsheets.google.com/oimg?key=0ApWq_saU5c8DdC1RZG44c1NpbXdDeGZSalgxRW5vR3c&#038;oid=4&#038;zx=x43po6y25zjk" alt="Que ferramenta(s) de modelagem a sua equipe usa?"/></p>
<p>Enterprise Architect claramente lidera como linguagem de modelagem (6 dos 11 que usam alguma ferramenta), seguido pelos suites Rational da IBM (entrevistados mencionaram Rose e RSA), e pelo Jude/Astah* da japonesa Change Vision. Duas ferramentas de criação de diagramas que executam no browser foram mencionadas: Create.ly e yUML.me.</p>
<p><img src="https://spreadsheets.google.com/oimg?key=0ApWq_saU5c8DdC1RZG44c1NpbXdDeGZSalgxRW5vR3c&#038;oid=5&#038;zx=vcf1aozh4jdz" alt="A sua equipe modela com que finalidade(s) primária(s)? (escolha mais de uma opção se aplicável)"/></p>
<p>Entre os entrevistados que usam modelagem (11 de 14), todos disseram que comunicação com desenvolvedores era uma finalidade primária. 63% dos que modelam (7 de 11) também usam modelos para comunicação com clientes. Apenas quatro entrevistados identificaram geração de código como finalidade primária. </p>
<p>Para aqueles que disseram não modelar (3), coincidência ou não, dois usam 4GLs como linguagem primária &#8211; 4GLs fornecem muitos dos benefícios de modelagem e geração de código, então o ROI não é tão claro quanto para quem usa 3GLs. Contraste isso com o fato que dos 4 entrevistados que vêem geração de código como finalidade primária, todos têm Java ou .Net (C#, VB.Net) como linguagem/plataforma.</p>
<p>Esta pergunta requeria um motivo caso a equipe não modelasse ou não gerasse código a partir de modelos. Razões mencionadas (apenas por aqueles que modelam):</p>
<ul>
<li>modelar é caro, e o time já sabe escrever código, então não há valor suficiente</li>
<li>modelos não são detalhados o suficiente para se gerar código</li>
<li>código gerado não iria satisfazer as necessidades do time</li>
<li>várias ferramentas testadas, nenhuma satisfez as necessidades</li>
<li>não há tempo (para se modelar a ponto de se gerar código?)</li>
</ul>
<p><img src="https://spreadsheets.google.com/oimg?key=0ApWq_saU5c8DdC1RZG44c1NpbXdDeGZSalgxRW5vR3c&#038;oid=6&#038;zx=ms3uzm9p3sho" alt="Que ferramenta(s) de geração de código a sua equipe usa?" /></p>
<p>Mesmo que geração de código não seja uma finalidade primária para a maioria dos que modelam, metade dos entrevistados responderam que usam alguma ferramenta de geração de código, o que inclui frameworks que suportam scaffolding (Django) e IDEs/wizards. Isso revela a percepção de que geração de código tem importância limitada no desenvolvimento, e o quão variado é o rol de ferramentas identificadas como geradores de código. Também revela um problema na questão por não qualificar &#8220;geração de código&#8221; como sendo especificamente a partir de modelos (o que excluiria wizards em IDEs). </p>
<p><img src="https://spreadsheets.google.com/oimg?key=0ApWq_saU5c8DdC1RZG44c1NpbXdDeGZSalgxRW5vR3c&#038;oid=7&#038;zx=w2pvrhqmwggq" alt="A sua ferramenta de geração de código gera código com comportamento (lógica de negócios) ou apenas métodos vazios (que você precisa preencher manualmente)?"/></p>
<p>Entre aqueles que geram código, mais da metade dos entrevistados usa ferramentas que gera apenas métodos vazios (stubs), o que corrobora com a visão de que geração de código não oferece valor suficiente. Ferramentas que só ajudam o programador no &#8220;pontapé inicial&#8221; têm valor limitado quando se considera custos com manutenção e evolução <a href="http://en.wikipedia.org/wiki/Software_maintenance#The_Importance_of_Software_Maintenance">são boa parte do custo em software</a>.</p>
<p><img src="https://spreadsheets.google.com/oimg?key=0ApWq_saU5c8DdC1RZG44c1NpbXdDeGZSalgxRW5vR3c&#038;oid=8&#038;zx=58ecmr1vygiq" alt="Como a sua equipe lida com o código gerado, em relação a mudanças no modelo?"/></p>
<p>Note que entre os entrevistados que geram código (7), quase todos usam geração de código apenas como ponto de partida. Apenas um entrevistado declarou regerar o código após mudanças no modelo, e modificações existentes são preservadas via regiões protegidas. Os outros (6/7) ou replicam modificações no modelo e no código manualmente (2/7), ou abandonam o modelo e fazem modificações diretamente no código (4/7). Nenhum dos entrevistados usam técnicas como o padrão <a href="http://www.research.ibm.com/designpatterns/pubs/gg.html">generation gap</a> para combinar código gerado com código escrito manualmente. </p>
<h3>Conclusão</h3>
<p>Mesmo que o tamanho da amostra não seja grande o suficiente para se fazer conclusões definitivas, acho que as respostas obtidas confirmam fortemente algumas suspeitas que tínhamos:</p>
<ol>
<li>geração de código é pouco utilizada</li>
<li>quando utilizada, a capacidade em que é utilizada não produz valor significativo em um projeto</li>
<li>desenvolvimento baseado em modelos (MDD) é ainda raramente praticado (1 em 14)</li>
</ol>
<p>O que você acha? Concorda com as conclusões? Tem conclusões próprias para contribuir? </p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/04/10/pesquisa-sobre-modelagem-e-geracao-de-codigo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Productivity of UML</title>
		<link>http://abstratt.com/blog/2011/04/07/productivity-of-uml/</link>
		<comments>http://abstratt.com/blog/2011/04/07/productivity-of-uml/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 06:48:38 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=423</guid>
		<description><![CDATA[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&#8217;s Steve Kelly. Please read his points and come back here. I actually didn&#8217;t notice it was an old thread [...]]]></description>
			<content:encoded><![CDATA[<p>Found an <a href="http://www.modeldrivensoftware.net/forum/topics/uml-and-productivity">old discussion</a> 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 <a href="http://www.modeldrivensoftware.net/xn/detail/2573822:Comment:5821">comment</a> by MetaCase&#8217;s Steve Kelly. Please read his points and come back here.</p>
<p>I actually didn&#8217;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.</p>
<p>1) repeat with me, <em>UML is not a graphical language</em> &#8211; 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&#8217;t like the default notation, create one (<a href="http://textuml.org">like we did!</a>) to suit your taste (and it will <a href="http://abstratt.com/blog/2008/02/07/textual-notations-and-uml-compliance/">still be UML</a>). The specs are public, and there are good <a href="http://wiki.eclipse.org/MDT-UML2">open source implementations</a> of the metamodel, that are used by <a href="http://wiki.eclipse.org/MDT-UML2-Tool-Compatibility">many tools</a>.</p>
<p>2) you don&#8217;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.</p>
<p>3) There is no need to mix languages, <a href="http://abstratt.com/blog/2008/11/02/what-can-uml-do-for-you/">UML has support for both structural and behavioral modeling </a>(since 2002!). Action languages are not (or don&#8217;t have to be) &#8220;<a href="http://abstratt.com/blog/2008/08/06/not-yet-another-language/">other languages</a>&#8221; &#8211; 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.</p>
<p>4) Annotations (or stereotypes) is an established (see C#, Java) and cost effective way of tailoring a general purpose language to one&#8217;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.</p>
<p>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.</p>
<p>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.</p>
<p>What is your opinion? Are you still using old school UML and limiting yourself to generating stubs? Why on earth haven&#8217;t you moved to the new world of executable models yet?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/04/07/productivity-of-uml/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Anti-patterns in code generation &#8211; Part I</title>
		<link>http://abstratt.com/blog/2011/04/05/anti-patterns-in-code-generation-part-1/</link>
		<comments>http://abstratt.com/blog/2011/04/05/anti-patterns-in-code-generation-part-1/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 08:16:46 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=177</guid>
		<description><![CDATA[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: &#8220;why am I wasting so much time of my life doing the same stuff again and again, for each new application, module [...]]]></description>
			<content:encoded><![CDATA[<p>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: &#8220;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!&#8221;</p>
<h3>The Epiphany</h3>
<p>So Ted figures: &#8220;just like I write code to test my code, I will write code to <em>write</em> my code!&#8221;.</p>
<p>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). &#8220;This is going to be awesome.&#8221;</p>
<h3>The Compromise</h3>
<p>One of the first things Ted realizes is that since his UML models are pretty dumb and contain no behavior (&#8220;UML models can have no behavior, right?&#8221;), there is no way to fully generate the code. Bummer.</p>
<p>&#8220;Wait a minute, that is not totally true.&#8221; Ted&#8217;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. &#8220;This *is* awesome!&#8221;</p>
<p>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.</p>
<h3>Reality Kicks In</h3>
<p>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&#8217;t that beautiful?). However, Ted would end up losing all changes he had made so far. Argh.</p>
<h3>Any way out?</h3>
<p>Ted thinks: &#8220;shoot, this was going so well, look at how much code I produced in so little time. There must be a solution for this.&#8221;</p>
<p>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 (&#8220;Just this once!&#8221;)&#8221;. But he knows better. At some point he will need to regenerate the code again (and then again, and again&#8230;), and his team won&#8217;t buy the approach if it is that complicated to fix problems or to react to changes. It will look pretty bad.</p>
<p>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&#8230;</p>
<hr />
<p><em>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.</em></p>
<hr />
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/04/05/anti-patterns-in-code-generation-part-1/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Generating code in Maven projects with the AlphaSimple plug-in</title>
		<link>http://abstratt.com/blog/2011/03/06/generating-code-in-maven-projects-with-alphasimple/</link>
		<comments>http://abstratt.com/blog/2011/03/06/generating-code-in-maven-projects-with-alphasimple/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 02:23:24 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=257</guid>
		<description><![CDATA[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&#8217;) development environment, or in your automated builds. How do you do that? Let&#8217;s see. Step 0: create your model(s) and [...]]]></description>
			<content:encoded><![CDATA[<p>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&#8217;) development environment, or in your automated builds. </p>
<p>How do you do that? Let&#8217;s see.</p>
<p><strong>Step 0: create your model(s) and template(s)</strong></p>
<p>You must have an existing project in <a href="http://alphasimple.com">AlphaSimple</a>. This was the subject of a previous post. <a href="http://abstratt.com/blog/2011/02/23/generating-code-from-uml-models-using-alphasimple-and-stringtemplate/">Read it first</a> if you don&#8217;t know how to create models and templates in AlphaSimple. <strong>Make sure your project is shared</strong>.</p>
<p><strong>Feeling lazy?</strong></p>
<p>Okay&#8230; just copy and paste the pom definition from <a href='http://abstratt.com/blog/wp-content/uploads/2011/03/pom.xml_.txt'>this file</a> 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). </p>
<p><strong>Step 1: Enable the Abstratt repository</strong></p>
<pre>
&lt;project ...&gt;
...
&lt;pluginRepositories&gt;
...
  &lt;pluginRepository&gt;
    &lt;id&gt;abstratt&lt;/id&gt;
    &lt;name&gt;Abstratt Technologies Maven repository&lt;/name&gt;
    &lt;url&gt;http://abstratt.com/maven/&lt;/url&gt;
  &lt;/pluginRepository&gt;
...
&lt;/pluginRepositories&gt;
...
&lt;project&gt;
</pre>
<p>This is required because the AlphaSimple Maven plug-in is not available from Maven Central or other public repository (yet).</p>
<p><strong>Step 2: Include the AlphaSimple Maven plugin in your pom.xml</strong></p>
<pre>
&lt;project ...&gt;
...
&lt;build&gt;
...
&lt;plugins&gt;
...
  &lt;plugin&gt;
    &lt;groupId&gt;com.abstratt&lt;/groupId&gt;
    &lt;artifactId&gt;com.abstratt.alphasimple.mojo&lt;/artifactId&gt;
    &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
    &lt;configuration&gt;
      <strong>&lt;uri&gt;http://alphasimple.com/mdd/generator/rafael-276/simple&lt;/uri&gt;</strong>
      <strong>&lt;targetRoot&gt;${project.build.directory}/generated-src/main/java&lt;/targetRoot&gt;</strong>
    &lt;/configuration&gt;
    &lt;executions&gt;
      &lt;execution&gt;
        &lt;phase&gt;generate-sources&lt;/phase&gt;
        &lt;goals&gt;
          &lt;goal&gt;generate&lt;/goal&gt;
        &lt;/goals&gt;
      &lt;/execution&gt;
    &lt;/executions&gt;
  &lt;/plugin&gt;
...
&lt;/plugins&gt;
...
&lt;/build&gt;
...
&lt;/project&gt;
</pre>
<p>Which in summary is executing the <i>generate</i> goal of the AlphaSimple plugin during the <i>generate-sources</i> phase of the Maven lifecycle. </p>
<p>In the example above, the plug-in is configured to execute the generator at http://alphasimple.com/mdd/generator/rafael-276/simple, for the <a href="http://alphasimple.com/project/show/276">AlphaSimple sample</a> project (see <a href="http://abstratt.com/blog/2011/02/23/generating-code-from-uml-models-using-alphasimple-and-stringtemplate/">this post</a> for how to obtain a similar URI for your own project). </p>
<p>Also, files will be generated at the specified location (which in the example above will map to <i>target/generated-src/main/java</i>). 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:</p>
<pre>
&lt;project ...&gt;
...
&lt;build&gt;
  ...
  &lt;sourceDirectory&gt;${project.build.directory}/generated-src/main/java&lt;/sourceDirectory&gt;
  ...
&lt;/build&gt;
...
&lt;/project&gt;
</pre>
<p><strong>Step 3: run Maven</strong></p>
<pre>
    mvn clean generate-sources
</pre>
<p>will get you something like this:</p>
<pre>
[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] ------------------------------------------------------------------------
</pre>
<p>The <em>generate-sources</em> phase or any other phase that follows (such as <em>compile, package, install</em> etc see <a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference">lifecycle reference</a>) will cause the code to be regenerated. As you make changes to your models or templates in AlphaSimple, further runs of the <em>generate</em> goal will take those changes into account.</p>
<p>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 <a href="http://www.frankdu.com/weblog/archives/119">this</a>).</p>
<p><strong>What just happened?</strong></p>
<p>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.</p>
<p><strong>Conclusion</strong><br />
Once you create your models and templates in AlphaSimple (see <a href="http://abstratt.com/blog/2011/02/23/generating-code-from-uml-models-using-alphasimple-and-stringtemplate/">previous post</a>), 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&#8217;t take our word for it, try it yourself and give us your opinion!</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/03/06/generating-code-in-maven-projects-with-alphasimple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generating code from UML models using AlphaSimple and StringTemplate</title>
		<link>http://abstratt.com/blog/2011/02/23/generating-code-from-uml-models-using-alphasimple-and-stringtemplate/</link>
		<comments>http://abstratt.com/blog/2011/02/23/generating-code-from-uml-models-using-alphasimple-and-stringtemplate/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 08:49:07 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=234</guid>
		<description><![CDATA[We just released a new build of AlphaSimple with basic support for customized code generation using templates, more specifically, using StringTemplate templates. Let&#8217;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 [...]]]></description>
			<content:encoded><![CDATA[<p>We just released a new build of <a href="http://alphasimple.com">AlphaSimple </a>with basic support for customized code generation using templates, more specifically, using <a href="http://stringtemplate.org">StringTemplate</a> templates. Let&#8217;s take a quick tour:</p>
<p><strong>Create a model in AlphaSimple</strong></p>
<p>Create your model in AlphaSimple. If you need help with the notation, check the <a href="http://alphasimple.com/doc/modeling-notation/">tutorial</a>. You can just start with the default contents you get when creating a new project:</p>
<pre>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.
</pre>
<p>Remember to save your file.</p>
<p><strong>Create a template</strong></p>
<p>AlphaSimple supports StringTemplate as template language (check out this <a href="http://www.antlr.org/wiki/display/ST/Five+minute+Introduction">5-minute introduction</a>). 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:</p>
<pre>group simple;

outputPath(class) ::= &lt;&lt;
&lt;! The 'outputPath' template is optional and determines the path of the file generated (the default is the class name) !&gt;
&lt;class.name&gt;.txt
&gt;&gt;

contents(class) ::= &lt;&lt;
&lt;! The 'contents' template is mandatory and is the entry point for generating the contents of the file from a class. !&gt;
Class: &lt;class.name&gt;

Attributes: &lt;class.ownedAttributes:{attr|&lt;attr.name&gt;};separator=", "&gt;

Operations: &lt;class.ownedOperations:{op|&lt;op.name&gt;};separator=", "&gt;
&gt;&gt;
</pre>
<p>Again, remember to save this file.</p>
<p><strong>Declare your custom template</strong></p>
<p>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:</p>
<pre># the template implementation we use
mdd.target.engine=stringtemplate

# the templates supported (always mdd.target.&lt;name&gt;.template=&lt;template file name&gt;
mdd.target.simple.template=simple.stg
</pre>
<p>Both entries are mandatory. Ensure the line declaring the template matches the name you chose when creating the template file. Save this file.</p>
<p><strong>Test your template</strong></p>
<p><em>In order to test your custom template, if you have been using a guest account, you will need to <a href="http://alphasimple.com/user/create">sign up</a> first (it&#8217;s free). Your project contents will be preserved.</em></p>
<p>First, publish your project (see button in the editor). Then, from your list of projects (&#8220;My Projects&#8221;), 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.</p>
<p>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:</p>
<p><code>http://alphasimple.com/mdd/publisher/&lt;username&gt;-&lt;project-id&gt;/</code></p>
<p>For instance, for project <code>515</code>, belonging to user <code>simple</code>, the URI would be:</p>
<p><code>http://alphasimple.com/mdd/publisher/simple-515/</code></p>
<p>which returns:</p>
<pre>&lt;workspace packageCount='1' timestamp='1298449947000'&gt;
  &lt;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='/&gt;
  &lt;properties name='mdd.properties' uri='http://alphasimple.com/mdd/publisher/simple-515/mdd.properties?secret='/&gt;
  &lt;source name='NewProject' uri='http://alphasimple.com/mdd/publisher/simple-515/NewProject?secret='/&gt;
  &lt;source name='simple.stg' uri='http://alphasimple.com/mdd/publisher/simple-515/simple.stg?secret='/&gt;
  &lt;generator platform="jpa" uri="http://alphasimple.com/mdd/generator/simple-515/jpa?secret="/&gt;
  &lt;generator platform="pojo" uri="http://alphasimple.com/mdd/generator/simple-515/pojo?secret="/&gt;
  &lt;generator platform="simple" uri="http://alphasimple.com/mdd/generator/simple-515/simple?secret="/&gt;
  &lt;renderer uri="http://alphasimple.com/animator/index.jsp?repository=simple-515#"/&gt;
&lt;/workspace&gt;
</pre>
<p>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 <a href="http://alphasimple.com/mdd/generator/simple-515/simple?secret=">generator URI for our custom template</a> (named &#8220;simple&#8221;). Voila, this is what you should see:</p>
<pre>Class: NewProject

Attributes: text, check, number, date

Operations: toggle
</pre>
<p><strong>Conclusion</strong></p>
<p>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&#8217;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.</p>
<p>If you would like to see more interesting models and actual code generation templates, browse the <a href="http://alphasimple.com/project/shared">shared project area</a>. For now, there is currently <a rel="nofollow" href="http://alphasimple.com/project/show/276">just one project</a> 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 <a href="http://alphasimple.com/contact/">contact</a> page.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/02/23/generating-code-from-uml-models-using-alphasimple-and-stringtemplate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.7 RC1 now available!</title>
		<link>http://abstratt.com/blog/2011/02/13/textuml-toolkit-1-7-rc1-now-available/</link>
		<comments>http://abstratt.com/blog/2011/02/13/textuml-toolkit-1-7-rc1-now-available/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 00:56:05 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=228</guid>
		<description><![CDATA[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&#8217;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 [...]]]></description>
			<content:encoded><![CDATA[<p>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&#8217;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 <a href="http://abstratt.com/update">http://abstratt.com/update</a>.</p>
<p>Here is a summary of the new features:</p>
<ul>
<li>the editor will auto-format your source files as you save them (you must turn this feature on via the TextUML preference page)</li>
<li>fine control over the outline contents (you can toggle attributes, operations and inner associations on and off via the TextUML preference page) &#8211; thanks to Attila Bak for contributing this feature.</li>
<li>notation features: you can apply stereotypes to parameters, and you can declare attributes as read-only &#8211; also, attributes are now public by default.</li>
</ul>
<p>More details <a href="https://sourceforge.net/apps/mediawiki/textuml/index.php?title=TextUML_Toolkit_Features">here</a>.</p>
<p>If you find any issues, please let us know (here or on the <a href="https://sourceforge.net/projects/textuml/forums/forum/855420">forum</a>) so we can fix them before declaring a release.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/02/13/textuml-toolkit-1-7-rc1-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Model-driven Development with Executable UML models</title>
		<link>http://abstratt.com/blog/2011/02/06/model-driven-development-with-executable-uml-models/</link>
		<comments>http://abstratt.com/blog/2011/02/06/model-driven-development-with-executable-uml-models/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 01:52:36 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=211</guid>
		<description><![CDATA[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, [...]]]></description>
			<content:encoded><![CDATA[<p>Last November I did a lecture on <a href="http://slidesha.re/hGH73M">Model-driven Development with Executable UML models</a> to a class of Software Engineering undergrad students at UVic. Here are the slides:</p>
<div style="width: 425px; text-align: left;"><object style="margin: 0px;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=seng330mddwithexecutableumlmodels-12970398132454-phpapp02&amp;stripped_title=mdd-with-executable-uml-models" /><param name="allowfullscreen" value="true" /><embed style="margin: 0px;" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=seng330mddwithexecutableumlmodels-12970398132454-phpapp02&amp;stripped_title=mdd-with-executable-uml-models" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<p>I think it gives a good summary of my views on model driven development (with Executable UML or not):</p>
<ul>
<li>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)</li>
<li>there are <a href="http://abstratt.com/blog/2007/03/31/where-we-are-coming-from-part-i/">two dominant dimensions</a> in enterprise software: business domain concerns and technological concerns</li>
<li><a href="http://abstratt.com/blog/2007/04/07/where-we-are-coming-from-part-ii/">they are completely different</a> in nature (change rate, abstraction level) and require different approaches (tools, skills, reuse)</li>
<li>MDD is a strategy that <a href="http://abstratt.com/blog/2007/04/15/where-we-are-coming-from-part-iii/">handles well</a> that divide: models address business domain concerns, PIM-&gt;PSM transformation addresses technological concerns</li>
<li>brainstorming, communication, documentation and understanding (rev. engineering) <a href="http://abstratt.com/blog/2007/05/12/uml-modes-and-tools/">are not primary goals of MDD</a> &#8211; to produce running code in a productive and rational way is</li>
<li>models in MDD must be well-formed, precise, complete, executable, <a href="http://abstratt.com/blog/2007/05/22/platform-independence-in-mda/">technology independent</a></li>
<li>graphical representations are not suitable for executable modeling (<a href="http://abstratt.com/blog/2008/05/05/on-code-and-diagrams/">textual notations are much better</a>)</li>
<li><a href="http://abstratt.com/blog/2008/09/10/diagrams-models/">diagrams != models</a>, <a href="http://abstratt.com/blog/2008/02/07/textual-notations-and-uml-compliance/">text != code</a> (that would look good on a t-shirt!)</li>
</ul>
<p>I guess those who know me won&#8217;t have seen anything new above (these ideas make the very foundations of the <a href="http://textuml.org">TextUML Toolkit</a> and <a href="http://alphasimple.com">AlphaSimple</a>).</p>
<p>Do you agree with those positions?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/02/06/model-driven-development-with-executable-uml-models/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Working areas in AlphaSimple</title>
		<link>http://abstratt.com/blog/2011/02/05/working-areas-in-alphasimple/</link>
		<comments>http://abstratt.com/blog/2011/02/05/working-areas-in-alphasimple/#comments</comments>
		<pubDate>Sat, 05 Feb 2011 18:57:26 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=205</guid>
		<description><![CDATA[One thing that may be confusing for someone trying AlphaSimple for the first time is the fact that for any given project (for non-guest users), there is always two working areas: a test area, and a published area: the test area is rebuilt from scratch every time you save your project. When you hit the [...]]]></description>
			<content:encoded><![CDATA[<p>One thing that may be confusing for someone trying <a href="http://alphasimple.com">AlphaSimple</a> for the first time is the fact that for any given project (for non-guest users), there is always two working areas: a <em>test area</em>, and a <em>published area</em>:</p>
<p style="text-align: center;"><img class="size-full wp-image-207  aligncenter" title="working-areas" src="http://abstratt.com/blog/wp-content/uploads/2011/02/working-areas.png" alt="" width="343" height="85" /></p>
<ul>
<li>the <strong>test area</strong> is rebuilt from scratch every time you save your project. When you hit the &#8220;Test&#8221; button, the prototype you are running is generated based on the test model area. It reflects your latest changes (at the time you hit Test). The URL for the prototype based off of the test area has a &#8220;run&#8221; segment (http://alphasimple.com/project/<strong>run</strong>/&lt;id&gt;).</li>
<li>the <strong>published area</strong> is only refreshed when you hit Publish. In order to run the prototype off of the published area, you hit &#8220;View Published&#8221;. Any changes you make to your model will *not* affect the published model/prototype. The URL for the prototype based off of the published area has a &#8220;published&#8221; segment (http://alphasimple.com/project/<strong>published</strong>/&lt;id&gt;).</li>
</ul>
<p>Imagine the published area as a snapshot of your work that you would want others (business analysts, customers, other modelers) to see, while the test area is what you use for your own testing on an ongoing basis as you develop your model. Guest (non-registered) users just quickly trying AlphaSimple anonymously have only the test area.</p>
<p><strong>Shared projects</strong></p>
<p>A mostly orthogonal concept is <em>shared projects</em>. A project that is shared appears in the <a href="http://alphasimple.com/project/shared">Shared Projects page</a> in AlphaSimple, and anyone can run the prototype, <a href="http://abstratt.com/blog/2010/08/27/easier-repository-browsing/">browse your model</a> (including a <a href="http://abstratt.com/blog/2011/01/02/alphasimple-generate-uml-diagrams-online/">graphical view</a>), and even copy your project and make it their own. Any registered user can share their projects. In fact, there is currently a limit of 3 non-shared projects. As you can guess, we want to encourage users to share their models.</p>
<p>You may be asking: &#8220;what is the relationship between shared projects and working areas?&#8221;. It is simple: what you see when looking at a shared project is the published state of that project. So for a shared project of yours, if you want to affect what is seen on the shared projects page, you need to publish your model (in addition to sharing the project). Actually, there is a bug in that if you don&#8217;t ever publish a shared project, trying to run or view it from the Shared Projects page will fail (we should be automatically publishing the model when a project is first shared, or hide shared projects until they are effectively published).</p>
<p>Does all this make sense? Let us know if it doesn&#8217;t, either by commenting here or by starting a thread on the <a href="http://alphasimple.com/community">community forum</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/02/05/working-areas-in-alphasimple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using UML2 in a server-side application? Read this.</title>
		<link>http://abstratt.com/blog/2011/01/25/using-uml2-in-a-server-side-application-read-this/</link>
		<comments>http://abstratt.com/blog/2011/01/25/using-uml2-in-a-server-side-application-read-this/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 02:31:26 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=204</guid>
		<description><![CDATA[For those of you who didn&#8217;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 [...]]]></description>
			<content:encoded><![CDATA[<p>For those of you who didn&#8217;t know, <a href="http://alphasimple.com">AlphaSimple</a>, our web-based modeling tool, is strongly based on Eclipse technologies:</p>
<ul>
<li>the <a href="http://www.eclipse.org/equinox/server/">server runs Equinox</a> with the web server (Jetty) running as an OSGi bundle</li>
<li>we use <a href="http://www.eclipse.org/uml2/">UML2</a> for building models (during model compilation), or for traversing them for execution, code generation, diagram rendering etc</li>
</ul>
<p>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.</p>
<p>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  <a href="http://www.eclipse.org/forums/index.php?t=thread&amp;frm_id=117">newsgroup</a> 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.</p>
<p>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 &#8211; 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 <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=335135">335135</a> and <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=332057">332057</a>), and I suspect can&#8217;t be made thread-safe by design.</p>
<p><strong>Q: how does one deal with showstoppers? A: with drastic measures.</strong></p>
<p>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 &#8220;singleton&#8221;). Luckily the changes required were quite small:</p>
<p><strong>org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ElementImpl.java</strong></p>
<pre>retrieving revision 1.43
diff -r1.43 ElementImpl.java
818c818,819
&lt; 		return CacheAdapter.INSTANCE;
---
&gt; 		//RC - hack to avoid thread safety issues with CacheAdapter
&gt; 		return CacheAdapter.getInstance();
</pre>
<p><strong>org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLUtil.java</strong></p>
<pre>retrieving revision 1.88
diff -r1.88 UMLUtil.java
197,198c197,198
&lt;
&lt; 			CacheAdapter.INSTANCE.adapt(stereotypeApplication);
---
&gt; 			//RC - hack to avoid thread safety issues with CacheAdapter
&gt; 			CacheAdapter.getInstance().adapt(stereotypeApplication);
</pre>
<p><strong>org.eclipse.uml2/plugins/org.eclipse.uml2.common/src/org/eclipse/uml2/common/util/CacheAdapter.java</strong></p>
<pre>retrieving revision 1.26
diff -r1.26 CacheAdapter.java
119,120d118
&lt; 	public static final CacheAdapter INSTANCE = createCacheAdapter();
&lt;
537a536,546
&gt; 	//RC - hack to avoid thread safety issues with CacheAdapter
&gt; 	private static final ThreadLocal&lt;CacheAdapter&gt; INSTANCE = new ThreadLocal&lt;CacheAdapter&gt;() {
&gt; 		protected CacheAdapter initialValue() {
&gt; 			return createCacheAdapter();
&gt; 		}
&gt; 	};
&gt;
&gt; 	public static CacheAdapter getInstance() {
&gt; 		return INSTANCE.get();
&gt; 	}
&gt;
</pre>
<p>This is not a real fix in the sense that it may not work for all applications &#8211; 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.</p>
<p>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.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/01/25/using-uml2-in-a-server-side-application-read-this/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The value of UML (or lack thereof) in the development process</title>
		<link>http://abstratt.com/blog/2011/01/10/the-value-of-uml-in-the-development-process-or-lack-thereof/</link>
		<comments>http://abstratt.com/blog/2011/01/10/the-value-of-uml-in-the-development-process-or-lack-thereof/#comments</comments>
		<pubDate>Mon, 10 Jan 2011 07:44:56 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=203</guid>
		<description><![CDATA[[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 [...]]]></description>
			<content:encoded><![CDATA[<p><em>[What follows was adapted from a discussion on LinkedIn on why companies developing software don't use UML more]</em></p>
<p>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.</p>
<p>I certainly don&#8217;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&#8217;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&#8217;t Repeat Yourself. I won&#8217;t bore you with the consequences of breaking that simple rule, it must be obvious to any developer worth their salt.</p>
<p>If you are going to be pragmatic, and you cannot generate running code from your models, from a developer&#8217;s point of view, there is no much value for UML in the development process.</p>
<p>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. </p>
<p>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 &#8211; see <a href="http://alphasimple.com">AlphaSimple</a> and <a href="http://textuml.org">TextUML Toolkit</a>), I won&#8217;t be surprised if the latter ends up being the winning approach (see RAD frameworks such as Grails and Rails).</p>
<p>Do you agree? Which approach do you prefer? Why?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/01/10/the-value-of-uml-in-the-development-process-or-lack-thereof/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Take control over UML class diagrams in AlphaSimple</title>
		<link>http://abstratt.com/blog/2011/01/05/take-control-over-uml-class-diagrams-in-alphasimple/</link>
		<comments>http://abstratt.com/blog/2011/01/05/take-control-over-uml-class-diagrams-in-alphasimple/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 03:56:21 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Graphviz]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=201</guid>
		<description><![CDATA[As recently announced, shared models in AlphaSimple now sport UML class diagrams thanks to Graphviz support in the Google Charts API . What I didn&#8217;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 [...]]]></description>
			<content:encoded><![CDATA[<p>As <a href="http://abstratt.com/blog/2011/01/02/alphasimple-generate-uml-diagrams-online/">recently</a> announced, <a href="http://alphasimple.com/project/shared"><strong>shared</strong></a> models in AlphaSimple now sport UML class diagrams thanks to Graphviz support in the Google Charts API .</p>
<p>What I didn&#8217;t mention is that you can customize how diagrams are rendered by specifying query parameters on the image URL. For instance, compare the <a rel="nofollow" href="http://alphasimple.com/mdd/diagram/rafael-26/expenses.uml" target="_blank">basic diagram</a> from the previous post with the customized diagram below (click on it to see the URL). Can you spot the differences? <img src='http://abstratt.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: center;"><a rel="nofollow" href="http://alphasimple.com/mdd/diagram/rafael-26/expenses.uml?showStructuralFeatureVisibility=true&amp;showClassifierStereotypes=true&amp;showAssociationEndOwnership=true&amp;showAssociationEndMultiplicity=true&amp;showAssociationName=true&amp;showEmptyClassifierCompartments=Always&amp;showParameterDirection=true"><img class="aligncenter" style="vertical-align: middle;" src="http://alphasimple.com/mdd/diagram/rafael-26/expenses.uml?showStructuralFeatureVisibility=true&amp;showClassifierStereotypes=true&amp;showAssociationEndOwnership=true&amp;showAssociationEndMultiplicity=true&amp;showAssociationName=true&amp;showEmptyClassifierCompartments=Always&amp;showParameterDirection=true" alt="" width="623" height="665" /></a></p>
<p>Here are all supported options:</p>
<ul>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showAssociationEndOwnership (boolean)<br />
</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showStructuralFeatureVisibility </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(boolean)</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showAssociationEndMultiplicity </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(boolean)</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showAssociationName </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(boolean)</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showAssociationEndName </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(boolean)</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showClassifierCompartmentForPackage </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">Current, Immediate, Any</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">)</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showClassifierStereotypes</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;"> </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(boolean)</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showElementsInOtherPackage</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;"> </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">Never, Immediate, Always</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">)</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showEmptyClassifierCompartments</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;"> </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">NotEmpty, Never, Always</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">)</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showFeatureStereotypes</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;"> </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(boolean)</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showParameterDirection</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;"> </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(boolean)</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showPrimitives</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;"> </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(boolean)</span></span></li>
<li><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">showRelationshipStereotypes</span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;"> </span></span><span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: sans-serif; color: #000000; font-size: medium;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; line-height: 16px; text-align: left; white-space: pre; font-family: monospace;">(boolean)</span></span></li>
</ul>
<p>Give it a try (don&#8217;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?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/01/05/take-control-over-uml-class-diagrams-in-alphasimple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generate UML diagrams online (using AlphaSimple)</title>
		<link>http://abstratt.com/blog/2011/01/02/alphasimple-generate-uml-diagrams-online/</link>
		<comments>http://abstratt.com/blog/2011/01/02/alphasimple-generate-uml-diagrams-online/#comments</comments>
		<pubDate>Sun, 02 Jan 2011 07:55:02 +0000</pubDate>
		<dc:creator>AlphaSimple Team</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Graphviz]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=200</guid>
		<description><![CDATA[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&#8217;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 [...]]]></description>
			<content:encoded><![CDATA[<p>As briefly mentioned in <a href="http://abstratt.com/blog/2010/12/17/new-features-editor-tabs-and-class-diagrams/">a previous post</a>, you can now render UML class diagrams using AlphaSimple. This is how you do it:</p>
<ol>
<li>sign up for <a href="http://alphasimple.com">AlphaSimple</a> (it&#8217;s free)</li>
<li><strong>create a project</strong></li>
<li><strong>create your models</strong> using the TextUML notation (<a href="https://sourceforge.net/apps/mediawiki/textuml/index.php?title=TextUML_Tutorial">tutorial</a>, <a href="https://sourceforge.net/apps/mediawiki/textuml/index.php?title=TextUML_Guide">reference</a>). Make sure you use no extension or use .tuml as file extension.</li>
<li>once your project is valid, <strong>publish it</strong></li>
<li>back to <a href="http://alphasimple.com/project/list">your project list</a> (&#8220;My Projects&#8221;), <strong>share the project</strong> by clicking the open lock button. Note that when you do that you make your project available for any users to see and copy.</li>
<li>now on the <a href="http://alphasimple.com/project/shared">shared project list</a> (&#8220;Shared Projects&#8221;), find and open your project &#8211; you will see a &#8220;Model Diagram&#8221; tab &#8211; <strong>there is your diagram</strong>! If you want to share your diagram with others, you can copy the image location and pass that URL around.</li>
</ol>
<p>Here is an example of diagram produced for project &#8220;<a href="http://alphasimple.com/project/show/26">Lesson #5 &#8211; All together now</a>&#8220;:</p>
<p style="text-align: center;"><a href="http://alphasimple.com/project/show/26"><img class="alignnone aligncenter" src="http://alphasimple.com/mdd/diagram/rafael-26/expenses.uml" alt="Expenses diagram" width="665" height="623" /></a></p>
<p><strong>How does it work?</strong></p>
<p>If you are interested in understanding what is involved here:</p>
<ol>
<li>AlphaSimple uses the TextUML compiler from our open source <a href="http://textuml.org">TextUML Toolkit</a> project translating TextUML source files into UML models (using the Eclipse UML2 format).</li>
<li>AlphaSimple also uses the TextUML Toolkit component (based on the <a href="https://sourceforge.net/projects/eclipsegraphviz/">EclipseGraphviz</a> project) for generating Graphviz dot diagrams from UML models.</li>
<li>For rendering the actual diagram from the dot description, instead of directly using Graphviz, AlphaSimple uses<a href="http://code.google.com/apis/chart/docs/gallery/graphviz.html"> Google&#8217;s Chart API</a> support for rendering dot diagrams.</li>
</ol>
<p>This is all very new, so there may be some rough spots. If you have any issues, or have suggestions, send them our way.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2011/01/02/alphasimple-generate-uml-diagrams-online/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>New features in AlphaSimple: editor tabs and class diagrams</title>
		<link>http://abstratt.com/blog/2010/12/17/new-features-editor-tabs-and-class-diagrams/</link>
		<comments>http://abstratt.com/blog/2010/12/17/new-features-editor-tabs-and-class-diagrams/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 06:02:32 +0000</pubDate>
		<dc:creator>AlphaSimple Team</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>

		<guid isPermaLink="false">http://alphasimple.com/blog/?p=254</guid>
		<description><![CDATA[This week we deployed two cool new features in AlphaSimple. The first feature is editor tabs: With editor tabs, you get the entire browser window width for your source files, which in the past would have required you to collapse the file list (and lose context of what other files exist in the project). The [...]]]></description>
			<content:encoded><![CDATA[<p>This week we deployed two cool new features in <a href="http://alphasimple.com">AlphaSimple</a>.</p>
<p>The first feature is editor tabs:</p>
<p style="text-align: center;"><a href="http://abstratt.com/blog/wp-content/uploads/2010/12/tabs.png"><img class="aligncenter size-full wp-image-255" title="tabs" src="http://abstratt.com/blog/wp-content/uploads/2010/12/tabs.png" alt="" width="517" height="319" /></a></p>
<p style="text-align: left;">With editor tabs, you get the entire browser window width for your source files, which in the past would have required you to collapse the file list (and lose context of what other files exist in the project).</p>
<p style="text-align: left;">The second feature is rendering of class diagrams:</p>
<p style="text-align: center;"><a href="http://abstratt.com/blog/wp-content/uploads/2010/12/classdiagram.png"><img class="size-full wp-image-258" title="classdiagram" src="http://abstratt.com/blog/wp-content/uploads/2010/12/classdiagram.png" alt="" width="518" height="319" /></a></p>
<p style="text-align: left;">Rendering of models as class diagrams provides yet another view into your model, in addition to the textual notation and the prototype. This feature needs more work but we wanted to get it out quick even if not fully baked to get some early feedback.</p>
<p style="text-align: left;">We hope you like it. Either way, we are eager to hear your opinion.</p>
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/12/17/new-features-editor-tabs-and-class-diagrams/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>On model-to-model transformations</title>
		<link>http://abstratt.com/blog/2010/11/21/on-model-to-model-transformations/</link>
		<comments>http://abstratt.com/blog/2010/11/21/on-model-to-model-transformations/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 18:04:32 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=176</guid>
		<description><![CDATA[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 &#8220;program&#8221; (i.e. model) at the right level of abstraction, with proper separation of concerns they can automatically [...]]]></description>
			<content:encoded><![CDATA[<p>There was <a href="http://modelseverywhere.wordpress.com/2010/11/20/about-model-transformations/">some</a> <a href="http://modelseverywhere.wordpress.com/2010/11/20/another-classification-of-transformations/">strong</a> (but polite) reaction to <a href="http://twitter.com/#!/abstratt/status/5408596594532352">some</a> <a href="http://twitter.com/#!/abstratt/status/5408944344276992">comments</a> I made about the role of model-to-model (M2M) transformations in model-driven development.</p>
<p>My thinking is that what really matters <strong>to modeling users</strong> (i.e. developers) is that:</p>
<ol>
<li>they can &#8220;program&#8221;  (i.e. model) at the right level of abstraction, with proper separation of concerns</li>
<li>they can automatically produce running code from those models without further manual elaboration</li>
</ol>
<p>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 <strong>modeling users</strong> care is that they are able to model their solutions and produce working applications. Of course, modeling <strong>experts</strong> will be interested in less mundane things, and more advanced aspects of modeling.</p>
<p>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&#8217;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.</p>
<p>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.</p>
<p>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&#8217;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&#8217;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.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/11/21/on-model-to-model-transformations/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AlphaSimple: Easier repository browsing</title>
		<link>http://abstratt.com/blog/2010/08/27/easier-repository-browsing/</link>
		<comments>http://abstratt.com/blog/2010/08/27/easier-repository-browsing/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 05:29:17 +0000</pubDate>
		<dc:creator>AlphaSimple Team</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>

		<guid isPermaLink="false">http://alphasimple.com/blog/?p=230</guid>
		<description><![CDATA[Earlier this week we deployed a great new feature: project browsing mode. You can now open any of the shared projects, and view prototype and model side-by-side: It is now much easier to learn how a model relates to the prototype. If you are logged in, and you like a project, you can clone it [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier this week we deployed a great new feature: project browsing mode. You can now open any of the shared projects, and view prototype and model side-by-side:</p>
<p><a href="http://abstratt.com/blog/wp-content/uploads/2010/08/browse-full.png"><img class="alignnone size-full wp-image-232" title="Browse mode" src="http://abstratt.com/blog/wp-content/uploads/2010/08/browse2.png" alt="" width="546" height="307" /></a></p>
<p>It is now much easier to learn how a model relates to the prototype. If you are logged in, and you like a project, you can clone it and start working on your own version right away. <a href="http://alphasimple.com/project/shared/">Try now</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/08/27/easier-repository-browsing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AlphaSimple gets a REST API</title>
		<link>http://abstratt.com/blog/2010/08/23/alphasimple-gets-a-rest-api/</link>
		<comments>http://abstratt.com/blog/2010/08/23/alphasimple-gets-a-rest-api/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 08:44:52 +0000</pubDate>
		<dc:creator>AlphaSimple Team</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>

		<guid isPermaLink="false">http://alphasimple.com/blog/?p=195</guid>
		<description><![CDATA[AlphaSimple just got a REST API. For any shared projects, you can get the project model (which includes access to source and XMI files) with a URI in the form &#8220;http://alphasimple.com/mdd/publisher/{userid}-{projectid}/&#8221;. For example, for: http://alphasimple.com/mdd/publisher/rafael-26/ you get: &#60;workspace packageCount='1' timestamp='1280186896000'&#62; &#60;model name='expenses.uml' uri='http://alphasimple.com/mdd/publisher/rafael-26/expenses.uml' graph='http://alphasimple.com/mdd/diagram/rafael-26/expenses.uml'/&#62; &#60;properties name='mdd.properties' uri='http://alphasimple.com/mdd/publisher/rafael-26/mdd.properties'/&#62; &#60;source name='expenses' uri='http://alphasimple.com/mdd/publisher/rafael-26/expenses'/&#62; &#60;renderer uri="http://alphasimple.com/animator/index.jsp?repository=rafael-26#"/&#62; &#60;/workspace&#62; The &#8220;model&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>AlphaSimple just got a REST API. For any <strong>shared projects</strong>, you can get the project model (which includes access to source and XMI files) with a URI in the form &#8220;http://alphasimple.com/mdd/publisher/{userid}-{projectid}/&#8221;. For example, for:<br />
<a href="http://alphasimple.com/mdd/publisher/rafael-26/" rel="nofollow">http://alphasimple.com/mdd/publisher/rafael-26/</a></p>
<p>you get:<span id="more-191"></span></p>
<pre><code>&lt;workspace packageCount='1' timestamp='1280186896000'&gt;
  &lt;model name='expenses.uml'
    uri='http://alphasimple.com/mdd/publisher/rafael-26/expenses.uml'
    graph='http://alphasimple.com/mdd/diagram/rafael-26/expenses.uml'/&gt;
  &lt;properties name='mdd.properties'
    uri='http://alphasimple.com/mdd/publisher/rafael-26/mdd.properties'/&gt;
  &lt;source name='expenses'
    uri='http://alphasimple.com/mdd/publisher/rafael-26/expenses'/&gt;
  &lt;renderer
    uri="http://alphasimple.com/animator/index.jsp?repository=rafael-26#"/&gt;
&lt;/workspace&gt;</code></pre>
<p>The &#8220;model&#8221; elements give you access to the models in the project in compiled form (<a rel="nofollow" href="http://alphasimple.com/mdd/publisher/rafael-26/expenses.uml">XMI</a>). <strong>UPDATE (2010/09/02):</strong> <em>model elements now also provide access to the corresponding class diagram (<a rel="nofollow" href="http://alphasimple.com/mdd/diagram/rafael-26/expenses.uml">PNG</a>)</em>.<strong>UPDATE (2011/07/07):</strong> <em>model elements now also provide access to the code generation target platforms (such as <a rel="nofollow" href="http://alphasimple.com/mdd/generator/rafael-26/POJO">POJO</a>)</em>.</p>
<p>The &#8220;source&#8221; elements give you access to the source files in the project (currently in <a rel="nofollow" href="http://alphasimple.com/mdd/publisher/rafael-26/expense">TextUML</a>).</p>
<p>The goal is to allow 3rd-parties to access those models, for generating code, rendering diagrams, versioning contents, or whatever crazy idea one can think of. Note that this feature is still experimental and is being made available so people can provide feedback, the specifics might (and probably will) change.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/08/23/alphasimple-gets-a-rest-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AlphaSimple: Doors wide open</title>
		<link>http://abstratt.com/blog/2010/08/14/doors-wide-open/</link>
		<comments>http://abstratt.com/blog/2010/08/14/doors-wide-open/#comments</comments>
		<pubDate>Sat, 14 Aug 2010 11:01:33 +0000</pubDate>
		<dc:creator>AlphaSimple Team</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>

		<guid isPermaLink="false">http://alphasimple.com/blog/?p=185</guid>
		<description><![CDATA[During the beta period registered users have access to the full service for free. The advantage of signing up is that your files are stored on the site and you can always come back and continue from where you&#8217;ve left off. Sign up now and let us know what you think.]]></description>
			<content:encoded><![CDATA[<p>During the beta period registered users have access to the full service for free. The advantage of signing up is that your files are stored on the site and you can always come back and continue from where you&#8217;ve left off.</p>
<p><a href="http://alphasimple.com/user/create">Sign up</a> now and let us know what you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/08/14/doors-wide-open/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AlphaSimple: Syntax highlighting is back!</title>
		<link>http://abstratt.com/blog/2010/08/12/syntax-highlight-is-back/</link>
		<comments>http://abstratt.com/blog/2010/08/12/syntax-highlight-is-back/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 09:34:32 +0000</pubDate>
		<dc:creator>AlphaSimple Team</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>

		<guid isPermaLink="false">http://alphasimple.com/blog/?p=176</guid>
		<description><![CDATA[We have turned syntax highlighting back on. It looks a lot nicer to prototype. Also, you can use Ctrl+S for saving, and the file list can be collapsed. There are also some improvements for IE although we still recommend using Firefox, Chrome or Safari. Go ahead, try it out and tell us what you think!]]></description>
			<content:encoded><![CDATA[<p>We have turned syntax highlighting back on. It looks a lot nicer to prototype. Also, you can use Ctrl+S for saving, and the file list can be collapsed.</p>
<p>There are also some improvements for IE although we still recommend using Firefox, Chrome or Safari.</p>
<p>Go ahead, <a href="http://alphasimple.com/">try it</a> out and <a href="http://alphasimple.uservoice.com/forums/30387-alphasimple-community">tell us</a> what you think!</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/08/12/syntax-highlight-is-back/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Model interpretation vs. code generation? Both.</title>
		<link>http://abstratt.com/blog/2010/08/07/model-interpretation-vs-code-generation-both/</link>
		<comments>http://abstratt.com/blog/2010/08/07/model-interpretation-vs-code-generation-both/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 19:09:25 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=173</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Model interpretation vs. code generation? There were recently two <a href="http://www.theenterprisearchitect.eu/archive/2010/06/28/model-driven-development-code-generation-or-model-interpretation">interesting</a> <a href="http://modeling-languages.com/blog/content/executable-models-vs-code-generation-vs-model-interpretation">posts</a> 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.</p>
<p>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:</p>
<ul>
<li>play with your model as you go (for instance, using a dynamically generated UI, like <a href="http://alphasimple.com">AlphaSimple</a> does)</li>
<li>run automated tests against it</li>
<li>debug it</li>
</ul>
<p>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).</p>
<p>But it is not just a matter of turnaround. It really makes a lot more sense:</p>
<ul>
<li>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!</li>
<li>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);</li>
<li>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.</li>
</ul>
<p>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.</p>
<p>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.</p>
<p>What are your thoughts?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/08/07/model-interpretation-vs-code-generation-both/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.6 declared!</title>
		<link>http://abstratt.com/blog/2010/08/05/textuml-toolkit-16-declared/</link>
		<comments>http://abstratt.com/blog/2010/08/05/textuml-toolkit-16-declared/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 07:35:19 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=172</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>The TextUML Toolkit version 1.6 has been released. It is the same RC1 build mentioned here <a href="http://abstratt.com/blog/2010/07/26/textuml-toolkit-16-rc1-is-now-available/">a week ago</a>. 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.</p>
<p>Take a look at the new notation features:</p>
<ul>
<li> preconditions on operations</li>
</ul>
<pre>operation withdraw(amount : Real);
precondition { amount &gt; 0 and amount &lt; self.balance }
begin
    self.balance := self.balance - amount;
end;
</pre>
<ul>
<li> derived properties</li>
</ul>
<pre>reference employees : Employee[*]

/* calculated field */
derived attribute employeeCount : Integer := ():Integer { return self-&gt;employees.size() };
</pre>
<ul>
<li> initial values on properties</li>
</ul>
<pre>attribute available : Boolean := true;</pre>
<p>You can also try these new features online on <a href="http://alphasimple.com">AlphaSimple</a>. Sign up or start a guest session to create, validate and run your models on the spot, there is nothing to install!</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/08/05/textuml-toolkit-16-declared/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.6 RC1 is now available</title>
		<link>http://abstratt.com/blog/2010/07/26/textuml-toolkit-16-rc1-is-now-available/</link>
		<comments>http://abstratt.com/blog/2010/07/26/textuml-toolkit-16-rc1-is-now-available/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 23:21:17 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=171</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>TextUML Toolkit 1.6 RC1 is now available! You can install it using the Marketplace Client or by pointing Eclipse to the update site:</p>
<p>http://abstratt.com/update</p>
<p>If you find any problems installing this build, please let us know asap so it can be addressed before the final release.</p>
<p><strong>New features</strong></p>
<p>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:</p>
<ul>
<li>preconditions on operations (<a href="https://sourceforge.net/tracker/?func=detail&amp;aid=2986923&amp;group_id=236545&amp;atid=1099987">2986923</a> and <a href="https://sourceforge.net/tracker/?func=detail&amp;aid=3002571&amp;group_id=236545&amp;atid=1099987">3002571</a>)</li>
<li>support for a default notation (so file extensions can be optional) (<a href="https://sourceforge.net/tracker/?func=detail&amp;aid=2995372&amp;group_id=236545&amp;atid=1099987">2995372</a>)</li>
<li>support for implicitly applying profiles/stereotypes (so models are less verbose) (<a href="https://sourceforge.net/tracker/?func=detail&amp;aid=2981580&amp;group_id=236545&amp;atid=1099987">2981580</a>)</li>
<li>support for derived properties (<a href="https://sourceforge.net/tracker/?func=detail&amp;aid=2928428&amp;group_id=236545&amp;atid=1099987">2928428</a>)</li>
<li>support for initial values in properties (<a href="https://sourceforge.net/tracker/?func=detail&amp;aid=2115439&amp;group_id=236545&amp;atid=1099987">2115439</a>)</li>
<li>advanced features (closures, constraints) are now implemented using profiles instead of metamodel extensions (<a href="https://sourceforge.net/tracker/?func=detail&amp;aid=2933692&amp;group_id=236545&amp;atid=1099987">2933692</a>)</li>
</ul>
<p><strong>In other news</strong></p>
<p>The reason it took so long for a new TextUML Toolkit release to come about was that I have been busy working on <a href="http://alphasimple.com">AlphaSimple</a>, which went on <a href="http://alphasimple.com/blog/2010/07/alphasimple-public-beta-starting-today/">public beta today</a>. AlphaSimple is an online tool for domain-driven prototyping that currently uses TextUML as <a href="http://alphasimple.com/blog/documentation/modeling-notation/">modeling notation</a>. 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.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/07/26/textuml-toolkit-16-rc1-is-now-available/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AlphaSimple public beta starting today!</title>
		<link>http://abstratt.com/blog/2010/07/26/alphasimple-public-beta-starting-today/</link>
		<comments>http://abstratt.com/blog/2010/07/26/alphasimple-public-beta-starting-today/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 08:42:59 +0000</pubDate>
		<dc:creator>AlphaSimple Team</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>

		<guid isPermaLink="false">http://alphasimple.com/blog/?p=156</guid>
		<description><![CDATA[It&#8217;s official. AlphaSimple is now available in open beta for anyone who wants to try. Take a look and let us know what you think. This initial release brings a simple yet effective web-based environment for domain-driven prototyping. Don&#8217;t know what AlphaSimple is? AlphaSimple is an environment for rapid prototyping. You compose your domain model [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s official. AlphaSimple is now available in open beta for anyone who wants to try. <a href="http://alphasimple.com">Take a look</a> and let us know what you think. This initial release brings a simple yet effective web-based environment for domain-driven prototyping.</p>
<h4>Don&#8217;t know what AlphaSimple is?</h4>
<p><strong>AlphaSimple is an environment for rapid prototyping.</strong> You compose your domain model using an in-browser editor. The model is automatically validated every time you save. Play with your prototype right away. Rinse. Repeat.</p>
<p><strong>AlphaSimple is an online tool for collaborative creation.</strong> Once you are happy with your prototype, publish it and send the URI to clients, team members, anyone you would like to see it no matter where they are.</p>
<p><strong>AlphaSimple is a place for sharing. </strong> Feeling proud of your work? Share your projects for others in the community to learn from you. It&#8217;s just a button away.</p>
<p><strong>AlphaSimple is a place for learning. </strong> Don&#8217;t know where to start? <a href="http://alphasimple.com/project/shared">Browse</a> the catalog of public projects, play with a prototype, and clone it to make it your own. No easier way to learn. If you still need help, the AlphaSimple <a href="http://alphasimple.com/community">community forum</a> is there for you (and there is some <a href="http://alphasimple.com/blog/documentation/">documentation</a> too).</p>
<h4>What are you waiting for?</h4>
<p>Take <a href="http://alphasimple.com">AlphaSimple</a> for a spin. If you are unsure about signing up, try it as a guest. Except for sharing/publishing projects, guest sessions are full-featured.</p>
<p><em><strong>UPDATE on browser compatibility:</strong> the browsers we have been testing on are Chrome and Firefox. Syntax highlighting is broken on Safari, so it has been turned off by default (you can turn it back on). AlphaSimple does <strong>not</strong> work on Internet Explorer at this time. Flash is required for running prototypes.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/07/26/alphasimple-public-beta-starting-today/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AlphaSimple: Public beta around the corner</title>
		<link>http://abstratt.com/blog/2010/06/04/public-beta-around-the-corner/</link>
		<comments>http://abstratt.com/blog/2010/06/04/public-beta-around-the-corner/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 04:04:45 +0000</pubDate>
		<dc:creator>AlphaSimple Team</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>

		<guid isPermaLink="false">http://alphasimple.com/blog/?p=153</guid>
		<description><![CDATA[We are currently working on the first public beta of AlphaSimple, which should happen early this Summer. The AlphaSimple private beta generated some good feedback, and we are making sure the best ideas and suggestions make it into the product. We also want to make this first public beta so solid you will want to [...]]]></description>
			<content:encoded><![CDATA[<p>We are currently working on the first public beta of AlphaSimple, which should happen early this Summer. The AlphaSimple private beta generated some good feedback, and we are making sure the best ideas and suggestions make it into the product. We also want to make this first public beta so solid you will want to use it in your work <strong>right now</strong>.</p>
<p>It should not take long now. Bear with us, we don&#8217;t think you will be disappointed.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/06/04/public-beta-around-the-corner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AlphaSimple: First private beta coming soon!</title>
		<link>http://abstratt.com/blog/2010/04/25/first-alphasimple-private-beta-coming-soon/</link>
		<comments>http://abstratt.com/blog/2010/04/25/first-alphasimple-private-beta-coming-soon/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 23:59:27 +0000</pubDate>
		<dc:creator>AlphaSimple Team</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>

		<guid isPermaLink="false">http://li154-90.members.linode.com/blog/?p=4</guid>
		<description><![CDATA[We are working hard to get the first private beta version of AlphaSimple out of the door.  Stay tuned! If you would like to participate, just send a note to support, or head to the forum.]]></description>
			<content:encoded><![CDATA[<p>We are working hard to get the first private beta version of AlphaSimple out  of the door.  Stay tuned! If you would like to participate, just send a note to support, or head to the <a href="http://alphasimple.uservoice.com">forum</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/04/25/first-alphasimple-private-beta-coming-soon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UML may suck, but is there anything better?</title>
		<link>http://abstratt.com/blog/2010/02/08/uml-may-suck-but-is-there-anything-better/</link>
		<comments>http://abstratt.com/blog/2010/02/08/uml-may-suck-but-is-there-anything-better/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 08:06:08 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=117</guid>
		<description><![CDATA[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, [...]]]></description>
			<content:encoded><![CDATA[<p>UML has been getting a lot of criticism from all sides, even from the modeling community. Sure, it has its warts:</p>
<ul>
<li>it is a huge language, that wants to be all things to all kinds of people (business analysts, designers, developers, users)</li>
<li>it has a specification that is lengthy, hard to navigate and often vague, incomplete or inconsistent</li>
<li>it is modular, but its composition mechanism (package merging) is esoteric and not well understood by most</li>
<li>it is extensible, but language extensions (profiles and stereotypes) are 2nd-class citizens</li>
<li>it lacks a reference implementation</li>
<li>its model interchange specification is so vague that often two valid implementations won&#8217;t work with each other</li>
<li>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)</li>
<li><em>&lt;add your own grudges here&gt;</em></li>
</ul>
<p>However, even though I see a lot of room for improvement, <em>I still don&#8217;t think there is anything better out there</em>. 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.</p>
<p>In my opinion (hey, this is my blog!), for a modeling language to beat UML:</p>
<ul>
<li>it must be general purpose, not tailored to a specific architecture or style of software</li>
<li>it must not be tailored to an implementation language</li>
<li>it must be based on or compatible with the object paradigm</li>
<li>it must not be limited to one of the dominant aspects of software (state, structure, behavior)</li>
<li>it must be focused on executability/code generation (and thus suitable for MDD) as opposed to documentation/communication</li>
<li>it must be modular, and user extensions should be 1st class citizens</li>
<li>its specification should follow an open process</li>
<li>it must not be owned/controlled by a single company</li>
<li>it must not require royalties for adoption/implementation</li>
</ul>
<p>My suspicion is that the next modeling language that will beat the UML as we know today is <em>the future major release of UML</em>. Honestly, I would rather see a new modeling language built from scratch, focused on building systems, that didn&#8217;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.</p>
<p>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.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/02/08/uml-may-suck-but-is-there-anything-better/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Myths that give model-driven development a bad name</title>
		<link>http://abstratt.com/blog/2010/02/06/myths-that-give-model-driven-development-a-bad-name/</link>
		<comments>http://abstratt.com/blog/2010/02/06/myths-that-give-model-driven-development-a-bad-name/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 07:58:38 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=168</guid>
		<description><![CDATA[It seems that people that resist the idea of model-driven development (MDD) do so because they believe no tool can have the level of insight a programmer can. They are totally right about that last part. But that is far from being the point of MDD anyways. However, I think that unfortunate misconception is one [...]]]></description>
			<content:encoded><![CDATA[<p>It seems that people that resist the idea of model-driven development (MDD) do so because they believe <strong>no tool can have the level of insight a programmer can</strong>. They are totally right about that last part. But that is far from being the point of MDD anyways. However, I think that unfortunate misconception is one of the main reasons MDD hasn&#8217;t caught on yet. Because of that, I thought it would be productive to explore this and other myths that give MDD a bad name.</p>
<p><strong>Model-driven development myths</strong></p>
<p>Model-driven development <strong>makes programmers redundant</strong>. MDD helps with the boring, repetitive work, leaving more time for programmers to focus on the intellectually challenging aspects. Programmers are still needed to model a solution, albeit using a more appropriate level of abstraction. And programmers are still needed to encode implementation strategies in the form of reusable code generation templates or model-driven runtime engines.</p>
<p>Model-driven development <strong>enables business analysts to develop software</strong> (a variation of the previous myth). The realm of business analysts is the problem space. They usually don&#8217;t have the skills required to devise a solution in software. Tools cannot bridge that gap. Unless the mapping between the problem space and solution space is really trivial (but then you wouldn&#8217;t want to do that kind of trivial job anyways, right?).</p>
<p>Model-driven development <strong>generates an initial version of the code</strong> that can be manually maintained from there on. That is not model-driven, it is model-started at most. Most of the benefits of MDD are missed unless models truly drive development.</p>
<p>Model-driven development <strong>involves round-trip engineering</strong>. In MDD, models are king, 3GL source code is object code, models are the source. The nice abstractions from the model-level map to several different implementation artifacts that capture some specific aspect of the original abstraction, combined with implementation-related aspects. That mapping is not without loss of information, so it is usually not reversible in a practical way, even less so if the codebase is manually maintained (and thus inherently inconsistent/ill-formed). More on this in <a href="http://abstratt.com/blog/2009/05/03/on-code-being-model/">this older post</a>, pay attention to the comments as well.</p>
<p>Model-driven development <strong>is an all or nothing proposition</strong>. You use MDD where it is beneficial, combining with manually developed artifacts and components where appropriate. But avoid mixing manual written code with automatically generated code in the same artifact.</p>
<p>What is your opinion? Do you agree these are myths? Any other myths about MDD that give it a bad name that you have seen being thrown around?</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/02/06/myths-that-give-model-driven-development-a-bad-name/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Interview at Modeling-Languages.com</title>
		<link>http://abstratt.com/blog/2010/01/25/interview-at-modeling-languagescom/</link>
		<comments>http://abstratt.com/blog/2010/01/25/interview-at-modeling-languagescom/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 04:13:18 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=166</guid>
		<description><![CDATA[Last December I had the pleasure of being interviewed by Jordi Cabot, the maintainer of Modeling-Languages.com, a web site on all things model-driven. We talked mostly about the TextUML Toolkit project, but Jordi also asked about my opinions on more general subjects, such as modeling notations, textual modeling frameworks, DSLs, UML and trends in modeling. [...]]]></description>
			<content:encoded><![CDATA[<p>Last December I had the pleasure of being <a href="http://modeling-languages.com/coffee-rafael-chaves-textuml-tool/">interviewed</a> by Jordi Cabot, the maintainer of <a href="http://modeling-languages.com">Modeling-Languages.com</a>, a web site on all things model-driven. We talked mostly about the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> project, but Jordi also asked about my opinions on more general subjects, such as modeling notations, textual modeling frameworks, DSLs, UML and trends in modeling.</p>
<p>Jordi has recently made a transcription of the interview available on his <a href="http://modeling-languages.com/blog/content/coffee-rafael-chaves-textuml-toolkit">web site</a>. Take a read, feel free to leave a comment, I am very keen on discussing on any of the topics covered.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/01/25/interview-at-modeling-languagescom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Doing away with custom UML metaclasses in TextUML</title>
		<link>http://abstratt.com/blog/2010/01/17/doing-away-with-custom-uml-metaclasses-in-textuml/</link>
		<comments>http://abstratt.com/blog/2010/01/17/doing-away-with-custom-uml-metaclasses-in-textuml/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 09:45:17 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=165</guid>
		<description><![CDATA[The TextUML Toolkit has since release 1.2 had a metamodel extension package (inaptly named &#8216;meta&#8217;). This metamodel extension package defined new metaclasses not available in UML such as: closure &#8211; an activity that has another activity as context conversion action &#8211; an action that flows an input directly as output just changing the type literal [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> has since release 1.2 had a metamodel extension package (inaptly named &#8216;meta&#8217;). This metamodel extension package defined new metaclasses not available in UML such as:</p>
<ul>
<li>closure &#8211; an activity that has another activity as context</li>
<li>conversion action &#8211; an action that flows an input directly as output just changing the type</li>
<li>literal double &#8211; a literal value for double precision numeric values</li>
<li>signature &#8211; a classifier that contained parameters, the type of a closure</li>
<li>meta value specification &#8211; a value specification for meta references</li>
<li>collection literals &#8211; a value specification that aggregates other value specifications</li>
</ul>
<p>Turns out extending the UML metamodel by definining new packages and metaclasses is a bad idea. Some reasons (yes, I am feeling &#8216;bullety&#8217;):</p>
<ul>
<li>it is non-standard</li>
<li>other UML tools cannot read instances of your metaclasses, some won&#8217;t read your models at all if they have *any* unknown metaclasses</li>
<li>there is little documentation on how to maintain these kinds of metamodel extensions</li>
<li>since it is not the mainstream approach, we are bound to encounter more issues</li>
</ul>
<p>Because of that, release 1.6 will rely exclusively on profiles and stereotypes for extending the UML metamodel.</p>
<p><strong>What to expect</strong></p>
<p>For conventional users of the Toolkit, this change might possibly go unnoticed, barring any potential bugs introduced in the process.</p>
<p>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.</p>
<p>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 <a href="http://abstratt.com/forums/">forums</a> or report <a href="http://abstratt.com/issues/">issues</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2010/01/17/doing-away-with-custom-uml-metaclasses-in-textuml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.5 is out!</title>
		<link>http://abstratt.com/blog/2009/12/02/textuml-toolkit-15-is-out/</link>
		<comments>http://abstratt.com/blog/2009/12/02/textuml-toolkit-15-is-out/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 06:58:17 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=164</guid>
		<description><![CDATA[Release 1.5 of the TextUML Toolkit is now available from the update sites, for both Eclipse 3.5+ and 3.4. Update or install. We got a few new features in this release. Content assist There is now early support for content assist (contributed by Attila Bak), with initial support for stereotype applications. Element aliasing You can [...]]]></description>
			<content:encoded><![CDATA[<p>Release 1.5 of the <a href="http://sourceforge.net/apps/mediawiki/textuml/index.php?title=TextUML_Toolkit_Feature">TextUML Toolkit</a> is now available from the update sites, for both Eclipse 3.5+ and 3.4. Update or <a href="http://sourceforge.net/apps/mediawiki/textuml/index.php?title=Install_Instructions">install</a>. We got a few new features in this release.<br />
<br />
<strong>Content assist </strong><br />
There is now early support for content assist (contributed by Attila Bak),  with initial support for stereotype applications.<br />
<img src='http://sourceforge.net/apps/mediawiki/textuml/nfs/project/t/te/textuml/5/5b/Content-assist.png' alt='Content assist in action' class='aligncenter' /><br />
<br />
<strong>Element aliasing</strong><br />
You can now enable <a href="http://sourceforge.net/tracker/?func=detail&amp;aid=2899590&amp;group_id=236545&amp;atid=1099987">aliasing</a> by creating <a title="Repository Properties" href="http://sourceforge.net/apps/mediawiki/textuml/index.php?title=Repository_Properties">repository properties</a> in the form:</p>
<pre><code>mdd.aliases.&lt;source-qualified-name&gt;=&lt;target-qualified-name&gt;</code></pre>
<p>For instance:</p>
<pre><code>mdd.aliases.base\:\:Real=mypackage\:\:MyReal</code></pre>
<p>
<strong>New textual notation features</strong><br />
There is now textual notation support for <a href="http://sourceforge.net/tracker/?func=detail&amp;aid=2820250&amp;group_id=236545&amp;atid=1099987">decimal literals</a>.</p>
<p>You might have noticed 1.4 was announced here <a href="http://abstratt.com/blog/2009/11/06/textuml-toolkit-141-is-out/">less than a month ago</a>. We decided to start pushing releases as often as we can, so you can expect a bunch of 1.x releases throughout 2010. If you want to see some feature in the TextUML Toolkit, ask away!</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/12/02/textuml-toolkit-15-is-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Can TextUML be implemented the generative way (with Xtext or EMFText)?</title>
		<link>http://abstratt.com/blog/2009/11/29/can-textuml-be-implemented-the-generative-way-with-xtext-or-emftext/</link>
		<comments>http://abstratt.com/blog/2009/11/29/can-textuml-be-implemented-the-generative-way-with-xtext-or-emftext/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 01:49:00 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=163</guid>
		<description><![CDATA[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[*]; [...]]]></description>
			<content:encoded><![CDATA[<p>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:</p>
<pre>
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;
</pre>
<p>Notice the Advertisement class declares two operations. Their behaviour in TextUML could be written as:</p>
<pre>
    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;
</pre>
<p>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). </p>
<p>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):</p>
<pre>
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()
        )
    }
}
</pre>
<p>and the behaviour Advertisement.findByCategoryName would map to this:</p>
<pre>
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
                ))
            )
        )
}
</pre>
<p>Note that UML does not have closures, this is an extension to the UML metamodel which I wrote about here <a href="http://abstratt.com/blog/2009/01/18/closures-in-uml-extending-metamodel-with-textuml-toolkit/">before</a>.</p>
<p>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.</p>
<p>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.</p>
<p>If you have the answers for any of these questions (or even if you have comments and questions of your own), please chime in.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/11/29/can-textuml-be-implemented-the-generative-way-with-xtext-or-emftext/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Eclipse Modeling Day in Toronto</title>
		<link>http://abstratt.com/blog/2009/11/20/eclipse-modeling-day-in-toronto/</link>
		<comments>http://abstratt.com/blog/2009/11/20/eclipse-modeling-day-in-toronto/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 03:32:07 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=162</guid>
		<description><![CDATA[Last Wednesday I attended the Eclipse Modeling Day in Toronto. Coming all the way from Victoria, I must have been the participant that came from farthest. Except, of course, those folks from SAP AG and Itemis that were presenting. But I was really glad to be there. I finally had the chance to chat and [...]]]></description>
			<content:encoded><![CDATA[<p>Last Wednesday I attended the <a href="http://wiki.eclipse.org/Eclipse_Modeling_Day#Toronto">Eclipse Modeling Day in Toronto</a>. Coming all the way from Victoria, I must have been the participant that came from farthest. Except, of course, those folks from SAP AG and Itemis that were presenting. But I was really glad to be there. I finally had the chance to chat and discuss about Eclipse and Modeling face to face with people like Simon Kaegi (server-side OSGi), Kenn Hussey (MDT UML2), Eike Stepper (CDO), Ed Merks and (fellow Brazilian) Marcelo Paternostro (EMF), Lynn Gayowski and Ian Skerret (Eclipse Foundation). It&#8217;s weird: I have been part of the Eclipse Modeling community since 2006 (and the larger Eclipse community since 2002), but had never actually met any of those folks before. Also amusing was that even though I worked for IBM Ottawa for quite a few years, my first time at the Toronto Lab was many years later as an ex-IBMer living on the West Coast.</p>
<p>The presentations I attended were in general very good. I had seen Ed Merks&#8217; opening presentation on the web before, but this time I could ask questions. I got a better understanding of Xtext (great presentation!), CDO, and the Query, Validation and Transaction frameworks, some technologies I am considering adopting in the near future. I had a first time contact with the Papyrus 2.0 vision, which might provide an opportunity for increasing adoption of the TextUML notation by integrating the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> into a larger modeling environment. And I liked the idea of a discussion panel at the end.</p>
<p>I had to catch a flight back home that same night, so I could not attend the Eclipse RT Day on the following day nor could I see any of the demos at the <a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2009/Toronto">DemoCamp</a>. Speaking of which, I did manage to stay long enough to have a beer on the Foundation (thanks!), and chat with Christopher Nagy from <a href="http://www.dexterra.com/">Dexterra</a>/Antenna Software, who made a quick ad hoc demo to Ian and myself of their Eclipse/GEF-based tool for authoring multiplatform mobile applications. Very impressive!</p>
<p>As constructive criticism, I do agree with <a href="http://eclipse-projects.blogspot.com/2009/11/how-to-improve-eclipse-x-day.html">Bjorn</a> that the format could use some tweaking. I sure had to miss some very promising presentations. Maybe with two presentation formats, a longer (for instance, 40-50 mins) and a shorter one (20-25 mins), we wouldn&#8217;t need two tracks. I am not sure presenters who came from Europe would have come had they had a shorter slot though. That being said, I was very satisfied with the event overall and am sincerely thankful to IBM Toronto for hosting the event, the Eclipse Foundation for organizing it, all the folks <a href="http://wiki.eclipse.org/Eclipse_Modeling_Day/Session_Abstracts_Toronto">presenting</a> and the companies sponsoring them. Thank you very much! As Lawrence <a href="http://eclipsetacy.blogspot.com/2009/11/eclipse-rt-day-toronto.html">wrote</a>, hope we will see more events like this in the future!</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/11/20/eclipse-modeling-day-in-toronto/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.4 is out!</title>
		<link>http://abstratt.com/blog/2009/11/06/textuml-toolkit-141-is-out/</link>
		<comments>http://abstratt.com/blog/2009/11/06/textuml-toolkit-141-is-out/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 07:51:00 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=161</guid>
		<description><![CDATA[Release 1.4 of the TextUML Toolkit is now available from the update sites, for both Eclipse 3.5+ and 3.4 (by the way, it is possible this will be the last major release targetting Eclipse 3.4, unless someone volunteers to generate and test builds for 3.4). This is mostly a bug fix release. However, there were [...]]]></description>
			<content:encoded><![CDATA[<p>Release 1.4 of the TextUML Toolkit is now available from the <a href="http://abstratt.com/update/">update sites</a>, for both Eclipse 3.5+ and 3.4 (<em>by the way, it is possible this will be the last major release targetting Eclipse 3.4, unless someone volunteers to generate and test builds for 3.4</em>).</p>
<p>This is mostly a bug fix release. However, there were some minor notation changes to support stereotypes on dependencies, generalizations and interface realizations, hence the version change from 1.3.x to 1.4.x.</p>
<p>Thanks to Vladimir Sosnin, Attila Bak and fredlaviale for contributing with code and/or bug reports/feature requests. Keep them coming!</p>
<p>As usual, you can find a summary of the changes in the <a href="http://sourceforge.net/apps/mediawiki/textuml/index.php?title=TextUML_Toolkit_Features">TextUML Toolkit Features</a> page. If you are using the Toolkit, make sure you upgrade soon. If not, what are you waiting for? <a href="http://sourceforge.net/apps/mediawiki/textuml/index.php?title=Install_Instructions">Install it already</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/11/06/textuml-toolkit-141-is-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Model-driven prototyping presentation @ VIJUG</title>
		<link>http://abstratt.com/blog/2009/10/02/model-driven-prototyping-presentation-vijug/</link>
		<comments>http://abstratt.com/blog/2009/10/02/model-driven-prototyping-presentation-vijug/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 03:59:54 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=159</guid>
		<description><![CDATA[Last week I did a short presentation on &#8220;Model-driven prototyping&#8221; for the Vancouver Island Java User Group (VIJUG). It was lots of fun, with good participation from the group. I also showed a quick demo of AlphaSimple, our upcoming service for model-driven prototyping, which seemed to be well received. For the benefit of those not [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I did a short presentation on &#8220;Model-driven prototyping&#8221; for the Vancouver Island Java User Group (<a href="http://www.mosabuam.com/vijug/blog/">VIJUG</a>). It was lots of fun, with good participation from the group. I also showed a quick demo of <a href="http://alphasimple.com">AlphaSimple</a>, our upcoming service for model-driven prototyping, which seemed to be well received.</p>
<p>For the benefit of those not there, here is a web-version of that presentation, with notes showing on the slides (click <a href="http://docs.google.com/present/view?id=dgcqxr7c_65c77d6ddk&#038;interval=30">here</a> for a full screen view).</p>
<p><iframe src="http://docs.google.com/present/embed?id=dgcqxr7c_65c77d6ddk" frameborder="0" width="410" height="342"></iframe></p>
<p>Comments are very welcome. I would be very happy to discuss the approach with anyone interested.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/10/02/model-driven-prototyping-presentation-vijug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Model-driven prototyping with AlphaSimple</title>
		<link>http://abstratt.com/blog/2009/09/28/model-driven-prototyping-with-alphasimple/</link>
		<comments>http://abstratt.com/blog/2009/09/28/model-driven-prototyping-with-alphasimple/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 06:49:22 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[alphasimple.com]]></category>
		<category><![CDATA[editorial]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=158</guid>
		<description><![CDATA[It&#8217;s been a while since the last post, but I have a good excuse. I have been working on a new MDD product named AlphaSimple. AlphaSimple is our upcoming web-based service that renders functional prototypes straight from rich domain models. The goal is to bridge the gap between design and requirement analysis, creating a fast [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a while since the last post, but I have a good excuse. I have been working on a new MDD product named AlphaSimple.</p>
<p><a href="http://alphasimple.com">AlphaSimple</a> is our upcoming web-based service that renders functional prototypes straight from rich domain models. The goal is to bridge the gap between design and requirement analysis, creating a fast feedback loop between those two activities. The result is much more precise and complete requirements early in the project lifecycle, and a sound design model that not only will be a breeze to implement, but that even your customers will understand.</p>
<p><img src="http://abstratt.com/alphasimple.png" alt="" width="600" height="298" align="center" /></p>
<p>We are craving feedback. If you want to take an alpha version for a spin, sign up at <a href="http://alphasimple.com">alphasimple.com</a>.</p>
<p>Cheers,</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/09/28/model-driven-prototyping-with-alphasimple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.3 is out!</title>
		<link>http://abstratt.com/blog/2009/06/23/textuml-toolkit-13-is-out/</link>
		<comments>http://abstratt.com/blog/2009/06/23/textuml-toolkit-13-is-out/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 03:20:27 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=157</guid>
		<description><![CDATA[The TextUML Toolkit 1.3 is now available, 4.5 months after 1.2. If you already got RC1 (1.3.0.20090614&#8230;), it is the same build, no need to upgrade again. Otherwise, just point the Eclipse update mechanism to: http://abstratt.com/update/ &#8211; if you are using Eclipse Galileo, or http://abstratt.com/update/3.4/ &#8211; if you are using Eclipse Ganymede. Please see the [...]]]></description>
			<content:encoded><![CDATA[<p>The TextUML Toolkit 1.3 is now available, 4.5 months after 1.2. If you already got <a href="http://abstratt.com/blog/2009/06/15/textuml-toolkit-13rc1-is-now-available/">RC1</a> (1.3.0.20090614&#8230;), it is the same build, no need to upgrade again. Otherwise, just point the Eclipse update mechanism to:</p>
<p>http://abstratt.com/update/ &#8211; if you are using Eclipse Galileo, or</p>
<p>http://abstratt.com/update/3.4/ &#8211; if you are using Eclipse Ganymede.</p>
<p>Please see the <a href="http://abstratt.com/docs/index.php?title=TextUML_Toolkit_Features">feature page</a> for a summary of the evolution of the TextUML Toolkit in terms of features across releases. Some highlights for this release are better integration with other UML tools and support for both Eclipse 3.4 and 3.5.</p>
<p>As usual, <a href="http://abstratt.com/issues/">bug reports and feature requests</a> are much appreciated. And if you need help, make sure to ask on the <a href="http://abstratt.com/forums/">user forum</a>.</p>
<p>The TextUML Toolkit Team</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/06/23/textuml-toolkit-13-is-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.3RC1 is now available</title>
		<link>http://abstratt.com/blog/2009/06/15/textuml-toolkit-13rc1-is-now-available/</link>
		<comments>http://abstratt.com/blog/2009/06/15/textuml-toolkit-13rc1-is-now-available/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 08:33:10 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=156</guid>
		<description><![CDATA[The first release candidate towards version 1.3 of the TextUML Toolkit is now available. The feature overview page has been updated to reflect the changes in the 1.3 cycle. Please give it a try and report any issues you might find. If no serious problems are found with this build, it will be promoted to [...]]]></description>
			<content:encoded><![CDATA[<p>The first release candidate towards version 1.3 of the TextUML Toolkit is now available. The <a href="http://sourceforge.net/apps/mediawiki/textuml/index.php?title=TextUML_Toolkit_Features#Since_1.3">feature overview page</a> has been updated to reflect the changes in the 1.3 cycle.</p>
<p>Please give it a try and <a href="http://abstratt.com/issues/">report</a> any issues you might find. If no serious problems are found with this build, it will be promoted to 1.3 final later this week.</p>
<p>Note that the main update site supports <a href="http://abstratt.com/update/">Eclipse 3.5</a>, but there is also an update site <a href="http://abstratt.com/update/3.4/">for Eclipse 3.4</a>.  The features are the same, the only differences between the two sites are the dependencies (UML2 3.0 and EMF 2.5 on Eclipse 3.5, UML2 2.2 and EMF 2.4 on Eclipse 3.4).</p>
<p>The TextUML Toolkit team welcomes your feedback.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/06/15/textuml-toolkit-13rc1-is-now-available/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A month&#8217;s worth of news</title>
		<link>http://abstratt.com/blog/2009/06/11/a-months-worth-of-news/</link>
		<comments>http://abstratt.com/blog/2009/06/11/a-months-worth-of-news/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 07:44:29 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=155</guid>
		<description><![CDATA[Wow, it is been more than a month since my last post, but I have been busier than ever working on an upcoming MDD-related product (cannot say much now other than that you will hear more about it here first). However, In TextUML Toolkit-land things are looking pretty exciting. More hands on deck Vladimir Sosnin [...]]]></description>
			<content:encoded><![CDATA[<p>Wow, it is been more than a month since my last post, but I have been busier than ever working on an upcoming MDD-related product (cannot say much now other than that you will hear more about it here first). However, In <a href="http://abstratt.com/textuml/">TextUML Toolkit</a>-land things are looking pretty exciting.</p>
<p><strong>More hands on deck</strong></p>
<p><a href="https://sourceforge.net/users/antiso/">Vladimir Sosnin</a> has joined the project and has been on a roll contributing many patches, not only bug fixes but design improvements and features too. It is amazing how quickly he has become very comfortable with the TextUML Toolkit code base (Vladimir is certainly a solid developer, but I&#8217;d like to think the quality of the code base helped him too). And if that was not good enough, Vladimir is also using the TextUML Toolkit in his daily work around model-driven development, so that should help ensuring the Toolkit has the features its target audience actually needs.</p>
<p><strong>New release in the making</strong></p>
<p>1.3RC1 should be made available during the weekend. It has some shiny new language features, a bunch of bug fixes, better integration with other UML2 tools and support for both Galileo and Ganymede. By the way, shipping code that can handle different incompatible versions of Eclipse has become a little more challenging with P2, as you cannot ship a feature that has bundles that resolve in a mutually exclusive way &#8211; it seems you really need two different features for that.</p>
<p><strong>Documentation moved to SourceForge</strong></p>
<p>SourceForge now has support for MediaWiki, which is used to author and serve the documentation for the TextUML Toolkit. In the spirit of strengthening the message that the project should really be considered a community-based effort, I decided to migrate the documentation from the Abstratt web site over to <a href="http://apps.sourceforge.net/mediawiki/textuml/">SourceForge</a>.</p>
<p>I guess that does it, at least for now.  Stay tuned.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/06/11/a-months-worth-of-news/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On code being model &#8211; maybe not what you think</title>
		<link>http://abstratt.com/blog/2009/05/03/on-code-being-model/</link>
		<comments>http://abstratt.com/blog/2009/05/03/on-code-being-model/#comments</comments>
		<pubDate>Mon, 04 May 2009 02:04:18 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=153</guid>
		<description><![CDATA[I have heard the mantra &#8216;code is model&#8217; several times. Even though I always thought I got the idea of what it meant, only now I decided to do some research to find out where it came from. Turns out that it originated from a blog post that MS&#8217; Harry Pierson wrote back in 2005. [...]]]></description>
			<content:encoded><![CDATA[<p>I have heard the mantra &#8216;code is model&#8217; several times. Even though I always thought I got the idea of what it meant, only now I decided to do some research to find out where it came from. Turns out that it originated from <a href="http://devhawk.net/2005/10/05/Code+Is+Model.aspx">a blog post</a> that MS&#8217; Harry Pierson wrote back in 2005. It is a very good read, insightful, and to the point.</p>
<p>The idea that gave title to Harry&#8217;s post is that whenever we use a simpler representation to build something that is more complex and detailed than we want to care about, we are creating models. 3GL source code is a model for object code. Byte code is a model for actual CPU-specific executable code. Hence code is model.</p>
<p>He then goes to ask that if we have been successfully reaping the benefits of increased levels of abstraction by using 3GLs for decades now, what prevents us from taking the next step and using even higher level (modeling) languages? He makes several good points that are at the very foundations of true model-driven development:</p>
<ul>
<li>&#8220;<strong><em>models must be precise</em></strong>&#8220;- models must be amenable to automatic transformation. Models that cannot be transformed into running code are &#8220;<em>useless as development artifacts</em>&#8220;. If you like them for conceiving or communicating ideas, that is fine, but those belong to a totally different category, one that plays a very marginal role in software development, and have nothing to do with model-driven development. Models created using the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> are forcefully precise, and can include behavior in addition to structure.</li>
<li>&#8220;<strong><em>models must be intrinsic to the development process</em></strong>&#8221; &#8211; models need to be &#8220;<em>first class citizens of the development process</em>&#8221; or they will become irrelevant. That means: everything that makes sense to be modeled is modeled, and running code is generated from models without further manual elaboration, i.e., no manually changing generated code and taking it from there. As a rule, you should refrain from reading generated code or limit yourself to reading the API of the code, unless you are investigating a code generation bug. There is nothing really interesting to see there &#8211; that is the very reason why you wanted to generate it in the first place. <strong>Build, read, and evolve your models! </strong>Generated code<strong> </strong>is object code.</li>
<li>&#8220;<strong><em>models aren&#8217;t always graphical</em></strong>&#8221; &#8211; of course not. I have written <a href="http://abstratt.com/blog/2008/05/05/on-code-and-diagrams/">about that</a> before here. The <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> is only one of many initiatives that promote textual notations for modeling (and I mean <em>modeling</em>, not <em>diagramming</em> &#8211; see next point).</li>
<li>&#8220;<strong><em>explicitly call out models vs. views</em></strong>&#8221; &#8211; in other words, always keep in mind that <a href="http://abstratt.com/blog/2008/09/10/diagrams-models/">diagrams != models</a>. Models are the real thing, diagrams are just views into them. Models can admit an infinite number of notations, be them graphical, textual, tabular etc. Models don&#8217;t need notations. We (and tools) do. Unfortunately, most people don&#8217;t really get this.</li>
</ul>
<p>The funny thing is that, most of the times I read someone citing Harry&#8217;s mantra, it is misused.</p>
<p>One misinterpretation of the &#8220;code is model&#8221; mantra is that we don&#8217;t need higher-level modeling languages, as current 3GLs are enough to &#8220;model&#8221; an application. The fact is: 3GLs do not provide an appropriate level of abstraction for most kinds of applications. For example, for enterprise applications, 4GLs are usually more appropriate than 3GLs. Java (EE) or C# are horrible choices, vide the profusion of frameworks to make them workable as languages for enterprise software &#8211; they are much better appropriated for writing system software.</p>
<p>Another unfortunate conclusion people often extrapolate from the mantra is that if code is model, model is code, and thus it should always be possible to translate between them in both directions (<a href="http://en.wikipedia.org/wiki/Round-trip_engineering">round-trip engineering</a>). Round-trip engineering goes against the very essence of model-driven development, as source code often loses important information that can only exist in higher level models. The only reason people need RTE is because they use models to start a design and generate code, but then they switch to evolving and maintaining the application by directly manipulating the generated code. That is a big no-no in true model-driven development &#8211; it implies models are not precise or complete enough for full code generation.</p>
<p>So, what is your view? How do <em>you</em> interpret the &#8220;code is model&#8221; mantra?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/05/03/on-code-being-model/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>New in 1.3 M1: better integration with diagramming tools</title>
		<link>http://abstratt.com/blog/2009/04/13/new-in-13-m1-better-integration-with-diagramming-tools/</link>
		<comments>http://abstratt.com/blog/2009/04/13/new-in-13-m1-better-integration-with-diagramming-tools/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 08:00:12 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=150</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Even though it has <a href="http://abstratt.com/blog/2008/12/23/integrating-textuml-toolkit-with-other-modeling-tools/">always been possible</a> to open models generated by the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> 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.</p>
<p>Starting with 1.3 M1 (test build available from the milestones <a href="http://abstratt.com/update/milestones/">update site</a>), 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.</p>
<p>Here you can see the TextUML Toolkit being used side-by-side with the <a href="http://wiki.eclipse.org/MDT-UML2Tools">UML2 Tools</a> graphical editor:</p>
<p style="text-align: center;"><a href="http://abstratt.com/blog/wp-content/uploads/2009/04/textuml-uml2tools.png"><img class="aligncenter size-full wp-image-152" title="textuml-uml2tools" src="http://abstratt.com/blog/wp-content/uploads/2009/04/textuml-uml2tools-small.png" alt="" /></a></p>
<p>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 <a href="http://wiki.eclipse.org/MDT/Papyrus">Papyrus</a> 1.11 and unfortunately it does not seem to handle external updates properly. I haven&#8217;t tried with other UML2-based diagram editors, so at this point I am not sure which one represents the trend here.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/04/13/new-in-13-m1-better-integration-with-diagramming-tools/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Developing for Eclipse without OSGi</title>
		<link>http://abstratt.com/blog/2009/04/05/eclipse-without-osgi-textuml-compiler-as-a-stand-alone-java-application/</link>
		<comments>http://abstratt.com/blog/2009/04/05/eclipse-without-osgi-textuml-compiler-as-a-stand-alone-java-application/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 06:21:42 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=149</guid>
		<description><![CDATA[I have been doing some exploratory work around running the TextUML Toolkit&#8216;s compiler as a standalone Java application. In other words, without OSGi. You Eclipse/OSGi heads out there might ask: why would anyone want to do that? The answer is: enhanced applicability. Severing ties with the Eclipse runtime/OSGi means the compiler would become usable in [...]]]></description>
			<content:encoded><![CDATA[<p>I have been doing some exploratory work around running the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a>&#8216;s compiler as a standalone Java application. In other words, without OSGi. You Eclipse/OSGi heads out there might ask: why would anyone want to do that? The answer is: enhanced applicability. Severing ties with the Eclipse runtime/OSGi means the compiler would become usable in other contexts, and by more people. Think Ant or Maven-driven builds, or  (the horror!) other IDEs.</p>
<p><strong>The TextUML compiler&#8217;s dependencies<br />
</strong></p>
<p>The TextUML compiler is not very different from any ordinary 3GL compiler. It reads a bunch of source files and spits another bunch of object files. For reading and writing files, the TextUML compiler uses <a href="http://wiki.eclipse.org/index.php/EFS">EFS</a>, the Eclipse File System. For generating the object files, which are UML models, the compiler uses <a href="http://www.eclipse.org/modeling/mdt/?project=uml2">UML2</a> and <a href="http://www.eclipse.org/modeling/emf/">EMF</a>.</p>
<p>Luckily, all these components are expected to work on a standalone application, although some restrictions in functionality might apply. At a first glance, one would expect that running the TextUML compiler without OSGi should be quite feasible. But, as I should have learned by now, it is never that simple&#8230;</p>
<p><strong>Extension registry without OSGi</strong></p>
<p>The TextUML compiler, and some of its dependencies use the extension registry to receive contributions to their extension points or make contributions to other components&#8217; extension points. Since Eclipse 3.2, the extension registry API provides support for creating registries without OSGi. Basically, you can add any extension and extension points you want, all you need to do is to provide the XML markup for them.</p>
<p><em>Problem</em>: in a standalone Java application, it is the application&#8217;s responsibility to somehow find the plugin manifests and populate the extension registry.</p>
<p><em>Solution</em>: I started with the example Paul Webster <a href="http://dev.eclipse.org/newslists/news.eclipse.platform/msg67801.html">posted</a> on the platform newsgroup almost two years ago. It basically starts from a file system location which it assumes to hold plugins, both on JAR&#8217;d and directory form. It will find plugin manifests (plugin.xml), recognize translation resources (plugin.properties), and even discover the bundle name by parsing the bundle manifest (MANIFEST.MF), and use that to populate the extension registry. Pretty cool, thanks PW. I just cleaned-up the code a bit and enhanced it to also <strong>find plugin manifests using the application&#8217;s classloader</strong>. I also had to add support for setting the <strong>default extension registry</strong>, which is the one other components will get when invoking Platform.getExtensionRegistry() or RegistryFactory.getRegistry(). Finally, I had to implement basic support for <strong>creating executable extensions</strong>, which was not too hard given that I could assume the entire application is using the same (application) classloader.</p>
<p><strong>EFS without OSGi</strong></p>
<p>Also since 3.2, the Eclipse File System does not require OSGi to operate, however it does require a functional registry as it uses an extension point to allow file system implementations to be plugged in. So, provided one manages to populate the default extension registry, EFS works fine on a standard Java app. No action required here (yay!).</p>
<p><strong>EMF and UML2 without OSGi</strong></p>
<p>EMF has long been advertised as being mostly functional when running in non-managed mode. However, when running in an standalone app, EMF does not process extensions to its extension points (such as resource factories, metamodel packages and URI mappings), so a standard Java application needs to <a href="http://wiki.eclipse.org/index.php/EMF-FAQ#How_do_I_use_EMF_in_standalone_applications_.28such_as_an_ordinary_main.29.3F">explicitly initialize EMF</a>, which is clearly suboptimal.  That is because EMF only processes contributions to its extension points right during bundle activation. There is no alternative way to trigger processing of the registry (<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=271253">see bug #271253</a>), which sucks, given that the registry is there just waiting to be used. With no OSGi, there is no such thing as bundle activation, and thus EMF goes into autistic mode. This is also true for UML2 (not surprisingly, as they share many implementation traits), the main difference being that UML2&#8242;s extension points are much less used than EMF&#8217;s.</p>
<p><em>Problem</em>: Ecore won&#8217;t process the extension registry when running in a standalone Java application.</p>
<p><em>Solution</em>: Change Ecore so it allows clients to explicitly trigger processing of the contributions to Ecore&#8217;s extension points. My local hacky solution was to make Ecore&#8217;s extension registry parsers to be publicly visible so any client could invoke them.</p>
<p><strong>&#8216;platform:&#8217; URLs without Equinox</strong></p>
<p>Extensions to Ecore&#8217;s URI mapping extension often translate to &#8216;platform:&#8217; URLs, which are another common Eclipse-ism, and thus not supported in plain Java applications.</p>
<p><em>Problem:</em> No support for &#8216;platform:&#8217; URL schemes  in standalone mode.</p>
<p><em>Solution:</em> I implemented a simple <a href="http://java.sun.com/developer/onlineTraining/protocolhandlers/">URL stream handler</a> for the &#8216;platform&#8217; protocol. The current implementation complete ignores the path component that determines what bundle the resource is in. That is clearly something that needs to be improved, but should not be too hard.</p>
<p><strong>Conclusion</strong></p>
<p>Well, it wasn&#8217;t really a walk in the park, but other than the issue that requires a change in EMF (<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=271253">bug #271253</a>, which I am hoping could be addressed for <span style="text-decoration: line-through;">Ganymede</span> Galileo),  I am pretty happy with the results of this exploration.</p>
<p>I made all the code I wrote (including my version of Paul Webster&#8217;s registry loader) available on the TextUML Toolkit&#8217;s <a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.standalone/">SVN repository</a> on SourceForge. Feel free to use it and submit improvements. I wonder if this sort of stuff could find a home in Eclipse.org, as I think many people currently developing for non-OSGi targets would like to take advantage of some great OSGi-agnostic Eclipse APIs.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/04/05/eclipse-without-osgi-textuml-compiler-as-a-stand-alone-java-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(not) Installing the TextUML Toolkit 1.2 on Eclipse 3.5 M6</title>
		<link>http://abstratt.com/blog/2009/03/27/not-installing-the-textuml-toolkit-12-on-eclipse-35-m6/</link>
		<comments>http://abstratt.com/blog/2009/03/27/not-installing-the-textuml-toolkit-12-on-eclipse-35-m6/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 07:37:08 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=147</guid>
		<description><![CDATA[I decided it was time to start using Eclipse 3.5 before it went RC or else if I find any blockers there won&#8217;t be time left for them to get fixed before the next release this Summer. I have been on the other side of the fence and know how frustrating it is when people [...]]]></description>
			<content:encoded><![CDATA[<p>I decided it was time to start using Eclipse 3.5 before it went RC or else if I find any blockers there won&#8217;t be time left for them to get fixed before the next release this Summer. I have been on the other side of the fence and know how frustrating it is when people only really start reporting bugs at the very end of the release cycle.</p>
<p>After I installed the 3.5 M6 SDK, I decided to install the <a href="http://abstratt.com/blog/2009/02/04/textuml-toolkit-12-is-out/">TextUML Toolkit 1.2</a>&#8230;</p>
<p><strong>Nothing to install?</strong></p>
<p>First surprise: <strong>no features</strong> would show on the update site! WTH? Well, turns out I had the Update UI to show available features grouped by category, but the TextUML Toolkit <a href="http://abstratt.com/update/">update site</a> does not use categories. Unchecking the option to group by categories shows the four features in the TextUML Toolkit update site as it was usual in 3.4. Phew&#8230; I was just about to enter a bug report against the Eclipse update component (a.k.a. p2), when I found out that that unintuitive UI behavior has been <a href="https://bugs.eclipse.org/258105">recently addressed</a> and the next milestone won&#8217;t show this problem any longer.</p>
<p><strong>A roadblock</strong></p>
<p>I managed to install the TextUML Toolkit, and that brought along EMF and UML2, which are required features. Since, at this time, the TextUML Toolkit does not specify version range for its dependencies, the latest versions of EMF and UML2 were automatically installed by Eclipse. That should be fine, I thought, as one of the Eclipse development key mandates has always been backward compatibility. But this time around that was not the case: the TextUML builder was failing to compile a TextUML source file that was making use of template parameters. Turns out the UML2 API around templates has changed in its version 3.0. Before (in UML2 2.2), a template parameter substitution could have multiple formal and actual parameters. Now it can have only one of each, and thus the TextUML Toolkit is (partially) broken in 3.5.</p>
<p>So much for core values, you might be thinking? Well, to be fair, this is a bit of a fringe case. The UML2 API is an Eclipse component, and as such should strive for backward compatibility too. However, it is also a high-fidelity rendition of the UML specification published by the OMG. In this case, the OMG fixed a bug (<a href="http://www.omg.org/issues/issue9398.txt">#9838</a>) in the spec, and as often is the case with UML, that resulted in a change that was not backward compatible. If the OMG promotes changes that are not backward compatible, the UML2 team does not have much of a choice: in order to continue to closely implement the spec, it has to break the Eclipse guidelines.</p>
<p>And neither do I. For the TextUML Toolkit 1.2, I will have to issue a maintenance release (1.2.1) that will explicitly depend on UML2 2.2, thus avoiding the new version, and probably becoming incompatible with other UML modeling packages that only run on Galileo and UML2 3.0. For the next release of the TextUML Toolkit (1.3), I will have to adopt the new API and explicitly depend on UML 2 3.0.</p>
<p>That is how life goes&#8230; for some reason, I kind of feel like a <a href="http://www.google.ca/search?q=flea+elephant+bridge">flea crawling on the back of an elephant</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/03/27/not-installing-the-textuml-toolkit-12-on-eclipse-35-m6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL queries in UML</title>
		<link>http://abstratt.com/blog/2009/03/18/sql-queries-in-uml/</link>
		<comments>http://abstratt.com/blog/2009/03/18/sql-queries-in-uml/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 19:09:23 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=146</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>But how do you do queries in UML? The obvious answer seems to be OCL, but that is <em>not</em> the approach I am taking as OCL and UML have serious interoperability/duplication issues. Instead, I took the  middleweight extension approach.</p>
<p>First, we model a protocol for manipulating collections of objects (showing only a subset here):</p>
<pre>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;</pre>
<p>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&#8217;s <code>allInstances</code>), anything where the resulting value has multiplicity greater than one.</p>
<p>Note most of the operations in the <code>Collection</code> protocol take <a href="http://abstratt.com/blog/2009/01/18/closures-in-uml-extending-metamodel-with-textuml-toolkit/">blocks/closures</a> as arguments. Closures are used in this context to define the filtering criterion for a select, or the mapping function for a collect.</p>
<p>For instance, for obtaining all accounts that currently do not have sufficient funds, this method would do it:</p>
<pre>static operation findNSFAccounts() : Account[*];
begin
    return Account extent.select(
        (a : Account) : Boolean {return a.balance &lt; 0}
    );
end;</pre>
<p>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 <code>select</code> operation.</p>
<p>When mapping that behavior to SQL, we could end up with a query like this:</p>
<pre>select _account_.* from Account _account_ where _account_.balance &lt; 0</pre>
<p>Another example: we want to obtain  all customers with a balance above a given amount, let&#8217;s say, to send them a letter to thank them for their business. The following method specifies that logic:</p>
<pre>static operation findBestCustomers(minBalance : Real) : Customer[*];
begin
    return (Account extent.select(
          (a : Account) : Boolean { return a.balance &gt;= minBalance }
    ).collect(
          (a : Account) : Customer { return a-&gt;AccountOwner-&gt;owner }
    ) as Customer);
end;</pre>
<p>Note that we start off with the extent of Account class, filter it down to the accounts with good balance using <code>select</code>, and then map from that collection to a collection with the respective account owners by traversing an association using <code>collect</code>.</p>
<p>If that was going to be mapped to SQL, one possible mapping would be:</p>
<pre>select _customer_.* from Account _account_
    inner join Customer _customer_
        on  _account_._accountID_ = _customer_._customerID_
    where _account_.balance &gt;= ?</pre>
<p>Much of this can be already modeled if you try it out with the <a href="http://abstratt.com/textuml/">TextUML Toolkit 1.2</a>. But, you might ask, once you model that, what can you do with UML models containing queries like the ones shown here?</p>
<p>Since the models are complete (include structure and behavior), you can:</p>
<ol>
<li><strong>Execute them</strong>. Imagine writing automated tests against your models, or letting your customer play with them before you actually start working on the implementation.</li>
<li><strong>Generate complete code</strong>. The generated code will include even your custom queries, not only those basic ones (<code>findAll</code>, <code>findByPK</code>) code generators can usually produce for you.</li>
</ol>
<p>If you would like to see tools that support that vision, keep watching this blog.</p>
<p><strong>So, what is your opinion? </strong><br />
Do you see value in being able to specify queries in your models? Is this the right direction? What would you do differently?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/03/18/sql-queries-in-uml/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.2 is out!</title>
		<link>http://abstratt.com/blog/2009/02/04/textuml-toolkit-12-is-out/</link>
		<comments>http://abstratt.com/blog/2009/02/04/textuml-toolkit-12-is-out/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 02:17:01 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=145</guid>
		<description><![CDATA[The TextUML Toolkit 1.2 is now available, 5 months after 1.1, when it first became an open source project. If you already got RC2 (1.2.0.200902011417), it is the same build, no need to upgrade again. Otherwise, just point the Eclipse update mechanism to: http://abstratt.com/update/ Please see the feature page for a summary of the evolution [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> 1.2 is now available, 5 months after <a href="http://abstratt.com/blog/2008/09/02/textuml-toolkit-11-is-out/">1.1</a>, when it first became an open source project. If you already got <a href="http://abstratt.com/blog/2009/02/01/textuml-toolkit-12-rc2-fixes-stereotype-extension-rendering-bug/">RC2</a> (1.2.0.200902011417), it is the same build, no need to upgrade again. Otherwise, just point the Eclipse update mechanism to:</p>
<p style="padding-left: 30px;">http://abstratt.com/update/</p>
<p>Please see the <a href="http://abstratt.com/docs/index.php?title=TextUML_Toolkit_Features">feature page</a> for a summary of the evolution of the TextUML Toolkit in terms of features across releases.</p>
<p>As usual, <a href="http://abstratt.com/issues/">bug reports and feature requests</a> are dearly appreciated. And if you need help, make sure to ask on the <a href="http://abstratt.com/forums/">forum</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/02/04/textuml-toolkit-12-is-out/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit + Acceleo: generate code from UML models</title>
		<link>http://abstratt.com/blog/2009/02/04/textuml-toolkit-acceleo-generate-code-from-uml-models/</link>
		<comments>http://abstratt.com/blog/2009/02/04/textuml-toolkit-acceleo-generate-code-from-uml-models/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 10:06:05 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=144</guid>
		<description><![CDATA[2011-03-10 &#8211; UPDATE: Interested in UML/TextUML and full code generation? You can now do that online using AlphaSimple Acceleo is a cool open-source code generation tool that has great integration with the Eclipse IDE and EMF-based metamodels. The tool has a strong emphasis on simplicity and ease of use, which, for an open source development [...]]]></description>
			<content:encoded><![CDATA[<p><em><strong>2011-03-10 &#8211; UPDATE: Interested in UML/TextUML and full code generation? You can now do that online <a href="http://abstratt.com/blog/2011/02/23/generating-code-from-uml-models-using-alphasimple-and-stringtemplate/">using AlphaSimple</a></strong></em></p>
<p><a href="http://acceleo.org">Acceleo</a> is a cool open-source code generation tool that has great integration with the Eclipse IDE and EMF-based metamodels. The tool has a strong emphasis on simplicity and ease of use, which, for an open source development tool, is really a breeze of fresh air.</p>
<p>The Acceleo website includes a repository of <a href="http://acceleo.org/pages/modules-repository/en">code generation modules</a>, which are extensions to the tool that target generation for specific platform/languages, such as .Net (C#/NHibernate), Java (Hibernate/Struts/Spring), Python, PHP, C, Zope etc. Of course, you can also develop your own modules, using Acceleo template editors with metamodel-driven content assist, and live sample generation.</p>
<p>Most of the modules in the Acceleo repository take UML2 compatible models. That means you can use the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> for quickly creating your UML models using the TextUML textual notation, and then use Acceleo to generate code from them.</p>
<p>One of the most mature code generation modules in the Acceleo repository is the <a href="http://acceleo.org/pages/uml2-to-jee-java-struts-hibernate-generator/en">UML2 to Java EE module</a>, which can generate code for Spring, Struts and Hibernate-based Java applications from UML2 models. A step-by-step guide would be too much for this post, but if you want to explore generating Java EE code from UML models you create using the TextUML Toolkit, here are some pointers:</p>
<p><strong>Get the tools.</strong> First of all, using Eclipse 3.4, install all features from the following update sites:</p>
<ul>
<li>TextUML Toolkit &#8211; http://abstratt.com/update/</li>
<li>Acceleo code generator &#8211; http://acceleo.org/update/</li>
<li>Acceleo code generation modules &#8211; http://acceleo.org/modules/update</li>
</ul>
<p>Once the install is complete, allow Eclipse to restart for the new plug-ins to become available.</p>
<p><strong>Create your UML models and profiles. </strong>Create a project for your UML models using the TextUML Toolkit. For an example of how to do that, see the <a href="http://abstratt.com/docs/index.php?title=TextUML_Tutorial">TextUML Tutorial</a>. You will need to define in your model project a profile where you declare the stereotypes that you will use to annotate your modeled classes, to drive code generation (see how <a href="http://abstratt.com/docs/index.php?title=TextUML_Guide#Profiles">here</a>)</p>
<p><strong>Create your Acceleo generator project. </strong>The Acceleo website has plenty of documentation on how to create Acceleo code generation projects. Some pointers:</p>
<ul>
<li>main documentation <a href="http://acceleo.org/pages/introduction/en">page</a> (instalation and tutorials)<a href="http://acceleo.org/pages/introduction/en"><br />
</a></li>
<li>UML to JEE module <a href="http://www.acceleo.org/wiki/index.php/UML2_to_JEE_:_Struts/Spring/Hibernate">documentation<br />
</a></li>
</ul>
<p>Note that this module has a <a href="http://forge.objectweb.org/tracker/index.php?func=detail&amp;aid=311144&amp;group_id=273&amp;atid=350409">bug</a> in which it is based on a profile with an invalid UML name which won&#8217;t work with the TextUML Toolkit out of the box. Instead of using the profile shipped with that module, you can then override the default profile and stereotypes using a properties file at the root of your generator project as shown <a href="http://www.acceleo.org/wiki/index.php/UML_to_JEE_:_Configuration">here</a> so to direct it to your own profile and stereotypes. You can also find a more structured guide for using Acceleo and the TextUML Toolkit together <a href="http://abstratt.com/docs/index.php?title=Pet_Store_Example">here</a>. Even though that tutorial uses a customized version of the JEE module, it can still be helpful.</p>
<p><strong>As usual.</strong> If you need help generating code from UML models using the TextUML Toolkit and Acceleo, feel free to ask for help here, or in the <a href="http://abstratt.com/forums/">user forum</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/02/04/textuml-toolkit-acceleo-generate-code-from-uml-models/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.2 RC2 fixes stereotype extension rendering bug</title>
		<link>http://abstratt.com/blog/2009/02/01/textuml-toolkit-12-rc2-fixes-stereotype-extension-rendering-bug/</link>
		<comments>http://abstratt.com/blog/2009/02/01/textuml-toolkit-12-rc2-fixes-stereotype-extension-rendering-bug/#comments</comments>
		<pubDate>Sun, 01 Feb 2009 23:01:14 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=143</guid>
		<description><![CDATA[A new RC build of the TextUML Toolkit is now available. It has one bug fix since RC1. Basically, when rendering stereotypes, the metaclasses extended by the stereotype were not being shown. Not really critical, but isolated and safe enough to be fixed now. Pending any last minute bug reports by the community, it is [...]]]></description>
			<content:encoded><![CDATA[<p>A new RC build of the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> is now available. It has one <a href="https://sourceforge.net/support/tracker.php?aid=2555970">bug fix</a> since <a href="http://abstratt.com/blog/2009/01/28/textuml-toolkit-12-rc1-fixes-java-5-compatibility-issue/">RC1</a>. Basically, when rendering stereotypes, the metaclasses extended by the stereotype were not being shown. Not really critical, but isolated and safe enough to be fixed now. Pending any last minute bug reports by the community, it is likely this build will be promoted to 1.2 release early this week.</p>
<p>Also, while testing, I noticed that the <a href="http://abstratt.com/docs/index.php?title=Pet_Store_Example">Pet Store example</a> was triggering a <a href="https://sourceforge.net/tracker2/index.php?func=detail&amp;aid=2093333&amp;group_id=236545&amp;atid=1099987">known Graphviz issue</a> with associations navigable both ends, so I updated the petstore_models project so the relationship between Title and Payment was navigable only in one direction (Title -&gt; Payment). I recaptured the class diagram images showing on that page using the Image Viewer &#8220;Save to File&#8221; function instead of screenshot sections.</p>
<p>Just trigger a software update for the TextUML Toolkit to get RC2.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/02/01/textuml-toolkit-12-rc2-fixes-stereotype-extension-rendering-bug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.2 RC1 fixes Java 5 compatibility issue</title>
		<link>http://abstratt.com/blog/2009/01/28/textuml-toolkit-12-rc1-fixes-java-5-compatibility-issue/</link>
		<comments>http://abstratt.com/blog/2009/01/28/textuml-toolkit-12-rc1-fixes-java-5-compatibility-issue/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 06:59:26 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=142</guid>
		<description><![CDATA[Yikes, it happened again. A user reported that the TextUML Toolkit 1.2 RC0 build announced earlier this week wouldn&#8217;t run on Java 5 VMs (Mac users would be the most affected). This has just been fixed (one bundle was being compiled against Java 6) and a new release candidate is now available from the update [...]]]></description>
			<content:encoded><![CDATA[<p>Yikes, <a href="http://abstratt.com/blog/2007/09/08/63/">it happened again</a>. A user <a href="https://sourceforge.net/forum/forum.php?thread_id=2937365&amp;forum_id=855420">reported</a> that the TextUML Toolkit 1.2 RC0 build announced <a href="http://abstratt.com/blog/2009/01/25/textuml-toolkit-12-rc0-m3-is-now-available/">earlier this week</a> wouldn&#8217;t run on Java 5 VMs (Mac users would be the most affected). This has just <a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.mdd.frontend.textuml.core.behavior/META-INF/MANIFEST.MF?view=patch&amp;r1=223&amp;r2=222&amp;pathrev=223">been fixed</a> (one bundle was being compiled against Java 6) and a new release candidate is now available from the <a href="http://abstratt.com/update/">update site</a>. If you too were seeing &#8220;java.lang.UnsupportedClassVersionErrors&#8221; running RC0, just go ahead and update to RC1.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/01/28/textuml-toolkit-12-rc1-fixes-java-5-compatibility-issue/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.2 RC0 / M3 is now available</title>
		<link>http://abstratt.com/blog/2009/01/25/textuml-toolkit-12-rc0-m3-is-now-available/</link>
		<comments>http://abstratt.com/blog/2009/01/25/textuml-toolkit-12-rc0-m3-is-now-available/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 03:27:55 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=141</guid>
		<description><![CDATA[The third milestone build and first release candidate of the TextUML Toolkit, the IDE for textual UML  modeling, is now available from the update site. The feature page shows all the new features in this new release, but here they are: primitive types data types (a.k.a. structs) required extensions for prototypes behaviour modeling (a.k.a. action [...]]]></description>
			<content:encoded><![CDATA[<p>The third milestone build and first release candidate of the TextUML Toolkit, the IDE for textual UML  modeling, is now available from the <a href="http://abstratt.com/update/">update site</a>.</p>
<p>The <a href="http://abstratt.com/docs/index.php?title=TextUML_Toolkit_Features#Since_1.2">feature page</a> shows all the new features in this new release, but here they are:</p>
<ul>
<li> <a class="external text" title="http://abstratt.com/blog/2008/12/02/feature-primitive-types" rel="nofollow" href="../2008/12/02/feature-primitive-types">primitive types</a></li>
<li> <a class="external text" title="http://abstratt.com/blog/2008/11/28/feature-data-types/" rel="nofollow" href="../2008/11/28/feature-data-types/">data types (a.k.a. structs)</a></li>
<li> <a class="external text" title="http://abstratt.com/blog/2008/11/11/feature-required-extensions-for-stereotypes/" rel="nofollow" href="../2008/11/11/feature-required-extensions-for-stereotypes/">required extensions for prototypes</a></li>
<li> <a class="external text" title="http://abstratt.com/blog/2008/11/07/executable-models-with-textuml-toolkit-12-m1/" rel="nofollow" href="../2008/11/07/executable-models-with-textuml-toolkit-12-m1/">behaviour modeling (a.k.a. action semantics)</a></li>
<li> <a class="external text" title="http://abstratt.com/blog/2008/09/16/feature-shorthand-notation-for-aggregation-and-composition/" rel="nofollow" href="../2008/09/16/feature-shorthand-notation-for-aggregation-and-composition/">shorthand notation for aggregation and composition</a></li>
<li>abstract stereotypes</li>
<li>cross-project references</li>
</ul>
<p>As you can tell, most of the work in the 1.2 release cycle was towards extending the TextUML notation with support for UML.</p>
<p>There were also several bug fixes, <a href="https://sourceforge.net/tracker2/?func=detail&amp;aid=2127735&amp;group_id=236545&amp;atid=1099987">one of them</a> being the first to be addressed by an external contributor (thanks, Massimiliano!).</p>
<p>If no serious issues are found with this milestone build, it will be promoted to 1.2 final by the next weekend. So, if you are using a 1.1.* build, make sure you upgrade it to a 1.2 release candidate build and start smoke testing with your usual workflows, and report any bugs you find.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/01/25/textuml-toolkit-12-rc0-m3-is-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Closures in UML? Extending the metamodel with the TextUML Toolkit</title>
		<link>http://abstratt.com/blog/2009/01/18/closures-in-uml-extending-metamodel-with-textuml-toolkit/</link>
		<comments>http://abstratt.com/blog/2009/01/18/closures-in-uml-extending-metamodel-with-textuml-toolkit/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 07:02:24 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Graphviz]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=136</guid>
		<description><![CDATA[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&#8217;s needs. In the article &#8220;Customizing UML: Which Technique is Right for You?&#8221;, James Bruck and [...]]]></description>
			<content:encoded><![CDATA[<p>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&#8217;s needs.</p>
<p>In the article <a href="http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Customizing_UML2_Which_Technique_is_Right_For_You/article.html" target="_blank"><em>&#8220;Customizing UML: Which Technique is Right for You?&#8221;</em></a>, James Bruck and <a href="http://kenn-hussey.blogspot.com/" target="_blank">Kenn Hussey</a> (both from the <a href="http://eclipse.org/uml2">UML2 team</a>) do a great job at covering the several options for extending (or restricting) UML (James also made a <a href="http://www.eclipsecon.org/2008/?page=sub/&amp;id=172" target="_blank">related presentation</a> at last year&#8217;s EclipseCon, together with <a href="http://give-a-damus.blogspot.com/" target="_blank">Christian Damus</a>, of <a href="http://wiki.eclipse.org/index.php/MDT-OCL">Eclipse OCL</a> fame). Cutting to the chase, these are the options they identify:</p>
<ul>
<li> using keywords (featherweight extensions)</li>
<li>using profiles, stereotypes and properties/tagged values (lightweight extensions)</li>
<li>extending the metamodel by specializing the existing metaclasses (middleweight extensions)</li>
<li>using package merges to select the parts of UML you need (heavyweight extensions)</li>
</ul>
<p>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: <a href="http://abstratt.com/docs/index.php?title=TextUML_Guide#Profiles">profiles</a> and <a href="http://abstratt.com/docs/index.php?title=TextUML_Guide#Metamodel_extensions">metamodel extensions</a>.</p>
<p><strong>Adding closures to UML</strong></p>
<p>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 <a href="http://abstratt.com/textuml/">TextUML Toolkit</a>, for instance, when implementing <a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">closures</a> in the TextUML <a href="http://abstratt.com/blog/2008/11/07/executable-models-with-textuml-toolkit-12-m1/">action language</a> (yes, the Toolkit eats its own dog food).</p>
<p>According to the wikipedia entry, &#8220;<em>a <strong>closure</strong> is a <span class="mw-redirect">function</span> that is evaluated in an environment containing one or more <span class="mw-redirect">bound variables</span>. When called, the function can access these variables.</em> &#8221;</p>
<p>It really makes sense to (meta) model a closure as some kind of UML <em>activity</em>, 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 <em>activity nodes</em> and <em>actions</em>, which are similar to blocks of code and instructions, respectively.</p>
<p>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&#8217;s local variables. So here is a possible (meta) modeling of closures in UML using the TextUML syntax:</p>
<pre>[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.</pre>
<p>Or, for those of you who prefer a class diagram (courtesy of the <a href="http://eclipsegraphviz.wiki.sourceforge.net/">EclipseGraphviz</a> integration):<br />
<a href="http://abstratt.com/blog/wp-content/uploads/2009/01/closure.png"><img title="closure" src="http://abstratt.com/blog/wp-content/uploads/2009/01/closure.png" alt="Closure as a UML metamodel extension" width="471" height="235" /></a></p>
<p>Note a model contributing language extensions must be applied the Standard::Metamodel stereotype, and each metaclass must be assigned the stereotype Standard::Metaclass.</p>
<p>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 <em>more</em> 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.</p>
<p>What about you, have you ever needed to extend UML using a metamodel extension? What for?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2009/01/18/closures-in-uml-extending-metamodel-with-textuml-toolkit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Integrating the TextUML Toolkit with other modeling tools</title>
		<link>http://abstratt.com/blog/2008/12/23/integrating-textuml-toolkit-with-other-modeling-tools/</link>
		<comments>http://abstratt.com/blog/2008/12/23/integrating-textuml-toolkit-with-other-modeling-tools/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 03:22:24 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=137</guid>
		<description><![CDATA[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&#8217;t help if you need [...]]]></description>
			<content:encoded><![CDATA[<p>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 <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> is a tool for UML modeling using a textual notation, but that is about it. The TextUML Toolkit itself won&#8217;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.</p>
<p>This post will describe how to use models created by other <a href="http://wiki.eclipse.org/MDT-UML2-Tool-Compatibility">UML2-compatible</a> modeling tools from models you create using the TextUML Toolkit. I plan to cover other areas of integration in future posts.</p>
<p><strong>Reading </strong><strong>models created by other UML tools using the TextUML notation</strong></p>
<p>If you have the TextUML Toolkit installed, one of the editors available for UML files is the <strong>TextUML Viewer</strong>. 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&#8217;t have the source for, i.e. models created by other UML2 modeling tools.</p>
<p><strong>Using models created by other tools&#8230;</strong></p>
<p>There are a few different ways of using models created by other UML modeling tools from your models created in TextUML.</p>
<p><strong>&#8230;by co-location</strong></p>
<p>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.</p>
<p>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.</p>
<p><strong>&#8230;with </strong><strong>project references</strong></p>
<p>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.</p>
<p>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.</p>
<p><strong>&#8230;by </strong><strong>explicitly loading them<br />
</strong></p>
<p>For this method, you use the <code>load</code> directive to <a href="http://abstratt.com/docs/index.php?title=TextUML_Guide#Referencing_external_models">load an external model located by a URI</a>.</p>
<p>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 <a href="http://help.eclipse.org/stable/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/misc/index.html">platform URLs</a>. 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.</p>
<p><strong>The entire truth&#8230;<br />
</strong></p>
<p>&#8230;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 <a href="http://abstratt.com/docs/index.php?title=TextUML_Guide#Cross-package_references">TextUML Guide</a>). For the TextUML Toolkit, all UML2-compatible models are equal, no matter how they were created.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/12/23/integrating-textuml-toolkit-with-other-modeling-tools/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.2 M2 is now available</title>
		<link>http://abstratt.com/blog/2008/12/15/textuml-toolkit-12-m2-is-now-available/</link>
		<comments>http://abstratt.com/blog/2008/12/15/textuml-toolkit-12-m2-is-now-available/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 10:30:53 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=139</guid>
		<description><![CDATA[The second milestone build towards TextUML Toolkit release 1.2 is now available from the milestone update site. Get it while it is hot. This milestone adds support for some UML language features: required extensions for stereotypes data types primitive types But what is really exciting is that this milestone is also the first build that [...]]]></description>
			<content:encoded><![CDATA[<p>The second milestone build towards <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> release 1.2 is now available from the <a href="http://abstratt.com/update/milestones/">milestone update site</a>. Get it while it is hot.</p>
<p>This milestone adds support for some UML language features:</p>
<ul>
<li><a href="http://abstratt.com/blog/2008/11/11/feature-required-extensions-for-stereotypes/">required extensions for stereotypes</a></li>
<li><a href="http://abstratt.com/blog/2008/11/28/feature-data-types/">data types</a></li>
<li><a href="http://abstratt.com/blog/2008/12/02/feature-primitive-types/">primitive types</a></li>
</ul>
<p>But what is really exciting is that this milestone is also the first build that includes a contribution from a new member of the TextUML Toolkit team: Massimiliano Federici provided a  patch that squished bug <a href="https://sourceforge.net/tracker2/?func=detail&amp;aid=2127735&amp;group_id=236545&amp;atid=1099987">2127735</a> (revision <a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=194">194</a>). Kudos to Massimiliano, his contribution was greatly appreciated, and it seems it might just be the first of many!</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/12/15/textuml-toolkit-12-m2-is-now-available/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Feature: primitive types</title>
		<link>http://abstratt.com/blog/2008/12/02/feature-primitive-types/</link>
		<comments>http://abstratt.com/blog/2008/12/02/feature-primitive-types/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 03:13:52 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=135</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I checked in support for UML primitive types in the <a href="http://abstratt.com/">TextUML Toolkit</a>. As an example of the syntax, here is the UMLPrimitiveTypes model, shipped in Eclipse UML2, rendered by the TextUML Source viewer:</p>
<pre>[Standard::ModelLibrary]
model UMLPrimitiveTypes;

apply Standard;

primitive Boolean;

primitive Integer;

primitive String;

primitive UnlimitedNatural;

end.</pre>
<p>As you can see, primitive types are declared using the keyword &#8216;primitive&#8217;, and cannot specialize other types or have structural features (thus there is no &#8216;end&#8217; 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.</p>
<p>Here is the breakdown of the change sets (r188-191):</p>
<ul>
<li>automated tests (<a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=190">r190</a>)</li>
<li>parser and model generation (<a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=191">r191</a>)</li>
<li>textual renderer (<a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=189">r189</a>)</li>
<li>editor (<a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=188">r188</a>)</li>
</ul>
<p>To be frank, the only test case added was quite trivial:</p>
<pre>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);
}</pre>
<p>But it is a good start. It ensures parsing works, and the model generated has the intended element created under the right parent package.</p>
<p>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?</p>
<blockquote><p><em>(By the way, if you want to understand how the TextUML Toolkit is implemented, feature posts like this are a good starting point)</em></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/12/02/feature-primitive-types/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Feature: data types</title>
		<link>http://abstratt.com/blog/2008/11/28/feature-data-types/</link>
		<comments>http://abstratt.com/blog/2008/11/28/feature-data-types/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 08:09:56 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=134</guid>
		<description><![CDATA[Just checked in a new feature in the TextUML Toolkit: support for data types (a.k.a. structs). This is an example of a data type declaration: datatype UserName attribute firstName : String; attribute lastName : String; end; You can declare operations and specialize other classifiers as usual. Change set Here are the individual changes per plug-in [...]]]></description>
			<content:encoded><![CDATA[<p>Just checked in a new feature in the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a>: support for data types (a.k.a. structs). This is an example of a data type declaration:</p>
<pre>datatype UserName
  attribute firstName : String;
  attribute lastName : String;
end;</pre>
<p>You can declare operations and specialize other classifiers as usual.</p>
<p><strong>Change set</strong></p>
<p>Here are the individual changes per plug-in (r177-r186):</p>
<ul>
<li>automated tests (<a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=180">180</a> and <a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=185">185</a>)</li>
<li>parser and model generation (<a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=181">181</a>, <a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=184">184</a> and <a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=186">186</a>)</li>
<li><a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=179">textual renderer</a></li>
<li><a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=178">editor</a></li>
</ul>
<p>There, nice and easy. Well, actually, I ended up doing a second commit because I forgot to ensure a data type specializes only other data types. But now that has been taken care of.</p>
<p>As usual, suggestions of UML features to support in the TextUML Toolkit are most welcome.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/11/28/feature-data-types/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Slashdot: Is Open Source Software a Race To Zero?</title>
		<link>http://abstratt.com/blog/2008/11/23/open-source-software-a-race-to-zero/</link>
		<comments>http://abstratt.com/blog/2008/11/23/open-source-software-a-race-to-zero/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 01:43:04 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=133</guid>
		<description><![CDATA[Great discussion over @ Slashdot: Is Open Source Software a Race To Zero? I really think the open source approach has lots of benefits, for the software itself and all parties involved. However, I would say it will probably take a decade before sound business models based on open source are really understood and start [...]]]></description>
			<content:encoded><![CDATA[<p>Great discussion over @ Slashdot: <a href="http://ask.slashdot.org/askslashdot/08/11/23/1447251.shtml">Is Open Source Software a Race To Zero?<br />
</a></p>
<p>I really think the open source approach has lots of benefits, for the software itself and all parties involved. However, I would say it will probably take a decade before sound business models based on open source are really understood and start to become mainstream.</p>
<p>At this point in time, (as most people) I still think it is considerably harder/trickier to make money developing software as open source than it is with closed source. At least for small companies. A few reasons:</p>
<ul>
<li>reduced <a href="http://en.wikipedia.org/wiki/Barriers_to_entry" target="_blank">barrier to entry</a> for new competitors as they can easily leverage the fruits of your hard work. Even more so if you choose a more liberal license such as a BSD, EPL or Apache (JBoss and MySQL use GPL, for instance).</li>
<li>lower profit margins, if you decide to adopt a services-based business model instead of one based on selling product licenses, which is a common approach.</li>
<li>the overhead of maintaining the open source software while developing the closed source extensions or providing the related services, the very activities that will actually make money, could be unbearable.</li>
</ul>
<p>The TextUML Toolkit is open source (EPL) <a href="http://abstratt.com/blog/2008/08/27/the-textuml-toolkit-needs-you/">since release 1.1</a>. The decision of making the TextUML Toolkit open source was based on the fact that I (a.k.a. Abstratt Technologies) never intended to make any money directly off of it, wanted to attract external contributions and maybe get some visibility to other future offerings. But I wouldn&#8217;t have done it if I had any plans of selling the TextUML Toolkit as a product on its own.</p>
<p>Well, I am interested in your thoughts. Do you know of cases of small companies making good money from developing and selling open source software (using liberal licenses such as the EPL)?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/11/23/open-source-software-a-race-to-zero/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Call for contributors</title>
		<link>http://abstratt.com/blog/2008/11/13/call-for-contributors/</link>
		<comments>http://abstratt.com/blog/2008/11/13/call-for-contributors/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 07:41:25 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=131</guid>
		<description><![CDATA[I would like to see the TextUML Toolkit as an Eclipse MDT subproject. Not long ago, I talked to Kenn Hussey and Ed Merks (they lead the UML2 and EMF projects, respectively) about the idea of proposing the Toolkit to the EMO and they both liked it (Ed actually suggested the idea in the first [...]]]></description>
			<content:encoded><![CDATA[<p>I would like to see the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> as an Eclipse <a href="http://www.eclipse.org/modeling/mdt/">MDT</a> subproject. Not long ago, I talked to Kenn Hussey and Ed Merks (they lead the <a href="http://eclipse.org/uml2" target="_blank">UML2</a> and <a href="http://eclipse.org/emf">EMF</a> projects, respectively) about the idea of proposing the Toolkit to the EMO and they both liked it (Ed actually suggested the idea in the first place). However, I was concerned that just one guy (yours truly) working on the project on and off in his spare time with no user community didn&#8217;t look very promising, and Kenn promptly agreed, so it was decided that it was important to get other people on board first.</p>
<p>With the intent of starting to gather some sort of community and hopefully contributors, I decided to release <a href="http://abstratt.com/blog/2008/08/27/the-textuml-toolkit-needs-you/">version 1.1 as EPL</a>. In the first couple of weeks after that, I noticed a significant spike in interest (page hits, issues opened, forum activity). But then everything went back to how it was before: today, there is no evidence anybody is using the tool, and I am still the only committer in the project.</p>
<p>So, this is a call (<em>or a cry</em>) for contributors: if you like the textual approach to UML modeling proposed by the TextUML Toolkit, would like to help putting together a <a href="http://wiki.eclipse.org/Development_Resources/HOWTO/Pre-Proposal_Phase">proposal</a>, and have some amount of time/resources to commit to the project in the long(ish) run, I am really eager to hear from you.</p>
<p>Things that are in scope for the project:</p>
<ul>
<li>broader notation coverage of UML features</li>
<li>richer IDE support: content assist, search/hyperlinking, refactoring</li>
<li>better integration with graphical UML tools</li>
</ul>
<p>If you are interested, feel free to contact me via this blog, the Toolkit <a href="http://abstratt.com/forum/">forum</a> or e-mail (rafael at abstratt.com).</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/11/13/call-for-contributors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Feature: required extensions for stereotypes</title>
		<link>http://abstratt.com/blog/2008/11/11/feature-required-extensions-for-stereotypes/</link>
		<comments>http://abstratt.com/blog/2008/11/11/feature-required-extensions-for-stereotypes/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 03:02:08 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=130</guid>
		<description><![CDATA[Just checked in a new feature in the TextUML Toolkit: required extensions for stereotypes (honestly, I didn&#8217;t know about that feature in UML until I read this post on the Eclipse UML2 newsgroup). The following is a stereotype extending two metaclasses (uml::Class and uml::Operation): profile my_profile; import uml; stereotype foo extends Class, Operation required end; [...]]]></description>
			<content:encoded><![CDATA[<p>Just checked in a new feature in the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a>: required extensions for stereotypes (honestly, I didn&#8217;t know about that feature in UML until I read <a href="http://www.eclipse.org/newsportal/article.php?id=2928&amp;group=eclipse.modeling.mdt.uml2#2928">this post</a> on the Eclipse UML2 newsgroup).</p>
<p>The following is a stereotype extending two metaclasses (uml::Class and uml::Operation):</p>
<pre>profile my_profile;

import uml;

stereotype foo extends Class, Operation required
end;

end.
</pre>
<p>In the example above, the extension of Operation is required, the extension of Class is not.</p>
<p><strong>Change set</strong></p>
<p>The change set to implement required extensions in the TextUML Toolkit (issue <a href="https://sourceforge.net/tracker/index.php?func=detail&amp;aid=2266268&amp;group_id=236545&amp;atid=1099987">#2266268</a>) was quite small (btw, kudos to the <a href="http://www.eclipse.org/modeling/mdt/?project=uml2">UML2</a> project for providing the best API for UML out there). </p>
<p>Here are the individual changes per plug-in (r153-r156):</p>
<ul>
<li><a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=155">automated tests</a></li>
<li><a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=156">parser and model generation</a></li>
<li><a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=154">textual renderer</a></li>
<li><a href="http://textuml.svn.sourceforge.net/viewvc/textuml?view=rev&amp;revision=153">editor</a></li>
</ul>
<p>Any other UML feature you would like to see exposed in the TextUML notation? Suggestions are welcome.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/11/11/feature-required-extensions-for-stereotypes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Executable models with TextUML Toolkit 1.2 M1</title>
		<link>http://abstratt.com/blog/2008/11/07/executable-models-with-textuml-toolkit-12-m1/</link>
		<comments>http://abstratt.com/blog/2008/11/07/executable-models-with-textuml-toolkit-12-m1/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 10:42:49 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=125</guid>
		<description><![CDATA[The first milestone build of the next TextUML Toolkit release is now available from the milestone update site. This preview build is the first to include support for modeling behavior using action semantics. I hinted at this capability here before, and I plan to cover action semantics in the TextUML notation in following posts. But [...]]]></description>
			<content:encoded><![CDATA[<p>The first milestone build of the next TextUML Toolkit release is now available from the milestone update site. This preview build is the first to include support for modeling behavior using action semantics. I hinted at this capability <a href="http://abstratt.com/blog/2008/11/02/what-can-uml-do-for-you/">here</a> before, and I plan to cover action semantics in the TextUML notation in following posts. But most people will get the gist of the notation from the examples below:</p>
<p>Here is an example of a UML model of an Account class represented in TextUML:</p>
<pre>model bank;

import base;

class Account
    attribute accountNumber : String;
    attribute balance : Integer;

    operation withdraw(amount : Integer);
    begin
        self.balance := self.balance - amount;
    end;    

    operation deposit(amount : Integer);
    begin
        self.balance := self.balance + amount;
    end;

    static operation newAccount(number : String,owner : Client): Account;
    begin
        var newAccount : Account;
        newAccount := new Account;
        newAccount.accountNumber := number;
        newAccount.balance := 0;
        link ClientAccount(owner := owner, accounts := newAccount);
        return newAccount;
    end;
end;

class Client specializes Object
    attribute name : String;
    static operation newClient(name : String): Client;
    begin
        var newClient : Client;
        newClient := new Client;
        newClient.name := name;
        return newClient;
    end;
end;

association ClientAccount
    navigable role owner : Client[1];
    navigable role accounts : Account[0, *];
end;

end.</pre>
<p>And here an example of a test driver &#8216;program&#8217; (note the use of a closure for looping through a collection of objects):</p>
<pre>package test;

apply base_profile;

import bank;
import base;

class TestDriver
  [entryPoint]
  static operation run();
  begin
      var john : Client, mary : Client,
             account1 : Account, account2 : Account, account3 : Account;
      john := Client#newClient("John Doe");
      mary := Client#newClient("Mary Doe");

      Console#writeln("Created: ".concat(john.name));

      account1 := Account#newAccount("1234-1", john);
      account2 := Account#newAccount("1238-2", mary);
      account3 := Account#newAccount("2231-7", john);

      Console#writeln("account owner: ".concat(account1-&gt;ClientAccount-&gt;owner.name));
      Console#writeln("account number: ".concat(account1.accountNumber));
      Console#writeln("initial balance is: ".concat(account1.balance.toString()));

      account1.deposit(2000);
      Console#writeln("after deposit, balance is: ".concat(account1.balance.toString()));

      account1.withdraw(500);
      Console#writeln("after withdrawal, balance is: ".concat(account1.balance.toString()));

       /* Now show information for all accounts. */
  	Account extent.forEach(
          (a : Account) {
              Console#writeln("*******");
              Console#writeln("Owner: ".concat(a-&gt;ClientAccount-&gt;owner.name));
              Console#writeln("Number: ".concat(a.accountNumber));
              Console#writeln("Balance: ".concat(a.balance.toString()));
          }
      );
  end;
end;

end.</pre>
<p>And here is the output of the test driver program, produced by running it on the <em>Libra</em> UML runtime (<em>not part of the TextUML Toolkit</em>):</p>
<pre>Created: John Doe
account owner: John Doe
account number: 1234-1
initial balance is: 0
after deposit, balance is: 2000
after withdrawal, balance is: 1500
*******
Owner: Mary Doe
Number: 1238-2
Balance: 0
*******
Owner: John Doe
Number: 1234-1
Balance: 1500
*******
Owner: John Doe
Number: 2231-7
Balance: 0</pre>
<p>Alternatively, one could have generated 100% of the code for a target platform of choice, given that all the information necessary for that is in the model. Note that code generation is not part of the TextUML Toolkit.</p>
<p>Do you want to give it a try? Install M1 from the <a href="http://abstratt.com/update/milestones/">milestone update site</a>. You can also fetch the example projects from <a href="http://abstratt.com/blog/wp-content/uploads/2008/11/example_12m1.zip">here</a>.</p>
<p>It is certainly a rough stone. I am counting on the community feedback to figure out what areas need to be smoothed first. Please provide your feedback or ask questions on the <a href="http://abstratt.com/forum/">TextUML Toolkit forums</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/11/07/executable-models-with-textuml-toolkit-12-m1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What can UML do for you?</title>
		<link>http://abstratt.com/blog/2008/11/02/what-can-uml-do-for-you/</link>
		<comments>http://abstratt.com/blog/2008/11/02/what-can-uml-do-for-you/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 04:50:48 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=123</guid>
		<description><![CDATA[Do you know what UML can do for you? I mean, did you know that UML models can actually do things? One of the least known features of UML is that you can model detailed imperative behavior. The UML &#8220;instruction set&#8221; can do things like: create and destroy objects create and destroy links (associations) between [...]]]></description>
			<content:encoded><![CDATA[<p>Do you know what UML can do for you? I mean, did you know that UML models can actually <em>do</em> things?</p>
<p>One of the least known features of UML is that you can model detailed imperative behavior. The UML &#8220;instruction set&#8221; can do things like:</p>
<ul>
<li> create and destroy objects</li>
<li>create and destroy links (associations) between objects</li>
<li>read and write attributes and local variables</li>
<li>invoke operations and functions</li>
<li>throw and catch exceptions</li>
<li>conditional statements</li>
<li>loops</li>
</ul>
<p>That is quite amazing, isn&#8217;t? And all that while still preserving a high level of abstraction. Such capability is generally referred to as &#8216;action semantics&#8217;. Action semantics provides the basic framework for executability in UML and has been there for quite a while now. It was originally added to the spec, first as patch, in UML 1.5 (2003), and then more seamlessly integrated into UML 2.0 and following spec releases.</p>
<p><strong>Action Semantics and TextUML</strong></p>
<p>An even more well-kept secret is that the <a href="http://abstratt.com/docs/index.php?title=TextUML_Guide">TextUML notation</a> supports UML action semantics and thus the creation of fully executable UML models. This support is not yet shipped as part of the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a>, but will be in the next release. Meanwhile, if you want to give it a try or take a closer look, you will have to grab the source from the <a href="https://sourceforge.net/svn/?group_id=236545">SVN repository</a>.</p>
<p>I plan to go into more details in the near future, but just to wet your appetite, here is one example of an executable UML model described in the TextUML notation:</p>
<pre>package hello;

apply base_profile;
import base;

class HelloWorld
    [entryPoint]
    static operation hello();
    begin
        Console#writeln("Hello, World");
    end;
end;

end.</pre>
<p>Cool, isn&#8217;t? If you had a UML runtime, this model could be executed even before you made a decision about what platform to target. Also, if your code generator were action semantics aware, you could trigger code generation for the target platform(s) of choice, with the key difference that you could achieve (or get very close) to full code generation, as the model now also describes behavior. No more of that monkey business of having to edit the generated code and manually fill in all those /* IMPLEMENT ME! */ methods.</p>
<p>Do you think this has value? Would you want to work with a tool that supported that? I am really keen on knowing your opinion.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/11/02/what-can-uml-do-for-you/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>OMG issues RFP: concrete syntax for UML action semantics</title>
		<link>http://abstratt.com/blog/2008/10/15/omg-issues-rfp-concrete-syntax-for-action-semantics/</link>
		<comments>http://abstratt.com/blog/2008/10/15/omg-issues-rfp-concrete-syntax-for-action-semantics/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 03:53:07 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[action language]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=122</guid>
		<description><![CDATA[This is actually old news for many people, but recently I learned (by pure chance) that the OMG issued a RFP for a &#8220;Concrete Syntax for a UML Action Language&#8221;. Letters of intent are due on December 8th. Submissions, one year after. OMG members only need apply (Aww&#8230;). I wonder if anyone in the Eclipse [...]]]></description>
			<content:encoded><![CDATA[<p>This is actually old news for many people, but recently I learned (by pure chance) that the OMG <a href="http://www.omg.org/cgi-bin/doc?ad/2008-9-9" target="_blank">issued</a> a RFP for a &#8220;Concrete Syntax for a UML Action Language&#8221;. Letters of intent are due on December 8th. Submissions, one year after. OMG members only need apply (Aww&#8230;). I wonder if anyone in the <a href="http://www.eclipse.org/modeling/" target="_blank">Eclipse Modeling</a> project is involved in submitting a proposal. Anyone?</p>
<p>Soapbox: <em>since version 1.5, UML has had support for algorithmic behavior specification, commonly called </em><em>action semantics. It is still hardly used, and most people that consider they know a lot of UML have never noticed it. Some people believe that the lack of an official concrete syntax for action semantics is a barrier to adoption. You see, the OMG defined the semantics and an abstract syntax, but left concrete syntax as an exercise for tool vendors.<br />
</em></p>
<p>As I <a href="http://abstratt.com/blog/2008/08/06/not-yet-another-language/">wrote</a> here before, I don&#8217;t really see the value in the OMG godfathering one concrete syntax over all others. Of course, we are talking here about a syntax for human beings, not for tools. Tools certainly don&#8217;t need a human-readable concrete syntax, a standard binary or XML format will do. The problem is: we all have our own preferences for what makes a good syntax, and there is no single syntax that will make everybody happy, so we are bound to have multiple concrete syntaxes anyway. We all like interoperability between tools, but when it comes to sugar, we like choice.</p>
<p>But maybe I am wrong. Maybe an OMG-blessed C-like concrete syntax for UML is all that is missing for Executable UML to become mainstream in the software development community. Go figure, we are an amusing bunch. Personally, I don&#8217;t care that much. I have been a Java developer for around 12 years now, so I can certainly stand another C-like syntax. We are not talking about a language anyway, it is <a href="http://abstratt.com/blog/2008/08/06/not-yet-another-language/">just a syntax</a> for an existing language, and syntax, a bit like UI, is inherently disposable, if you take it away, the real stuff is still there.</p>
<p>One clear positive outcome of the RFP is that submitters must provide, along with the proposal for a concrete syntax, any changes to fUML* that would be required to support such action language. That will probably help closing some gaps in the UML specification that make it hard to execute if you are stuck with the standard.</p>
<p>There are many other interesting bits in the proposal, but I will leave a more detailed analysis to a future post.</p>
<p>* the <a href="http://www.omg.org/docs/ad/06-06-16.pdf" target="_blank">Executable UML Foundation Submission</a> says:<em>&#8220;Foundational UML Subset (fUML) is that subset of UML required to write &#8216;programs&#8217; in UML&#8221;</em></p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/10/15/omg-issues-rfp-concrete-syntax-for-action-semantics/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>UML metamodel as text</title>
		<link>http://abstratt.com/blog/2008/10/14/uml-metamodel-as-text/</link>
		<comments>http://abstratt.com/blog/2008/10/14/uml-metamodel-as-text/#comments</comments>
		<pubDate>Wed, 15 Oct 2008 06:50:34 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=121</guid>
		<description><![CDATA[I posted this earlier this week on the UML2 newsgroup, thought I would share it here too&#8230; I published a TextUML rendition of the UML 2.1 metamodel that is shipped by Eclipse UML2 here (warning: 5.9k lines, 370Kb of text). It starts like this: (...) model uml; apply Ecore; apply Standard; import ecore; (* A [...]]]></description>
			<content:encoded><![CDATA[<p>I posted this earlier this week on the UML2 newsgroup, thought I would share it here too&#8230;</p>
<p>I published a TextUML rendition of the UML 2.1 metamodel that is shipped by Eclipse UML2 <a href="http://abstratt.com/docs/index.php?title=UML_Metamodel_In_TextUML">here</a> (<em>warning: 5.9k lines, 370Kb of text</em>). It starts like this:</p>
<pre>(...)
model uml;

apply Ecore;
apply Standard;

import ecore;

(* A comment is a textual annotation that can be attached to a set of elements. *)
[Standard::Metaclass]
class Comment specializes Element
    (* Specifies a string that is the comment. *)
    [Ecore::EAttribute(isID=false,isTransient=false,isVolatile=false,isUnsettable=true,annotations=[])]
    public attribute body : String;
    (* References the Element(s) being commented. *)
    public attribute annotatedElement : Element[0, *];
end;
(...)</pre>
<p>Thought it could be useful to anyone wanting to have a quick look at the UML metamodel. The TextUML renderer does not support all UML element types, so some elements might be missing/incomplete.</p>
<p>I think that is a nice demo of the textual browsing capabilities in the TextUML Toolkit. Of course, much more could be done in that area. If you feel like lending a hand, any help (bug reports included) will be much appreciated.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/10/14/uml-metamodel-as-text/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Feature: shorthand notation for aggregation and composition</title>
		<link>http://abstratt.com/blog/2008/09/16/feature-shorthand-notation-for-aggregation-and-composition/</link>
		<comments>http://abstratt.com/blog/2008/09/16/feature-shorthand-notation-for-aggregation-and-composition/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 07:38:13 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=115</guid>
		<description><![CDATA[Shorthand notation for both composite and aggregate associations has just been checked in (r99-r100). It follows the same spirit as the existing shorthand for plain associations (a.k.a. references). composition &#60;end-name&#62; : &#60;referenced-type-name&#62;; or aggregation &#60;end-name&#62; : &#60;referenced-type-name&#62;; That will result in a new unnamed association with two member ends, one named, owned by the declaring classifier, with [...]]]></description>
			<content:encoded><![CDATA[<p>Shorthand notation for both composite and aggregate associations has just been checked in (r99-r100). It follows the same spirit as the existing shorthand for plain associations (a.k.a. <a href="http://abstratt.com/docs/index.php?title=TextUML_Guide#References">references</a>).</p>
<pre>composition &lt;end-name&gt; : &lt;referenced-type-name&gt;;</pre>
<p>or</p>
<pre>aggregation &lt;end-name&gt; : &lt;referenced-type-name&gt;;</pre>
<p>That will result in a new unnamed association with two member ends, one named, owned by the declaring classifier, with <em>composite</em> or <em>shared</em> aggregation type, and another unnamed, owned by the association itself.</p>
<p><strong>Change set explained</strong></p>
<p>When adding a new feature to the notation, the typical change set contains:</p>
<ul>
<li>updates to the affected grammar production rules</li>
<li>implementation of the corresponding model generation handling code</li>
<li>a few test cases.</li>
</ul>
<p>In the case of the features presented in this post, the grammar change was quite simple (<a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.mdd.frontend.textuml.core/textuml.scc?r1=100&amp;r2=99&amp;pathrev=100">nicer view</a>):</p>
<pre>--- trunk/plugins/com.abstratt.mdd.frontend.textuml.core/textuml.scc	2008/09/16 05:47:13	99
+++ trunk/plugins/com.abstratt.mdd.frontend.textuml.core/textuml.scc	2008/09/16 05:47:20	100
@@ -341,7 +341,9 @@

   attribute_decl = attribute identifier colon type_identifier optional_subsetting semicolon ;

-  reference_decl = reference identifier colon type_identifier optional_subsetting  semicolon ;
+  reference_decl = reference_type identifier colon type_identifier optional_subsetting  semicolon ;
+
+  reference_type = {association} reference | {composition} composition | {aggregation} aggregation ; 

   optional_subsetting = subsets qualified_identifier | {empty} ;</pre>
<p>In other words, where one could declare a reference, one can now declare also a composition or an aggregation (gotta love the readability of <a href="http://sablecc.org" target="_blank">SableCC</a> grammars&#8230;).</p>
<p>The corresponding <a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.mdd.frontend.textuml.core/src/com/abstratt/mdd/internal/frontend/textuml/StructureGenerator.java?r1=100&amp;r2=99&amp;pathrev=100">model generator</a> (a.k.a. compiler) changes were quite trivial as well, even more so if you consider I inadvertently checked in a fix to an unrelated bug around comments (just ignore the changes in lines not in the 300&#8242;s).</p>
<p>In terms of lines of code, the bulk of the changes were in the <a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.mdd.core.tests/src/com/abstratt/mdd/core/tests/frontend/textuml/AssociationTests.java?r1=99&amp;r2=98&amp;pathrev=99">test class for associations</a>, where I added three test cases. I had postponed writing tests for the reference shorthand notation, so I took this opportunity to write a test for it too.</p>
<p>As most test cases in the TextUML Toolkit <a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.mdd.core.tests/src/com/abstratt/mdd/core/tests/frontend/textuml/">test suite</a>, the new test cases in AssociationTests have the following layout:</p>
<ul>
<li>one or more compilation units with TextUML source code are declared</li>
<li>source code is compiled and the resulting errors verified (most test cases won&#8217;t expect errors)</li>
<li>the resulting model is checked &#8211; were the expected elements created? Do they have the expected features?</li>
</ul>
<p><strong>Talking about tests</strong></p>
<p>The TextUML Toolkit has a modestly sized test suite (~130 test cases) at this time. It could use dozens, probably hundreds more, but most features are covered to so some extent.</p>
<p>However, as important as coverage, is how much one can learn about the piece of software being tested by reading its test suite. And here is where I believe the TextUML Toolkit&#8217;s test suite shines. For example, by reading the test classes, one could (maybe more effectively than by reading the <a href="http://abstratt.com/docs/index.php?title=TextUML_Guide">notation guide</a>), learn how the following UML features are exposed by the TextUML notation:</p>
<ul>
<li><a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.mdd.core.tests/src/com/abstratt/mdd/core/tests/frontend/textuml/ClassTests.java?view=markup">classes and structural features<br />
</a></li>
<li><a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.mdd.core.tests/src/com/abstratt/mdd/core/tests/frontend/textuml/PackageTests.java?view=markup">packages, imports, profiles</a></li>
<li><a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.mdd.core.tests/src/com/abstratt/mdd/core/tests/frontend/textuml/AssociationTests.java?view=markup">associations</a></li>
<li><a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.mdd.core.tests/src/com/abstratt/mdd/core/tests/frontend/textuml/MultiplicityTests.java?view=markup">multiplicity</a></li>
<li><a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.mdd.core.tests/src/com/abstratt/mdd/core/tests/frontend/textuml/TemplateTests.java?view=markup">template classes</a></li>
</ul>
<p><strong>Trivia: can you find out from the <a href="http://textuml.svn.sourceforge.net/viewvc/textuml/trunk/plugins/com.abstratt.mdd.core.tests/src/com/abstratt/mdd/core/tests/frontend/textuml/">test suite</a> the difference between a private and a public package import? </strong><em>Give it a try and let me know if I am lying&#8230; by the way, the notation guide does not cover that yet, although the UML specification, of course, does.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/09/16/feature-shorthand-notation-for-aggregation-and-composition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diagrams != Models</title>
		<link>http://abstratt.com/blog/2008/09/10/diagrams-models/</link>
		<comments>http://abstratt.com/blog/2008/09/10/diagrams-models/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 06:28:35 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=114</guid>
		<description><![CDATA[I often see the TextUML Toolkit being compared to tools that produce UML diagrams from textual descriptions. Examples of tools like that are ModSL, MetaUML and UMLGraph. But that doesn&#8217;t really make sense, and here is why: these tools produce diagrams from text. The TextUML Toolkit produces models from text. But what is the difference [...]]]></description>
			<content:encoded><![CDATA[<p>I often see the <a href="http://textuml.com">TextUML Toolkit</a> being compared to tools that produce UML diagrams from textual descriptions. Examples of tools like that are <a href="http://code.google.com/p/modsl/" target="_blank">ModSL</a>, <a href="http://metauml.sourceforge.net/" target="_blank">MetaUML</a> and <a href="http://www.umlgraph.org" target="_blank">UMLGraph</a>. But that doesn&#8217;t really make sense, and here is why: these tools produce <strong>diagrams</strong> from text. The TextUML Toolkit produces <strong>models</strong> from text. But what is the difference between models and diagrams?</p>
<p>According to Wikipedia:</p>
<ul>
<li><em>A <a href="http://en.wikipedia.org/wiki/Diagram" target="_blank"><strong>diagram</strong></a> is a 2D geometric symbolic representation of information according to some visualization technique</em>.</li>
<li><em>A <a href="http://en.wikipedia.org/wiki/Model" target="_blank"><strong>model</strong></a> is a pattern, plan, representation (especially in miniature), or description designed to show the main object or workings of an object, system, or concept</em>.</li>
</ul>
<p>Note that even though both terms are defined around the word &#8220;representation&#8221;, the term &#8220;diagram&#8221; implies graphical visualization, whereas the term &#8220;model&#8221; admits any kind of media, basically because models have no concrete form per se.</p>
<p>Now, please, if you are not convinced yet, read aloud 5 times: <strong>MODELS ARE NOT DIAGRAMS</strong>!</p>
<p>If that didn&#8217;t work, well, maybe the facts below will help:</p>
<ul>
<li>models, not diagrams, <strong>are the subject matter of model-driven development</strong>.</li>
<li>models, not diagrams, <strong>can be validated</strong>.</li>
<li>models, not diagrams, <strong>can serve as input to code generation</strong>.</li>
<li>models, not diagrams, <strong>can be automatically generated from reverse engineering source code</strong>.</li>
<li>models, not diagrams, <strong>can be executed</strong>.</li>
</ul>
<p>Even though diagrams are commonly used for representing models, they are not the only way, and non rare not the most appropriate one (yes, I am talking again about the virtues of textual notations, but I won&#8217;t <a href="http://abstratt.com/blog/2008/05/05/why-we-write-code-and-dont-just-draw-diagrams/">repeat</a> <a href="http://abstratt.com/blog/2008/02/07/textual-notations-and-uml-compliance/">myself</a>).</p>
<p><em>P.S. Maybe it helps adding to the confusion the fact that the TextUML Toolkit has an optional feature that will generate class diagrams automatically from the UML models created with it. However, that is just an optional, loosely integrated feature, and it is definitely <strong>not</strong> the Toolkit&#8217;s thing. Weirdly enough, from my observation, that feature is the main reason most people become interested in the TextUML Toolkit. Well, go figure.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/09/10/diagrams-models/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.1 is out!</title>
		<link>http://abstratt.com/blog/2008/09/02/textuml-toolkit-11-is-out/</link>
		<comments>http://abstratt.com/blog/2008/09/02/textuml-toolkit-11-is-out/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 03:12:16 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=113</guid>
		<description><![CDATA[TextUML Toolkit 1.1 is out! This is the first release after the TextUML Toolkit became an open source project. Besides the adoption of the Eclipse Public License, these are the new features that were added in 1.1: more UML features exposed by the textual notation: abstract operations and parameter direction modifiers more diagram layout controls [...]]]></description>
			<content:encoded><![CDATA[<p>TextUML Toolkit 1.1 is out! This is the first release after the TextUML Toolkit <a href="http://abstratt.com/blog/2008/08/27/the-textuml-toolkit-needs-you/">became an open source project</a>. Besides the adoption of the Eclipse Public License, these are the <a href="http://abstratt.com/docs/index.php?title=TextUML_Toolkit_Features#Since_1.1">new features</a> that were added in 1.1:</p>
<ul>
<li><strong>more UML features</strong> exposed by the textual notation: abstract operations and parameter direction modifiers</li>
<li><strong>more diagram layout controls</strong> (compartments, elements across packages)</li>
<li>support for <strong>exporting the class diagram to a PNG or JPG image file</strong> (actually, an <a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1783799&amp;group_id=201477&amp;atid=977719">EclipseGraphviz</a> feature, also available for other graphical content providers)</li>
</ul>
<p>Also, the TextUML Toolkit is not available any longer as a standalone download. You need to install Eclipse 3.4 first  (3.3 support was dropped) and then install the TextUML Toolkit using the new smart Software Updates mechanism in Ganymede. See new install instructions <a href="http://abstratt.com/docs/index.php?title=Install_Instructions">here</a>.</p>
<p>As usual, feedback is most welcome &#8211; <a href="http://abstratt.com/blog/">blog</a>, <a href="http://sourceforge.net/tracker/?atid=1099987&amp;group_id=236545&amp;func=browse">issue tracker</a> or <a href="http://sourceforge.net/forum/forum.php?forum_id=855420">forum</a>, whatever option works best.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/09/02/textuml-toolkit-11-is-out/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>The TextUML Toolkit needs you</title>
		<link>http://abstratt.com/blog/2008/08/27/the-textuml-toolkit-needs-you/</link>
		<comments>http://abstratt.com/blog/2008/08/27/the-textuml-toolkit-needs-you/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 05:10:04 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=111</guid>
		<description><![CDATA[Since I started working on the TextUML Toolkit more than a year ago, I have been asking myself whether it would make sense to make it available under an open source license. Open sourcing a product is a tough decision. Once you take that road, there is no way back, at least not without risking [...]]]></description>
			<content:encoded><![CDATA[<p>Since I started working on the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> more than a year ago, I have been asking myself whether it would make sense to make it available under an open source license.</p>
<p>Open sourcing a product is a tough decision. Once you take that road, there is no way back, at least not without risking a backlash from the community (of course, if you managed to build a community). And even though there are more and more examples of successful businesses built on top of open source offerings, they are still the exception. However, from day one, my plan for the Toolkit has always been to give it away for free. Going from &#8220;free-as-in-beer&#8221; to &#8220;free-as-in-speech&#8221; is not nearly as traumatic.</p>
<p>I resisted to the idea while I was working on releasing version 1.0, as I considered it as potentially distracting and of questionable value, as then I knew exactly what I wanted to ship and how to get it done. However, now that 1.0 is out of the way, it seems the right thing to do. The first release provided a good starting point, but the project certainly needs more hands on deck to get to the next level. It is also clear that an open source license means a lot when you are catering to a developer audience.</p>
<p>So, you heard it here first: <strong>the next release of the TextU</strong><strong>ML Toolkit will be licensed under the Eclipse Public License</strong>. The source code is already available on <a href="http://sourceforge.net/projects/textuml/" target="_self">SourceForge</a>, and user forums and issue tracking are now also hosted there.</p>
<p>Joining the <a href="http://www.eclipse.org/modeling/" target="_blank">Eclipse Modeling</a> project (more specifically the <a href="http://www.eclipse.org/modeling/mdt/" target="_blank">MDT</a> subproject) is an option for the future, depending on whether the project succeeds in attracting other contributors.</p>
<p style="text-align: center;"><a href="http://sf.net/projects/textuml"><img class="size-full wp-image-112 aligncenter" title="textuml-toolkit-needs-you" src="http://abstratt.com/blog/wp-content/uploads/2008/08/textuml-toolkit-needs-you.jpg" alt="The TextUML Toolkit needs you" width="199" height="262" /></a></p>
<p>Using the tool, spreading the word, asking and answering questions on the <a href="http://sourceforge.net/forum/forum.php?forum_id=855420">forum</a>, <a href="http://sourceforge.net/tracker/?atid=1099987&amp;group_id=236545&amp;func=browse">reporting problems and requesting features</a> are all great ways of helping. Regarding new features, the project needs help on two main fronts: <strong>broader coverage of UML</strong> (state machines, activities), and <strong>better IDE features </strong>(such as content assist, templates, symbolic search and refactoring). If you like the textual notation approach, the tool, and feel like you could lend a hand, please do, <strong>the TextUML Toolkit needs you!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/08/27/the-textuml-toolkit-needs-you/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Feature: UML parameter direction kind</title>
		<link>http://abstratt.com/blog/2008/08/21/feature-uml-parameter-direction-kind/</link>
		<comments>http://abstratt.com/blog/2008/08/21/feature-uml-parameter-direction-kind/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 04:27:02 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=110</guid>
		<description><![CDATA[I just completed the code for supporting parameter direction modifiers. When this feature makes into the next build, modelers will be able to choose for named parameters any of the standard parameter direction kinds: out, inout, or (the default) in. By the way, the syntax for specifying return types remains the same. Here is an [...]]]></description>
			<content:encoded><![CDATA[<p>I just completed the code for supporting parameter direction modifiers. When this feature makes into the next build, modelers will be able to choose for named parameters any of the standard parameter direction kinds: <strong>out</strong>, <strong>inout</strong>, or (the default) <strong>in</strong>. By the way, the syntax for specifying return types remains the same. Here is an example:</p>
<pre>
  operation op1(in p1 : String, out p2 : String);
</pre>
<p>Java developers might consider this feature unnecessary as there is only one way of passing parameters in Java, but for distributed applications (such as those using CORBA or web services) these modifiers are quite relevant.</p>
<p>The corresponding support for rendering operation parameter direction kind modifiers has been added to the TextUML model viewer (decompiler) and <a href="http://eclipsegraphviz.sf.net" target="_blank">EclipseGraphviz</a> graphical rendering component.</p>
<p>This is the first new feature since version 1.0 was released.  The impact of implementing it was quite minimal to the code base, so I am looking forward to implementing the next notation feature. The question is: what feature? Any suggestions?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/08/21/feature-uml-parameter-direction-kind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Not yet another language</title>
		<link>http://abstratt.com/blog/2008/08/06/not-yet-another-language/</link>
		<comments>http://abstratt.com/blog/2008/08/06/not-yet-another-language/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 05:24:07 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=108</guid>
		<description><![CDATA[One potential downside people often point out about using TextUML as a notation for UML is that it is yet another language to learn. But that is not really a well founded argument. TextUML is not a full-blown language, it is just an alternative notation for UML, the de facto standard language for modeling. The [...]]]></description>
			<content:encoded><![CDATA[<p>One potential downside people often point out about using TextUML as a notation for UML is that it is yet another language to learn. But that is not really a well founded argument. TextUML is not a full-blown language, it is just an alternative notation for UML, the <em>de facto</em> standard language for modeling. The language semantics of UML are defined in terms of an abstract syntax, and even though the specification includes sections about the graphical notation, it <a href="http://abstratt.com/blog/2008/02/07/textual-notations-and-uml-compliance/">clearly supports</a> the idea of alternate concrete syntaxes.</p>
<p>Moreover, we really shouldn&#8217;t care much about the actual notation being used, be it the standard graphical notation, TextUML or any other textual notation. I surely don&#8217;t. Regardless what notation you use for creating UML models, in the end there is only one language. All you know about the semantics of UML model elements is still true no matter what syntax you choose (for instance, if you know your UML, you should easily become productive with the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> by just glancing over the <a href="http://abstratt.com/docs/index.php?title=TextUML_Guide">notation guide</a> now and then). In fact, I predict a time where people will want to move between different notations across tasks and time. Also, in the same team, different people will be collaboratively creating UML models using different notations.</p>
<p>This will only be possible because supporting a new concrete syntax is much simpler than supporting a whole new language (by the way, that is the same reason why I believe UML-based DSLs to be a better option than homegrown proprietary DSLs, but I digress). Any reasonably good programmer armed with a parser generator and knowledge of the metamodel should be able to write a compiler for a textual notation for UML, and Eclipse makes it really easy to provide basic IDE features such as those you see in the TextUML Toolkit. Also, there are tools in the horizon such as <a href="http://www.eclipse.org/imp/" target="_blank">IMP</a> and <a href="http://wiki.eclipse.org/TMF" target="_blank">TMF</a> that will make these tasks really a breeze.</p>
<p>Meanwhile, you can stick with <a href="http://abstratt.com/textuml/">what is here today</a>. <img src='http://abstratt.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/08/06/not-yet-another-language/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Demo: Installing, configuring and exploring the TextUML Toolkit</title>
		<link>http://abstratt.com/blog/2008/07/29/demo-installing-configuring-and-exploring-the-textuml-toolkit/</link>
		<comments>http://abstratt.com/blog/2008/07/29/demo-installing-configuring-and-exploring-the-textuml-toolkit/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 16:04:09 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=103</guid>
		<description><![CDATA[I just uploaded the first interactive presentation showing how to install and configure the TextUML Toolkit on Eclipse 3.4. It starts with a plain Eclipse Platform Runtime install, and guides the reader through the following steps: making sure you have the right version of Eclipse (3.4) adding the TextUML Toolkit update site installing the TextUML [...]]]></description>
			<content:encoded><![CDATA[<p>I just uploaded the first <a href="http://abstratt.com/textuml/demos/">interactive presentation</a> showing how to install and configure the TextUML Toolkit on Eclipse 3.4. It starts with a plain Eclipse Platform Runtime install, and guides the reader through the following steps:</p>
<ol>
<li>making sure you have the right version of Eclipse (3.4)</li>
<li>adding the TextUML Toolkit update site</li>
<li>installing the TextUML Toolkit and EclipseGraphviz</li>
<li>configuring EclipseGraphviz to point to your Graphviz install</li>
<li>opening the Image Viewer view to show models using the graphical notation</li>
<li>creating an empty TextUML Toolkit project</li>
<li>creating an empty TextUML source file</li>
<li>creating a minimal class diagram with a package and a featureless class</li>
<li>understanding the edit/compile/visualize cycle</li>
</ol>
<p>Give it a try and let me know what you think. Blame me for any weird screen transitions. <a href="http://www.debugmode.com/wink/" target="_blank">Wink</a> is a great little tool but has a few small quirks that I have yet to master, but the next presentation should look better. Cheers,</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/07/29/demo-installing-configuring-and-exploring-the-textuml-toolkit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One less reason for using Eclipse 3.3</title>
		<link>http://abstratt.com/blog/2008/07/25/one-less-reason-for-using-eclipse-33/</link>
		<comments>http://abstratt.com/blog/2008/07/25/one-less-reason-for-using-eclipse-33/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 05:59:39 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=102</guid>
		<description><![CDATA[According to an announcement made on the acceleo-dev mailing list, Acceleo 2.3.0 has been released today. Congrats to the folks at Obeo! The latest bits are already available from Acceleo&#8217;s update site, but the download page still shows 2.2.1 as the latest release available. That is one less excuse for using Eclipse 3.3, which was [...]]]></description>
			<content:encoded><![CDATA[<p>According to an announcement made on the <a href="http://mail-archive.ow2.org/acceleo-dev/2008-07/msg00013.html" target="_blank">acceleo-dev</a> mailing list, Acceleo 2.3.0 has been released today. Congrats to the folks at Obeo! The latest bits are already available from Acceleo&#8217;s <a href="http://www.acceleo.org/update/" target="_blank">update site</a>, but the <a href="http://acceleo.org/pages/download-acceleo/en" target="_blank">download page</a> still shows 2.2.1 as the latest release available.</p>
<p>That is one less excuse for using Eclipse 3.3, which was the latest release supported by Acceleo 2.2.1. An added bonus is that the TextUML Toolkit is much more stable on Eclipse 3.4 due to a nasty <a href="https://bugs.eclipse.org/220065" target="_blank">concurrency bug</a> fixed in UML2 for the Ganymede release (kudos to  Kenn and James!).</p>
<p>I just updated the <a href="http://abstratt.com/docs/index.php?title=Pet_Store_Example" target="_self">install instructions</a> for the Pet Store example application. With a new and improved Software Update  mechanism (a.k.a. P2), it became much simpler to install the TextUML Toolkit and Acceleo on Eclipse 3.4. For instance, no need to worry about EMF or UML2, they are transparently installed. How cool is that?</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/07/25/one-less-reason-for-using-eclipse-33/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit 1.0 has been released!</title>
		<link>http://abstratt.com/blog/2008/07/09/textuml-toolkit-10-has-been-released/</link>
		<comments>http://abstratt.com/blog/2008/07/09/textuml-toolkit-10-has-been-released/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 05:18:21 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[30-day challenge]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=95</guid>
		<description><![CDATA[I am proud to announce that the TextUML Toolkit reached version 1.0! It is basically the same as the RC3 build, made available earlier this week, with version numbers updated to reflect the status of release. You can download the TextUML Toolkit 1.0 from here. Even if it still preserves the same humble look &#38; [...]]]></description>
			<content:encoded><![CDATA[<p>I am proud to announce that the <strong>TextUML Toolkit reached version 1.0!</strong></p>
<p><img class="aligncenter size-full wp-image-99" title="splash-10" src="http://abstratt.com/blog/wp-content/uploads/2008/07/splash-10.png" alt="TextUML Toolkit 1.0 splash screen" width="450" height="297" /></p>
<p>It is basically the same as the RC3 build, made available earlier this week, with version numbers updated to reflect the status of release. You can download the TextUML Toolkit 1.0 from <a href="http://abstratt.com/textuml/download.html">here</a>.</p>
<p>Even if it still preserves the same humble look &amp; feel, the TextUML Toolkit has come a long way since the first public milestone was <a href="http://abstratt.com/blog/2007/05/02/a-website-and-the-first-release/">announced here</a> more than a year ago:</p>
<ul>
<li><strong><a href="http://abstratt.com/blog/2007/05/02/a-website-and-the-first-release/">M1</a> &#8211; May 2007</strong>
<ul>
<li>website went live</li>
<li>first public milestone</li>
</ul>
</li>
<li><strong><a href="http://abstratt.com/blog/2007/09/02/textuml-toolkit-10-m2-is-available/">M2</a> &#8211; September 2007</strong>
<ul>
<li>graphical class diagram visualization for Windows only (spawned as a brand new open-source project, <a href="http://abstratt.com/blog/2007/08/23/a-detour-from-a-detour-from-a-detour-or-how-a-graphical-viewing-framework-for-eclipse-was-born/" target="_self">EclipseGraphviz</a>)</li>
<li>support for <a href="http://abstratt.com/docs/index.php?title=TextUML_Guide#Enumerations">enumerations</a></li>
</ul>
</li>
<li><strong><a href="http://abstratt.com/blog/2008/03/03/textuml-toolkit-is-now-available-on-multiple-platforms/">M3</a> &#8211; March 2008</strong>
<ul>
<li>reverse engineering of UML2 models as TextUML source (aka <a href="http://abstratt.com/docs/index.php?title=TextUML_Toolkit_Features#Textual_browsing">textual browsing</a>)</li>
<li>diagram rendering also on Linux and Mac OS/X</li>
<li>click-through license</li>
<li>better stability and performance</li>
<li>website improvements: added user forum (SMF)</li>
</ul>
</li>
<li><strong><a href="http://abstratt.com/blog/2008/05/06/m4-has-left-the-building/">M4</a> &#8211; May 2008</strong>
<ul>
<li>duplicate symbols properly reported as compilation errors</li>
<li>TextUML  source renderer showing nested packages</li>
<li>evaluated a few code generators (Acceleo, oAW xPand, EMF JET), chose <a href="http://acceleo.org" target="_blank">Acceleo</a></li>
<li>first milestone available via update site</li>
</ul>
</li>
<li><strong><a href="http://abstratt.com/blog/2008/06/04/textuml-toolkit-m5-is-now-available/">M5</a> &#8211; June 2008</strong>
<ul>
<li>fixed a serious memory leak caused by UML2 caching</li>
<li>several bug fixes</li>
<li>decoupled the TextUML Toolkit from EclipseGraphviz (EG becoming just a possible integration)</li>
<li>website improvements: wiki-based (MediaWiki) documentation area</li>
</ul>
</li>
<li><strong><a href="http://abstratt.com/blog/2008/07/08/sample-application-textuml-toolkit-rc3-are-now-available/">1.0</a> &#8211; July 2008</strong>
<ul>
<li>support for applying stereotypes to stereotypes</li>
<li>provided a Pet Store-like <a href="http://abstratt.com/docs/index.php?title=Pet_Store_Example">sample application</a></li>
<li>more, better <a href="http://abstratt.com/docs/">documentation</a></li>
</ul>
</li>
</ul>
<p>On the outreach front: in December, I did a quick presentation of the TextUML Toolkit during the <a href="http://abstratt.com/blog/2007/12/08/eclipse-democamp-in-vancouver/">Eclipse DemoCamp in Vancouver</a>, and had the opportunity of doing a longer, more detailed presentation at the <a href="http://abstratt.com/blog/2008/03/26/textuml-toolkit-at-vijug/">VIJUG&#8217;s meeting</a> in April. At both opportunities, receptivity to the project was quite good. People seemed very keen on the idea of UML models as text, and I got lots of interesting questions.</p>
<p>In early June, I joined many other fellow mISVers in the <a href="http://feeds.feedburner.com/30dayers" target="_blank">30-day product challenge</a>. Even though I didn&#8217;t achieve <a href="http://abstratt.com/blog/2008/06/04/textuml-toolkit-commitments-for-the-30-day-challenge/">everything I had set out to do</a>, I am quite happy for having been part of it, as it provided me with the strength and courage to finally ship the first release.</p>
<p>Overall, I am quite happy with the current state of the TextUML Toolkit (or else I would not have declared a release). On the other hand, I confess I am disappointed that interest has not picked up yet, considering it is a free tool that provides real value. Now that there is an example describing how to use the TextUML Toolkit and Acceleo for generating code from UML models (which is the main application of the tool), I hope the value of the tool will become more apparent. And I guess more attention to the marketing side of things won&#8217;t hurt.</p>
<p>For the next few months, I will be focusing on a more ambitious project I have hinted at here a couple of times before. During this time, I will be promoting the TextUML Toolkit, writing more documentation and examples, and fixing any bugs users might report, but I do not plan to develop any new features unless there is user demand.</p>
<p>Well, it has been a fun ride, and I appreciate the interest of those of you who have followed at least some part of the journey. Your comments on the blog have been very helpful and encouraging. Thanks a lot!</p>
<p>Cheers,</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/07/09/textuml-toolkit-10-has-been-released/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Sample application, TextUML Toolkit RC3 are now available</title>
		<link>http://abstratt.com/blog/2008/07/08/sample-application-textuml-toolkit-rc3-are-now-available/</link>
		<comments>http://abstratt.com/blog/2008/07/08/sample-application-textuml-toolkit-rc3-are-now-available/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 08:58:59 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[30-day challenge]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=94</guid>
		<description><![CDATA[The Pet Store-like model-driven sample application is now available. This initial version contains UML models for a few of the key entities, and generates the domain model classes and their corresponding Hibernate mapping files. I noticed the generated mapping files (or maybe the models) have a few issues and/or missing elements, but as a first [...]]]></description>
			<content:encoded><![CDATA[<p>The Pet Store-like model-driven sample application is <a href="http://abstratt.com/docs/index.php?title=Pet_Store_Example">now available</a>. This initial version contains UML models for a few of the key entities, and generates the domain model classes and their corresponding Hibernate mapping files. I noticed the generated mapping files (or maybe the models) have a few issues and/or missing elements, but as a first stab I am quite happy. Please give it a try. It is a great way example of how the TextUML Toolkit can be used in the context of code generation, in this case, with the awesome <a href="http://acceleo.org" target="_blank">Acceleo</a> tool (open-source). Note this is just an example &#8211; you should be able to use any UML2-based Acceleo modules (like those available from Acceleo&#8217;s <a href="http://www.acceleo.org/pages/modules-repository/en" target="_blank">module repository</a>) and generate code from any UML models you create using the TextUML Toolkit.</p>
<p>In addition to the sample application, the latest TextUML Toolkit release candidate (RC3) is also now available, both as a standalone <a href="http://abstratt.com/textuml/download.html">download</a> and as an <a href="http://abstratt.com/textuml/update/">update site</a>, as usual. Work items delivered in this build:</p>
<ul>
<li>ticket #182 &#8211; associations end up with one single member end</li>
<li>ticket #183 &#8211; cannot define stereotypes on stereotypes</li>
<li>ticket #167 &#8211; provide sample application</li>
</ul>
<p>To my fellow 30-dayers &#8211; yes, its 8 days past the 30 day deadline, but unless I get a serious bug reported during this week, this is it, I am about to achieve my modest goals (yay!) of shipping 1.0 and a sample application (remember, I started working on the TextUML Toolkit quite  while ago). The only planned change for 1.0 is basically updating the splash screen to sport the elusive 1.0 version number.</p>
<p><strong>Feedback on RC3 or the sample application is most welcome</strong>. As usual, feel free to comment here or on the <a href="http://abstratt.com/forums/">forums</a>.</p>
<p>Cheers,</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/07/08/sample-application-textuml-toolkit-rc3-are-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time is up</title>
		<link>http://abstratt.com/blog/2008/07/01/times-up/</link>
		<comments>http://abstratt.com/blog/2008/07/01/times-up/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 09:05:37 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[30-day challenge]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=93</guid>
		<description><![CDATA[Even after cutting scope to close to half of what I was planning, I failed to accomplish what I set off to do in the 30-day challenge. I basically have the code and the example in a releasable state, but I have no means to publish a tutorial with images due to some unexpected web [...]]]></description>
			<content:encoded><![CDATA[<p>Even after cutting scope to close to half of what I was planning, I failed to accomplish what I set off to do in the 30-day challenge. I basically have the code and the example in a releasable state, but I have no means to publish a tutorial with images due to some unexpected web site issues. Even without this issue, I might not have made it, given how much work I left to the last day. Anyway&#8230; after spending quite some time trying to get MediaWiki to behave (with no success), now I don&#8217;t have time or energy for packaging and pushing the bits of the TextUML Toolkit RC3 (hopefully 1.0?) to the FTP server. Should do that at some point this week, and also hopefully get the wiki back online.</p>
<p>Well, enough ranting, need some sleep now. Thanks to the other <a href="https://feeds.feedburner.com/30dayers" target="_blank">30-dayers</a> for being part of this, and hope you guys had better luck. Cheers,</p>
<p>Rafael</p>
<p>P.S.: I considered not writing in my current mood, but I thought in the end it would be more honest doing so, so there you go</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/07/01/times-up/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Scope cutting season</title>
		<link>http://abstratt.com/blog/2008/06/24/scope-cutting-season/</link>
		<comments>http://abstratt.com/blog/2008/06/24/scope-cutting-season/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 09:02:04 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[30-day challenge]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/?p=92</guid>
		<description><![CDATA[Well, things are not going so smoothly in TextUML Toolkit land. Hope the others are doing better. a user reported that the embedded Graphviz install was not working for him on Windows XP (I expected it to work on all Windows versions, but really tested only on Vista). After some investigation, I realized that a [...]]]></description>
			<content:encoded><![CDATA[<p>Well, things are not going so smoothly in TextUML Toolkit land. Hope <a href="http://feeds.feedburner.com/30dayers" target="_blank">the others</a> are doing better.</p>
<ul>
<li>a user <a href="http://abstratt.com/forums/index.php?topic=11.0">reported</a> that the embedded Graphviz install was not working for him on Windows XP (I expected it to work on all Windows versions, but really tested only on Vista). After some investigation, I realized that a minimal Graphviz install will look very different depending on the Windows version. Result: I decided to quit bundling Graphviz for Windows. Now, the TextUML Toolkit users on Windows have to manually install Graphviz on their own, and configure the location of an external Graphviz manually, just as Linux and Mac OS X users had to do since day 0. The latest build RC2 (just published) already reflects that change.</li>
<li>a simple WordPress migration using GoDaddy&#8217;s Hosting Connection became a big hassle (their rollback feature did not work either). Result: had to delete my existing install, and install the latest version from scratch (thankfully, WordPress export/import features worked like a charm). Lesson learned: avoid doing any infrastructure changes that are not critical in the weeks preceding a release (even if they seem harmless).</li>
</ul>
<p>I finally woke up to the fact I am really late with most of the <a href="http://abstratt.com/blog/2008/06/04/textuml-toolkit-commitments-for-the-30-day-challenge/">deliverables I planned for June 30th</a> and we are already a week from the deadline. I decided thus to postpone all non-product related items. Other than any critical bug that might be found this week, I will be focusing on publishing the sample application on the wiki. Nothing else.</p>
<p>Well, maybe some blogging.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/06/24/scope-cutting-season/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Moving forward again</title>
		<link>http://abstratt.com/blog/2008/06/19/moving-forward-again/</link>
		<comments>http://abstratt.com/blog/2008/06/19/moving-forward-again/#comments</comments>
		<pubDate>Thu, 19 Jun 2008 08:58:49 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[30-day challenge]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/06/19/moving-forward-again/</guid>
		<description><![CDATA[I finally figured out what was preventing me from exporting the product from Eclipse and worked around the problem. So the TextUML Toolkit RC1 is finally available for download, 4 days after planned. It turned out the issue that was blocking me was not specific to Eclipse 3.4 RC3. Still, I decided that, until the [...]]]></description>
			<content:encoded><![CDATA[<p>I finally <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=237435" target="_blank">figured out</a> what was preventing me from exporting the product from Eclipse and worked around the problem. So the TextUML Toolkit RC1 is finally available for <a href="http://abstratt.com/textuml/download.html">download</a>, 4 days after <a href="http://abstratt.com/blog/2008/06/04/textuml-toolkit-commitments-for-the-30-day-challenge/">planned</a>.</p>
<p>It turned out the issue that was blocking me was not specific to Eclipse 3.4 RC3. Still, I decided that, until the end of the 30-day challenge, I will continue to use 3.3 to avoid <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232476" target="_blank">any further surprises</a>. I intend to go back to 3.4 shortly after that.</p>
<p>Another important task that was planned for the first phase (first two weeks) and I have yet to address is the sample application (models + templates). That means some of the less critical work items planned for the second phase will have to be postponed (probably the artwork item).</p>
<p>Even though I am behind schedule, I am really happy to be moving forward again&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/06/19/moving-forward-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The bleeding edge: not for the faint of heart</title>
		<link>http://abstratt.com/blog/2008/06/18/the-bleeding-edge-not-for-the-faint-of-heart/</link>
		<comments>http://abstratt.com/blog/2008/06/18/the-bleeding-edge-not-for-the-faint-of-heart/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 08:41:06 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[30-day challenge]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/06/18/the-bleeding-edge-not-for-the-faint-of-heart/</guid>
		<description><![CDATA[(To my fellow 30-dayers: It has been a while since my last post in the 30-day challenge category &#8211; at least if you think of how brief it is. But worse, I am also behind the schedule. My goal was to have the first release candidate on the 15th. It is the 17th and I [...]]]></description>
			<content:encoded><![CDATA[<p><em>(To my fellow <a href="http://feeds.feedburner.com/30dayers" target="_blank">30-dayers</a>: It has been a while since my <a href="http://abstratt.com/blog/2008/06/11/textuml-toolkit-layout-control-for-class-diagrams/">last post</a> in the <a href="http://abstratt.com/blog/category/30day/">30-day challenge</a> category &#8211; at least if you think of how brief it is. But worse, I am also behind the schedule. My goal was to have the first release candidate on the 15th. It is the 17th and I am not quite there yet. Read on for details) </em></p>
<p>Every now and then, the Eclipse Project goes through quite significant changes (OSGi and RCP in 3.0, P2 now in 3.4). And when the platform moves this fast, everybody living above feels it. New features are not well documented or are not very stable. Tooling for plug-in developers lags behind. Things that used to work before, are now broken.</p>
<p>That is really hard to avoid, even though backward compatibility with the previous release is a hard requirement for the Eclipse Project. I was part of the Eclipse Platform Core team in 3.0 (shipped in 2004) and even though we were having lots of fun with the move to OSGi and the birth of Equinox, it was a lot of work having to implement the new functionality and at the same time make sure all the existing use cases continued to work. And, as usual, some corner cases we missed were only discovered close to the release date, or even right after, when most people will finally migrate from the previous release. Many of the OSGi-aware features were only exposed by the plug-in development tooling in the subsequent releases. And even though we felt like all that backward compatibility effort was draining a lot of our time and energy, users would still get mad at us for introducing regressions, when they didn&#8217;t really give a damn about <a href="http://eclipse.org/equinox/" target="_blank">OSGi</a> or <a href="http://wiki.eclipse.org/index.php/Rich_Client_Platform">RCP</a>.</p>
<p>In hindsight, it is clear that all that work paid off when you look at the impact that OSGi and RCP had in the growth of Eclipse way beyond the realm of IDE frameworks. People are using Eclipse as a platform for embedded and <a href="http://http://springsource.com/products/suite/applicationplatform" target="_blank">server-side</a> applications, or <a href="http://www.rssowl.org" target="_blank">rich client applications</a> you could swear were native. OSGi itself had a boom in adoption (and features) since when it was adopted in Eclipse and moved from niche  technology into the mainstream.</p>
<p>I am sure the same is going to happen with <a href="http://wiki.eclipse.org/Equinox_p2" target="_blank">P2</a>, probably in smaller proportions (given its scope). We will be taking its features for granted two years from now, and the pain of change will have been long forgotten. And the good people developing P2 know that. But, this time around I am&#8230;</p>
<p><strong>&#8230;on the other side of the fence</strong></p>
<p>The plan of shipping <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> 1.0 (scheduled for June 30th) on top of Eclipse 3.4 (scheduled for late June &#8211; yes, that should have raised a flag) proved to be quite a challenge. I have had minor problems with the latest Eclipse SDK milestones, which I could work around, but more recently I have faced more serious, blocking issues. And even the non-blocking problems and difficulties, which are just time wasters, grow in importance when you are in a tight schedule.</p>
<p>So I stepped back and decided to and develop and ship the TextUML Toolkit 1.0 on Eclipse 3.3, which was last year&#8217;s release. It was not an easy decision, as I will be missing many improvements and fixes (some of them to pretty significant issues) made in the <a href="http://eclipse.org/uml2/" target="_blank">UML2</a> and <a href="http://eclipse.org/emf/" target="_blank">EMF</a> components, which are the main requirements. But at least I should be able to move forward in a more predictable pace, and be more confident I have a chance of meeting the June 30th deadline, even if quality might suffer. On the bright side, thanks to backward compatibility, the same update site should still work with 3.4, so users using the Update Manager/P2 in Eclipse 3.4 should be able to install the TextUML Toolkit features, and get better performance and stability.</p>
<p>What makes me feel good is that <a href="http://www.eclipse.org/eclipse/development/eclipse_project_plan_3_4.html#Compatibility" target="_blank">backward compatibility</a> continues to be one of the Eclipse key values (e4 rumors aside), so regressions receive high priority and are fixed as quickly as possible. The least we (end-users and product providers) can do is to diligently <a href="http://bugs.eclipse.org/bugs" target="_blank">report them</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/06/18/the-bleeding-edge-not-for-the-faint-of-heart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit &#8211; Layout control for class diagrams</title>
		<link>http://abstratt.com/blog/2008/06/11/textuml-toolkit-layout-control-for-class-diagrams/</link>
		<comments>http://abstratt.com/blog/2008/06/11/textuml-toolkit-layout-control-for-class-diagrams/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 06:41:14 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[30-day challenge]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Graphviz]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/06/11/textuml-toolkit-layout-control-for-class-diagrams/</guid>
		<description><![CDATA[Contrary to my original intention of working this week on code generation and the sample application, I have been doing some improvements in the graphical visualization of UML models in EclipseGraphviz. EclipseGraphviz (a spin-off of the TextUML Toolkit) is an open source component (EPL) that integrates Graphviz into Eclipse, and among other things, can generate [...]]]></description>
			<content:encoded><![CDATA[<p>Contrary to my <a href="http://abstratt.com/blog/2008/06/04/textuml-toolkit-commitments-for-the-30-day-challenge/">original intention</a> of working this week on code generation and the sample application, I have been doing some improvements in the graphical visualization of UML models in <a href="http://eclipsegraphviz.sf.net" target="_blank">EclipseGraphviz</a>. EclipseGraphviz (<a href="http://abstratt.com/blog/2007/08/23/a-detour-from-a-detour-from-a-detour-or-how-a-graphical-viewing-framework-for-eclipse-was-born/">a spin-off</a> of the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a>) is an open source component (EPL) that integrates <a href="http://graphviz.org" target="_blank">Graphviz</a> into Eclipse, and among other things, can generate UML class diagrams from <a href="http://wiki.eclipse.org/MDT-UML2" target="_blank">Eclipse UML2</a> models on the fly.</p>
<p>After fixing a <a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1986114&amp;group_id=201477&amp;atid=977719" target="_blank">couple</a> of <a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1986112&amp;group_id=201477&amp;atid=977719" target="_blank">bugs</a>, I decided to add a preference page to give some level of control over the way the diagrams are laid out. Here is what it looks like:</p>
<p><img src="http://abstratt.com/blog/wp-content/uploads/2008/06/eg-pref-page1.png" alt="" width="492" height="237" /></p>
<p>You can now turn on or off several adornments such as association end names, multiplicities and membership. For example, this diagram was rendered using the options shown above:</p>
<p><img src="http://abstratt.com/blog/wp-content/uploads/2008/06/eg-pref-page-demo-11.png" alt="" width="627" height="269" /></p>
<p>Whereas the following one was rendered for the same model while having only  the &#8220;Create constraints for association navigability&#8221; option checked:</p>
<p><img src="http://abstratt.com/blog/wp-content/uploads/2008/06/eg-pref-page-demo-01.png" alt="" width="517" height="284" /></p>
<p>As you can see, enabling constraints based on association navigability can significantly alter the diagram layout. One good reason for enabling that option is to avoid diagrams that grow too much horizontally (as Graphviz will put all nodes of the same rank on the same row), but I personally prefer the former layout.</p>
<p>Side note: I considered dropping the graphical visualization feature altogether for 1.0, as I see it as just a nice to have, and am not totally happy with the quality of the diagrams generated by Graphviz. But every bit of feedback I got for the TextUML Toolkit was that the graphical visualization was really nice, so I changed my mind. But unless serious bugs are found in this area, I have no plans of touching the EclipseGraphviz code again until after I complete the <a href="http://abstratt.com/blog/category/30day/">30-day challenge</a>.</p>
<p>Side note #2: I expanded the <a href="http://abstratt.com/docs/index.php?title=FAQ">FAQ</a> to cover the issue of notation choice and the role of EclipseGraphviz in the TextUML Toolkit.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/06/11/textuml-toolkit-layout-control-for-class-diagrams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit &#8211; Progress on the sample application</title>
		<link>http://abstratt.com/blog/2008/06/06/textuml-toolkit-progress-on-the-sample-application/</link>
		<comments>http://abstratt.com/blog/2008/06/06/textuml-toolkit-progress-on-the-sample-application/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 07:48:56 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[30-day challenge]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/06/06/textuml-toolkit-progress-on-the-sample-application/</guid>
		<description><![CDATA[Took a first stab at creating the model for the sample application for the TextUML Toolkit. As I wrote here before, the sample application is derived from Sun&#8217;s Java Pet Store application. Take a look at the models, and let me know how the textual notation feels. It is late and I am tired, so [...]]]></description>
			<content:encoded><![CDATA[<p>Took a first stab at creating <a href="http://abstratt.com/docs/index.php?title=Pet_Store_Example">the model for the sample application</a> for the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a>. As I <a href="http://abstratt.com/blog/2008/06/04/textuml-toolkit-commitments-for-the-30-day-challenge/">wrote here</a> before, the sample application is derived from Sun&#8217;s <a href="https://blueprints.dev.java.net/petstore/" target="_blank">Java Pet Store</a> application. <a href="http://abstratt.com/docs/index.php?title=Pet_Store_Example">Take a look at the models</a>, and let me know how the textual notation feels.</p>
<p>It is late and I am tired, so it is very likely I have made at least a few mistakes (well, not <a href="http://abstratt.com/docs/index.php?title=TextUML_Toolkit_Features#Automatic_compilation">syntactic ones</a>, as the tool tells me about those). Of course, when I start working towards generating the code from the models, I am sure any mistakes I made will quickly emerge.</p>
<p>Cheers,</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/06/06/textuml-toolkit-progress-on-the-sample-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit M5 is now available</title>
		<link>http://abstratt.com/blog/2008/06/04/textuml-toolkit-m5-is-now-available/</link>
		<comments>http://abstratt.com/blog/2008/06/04/textuml-toolkit-m5-is-now-available/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 04:01:19 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/06/04/textuml-toolkit-m5-is-now-available/</guid>
		<description><![CDATA[M5 is now available. You can download a self-contained product install, or use the Eclipse update mechanism for adding the TextUML Toolkit to your Eclipse SDK (3.3 or 3.4), on Windows, Mac OS X or Linux. Please see instructions on the download page. This milestone was mostly about bug fixing (including a performance bug), but [...]]]></description>
			<content:encoded><![CDATA[<p>M5 is now available. You can download a self-contained product install, or use the Eclipse update mechanism for adding the TextUML Toolkit to your Eclipse SDK (3.3 or 3.4), on Windows, Mac OS X or Linux. Please see instructions on the <a href="http://abstratt.com/textuml/download.html">download page</a>.</p>
<p>This milestone was mostly about bug fixing (including a performance bug), but it also included a minor architectural change: graphical visualization is now optional, and supports different implementations.</p>
<p>This is the list of bug fixes:</p>
<table border="0" cellspacing="0" frame="void" rules="none">
<tbody>
<tr>
<th width="42" height="20" align="left">id</th>
<th width="10" align="left"></th>
<th width="400" align="left">summary</th>
</tr>
<tr>
<td>171</td>
<td></td>
<td>ClassCastException if an interface has an implements section</td>
</tr>
<tr>
<td>172</td>
<td></td>
<td>ClassCastException if tagged value does not match property&#8217;s type</td>
</tr>
<tr>
<td>173</td>
<td></td>
<td>NPE for invalid input</td>
</tr>
<tr>
<td>174</td>
<td></td>
<td>resource leak in TextUML  Source Viewer</td>
</tr>
<tr>
<td>175</td>
<td></td>
<td>EmptyStackException whn multiple duplicate named elements exist</td>
</tr>
<tr>
<td>176</td>
<td></td>
<td>CoreException when cleaning up file that is use on Windows</td>
</tr>
<tr>
<td>177</td>
<td></td>
<td>show annotations for packages in source viewer</td>
</tr>
<tr>
<td>178</td>
<td></td>
<td>decouple TextUML source editor from the EclipseGraphviz viewer</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/06/04/textuml-toolkit-m5-is-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit &#8211; Commitments for the 30 day challenge</title>
		<link>http://abstratt.com/blog/2008/06/04/textuml-toolkit-commitments-for-the-30-day-challenge/</link>
		<comments>http://abstratt.com/blog/2008/06/04/textuml-toolkit-commitments-for-the-30-day-challenge/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 07:58:24 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[30-day challenge]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/06/04/textuml-toolkit-commitments-for-the-30-day-challenge/</guid>
		<description><![CDATA[As I mentioned before, I joined the 30 day product challenge with the TextUML Toolkit. Of the benefits of being part of the challenge, the ones that most attract me are the sense of being part of something greater, and the motivational power of peer pressure (even if imaginary) and fear of public failure. With [...]]]></description>
			<content:encoded><![CDATA[<p>As I <a href="http://abstratt.com/blog/2008/05/30/30-day-challenge-the-road-to-textuml-toolkit-10/">mentioned before</a>, I joined the 30 day product challenge with the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a>. Of the benefits of being part of the challenge, the ones that most attract me are the sense of being part of something greater,  and the motivational power of peer pressure (even if imaginary) and fear of public failure. With that in mind, these are my commitments for the challenge:</p>
<p><strong>Phase 1 &#8211; June 1st to June 15th:</strong></p>
<p>Focus on finishing development and examples.</p>
<ul>
<li>publish the milestone 5 of the TextUML Toolkit (M5) (<strong>done</strong>)</li>
<li>making UML graphical visualization an optional component (<strong>done</strong>)</li>
<li>publish an example application
<ul>
<li>model &#8211; probably a subset of the <a href="https://blueprints.dev.java.net/petstore/" target="_blank">Java Pet Store</a> app</li>
<li>code generation templates &#8211; probably using <a href="http://acceleo.org" target="_blank">Acceleo</a></li>
</ul>
</li>
<li>should target Eclipse 3.4 (<strong>done</strong> &#8211; M5 can be installed on Eclipse 3.4 or 3.3, but download will continue to bundle 3.3 due to lack of tool support for product creation in the new software update mechanism available in Eclipse 3.4)</li>
<li>bug fixing (continuously)</li>
<li>improve documentation (continuously)</li>
<li>publish Release Candidate 1 on June 15th</li>
<li>development freeze</li>
</ul>
<p><strong>Phase 2 &#8211; June 16th to June 30th:</strong></p>
<p>Focus on polishing and getting it out of the door.</p>
<ul>
<li>major/critical bugs</li>
<li>minor bugs/polish items</li>
<li>improve documentation (continuously)</li>
<li>artwork
<ul>
<li>icons for TextUML source files, new project wizard  (outsource)</li>
<li>website (images, skins)*</li>
</ul>
</li>
<li>legal stuff
<ul>
<li>make sure we comply with all licenses for any bundled open source software</li>
<li>legal notices using Eclipse branding</li>
<li>beef up license (no redistribution, no reverse engineering)</li>
</ul>
</li>
<li>PR (go easy, this is 1.0) &#8211; <a href="http://www.eclipseplugincentral.com/Web_Links-index-req-viewlink-cid-1229.html" target="_blank">EPIC</a>, announcement-friendly developer forums</li>
<li>one active beta-tester</li>
<li>one early adopter*</li>
<li>screencasts (this is a biggie)
<ul>
<li> creating a UML model using the TextUML Toolkit</li>
<li>generating code using Acceleo</li>
</ul>
</li>
<li>RC3 on June 29th</li>
<li><strong>declare 1.0 on Monday June 30th</strong></li>
</ul>
<p><em>* marks nice-to-have items</em></p>
<p>There you go. You, my readers (yes, both of you), can now hold me accountable if I fail to accomplish any of the work items I committed to do above.</p>
<p>To my fellow <a href="http://feeds.feedburner.com/30dayers" target="_blank"><em>30-dayers</em></a>: good luck to us all. It will be fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/06/04/textuml-toolkit-commitments-for-the-30-day-challenge/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>When UML meets Slashdot</title>
		<link>http://abstratt.com/blog/2008/06/02/when-uml-meets-slashdot/</link>
		<comments>http://abstratt.com/blog/2008/06/02/when-uml-meets-slashdot/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 06:28:36 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/06/02/when-uml-meets-slashdot/</guid>
		<description><![CDATA[There was a recent thread about UML on Slashdot, as a reaction to this blog post . The headline: &#8220;Is UML Really Dead, Or Only Cataleptic?&#8220;. Many posters are clearly bitter towards UML. There seems to be a strong preference for using UML as a communication tool as opposed to as a basis for partial [...]]]></description>
			<content:encoded><![CDATA[<p>There was a <a href="http://developers.slashdot.org/developers/08/05/31/1726208.shtml" target="_blank">recent thread about UML</a> on Slashdot, as a reaction to <a href="http://littletutorials.com/2008/05/15/13-reasons-for-umls-descent-into-darkness/" target="_blank">this blog post</a> . The headline: &#8220;<em>Is UML Really Dead, Or Only Cataleptic?</em>&#8220;. Many posters are clearly bitter towards UML. There seems to be a strong preference for using UML as a communication tool as opposed to as a basis for partial or full code generation (see post on <a href="http://abstratt.com/blog/2007/05/12/uml-modes-and-tools/">UML modes</a>). Many also complain that the graphical notation is cumbersome and that it hurts productivity (<a href="http://abstratt.com/blog/2008/05/05/why-we-write-code-and-dont-just-draw-diagrams/">+1</a>!). A few actually like UML; however, it is said that the UML specification is vast and complex and that you should pick the parts of UML that make sense for your case/goals (+1 here too).</p>
<p>Lots of interesting points, but the most negative posts are just misinformed. But that is Slashdot, what should I expect? Java and Eclipse have,  in general, a poor receptivity on Slashdot, so I guess UML is in good company.</p>
<p>Of course, while I disagree with those that ditch UML because it was not properly employed in some project they worked, I strongly agree with the complaints about UML (graphical) diagrams being cumbersome and hard to deal with, as I have written <a href="http://abstratt.com/blog/2008/05/05/why-we-write-code-and-dont-just-draw-diagrams/">here before</a>. But that is not a problem with UML per se, but with the fact most still see it as a graphical language.</p>
<p>UML certainly has its share of problems (design by committee, no reference implementation), but I strongly believe it is very useful and that there isn&#8217;t anything out there (I am talking to you, home grown DSLs) that can replace it as the lingua franca for model-driven development.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/06/02/when-uml-meets-slashdot/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>30-day challenge: the road to TextUML Toolkit 1.0</title>
		<link>http://abstratt.com/blog/2008/05/30/30-day-challenge-the-road-to-textuml-toolkit-10/</link>
		<comments>http://abstratt.com/blog/2008/05/30/30-day-challenge-the-road-to-textuml-toolkit-10/#comments</comments>
		<pubDate>Sat, 31 May 2008 02:55:59 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[30-day challenge]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/05/30/30-day-challenge-the-road-to-textuml-toolkit-10/</guid>
		<description><![CDATA[I decided to join a group of fellow mISVers in the 30-day product challenge. Differently from most of the other entries, which will go from product idea to release in 30 days, the TextUML Toolkit has been in development for quite a while now, so my challenge will be to finally ship the first release [...]]]></description>
			<content:encoded><![CDATA[<p>I decided to join a group of fellow <a href="http://en.wikipedia.org/wiki/Micro_ISV" target="_blank">mISVers</a> in the <a href="http://30dayproductchallenge.com/30day" target="_blank">30-day product challenge</a>. Differently from most of the other entries, which will go from product idea to release in 30 days, the <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> has been in development for quite a while now, so my challenge will be to finally ship the first release of the product.</p>
<p>The challenge starts on June 1st. Watch <a href="http://abstratt.com/blog/">this space</a> for frequent updates as I make progress towards the elusive version 1.0.</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/05/30/30-day-challenge-the-road-to-textuml-toolkit-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Documentation on TextUML</title>
		<link>http://abstratt.com/blog/2008/05/16/documentation-on-textuml/</link>
		<comments>http://abstratt.com/blog/2008/05/16/documentation-on-textuml/#comments</comments>
		<pubDate>Sat, 17 May 2008 01:47:55 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/05/16/documentation-on-textuml/</guid>
		<description><![CDATA[Up until now, the TextUML Toolkit tutorial had been the only piece of documentation available on the TextUML notation. Well, not anymore. I just finished writing some reference documentation on the notation on the wiki. Since I was already at it, I also created a few topics on UML 101 with TextUML (also on the [...]]]></description>
			<content:encoded><![CDATA[<p>Up until now, the <a href="http://abstratt.com/textuml/tutorial/">TextUML Toolkit tutorial</a> had been the only piece of documentation available on the TextUML notation. Well, not anymore. I just finished writing some <a href="http://abstratt.com/docs/">reference documentation on the notation</a> on the wiki. Since I was already at it, I also created a few topics on UML 101 with TextUML (also on the wiki), taking the text from some posts I have written on the <a href="http://abstratt.com/blog/category/uml-101/">topic</a>.</p>
<p>Any issues or suggestions for the documentation are most welcome.</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/05/16/documentation-on-textuml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>M4 has left the building!</title>
		<link>http://abstratt.com/blog/2008/05/06/m4-has-left-the-building/</link>
		<comments>http://abstratt.com/blog/2008/05/06/m4-has-left-the-building/#comments</comments>
		<pubDate>Wed, 07 May 2008 01:11:43 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/05/06/m4-has-left-the-building/</guid>
		<description><![CDATA[M4 has been declared. If you got the M4 test build that was announced a week ago, no need to download again, it is the same build. Please see that post for a summary of the changes. The TextUML tutorial has been updated in order to reflect the changes that happened during M4, the most [...]]]></description>
			<content:encoded><![CDATA[<p>M4 has been declared. If you got the M4 test build that <a href="http://abstratt.com/blog/2008/04/28/textuml-toolkit-m4-test-build-is-now-available/">was announced a week ago</a>, no need to download again, it is the same build. Please see that post for a summary of the changes.</p>
<p>The <a href="http://abstratt.com/textuml/tutorial/">TextUML tutorial</a>  has been updated in order to reflect the changes that happened during M4, the most remarkable one being that starting with M4 <strong>there are no built-in packages</strong> (such as &#8216;base&#8217; and &#8216;base_profile&#8217;) any longer, other than those defined in UML2 itself. So if you were using elements defined in those built-in packages, you have now to define the elements yourself.  The rationale is that the TextUML Toolkit should not be in the business of providing built-in packages nor rely on anything other than standard UML to do its work.</p>
<p>If you didn&#8217;t get the test build, go ahead and <a href="http://abstratt.com/textuml/download.html">download M4</a>. If you want to see a feature in the TextUML Toolkit, now it is the time to ask, as the next milestone will be feature freeze. And if you have tried the Toolkit and decided it is not for you, we would die to know why. Your feedback is greatly appreciated.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/05/06/m4-has-left-the-building/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On code and diagrams</title>
		<link>http://abstratt.com/blog/2008/05/05/on-code-and-diagrams/</link>
		<comments>http://abstratt.com/blog/2008/05/05/on-code-and-diagrams/#comments</comments>
		<pubDate>Mon, 05 May 2008 07:09:03 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/05/05/why-we-write-code-and-dont-just-draw-diagrams/</guid>
		<description><![CDATA[TextUML is a textual notation for UML. The TextUML Toolkit is an Eclipse-based IDE-like tool for creating UML models using the TextUML notation. Other tools follow the same approach. Emfatic (now an EMFT subproject) has been doing the same for EMF Ecore for a long time; the TMF project aims to be for textual modeling [...]]]></description>
			<content:encoded><![CDATA[<p>TextUML is a textual notation for UML. The <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> is an Eclipse-based IDE-like tool for creating UML models using the TextUML notation.</p>
<p>Other tools follow the same approach. <a href="http://wiki.eclipse.org/Emfatic" target="_blank">Emfatic</a> (now an EMFT subproject) has been doing the same for EMF Ecore for a long time; the <a href="http://wiki.eclipse.org/TMF" target="_blank">TMF</a> project aims to be for textual  modeling what <a href="http://www.eclipse.org/gmf/">GMF</a> is for graphical modeling, and will be based on <a href="http://www.eclipse.org/gmt/" target="_blank">GMT</a>&#8216;s <a href="http://wiki.eclipse.org/TCS" target="_blank">TCS</a> and <a href="http://www.eclipse.org/gmt/oaw/doc/4.2/html/contents/xtext_reference.html" target="_blank">xText</a> components.</p>
<p>Still, people are often puzzled when I explain what the TextUML Toolkit is. A common question is: &#8220;<em>if I am going to write code (sic), why do I need UML anyway?</em>&#8220;.</p>
<p>Dean Wampler from Object Mentor wrote on his blog a while ago a post entitled &#8220;<a href="http://blog.objectmentor.com/articles/2007/09/06/why-we-write-code-and-dont-just-draw-diagrams" target="_blank">Why we write code and don&#8217;t just draw diagrams</a>&#8220;. It is a short post, but he presents very good points on why a graphical notation is usually not suficient and is bound to be less productive than a textual one when it comes to modeling details. For instance, on the saying &#8220;<em>a picture is worth a thousand words</em>&#8220;, Dean wrote:</p>
<p>&#8220;<em>What that phrase really means is that we get the &#8216;gist&#8217; or the &#8216;gestalt&#8217; of a situation when we look at a picture, but nothing expresses the intricate details like text, the 1000 words. Since computers are literal-minded and don&#8217;t &#8216;do gist&#8217;, they require those details spelled out explicitly.</em>&#8221;</p>
<p>Couldn&#8217;t have said it better.</p>
<p>I strongly advise you to read the original post in its entirety, but I will leave you with another pearl from Dean&#8217;s post (emphasis is mine):</p>
<p>&#8220;<em>I came to this realization a few years ago when I worked for a Well Known Company developing <span class="caps">UML</span>-based tools for Java developers. The tool&#8217;s UI could have been more efficient, but <strong>there was no way to beat the speed of typing text</strong>.</em>&#8221;</p>
<p>Enough said.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/05/05/on-code-and-diagrams/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit M4 test build is now available</title>
		<link>http://abstratt.com/blog/2008/04/28/textuml-toolkit-m4-test-build-is-now-available/</link>
		<comments>http://abstratt.com/blog/2008/04/28/textuml-toolkit-m4-test-build-is-now-available/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 09:31:54 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/04/28/textuml-toolkit-m4-test-build-is-now-available/</guid>
		<description><![CDATA[The first (and hopefully only) test build for M4 is now available. This is the first milestone where you can get the TextUML Toolkit via Update Manager. Just point Update Manager to: http://abstratt.com/textuml/update/ Actually, if you are planning to use Acceleo or UML2Tools, it is the best approach. From an Eclipse SDK 3.3 install, point [...]]]></description>
			<content:encoded><![CDATA[<p>The first (and hopefully only) test build for M4 is now available. This is the first milestone where you can get the TextUML Toolkit via Update Manager. Just point Update Manager to:</p>
<p><strong>http://abstratt.com/textuml/update/</strong></p>
<p>Actually, if you are planning to use Acceleo or UML2Tools, it is the best approach. From an Eclipse SDK 3.3 install, point the Update Manager to the site above and install the TextUML Toolkit along with its prerequisites (EMF and UML2). Once you are done, you can install any compatible tools, such as Acceleo and/or UML2Tools (sites will be automatically configured after you install the Toolkit and its prerequisites). If you are not planning to use Acceleo, you can start from an Eclipse Platform install, or you can just download the TextUML Toolkit from the <a href="http://abstratt.com/textuml/download.html">download page</a> as usual.</p>
<p>Follows a summary of the changes that went into M4, including features (in bold) and bug fixes.</p>
<table border="0" cellspacing="0" width="95%">
<tr>
<td>Ticket</td>
<td>Summary</td>
</tr>
<tr>
<td>49</td>
<td><strong>prevent creation of duplicated symbols</strong></td>
</tr>
<tr>
<td>102</td>
<td>NPE trying to set value for stereotype property</td>
</tr>
<tr>
<td>143</td>
<td><strong>declare a built-in update site for the textuml toolkit</strong></td>
</tr>
<tr>
<td>145</td>
<td>project creation wizard issues</td>
</tr>
<tr>
<td>164</td>
<td><strong>Support nested packages in TextUMLRenderer</strong></td>
</tr>
<tr>
<td>165</td>
<td>Unexpected exception while compiling &#8211; java.lang.IllegalStateException: deresolve relative URI</td>
</tr>
<tr>
<td>166</td>
<td>spurious empty null.uml or base_profile.uml files being created</td>
</tr>
<tr>
<td>168</td>
<td><strong>integrate a code generator</strong></td>
</tr>
<tr>
<td>169</td>
<td>constant literal assignment is broken</td>
</tr>
</table>
<p>I will be writing on some of those features in following posts.</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/04/28/textuml-toolkit-m4-test-build-is-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lightning Talks at VIJUG</title>
		<link>http://abstratt.com/blog/2008/04/13/lightning-talks-at-aprils-vijug-meeting/</link>
		<comments>http://abstratt.com/blog/2008/04/13/lightning-talks-at-aprils-vijug-meeting/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 05:58:15 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/04/13/lightning-talks-at-aprils-vijug-meeting/</guid>
		<description><![CDATA[The next VIJUG meeting will follow the Lightning Talks format. Last December, I attended the Eclipse Democamp in Vancouver which had a similar format and it was quite dynamic and fast-paced. I am looking forward to VIJUG&#8217;s first meeting using this exciting format. I plan to do a demo on using Acceleo for generating code [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.mosabuam.com/index.php?name=News&amp;file=article&amp;sid=259">next VIJUG meeting</a> will follow the <a href="http://en.wikipedia.org/wiki/Lightning_talk">Lightning Talks</a> format. Last December, I attended the <a href="http://abstratt.com/blog/2007/12/08/eclipse-democamp-in-vancouver/">Eclipse Democamp</a> in Vancouver which had a similar format and it was quite dynamic and fast-paced. I am looking forward to VIJUG&#8217;s first meeting using this exciting format.</p>
<p>I plan to do a demo on using Acceleo for generating code from UML models, of course, using the TextUML Toolkit for modeling, which is what the next milestone (M4) is all about.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/04/13/lightning-talks-at-aprils-vijug-meeting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit at VIJUG</title>
		<link>http://abstratt.com/blog/2008/03/26/textuml-toolkit-at-vijug/</link>
		<comments>http://abstratt.com/blog/2008/03/26/textuml-toolkit-at-vijug/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 09:18:16 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/03/26/textuml-toolkit-at-vijug/</guid>
		<description><![CDATA[I will be presenting the TextUML Toolkit at this month&#8217;s Vancouver Island Java User Group meeting. If you are in the Victoria area, I hope to see you there. It is free, and there will be pizza and drinks. Oh, and there will be a cool demo of the toolkit, including code generation using Acceleo [...]]]></description>
			<content:encoded><![CDATA[<p>I will be presenting the <a href="http://abstratt.com/textuml">TextUML Toolkit</a> at this month&#8217;s <a href="http://www.mosabuam.com/index.php?name=News&amp;file=article&amp;sid=256" target="_blank">Vancouver Island Java User Group</a> meeting. If you are in the Victoria area, I hope to see you there. It is free, and there will be pizza and drinks. Oh, and there will be a cool demo of the toolkit, including code generation using <a href="http://acceleo.org" target="_blank">Acceleo</a> and a quick demo on model execution just to give a hint of what comes next after the toolkit goes GA.</p>
<p>Many thanks to Manfred, the JUG leader, for organizing the meeting, and to <a href="http://genologics.com" target="_blank">Genologics</a> for sponsoring it!</p>
<p><em><strong>UPDATE</strong>: the meeting was great </em><em>(slides <a href="http://abstratt.com/blog/wp-content/uploads/2008/03/vijug-200803261.swf">here</a>)</em><em>, got lots of interesting questions and comments, and many in the audience liked the idea of using a textual notation for UML. A bit harder to get buy-in for the idea of <a href="http://abstratt.com/blog/2007/05/12/uml-modes-and-tools/">UML as programming language</a>. I guess I will need to show something running to get that across too&#8230; <img src='http://abstratt.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  </em></p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/03/26/textuml-toolkit-at-vijug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit is now available on multiple platforms</title>
		<link>http://abstratt.com/blog/2008/03/03/textuml-toolkit-is-now-available-on-multiple-platforms/</link>
		<comments>http://abstratt.com/blog/2008/03/03/textuml-toolkit-is-now-available-on-multiple-platforms/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 08:17:27 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/03/03/textuml-toolkit-is-now-available-on-multiple-platforms/</guid>
		<description><![CDATA[The latest milestone (M3) of the TextUML Toolkit has been declared today, as promised earlier here. As I said before, the focus for this milestone was stability and performance, so you can expect a much snappier and more solid tool. But it also includes some cool new features: you can drop UML2 models created elsewhere [...]]]></description>
			<content:encoded><![CDATA[<p>The latest milestone (M3) of the TextUML Toolkit has been declared today, as <a href="http://abstratt.com/blog/2008/02/28/textuml-toolkit-m3-test-build-is-available/">promised earlier here</a>. As I said before, the focus for this milestone was stability and performance, so you can expect a much snappier and more solid tool. But it also includes some cool new features:</p>
<ul>
<li>you can <strong>drop UML2 models created elsewhere</strong> into a MDD project and you can use them from your TextUML code as you would with models created using the Toolkit</li>
<li>you can even <strong>decompile a UML2 model</strong> and read it using the TextUML syntax with the TextUML Viewer (which takes over as the default editor for *.uml files)</li>
<li>you can <strong>auto-format</strong> the current compilation unit with Ctrl-Shift-F</li>
<li>and last but not least:<strong> Linux and Mac OS X  (Power PC and Intel) are now supported</strong></li>
</ul>
<p>The main reason for this focus on performance and robustness is that the tool must be something that people can rely upon and become productive with. From now on, real user demand must drive the addition of any new features and bug fixing efforts. <strong>So now it is your turn. </strong>Download the TextUML Toolkit and start using it for creating your UML models. It is free! If you like the approach of modeling using a textual notation, I am sure you will enjoy it. And even if you haven&#8217;t bought the idea yet, give it a try. I would be more than glad of hearing your  suggestions and opinions. And more importantly, will make sure that any problems reported will be promptly addressed.</p>
<p>Looking forward to your comments, either here or <strike>by e-mail</strike> <a href="http://abstratt.com/forums/">on the Abstratt forum</a>. Cheers.</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/03/03/textuml-toolkit-is-now-available-on-multiple-platforms/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TextUML Toolkit M3 test build is available!</title>
		<link>http://abstratt.com/blog/2008/02/28/textuml-toolkit-m3-test-build-is-available/</link>
		<comments>http://abstratt.com/blog/2008/02/28/textuml-toolkit-m3-test-build-is-available/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 06:26:10 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/02/28/textuml-toolkit-m3-test-build-is-available/</guid>
		<description><![CDATA[A TextUML Toolkit M3 test build is now available from the download page. If no serious issues are found in this build, it will be declared the final M3 build later this week. The focus for this milestone was to improve the performance, memory footprint and stability of the tool, and very good progress was [...]]]></description>
			<content:encoded><![CDATA[<p>A TextUML Toolkit M3 test build is now available from the <a href="http://abstratt.com/textuml/download.html">download</a> page. If no serious issues are found in this build, it will be declared the final M3 build later this week.</p>
<p>The focus for this milestone was to improve the performance, memory footprint and stability of the tool, and very good progress was made in those areas. But there are also some brand new features, mostly in the area of integration with existing UML models. You can now safely add existing UML2 UML models (built elsewhere) to the project root and they will become available to the textual notation. Another cool feature in this area is that you can now double-click any existing UML2 UML model and read it using the textual notation (think &#8220;UML decompiler&#8221;). See below the sample model from <a href="http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Getting_Started_with_UML2/article.html" target="_blank">Getting Started with UML2</a> in both textual and graphical notations:</p>
<p><a href="http://abstratt.com/blog/wp-content/uploads/2008/02/textuml-toolkit-10m3-test-full1.png"><img src="http://abstratt.com/blog/wp-content/uploads/2008/02/textuml-toolkit-10m3-test-small1.png" alt="click for a full screenshot" /></a></p>
<p>Would you like to take a look? <a href="http://abstratt.com/textuml/download.html">Grab the M3 test build</a>, and give it a try. Please report here any problems and leave your comments. As usual, your feedback is really appreciated.</p>
<p><strong>UPDATE: </strong>If the diagrams don&#8217;t show and everything else seems to work, you probably need the <a href="http://www.microsoft.com/downloads/details.aspx?familyid=32bc1bee-a3f9-4c13-9c99-220b62a191ee&amp;displaylang=en" target="_blank">Visual C++ Redistributable package</a> from Microsoft. This is a limitation that seemed to be recently introduced with the Graphviz support on Windows and the Graphviz team <a href="http://www.graphviz.org/Download_windows.php" target="_blank">is looking</a> into this issue. Sorry for the inconvenience.</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/02/28/textuml-toolkit-m3-test-build-is-available/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Textual notations and UML compliance</title>
		<link>http://abstratt.com/blog/2008/02/07/textual-notations-and-uml-compliance/</link>
		<comments>http://abstratt.com/blog/2008/02/07/textual-notations-and-uml-compliance/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 06:22:42 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[editorial]]></category>
		<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/02/07/textual-notations-and-uml-compliance/</guid>
		<description><![CDATA[One common misconception is that UML is a graphical language and that any tools adopting alternative notations (such as a textual one) are inherently non-compliant. That can&#8217;t be farther from the truth. Read on to understand. The fact is that the UML specification clearly separates abstract syntax (the kinds of elements and how they relate) [...]]]></description>
			<content:encoded><![CDATA[<p>One common misconception is that UML is a graphical language and that any tools adopting alternative notations (such as a textual one) are inherently non-compliant. That can&#8217;t be farther from the truth. Read on to understand.</p>
<p>The fact is that the UML specification clearly separates abstract syntax (the kinds of elements and how they relate) and semantics (what they mean) from concrete syntax (what they look like), and states that there are two types of compliance:</p>
<ul>
<li>abstract syntax compliance</li>
<li>concrete syntax compliance</li>
</ul>
<p>Concrete syntax compliance means that users can continue to use a notation they are familiar with across different tools. This is important when UML is used as a communication tool in a team environment. Architects, designers, programmers and even many business analysts speak the same language.</p>
<p>Abstract syntax compliance means that users can move models across different tools, even if they use different notations. This is essential when UML is used as a basis for model-driven development. You might want to use tool A for creating the model, tool B for validating the model, tool C for somehow transforming/enhancing the model and tool D for generating code from it (a common form of MDD <em>tool chain</em>).</p>
<p>The <a href="http://abstratt.com/textuml/">TextUML Toolkit</a> uses a textual notation that strictly exposes the UML semantics, but it is not compliant with the language concrete syntax by any means. On the other hand, the toolkit uses Eclipse UML2&#8242;s XMI flavor for persisting models and thus is fully compliant regarding the abstract syntax. That is consistent with the vision for the product: a tool from developers for developers that want to build software in a more sane way: the model-driven way. Developers can create models using a notation they are more productive with. Models can then be used as input for code generation using many of the tools available in the market. If non-developers might frown upon a textual modeling notation, they will always have the option of using their favorite graphical-notation based tools for reading the models. I mean, if their tool of choice is abstract syntax compliant as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/02/07/textual-notations-and-uml-compliance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Frequently Asked Questions about the TextUML Toolkit</title>
		<link>http://abstratt.com/blog/2008/01/27/frequently-asked-questions-about-the-textuml-toolkit/</link>
		<comments>http://abstratt.com/blog/2008/01/27/frequently-asked-questions-about-the-textuml-toolkit/#comments</comments>
		<pubDate>Sun, 27 Jan 2008 10:18:34 +0000</pubDate>
		<dc:creator>rafael.chaves</dc:creator>
				<category><![CDATA[TextUML Toolkit]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://abstratt.com/blog/2008/01/27/frequently-asked-questions-about-the-textuml-toolkit/</guid>
		<description><![CDATA[I just added a brand new FAQ section to the web site. It was long overdue. Here is the first batch of questions: Can a tool that uses a textual notation be considered UML compliant? What are the differences between TextUML and the real UML? I thought UML was all about raising the level of [...]]]></description>
			<content:encoded><![CDATA[<p>I just added a <a href="http://abstratt.com/textuml/faq.html">brand new FAQ section</a> to the web site. It was long overdue.</p>
<p>Here is the first  batch of questions:</p>
<ol>
<li> <a href="http://abstratt.com/textuml/faq.html#compliance-types">Can a tool that uses a textual notation be considered UML compliant?</a></li>
<li> <a href="http://abstratt.com/textuml/faq.html#real-uml">What are the differences between TextUML and the <em>real</em> UML?</a></li>
<li> <a href="http://abstratt.com/textuml/faq.html#abstraction">I thought UML was all about raising the level of abstraction. Why should I go back to coding?</a></li>
<li> <a href="http://abstratt.com/textuml/faq.html#pricing">How much does the TextUML Toolkit cost?</a></li>
<li> <a href="http://abstratt.com/textuml/faq.html#open-source">Is the TextUML Toolkit open source?</a></li>
<li> <a href="http://abstratt.com/textuml/faq.html#diagrams">What diagrams can I create with the TextUML Toolkit?</a></li>
</ol>
<p>Do you have any questions that are not answered in the FAQ or do not agree with or understand an answer? Fire your comments, I am always happy to hear from you.</p>
]]></content:encoded>
			<wfw:commentRss>http://abstratt.com/blog/2008/01/27/frequently-asked-questions-about-the-textuml-toolkit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

