<!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>Combining Multiple Dimensions of Knowledge in API Migration</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Thiago Tonelli Bartolomei</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Mahdi Derakhshanmanesh</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Andreas Fuhr</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Peter Koch</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Mathias Konrath</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Ralf La¨mmel</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Heiko Winnebeck</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>University of Koblenz-Landau</institution>
          ,
          <country country="DE">Germany</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>University of Waterloo</institution>
          ,
          <country country="CA">Canada</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>-We combine multiple dimensions of knowledge about APIs so that we can support API migration by wrapping or transformation in new ways. That is, we assess wrapper-based API re-implementations and provide guidance for migrating API methods. We demonstrate our approach with two major GUI APIs for the Java platform and two wrapper-based re-implementations for migrating between the GUI APIs.</p>
      </abstract>
      <kwd-group>
        <kwd>-Software migration</kwd>
        <kwd>API migration</kwd>
        <kwd>API analysis</kwd>
        <kwd>Wrapping</kwd>
        <kwd>Mining software repositories</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>I. INTRODUCTION</title>
      <p>
        API migration is a kind of software migration; it may
be necessary to meet requirements for software
modernization, application integration, and others. API migration
is realized by wrapping or transformation. We refer to [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ],
[
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] for recent work on the subject.
      </p>
      <p>For instance, consider the following re-engineering
scenario. Two Java applications need to be integrated, but they
use different GUI APIs, say SWING and SWT. Based on
the exercised features and possibly other considerations,
one of the two APIs is favored for the integrated
application. The disfavored API (the “source API”) can be
re-implemented in terms of the favored API (the “target
API”) as a wrapper so that the migration requires little, if
any, rewriting of the application’s code. Incidentally, there
are two advanced open-source wrappers that serve both
directions of migration: SWINGWT1 and SWTSWING2.</p>
      <p>
        In previous work [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], we substantiated that
migration between independently developed source and target
APIs may be complex because of significantly different
generalization hierarchies, contracts, and protocols.
      </p>
      <p>Contribution: In the present paper, we describe an
approach for the combination of multiple dimensions of
knowledge about APIs so that API migration can be
supported in new ways. That is, we assess
wrapperbased API re-implementations and provide guidance for
migrating API methods. To this end, we leverage a
modelbased approach to the integration of knowledge about APIs
into a repository for convenient use in declarative queries.
Throughout the paper, we use the SWING/SWT APIs and
the above-mentioned wrappers as subjects under study.</p>
      <p>
        Road-map: Sec. II describes the integrated
repository. Sec. III and Sec. IV cover different forms of
supporting API migration. Related work is discussed in Sec. V,
and the paper is concluded in Sec. VI. The paper and
accompanying material are available online.3
1http://swingwt.sourceforge.net/: re-implements SWING in terms of SWT
2http://swtswing.sourceforge.net/: re-implements SWT in terms of SWING
3http://softlang.uni-koblenz.de/apirep/
Acknowledgement We are grateful to Daniel Ratiu for providing
us with data related to the programming ontology of [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ].
We are also grateful to four anonymous MDSM 2011 reviewers
for their excellent advice.
      </p>
    </sec>
    <sec id="sec-2">
      <title>II. THE INTEGRATED REPOSITORY</title>
      <p>We integrate three data sources with API knowledge
into a repository. Let us describe those data sources, the
metamodel of the integrated repository, and the repository
technology as such.</p>
      <sec id="sec-2-1">
        <title>A. Data sources</title>
        <p>
          APIMODEL (developed by the present authors)—a
model of API implementations (including SWING,
SWT, SWINGWT, SWTSWING) with an underlying
metamodel that is a (very) limited Java metamodel
for structural properties and calling relationships;
APIUSAGE (developed by La¨mmel et al. [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ])—a
fact base (say, database) with usage properties of
1476 open-source Java projects at SourceForge, in
particular with facts for API method calls within the
projects’ code;
APILINKS (developed by Ratiu et al. [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ], [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ])—
an ontology for programming concepts that were
extracted semi-automatically from APIs in different
programming domains, complete with trace links
between concepts and the API source-code elements
from which they were derived.
        </p>
        <p>The APIMODEL source contributes basic knowledge
about types and methods of genuine API implementations,
and their coverage by the typically incomplete
wrapperbased re-implementations. The APIUSAGE source helps to
assess, for example, the relevance of genuine methods that
are not implemented in a wrapper. The APILINKS source
helps to derive candidate classes and methods that could
be used in a wrapper-based API re-implementation.</p>
      </sec>
      <sec id="sec-2-2">
        <title>B. Metamodel of the repository</title>
        <p>Fig. 1 shows the metamodel (a UML class diagram) of
our integrated repository where metaclasses are tagged by
data sources APIMODEL, APIUSAGE, and APILINKS. We
must note that the metamodel does not cover all elements
of the sources, but is streamlined to fit our objectives.</p>
        <p>The metaclass NamedElement represents
packagequalified names of packages, classes, and methods.
Because of the composition relationships in the metamodel,
NamedElements are also qualified by the name of an
API, in fact, by a particular implementation, which could
be a genuine implementation or a wrapper-based
reimplementation.</p>
        <p>The metaclasses Package, Class, and Method represent
the package hierarchy with the Java classes and their
methods, further with extension relationships between
classes (see association Extends) and calling relationships
between methods (see association Calls). As a means of
prioritization, we leave out interfaces; they are trivially
copied by wrappers.</p>
        <p>Classes of genuine API implementations are linked with
the corresponding classes of wrappers (see association
CorrespondsTo). Here we note that wrappers may use
different package prefixes. Also, these links improve
convenience for those queries that need to navigate between
the different API implementations. The metaclass Concept
models concepts in the sense of APILINKS’ ontology.
Classes and methods can be linked with concepts; see
associations IsClass and IsMethod. Hence, classes and
methods of different APIs may be linked transitively.</p>
        <p>
          The metaclass MethodUsage represents the usage data
that was integrated from APIUSAGE. That is, for each
API method, we maintain the number of calls to the
method (if any) within the SourceForge projects covered
by APIUSAGE [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ]. We translated this number also into a
relative measure in the sense of the percentage of the calls
to the given method relative to the number of all calls to
methods of the API.
        </p>
      </sec>
      <sec id="sec-2-3">
        <title>C. Repository technology</title>
        <p>
          The repository leverages the model-based TGraph
approach [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ]. The metamodel of Fig. 1 is represented as
a TGraph schema; converters instantiate the schema from
the different data sources. All analysis is performed by
means of queries on TGraphs using the language GReQL
(Graph Repository Query Language) [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ]. For brevity,
we describe all queries (“measurements”) only informally
in this paper, but here is a simple, illustrative GReQL
example for retrieving all classes c of an API a that are
not implemented by a wrapper:
using a:
from c: VfClassg
with c.qualifiedName =˜ a and count(c
reportSet c
end
        </p>
        <p>That is, a is an argument of the query for the name of
the API; the query selects (“reports”) all classes c such
that the qualified name of c matches with a and there
are no outgoing edges of the type CorrespondsTo (see
--&gt;fCorrespondsTog) from c.</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>III. WRAPPER ASSESSMENT</title>
      <p>Consider again our introductory scenario for API
migration. Which wrapper, SWINGWT or SWTSWING, should
we favor? Such decision making should take into account
wrapper qualities, e.g., its completeness or compliance—
both relative to the genuine API implementation. In case
we want to improve a given wrapper, we should also track
progress by simple metrics. Accordingly, we propose some
concepts for wrapper assessment.</p>
      <sec id="sec-3-1">
        <title>A. Coverage of source API</title>
        <p>We can trivially compare the APIMODEL data between
genuine API implementation and wrapper to get a basic
sense of completeness in terms of (the percentage of)
genuine packages, classes, and methods that are covered
(say, re-implemented) by the wrapper. Table I collects such
metrics for the SWING/SWT wrappers. The numbers show
that the wrappers are highly incomplete.</p>
        <p>Packages
Classes
Methods</p>
        <p>SWINGWT
25 (78.12 %)
533 (18.61 %)
4533 (26.60 %)</p>
        <p>SWTSWING
16 (51.61 %)
372 (56.97 %)
3426 (42.59 %)</p>
      </sec>
      <sec id="sec-3-2">
        <title>B. Wrapper compliance issues</title>
        <p>Some forms of non-compliance of a wrapper with the
genuine API implementation can be determined by simple
queries on our repository, e.g., differences regarding
generalization hierarchies or the declaring classes for
methods. Consider the following extension chain for SWING’s</p>
      </sec>
      <sec id="sec-3-3">
        <title>AbstractButton:</title>
        <p>java.lang.Object
|_ java.awt.Component
|_ java.awt.Container
|_ javax.swing.JComponent</p>
        <p>|_ javax.swing.AbstractButton</p>
        <p>The chain itself is preserved by SWINGWT. However,
SWING declares the method addActionListener on the
class AbstractButton whereas SWINGWT declares the
method already on the class Component.</p>
        <p>Declarations on supertypes
Empty implementations
Missing methods</p>
        <p>Class missing
Class present</p>
        <p>Table II shows numbers for some metrics for (lack of)
wrapper compliance. In reference to the above example
of the method addActionListener, we measure the number
of methods that are declared “earlier” on a supertype in
the wrapper. Further, we measure methods with empty
implementations, i.e., implementations without any
outgoing method calls, while the corresponding genuine
implementations had outgoing method calls. (The substantial
number of empty implementations may be surprising,
but these wrappers are nevertheless reportedly useful in
practice.) Finally, we also subdivide missing methods into
those that are implied by missing classes vs. those that are
missing from existing classes.</p>
      </sec>
      <sec id="sec-3-4">
        <title>C. Relevance in terms of usage</title>
        <p>Let us qualify wrapper (in-) completeness with
APIUSAGE data. If the developers of the wrappers
applied the right judgement call for leaving out classes and
methods, then the missing methods should be less relevant
in practice than the implemented ones. Table III lists usage
metrics for the SWING/SWT wrappers.</p>
        <p>SWINGWT</p>
        <p>SWTSWING
Unimplemented methods</p>
        <p>Any usage</p>
        <p>Cumulative usage
Empty methods</p>
        <p>Any usage</p>
        <p>Cumulative usage
Non-empty methods</p>
        <p>Any usage
Cumulative usage</p>
        <p>In the table, we break down SWING’s and SWT’s
methods into categories according to the wrappers as
follows: unimplemented, empty, and non-empty implemented
methods. For each category, we show the percentage of
methods with “any usage” (say, any calls) in the
SourceForge projects in the scope of the APIUSAGE source. We
also show “cumulative usage” for each category, i.e., the
contribution of the category to all API method calls. These
are contrasting numbers which show, for example, that
the many unimplemented and empty methods (see again
Table II) are exercised much less frequently than the fewer
non-empty methods.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>IV. GUIDANCE FOR MIGRATION</title>
      <p>A given wrapper may be effectively incomplete in that
a missing method is actually exercised by the application
under API migration. In this case, we seek guidance for
migrating the API method in question. Such guidance is
universally useful for API migration—even when
transformation is used instead of wrapping. A practical approach
to guidance would need to combine elements of API type
matching, IDE support (such as autocompletion and stub
generation), and others. We focus here on the aspect of
proposing method candidates to be called in methods of
wrapper-based API re-implementations.</p>
      <sec id="sec-4-1">
        <title>A. Concept-based method candidates</title>
        <p>We can use APILINKS’ trace links between API
methods and concepts to propose method candidates. The idea
is that if methods of the source and target APIs are
related to the same concept, then the latter may be useful
in re-implementing the former. Further, let us sort all
such candidates by their cumulative usage, say, by their
relevance as far as APIUSAGE is concerned.</p>
        <p>Qualified candidate name
Cumulative usage (%)
swing.javax.swing.ImageIcon.ImageIcon
swing.java.awt.image.BufferedImage.BufferedImage
swing.java.awt.Frame.getIconImage
swing.java.awt.....MemoryImageSource
swing.java.awt.Frame.setIconImage
swing.javax.swing.text.html.ImageView.ImageView
swing.java.awt.....ImageGraphicAttribute
Suppose you need to migrate SWT’s Button.setImage to
SWING. Table IV shows the method candidates that were
automatically determined by a GReQL query. Consider the
first line with the constructor of ImageIcon. We show the
line in bold face to convey the fact that there is an existing
wrapper, SWTSWING, whose method implementation of
setImage readily involves the constructor of ImageIcon.</p>
        <p>Further inspection reveals that SWING’s JButton, which
is a counterpart to SWT’s Button, does not provide an
Image property and, hence, we cannot simply migrate SWT’s
Button.setImage to a corresponding setter of SWING. Extra
state and a more complex idiom (indeed involving
ImageIcon) is needed.</p>
      </sec>
      <sec id="sec-4-2">
        <title>B. Assessment of the ontology</title>
        <p>The above example shows that APILINKS may suggest
reasonable candidates—in principle. We would like to
assess APILINKS’s relevance more generally. In particular,
we could compare APILINKS-based links with actual
calling relationships in existing wrapper implementations,
as they are available through APIMODEL’s data. Table V
lists corresponding metrics for the SWING/SWT wrappers.</p>
        <p>Unimplemented methods with links
Implemented methods with links
Correct links
SWINGWT
10.83 %
28.06 %
42.75 %</p>
        <p>SWTSWING
0.35 %
24.98 %
37.20 %</p>
        <p>
          The coverage of API parts by APILINKS’ trace links
is an artifact of the underlying semi-automatic ontology
extraction approach [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ], [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ], which involves elements
of name matching and thresholds for the inclusion of
concepts. We cannot expect to retrieve links for arbitrary
methods from APILINKS.
        </p>
        <p>In the table, we break down SWING’s and SWT’s
methods into the categories of unimplemented and
implemented methods according to the wrappers. For both
categories, we show the percentage of methods that are
linked (transitively) with one or more methods of the
corresponding target API. The numbers are such that
implemented methods happen to be much better linked
than unimplemented ones.</p>
        <p>At the bottom of the table, we also list the percentage
of correct APILINKS’ trace links. We say that a link from
the method m of the source API s to a method m0 of
the target API t is correct, if a given wrapper-based
reimplementation of s in terms of t implements m in a way
that it directly calls m0. When we specify the percentage,
we consider as the baseline (100%) only those methods
m that both have associated trace links to t and actually
call some method of t. It turns out that APILINKS predicts
a correct link in more than 1/3 of the cases. We have to
note though that APILINKS typically proposes multiple
candidates—with a median of 8.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>V. RELATED WORK</title>
      <p>
        Work on API migration has previously focused on
transformation and wrapper-generation techniques for API
upgrades [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] and, to a lesser extent, on
migration between independently developed APIs [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ],
[
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. The present work is the first to integrate diverse
data sources to assess wrappers and to guide their
development. Typically, wrappers are assessed by testing (i.e.,
testing whether the application under migration continues
to function, or recovers from any test failures that had to be
addressed by improving a pre-existing wrapper) [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. There
is no previous work on guiding API-wrapper development
for independently developed APIs.
      </p>
      <p>
        Most of the techniques that we integrate are inspired by
program comprehension research. For instance, our
comparison of different API implementations is a simple form
of object-model matching [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]. Also, our exploitation of
API-usage data is straightforward, when compared to other
scenarios of exploiting such data in the context of API
usability [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] and understanding API usage (patterns) [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ],
[
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]. Our proposal for guided migration can be viewed
as one specific approach to advanced (“intelligent”) code
completion systems [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ], [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ].
      </p>
    </sec>
    <sec id="sec-6">
      <title>VI. CONCLUDING REMARKS</title>
      <p>The complexity of API migration requires many skills
and techniques. Of course, one must understand the API’s
domain, and the application under migration. Basic
software engineering skills such as testing, design by contract,
effective use of documentation are critical as well. Still
API migrations are largely unstructured today, and they
come with unpredictable costs. We submit that techniques
for assessment and guidance, such as those discussed
in this short paper, are needed to tackle non-trivial API
migrations in the future.</p>
      <p>Clearly, our work is at an early state, and makes only
a limited contribution to the larger API migration theme.
There is a need for a comprehensive approach for guided
API migration, which should combine diverse elements
of assessment, mapping, matching, code completion, code
generation, and testing.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>I.</given-names>
            <surname>Balaban</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Tip</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Fuhrer</surname>
          </string-name>
          , “
          <article-title>Refactoring support for class library migration,”</article-title>
          <source>in Proc. of OOSPLA 2005. ACM</source>
          ,
          <year>2005</year>
          , pp.
          <fpage>265</fpage>
          -
          <lpage>279</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>J.</given-names>
            <surname>Henkel</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Diwan</surname>
          </string-name>
          , “
          <article-title>CatchUp!: capturing and replaying refactorings to support API evolution,”</article-title>
          <source>in Proc. of ICSE 2005. ACM</source>
          ,
          <year>2005</year>
          , pp.
          <fpage>274</fpage>
          -
          <lpage>283</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>J. H.</given-names>
            <surname>Perkins</surname>
          </string-name>
          , “
          <article-title>Automatically generating refactorings to support API evolution,”</article-title>
          <source>in Proc. of the Workshop on Program Analysis for Software Tools and Engineering (PASTE)</source>
          .
          <source>ACM</source>
          ,
          <year>2005</year>
          , pp.
          <fpage>111</fpage>
          -
          <lpage>114</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname>I. S</surname>
          </string-name>
          ¸ avga, M. Rudolf, S. Go¨tz, and U. Aßmann, “
          <article-title>Practical refactoring-based framework upgrade,” in Proc. of the Conference on Generative Programming and Component Engineering (GPCE)</article-title>
          .
          <source>ACM</source>
          ,
          <year>2008</year>
          , pp.
          <fpage>171</fpage>
          -
          <lpage>180</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>D.</given-names>
            <surname>Dig</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Negara</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Mohindra</surname>
          </string-name>
          , and R. Johnson, “
          <article-title>ReBA: refactoring-aware binary adaptation of evolving libraries,”</article-title>
          <source>in Proc. of ICSE 2008. ACM</source>
          ,
          <year>2008</year>
          , pp.
          <fpage>441</fpage>
          -
          <lpage>450</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>T. T.</given-names>
            <surname>Bartolomei</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Czarnecki</surname>
          </string-name>
          , R. La¨mmel, and T. van der Storm, “
          <article-title>Study of an API Migration for Two XML APIs,”</article-title>
          <source>in Proc. of Conference on Software Language Engineering (SLE</source>
          <year>2009</year>
          )
          <article-title>, ser</article-title>
          .
          <source>LNCS</source>
          , vol.
          <volume>5969</volume>
          . Springer,
          <year>2010</year>
          , pp.
          <fpage>42</fpage>
          -
          <lpage>61</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>M.</given-names>
            <surname>Nita</surname>
          </string-name>
          and
          <string-name>
            <given-names>D.</given-names>
            <surname>Notkin</surname>
          </string-name>
          , “
          <article-title>Using Twinning to Adapt Programs to Alternative APIs,”</article-title>
          <source>in Proc. of ICSE</source>
          <year>2010</year>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>T. T.</given-names>
            <surname>Bartolomei</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Czarnecki</surname>
          </string-name>
          , and R. La¨mmel, “
          <article-title>Swing to SWT and Back: Patterns for API Migration by Wrapping,”</article-title>
          <source>in Proc. of ICSM</source>
          <year>2010</year>
          . IEEE,
          <year>2010</year>
          ,
          <volume>10</volume>
          pages.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>D.</given-names>
            <surname>Ratiu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Feilkas</surname>
          </string-name>
          , and J. Ju¨rjens, “
          <article-title>Extracting Domain Ontologies from Domain Specific APIs,”</article-title>
          <source>in 12th European Conference on Software Maintenance and Reengineering</source>
          ,
          <string-name>
            <surname>CSMR</surname>
          </string-name>
          <year>2008</year>
          ,
          <article-title>Proceedings</article-title>
          . IEEE,
          <year>2008</year>
          , pp.
          <fpage>203</fpage>
          -
          <lpage>212</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>D.</given-names>
            <surname>Ratiu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Feilkas</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Deissenboeck</surname>
          </string-name>
          ,
          <string-name>
            <surname>J.</surname>
          </string-name>
          <article-title>Ju¨rjens, and</article-title>
          <string-name>
            <given-names>R.</given-names>
            <surname>Marinescu</surname>
          </string-name>
          , “
          <article-title>Towards a Repository of Common Programming Technologies Knowledge,”</article-title>
          <source>in Proc. of the Int. Workshop on Semantic Technologies in System Maintenance (STSM)</source>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>R.</given-names>
            <surname>La</surname>
          </string-name>
          ¨mmel, E. Pek, and
          <string-name>
            <given-names>J.</given-names>
            <surname>Starek</surname>
          </string-name>
          , “
          <article-title>Large-scale, AST-based APIusage analysis of open-source Java projects</article-title>
          ,”
          <source>in SAC'11 - ACM 2011 SYMPOSIUM ON APPLIED COMPUTING, Technical Track on “Programming Languages”</source>
          ,
          <year>2011</year>
          , to appear.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>J.</given-names>
            <surname>Ebert</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Riediger</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <given-names>A.</given-names>
            <surname>Winter</surname>
          </string-name>
          , “
          <article-title>Graph Technology in Reverse Engineering: The TGraph Approach,” in WSR 2008, ser</article-title>
          .
          <source>GIEditionProceedings</source>
          , vol.
          <volume>126</volume>
          . Gesellschaft fu¨r Informatik,
          <year>2008</year>
          , pp.
          <fpage>67</fpage>
          -
          <lpage>81</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>D.</given-names>
            <surname>Bildhauer</surname>
          </string-name>
          and
          <string-name>
            <given-names>J.</given-names>
            <surname>Ebert</surname>
          </string-name>
          , “
          <article-title>Querying Software Abstraction Graphs,” in Query Technologies and Applications for Program Comprehension (QTAPC</article-title>
          <year>2008</year>
          ),
          <source>Workshop at ICPC</source>
          <year>2008</year>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>Z.</given-names>
            <surname>Xing</surname>
          </string-name>
          and E. Stroulia, “
          <article-title>UMLDiff: an algorithm for objectoriented design differencing</article-title>
          ,
          <source>” in 20th IEEE/ACM International Conference on Automated Software Engineering (ASE</source>
          <year>2005</year>
          ),
          <source>Proceedings. ACM</source>
          ,
          <year>2005</year>
          , pp.
          <fpage>54</fpage>
          -
          <lpage>65</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>J.</given-names>
            <surname>Stylos</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B. A.</given-names>
            <surname>Myers</surname>
          </string-name>
          , and
          <string-name>
            <given-names>Z.</given-names>
            <surname>Yang</surname>
          </string-name>
          , “
          <article-title>Jadeite: improving API documentation using usage information,”</article-title>
          <source>in Proc. of the 27th Intern. Conf. on Human Factors in Computing Systems</source>
          ,
          <string-name>
            <surname>CHI</surname>
          </string-name>
          <year>2009</year>
          . ACM,
          <year>2009</year>
          , pp.
          <fpage>4429</fpage>
          -
          <lpage>4434</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>J.</given-names>
            <surname>Stylos</surname>
          </string-name>
          and
          <string-name>
            <given-names>B. A.</given-names>
            <surname>Myers</surname>
          </string-name>
          , “
          <article-title>Mica: A Web-Search Tool for Finding API Components and Examples,” in 2006 IEEE Symposium on Visual Languages and Human-Centric Computing (VL/HCC 2006), Proceedings</article-title>
          . IEEE,
          <year>2006</year>
          , pp.
          <fpage>195</fpage>
          -
          <lpage>202</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>T.</given-names>
            <surname>Xie</surname>
          </string-name>
          and
          <string-name>
            <given-names>J.</given-names>
            <surname>Pei</surname>
          </string-name>
          , “
          <article-title>MAPO: mining API usages from open source repositories,”</article-title>
          <source>in MSR '06: Proceedings of the 2006 international workshop on Mining software repositories. ACM</source>
          ,
          <year>2006</year>
          , pp.
          <fpage>54</fpage>
          -
          <lpage>57</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>D.</given-names>
            <surname>Mandelin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Xu</surname>
          </string-name>
          , R. Bod´ık, and
          <string-name>
            <given-names>D.</given-names>
            <surname>Kimelman</surname>
          </string-name>
          , “
          <article-title>Jungloid mining: helping to navigate the API jungle,” in Proc. of the 2005 ACM SIGPLAN conference on Programming language design and implementation (PLDI 2005)</article-title>
          . ACM,
          <year>2005</year>
          , pp.
          <fpage>48</fpage>
          -
          <lpage>61</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>M.</given-names>
            <surname>Bruch</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Monperrus</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Mezini</surname>
          </string-name>
          , “
          <article-title>Learning from examples to improve code completion systems</article-title>
          ,”
          <source>in Proceedings of ESEC/SIGSOFT FSE</source>
          <year>2009</year>
          . ACM,
          <year>2009</year>
          , pp.
          <fpage>213</fpage>
          -
          <lpage>222</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>