<!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>Tool-Supported Step-By-Step Debugging for the Ob ject Constraint Language</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Lars Schtze</string-name>
          <email>lars.schuetze@tu-dresden.de</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Claas Wilke</string-name>
          <email>claas.wilke@tu-dresden.de</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Birgit Demuth</string-name>
          <email>birgit.demuth@tu-dresden.de</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Technische Universit t Dresden Software Technology Group</institution>
          ,
          <addr-line>Dresden</addr-line>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <fpage>73</fpage>
      <lpage>82</lpage>
      <abstract>
        <p>Although originally designed as an extension for the Uni ed Modeling Language (UML), the Object Constraint Language (OCL) has been broadly adopted in the context of UML as well as other modeling and domain-speci c languages. However, appropriate tooling, supporting software developers on using OCL is still scarce and lacks debugging support. As OCL constraints are likely to become rather complex for real world examples, it is typically hard to comprehend the in uence of single OCL expressions on the result of an evaluated OCL constraint. Therefore, debugging is of topmost importance for both constraint comprehension and maintenance. In this paper, we evaluate existing debugging tools for OCL and come to the conclusion that no real step-by-step debugger for OCL exist, yet. Therefore, we analyze requirements for OCL debuggers and present an OCL debugger implementation for Dresden OCL.</p>
      </abstract>
      <kwd-group>
        <kwd>OCL</kwd>
        <kwd>Debugging</kwd>
        <kwd>Tracing</kwd>
        <kwd>IDE4OCL</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        Within the last 20 years, the Object Constraint Language (OCL) [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] has become
a widely adopted constraint language used in the context of the Unied
Modeling Language (UML) [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] as well as transformation languages like Query View
Transformation (QVT) [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], and other domain-specic modeling languages [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].
However, for the further acceptance of OCL in research and industrial
application, adequate tooling for an IDE4OCL is still missing [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. An online survey
conducted by Chimiak-Opoka et al. among more than 100 OCL users in 2009
and 2010 revealed, that the most-wanted features for such integrated
development environments (IDEs) comprise adequate OCL debugging and refactoring
support [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>
        Whereas refactoring focuses on the maintenance and optimization of OCL
expressions, debugging allows for their systematic execution, and therefore, the
identication of implementation faults within OCL constraints [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Although
OCL refactoring has been investigated and implemented for existing tooling
recently [
        <xref ref-type="bibr" rid="ref7 ref8">7,8</xref>
        ], accurate support for OCL debugging is still an open task. First
approaches support OCL evaluation tracing [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], butto the best of our knowledge
no real step-by-step debugging for OCL exist, yet. Thus, in this paper, we present
a step-by-step debugger for OCL, implemented for an open-source OCL tool,
namely Dresden OCL 1. We identify requirements for OCL debugging and
evaluate existing OCL tools w.r.t. their support for OCL debugging. Afterwards, we
present our implementation of a step-by-step debugger for Dresden OCL.
      </p>
      <p>The remainder of this paper is structured as follows. In Sect. 2 we dene
the term OCL debugging as understood in this paper. Afterwards, in Sect. 3
we identify requirements and useful features for step-by-step OCL debuggers.
Following, we investigate OCL and OCL-related tools in Sect. 4 w.r.t. the
identied requirements for OCL debugging functionality. Finally, Sect. 5 outlines our
implementation for OCL debugging and Sect. 6 concludes this paper.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Background</title>
      <p>
        The use of debugging has a long tradition in electronics and computer science.
Thus, various denitions and understandings of the term debugging exist. Since
the 1960s, debugging is recognized as a process of nding and correcting bugs
(errors, defects) in computer programs. However, debugging is often explained
as the process of correcting syntactic and logical errors, detected during coding
only [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. Within the same meaning, Sommerville emphasizes in his software
engineering text book [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] that debugging and defect testing are dierent
processes: defect testing establishes the existence of defects; debugging is concerned
with locating and correcting these defects. A state-of-the-art debugging tool,
mostly called a debugger, generally provides both functionalities. It is used to
test and debug programs [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], and oers functions such as
      </p>
      <p>Step-by-step execution of a program one line at a time: therewith the
programmer may examine the state of related data, before and after execution
of a particular line of code,
Breaking or stopping the program to examine the current state at a specied
instruction by means of a breakpoint,
Tracing the values of variables,
Modifying the program state while it is running,
Logging of debugging activities,
(Semi-)Automating test case generation out of logged debugging results.</p>
      <p>Although some of these debugging aspects can be considered as being highly
related to imperative languages (e.g., step-by-step execution of a program
executing one line at a time), similar functionality is also required for declarative
and side-eect free languages such as the OCL. Although each OCL constraint or
query may be expressed as one single line of code, this line of code can comprise
many tree-structured OCL expressions which are evaluated during interpretation
in a visitor-based manner. Thus, for OCL programmers it is helpful in analyzing
bugs to know the immediate results of each subsequent constituent of an OCL
expression. Therefore, we test and debug individual OCL expressions instead</p>
      <sec id="sec-2-1">
        <title>1 http://www.dresden-ocl.org/</title>
        <p>1 context Person:
2 inv: getChildren()-&gt;size() &gt;= 0</p>
        <p>Listing 1. An example OCL constraint.
1 context Person def: getAge() : Integer =
2 self.age + (if self.hadBirthday then 1 else 0 endif)</p>
        <p>Listing 2. A constraint with an if expression.
of imperative program statements that are typically coded by one statement
per (code) line. Besides step-by-step execution of OCL sub-expressions, OCL
programmers are interested in tracing the values of variables as well as using
conditional breakpoints in an expression to examine their current state. We call
this technique step-by-step debugging .
3</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Requirements</title>
      <p>
        In the following, we discuss requirements and useful features for step-by-step
OCL debuggers. The requirements emerge from the debugging features described
by Zeller [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] outlined above, as well as from an analysis of the functionality
provided by existing OCL debuggers such as USE [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] and debug tools for imperative
programming languages such as the Eclipse Java development tools (JDT) 2.
/R1/ Step-by-step debugging A step-by-step OCL debugger should support
step-wise debugging of OCL expressions. The debugger should suspend its OCL
evaluation when reaching a breakpoint dened on an OCL expression. Such a
breakpoint could be either dened on the respective OCL expression in an OCL
editor (concrete syntax), or by marking the respective OCL expression in a
treebased presentation of nested OCL expressions (abstract syntax).
/R1.1/ Highlighting the currently interpreted OCL expression As OCL is a
declarative language, a single line of OCL code in concrete syntax is likely to
contain several OCL expressions (e.g., the OCL constraint given in Listing 1
consists of three operation call expressions, one integer literal expression and one
implicit variable call expression referring to the self variable). Thus, if an OCL
debugger is suspended during interpretation, it should highlight the currently
evaluated OCL expression within an OCL editor, or within a tree-base
representation of its abstract syntax, or optimally, both. For the given example, either
one operation call, the integer literal or the whole constraint (at the beginning
or the end of the constraint’s interpretation) should be highlighted.
      </p>
      <sec id="sec-3-1">
        <title>2 http://projects.eclipse.org/projects/eclipse.jdt</title>
        <p>:ExpressionInOcl
&gt;= : OperationCallExp
Stack-based:
source
size() : OperationCallExp</p>
        <p>source
getChildren() : OperationCallExp</p>
        <p>source
self : VariableExp</p>
        <p>parameters
0 : IntegerLiteralExp
size() : OperationCallExp
&gt;= : OperationCallExp
:ExpressionInOcl
Legend:</p>
        <p>Interpretation Started</p>
        <p>Current Position of Interpreter</p>
        <p>
          Interpretation Not Yet Started
/R1.2/ Stepping support Existing debuggers (e.g., debuggers based on the Eclipse
debugging framework) support dierent kinds of stepping for step-by-step
debugging; namely step into, step over and step return. OCL debuggers should
support these three kinds of debugging steps. For example, for the if expression
shown in line 2 of Listing 2 and the current position of the interpretation
being after the evaluation of the condition self.hadBirthday to true, a step into
would continue the evaluation and suspend again in front of the then expression
1, whereas a step over and a step return would both result in a suspension in
front of the the + operation.
/R2/ Visualization of the visited OCL expressions During OCL
interpretation, nested OCL expressions are evaluated in a visitor-like manner. To
visualize the currently evaluated OCL expressions, OCL debuggers should
visualize the visited OCL expressions either in a tree-based or stack-based manner.
For example, for the OCL invariant shown in Listing 1 and the interpretation
being suspended at the size() operation call, the tree- and stack-based
representations of the currently evaluated OCL constraint are shown in Fig. 1.
/R3/ Visualization of results for evaluated OCL expressions Although
the visualization of the currently evaluated OCL expressions in a tree- or
stackbased manner can ease the understanding of OCL interpretation, an OCL
debugger should visualize the results of already evaluated nested OCL expressions,
giving an overview on all evaluated expressions and their results, and thus, the
causes for the sub-expressions being evaluated in the following (e.g., for an if
expression this visualization would show the evaluated condition as well as whether
the then or the else branch have been evaluated). If a tree-based visualization for
the currently evaluated OCL expression is used (/R2/), the same visualization
can be used by annotating the nodes in the tree with their evaluation results.
/R3.1/ Filtering of evaluated sub-expressions Although the tree-based
visualization may be helpful to further understand the evaluation of an OCL expression,
it can also contain too much information in some scenarios. Therefore, OCL
debuggers can provide support ltering the expression trace (e.g., sub-expressions
causing the nal result to be false instead of true could be shown exclusively
to detect bugs in invariants) [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ].
/R3.2/ Visualization of unnecessary sub-expressions Similar to other interpreters,
OCL interpreters can be optimized to skip the evaluation of sub-expressions
having no impact onto the nal result of a nested OCL expression (e.g., for the
evaluation of an expression (a or b), b has not to be evaluated, if a results in true).
Further examples are iterators whose interpretation can be cancelled if one
visited element fullls the iterator’s condition (e.g., for the any iterator). However,
it can be helpful to fully interpret such OCL expressions and to present their
results in the tree-based evaluation trace, as the evaluated expressions letting
their evaluation being superuous may contain bugs as well [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ].
/R4/ Tracing of variable values During debugging, the values of currently
visible and accessible variables should be presented, to ease the understanding
of the current program state. For OCL debuggers, all variables dened in let
expressions as well as possible parameters emerging from the constraint’s context
(e.g., when interpreting a pre or post constraint of an operation having
arguments) should be visualized. Besides, already evaluated expressions should be
visualized as well. For example, consider the interpretation of the if expression
shown in line 2 of Listing 2, being suspended after interpreting the condition
of the if expression. At this point in time, the evaluated value of the condition
should be visualized as well to ease the understanding for the user why either
the interpretation of the then expression, or the else expression will follow.
Furthermore, the the self variable for the currently interpreted constraint should
be visualized; as well as further predened variables (e.g., the result variable, if
a post constraint is interpreted).
/R5/ Conditional breakpoints For existing debuggers (e.g., the Java
debugger of the JDT), it is very common to provide conditional breakpoints. Thus,
breakpoints can be annotated with Boolean conditions, specifying whether or
not the debugger should suspend, when the breakpoint is reached. For OCL
debuggers, these conditions should support references to variables, operations and
properties visible at the OCL expression(s) corresponding to the breakpoint.
/R6/ Watch expressions Besides conditional breakpoints, existing
debuggers support watch expressions . Watch expressions are additional expressions
being evaluated for the current context of an interpretation. For example, if
the debugger is suspended during the interpretation of a constraint dened on
a Person class, a watch expression could contain a call to an operation of this
USE
SQUAM OCL
QVT-O
MDT/OCL
Dresden OCL
/R1/ /R1.1/ /R1.2/ /R2/ /R3/ /R3.1/ /R3.2/ /R4/ /R5/ /R6/ /R7/
- - - X X X X X - -
- - - - X - - - - -
(X) - - X - - - X X X
- - - - - - - - - -
        </p>
        <p>X X X X X (X) - X - -
class (e.g., getAge()). The expression could help the user to further evaluate the
current state of the objects being interpreted, besides the variables visible in the
variables view.
/R7/ Program and program state modication As introduced in Sect. 2,
debugging can include the modication of the debugged program, while it is
running. For example, the JDT Java debugger allows hot code replacement during
debugging. In the context of OCL, several dierent modications while
debugging an OCL constraint are possible. First, the debugged constraint itself can be
modied to x bugs while debugging the constraint in a certain context (e.g.,
a false Boolean literal could be xed to be true instead). Second, besides the
constraint, the model, the constraint is referring to can be modied (e.g., an
operation’s semantics given in the model could be modied during debugging).
Third, the state of the model instance, in which context the constraint is
currently debugged, can be modied (e.g., the age) of a Person being the context of
a constraint could be modied). Finally, the modication of visualized variables’
values or the evaluation results of individual OCL expressions in the tree-based
evaluation view could be supported, to check the direct impact of other values
during debugging.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Related Work</title>
      <p>Besides Dresden OCL, other OCL and OCL-related tools exist (e.g., the
UMLbased Specication Environment (USE), the Systematic Quality Assessment of
Models OCL Tool (SQUAM OCL), Eclipse MDT/OCL, and QVT-O). In the
following, we investigate these tools regarding their support for OCL debugging,
and name the requirements supported by our current implementation of an OCL
debugger for Dresden OCL. A summary of the requirements supported by all
tools discussed below is given in Table 1.</p>
      <p>
        USE3 oers an evaluation browser visualizing the evaluation of OCL
expressions as a tree [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]. The evaluation browser can be considered as an OCL
debugger (without support for step-wise OCL debugging), supporting the
requirements /R3/ and /R2/. Besides, the evaluation browser can be ltered (e.g.,
      </p>
      <sec id="sec-4-1">
        <title>3 http://sourceforge.net/projects/useocl/</title>
        <p>to show failed evaluations only and to examine the root cause of the failure or
unexpected result), supporting the requirements /R3.1/ and /R3.2/. Apart from
that USE provides variable tracing /R4/.</p>
        <p>SQUAM OCL4 oers the ability to trace the evaluation of selected OCL
expressions on a single model element. The trace is presented as text output on
the console listing all evaluation steps and their results. Therefore, SQUAM OCL
OCL can be considered as supporting the requirement /R3/ in a text-based
manner.</p>
        <p>Although the QVT-O tools of the Eclipse modeling tools 5 do not support
OCL debugging, they support debugging of QVT-O expressions, which can be
considered as rather similar functionality, as QVT-O includes OCL expressions.
The QVT-O debugger is integrated into the Eclipse environment and oers a
large subset of debugging functionality for QVT-O such as stepping /R1/, a
variables view /R4/, conditional breakpoints /R5/, and watch expressions /R6/.
However, although the QVT-O debugger supports line-based stepping, stepping
at the OCL expression level (/R1.1/ and /R1.2/) is not supported, as stepping
is only possible for individual lines of QVT-O code in the QVT-O editor.</p>
        <p>Another widely used OCL tool is MDT/OCL provided by the Eclipse
modeling tools6. MDT/OCL currently does not oer interactive debugging support. At
best, its OCL Console can be used to evaluate partial OCL expressions. However,
OCL debugging is planned to be realized for subsequent releases 7.</p>
        <p>Following, we shortly name the requirements supporty by our implementation
of an OCL debugger for Dresden OCL presented in the subsequent section. Our
solution supports step-by-step debugging /R1/ (including its sub-requirements
and the visualization of visited OCL expressions /R2/. Besides, variable
tracing /R4/ and expression tracing /R3/ are supported. The sub-requirement for
ltering /R3.1/ is partly supported, as expressions can be ltered w.r.t. true
and false values. The evaluation of unnecessary OCL expressions /R3.2/ is not
supported. Conditional breakpoints /R5/, watch expressions /R6/ and program
state modication /R7/ are targets for enhancements in future works.</p>
        <p>
          Apart from debuggers for OCL, debuggers for other declarative languages
exist. Cabellero et al. present a debugging framework for SQL views [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ]. Their
tool visualizes the computation of an SQL view as a computation tree (similar
to a tree-based representation of OCL expressions), allowing users to inspect
the computation results of individual nodes within the computation tree and
mark their results as being either correct or incorrect to detect sub statements
or nested views causing the erroneous result of an SQL view. A more advanced
SQL debugging tool is proposed by Herschel et al. [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ]. Their Eclipse-based tool
allows for inspection why specic tuples do not appear within a result set by
computing the missing relations for the expected results.
4 http://squam.info/?p=142
5 http://www.eclipse.org/mmt/?project=qvto
6 http://www.eclipse.org/modeling/mdt/?project=ocl
7 http://wiki.eclipse.org/MDT/OCL/Debugger
        </p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Implementation</title>
      <p>
        As outlined above, based on the identied requirements for OCL debuggers, we
built a ready-to-use OCL debugger for Dresden OCL [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]. Although tree-based
debuggers such as the USE debugger can help to visualize the interpretation
results of OCL expressions, we argue that for real debugging, step-by-step
debugging including the highlighting of OCL expressions in a textual OCL editor
is required. Especially for the debugging of more complex OCL statements (e.g.,
iterator or even nested iterator expressions), a simple tree-based presentation is
insucient, as the text editor integration further increases the understanding of
evaluation results for individual nested OCL expressions.
      </p>
      <p>
        The existing OCL interpreter of Dresden OCL was extended by an OCL
debugger that suspends on breakpoints and propagates variable traces to the
Eclipse UI. To provide native look and feel for Eclipse-integrated debugging, the
OCL debugger was realized with the Eclipse debugging framework and was fully
integrated with the EMFText-based OCL editor and parser of Dresden OCL [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ].
During debugging, breakpoints can be dened in the OCL editor and respective
expressions are highlighted when stopping on a breakpoints during debugging.
Currently, our OCL debugger supports step-by-step debugging /R1/, the
visualization of currently interpreted OCL expressions as an expression stack /R2/, as
well as viewing the debugged expression trace /R3/ and variable tracing /R4/.
Support for conditional breakpoints /R5/, watch expressions /R6/, and program
state modication /R7/ are planned features for future works.
      </p>
      <p>
        Figure 2 shows a screenshot of the debugger in the Eclipse debug
perspective, while debugging a constraint from the Royal &amp; Loyal example by Warmer
and Kleppe [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]. At the top left, the expression stack of the currently debugged
constraint is visible. Besides, on the right, the variables view illustrates the
currently visible variables. At the currently reached breakpoint, after the evaluation
of the property call levels, the self variable is the only visible variable.
However, the variables view also contains the source and the result of the interpreted
expression call named as oclSource and oclPropertyValue and the result of the
currently interpreted constraint oclResult, which is an empty Set by now but
may by lled during the interpretation of the select and collect iterators yet
to be debugged and interpreted. Below, in the center, the OCL editor visualizes
the currently debugged constraints and OCL expressions. Below, at the bottom
of the screen, a tracer view illustrates the expression trace of yet debugged OCL
expressions and their results in a tree-like manner.
6
      </p>
    </sec>
    <sec id="sec-6">
      <title>Conclusion</title>
      <p>
        In this paper, we identied requirements for OCL debugging and evaluated
existing OCL tools w.r.t. debugging support. We showed that none of the investigated
tools fully supports step-by-step debugging for OCL, yet. Although, OCL
debugging has been highlighted as one of the most-wanted features in related work [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
Therefore, we presented our solution for a step-by-step OCL debugger that is
8
based on the Eclipse debugging framework and extends the existing interpreter
of Dresden OCL. The OCL debugger has been extensively tested and is
publicly available8. To the best of our knowledge, this is the rst tool supporting
step-by-step debugging for OCL. In future works we plan to address the missing
features discussed in Sect. 3 such as conditional breakpoints, watch expressions
and program state modication. With our step-by-step OCL debugger, OCL
tooling is another step further on its way towards an IDE4OCL as envisioned
by Chimiak-Opoka et al. [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
    </sec>
    <sec id="sec-7">
      <title>Acknowledgements</title>
      <p>This research has been co-funded within the project ZESSY #080951806, by
the European Social Fund (ESF) and Federal State of Saxony. We would like
to thank every person being or having been involved in the development and
maintenance of Dresden OCL.</p>
      <sec id="sec-7-1">
        <title>8 http://www.dresden-ocl.org/</title>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>Object</given-names>
            <surname>Management</surname>
          </string-name>
          <article-title>Group (OMG): Object Constraint Language</article-title>
          .
          <source>Version 2.3</source>
          .1. Online available speci cation (
          <year>January 2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2. Object Management Group (OMG):
          <source>Uni ed Modeling Language. Version 2.4</source>
          .1. Online available speci cation (
          <year>August 2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>Object</given-names>
            <surname>Management</surname>
          </string-name>
          <article-title>Group (OMG): Meta Object Facility (MOF) 2</article-title>
          .0 Query/View/Transformation, Version
          <volume>1</volume>
          .1. Online available speci cation (
          <year>January 2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Heidenreich</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Johannes</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Karol</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Seifert</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Thiele</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wende</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wilke</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <string-name>
            <surname>Integrating</surname>
            <given-names>OCL</given-names>
          </string-name>
          and
          <article-title>Textual Modelling Languages</article-title>
          .
          <source>In: Models in Software Engineering</source>
          . Volume
          <volume>6627</volume>
          of Lecture Notes in Computer Science., Berlin / Heidelberg, Springer (
          <year>2011</year>
          )
          <fpage>349</fpage>
          <lpage>363</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Chimiak-Opoka</surname>
            ,
            <given-names>J.D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Demuth</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Silingas</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rouquette</surname>
            ,
            <given-names>N.F.</given-names>
          </string-name>
          :
          <article-title>Requirements analysis for an integrated OCL development environment</article-title>
          .
          <source>Electronic Communications of the EASST</source>
          <volume>24</volume>
          (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Chimiak-Opoka</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Demuth</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Awenius</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chiorean</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gabel</surname>
          </string-name>
          , S., Hamann, L.,
          <string-name>
            <surname>Willink</surname>
          </string-name>
          , E.:
          <source>OCL Tools Report based on the IDE4OCL Feature Model. Electronic Communications of the EASST</source>
          <volume>44</volume>
          (
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Correa</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Werner</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <article-title>Refactoring object constraint language speci cations</article-title>
          .
          <source>Software &amp; Systems Modeling</source>
          <volume>6</volume>
          (
          <issue>2</issue>
          ) (
          <year>2007</year>
          )
          <fpage>113</fpage>
          <lpage>138</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Reimann</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wilke</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Demuth</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Muck</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>A</surname>
          </string-name>
          mann, U.:
          <article-title>Tool Supported OCL Refactoring Catalogue</article-title>
          .
          <source>In: Proceedings of the 12th Workshop on OCL and Textual Modelling</source>
          , New York, ACM (
          <year>2012</year>
          )
          <article-title>7 12</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Br</surname>
            <given-names>ning</given-names>
          </string-name>
          , J.,
          <string-name>
            <surname>Gogolla</surname>
          </string-name>
          , M., Hamann, L.,
          <string-name>
            <surname>Kuhlmann</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Evaluating and Debugging OCL Expressions in UML Models</article-title>
          .
          <source>In: Test and Proofs</source>
          . Volume
          <volume>7305</volume>
          of Lecture Notes in Computer Science., Berlin / Heidelberg, Springer (
          <year>2012</year>
          )
          <fpage>156</fpage>
          <lpage>162</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Adrion</surname>
            ,
            <given-names>W.R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Branstad</surname>
            ,
            <given-names>M.A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cherniavsky</surname>
            ,
            <given-names>J.C.</given-names>
          </string-name>
          :
          <article-title>Validation, veri cation, and testing of computer software</article-title>
          .
          <source>ACM Computing Surveys</source>
          <volume>14</volume>
          (
          <issue>2</issue>
          ) (
          <year>June 1982</year>
          ) 159
          <fpage>192</fpage>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Sommerville</surname>
            ,
            <given-names>I.: Software</given-names>
          </string-name>
          <string-name>
            <surname>Engineering</surname>
          </string-name>
          . 8th edn.
          <source>Addison Wesley</source>
          , Boston, MA (
          <year>2007</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Zeller</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Why programs fail - a guide to systematic debugging</article-title>
          .
          <source>Elsevier</source>
          (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Caballero</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          , Garc -Ruiz,
          <string-name>
            <surname>Y.</surname>
          </string-name>
          ,
          <article-title>SÆ¡enz-</article-title>
          <string-name>
            <surname>PØrez</surname>
          </string-name>
          , F.:
          <article-title>Algorithmic Debugging of SQL Views</article-title>
          .
          <source>In: Perspectives of Systems Informatics. Volume 7162 of Lecture Notes in Computer Science</source>
          ., Berlin / Heidelberg, Springer (
          <year>2012</year>
          )
          <fpage>77</fpage>
          <lpage>85</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Herschel</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>HernÆndez</surname>
            ,
            <given-names>M.A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tan</surname>
            ,
            <given-names>W.C.</given-names>
          </string-name>
          :
          <article-title>Artemis: A System for Analyzing Missing Answers</article-title>
          .
          <source>In: 35th International Conference on Very Large Data Bases (VLDB'09)</source>
          , New York, ACM (
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Sch</surname>
            <given-names>tze</given-names>
          </string-name>
          , L.:
          <article-title>OCL Debugging for Dresden OCL</article-title>
          .
          <source>Bachelor's thesis</source>
          , Technische Universit t
          <string-name>
            <surname>Dresden</surname>
          </string-name>
          (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16. A mann, U.,
          <string-name>
            <surname>Bartho</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          , B rger, C.,
          <string-name>
            <surname>Cech</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Demuth</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Heidenreich</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Johannes</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Karol</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Polowinski</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Reimann</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          , et al.:
          <article-title>DropsBox: the Dresden Open Software Toolbox</article-title>
          .
          <source>Software &amp; Systems Modeling</source>
          <volume>11</volume>
          (
          <year>2012</year>
          )
          <article-title>1 37</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Warmer</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kleppe</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>The Object Constraint Language - Getting Your Models Ready for MDA. 2nd edn. Pearson Education Inc</article-title>
          ., Boston, MA (
          <year>2003</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>