<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-34308055</id><updated>2011-04-21T15:21:03.517-07:00</updated><category term='* UML'/><category term='datatypes'/><category term='actions'/><category term='starrUML'/><category term='action language'/><category term='open source'/><category term='data types'/><category term='metamodel'/><category term='progress'/><category term='small'/><category term='types'/><title type='text'>* UML Editor Notes</title><subtitle type='html'>Technical notes written during development of the open source * UML Model Editor and comments on the language itself.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34308055.post-2497104978220235134</id><published>2008-05-28T10:33:00.001-07:00</published><updated>2008-05-28T10:43:47.457-07:00</updated><title type='text'>Moving over to the Patterns Blog</title><content type='html'>As you may have guessed from this rather stagnant blog, I haven't been working on my model editor for a while now.  I have had to focus on getting the rent paid and so my clients are getting all my time these days.  (Believe me, if I had a rich uncle, I would do nothing but work on this, but no luck there I'm afraid!)&lt;br /&gt;&lt;br /&gt;Fortunately, though, progress is being made by my colleague Andrew Mangogna on some useful components that I hope to integrate or merge with eventually.  We've been coordinating closely and I'm very excited about his TclRAL (Tcl Relational Action Language) project.  It started out as an in-memory relational extension to Tcl.  Now there is an object action language on top of that and a nice model compiler/architecture in the works.&lt;br /&gt;&lt;br /&gt;But I think I am going to focus my future posts in two areas right now.  I will start posting in the Patterns Blog (should be a link to it over on the right somewhere).  And I may rename that Blog to include more than just patterns.  Also, as you may have noticed, I am micro-blogging on Twitter.  That way, if I am too lazy to do a proper blog post, at least you can see what I am working on.&lt;br /&gt;&lt;br /&gt;So for now, this blog is going in the deep freeze until I can allocate some serious time to build that action language metamodel.  (Or find a partner that wants to fund my activities!)&lt;br /&gt;&lt;br /&gt;Oh, yes, and one more thing.  I have been spending time creating some exciting new Executable UML courses that are compatible with the tools of multiple vendors.  I am hoping to debut the first as a UC Extension course this fall.&lt;br /&gt;&lt;br /&gt;Okay, so for now, catch me on the other blog and twitter.  Stay in touch!&lt;br /&gt;&lt;br /&gt;- Leon&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-2497104978220235134?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/2497104978220235134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=2497104978220235134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/2497104978220235134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/2497104978220235134'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2008/05/as-you-may-have-guessed-from-this.html' title='Moving over to the Patterns Blog'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34308055.post-2239364273998262115</id><published>2006-10-17T09:44:00.000-07:00</published><updated>2006-10-17T09:46:28.063-07:00</updated><title type='text'>Away but I'm back!</title><content type='html'>Still alive!  I've been working on a model review for one of my clients, but I should have some time this week to push the action meta forward and catch up on the discussion groups.&lt;br /&gt;&lt;br /&gt;- Leon&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-2239364273998262115?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/2239364273998262115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=2239364273998262115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/2239364273998262115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/2239364273998262115'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2006/10/away-but-im-back.html' title='Away but I&apos;m back!'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34308055.post-1903384605468069421</id><published>2006-10-05T23:19:00.000-07:00</published><updated>2006-10-05T23:33:40.130-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='progress'/><category scheme='http://www.blogger.com/atom/ns#' term='action language'/><title type='text'>Progress on the AL metamodel</title><content type='html'>The notes posted here have been a great help in getting the model started.  I've made a lot of progress in the last few days.  For now I am focusing on specification (non-runtime) information.  Three specification subsystems are emerging - Action Blocks, Actions and Flow.  Action Blocks is very small - it just captures the relationship among Operations, States and Services with Action Blocks and Parameters.  Actions specializes what I've been calling "processes" into subclassifications.  The action subclasses are then related to metamodel components like Class, Attribute, Event etc.  For example, the Transmitter Action must specify an Event.  By the way, I'm renaming "Transmitter" to Broadcaster to match the UML action semantics vocabulary.  I keep referring to the UML terminology as much as possible.  Finally, the Flow subsystem captures the graph nature of interconnected Actions.  It consists of classes like Flow Type, Node Type, Pin, Process, Store and so forth.&lt;br /&gt;&lt;br /&gt;Naturally, I will post my models once I have a reviewable baseline.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-1903384605468069421?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/1903384605468069421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=1903384605468069421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/1903384605468069421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/1903384605468069421'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2006/10/progress-on-al-metamodel.html' title='Progress on the AL metamodel'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34308055.post-3927615686593598526</id><published>2006-10-01T20:02:00.000-07:00</published><updated>2006-10-01T20:03:07.936-07:00</updated><title type='text'>Linking and Unlinking</title><content type='html'>&lt;h2&gt;   &lt;span style="FONT-WEIGHT: bold"&gt;&lt;/span&gt;Processes (continued) &lt;/h2&gt; &lt;br/&gt; You may have noticed that relationship linking was not mentioned in the last batch of notes.  It's not like I forgot them - alright I admit it - I forgot them.  But I'm kind of glad I did as a bit of thought was required to sort out this seemingly trivial activity.  And even then, I'm not sure I've got the best plan - but it helps to get things down on virtual paper.  Remember that nothing in this blog is set in stone - just explorations to fuel the modeling activity.  So feel free to register your comments if you think I'm going astray.  Going astray is one of my specialties. &lt;h1&gt;   Linker Processes&lt;br/&gt; &lt;/h1&gt; A &lt;span style="FONT-STYLE: italic"&gt;linker process &lt;/span&gt;creates or modifies links in a relationship.  The link activity described in Mellor/Balcer's Executable UML (p. 120) is a primitive accessor that will be implemented as a core behavior in the metamodel.  The primitive link activity takes two object references and a relationship name.  (Though a perspective must also be specified to create a link on a binary reflexive association).  That, notwithstanding, there is still work to be done before we can supply two distinct object references to our primitive linker. &lt;br/&gt; &lt;br/&gt; Assume that we route two object flows into a linker process.  During run-time, any number of objects may be streaming along a given flow.  Some object flows may come up empty and some may contain too many object references.  How do we match up multiple object references from each flow?  One approach would be to distinguish "single" object flows and stores from "many" object flows and stores.  This is what is done in many executable UML action languages.   Wouldn't it be cool though, if we could shift the burden of the one-many selection/store distinction away from the modeler to the underlying execution model?  The downside is that we must imbue the action execution engine with the smarts to multitudinous disparity in a predictable way.  In that spirit, here we go.  These are the link activities processes that must be supported:&lt;br/&gt; &lt;br/&gt; &lt;ul&gt;   &lt;li&gt;     association linker&lt;/li&gt;   &lt;li&gt;     association unlinker&lt;/li&gt;   &lt;li&gt;     generalized object creator (normal object creator redefined)&lt;br/&gt;&lt;/li&gt;   &lt;li&gt;     generalized object eraser (normal object creator redefined)&lt;br/&gt;&lt;/li&gt;   &lt;li&gt;     reclassifier&lt;br/&gt;&lt;/li&gt; &lt;/ul&gt; &lt;br/&gt; We start using the / symbol to separate a role or informal name from a defined element.  So if we see something like 1 / object_flow, we know that the name or phrase left of the /, "1" in this case, is just an informal name whereas the element on the right has a definition somewhere in the action language notes.  In other words, there is an object_flow named "1".&lt;br/&gt; &lt;h3&gt;   Association Linker&lt;br/&gt; &lt;/h3&gt; Links one object to another (or the same object) on an association.&lt;br/&gt; &lt;br/&gt; Flows In: { status } 1 / object_flow &amp;lt; 2 / object flow &amp;gt;&lt;br/&gt; Flows Out: &amp;lt; association class / object_flow &amp;gt;&lt;br/&gt; Specification: rnum&lt;br/&gt; &lt;br/&gt; Let's explore each variation.&lt;br/&gt; &lt;br/&gt; Binary non-reflexive&lt;br/&gt; ( Dog Owner - 1 - is owned by -- owns - 1..* - Dog )&lt;br/&gt; &lt;br/&gt; The modeler connects two object flows to the linker.  The active perspective will be automatically connected to flow 1 and the other to flow 2.  For example, one object pool might be labeled &lt;span style="FONT-WEIGHT: bold"&gt;lazy_dogs&lt;/span&gt; and the other &lt;span style="FONT-WEIGHT: bold"&gt;new_owner&lt;/span&gt;.  Each generates a seperate object flow into the linker.&lt;br/&gt; &lt;br/&gt; Binary reflexive&lt;br/&gt; ( Aircraft - 0..1 - takes off after -- takes off before - 0..1 - Aircraft )&lt;br/&gt; &lt;br/&gt; The modeler specifies which direction to link by routing the active perspective to flow 1 and the passive perspective to flow 2.  This cannot be determined automatically, so it is up the modeler to set these as intended.  For example, assuming that "takes off before" is the active perspective (arbitrarily in this case), the flow for &lt;span style="FONT-WEIGHT: bold"&gt;aircraft_entering_queue&lt;/span&gt; would go to flow 1 and the &lt;span style="FONT-WEIGHT: bold"&gt;last_in_queue&lt;/span&gt; flow would be 2.&lt;br/&gt; &lt;br/&gt; Unary (symmetric reflexive) association&lt;br/&gt; ( Territory - 1..* -- borders )&lt;br/&gt; &lt;br/&gt; Since the perspective is symmetric it doesn't matter which flow is 1 or 2.  If, for example, we link Territory &lt;span style="FONT-WEIGHT: bold"&gt;Brazil &lt;/span&gt;to &lt;span style="FONT-WEIGHT: bold"&gt;Venezuela &lt;/span&gt;on "borders" it's means exactly the same as if we did the reverse.&lt;br/&gt; &lt;br/&gt; Cyclic link&lt;br/&gt; To link an object to itself on a binary reflexive or unary association only one input flow, object flow 1, is required.  It is the same result as flowing two different reference to the same object on the 1 and 2 inputs.&lt;br/&gt; &lt;h3&gt; Perspective Multiplicity and Flow Cardinality &lt;/h3&gt; Consider the 1, 2 object flow inputs into the association linker.  Either object flow could be empty, contain a single object reference or stream multiple object references during run-time.  Lets refer to the empty, single and multiple quantities of object references as the cardinality of the flow.  How should the linker connect the objects from each stream given each possible mix of cardinality?&lt;br/&gt; &lt;br/&gt; The empty case is easily squared away.  If at least one input is empty then no links can be made since we always link objects referred to in flow 1 with those in flow 2.  The only exception is the cyclic link case mentioned earlier.  In this case input 2 is not used and no link is made if input 1 is empty.&lt;br/&gt; &lt;br/&gt; This leaves us with these flow cardinality combinations for inputs 1,2:  (1, 1), (1, 2..*), (2..*, 1), and (2..*, 2..*).  Before we can determine how to link the objects referenced in the paired flows, we need to know the multiplicity of the corresponding perspective of each flow.&lt;br/&gt; &lt;blockquote&gt; First, a quick aside regarding association perspectives.  In * UML, the "binary" in binary association does not refer to the class on each side.  That is because, in the case of a reflexive binary association, there is only one class, e.g. Plane takes off after Plane.  Instead "binary" refers to the two perspectives on the association, e.g. takes off before / takes off after.  In the metamodel we needed a way to distinguish between each perspective.  We could have used a generic label such as the A and B perspective but that's not very descriptive.  Most of the time (in English, at least) we can distinguish the active and passive voice.  For the perspectives "owns" and "is owned by", for example, we recognize "owns" as the active side.  This rule doesn't always work.  The perspectives "is before / is after" are both active.  But this is a less frequent situation and we are no worse off than the A/B labeling solution.&lt;br/&gt; &lt;/blockquote&gt; Now if we follow the convention of running the object flow corresponding to the active perspective into flow input 1 on the linker with the passiver perspective object flow going into input 2, it is easier to describe how the objects will be linked.  In the table below we cross all flow combinations with all perspective multiplicities.  Conditionality (0..1, 0..*) is removed from consideration so we are just looking at pure multiplicity in the leftmost column.  So S means single (0..1 or 1) and M means many (* or 1..*).&lt;br/&gt; &lt;br/&gt; &lt;div&gt; &lt;table border="2" cellpadding="2" cellspacing="0" cols="7" frame="void" rules="groups" style="WIDTH: 402px; HEIGHT: 136px"&gt; &lt;colgroup&gt;&lt;col width="110"&gt;&lt;col width="59"&gt;&lt;col width="7"&gt;&lt;col width="59"&gt;&lt;col width="88"&gt;&lt;col width="81"&gt;&lt;col width="73"&gt;&lt;/colgroup&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td align="left" height="17" width="110"&gt; &lt;br/&gt; &lt;/td&gt; &lt;td align="left"&gt; &lt;br/&gt; &lt;/td&gt; &lt;td align="left" width="6"&gt; &lt;br/&gt; &lt;/td&gt; &lt;td align="left" colspan="4" height="19"&gt; &lt;b&gt;Flow Cardinality (1, 2)&lt;/b&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;tr height="23"&gt;       &lt;td align="left" height="23"&gt;         &lt;br/&gt;       &lt;/td&gt;       &lt;td align="center" height="23" nowrap="nowrap"&gt;         &lt;br/&gt;       &lt;/td&gt;       &lt;td align="left" height="23" width="6"&gt;         &lt;br/&gt;       &lt;/td&gt;       &lt;td align="center" height="23" nowrap="nowrap" sdnum="1033;0;@"&gt;         1, 1       &lt;/td&gt;       &lt;td align="center" height="23" nowrap="nowrap" sdnum="1033;0;@"&gt;         1, 2..*       &lt;/td&gt;       &lt;td align="center" height="23" nowrap="nowrap" sdnum="1033;0;@"&gt;         2..*, 1       &lt;/td&gt;       &lt;td align="center" height="23" nowrap="nowrap" sdnum="1033;0;@"&gt;         2..*, 2..*       &lt;/td&gt;     &lt;/tr&gt;     &lt;tr height="48"&gt;       &lt;td align="left" height="48"&gt;         &lt;b&gt;Mult (a,p)&lt;/b&gt;       &lt;/td&gt;       &lt;td align="center" height="48" nowrap="nowrap" sdnum="1033;0;@"&gt;         S, S&lt;br/&gt;       &lt;/td&gt;       &lt;td align="left" height="48" width="6"&gt;         &lt;br/&gt;       &lt;/td&gt;       &lt;td align="center" height="48" nowrap="nowrap"&gt;         &lt;b&gt;&lt;span style="color:#008000;"&gt;one-&amp;gt;one&lt;/span&gt;&lt;/b&gt;       &lt;/td&gt;       &lt;td align="center" height="48" nowrap="nowrap"&gt;         &lt;span style="color:#808080;"&gt;one-&amp;gt;one&lt;/span&gt;       &lt;/td&gt;       &lt;td align="center" height="48" nowrap="nowrap"&gt;         &lt;span style="color:#808080;"&gt;one-&amp;gt;one&lt;/span&gt;       &lt;/td&gt;       &lt;td align="center" height="48" nowrap="nowrap"&gt;         &lt;b&gt;&lt;span style="color:#800000;"&gt;{ one-&amp;gt;one }&lt;/span&gt;&lt;/b&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td align="left" height="17"&gt;         &lt;br/&gt;       &lt;/td&gt;       &lt;td align="center" nowrap="nowrap" sdnum="1033;0;@"&gt;         S, M       &lt;/td&gt;       &lt;td align="left" width="6"&gt;         &lt;br/&gt;       &lt;/td&gt;       &lt;td align="center" nowrap="nowrap"&gt;         &lt;span style="color:#808080;"&gt;one-&amp;gt;one&lt;/span&gt;       &lt;/td&gt;       &lt;td align="center" nowrap="nowrap"&gt;         &lt;b&gt;&lt;span style="color:#008000;"&gt;one-&amp;gt;all&lt;/span&gt;&lt;/b&gt;       &lt;/td&gt;       &lt;td align="center" height="17" nowrap="nowrap"&gt;         &lt;span style="color:#808080;"&gt;first-&amp;gt;one&lt;/span&gt;       &lt;/td&gt;       &lt;td align="center" nowrap="nowrap"&gt;         &lt;span style="color:#808080;"&gt;first-&amp;gt;all&lt;/span&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td align="left" height="17"&gt;         &lt;br/&gt;       &lt;/td&gt;       &lt;td align="center" nowrap="nowrap" sdnum="1033;0;@"&gt;         M, M       &lt;/td&gt;       &lt;td align="left" width="6"&gt;         &lt;br/&gt;       &lt;/td&gt;       &lt;td align="center" nowrap="nowrap"&gt;         &lt;span style="color:#808080;"&gt;one-&amp;gt;one&lt;/span&gt;       &lt;/td&gt;       &lt;td align="center" nowrap="nowrap"&gt;         &lt;span style="color:#808080;"&gt;one-&amp;gt;all&lt;/span&gt;       &lt;/td&gt;       &lt;td align="center" height="17" nowrap="nowrap"&gt;         &lt;span style="color:#808080;"&gt;all-&amp;gt;one&lt;/span&gt;       &lt;/td&gt;       &lt;td align="center" nowrap="nowrap"&gt;         &lt;b&gt;&lt;span style="color:#008000;"&gt;all X all&lt;/span&gt;&lt;/b&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;/tbody&gt;   &lt;/table&gt; &lt;/div&gt; &lt;br/&gt; The plan is to link as many objects together as possible given the supply of object references.  The normal (intended use) cases are highlighted in green.  Possibly useful in, uh maroon? and shaded for those of doubtful utility.  Let's look at the normal cases first.&lt;br/&gt; &lt;br/&gt; The association multiplicity and flow cardinality matches in each of the normal cases.&lt;br/&gt; &lt;br/&gt; Multiplicity (S, S) - Flow (1, 1)&lt;br/&gt; A pair of object references arrives, one on each flow.  The object referenced in flow 1 is linked to the object referenced in flow 2.&lt;br/&gt; &lt;br/&gt; Multiplicity (S, M) - Flow (1, 2..*)&lt;br/&gt; The single multiplicity corresponds to the single object flow and the many multiplicity corresponds to the multiple object flow.  The single object referenced in flow 1 is linked to all objects referenced in flow 2.&lt;br/&gt; &lt;br/&gt; Multiplicity (M, M) - Flow (2..*, 2..*)&lt;br/&gt; Each object references supplied in one flow is linked to each object reference from the other flow to create a cross product.  So active(1, 2), passive (3, 4, 5)  would yield links 1-3, 1-4, 1-5, 2-3, 2-4, 2-5&lt;br/&gt; &lt;br/&gt; In the next case, some object references &lt;span style="FONT-STYLE: italic"&gt;may &lt;/span&gt;be ignored.&lt;br/&gt; &lt;br/&gt; Multiplicity (S, M) - Flow (2..*, 2..*)&lt;br/&gt; Each object referenced in flow 1 is linked to the next object in flow 2.  This pairing continues until there are no more objects in flow 1.  Any remaining objects referenced in flow 2 are dropped.&lt;br/&gt; &lt;br/&gt; In the remaining cases, some object references &lt;span style="FONT-STYLE: italic"&gt;will &lt;/span&gt;be ignored.&lt;br/&gt; &lt;br/&gt; Multiplicity (S, M) or (M, M) - Flow (1, 1)&lt;br/&gt; Since only two object references are delivered, there is only one linking choice.  The two referenced objects are linked together.&lt;br/&gt; &lt;br/&gt; Multiplicity (S, S) - Flow (1, 2..*) or (2..*, 1)&lt;br/&gt; The single object referenced on either flow can only be linked once.  Consequently, only one link can be made with all remaining object references dropped.&lt;br/&gt; &lt;br/&gt; Multiplicity (S, M) - Flow (2..*, 1) or (2..*, 2..*)&lt;br/&gt; Since only one object referenced in flow 1 can be linked, the first object referenced in flow 1 is linked to the first or only object referenced in flow 2.  All other object references are dropped.&lt;br/&gt; &lt;br/&gt; Multiplicity (M, M) - Flow (1, 2..*) or (2..*, 1)&lt;br/&gt; The object referenced from the flow with cardinality 1 is linked to all objects referenced in the flow with cardinality 2..*.&lt;br/&gt; &lt;h3&gt;   Association Unlinker &lt;/h3&gt; An association unlinker breaks existing links on an association relationship.  If there is an association class present, each corresponding association object will be removed automatically.&lt;br/&gt; &lt;br/&gt; Flows In: { status } 1 / object_flow &amp;lt; 2 / object flow &amp;gt;&lt;br/&gt; Flows Out: None&lt;br/&gt; Specification: rnum&lt;br/&gt; &lt;br/&gt; Unlinking can be defined with or without targets specified.  Use of object flows 1 and 2 vary depending on the type of association.&lt;br/&gt; &lt;br/&gt; Binary non-reflexive&lt;br/&gt; ( Dog Owner - 1 - is owned by -- owns - 1..* - Dog )&lt;br/&gt; &lt;br/&gt; Target specified&lt;br/&gt; &lt;br/&gt; We can unlink one or more objects in one class from one or more specific objects in another class.  Each set of object references is input in a separate flow.  Object references form the active perspective will automatically be assigned to flow 1.  For example, one object pool might be labeled &lt;span style="FONT-WEIGHT: bold"&gt;lazy_dogs&lt;/span&gt; and the other &lt;span style="FONT-WEIGHT: bold"&gt;new_owner&lt;/span&gt;.  Each link that exists between a member of flow 1 to a member of flow 2 will be erased.&lt;br/&gt; &lt;br/&gt; Target not specified&lt;br/&gt; &lt;br/&gt; If we use only one object flow, all links to the referenced objects  in that flow will be erased.  Let's say we flow from an object pool named &lt;span style="FONT-WEIGHT: bold"&gt;dead_dogs&lt;/span&gt; into the unlinker.  Each link to an object referenced in &lt;span style="FONT-WEIGHT: bold"&gt;dead_dogs&lt;/span&gt; will be broken. &lt;br/&gt; &lt;blockquote&gt;A quick aside about unconditional constraints.  We can see from the multplicity on the example association that a Dog Owner must own at least one Dog.  In each of our unlink examples one or more dog owners could have been left dogless.  To maintain data integrity, the modeler will need to specify some activity to either delete the owner objects or assign new dogs.  Now, we may find a way to make this burden easier as we flesh out the action language.  But that's going to require some serious analysis.  So, for now, assume that no magic maintains unconditional integrity unless otherwise specified.&lt;br/&gt; &lt;/blockquote&gt; Binary reflexive&lt;br/&gt; ( Router - 0..* - sends mail to -- gets mail from - 0..* - Router )&lt;br/&gt; &lt;br/&gt; Target specified&lt;br/&gt; &lt;br/&gt; The modeler specifies which direction to unlink by routing the active perspective to flow 1 and the passive perspective to flow 2.  This cannot be determined automatically, so it is up the modeler to set these as intended.  Let's say that we have a Router object &lt;span style="FONT-WEIGHT: bold"&gt;C&lt;/span&gt; that both sends and receives mail from a Router object &lt;span style="FONT-WEIGHT: bold"&gt;D&lt;/span&gt;.  The active perspective should be "sends mail to".  To unlink in the send direction, from &lt;span style="FONT-WEIGHT: bold"&gt;C&lt;/span&gt; to &lt;span style="FONT-WEIGHT: bold"&gt;D&lt;/span&gt;, the object flow with the reference to &lt;span style="FONT-WEIGHT: bold"&gt;D&lt;/span&gt; ("sends data to" - D) must be 1 (active) with C on flow 2 (passive).  If unlinking in both directions was desired, the "not specified" method is probably a better choice.&lt;br/&gt; &lt;br/&gt; Target not specified&lt;br/&gt; &lt;br/&gt; Only one input flow is supplied in this case.  For example, to unlink any object sending or receiving from &lt;span style="FONT-WEIGHT: bold"&gt;C&lt;/span&gt;, output a reference to &lt;span style="FONT-WEIGHT: bold"&gt;C&lt;/span&gt; on one object flow into the unlinker.  All links involving &lt;span style="FONT-WEIGHT: bold"&gt;C&lt;/span&gt; on the specified association will be erased.&lt;br/&gt; &lt;br/&gt; Unary (symmetric reflexive) association&lt;br/&gt; ( Territory - 1..* -- borders )&lt;br/&gt; &lt;br/&gt; Target specified&lt;br/&gt; &lt;br/&gt; Two object flows are required and assignment to 1 and 2 is arbitrary.  Each object referenced in one flow is unlinked with any connected object referenced in the other flow.&lt;br/&gt; &lt;br/&gt; Target not specified&lt;br/&gt; &lt;br/&gt; Only one object flow is required.  All links are broken to each object referenced in the flow.&lt;br/&gt; &lt;br/&gt; Cyclic unlink (target specified is itself)&lt;br/&gt; To unlink an object from itself on a binary reflexive or unary association only object flow 1, is required.  It is the same result as flowing two different reference to the same object on the 1 and 2 inputs.&lt;br/&gt; &lt;h3&gt;   Generalized Object Creator &lt;/h3&gt; Our definition of creator from the previous post must be extended to accommodate the peculiarities of generalized/specialized objects.  In a * UML generalization, a single object is represented by two instances, one in the superclass and one in a subclass.  The creator must create both of these instances.  The name of the subclass must be specified.&lt;br/&gt; &lt;br/&gt; If an object participates in more than one generalization, all participating instances must be inserted by into the metamodel by the creator.  Consider the following arrangement of generalizations:&lt;br/&gt; &lt;br/&gt; &lt;div style="MARGIN-LEFT: 40px"&gt;   A &amp;lt;R1 [ B | C ], C &amp;lt;R2 [ D | E ], F &amp;lt;R3 [ E | B ]&lt;br/&gt; &lt;/div&gt; &lt;br/&gt; Here we have three generalizations R1, R2 and R3 with superclasses A, C and F respectively.  To create an object in this example model, a non-specialized (leaf) subclass must be specified.  If we specify E, for example, instances will be created in classes E, F, C and A.  For subclasses, our object creator both creates and links. Any initialization activity coordinated amongst the instances must be modeled explicitly.  Only the instance creation/linking is automatic.&lt;br/&gt; &lt;br/&gt; Multidirectional generalization requires the specification of one subclass per direction:&lt;br/&gt; &lt;br/&gt; &lt;div style="MARGIN-LEFT: 40px"&gt;   G &amp;lt;R4 [ H | I ], G &amp;lt;R5 [ J | K ]&lt;br/&gt; &lt;/div&gt; &lt;br/&gt; The set of possible creation specifications are all combinations of non-specialized subclasses linked to a common superclass.  So in the model example above we have: (H, K), (H, J), (I, J), (I, K).&lt;br/&gt; &lt;br/&gt; One attribute flow per created super or subclass instance may be provided.  (This means that the definition of an attribute flow in the previous post must be amended to include a class_name in the flow content.  And since I can just do that now, I will.  Done.)&lt;br/&gt; &lt;br/&gt; Specification: 1{ non-specialized_subclass_name }&lt;br/&gt; Flows In: { status } { attribute }&lt;br/&gt; Flows Out: &amp;lt; object &amp;gt;&lt;br/&gt; &lt;br/&gt; The output flow returns a reference to each specified subclass.  References to the newly created superclass instances can be found using with a selector process traversing the generalization(s).&lt;br/&gt; &lt;h3&gt;   Generalized Object Eraser &lt;/h3&gt; We will now extend our eraser process so that it can handle generalizations properly.  An object in a generalization, super or subclass, is represented by two instances.  If an object participates in multiple generalizations there will be one more instance per additional generalization.  Every one of these related instances will be eliminated by the object eraser.&lt;br/&gt; &lt;br/&gt; Referring back to the generalized object creator example models, let's say that we specify a reference to an instance of class F.  Following instances must be erased: F, either E or B, A and if E then also C&lt;br/&gt; &lt;br/&gt; The modeler must be careful to not specify deletion until all cleanup and coordination for every instance involved has been accomplished.&lt;br/&gt; &lt;br/&gt; Flows In: { status } object&lt;br/&gt; &lt;h3&gt;   Reclassifier &lt;/h3&gt; A reclassifer migrates a subclass instance in a generalization to another subclass at the same level.  This means that the original subclass instance must be erased and a new instance created in the destination subclass.  Both subclasses must be at the same level in the same generalization.  Based on our earlier model examples in the creator and eraser, you can probably guess that the activity doesn't necessarily stop there!&lt;br/&gt; &lt;br/&gt; Let's say that we want to migrate C to B.  We must delete and unlink the D or E subclass under C (but keep the D/E superclass F intact.  Then we delete the C instance, create a B instance and link the B instance to both the A and F superclasses.  Any supplied attribute data can be used to initialized the values in B (B only since that is the only created instance).&lt;br/&gt; &lt;br/&gt; Once again, it is the modelers responsibility to ensure that any coordination and cleanup activity in the subclasses to be deleted is completed before triggering the reclassification.&lt;br/&gt; &lt;br/&gt; Specification: from_subclass_name, to_subclass_name&lt;br/&gt; Flows In: { status } { attribute }&lt;br/&gt; Flows Out: &amp;lt; object &amp;gt;&lt;br/&gt; &lt;br/&gt; The output flow returns a reference to the newly created subclass instance.&lt;br/&gt; &lt;h1&gt;   Conclusion &lt;/h1&gt; &lt;br/&gt; Okay, that's all for now.  I'm going to need some spicy indian food and bad television before getting back to the metamodel.&lt;br/&gt; &lt;br/&gt; - Leon&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-3927615686593598526?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/3927615686593598526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=3927615686593598526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/3927615686593598526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/3927615686593598526'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2006/10/linking-and-unlinking.html' title='Linking and Unlinking'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34308055.post-6077327686490673532</id><published>2006-09-27T20:16:00.000-07:00</published><updated>2006-09-27T20:17:06.986-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='action language'/><category scheme='http://www.blogger.com/atom/ns#' term='actions'/><title type='text'>Action Language Notes</title><content type='html'>Here are some rough notes on the proposed anatomy of the * UML action language.  All semantic elements can be represented as text, a la SMALL, or as graphical symbols a la Scrall.  For visualization purposes, graphical symbols are less restrictive than text statements.  Eventually we will establish a clear connection between these elements and the corresponding UML 2.0 action semantics.  For now though, we need to build something that works well, with a minimum of components.&lt;br /&gt;&lt;br /&gt;A parser will yield the elements described here so, at this level, we don't care about notation or syntax.  We do want to distill the essence of an action block specification so that we can build a machine that can execute any action block.  Rather than build a full blown action language all at once, it is probably best to define the core elements and implement a primitive machine.  Then, with some experimentation, we can extend or rethink the language to evolve something truely useful.&lt;br /&gt;&lt;br /&gt;Ss the goal of these notes is sort out the concepts required to support the specification of action components as well as the run-time execution of those components in an action language interpreter.  Whereas SMALL and SCRALL focus on syntax primarily, we need to sort out the underlying mechanics and integration with the metamodel. The next step will be to start modeling those concepts.  Incremental versions of the action language metamodel will be posted at sourceforge for anyone interested.&lt;br /&gt;&lt;br /&gt;Here are some questions we hope to answer:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;     What configurations of data are exchanged?  How many do we need?&lt;/li&gt;   &lt;li&gt;     Do we have just one flow that can transfer any kind of data?&lt;/li&gt;   &lt;li&gt;     Or do we create a separate flow type for each configuration of data?&lt;/li&gt;   &lt;li&gt;     What kind of processes do we have?  What are the inputs and outputs?&lt;/li&gt;   &lt;li&gt;     ?&lt;/li&gt; &lt;/ul&gt;&lt;br /&gt;We must also keep in mind that varying degrees of parallelism are possible depending on the target architecture.  So we must be careful not to define structures that perform only in a sequential context.&lt;br /&gt;&lt;h3&gt;   Key &lt;/h3&gt; Let's use the following symbols:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   [ a | b ] - a or b&lt;br /&gt;{ c } - zero, one or many c's&lt;br /&gt;1{ d } - at least one d&lt;br /&gt;&amp;lt; e &amp;gt; - zero or one e - optional&lt;br /&gt;( d, f ) - d and f are grouped together in the same flow&lt;br /&gt;g - exactly one - g is required&lt;br /&gt;&lt;/div&gt; &lt;h2&gt;   Action Block&lt;br /&gt;&lt;/h2&gt; An &lt;span style="font-style: italic;"&gt;action block&lt;/span&gt; is a bundle of action language associated with a state, class operation or service.  Action language consists of nodes (processes and stores) connected by flows.&lt;br /&gt;&lt;h2&gt;   Flows &lt;/h2&gt; A &lt;span style="font-style: italic;"&gt;flow &lt;/span&gt;transfers data into, out of, or between nodes.  Each flow has a unique numbered identifier and may be optionally named.  Duplicate names in the same action block are allowed.&lt;br /&gt;&lt;br /&gt;Every flow specifies at least one source and destination.  The types and quantities of sources and destinations depends on the flow type.&lt;br /&gt;&lt;br /&gt;Specification: Unique_id &amp;lt; Descriptive_name &amp;gt;&lt;br /&gt;&lt;h3&gt;   Object Flow &lt;/h3&gt; An &lt;span style="font-style: italic;"&gt;object flow&lt;/span&gt; transfers zero or many object references.  This flow can be generated by either a selector or a creator process.&lt;br /&gt;&lt;br /&gt;Specification: None&lt;br /&gt;Source:  [ object_pool | selector | creator ]&lt;br /&gt;Destination: [ object_pool | transmitter | eraser | tester ]&lt;br /&gt;Run-time content: { object_reference }&lt;br /&gt;Uses:&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   Populate object pool from selector or creator&lt;br /&gt;Supply references to an eraser for deletion&lt;br /&gt;Transfer object pool to other object processors (to be defined later)&lt;br /&gt;Provide input to a tester to evaluate cardinality&lt;br /&gt;&lt;/div&gt; &lt;h3&gt;   Attribute Flow &lt;/h3&gt; An &lt;span style="font-style: italic;"&gt;attribute flow&lt;/span&gt; specifies the transfer of one or more attribute name:value pairs.  All attributes in a flow must belong to the same class.  Each value must have a data type that matches that of its attribute.&lt;br /&gt;&lt;br /&gt;Specification: class_name, 1{ attribute_name }&lt;br /&gt;Source: [ object_pool | transform ]&lt;br /&gt;Destination: [ object_pool | transform | tester | creator ]&lt;br /&gt;Run-time content: { &amp;lt; object_reference &amp;gt; 1{ attribute_name:value } }&lt;br /&gt;Uses:&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   Read attribute values using object references in an object pool&lt;br /&gt;Write attribute values of a specific object&lt;br /&gt;Write attribute values the same for all objects referenced in an object pool&lt;br /&gt;Supply data to a transform or tester&lt;br /&gt;Supply attribute initialization values to a creator  (Cannot carry an object reference)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;When writing to specific objects during run-time, the following data is expected:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   { object_ref 1{ attr_name:value }&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; Each flowing object reference is accompanied by one or more name:value pairs.  To obtain the object reference, the origin of the flow must trace back to an object pool store or creator process.&lt;br /&gt;&lt;br /&gt;An attribute flow into an object pool containing only name:value pairs and no object reference will write all objects referenced in the pool to the same values.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   { attr_name:value }&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; We could use this example to set&lt;br /&gt;&lt;br /&gt;The following data streams when reading attribute values from an object pool:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   { object_ref 1{ (attr_name:value) }&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Here we see that each data item includes an object reference with at least one accompanying attribute name, value pair.  The syntax above does not suggest any particular implementation.  You don't have to send an attribute name with each value.  But there must be some mechansim to ensure that the attribute of each value in an attribute flow can be determined during runtime.&lt;br /&gt;&lt;h3&gt;   Value Flow &lt;/h3&gt; A &lt;span style="font-style: italic;"&gt;value flow&lt;/span&gt; transfers a single value not associated with any attribute.  Each value conforms to a defined user or core data type.  Consequently, a value may be arbitarily complex.&lt;br /&gt;&lt;br /&gt;Specification: None&lt;br /&gt;Source: [ value_store | transform | service ]&lt;br /&gt;Destination: [ value_store | transform | tester | service | selector ]&lt;br /&gt;Run-time content: value&lt;br /&gt;Uses:&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   Transfer a temporary value in and out of a value store&lt;br /&gt;Output a value from a class operation, transform or service&lt;br /&gt;Transmit a value to a transmitter for inclusion in a signal&lt;br /&gt;Transmit a comparison value to a selector criteria expression&lt;br /&gt;&lt;/div&gt; &lt;h3&gt;   Status Flow &lt;/h3&gt; A process executes when all of its required input data is available.  This means that multiple processes could potentially execute in parallel.  But we might want to ensure that certain processes wait, even though data is available, until that data is refined further.  Or an upstream decision might preclude invocation of a certain process.&lt;br /&gt;&lt;br /&gt;A &lt;span style="font-style: italic;"&gt;status flow&lt;/span&gt; communicates a boolean condition to a downstream process to effect or negate execution.  If a status flow is enabled during run-time, the condition is enabled.  A process may not execute until all input control flows have been enabled and all input data is available.&lt;br /&gt;&lt;br /&gt;Before considering the run-time content of a status flow, we need to understand how flows are managed in general.  Every flow, regardless of type, starts off in an "inactive" state.  This means that the flow has not yet been populated with any data.  Once a flow is populated by whatever process or store provides its input, the flow enters the "activated" state.  This means that data is now available.  The content of an "active" flow may be "empty".  (An object selection that returns no references, for example, would populate an object flow with zero object references).  Once all data in a flow has been consumed, the flow enters a final "consumed" state.&lt;br /&gt;&lt;br /&gt;When a status flow leaves its "inactive" state, it must be set to either true or false.  Any process receiving the false input will not execute.  True means that the process may execute.  The name of the flow reflects its condition when set.  Let's say the name of the flow is "Max Pressure Exceeded" and it feeds into a process named "Close valve".  The process may execute only if the value of the flow is True.&lt;br /&gt;&lt;br /&gt;Status might be enabled repeatedly for a series of object references.  The example taken from figure 6.16.1 of the &lt;a href="http://www.modelintegration.com/downloads/small.pdf" title="SMALL paper"&gt;SMALL paper&lt;/a&gt; shows this situation.  Crates are sorted into large and small sizes.  A flow of object references in SMALL, each with an attached guard condition, flows to two separate attribute write processes.&lt;br /&gt;&lt;br /&gt;Each status flow in this example flows object references as well as status.&lt;br /&gt;&lt;br /&gt;Specification: None&lt;br /&gt;Source: tester&lt;br /&gt;Destination: any process, including another tester&lt;br /&gt;Run-time content: &lt;&gt;&lt;br /&gt;&lt;br /&gt;There are some cases where, instead of a status flow, a value flow with a boolean data type could be used to similar effect.  But it would not be possible to preclude execution of a downstream process with this method.&lt;br /&gt;&lt;h2&gt;   Nodes &lt;/h2&gt; A &lt;span style="font-style: italic;"&gt;node &lt;/span&gt;is either a Store or a Process.  Some configuration of data can flow into a node, out of a node or in both directions.&lt;br /&gt;&lt;h2&gt;   Stores &lt;/h2&gt; A &lt;span style="font-style: italic;"&gt;store &lt;/span&gt;is a node where data is organized for access by one or more flows.  It is more accurate to say that a store makes data available than to say that anything is actually being stored.  They are freshly initiated when an action block is invoked and destroyed when the action block completes.  So the scope of a store, regardless of type, is the current action block.&lt;br /&gt;&lt;h3&gt;   Object Pool &lt;/h3&gt; An &lt;span style="font-style: italic;"&gt;object pool &lt;/span&gt;stores a set of object references.  The object references may be created by the output object flow of either a selector or an object creator.  Every object pool has exactly one object flow input. During run-time, an object pool may receive zero, one or many object references.  So it is possible to end up with an empty object pool after the object flow is activated.&lt;br /&gt;&lt;br /&gt;Any number of attribute flows may enter an object pool.  Each such flow specifies a write to the attributes of any objects referenced in the pool.  Also, any number of attribute flows may stem from an object pool.  Each such flow specifies the reading of attribute values from referenced objects.&lt;br /&gt;&lt;br /&gt;Flows In: { attribute } { object }&lt;br /&gt;Flows Out: { attribute } { object }&lt;br /&gt;&lt;br /&gt;Each action block in an instance based state has automatic access to an object pool initialized to contain a reference to the current instance.  This special object pool is always named "self".  Not sure whether we need an object flow to fill this store or whether we make a special rule and say that the self store has no input.&lt;br /&gt;&lt;h3&gt;   Value Store &lt;/h3&gt; A &lt;span style="font-style: italic;"&gt;value store&lt;/span&gt; holds a single value defined by a data type.  Consequently the content of a value store can be arbitrarily complex.  A value store is populated by at least one value flow.  Any write to a value store replaces any prior value.  A value flow that exits a value store reads the current value.&lt;br /&gt;&lt;br /&gt;A parameter value in a state action block or a class operation has no input value flow.  The value is automatically made available when the block is initialized.&lt;br /&gt;&lt;br /&gt;Flows In: { value }&lt;br /&gt;Flows Out: { value }&lt;br /&gt;&lt;h2&gt;   Processes &lt;/h2&gt; A &lt;span style="font-style: italic;"&gt;process &lt;/span&gt;is a specialized activity that has exercises some influence on metamodel content.  The inputs, outputs and activity depends on the process type.&lt;br /&gt;&lt;h3&gt;   Selector &lt;/h3&gt; A &lt;span style="font-style: italic;"&gt;selector &lt;/span&gt;takes as input a class, a quantity [ 1 | * ], an optional criteria expression and an optional path expression.  It locates the specified object or objects in the designated class and outputs an object flow populated with matching object references.  If no matching objects are found, zero references are produced in the object flow.&lt;br /&gt;&lt;br /&gt;Flows In: { status } { value }&lt;br /&gt;Flows Out: object&lt;br /&gt;Specification: ( class_name ) ( quantity ) &amp;lt; criteria &amp;gt; &amp;lt; path &amp;gt;&lt;br /&gt;&lt;h3&gt;   Creator &lt;/h3&gt; A &lt;span style="font-style: italic;"&gt;creator &lt;/span&gt;makes a new instance of an object.  A reference to the newly created object may be provided by an output object flow.  An input attribute flow can be used to initialize any of the object's attributes.&lt;br /&gt;&lt;br /&gt;Specification: class_name&lt;br /&gt;Flows In: { status } &amp;lt; attribute &amp;gt;&lt;br /&gt;Flows Out: &amp;lt; object &amp;gt;&lt;br /&gt;&lt;h3&gt;   Eraser &lt;/h3&gt; An &lt;span style="font-style: italic;"&gt;eraser &lt;/span&gt;deletes any objects referenced in an incoming object flow.&lt;br /&gt;&lt;br /&gt;Flows In: { status } object&lt;br /&gt;&lt;h3&gt;   Transmitter&lt;br /&gt;&lt;/h3&gt; A &lt;span style="font-style: italic;"&gt;transmitter&lt;/span&gt; accepts an object flow and value flow for each parameter.  A signal is generated to each object referenced in the flow.&lt;br /&gt;&lt;br /&gt;Specification: event_specification { value_flow_name, parameter_name }&lt;br /&gt;Flows In:  { status } { object } { value }&lt;br /&gt;&lt;h3&gt;   Tester &lt;/h3&gt; A &lt;span style="font-style: italic;"&gt;tester &lt;/span&gt;accepts status, value and/or attribute flows and produces one or more status flows.&lt;br /&gt;&lt;br /&gt;Specification: Internal comparison expressions (NOT an action block)&lt;br /&gt;Flows In: { status } { value } { attribute }&lt;br /&gt;Flows Out: 1{ status }&lt;br /&gt;&lt;h3&gt;   Transform&lt;br /&gt;&lt;/h3&gt; A &lt;span style="font-style: italic;"&gt;transform &lt;/span&gt;is a process that, as its name implies, transforms one or more input values to produce a one or more output values.  Calculations may be performed,  data manipulated and coverted, values tested and assignments made.  A transform cannot directly access the class or state models.  This means that objects (including "self") may not be selected, attributes read or written or signals generated.  Local value stores may be allocated and accessed.  A transform cannot produce a status flow - you need a tester process for that.&lt;br /&gt;&lt;br /&gt;Specification: Internal transformation expressions (NOT an action_block)&lt;br /&gt;Flows In: { status } { attribute } { value }&lt;br /&gt;Flows Out: { attribute } { value }&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;Transform Compute_volume&lt;br /&gt;&lt;br /&gt;Inputs( Attribute_flow:Dimensions )&lt;br /&gt;Output( Attribute_flow:Volume )&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;&lt;br /&gt;Volume.Volume = Dimensions.Length * Dimensions.Width * Dimensions.Depth&lt;br /&gt;Volume.Object = Dimensions.Object&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In the example above, a transform named &lt;span style="font-weight: bold;"&gt;Compute_volume&lt;/span&gt; is defined.  It's single input is declared as an attribute flow.  The local name &lt;span style="font-weight: bold;"&gt;Dimensions &lt;/span&gt;is applied.  An output attribute flow is declared and named &lt;span style="font-weight: bold;"&gt;Volume&lt;/span&gt;.  The &lt;span style="font-weight: bold;"&gt;L&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;W&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;D&lt;/span&gt; components of the input flow were defined outside the transform, but can be referenced internally.  The single component &lt;span style="font-weight: bold;"&gt;V&lt;/span&gt; of the output flow is dynamically declared internally.  It can then be referenced downstream.  The object reference received in the &lt;span style="font-weight: bold;"&gt;Dimensions &lt;/span&gt;attribute flow is passed along to the &lt;span style="font-weight: bold;"&gt;Volume &lt;/span&gt;attribute flow.&lt;br /&gt;&lt;h3&gt;   Service&lt;br /&gt;&lt;/h3&gt; A &lt;span style="font-style: italic;"&gt;service &lt;/span&gt;is a blackbox process provided by either an external service domain or in the caller's domain.  No model references such as objects or attributes may be exchanged with the caller.  Only status and values may be communicated.&lt;br /&gt;&lt;br /&gt;Flows In: { status } { value }&lt;br /&gt;Flows Out: { status } { value }&lt;br /&gt;Specification: action_block&lt;br /&gt;&lt;h3&gt;   Operation &lt;/h3&gt; An &lt;span style="font-style: italic;"&gt;operation &lt;/span&gt;is an activity defined on a class independent of any state chart.  Operations are object-based so that a separate context executes for each object.  All selected object references remain available to any invoked operation.  This makes sense since the object references in an object pool are valid until the state action completes and the operation must return before that.  An operation may produce a single value output.  (When we design the exception throw-catch mechansim there will be an additional way for an operation to pass data out).&lt;br /&gt;&lt;br /&gt;Flows In: { status } { value } { object } { attribute }&lt;br /&gt;Flows Out: { status } { value } { object } { attribute }&lt;br /&gt;Specification:  action_block&lt;br /&gt;&lt;h2&gt;   Conclusion &lt;/h2&gt; Again, these are just rough notes in preparation for the modeling activity.  As usual, the process of modeling will ferret out inconsistency, ambiguity, self contradiction and gaping holes in logic.  All of which are surely present!  Nonetheless, I thought it might be helpful to expose the current thinking.  Feel free to comment if you see any trouble spots or feel I'm heading down the wrong road or have any theory to contribute.&lt;br /&gt;&lt;br /&gt;- Leon&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-6077327686490673532?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/6077327686490673532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=6077327686490673532' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/6077327686490673532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/6077327686490673532'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2006/09/action-language-notes-here-are-some.html' title='Action Language Notes'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34308055.post-7765492666864302919</id><published>2006-09-27T18:25:00.000-07:00</published><updated>2006-09-27T18:28:51.024-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='action language'/><category scheme='http://www.blogger.com/atom/ns#' term='actions'/><title type='text'>Still analyzing...</title><content type='html'>I had hoped to post my premilinary action language metamodel notes by now, but the quicksand keeps shifting!  Still resolving inconsistencies and trying to boil down the necessary concepts.  Getting close, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-7765492666864302919?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/7765492666864302919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=7765492666864302919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/7765492666864302919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/7765492666864302919'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2006/09/still-analyzing.html' title='Still analyzing...'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34308055.post-8503637248044990262</id><published>2006-09-24T10:58:00.000-07:00</published><updated>2006-09-24T11:16:04.290-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='small'/><category scheme='http://www.blogger.com/atom/ns#' term='action language'/><title type='text'>Small updates</title><content type='html'>I haven't posted for a few days so I thought I would just make a quick update.  I am currently putting together some notes so that I can start building the action language metamodel.  Naturally, you can't model what you don't understand and until I get a grip on this thing there's just not much to model.  The good news, though, is that I'm making a lot of progress which I will post shortly.&lt;br /&gt;&lt;br /&gt;I have been reading, re-reading, re-re-re-reading every little detail in the &lt;a href="http://modelint.com/downloads/small.pdf"&gt;SMALL language paper&lt;/a&gt; and putting together some notes.  As I progress I am finding a number of issues left, intentionally or not, as "exercises for the student".&lt;br /&gt;&lt;br /&gt;Primitive processes such as "attribute write", "object create", etc. are pretty clear.  But then you see something like "Compute Volume" (figure 6.16.1 on page 23) with an input data flow labeled "&lt;height&gt;N" and an output labeled "Volume".  Okay...&lt;br /&gt;&lt;br /&gt;Clearly, somewhere inside that process, is the simple v = l * w * d expression.  But we see that there will be one (l, w, d) for each Crate object - thus the N on the input.  There's no N on the output!  But the example doesn't work if we output only one v, so &lt;volume&gt;N must have been intended.  Now we could say that the action language interpreter automatically binds the output to an object reference since it sees that the input flow carries an object reference.  But what happens if we have an process that inputs multiple &lt;...&gt;N flows - each from a different class?  Do we merge the output somehow?  Or what if we really did intend to output a single value unassociated with any object reference?  My point is that there is a lot of room for ambiguity here and the SMALL paper does not spell any of this out.&lt;br /&gt;&lt;br /&gt;Now that's just one example.  This paper is replete with missing pieces - all due respect to the authors!  So I will make my best effort to fill them in, present some notes, and see what you all think.&lt;/volume&gt;&lt;/height&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-8503637248044990262?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/8503637248044990262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=8503637248044990262' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/8503637248044990262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/8503637248044990262'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2006/09/small-updates.html' title='Small updates'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34308055.post-115868796384651664</id><published>2006-09-19T10:21:00.000-07:00</published><updated>2006-09-20T09:32:01.196-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='small'/><category scheme='http://www.blogger.com/atom/ns#' term='metamodel'/><category scheme='http://www.blogger.com/atom/ns#' term='action language'/><category scheme='http://www.blogger.com/atom/ns#' term='actions'/><title type='text'>Action Language Metamodel</title><content type='html'>I've been pondering the action language metamodel the last couple of days.  For reseach, I've printed out the in-depth SMALL paper from back in 97 and xeroxed the two page summary from Executable UML as well as my SCRALL notes.&lt;br /&gt;&lt;br /&gt;Goals of this action language are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Emphasize parallel processing and data flows.&lt;/li&gt;&lt;li&gt;Ensure that the language is as easy to read as the class and state models.&lt;/li&gt;&lt;li&gt;Support a full range of data types and domain bridge mechanisms.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;I'm really impressed with the quality of the SMALL paper.  I will probably just implement it straight out.  But how?&lt;br /&gt;&lt;br /&gt;I certainly need to model action behaviors (link, create, write attribute, etc.) as primitive operations in the class and state metamodel subystems.  For now I will just imagine these as domain functions with appropriate signatures.  Example:&lt;br /&gt;&lt;br /&gt;::Unlink(object_id1, object_id2, rnum)&lt;br /&gt;&lt;br /&gt;Clearly we need a lex-yacc generated parser, which means I need to write up a full grammar.  I'm thinking that the intermediate representation produced by the parser will populate an action language metamodel - yet to be built.&lt;br /&gt;&lt;br /&gt;So when action language is entered, it will be parsed and the action language metamodel will be populated.  When a block of action language is triggered at run-time, the action language metamodel will invoke the primitive operations with appropriate parameter values.&lt;br /&gt;&lt;br /&gt;The lex-parser and primitive ops are the easy parts, so I will save those for last.  I hope to post progress here in the coming days.&lt;br /&gt;&lt;br /&gt;It's a nice day for a walk so I'm heading to the local &lt;a href="http://sanfrancisco.citysearch.com/profile/41734267/san_francisco_ca/cafe_du_soleil.html"&gt;cafe &lt;/a&gt;to ponder further.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-115868796384651664?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/115868796384651664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=115868796384651664' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/115868796384651664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/115868796384651664'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2006/09/action-language-metamodel.html' title='Action Language Metamodel'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34308055.post-115854533571242004</id><published>2006-09-17T19:08:00.000-07:00</published><updated>2006-09-17T19:27:14.726-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='types'/><category scheme='http://www.blogger.com/atom/ns#' term='data types'/><category scheme='http://www.blogger.com/atom/ns#' term='metamodel'/><category scheme='http://www.blogger.com/atom/ns#' term='datatypes'/><title type='text'>First Data Type Class Model</title><content type='html'>The good news is that I've sorted out some terminology since the last post (as promised!).  The bad news is that I've clearly got some more &lt;a href="http://www.amazon.com/gp/product/0321399420/102-8791776-3755312?ie=UTF8" title="C. J. Date - of course"&gt;studying &lt;/a&gt; to do before nailing this data type thing down the way I want.  I suppose, though, it's good news that I've figured that much out.  After my conversation with Andrew, I'm concerned that this subsystem could turn into a serious project of its own.  So we will probably limp along with a miminal data typing system whilst the rest of the action language gets sorted out.&lt;br /&gt;&lt;br /&gt;For now, I propose the following model be inserted into the datatype subsystem of the * UML metamodel.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/907/3779/1600/Subsystem-%27Datatype%27-Class-.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 302px; height: 174px;" src="http://photos1.blogger.com/blogger/907/3779/400/Subsystem-%27Datatype%27-Class-.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;If you don't have an &lt;a title="I use it!" href="http://imagezoom.yellowgorilla.net/"&gt;image resizer&lt;/a&gt;   plugin (firefox) the diagrams might be hard to read.  I'm new to the blog - writely technology and haven't figured out the easiest way to insert readable model fragments.  I will post the full pdf and BridgePoint files on the &lt;a title="* UML project" href="http://sourceforge.net/projects/starruml/"&gt;sourceforge site&lt;/a&gt;, though.  Probably in a separate file package.&lt;br /&gt;&lt;br /&gt;Here I just want to excerpt and explain what I have so far.  This is only a model of data type structure, not data type operations.  The model is best explained in two pieces: core and user data types.  Then I will construct the Position data type to show how the model works.&lt;h2&gt;Core Data Types&lt;/h2&gt;First let's examine the left side - the core data types.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/907/3779/1600/core_cm.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 438px; height: 369px;" src="http://photos1.blogger.com/blogger/907/3779/320/core_cm.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Nothing mysterious here.  I have superclassed the Real and Integer Numeric types because they each may specify units.&lt;br /&gt;&lt;br /&gt;Note that the max/min values on Integer and Real are kept in the subclasses since the types are not the same.  The real type also specifies a precision as a positive integer representing decimal places to the right.&lt;br /&gt;&lt;br /&gt;The Enumerated data type consists of a set of Symbols, each of which has a Value.&lt;br /&gt;&lt;br /&gt;Finally, String has a positive integer maximum length.  Now let's flip over to the right side.&lt;br /&gt;&lt;h2&gt;User Data Types&lt;/h2&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/907/3779/1600/userdt_cm.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 484px; height: 198px;" src="http://photos1.blogger.com/blogger/907/3779/400/userdt_cm.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A Vector is simply a collection of one or more values (as determined by Vector.Scale) all specified by the same Datatype.  Since the Datatype can be either User or Core we can set up a hierarchical structure.  Since Vector.Scale can be 1 or more we can build an N-dimensional matrix at any level of the hierarchy.  Let's review the examples mentioned in my earlier post.&lt;br /&gt;&lt;br /&gt;First we'll work from the bottom up to define the Position data type.  Since minutes and seconds are the same in both latitude and longitude, let's define those.&lt;br /&gt;&lt;h3&gt;Minutes&lt;/h3&gt;Our specification for Minutes is:&lt;br /&gt;Name: Minutes&lt;br /&gt;Core Type: Integer&lt;br /&gt;Min_value: 0&lt;br /&gt;Max_value: 59&lt;br /&gt;Units: minutes&lt;br /&gt;&lt;br /&gt;So this gives us an instance each of: Integer, Numeric, Core Data Type and Data Type&lt;br /&gt;&lt;h3&gt;Seconds&lt;/h3&gt;Using a more compact syntax, we specify:&lt;br /&gt;Seconds: real[0..60] prec 2 units seconds&lt;br /&gt;&lt;br /&gt;This gives us an instance each of: Real, Numeric, Core Data Type and Data Type&lt;br /&gt;&lt;h3&gt;Degrees Latitude&lt;/h3&gt;Lat_Degrees: int[-90..90] units degrees&lt;br /&gt;&lt;h3&gt;Degrees Longitude&lt;/h3&gt;Long_Degrees: int[-180..180] units degrees&lt;br /&gt;&lt;br /&gt;Unlike thte earlier post I am using negative degrees to avoid defining an enumerated type for [N | S] and [W | E].&lt;br /&gt;No particular reason - just lazy.  Also the max Minutes is 59 while max Seconds is 60 (59.999...).  Seems like it is better to say "60".  Otherwise you end up redundantly specifying the precision with a sequence of trailing nine's.&lt;br /&gt;&lt;h3&gt;Latitude and Longitude&lt;br /&gt;&lt;/h3&gt;Now we start creating User Data Types as we work our way up the hierarchy.&lt;br /&gt;&lt;br /&gt;Name: Latitude&lt;br /&gt;Vector: name Degrees, scale 1, value_datatype Lat_Degrees&lt;br /&gt;Vector: name Minutes, scale 1, value_datatype Minutes&lt;br /&gt;Vector: name Seconds, scale 1, value_datatype Seconds&lt;br /&gt;&lt;br /&gt;Name: Longitude&lt;br /&gt;Vector: name Degrees, scale 1, value_datatype Long_Degrees&lt;br /&gt;Vector: name Minutes, scale 1, value_datatype Minutes&lt;br /&gt;Vector: name Seconds, scale 1, value_datatype Seconds&lt;br /&gt;&lt;h3&gt;Position&lt;/h3&gt;&lt;p&gt;Name: Position&lt;/p&gt;&lt;p&gt;Vector: name Latitude, scale 1, value_datatype Latitude&lt;/p&gt;&lt;p&gt;Vector: name Longitude, scale 1, value_datatype Longitude&lt;/p&gt;&lt;h3&gt;Matrix example&lt;/h3&gt;&lt;p&gt;Now if, for some reason, we wanted a 5x10 matrix of Position data we could do this:&lt;/p&gt;&lt;p&gt;Name: Position_Column&lt;/p&gt;&lt;p&gt;Vector: name Position, scale 10, value_datatype Position&lt;/p&gt;&lt;p&gt;Name: Position_Matrix&lt;/p&gt;&lt;p&gt;Vector: name Position_Rows, scale 5, value_datatype Position_Column&lt;/p&gt;&lt;h2&gt;Moving on&lt;/h2&gt;&lt;p&gt;Okay, that's it for now.  I might shelve the data type subsystem for a few days while I get some other tasks under control.  Namely: Publish up a project roadmap, resume work on the model build script parser, sketch out key parts of the action language subsystem.&lt;/p&gt;&lt;p&gt;Stay tuned!&lt;/p&gt;&lt;p&gt;- Leon&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-115854533571242004?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/115854533571242004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=115854533571242004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/115854533571242004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/115854533571242004'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2006/09/first-data-type-class-model.html' title='First Data Type Class Model'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34308055.post-115829252158560156</id><published>2006-09-14T20:55:00.000-07:00</published><updated>2006-09-14T20:56:28.180-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='types'/><category scheme='http://www.blogger.com/atom/ns#' term='data types'/><category scheme='http://www.blogger.com/atom/ns#' term='metamodel'/><category scheme='http://www.blogger.com/atom/ns#' term='datatypes'/><title type='text'>Data Typing Notes - Part 2</title><content type='html'>&lt;h2&gt;   Operations on Core Data Types &lt;/h2&gt;  Before moving on to the interesting part - application of operations on composite data types - let's take stock of what we already know about how operations are applied to core data types in programming languages.&lt;br /&gt;&lt;br /&gt;A built in operation may be applied to core data type values using one of three common formats:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;     Binary operator   &lt;/li&gt;&lt;li&gt;     Unary operator&lt;/li&gt;&lt;li&gt;Assignment operator&lt;br /&gt;&lt;/li&gt;&lt;li&gt;     Function call&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;We generally see the binary operator format in math expressions like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   x = 2 + 8&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; It is rarely done, but we could rephrase the above statement using the function call format:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   x = add( 2, 8 )&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Generically, these formats are:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   x = a OP_SYMBOL b&lt;br /&gt;  x = OP_NAME( a, b )&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;where a, b are the values and x is the result.&lt;br /&gt;&lt;br /&gt;Finally, we have a couple examples of the unary operator format:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   ++c&lt;br /&gt;  -d&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Again, we can restate both examples in the function call format:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;   c = increment( c )&lt;br /&gt;  x = negate( d )&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In addition to the obvious fact that each function has only one input value, we observe that the first example changes the input value while the second does not.&lt;br /&gt;&lt;br /&gt;The assignment format modifies the actual value&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;x *= 2&lt;br /&gt;x OP_ASSIGN a&lt;br /&gt;x = OP_ASSIGN_NAME( x, a )&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Okay, let's set those observations aside and take a look at a composite data type and see what kind of trouble we can get ourselves into.&lt;br /&gt;&lt;h2&gt;Operations on Composite Data Types&lt;/h2&gt; Whenever we create a new composite data type, no matter how simple, we need to review all of the standard operators and consider what functions make sense on the new type.  Consider an application where you need to count how many times something occurs.  Maybe we have an automotive application and we need to count how many lubrication cycles occur within a given time frame.  This sounds like a job for an integer, but not quite.  What we need is a counter.  It can't ever be negative.  Operations-wise we want to increment it, decrement it and reset it to zero.  Let's define it.&lt;br /&gt;&lt;br /&gt;We use a hierarchy format:&lt;br /&gt;&lt;br /&gt;Layer : Counter&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;count : int[0..max]&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;So we have a data type structure named "Counter".  To define our operations we use the OOP mechanism of inheriting the operations already defined in the integer base type with some overriding features.  Specifically we want to use the ++ and -- unary operators, but we need to make sure that -- never takes us past 0.  Additionally, we need a reset function.  Rather than use a hard to read/remember operator we can stick to a function name.&lt;br /&gt;&lt;br /&gt;Counter::&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;op(--) :&lt;br /&gt;   if --count &lt; 0, count = 0&lt;br /&gt;op(*) : not defined&lt;br /&gt;op (-) : not defined&lt;br /&gt;op (+) : not defined&lt;br /&gt;reset () : count = 0&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Please don't pick apart the syntax above.  I'm not trying to nail that down yet!  We're really just focusing on the required data.  The example above shows that unless otherwise specified, all int operators and functions apply.  We show that -- works differently.  Some action language will be written in a function to be attached to the -- operator to override normal -- behavior.  We turn off the *, - and + operators.  We could just leave them on but let's say that we want to tightly define counter behavior.  It's a counter and nothing else!  A new function is defined for reset.  All of this is pretty standard OO inherit and override behavior except that Counter is not an object or a class - it's just a data type in * UML.  The distinction will be important and this IS different than OO programming languages.&lt;br /&gt;&lt;br /&gt;The binary operation takes two inputs and returns a result without changing either input, so we need to specify a little more:&lt;br /&gt;&lt;br /&gt;Compass_Heading::&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;op(+) :&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;sum = a + b&lt;br /&gt;if sum == 0:&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;return 0&lt;br /&gt;&lt;/div&gt;else:&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-left: 80px;"&gt;return sum % 360&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;op(-) :&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;# insert action language here&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;op(*) : not defined&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In the above psuedo-syntax we use the letters a and b to represent the symbols left and right of the operator.  The result to be assigned to the LHS of the expression is "returned".  By the way, I am imagining a GUI that displays all operators defined for the core type as check boxes that can easily be flipped to inherit_none or inherit_all.  Then the modeler can click the boxes that are exceptions to the rule (inherit or don't inherit).  To preclude weird analysis bugs, it is just as important to undefine operators as it is to extend them!&lt;br /&gt;&lt;br /&gt;I just had a conversation with my colleague and good friend &lt;a title="Andrew Mangogna" href="http://sourceforge.net/projects/tclral"&gt;Andrew Mangogna&lt;/a&gt; and  realize that I'm starting to confuse my terms regarding hierarchies, layers, matricies, etc.  I am going to get this all sorted out by the next post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-115829252158560156?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/115829252158560156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=115829252158560156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/115829252158560156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/115829252158560156'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2006/09/data-typing-notes-part-2.html' title='Data Typing Notes - Part 2'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34308055.post-115818610778609530</id><published>2006-09-13T15:21:00.000-07:00</published><updated>2006-09-13T15:24:27.746-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='types'/><category scheme='http://www.blogger.com/atom/ns#' term='data types'/><category scheme='http://www.blogger.com/atom/ns#' term='metamodel'/><category scheme='http://www.blogger.com/atom/ns#' term='datatypes'/><title type='text'>Data Typing Notes</title><content type='html'>&lt;p&gt;   The term "data type" describes both a structure and a set of operations. Consider the integer data type. Transforming operations such as add, subtract and multiply yield a new integer value. Comparison operations like greater_than, less_than and is_equal_to yield a boolean result. &lt;/p&gt;&lt;br /&gt;Analysts rely on two kinds of data types during model development. Core data types and composite data types. Core data types are built in to the modeling language. The analyst can create a composite data type using one or more core data types as building blocks.&lt;br /&gt;&lt;br /&gt;What core data types should * UML support? Is the list of core data types bounded by some principle or can you just keep adding them? How are composite data types actually built? How much structure is allowed in a composite data type - is there such a thing as too much? How are composite data types handled by model compilers? How are they handled by an interpreter? These are just a few of the questions that must be answered to construct a useful * UML Data Type metamodel subsystem.&lt;br /&gt;&lt;h2&gt;   Core Data Types &lt;/h2&gt; Since a core data type is built into the modeling language it must be supported by any model compiler.  Both the data type structure and all operations should be fully implemented.  Keep in mind that a set of models might be translated to Ruby or Java on one day and then directly to Z80 assembler on another.   To support all model compilers, we are safer to keep the range of core data types as limited as possible.&lt;br /&gt;&lt;br /&gt;On the other hand, model developers like to have a wide variety of data types.  In fact, real world applications rarely call for a core data type as seemingly ubiquitous as real. Consider an air traffic application.  The compass heading data type is not real.  It is in fact [0..360] degrees with a precision of, say, .01.  The math operations aren't the same either for compass heading.  180.15 + 270.00 = 90.15.  Similarly we need distinct data types for altitude, speed and so forth.  True, each of these user data types can be tightly or loosely based on the real core data type, but each is different.&lt;br /&gt;&lt;br /&gt;So we have a balancing act.  To model application requirements independent of any implementation, we want to support lots of user (application level) data types.  To support a wide range of model compilers and target languages, we must limit the set of core data types.  And right there we have the answer to our problem.&lt;br /&gt;&lt;br /&gt;Any user data type must be derivable from core data type building blocks.  The model compilers will be concerned only with the core data types.  But the modeler will have everything he or she needs to specify whatever application level data types the project demands.  Before moving on to how the user builds composite data types, lets first consider the core set.&lt;br /&gt;&lt;br /&gt;Consider these proposed core data types:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;     boolean   &lt;/li&gt;&lt;li&gt;     integer   &lt;/li&gt;&lt;li&gt;     real   &lt;/li&gt;&lt;li&gt;     enumerated   &lt;/li&gt;&lt;li&gt;     string &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The first two types, boolean and integer, are supported in every programming language down to assembly level (as far as I know).  So they are safe bet.  At the level of C and upward, the real (float) data type is supported.  Some embedded processors lack floating point capability.  But floating point math is quite common in real world applications.  In the worst case, a model compiler will have to convert all read core types into integer types during compilation.&lt;br /&gt;&lt;br /&gt;Now we move on to enumerated.  This is easily implemented using integers so we easily demand this capability of any model compiler.&lt;br /&gt;&lt;br /&gt;What about the string data type?  C doesn't support strings directly - why should * UML?  The data structure is easy enough to accommodate, but there are a number of string operations that must be supported.  But strings are extremely common in real world applications.  It's hard to imagine avoiding them.  That said, certain embedded targets have resource limits that preclude the liberal use of string data types.  A model compiler might need to convert string values into a concatenated or compressed integer form to acheive any necessary economy.  Since I'm an analyst I have to say "enough for me, let's shift the burden onto the model compiler!"  We &lt;span style="font-style: italic;"&gt;need &lt;/span&gt;strings!&lt;br /&gt;&lt;br /&gt;But that's it - we're drawing the line at string.  You want to build a model compiler?  These are the only types you need to handle.  I now assert that the modeler has enough building blocks to construct any required user data type.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Composite Data Types&lt;/h2&gt;To build a composite data type we create a Type Specification using one or both of the following layout patterns:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hierarchy&lt;/li&gt;&lt;li&gt;Matrix&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Hierarchy Layout&lt;br /&gt;&lt;/h3&gt; Let's say that we want to create the application level Position data type.  Hang on - let me bring up Google Earth so I can make sure I get this right...  Okay, the Golden Gate Bridge is here:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;37 48' 59.41" N&lt;br /&gt;122 28' 54.05" W&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;We create a &lt;span style="font-style: italic;"&gt;Layer &lt;/span&gt;called "Latitude" with four data &lt;span style="font-style: italic;"&gt;Cells&lt;/span&gt;.  The cells are ordered sequentially as:&lt;br /&gt;&lt;br /&gt;Layer : Latitude&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;degrees: int[0..90]&lt;br /&gt;minutes: int[0..60]&lt;br /&gt;seconds: real[0..60] prec 2&lt;br /&gt;pole: enum( N | S )&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt; Each cell refers to a core data type.  Each core data type has its own qualifying characteristics.&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;&lt;br /&gt;&lt;/div&gt;Similarly we create another Layer called "Longitude":&lt;br /&gt;&lt;br /&gt;Layer: Longitude&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;degrees: int[0..180]&lt;br /&gt;minutes: int[0..60]&lt;br /&gt;seconds: real[0..60] prec 2&lt;br /&gt;meridian: enum( W | E )&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;It is clear we could have created a lower layer to contain minutes and seconds since they are identical, but let's not worry about that now.  We create a top layer for Position and we have a complete Type Specification.&lt;br /&gt;&lt;br /&gt;Layer: Position&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;Latitude&lt;br /&gt;Longitude&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;It seems that composite data types don't require qualifying characteristics.  Is this true?  Hmmm.&lt;br /&gt;&lt;h3&gt;Matrix Layout&lt;/h3&gt;&lt;p&gt;We can also arrange core data type cells in a matrix pattern.  To specify a 10x10x2 3D matrix of integers between 1 and 100 where any value is at (x, y, z) we could do this:&lt;/p&gt;&lt;br /&gt;Matrix: int[1..100]&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;x: 10&lt;br /&gt;y: 10&lt;br /&gt;z: 2&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Ah, but what if we wanted to create a 1x5 matrix of Position values for some reason?  Then we combine both the Matrix and Hierarchy layout patterns.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Matrix: Position&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 40px;"&gt;p: 5&lt;/p&gt;&lt;h3&gt;Composite Data Structure Summary&lt;/h3&gt;&lt;p&gt;The Hierarchy and Matrix layout mechanisms make it possible to construct composite data types.  But it's not enough to define a data type.  We need to somehow define the operations specific to that data type.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;But I need to get a &lt;a title="sandwich " href="http://sanfrancisco.citysearch.com/profile/11602347/san_francisco_ca/delessio_market_and_bakery.html"&gt;sandwich &lt;/a&gt;  right now.  So stay tuned for the next post where we will ponder transformation and comparision operators on composite data types and such things.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;    - Leon&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 40px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-left: 40px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-left: 40px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-left: 40px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 40px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-115818610778609530?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/115818610778609530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=115818610778609530' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/115818610778609530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/115818610778609530'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2006/09/data-typing-notes.html' title='Data Typing Notes'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34308055.post-115810951567567056</id><published>2006-09-12T17:49:00.000-07:00</published><updated>2006-09-12T21:19:43.443-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='* UML'/><category scheme='http://www.blogger.com/atom/ns#' term='starrUML'/><title type='text'>Getting Started</title><content type='html'>Welcome to my * UML blog.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://modelint.com/images/home/str_uml_logo.png" height="91" width="208" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* UML is a set of free (as in beer) UML metamodels and a supporting editor.  * UML is a language for building models with the following characteristics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Essential application analysis/requirements are kept separate from the implementation mechanics.  (I avoided the word "details" here because it is a myth that there are more details in implementation than there are in the application rules.  The details just happen to be different).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;All models are fully executable.  This means that if you build a * UML model you can say "run" and it will execute just like any program code.  Even though the model contains nothing but UML level concepts like classes, attributes, states, and action semantics, the models run without the need for any inserted C, Java, C++, Python or any other alien program language code.  Now the models might be running on top of a virtual machine built in one of those languages, but there is no code in the models themselves.  This is important because we need to keep the models separate from the implementation.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;All models concepts are expressed in a maximally parallel form.  In most programming languages instructions execute in sequence unless parallelism is made explicit with, say, threads or processes/tasks.  In * UML it is just the opposite.  Everything runs in parallel (on an imaginary massively parallel architecture) and sequence only occurs where explicitly specified.  A key benefit of a language like this is that once you build a set of models for an Air Traffic Control Application, for example, you can compile the models to platforms with a variety of parallelism implementation.  The same models could be compiled onto a single processor architecture or onto a distributed processor architecture.  Same models, different code generation.  After all, the application rules don't change - why should the models that formalize those rules change?  Only the implementation goo should vary.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The modeling language itself should be have as few symbols/rules as possible.  The less the better.  This is because we want the language mechanics to fade into the background with the rules of the application brought to the forefront.  The goal of a * UML model is to express the application rules as clearly as possible, in as much detail as possible, without specifying an implementation.&lt;/li&gt;&lt;/ul&gt;* UML is inspired by these books if you want to know more:&lt;br /&gt;&lt;br /&gt;Executable UML&lt;br /&gt;&lt;b&gt;ISBN:&lt;/b&gt; 0201748045&lt;br /&gt;Model Driven Architecture with Executable UML&lt;br /&gt;&lt;b&gt;ISBN:&lt;/b&gt; 0521537711&lt;br /&gt;MDA Explained&lt;br /&gt;&lt;b&gt;ISBN:&lt;/b&gt; 0201788918&lt;br /&gt;&lt;br /&gt;The purpose of this blog is to post technical notes and developments as I construct the * UML editor and accompanying metamodels.&lt;br /&gt;&lt;br /&gt;By the way, you can download the current release at SourceForge:&lt;br /&gt;&lt;br /&gt;http://sourceforge.net/projects/starruml/&lt;br /&gt;&lt;br /&gt;Finally, my company's web page is here:&lt;br /&gt;http://modelint.com&lt;br /&gt;&lt;br /&gt;That's all for now.&lt;br /&gt;&lt;br /&gt;- Leon&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34308055-115810951567567056?l=starruml.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://starruml.blogspot.com/feeds/115810951567567056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34308055&amp;postID=115810951567567056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/115810951567567056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34308055/posts/default/115810951567567056'/><link rel='alternate' type='text/html' href='http://starruml.blogspot.com/2006/09/getting-started.html' title='Getting Started'/><author><name>Leon Starr</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_N1_lWDBsbVk/SKrqyIx8o2I/AAAAAAAABO8/Rxh5_Jvkd1o/S220/Photo+60.jpg'/></author><thr:total>0</thr:total></entry></feed>
