<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Applying Umple to the rover control challenge problem: A case study in model-driven engineering</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Timothy C. Lethbridge</string-name>
          <email>timothy.lethbridge@uottawa.ca</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Abdulaziz Algablan</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Electrical Engineering and Computer Science, University of Ottawa, K1N 6N5</institution>
          ,
          <country country="CA">Canada</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>We demonstrate the use of the textual modeling language called Umple on a software modeling challenge problem that requires participants to create an executable model of a robotic rover that must follow another rover at a safe distance. We used a wide variety of features of Umple in the solution, including class models, state machines, aspects, and mixsets (feature models). We implemented two separate solutions to the problem. Our first solution, in which pulses of full power of varying lengths alternate with direction changes, performs significantly better than our second solution in which power and direction are blended together and varied in amplitude. Overall Umple proved very versatile at exploring various dimensions of this problem.</p>
      </abstract>
      <kwd-group>
        <kwd>Umple</kwd>
        <kwd>autonomous control</kwd>
        <kwd>mixins</kwd>
        <kwd>state machines</kwd>
        <kwd>case study</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        In this paper we present a solution, written in Umple, to the MDETools 2018 workshop
challenge problem [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. The problem involves arranging for a rover to follow a randomly
moving leader rover in a simulated environment. The challenge is to create a model that
can generate code whereby the follower stays neither too far (15 simulation distance
units by default) from the leader nor too near (12 units) to it, and turns appropriately to
follow it. Follower speed and direction primarily has to be controlled by independently
varying power to left- or right-side sets of wheels; braking is also available.
      </p>
      <p>Our solution involved static and dynamic modeling. The static model was a class
model of the two types of rovers, with various attributes and associations. For the
dynamic part of the problem – autonomous following – we used two distinct models. The
first we call ‘frequency modulation’. It involves applying pulses of 100% forward thrust
to both sides, as well as turning pulses (one side 100% forward, the other side 100%
reverse). The pulses are varied in duration (and hence frequency), with longer pulses
being needed when greater corrective action is needed. This mimics the way a human
might manually operate the follower rover; indeed it was inspired by spending time
using a manual interface provided by the workshop organizers.</p>
      <p>The second approach we call ‘amplitude modulation’. It uses a state machine that
adjusts the power of left side and right side wheels at regular intervals. The amount of
power applied is varied depending on the need for corrective action. Similarly, the
greater the need for turning, the greater the difference between power applied to left
and right wheels.</p>
      <p>While it was easy to tune the system to give good following results for the frequency
modulation approach, we were not able to effectively tune the amplitude modulation
approach. The main lessons from this paper are, however, the effectiveness of Umple
for modeling the problem and developing the solution. Umple features such as state
machines, mixsets, its dual textual-diagram nature, and the detailed feedback it gave to
point out model weaknesses all facilitated rapid development of our solution.</p>
      <p>In the next section we give an overview of Umple. Following that, we give a detailed
narrative of the steps we followed to develop the solutions, and our lessons learned.
2!</p>
    </sec>
    <sec id="sec-2">
      <title>Brief overview of Umple</title>
      <p>
        Umple [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] is an open-source textual language for representing software models and
blending them with programming-language code. It is intended to make modeling easy
for developers, presenting them with a familiar-looking syntax and freedom to use the
toolchain of their choice. It can be used as through the UmpleOnline website, in Eclipse,
or on the command line. Umple has proved particularly useful among modeling
educators [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
      <p>
        Umple’s features are described in its 530-page user manual [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], with over 430
examples, as well as in 35 peer-reviewed publications and 14 theses. Some of its modeling
constructs include classes, interfaces, attributes [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], enumerations, associations [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ],
constraints, patterns, methods, state machines [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], generation templates, active objects
[
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] and trace directives [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. Umple incorporates a subset of UML features and follows
UML semantics for those features; it does not, however, attempt to include all of UML.
Beyond UML, it supports several approaches to separation of concerns that are suited
to its textual nature, including mixins, traits [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], aspects, mixsets [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], and filters. It
can generate, incorporate, and/or be incorporated in Java, C++ and Php.
      </p>
      <p>Although it can be made to ‘play nicely’ with models and tools that are part of the
Eclipse/Papyrus/EMF ecosystem, it does not by design have any dependencies on that
ecosystem.</p>
      <p>
        In the remainder of the paper we will present and explain a few snippets of Umple
as we illustrate the work we performed on the challenge problem. The reader is invited
to view our repository [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] for complete details of the model.
3!
      </p>
    </sec>
    <sec id="sec-3">
      <title>Method used to develop the solutions</title>
      <p>We followed an agile approach to developing our solutions. This involved small
iterations with testing and re-planning after each iteration.</p>
      <p>
        Each iteration is outlined in this section. We have documented in detail the process
we followed to help others understand experiences in using Umple, and to allow
comparison of tools. The resulting code, at various stages has been placed in a Github
repository umple/roverChallenge [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]. Releases of the jars have been created so the
reader can check out and run the simulation at any stage.
3.1!
      </p>
      <sec id="sec-3-1">
        <title>Iteration 0: Converting to Umple and getting a basic controller working</title>
        <p>We created the first version of our system in the following three sub-steps:</p>
      </sec>
      <sec id="sec-3-2">
        <title>Operationalizing the provided manual program. First we ensured we could run the</title>
        <p>
          provided (manual-controller) version of the challenge problem [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]. This includes three
executables: 1) The rover simulator, a visual environment made with Unity. 2) The
Observer environment, a Java application; and 3) the provided RoverController that
allows the user to manually use keyboard keys to give commands to the follower. These
three communicate using TCP/IP. The challenge problem requires replacement of only
the third component with an autonomous controller.
        </p>
        <p>The provided application also comes with a configuration file allowing changing
various parameters, such as how erratic the leader should be in terms of speed and
changes of direction. Although we experimented informally with adjusting these
parameters, we elected to leave them exactly as they were provided for the remainder of
our work. This will allow other models to be compared to ours more easily.</p>
        <p>We encountered some initial obstacles getting the provided setup working on our
Macintosh. However these turned out to be caused by omissions in the instructions for
manually controlling the follower, and were fixed after consulting the organizers.</p>
        <p>After getting the manual controller working, we spent approximately 30 minutes
controlling the follower manually in order to better understand the behavior of the
leader and strategize about how we would model an autonomous follower. Manual
control using the provided interface involves pressing the ‘up arrow’ key to apply full
power to the wheels; releasing the key causes the rover to ‘coast’ over the simulated
gravel environment. We found that the best way to cause the follower rover to maintain
an optimal distance from the leader is to pulse the power by pressing the key for short
intervals (about once a second for half a second), but more often and for longer if the
follower rover falls behind, and ceasing the pulses if the follower gets too close. Manual
control for steering is by pressing the left or right arrow keys; this causes full power to
be applied to the wheels on one side (e.g. left to turn right) and full reverse power to be
applied to the opposite set of wheels. We found that pulsing this power by pressing
these keys for brief intervals, between forward pulsing, best enables course correction.
These observations became the basis for our Frequency Modulation solution discussed
in Section 3.2 below.</p>
        <p>
          We committed the original version of the code to our repository [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ].
        </p>
      </sec>
      <sec id="sec-3-3">
        <title>Umplification of the provided manual controller. Umplification [15] [16] is a key</title>
        <p>
          process recommended for many adopters of Umple that are faced with an existing code
base. It involves taking code written in a language such as Java and converting it into
Umple. This allows developers of legacy software to gradually and painlessly convert
their code so that it becomes model-based, all the while making sure tests pass at every
stage. The ‘Umplificator’ tool [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ] would have allowed this to be done automatically,
although for this relatively small example, we did it manually, since there were only
about 5 lines of code to change.
        </p>
        <p>The provided manual controller code consists of three files.
SocketCommunicator.java, DriveCommands.java and RoverController.java. We elected to initially only
umplify the third of these, and leave the others as ‘external libraries’, in order to
demonstrate an important feature of Umple: interoperation with other tools, in this case plain
Java. The umplification of RoverController.java was a one-minute process, since the
Umple compiler accepts Java syntax in almost as-is. The result was a file called
RoverController.ump. We simply had to convert Java ‘import’ statements into Umple
‘depend’ statements and declare the other two files as external Java classes using Umple’s
‘external’ keyword. We then used the manual rover controller user interface, described
above, to verify that the resulting program (compiled now by Umple) behaved in the
same way as the originally-provided program.</p>
        <p>We used the command-line version of the Umple compiler for this work, as well as
UmpleOnline for working with diagrammatic views of the models.</p>
      </sec>
      <sec id="sec-3-4">
        <title>Stripping the manual control and adding dumb controller logic. The next iteration</title>
        <p>involved stripping all the manual control logic, including the user interface that
accepted keystrokes, from the system. Control of the rover was replaced by a single short
method called ‘follow()’ that simply drives straight, makes a turn and drives straight
again. In other words it does not actually pay any attention to the leader, but was written
to ensure that the system still could be compiled and executed.</p>
        <p>It is worth noting at this stage that although the RoverController class is written in
Umple, it is still not at this stage using any of Umple’s modeling capabilities. The
follow() method is just plain Java. One of the key features of Umple is that plain Java can
be embedded in Umple. However a diagram can nonetheless be drawn of the system by
Umple, and this appears in Figure 1.</p>
        <p>
          The end-result of this step was committed to the repository [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ] and tagged as V1.
A release of the V1 jar is also available.
3.2!
        </p>
      </sec>
      <sec id="sec-3-5">
        <title>Version 2: The ‘Frequency Modulation’ (FM) solution</title>
        <p>Our next step was to start altering the Umple model to enable autonomous control. In
the RoverController.ump file, we defined an abstract Rover class that has attributes and
methods common to the leader and follower. We added subclasses for the latter two.
Implementations of methods allow instances of these classes to be updated with current
information about their position by querying the connected servers.
Of particularinterest is a method that computes the bearing from the follower to the
leader, enabling it to know what course it must optimally follow. This is line 151 in
RoverController.ump and is as follows:
bearingToLeader= Math.toDegrees(Math.atan2(leader.getXPosQuick()
- getXPosQuick(),leader.getYPosQuick() - getYPosQuick()));</p>
        <p>Central to the following approaches we present later is turning the rover such that
the bearingToLeader is within 5 degrees of the follower’s compass heading.
1
2
3
4
5
6
7
8
9
10
11
12
13 }
class Rover {
abstract;
String nameForCommanding;
SocketCommunicator querySocket;
long lastUpdateTime = 0L;
* -&gt; 1 RoverController controller; // association
Double xPos = 0.0;</p>
        <p>before getXPos {updatePosition();} // get from server
Double xPosQuick = {xPos}; // get from cache
Double yPos = 0.0;</p>
        <p>before getYPos {updatePosition();}
Double yPosQuick = {Pos};</p>
        <p>Figure 2 is a class diagram generated by Umple. Figure 3 is a sample of Umple text
describing the Rover class. Some features of Figure 3 are worth pointing out:
•! Line 2 has the keyword ‘abstract’ this is Umple’s syntax to declare a class as abstract.</p>
        <p>We call such keywords ‘stereotypes’ following UML conventions.
•! Lines 3,4,5,7 and 10 define various attributes. They are like variable declarations but
have more sophisticated semantics, aligning with UML conventions, but also
allowing ‘aspects’ to systematically adjust their generated code.
•! Lines 8 and 11 are simple aspects that ensure that before accessing the data, it is
updated from the server.
•! Lines 9 and 12 allow bypassing this update, if the developer knows it has recently
been performed.</p>
        <p>After tuning, we were able to ensure that follower follows the leader in all
circumstances, but it errs on the side of following too far (following too close can lead to
crashes). Table 1 shows that version 2 of the follower on average manages to stay in
the required zone 53.2% of the time when tested with the provided testing module
UnityObserver.jar. Version 2 of the RoverController jar is available in our repository.</p>
      </sec>
      <sec id="sec-3-6">
        <title>Version 2a: Improving model quality and exploring parameter variation. Our next</title>
        <p>step was to refactor and improve the Umple model. Unlike Java and many other
languages, Umple does not force the user to keep one class per file. In fact, a typical Umple
model would have a several-to-several relationship between files and class fragments.
Files in Umple should be seen as units of human-understandable functionality. Umple’s
ability to distribute class fragments among multiple files might hypothetically make it
hard to find needed code or model elements. However in practice, we have found this
is not an issue: Javadoc generated from Umple helps the user locate the needed
elements, as do diagrams generated by Umple and simple searching.</p>
        <p>Figure 4 presents the File model for distribution of functionality after refactoring.
We left the pure Umple class model into RoverController.ump. We moved utility logic
such as code that obtains data from servers and calculates values such as bearings to
RoverController_code-updateData.ump, and the follow() method to
RoverController_FMfollow.ump. We also extracted hard-coded parameters needed for the control
algorithm to RoverController_FMparameterSets.ump.</p>
        <p>As a final step to create version 2a of our controller, we experimented with changing
values of key algorithm parameters. In particular we had originally decided to allow the
lower bound for the time-period of power pulses, and also the coasting period between
pulses, to be 500 ms, mimicking our manual control method discussed in Section 3.1.
To make the controller more responsive we reduced this to 250ms. Table 1 shows this
resulted in much better in-zone following performance. We tried to reduce these
parameters to be 125ms, or other values between 125 and 250ms, however we ran into
problems: Messages sent to the simulation and the RoverController were sometimes
taking more than 125ms for the round trip (message sends plus processing), and this
led to erratic behavior. This is classic deadline-miss behavior common in real-time
systems. We settled on 250ms as the shortest time that resulted in stable behavior.
For version 3, we attempted to create a totally different algorithm. Whereas in version
2, we had pulsed full power for varying amounts of time, with full 100%/-100% power
application for direction changes if needed. In version 3, we tried instead adjusting
power at values less than 100%. We also attempted to turn by varying the power to left
and right wheels – with greater difference when more turning is needed.</p>
        <p>This was achieved by using a pair of state machines to control distance and direction.
The diagram for the latter appears in Figure 5, and the Umple code appears in Figure 6.
Full details are in the repository. Textual state machines in Umple can be identified as
a state machine name followed by a brace, so line 2 of Figure 6 marks the start of a
state machine. Line 3 marks the start of a state. Line 5 indicates an action to take on
entry to the state. Line 6 specifies a guarded transition, with the guard in square
brackets, and the target state appearing after the -&gt; symbol. The words in all-caps are tuning
parameters that can be adjusted in the file RoverController_AMparameterSets.ump.</p>
        <p>Although we spent much time trying to fine-tune the parameters for this AM
approach, we were never able to get it to perform as well as the FM approach.</p>
        <p>We have nonetheless left the AM approach in the code base, but have switched it off
by commenting out the mixset (feature) that activates it in the feature model. A user
running version 3 of our system will achieve the same results as for version 2a unless
they uncomment RoverController.ump line 22 and comment out line 21.</p>
        <p>Results of executing the Amplitude Modulation solution are found in Table 2.
We wrote 732 lines of Umple model/code. Generated Java was about double that. We
did not find any bugs in Umple in this project, and were able to complete it in a day.</p>
        <p>Some Umple features that proved particularly useful were the following:
•! The Umple compiler’s error messages were precise and allowed us to rapidly solve
the few syntax or semantics errors we made. It usually just took minutes from the
time of completion of writing any update of the model/code to the time when we
were able to get the new version running. The majority of development time was
spent strategizing about the model, tuning model parameters, and running the
simulation. Debugging of Umple or embedded Java was less than 5% of total time spent.
•! It was nice to be able to see both textual and graphical views of the model, as they
were able to serve as quality checks on each other.
•! Embedding of algorithmic code (as needed for calculations) in the model helped
simplify development. These were added as derived attributes, state machine actions,
and ordinary methods.
•! Injection of code into generated methods, such as to load data from the server and
send control messages, using Umple’s ‘before’ and ‘after’ constructs, proved very
useful and effective.
•! Umple’s mixset capability, allowing alternative versions (AM and FM agorithms)
of our product line served well in the solution to this problem.</p>
        <p>The ‘FM’ version of the solution, using pulses of full power, worked better than the
‘AM’ version, that varied power amplitude. The software that was provided for the
challenge did not facilitate the automation of parameter tuning because each run would
take several minutes. Nonetheless, we were able to develop a solution by manually
adjusting parameters that kept the follower at the desired distance 65.5% of the time.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Conclusions and future work</title>
      <p>From the perspective of the authors, Umple’s features discussed in the last section made
it both useful and easy to use for this project. They allowed us to effectively solve the
core modeling problem, which was to enable a rover to autonomously follow another.</p>
      <p>We tried two dynamic autonomy models. The one that worked best involved pulsing
power to the wheels. We suspect this is because the follower needs to apply full power
much of the time in order to keep up with the leader, and perhaps because pulsing might
help prevent skidding, in the same manner as pulsing car brakes stops skidding.</p>
      <p>As future work it would be nice to instrument the simulation so the parameters can
be learned via machine learning. Many variations of the model could also be tried.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.! MDETools Workshop, “Challenge Problem”, https://mdetools.github.io/mdetools18/challengeproblem.html (
          <issue>Visited July 2018</issue>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.! University of Ottawa, “Umple Home Page”, http://www.umple.
          <source>org (Visited July</source>
          <year>2018</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.! Github, “
          <article-title>Umple Model-Oriented Programming”</article-title>
          , https://github.com/umple/umple (Visited
          <source>July</source>
          <year>2018</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.! Lethbridge,
          <string-name>
            <surname>T.C.</surname>
          </string-name>
          “
          <article-title>Teaching Modeling Using Umple: Principles for the Development of an Effective Tool”</article-title>
          , CSEE&amp;T
          <year>2014</year>
          ,
          <article-title>IEEE Computer Society</article-title>
          , Austria, pp
          <fpage>23</fpage>
          -
          <lpage>28</lpage>
          (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.! Agner, Luciane T. W. and
          <string-name>
            <surname>Lethbridge</surname>
            ,
            <given-names>T.C.</given-names>
          </string-name>
          ,
          <article-title>(“A Survey of Tool Use in Modeling Education”</article-title>
          ,
          <source>Models</source>
          <year>2017</year>
          , IEEE Computer Society, pp
          <fpage>303</fpage>
          -
          <lpage>311</lpage>
          (
          <year>2017</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.! University of Ottawa, “Umple User manual”, http://manual.umple.
          <source>org (Visited July</source>
          <year>2018</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.! Badreddin,
          <string-name>
            <given-names>O</given-names>
            ,
            <surname>Forward</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            , and
            <surname>Lethbridge</surname>
          </string-name>
          , T.C., “
          <article-title>Exploring a Model-Oriented and Executable Syntax for UML Attributes”</article-title>
          ,
          <source>SERA 2013</source>
          , Springer SCI 496, pp.
          <fpage>33</fpage>
          -
          <lpage>53</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.! Badreddin,
          <string-name>
            <given-names>O</given-names>
            ,
            <surname>Forward</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            , and
            <surname>Lethbridge</surname>
          </string-name>
          , T.C., “
          <article-title>Improving Code Generation for Associations: Enforcing Multiplicity Constraints and Ensuring Referential Integrity”</article-title>
          ,
          <source>SERA 2013</source>
          , Springer SCI 496, pp.
          <fpage>129</fpage>
          -
          <lpage>149</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.! Badreddin,
          <string-name>
            <given-names>O.</given-names>
            ,
            <surname>Lethbridge</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.C.</given-names>
            ,
            <surname>Forward</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            ,
            <surname>Elasaar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Aljamaan</surname>
          </string-name>
          ,
          <string-name>
            <surname>H</surname>
          </string-name>
          , Garzon,
          <string-name>
            <surname>M.</surname>
          </string-name>
          , “
          <article-title>Enhanced Code Generation from UML Composite State Machines”</article-title>
          ,
          <source>Modelsward</source>
          <year>2014</year>
          , Portugal, INSTICC, pp.
          <fpage>235</fpage>
          -
          <lpage>245</lpage>
          (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.!
          <string-name>
            <surname>Husseini-Orabi</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Husseini-Orabi</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          , and
          <string-name>
            <surname>Lethbridge</surname>
          </string-name>
          , T.C.
          <article-title>“Concurrent Programming using Umple”</article-title>
          ,
          <source>Modelsward</source>
          <year>2018</year>
          , pp.
          <fpage>575</fpage>
          -
          <lpage>585</lpage>
          (
          <year>2018</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.! Aljamaan,
          <string-name>
            <given-names>H.</given-names>
            ,
            <surname>Lethbridge</surname>
          </string-name>
          <string-name>
            <surname>T.C.</surname>
          </string-name>
          “
          <article-title>MOTL: a Textual Language for Trace Specification of State Machines and Associations”</article-title>
          ,
          <source>Cascon</source>
          <year>2015</year>
          , ACM,
          <fpage>101</fpage>
          -
          <lpage>110</lpage>
          (
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.! Abdelzad,
          <string-name>
            <given-names>V</given-names>
            , and
            <surname>Lethbridge</surname>
          </string-name>
          , T.C. “
          <article-title>Promoting Traits into Model-Driven Development”</article-title>
          ,
          <source>Software and Systems Modeling</source>
          ,
          <volume>16</volume>
          :
          <fpage>997</fpage>
          -
          <lpage>1017</lpage>
          (
          <year>2015</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.! Lethbridge.,
          <string-name>
            <given-names>T.C.</given-names>
            and
            <surname>Algablan</surname>
          </string-name>
          ,
          <string-name>
            <surname>A.</surname>
          </string-name>
          “
          <article-title>Using Umple to Synergistically Process Features, Variants, UML Models and Classic Code”</article-title>
          , ISOLA, October, Springer (
          <year>2018</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.! Github,
          <article-title>" Umple case study implementing an autonomous rover"</article-title>
          , https://github.com/umple/roverChallenge (Visited
          <source>July</source>
          <year>2018</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.! Lethbridge,
          <string-name>
            <given-names>T.C.</given-names>
            ,
            <surname>Forward</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            and
            <surname>Badreddin</surname>
          </string-name>
          ,
          <string-name>
            <surname>O.</surname>
          </string-name>
          “
          <article-title>Umplification: Refactoring to Incrementally Add Abstraction to a Program”</article-title>
          , WCRE, Boston,
          <year>October 2010</year>
          , pp.
          <fpage>220</fpage>
          -
          <lpage>224</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.! Garzon,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Lethbridge</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.C.</given-names>
            ,
            <surname>Aljamaan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            , and
            <surname>Badreddin</surname>
          </string-name>
          ,
          <string-name>
            <surname>O.</surname>
          </string-name>
          “
          <article-title>Reverse Engineering of Object-Oriented Code into Umple using an Incremental and Rule-Based Approach”</article-title>
          , Cascon,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>