<!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>VarMeR - A Variability Mechanisms Recommender for Software Artifacts</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Iris Reinhartz-Berger</string-name>
          <email>iris@is.haifa.ac.il</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Anna Zamansky</string-name>
          <email>annazam@is.haifa.ac.il</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Department of Information Systems, University of Haifa</institution>
          ,
          <country country="IL">Israel</country>
        </aff>
      </contrib-group>
      <fpage>57</fpage>
      <lpage>64</lpage>
      <abstract>
        <p>Software is typically not developed from scratch and reuse of existing artifacts is a common practice. Consequently, variants of artifacts exist, challenging maintenance and future development. In this paper, we present a tool for identifying variants in object-oriented code artifacts (in Java) and guiding their systematic reuse. The tool, called VarMeR - a Variability Mechanisms Recommender, utilizes known variability mechanisms, which are techniques applied to adapt generic (reusable) artifacts to the context of particular products, for both identification of variants and recommendation on systematic reuse. Building on ontological foundations for representing variability of software behaviors, VarMeR visually presents the commonality and variability of the classes in different products and recommendations on suitable polymorphism variability mechanisms to increase systematic reuse.</p>
      </abstract>
      <kwd-group>
        <kwd>Software Product Line Engineering</kwd>
        <kwd>Variability Analysis</kwd>
        <kwd>Variability Mechanisms</kwd>
        <kwd>Polymorphism</kwd>
        <kwd>Ontology</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        In practice, software reuse takes in many cases an ad-hoc form. Often while artifacts
are not developed with reuse in mind, it is later achieved by duplicating artifacts and
adapting them to the particular needs (a clone-and-own approach). Such an approach is
easy to follow and intuitive, but has deficiencies in maintenance and future
development. Thus, various methods have been suggested to detect variants, mainly in code,
e.g., [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Targeting at comparing and evaluating clone detection tools, four types of
clones are mentioned in [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]: Type 1 – an exact copy without modifications (except for
white space and comments); Type 2 – a syntactically identical copy (only variable, type,
or function identifiers were changed); Type 3 – a copy with further modifications
(statements were changed, added, or removed); Type 4 – a syntactically different copy which
performs the same computation. Taking clone detection one step forward, a method,
named ECCO (Extraction and Composition for Clone-and-Own), is introduced in [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]
to enhance the clone-and-own approach with reuse capabilities. Given a selection of
the desired features by the software engineer, ECCO finds the appropriate software
artifacts to reuse and also provides hints whether they need adaptation. The adaptation
itself, however, is left to the software engineer.
      </p>
      <p>
        In order to provide guidance to the adaptation process and to extract reusable
artifacts which make future development and maintenance easier, we suggested in [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ],
[
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] a framework for identifying variants of software artifacts and associating
them with variability mechanisms – techniques applied to adapt reusable artifacts to the
context of particular products in Software Product Line Engineering (SPLE) [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. The
framework is based on ontological foundations, where software artifacts are viewed as
things exhibiting behavior. The framework allows us to identify similar behaviors
(rather than cloned realizations) and associate different variability mechanisms based on
the characteristics of related similarity mappings. To support this approach, we have
developed a tool called VarMeR – a Variability Mechanisms Recommender – which
gets object-oriented code artifacts (in Java) that belong to two products and provides
graphs that capture the commonality and variability of the classes of those products.
The tool further recommends how to increase reuse by utilizing suitable variability
mechanisms on similar classes. Currently VarMeR supports recommendations on three
mechanisms related to polymorphism.
      </p>
      <p>The rest of this paper is structured as follows. Section 2 provides the background of
the approach, while Section 3 presents the capabilities of the VarMeR tool. Finally,
Section 4 summarizes and refers to future development plans.
2</p>
      <p>The Approach
The approach at the heart of VarMeR analyzes the commonality and variability of
products behaviors and provides reuse recommendations in the form of associating
polymorphism mechanisms to classes that behave similarly (even if their realizations are
different). Accordingly, the approach is composed of three steps, which are shown in
Figure 1 and elaborated next: Extract Behaviors, Compare Behaviors, and Analyze
Variability.</p>
      <p>Products
representations</p>
      <p>Similar elements
P1
P2</p>
      <p>Extract
Behaviors</p>
      <p>Ontological
foundation
Analyze
Variability</p>
      <p>Variability
mechanisms</p>
      <p>Reuse
Recommendations</p>
      <p>
        Extracting Behaviors. Referring to a software behavior as a triplet of initial state,
external event, and final state [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ], this step extracts those behavioral components from
the operations of the different classes. Each class operation specifies some behavior of
the software product. We assume that the operation name captures the essence of the
behavior and thus can describe the external event, e.g., Borrow and Return of a Book
Copy class in a library management system.
      </p>
      <p>Compare
Behaviors</p>
      <p>Similarity
measures</p>
      <p>For extracting initial and final states, we distinguish between two levels: shallow –
which refers to the signature of the operation, and deep – which takes into consideration
the operation’s behavior in terms of attributes used and modified throughout the
operation1. The initial state of the behavior is composed of all the parameters passed to the
operation (part of shallow) and all the class attributes used (read) by the operation (part
of deep). The final state consists of the returned type (part of shallow) and all the class
attributes modified (set) by the operation (part of deep). For the operation Borrow of
the Book Copy class, we can consider the attributes AvailabilityStatus and
BorrowingPeriod for the initial state, as they are needed for the operation to be executed. The
attribute AvailabilityStatus is further modified as a result of the operation execution
and hence is considered part of the operation’s final state.</p>
      <p>
        Compare Behaviors. After extracting the behaviors and their shallow and deep
levels, a similarity mapping between their constituents is applied. This mapping can be
based on existing general-purpose or domain-specific similarity metrics or some
combination of such metrics. The metrics can take into account semantic considerations
using semantic nets or statistical techniques to measure the distances among words and
terms [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. Alternatively, they can use type or schematic similarities, potentially
ignoring the semantic roles or essence of the compared elements [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. The similarity mapping
associates to each operation’s constituent (shallow or deep) all of its similar
counterparts in the other operation (i.e., elements whose similarity with the given constituent
exceeds some predefined threshold).
      </p>
      <p>Analyze Variability. Suppose that the constituents of two operations o1 and o2 in
classes C1 and C2 respectively are mapped using a similarity mapping sim, namely, the
similarity of their constituents exceeded some predefined threshold. We can distinguish
between the following situations with respect to sim:
1. USE – each constituent of o1 has exactly one counterpart in o2 and vice versa.
2. REF (abbreviation for refinement) – at least one constituent in o1 has more than one
counterpart in o2.
3. EXT (abbreviation for extension) – at least one constituent in o1 has no counterpart in
o2.</p>
      <p>Note that REF and EXT are not mutually exclusive; we refer to a combination of
both as REF-EXT (abbreviation for refined extension).</p>
      <p>
        Aggregating the above notions from the level of operations to the level of classes,
we aim at recommending on appropriate variability mechanisms. Our current focus is
on the common polymorphism mechanisms. Polymorphism is the provision of a
single interface to entities of different types. Therefore, the cases of polymorphism are
characterized by similar signatures of operations (namely, the USE category in the
shallow level of the operations). We further focus on three types of polymorphism which
are widely used in industry [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]: subtype (inclusion) polymorphism (e.g., function
pointers, inheritance), parametric polymorphism (e.g., C++ templates), and
overloading. Table 1 presents recommendations for those polymorphism mechanisms based on
the reuse mapping characteristics.
1 We consider only attributes and ignore local variables, as the latter can be defined for
implementation and realization purposes and may hinder the essence of the operation’s behavior.
Shallow
USE
USE
USE
USE
USE
We implemented the approach in Java. The main inputs of the tool – VarMeR – are jar
files implementing the software products (or applications) to be compared. Figure 2
presents the user interface of VarMeR: besides the names and paths to the compared jar
files, the tool supports selection of similarity-related information, including thresholds,
weights, and measures. Similarity measures define the way similarity is calculated.
VarMeR currently supports the text semantic similarity metric of Mihalcea, Corley, and
Strapparava (MCS) [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] that combines corpus-based and knowledge-based measures,
the Latent Semantic Analysis (LSA) metric [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], and UMBC – top N similar words and
phrase similarity metric [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. The element and parameter name weights define the ratio
between name and type similarities of elements (operations or attributes) and
parameters, respectively. The weights are taken into consideration when comparing behaviors.
As the names of parameters are more often meaningless (with respect to
attribute/operation names), the tool supports separate weights. Finally, the similarity threshold
defines the minimal value above which elements are considered similar.
      </p>
      <p>
        The jar files of the compared products are reverse engineered into class diagrams (in
XMI format) and Program Dependence Graphs (PDG)2 [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] (in JSON format). The
shallow and deep levels of the behaviors are extracted from those representations. Then the
behaviors are compared utilizing the similarity-related information provided as input.
2 PDG explicitly represents the data and control dependencies of a program.
Finally, variability is analyzed using the features of the three types of polymorphism
(see Table 1).
      </p>
      <p>The outcome of VarMeR is presented visually in the form of graphs. Each graph,
comparing two products, shows the classes of the two products in different colors (one
for the first product and one for the second product). The size of the nodes is
proportional to the number of operations in the corresponding classes (the larger the node is,
the more operations the class have). When hovering a node with the mouse, a tooltip
showing the behavior appears, presenting the list of all operations of the current class.
This way the user (e.g., a programmer or a code reviewer) can get a general idea on the
role of each class, not just by its name, but also by the behavior it is expected to support.</p>
      <p>The edges of the graphs (links between classes) represent recommendation on
variability mechanisms, where:
 the label on the edge (link) indicates which variability mechanisms were identified:
parametric, subtyping, and/or overloading.
 the width of the edge (link), as well as its length, represents the degree of evidence
(i.e., the number of operations related with a certain type of polymorphism; the
thicker/longer the link is, the more evidence to use the recommended variability
mechanism exist).</p>
      <p>An example of VarMeR’s output is depicted in Figure 3. The numbers in parentheses
in the tooltip indicate the numbers of operations with certain names (but different
signatures). The top of the screen includes controls that allow defining the thresholds
above which a given mechanism (parametric, subtyping, or overloading) will be
presented. In other words, these weights separately control the minimal numbers of
operation pairs that need to satisfy certain constraints (USE, REF, EXT, REF-EXT) so that
the given mechanism will be recommended. In the top right part of the screen, the user
can hide classes unrelated to classes in the other product (such as testFlight in Figure
3). The bottom of the screen supports selecting colors for the classes of each of the two
products and the links between them. Note that currently, VarMeR compares classes
from different products (and not classes from the same product that may further
increase reuse). Hence, links connect nodes of alternating colors, potentially connecting
a single node to several nodes representing classes in the other product (see scribeFilter
in Figure 3 as an example).</p>
      <p>The tool further enables zooming into relations (links) among classes to have better
understanding how the recommendations are generated and how to apply the
recommended variability mechanisms and systemize reuse of the corresponding classes. This
option presents the related operations of the classes and the categories to which the
links among them belong: USE, REF, EXT, REF-EXT. Figure 4 zooms into the
subtyping link of Figure 3 presenting EXT and REF-EXT relations among operations of
the corresponding classes. This mapping can be used by a programmer in order to create
a class from which the two compared classes (ScribeGui and ScribeBinder) can inherit
through sub-typing polymorphism.
We presented a tool, called VarMeR – A Variability Mechanisms Recommender, which
is based on ontological foundations for representing variability of behaviors of software
products. The inputs of VarMeR are object-oriented code artifacts (jar files) belonging
to different software products. The outputs are graphs which can be used for analyzing
the commonality and variability of the classes in different products and recommending
on suitable polymorphism variability mechanisms to increase systematic reuse.</p>
      <p>In the future, we intend to extend the tool support in several ways. First, VarMeR
will be extended to support further variability mechanisms besides polymorphisms.
Another direction is incorporating VarMeR into existing programming environments, so
that it will be relatively easy to apply the recommendations generated by VarMeR.
Furthermore, we intend to empirically explore the usefulness of VarMeR and the quality
of its outcomes.</p>
      <p>Acknowledgment. The authors would like to thank Jonathan Liberman, Alex Kogan
and Asaf Mor for their help in the implementation of the VarMeR tool. The second
author was supported by the Israel Science Foundation under grant agreement 817/15.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <surname>Baker</surname>
            ,
            <given-names>B. S.</given-names>
          </string-name>
          (
          <year>2007</year>
          ).
          <article-title>Finding Clones with Dup: Analysis of an Experiment</article-title>
          .
          <source>IEEE Transactions on Software Engineering</source>
          <volume>33</volume>
          (
          <issue>9</issue>
          ), pp.
          <fpage>608</fpage>
          -
          <lpage>621</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <surname>Bellon</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Koschke</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Antoniol</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Krinke</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          , and
          <string-name>
            <surname>Merlo</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          (
          <year>2007</year>
          ).
          <article-title>Comparison and Evaluation of Clone Detection Tools</article-title>
          .
          <source>IEEE Transactions on Software Engineering</source>
          <volume>33</volume>
          (
          <issue>9</issue>
          ), pp.
          <fpage>577</fpage>
          -
          <lpage>591</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <surname>Fischer</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Linsbauer</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lopez-Herrejon</surname>
            ,
            <given-names>R. E.</given-names>
          </string-name>
          , and
          <string-name>
            <surname>Egyed</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          (
          <year>2014</year>
          ).
          <article-title>Enhancing Cloneand-Own with Systematic Reuse for Developing Software Variants</article-title>
          .
          <source>IEEE International Conference on Software Maintenance and Evolution</source>
          , pp.
          <fpage>391</fpage>
          -
          <lpage>400</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname>Han</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kashyap</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Finin</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mayfield</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          , &amp;
          <string-name>
            <surname>Weese</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          (
          <year>2013</year>
          ). UMBC EBIQUITYCORE:
          <article-title>Semantic textual similarity systems</article-title>
          .
          <source>In Proceedings of the Second Joint Conference on Lexical and Computational Semantics</source>
          (Vol.
          <volume>1</volume>
          ), pp.
          <fpage>44</fpage>
          -
          <lpage>52</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <surname>Kamiya</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kusumoto</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          , and
          <string-name>
            <surname>Inoue</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          (
          <year>2002</year>
          ).
          <article-title>CCFinder: A Multilinguistic Token-Based Code Clone Detection System for Large Scale Source Code</article-title>
          .
          <source>IEEE Transactions on Software Engineering 28</source>
          , pp.
          <fpage>654</fpage>
          -
          <lpage>670</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <surname>Kashyap</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          and
          <string-name>
            <surname>Sheth</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          , (
          <year>1996</year>
          ).
          <article-title>Semantic and schematic similarities between database objects: a context-based approach</article-title>
          .
          <source>The VLDB Journal-The International Journal on Very Large Data Bases</source>
          ,
          <volume>5</volume>
          (
          <issue>4</issue>
          ), pp.
          <fpage>276</fpage>
          -
          <lpage>304</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <surname>Krinke</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          (
          <year>2001</year>
          ).
          <source>Identifying Similar Code with Program Dependence Graphs. 8th Working Conference on Reverse Engineering</source>
          , pp.
          <fpage>301</fpage>
          -
          <lpage>309</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <surname>Lee</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          and
          <string-name>
            <surname>Hwang</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          (
          <year>2013</year>
          ).
          <article-title>A Review on Variability Mechanisms for Product Lines</article-title>
          . ICCA'
          <year>2013</year>
          , ASTL vol.
          <volume>24</volume>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>4</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <surname>Landauer</surname>
            ,
            <given-names>T. K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Foltz</surname>
            ,
            <given-names>P. W.</given-names>
          </string-name>
          and
          <string-name>
            <surname>Laham</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          (
          <year>1998</year>
          ).
          <article-title>Introduction to Latent Semantic Analysis</article-title>
          .
          <source>Discourse Processes 25</source>
          , pp.
          <fpage>259</fpage>
          -
          <lpage>284</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Mihalcea</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Corley</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          , and
          <string-name>
            <surname>Strapparava</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          (
          <year>2006</year>
          ).
          <article-title>Corpus-based and knowledge-based measures of text semantic similarity</article-title>
          .
          <source>American Association for Artificial Intelligence (AAAI'06)</source>
          , pp.
          <fpage>775</fpage>
          -
          <lpage>780</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <surname>Reinhartz-Berger</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zamansky</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          , &amp;
          <string-name>
            <surname>Wand</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          (
          <year>2016</year>
          ).
          <article-title>An Ontological Approach for Identifying Software Variants: Specialization and Template Instantiation</article-title>
          .
          <source>35th International Conference on Conceptual Modeling (ER'2016)</source>
          , pp.
          <fpage>98</fpage>
          -
          <lpage>112</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <surname>Reinhartz-Berger</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zamansky</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          , and
          <string-name>
            <surname>Kemelman</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          (
          <year>2015</year>
          ).
          <article-title>Analyzing Variability of Cloned Artifacts: Formal Framework and Its Application to Requirements. Enterprise, Business-Process and Information Systems Modeling</article-title>
          , EMMSAD'
          <year>2015</year>
          , pp.
          <fpage>311</fpage>
          -
          <lpage>325</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <surname>Reinhartz-Berger</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zamansky</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          , and
          <string-name>
            <surname>Wand</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          (
          <year>2015</year>
          ).
          <source>Taming Software Variability: Ontological Foundations of Variability Mechanisms. 34th International Conference on Conceptual Modeling (ER</source>
          '
          <year>2015</year>
          ),
          <source>LNCS 9381</source>
          , pp.
          <fpage>399</fpage>
          -
          <lpage>406</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <surname>Zhang</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Duszynski</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          , and
          <string-name>
            <surname>Becker</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          (
          <year>2016</year>
          ).
          <source>Variability Mechanisms and Lessons Learned in Practice. 1st International Workshop on Variability and Complexity in Software Design (VACE</source>
          '
          <year>2016</year>
          ), pp.
          <fpage>14</fpage>
          -
          <lpage>20</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>