<!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>Efficient validation of large models using the Mogwa¨ı tool</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Gwendal Daniel</string-name>
          <email>gdaniel@uoc.edu</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Internet Interdisciplinary Institute (IN3) Universitat Oberta de Catalunya</institution>
          ,
          <addr-line>UOC</addr-line>
        </aff>
      </contrib-group>
      <abstract>
        <p>Scalable model persistence frameworks have been proposed to handle large (potentially generated) models involved in current industrial processes. They usually rely on databases to store and access the underlying models, and provide a lazy-loading strategy that aims to reduce the memory footprint of model navigation and manipulation. Dedicated query and transformation solutions have been proposed to further improve performances by generating native database queries leveraging the backend's advanced capabilities. However, existing solutions are not designed to specifically target the validation of a set of constraints over large models. They usually rely on low-level modeling APIs to retrieve model elements to validate, limiting the benefits of computing native database queries. In this paper we present an extension of the Mogwa¨ı query engine that aims to handle large model validation efficiently. We show how model constraints are pre-processed and translated into database queries, and how the validation of the model can benefit from the underlying database optimizations. Our approach is released as a set of open source Eclipse plugins and is fully available online.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        The limited support for managing large models has been one of the key reported factors
hampering the adoption of MDE in industrial processes [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]. Indeed, existing
modeling solutions were primary designed to assist simple, human-based modeling activities,
and are struggling to deal with large models (potentially generated using model driven
reverse engineering techniques [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]) involved in current industrial workflows. As an
example, several studies have reported scalability issues of the Eclipse Modeling
Framework [
        <xref ref-type="bibr" rid="ref12 ref9">9, 12</xref>
        ] (the de-facto standard modeling solution in the Eclipse ecosystem) and its
default serialization mechanism, XMI.
      </p>
      <p>
        These limitations have led to the creation of several scalable model persistence
frameworks relying on databases to store and access large models [
        <xref ref-type="bibr" rid="ref12 ref5 ref8">5, 8, 12</xref>
        ]. They
usually provide advanced mechanisms such as application-level caches and lazy-loading
approaches, allowing to balance the memory consumption and the application
performances. This new generation of modeling frameworks has been enhanced with
databasespecific query and transformation mechanisms [
        <xref ref-type="bibr" rid="ref1 ref6">1, 6</xref>
        ], bypassing the modeling API
limitations, and leveraging the database capabilities to further improve the performances of
existing modeling workflows.
      </p>
      <p>
        While these techniques have clearly enhanced the performance of model queries
and transformation over large models, there is only a few works that specifically
address the validation of large models. Indeed, validating a model usually requires to first
find the elements to validate, and evaluate, for each one of them, the set of
associated constraints. While the specific constraint evaluation can be addressed with existing
querying solution, the element retrieval step is usually performed at the modeling
framework API level, that have shown clear limitations when combined with current model
persistence frameworks [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
      <p>
        In this article, we present our work on extending the Mogwa¨ı query framework [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]
to provide advanced support for efficient model validation. In particular, we present an
approach that maps context-specific constraints into global queries that can be translated
into efficient database operations, improving the execution time and memory
consumption of model validation processes.
      </p>
      <p>The rest of the paper is organized as follows: Section 2 gives an overview of the
Mogwa¨ı framework and how we have extended it to improve the support of model
validation. Section 3 introduces the tool support, and Section 4 presents our first results on
using our approach to evaluate constraints on a reverse engineering case study. Finally,
Section 5 summarizes the key points of the paper and presents our future work.
2
2.1</p>
    </sec>
    <sec id="sec-2">
      <title>Framework Overview</title>
      <sec id="sec-2-1">
        <title>Mogwa¨ı</title>
        <p>
          Existing model query frameworks are typically based on the low-level APIs provided
by the modeling framework to access and evaluate queries over a model [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ]. Queries are
translated into a sequence of API calls, which are then performed one after another on
the persistence layer. While this architecture allows to easily integrate query solutions
into existing tool chains, this low-level design is clearly inefficient when combined
with persistence framework because (i) the API granularity is too fine to benefit from
the advanced query capabilities of the backend, and (ii) an important time and memory
overhead is necessary to construct navigable intermediate objects needed to interact
with the API.
        </p>
        <p>
          The Mogwa¨ı framework tackles these limitations by providing an alternative query
solution that translates modeling queries (expressed in OCL [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ]) into database queries.
The framework relies on a model-to-model transformation that generates queries
expressed using the Gremlin traversal language [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ], a high-level NoSQL query language
that targets multiple databases.
        </p>
        <p>Figure 1 presents an overview of the framework: a designer defines a set of OCL
queries over the model1, that constitute the input of the Mogwa¨ı Translation Engine.
This translation engine embeds a model-to-model transformation defining a systematic
mapping of the input OCL expressions to their equivalent Gremlin constructs. The
resulting query fragments are then assembled into a Gremlin Script, that is sent to the
database for computation. The resulting database elements are finally returned to the
1 The framework also supports model transformations that are not discussed in this article.
query framework, that takes care of their reification into standard modeling elements
that are returned to the modeler.</p>
        <p>
          We showed in our previous work [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ] that this translation of OCL expressions into
database queries can dramatically improve the performance of existing applications.
Specifically, using a translation-based approach provides the following benefits: (i) it
reduces the query fragmentation compared to standard solutions based on low-level
model handling APIs, (ii) the generated query can fully benefit from the backend
capabilities (such as embedded caches and indexes), and (iii) the approach does not reify
intermediate objects, reducing the memory consumption.
Existing modeling frameworks usually implement model validation as a two-step
process: the framework first retrieves all the elements to validate (i.e. that are concerned by
at least one constraint) and checks, for each elements, whether its associated constraints
are satisfied.
        </p>
        <p>
          While the evaluation of the constraints themselves can be performed by efficient
query frameworks like Mogwa¨ı, the initial model element retrieval usually relies on
the modeling framework API, that is not aligned with current model persistence
frameworks [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ] storing large models. This API mismatch generates fragmented queries on
the database, increasing the memory consumption and execution time of validation
operations, and reducing the benefit of using advanced query frameworks. This
element retrieval issue has been specifically reported in the context of EMF-based
applications [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ].
        </p>
        <p>
          To tackle this limitation, we propose an extension of our approach that generates a
single database query combining both the element retrieval and the constraint
computation. To do so, we rely on existing OCL rewriting techniques [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ] to pre-process the
input constraints and produce optimized OCL queries that can be efficiently translated
and computed by the model database.
        </p>
        <p>To illustrate our approach, we introduce in Listing 1.1 an example OCL constraint
validClient. This constraint is validated when the provided Client’s hasPaid attribute is
true and all its associated ordered Products have a positive price.</p>
        <p>Listing 1.1. Sample OCL Query
c o n t e x t C l i e n t i n v v a l i d C l i e n t :
s e l f . h a s P a i d i m p l i e s s e l f . o r d e r s . p r o d u c t s</p>
        <p>&gt;f o r A l l ( p j p . p r i c e &gt; 0 )</p>
        <p>
          Our solution relies on an in-place transformation of the input OCL constraint that
generates a model query returning all the model elements violating the base constraint.
This mapping is systematically applied by using the constraint Context as the input of
the generated query, followed by an allInstances() operation that retrieves all
the instances of the Context type. This allInstances() operation is followed by
a select iterator that contains the negation of the original constraint body. A similar
query rewriting approach has been proposed in [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ] to build database views from model
constraints. Listing 1.2 shows the example OCL query after this pre-processing step.
        </p>
        <p>Listing 1.2. Pre-Processed OCL Query
C l i e n t . a l l I n s t a n c e s () &gt; s e l e c t ( c j ! ( c . p a i d i m p l i e s
c . o r d e r s . p r o d u c t s &gt;f o r A l l ( p . p r i c e &gt; 0 ) ) )</p>
        <p>
          The generated query is then translated by the Mogwa¨ı framework into a Gremlin
traversal, following the operation mapping and expression composition presented in
our previous work [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ]. In particular, this mapping provides an efficient implementation
of the allInstances operation by using database indexes and caches, improving
the performance of the element retrieval. The resulting traversal is sent to the model
database for computation, bypassing the standard modeling API, and benefiting from
the database query optimizations and built-in capabilities.
3
        </p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Tool Support</title>
      <p>The Mogwa¨ı tool is implemented as a set of open-source Eclipse plugins released
under the EPL license. Source code and benchmark materials are fully available in the
project’s GitHub repository2. An Eclipse update site containing the latest stable version
of the framework is also available online.</p>
      <p>
        The framework relies on Eclipse MDT OCL [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] to parse the input queries, and
the produced OCL models constitute the input of a set of 70 ATL [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] transformation
rules and helpers implementing the mapping and the transformation process presented
in detail in our previous work [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. We enhance this mapping with an additional in-place
ATL transformation refining the input OCL constraint to produce the optimized query
introduced in Section 2.2.
      </p>
      <p>We have also extended the Mogwa¨ı API to provide support for model validation.
Specifically, we added a validate method to the MogwaiResource class,
complementing the existing query and transform ones targeting respectively OCL queries and ATL
transformations computations. This additional method takes care of pre-processing the
input OCL constraints, transform it into a Gremlin traversal to execute on the database,
and reifies the database results to display model-level information to the designer. The
2 https://github.com/atlanmod/Mogwai
framework also provides a new QueryResult type: MogwaiValidationResult, that
provides utility methods to check which constraints are violated, what are the model
element involved, and retrieve query execution information.
4</p>
    </sec>
    <sec id="sec-4">
      <title>Evaluation</title>
      <p>
        In this section we evaluate the performance of the Mogwa¨ı validation framework by
comparing the performance of validating OCL constraints in three configurations: the
standard MDT OCL toolkit implementation [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] relying on the EMF API, the
standard Mogwa¨ı query computation coupled with API-based element retrieval, and the
Mogwa¨ı validation implementation including the OCL pre-processing presented above.
The computed queries are evaluated over a model stored in the NeoEMF persistence
framework [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] relying on a graph database.
      </p>
      <p>The experiments are executed on a computer running Windows 10 64 bits. Relevant
hardware elements are: an Intel Core I7 processor (2.9 Ghz), 16GB of DDR3 SDRAM
(1600Mhz), and a SSD hard-disk. Experiments are executed on Eclipse 4.7.2 (Oxygen)
running Java SE Runtime Environment 1.8.
4.1</p>
      <sec id="sec-4-1">
        <title>Benchmark Presentation</title>
        <p>
          The experiments are run over a large model representing a Java project that has been
automatically constructed by the MoDisco Java Discoverer [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ]. The model contains
around 80000 elements representing a Java Eclipse plugin at a low level of abstraction.
        </p>
        <p>We selected two constraints to validate over this model. The first one,
NotEmptyClassName, performs a simple navigation from an input ClassDeclaration and checks
that its name is not empty. The second one, ValidJavadocTags, preforms a multi-level
navigation from an input CompilationUnit a checks that all the Javadoc tags contained
in its comments are valid (i.e. not empty and corresponding to standard Javadoc tags).</p>
        <p>We manually introduced a set of errors in the benchmarked model to ensure that
all the approaches produce the same results. The resulting model contains 10 elements
(out of 166) violating NotEmptyClassName, and 30 elements (out of 132) violating
ValidJavadocTags.
4.2</p>
      </sec>
      <sec id="sec-4-2">
        <title>Results</title>
        <p>Table 1 and 2 show the execution time (in milliseconds) and memory consumption (in
mega bytes) of the validation of each constraint. Each column stores the results of a
specific configuration. Note that the presented results are average values obtained by
running 50 time each constraint.</p>
        <p>The execution time results for the MDT OCL and EMF allInstances + Mogwa¨ı
configurations are detailed between parenthesis: the first value corresponds to the time
required to compute the allInstances operation to retrieve all the model elements to
validate, and the second one corresponds to the execution time of the constraint over all
the retrieved model elements.</p>
        <p>
          Pre-processing
+ Mogwa¨ı
The results from Table 1 and 2 shows that retrieving the elements to validate in the
model is costly for MDT OCL and Standard allInstances + Mogwa¨ı. This can be
explained by the granularity of the EMF API, that does not allow to retrieve efficiently
all the instances of a given type [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ], and thus requires to fully traverse the model to
retrieve the elements to validate.
        </p>
        <p>
          The execution time of the Standard AllInstances + Mogwa¨ı shows that the Mogwa¨ı
framework can improve the computation of complex queries over large models (around
6% for ValidJavadocTags), but is less efficient than the MDT OCL to compute simple
queries such as single attribute navigations. This can be explained by the nature of the
NotEmptyClassName query, that performs a single atomic access to an element of the
model, a costly operation in graph databases, that are rather designed to efficiently
handle complex navigations. In addition, the time required to translate the input expression
and start the underlying Gremlin traversal engine adds an execution time overhead that
is not compensated by the performance improvements for simple queries. The Standard
AllInstances + Mogwa¨ı implementation reduces the memory consumption with respect
to MDT OCL for the query computation part. The analysis of the memory content
revealed that most of the remaining elements where loaded by the initial allInstances
computation, confirming our previous results [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ].
        </p>
        <p>Finally, the Pre-processing + Mogwa¨ı approach shows positive results both in terms
of execution time and memory consumption compared to the other solutions. This is
can be explained by (i) the translation of the element retrieval operation, that allows to
benefit from the database optimizations (in particular the indexes), and (ii) the execution
of a single query to validate the entire model, that limits the number of intermediate
result elements and allows the query engine to fully optimize the query.</p>
        <p>These results are encouraging and show that rewriting model validation operations
to improve the generated database queries has a significant impact on the performances.
Still, a deeper study is required to evaluate the benefits of the approach over a more
significant set of input constraints.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Conclusion</title>
      <p>In this paper we presented our work on improving the Mogwa¨ı framework to enhance
the performance of model validation operations. We showed how query rewriting
techniques can be applied to create query variants that are efficiently translated by the
Mogwa¨ı framework. We evaluate this strategy against the standard Eclipse-based
solution, and showed positive results in terms of execution time and memory consumption.</p>
      <p>
        As future work, we plan to complement our study by analyzing the performance
impact of generated Gremlin scripts from equivalent OCL expressions within the
constraints themselves [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] (e.g. by translating implies operators to if-then-else blocks). This
information could be used to further enhance our OCL pre-processing component and
create OCL queries that can be translated into more efficient database queries. Another
ongoing work is the merging of similar constraint navigation paths into generic database
queries that could be reused and combined, reducing the database overhead implied by
redundant query computation.
      </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>K.</given-names>
            <surname>Barmpis</surname>
          </string-name>
          and
          <string-name>
            <given-names>D.</given-names>
            <surname>Kolovos</surname>
          </string-name>
          . Hawk:
          <article-title>Towards a Scalable Model Indexing Architecture</article-title>
          .
          <source>In Proceedings of the 1st BigMDE Workshop</source>
          , pages
          <fpage>6</fpage>
          -
          <lpage>9</lpage>
          . ACM,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>M.</given-names>
            <surname>Brambilla</surname>
          </string-name>
          and
          <string-name>
            <given-names>J.</given-names>
            <surname>Cabot</surname>
          </string-name>
          .
          <article-title>Constraint Tuning and Management for Web Applications</article-title>
          .
          <source>In Proceedings of the 6th ICWE Conference</source>
          , pages
          <fpage>345</fpage>
          -
          <lpage>352</lpage>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>H.</given-names>
            <surname>Bruneliere</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Cabot</surname>
          </string-name>
          , G. Dupe´, and
          <string-name>
            <given-names>F.</given-names>
            <surname>Madiot</surname>
          </string-name>
          .
          <article-title>MoDisco: A model driven reverse engineering framework</article-title>
          .
          <source>Information and Software Technology</source>
          ,
          <volume>56</volume>
          (
          <issue>8</issue>
          ):
          <fpage>1012</fpage>
          -
          <lpage>1032</lpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>J.</given-names>
            <surname>Cabot</surname>
          </string-name>
          and
          <string-name>
            <given-names>E.</given-names>
            <surname>Teniente</surname>
          </string-name>
          .
          <article-title>Transformation Techniques for OCL Constraints</article-title>
          .
          <source>Science of Computer Programming</source>
          ,
          <volume>68</volume>
          (
          <issue>3</issue>
          ):
          <fpage>179</fpage>
          -
          <lpage>195</lpage>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5. G. Daniel, G. Sunye´,
          <string-name>
            <given-names>A.</given-names>
            <surname>Benelallam</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Tisi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Vernageau</surname>
          </string-name>
          ,
          <string-name>
            <surname>A.</surname>
          </string-name>
          <article-title>Go´mez, and</article-title>
          <string-name>
            <given-names>J.</given-names>
            <surname>Cabot</surname>
          </string-name>
          .
          <article-title>Neoemf: a multi-database model persistence framework for very large models</article-title>
          .
          <source>Science of Computer Programming</source>
          ,
          <volume>149</volume>
          :
          <fpage>9</fpage>
          -
          <lpage>14</lpage>
          ,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6. G. Daniel, G. Sunye´, and
          <string-name>
            <given-names>J.</given-names>
            <surname>Cabot</surname>
          </string-name>
          .
          <article-title>Mogwa¨ı: a framework to handle complex queries on large models</article-title>
          .
          <source>In Proceedings of the 10th RCIS Conference</source>
          , pages
          <fpage>225</fpage>
          -
          <lpage>237</lpage>
          . IEEE,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>Eclipse</given-names>
            <surname>Foundation</surname>
          </string-name>
          .
          <source>MDT OCL</source>
          ,
          <year>2018</year>
          . URL: www.eclipse.org/modeling/mdt/ ?project=ocl.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>Eclipse</given-names>
            <surname>Foundation</surname>
          </string-name>
          .
          <source>The CDO Model Repository (CDO)</source>
          ,
          <year>2018</year>
          . URL: http://www. eclipse.org/cdo/.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9. A. Go´mez, G. Sunye´,
          <string-name>
            <given-names>M.</given-names>
            <surname>Tisi</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Cabot</surname>
          </string-name>
          .
          <article-title>Map-Based Transparent Persistence for Very Large Models</article-title>
          .
          <source>In Proceedings of the 18th FASE Conference</source>
          , pages
          <fpage>19</fpage>
          -
          <lpage>34</lpage>
          . Springer,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <given-names>F.</given-names>
            <surname>Jouault</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Allilaire</surname>
          </string-name>
          , J. Be´zivin,
          <string-name>
            <surname>and I. Kurtev.</surname>
          </string-name>
          <article-title>ATL: A Model Transformation Tool</article-title>
          . Science of Computer Programming,
          <volume>72</volume>
          (
          <issue>1</issue>
          ):
          <fpage>31</fpage>
          -
          <lpage>39</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11. OMG.
          <source>OCL Specification</source>
          ,
          <year>2018</year>
          . URL: www.omg.org/spec/OCL.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12. J. E. Paga´n,
          <string-name>
            <given-names>J. S.</given-names>
            <surname>Cuadrado</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J. G.</given-names>
            <surname>Molina. Morsa</surname>
          </string-name>
          :
          <article-title>A Scalable Approach for Persisting and Accessing Large Models</article-title>
          .
          <source>In Proceedings of the 14th MoDELS Conference</source>
          , pages
          <fpage>77</fpage>
          -
          <lpage>92</lpage>
          . Springer,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Tinkerpop</surname>
          </string-name>
          .
          <source>The Gremlin Language</source>
          ,
          <year>2018</year>
          . URL: www.gremlin.tinkerpop.com.
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <given-names>R.</given-names>
            <surname>Wei</surname>
          </string-name>
          and
          <string-name>
            <given-names>D. S.</given-names>
            <surname>Kolovos</surname>
          </string-name>
          .
          <article-title>An Efficient Computation Strategy for allInstances()</article-title>
          .
          <source>Proceedings of the 3rd BigMDE Workshop</source>
          , pages
          <fpage>32</fpage>
          -
          <lpage>41</lpage>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>J. Whittle</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Hutchinson</surname>
            , and
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Rouncefield</surname>
          </string-name>
          .
          <article-title>The State of Practice in Model-Driven Engineering</article-title>
          . IEEE software,
          <volume>31</volume>
          (
          <issue>3</issue>
          ):
          <fpage>79</fpage>
          -
          <lpage>85</lpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>