<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Combining Multiple Dimensions of Knowledge in API Migration</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Thiago</forename><surname>Tonelli</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">University of Waterloo</orgName>
								<address>
									<country key="CA">Canada</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Mahdi</forename><surname>Derakhshanmanesh</surname></persName>
							<affiliation key="aff1">
								<orgName type="institution">University of Koblenz-Landau</orgName>
								<address>
									<country key="DE">Germany</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Andreas</forename><surname>Fuhr</surname></persName>
							<affiliation key="aff1">
								<orgName type="institution">University of Koblenz-Landau</orgName>
								<address>
									<country key="DE">Germany</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Peter</forename><surname>Koch</surname></persName>
							<affiliation key="aff1">
								<orgName type="institution">University of Koblenz-Landau</orgName>
								<address>
									<country key="DE">Germany</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Mathias</forename><surname>Konrath</surname></persName>
							<affiliation key="aff1">
								<orgName type="institution">University of Koblenz-Landau</orgName>
								<address>
									<country key="DE">Germany</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Ralf</forename><surname>Lämmel</surname></persName>
							<affiliation key="aff1">
								<orgName type="institution">University of Koblenz-Landau</orgName>
								<address>
									<country key="DE">Germany</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Heiko</forename><surname>Winnebeck</surname></persName>
							<affiliation key="aff1">
								<orgName type="institution">University of Koblenz-Landau</orgName>
								<address>
									<country key="DE">Germany</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Combining Multiple Dimensions of Knowledge in API Migration</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">F78F2488C5CC5E744D402A682C4EFB9E</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T04:22+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>Software migration</term>
					<term>API migration</term>
					<term>API analysis</term>
					<term>Wrapping</term>
					<term>Mining software repositories</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><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></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>I. INTRODUCTION</head><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 <ref type="bibr" target="#b0">[1]</ref>, <ref type="bibr" target="#b1">[2]</ref>, <ref type="bibr" target="#b2">[3]</ref>, <ref type="bibr" target="#b3">[4]</ref>, <ref type="bibr" target="#b4">[5]</ref>, <ref type="bibr" target="#b5">[6]</ref>, <ref type="bibr" target="#b6">[7]</ref>, <ref type="bibr" target="#b7">[8]</ref> 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: SWINGWT<ref type="foot" target="#foot_0">1</ref> and SWTSWING <ref type="foot" target="#foot_1">2</ref> .</p><p>In previous work <ref type="bibr" target="#b5">[6]</ref>, <ref type="bibr" target="#b7">[8]</ref>, 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. <ref type="foot" target="#foot_2">3</ref>Acknowledgement We are grateful to Daniel Ratiu for providing us with data related to the programming ontology of <ref type="bibr" target="#b8">[9]</ref>, <ref type="bibr" target="#b9">[10]</ref>. We are also grateful to four anonymous MDSM 2011 reviewers for their excellent advice.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>II. THE INTEGRATED REPOSITORY</head><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><p>A. Data sources  <ref type="bibr" target="#b8">[9]</ref>, <ref type="bibr" target="#b9">[10]</ref>)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. 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>B. Metamodel of the repository</head><p>Fig. <ref type="figure" target="#fig_0">1</ref> 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. 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 <ref type="bibr" target="#b10">[11]</ref>. 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>C. Repository technology</head><p>The repository leverages the model-based TGraph approach <ref type="bibr" target="#b11">[12]</ref>. The metamodel of Fig. <ref type="figure" target="#fig_0">1</ref> 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) <ref type="bibr" target="#b12">[13]</ref>. 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: 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;{CorrespondsTo}) from c.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>III. WRAPPER ASSESSMENT</head><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 complianceboth 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>A. Coverage of source API</head><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.  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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>SWINGWT SWTSWING</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Table II WRAPPER COMPLIANCE ISSUES</head><p>Table <ref type="table">II</ref> 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>C. Relevance in terms of usage</head><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 <ref type="table">III</ref>  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 Source-Forge 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 <ref type="table">II</ref>) are exercised much less frequently than the fewer non-empty methods.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>IV. GUIDANCE FOR MIGRATION</head><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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>A. Concept-based method candidates</head><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. Suppose you need to migrate SWT's Button.setImage to SWING. Table <ref type="table">IV</ref> 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 Image-Icon) is needed.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>B. Assessment of the ontology</head><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. The coverage of API parts by APILINKS' trace links is an artifact of the underlying semi-automatic ontology extraction approach <ref type="bibr" target="#b8">[9]</ref>, <ref type="bibr" target="#b9">[10]</ref>, 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 m 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 m . 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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>V. RELATED WORK</head><p>Work on API migration has previously focused on transformation and wrapper-generation techniques for API upgrades <ref type="bibr" target="#b1">[2]</ref>, <ref type="bibr" target="#b2">[3]</ref>, <ref type="bibr" target="#b3">[4]</ref>, <ref type="bibr" target="#b4">[5]</ref> and, to a lesser extent, on migration between independently developed APIs <ref type="bibr" target="#b0">[1]</ref>, <ref type="bibr" target="#b5">[6]</ref>, <ref type="bibr" target="#b6">[7]</ref>, <ref type="bibr" target="#b7">[8]</ref>. 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) <ref type="bibr" target="#b5">[6]</ref>. 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 <ref type="bibr" target="#b13">[14]</ref>. Also, our exploitation of API-usage data is straightforward, when compared to other scenarios of exploiting such data in the context of API usability <ref type="bibr" target="#b14">[15]</ref> and understanding API usage (patterns) <ref type="bibr" target="#b15">[16]</ref>, <ref type="bibr" target="#b16">[17]</ref>. Our proposal for guided migration can be viewed as one specific approach to advanced ("intelligent") code completion systems <ref type="bibr" target="#b17">[18]</ref>, <ref type="bibr" target="#b18">[19]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>VI. CONCLUDING REMARKS</head><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></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Figure 1 .</head><label>1</label><figDesc>Figure 1. Metamodel of the integrated repository with API knowledge</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head></head><label></label><figDesc>using a: from c: V{Class} with c.qualifiedName =˜a and count(c−−&gt;{CorrespondsTo}) = 0 reportSet c end</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_1"><head></head><label></label><figDesc>Table I collects such metrics for the SWING/SWT wrappers. The numbers show that the wrappers are highly incomplete.</figDesc><table><row><cell></cell><cell>SWINGWT</cell><cell>SWTSWING</cell></row><row><cell>Packages</cell><cell>25 (78.12 %)</cell><cell>16 (51.61 %)</cell></row><row><cell>Classes</cell><cell>533 (18.61 %)</cell><cell>372 (56.97 %)</cell></row><row><cell>Methods</cell><cell>4533 (26.60 %)</cell><cell>3426 (42.59 %)</cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_2"><head></head><label></label><figDesc>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 AbstractButton:</figDesc><table><row><cell>Table I</cell></row><row><cell>COVERAGE OF SOURCE API</cell></row><row><cell>B. Wrapper compliance issues</cell></row><row><cell>java.lang.Object</cell></row><row><cell>|_ java.awt.Component</cell></row><row><cell>|_ java.awt.Container</cell></row><row><cell>|_ javax.swing.JComponent</cell></row><row><cell>|_ javax.swing.AbstractButton</cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_4"><head></head><label></label><figDesc>lists usage metrics for the SWING/SWT wrappers.</figDesc><table><row><cell></cell><cell>SWINGWT</cell><cell>SWTSWING</cell></row><row><cell>Unimplemented methods</cell><cell></cell><cell></cell></row><row><cell>• Any usage</cell><cell>9,01 %</cell><cell>2,90 %</cell></row><row><cell>• Cumulative usage</cell><cell>2,88 %</cell><cell>2,35 %</cell></row><row><cell>Empty methods</cell><cell></cell><cell></cell></row><row><cell>• Any usage</cell><cell>42,53 %</cell><cell>25,71 %</cell></row><row><cell>• Cumulative usage</cell><cell>11,41 %</cell><cell>1,49 %</cell></row><row><cell>Non-empty methods</cell><cell></cell><cell></cell></row><row><cell>• Any usage</cell><cell>48,46 %</cell><cell>71,39 %</cell></row><row><cell>• Cumulative usage</cell><cell>85,72 %</cell><cell>96,17 %</cell></row><row><cell cols="2">Table III</cell><cell></cell></row><row><cell cols="3">USAGE OF API METHODS IN SOURCEFORGE</cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_6"><head></head><label></label><figDesc>Table V lists corresponding metrics for the SWING/SWT wrappers.</figDesc><table><row><cell></cell><cell>SWINGWT</cell><cell>SWTSWING</cell></row><row><cell>Unimplemented methods with links</cell><cell>10.83 %</cell><cell>0.35 %</cell></row><row><cell>Implemented methods with links</cell><cell>28.06 %</cell><cell>24.98 %</cell></row><row><cell>Correct links</cell><cell>42.75 %</cell><cell>37.20 %</cell></row><row><cell>Table V</cell><cell></cell><cell></cell></row><row><cell cols="3">API LINKS BETWEEN SWING AND SWT</cell></row></table></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="1" xml:id="foot_0">http://swingwt.sourceforge.net/: re-implements SWING in terms of SWT</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="2" xml:id="foot_1">http://swtswing.sourceforge.net/: re-implements SWT in terms of SWING</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="3" xml:id="foot_2">http://softlang.uni-koblenz.de/apirep/</note>
		</body>
		<back>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Refactoring support for class library migration</title>
		<author>
			<persName><forename type="first">I</forename><surname>Balaban</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Tip</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Fuhrer</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of OOSPLA 2005</title>
				<meeting>of OOSPLA 2005</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2005">2005</date>
			<biblScope unit="page" from="265" to="279" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">CatchUp!: capturing and replaying refactorings to support API evolution</title>
		<author>
			<persName><forename type="first">J</forename><surname>Henkel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Diwan</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of ICSE 2005</title>
				<meeting>of ICSE 2005</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2005">2005</date>
			<biblScope unit="page" from="274" to="283" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Automatically generating refactorings to support API evolution</title>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">H</forename><surname>Perkins</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of the Workshop on Program Analysis for Software Tools and Engineering (PASTE)</title>
				<meeting>of the Workshop on Program Analysis for Software Tools and Engineering (PASTE)</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2005">2005</date>
			<biblScope unit="page" from="111" to="114" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Practical refactoring-based framework upgrade</title>
		<author>
			<persName><forename type="first">I</forename><surname>¸avga</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Rudolf</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Götz</surname></persName>
		</author>
		<author>
			<persName><forename type="first">U</forename><surname>Aßmann</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of the Conference on Generative Programming and Component Engineering (GPCE)</title>
				<meeting>of the Conference on Generative Programming and Component Engineering (GPCE)</meeting>
		<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">ReBA: refactoring-aware binary adaptation of evolving libraries</title>
		<author>
			<persName><forename type="first">D</forename><surname>Dig</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Negara</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Mohindra</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Johnson</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of ICSE 2008</title>
				<meeting>of ICSE 2008</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2008">2008</date>
			<biblScope unit="page" from="441" to="450" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Study of an API Migration for Two XML APIs</title>
		<author>
			<persName><forename type="first">T</forename><forename type="middle">T</forename><surname>Bartolomei</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><surname>Czarnecki</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Lämmel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Van Der</surname></persName>
		</author>
		<author>
			<persName><surname>Storm</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of Conference on Software Language Engineering (SLE 2009), ser. LNCS</title>
				<meeting>of Conference on Software Language Engineering (SLE 2009), ser. LNCS</meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2010">2010</date>
			<biblScope unit="volume">5969</biblScope>
			<biblScope unit="page" from="42" to="61" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Using Twinning to Adapt Programs to Alternative APIs</title>
		<author>
			<persName><forename type="first">M</forename><surname>Nita</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Notkin</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of ICSE 2010</title>
				<meeting>of ICSE 2010</meeting>
		<imprint>
			<date type="published" when="2010">2010</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Swing to SWT and Back: Patterns for API Migration by Wrapping</title>
		<author>
			<persName><forename type="first">T</forename><forename type="middle">T</forename><surname>Bartolomei</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><surname>Czarnecki</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Lämmel</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of ICSM 2010. IEEE</title>
				<meeting>of ICSM 2010. IEEE</meeting>
		<imprint>
			<date type="published" when="2010">2010</date>
			<biblScope unit="page">10</biblScope>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">Extracting Domain Ontologies from Domain Specific APIs</title>
		<author>
			<persName><forename type="first">D</forename><surname>Ratiu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Feilkas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Jürjens</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">12th European Conference on Software Maintenance and Reengineering, CSMR 2008, Proceedings. IEEE</title>
				<imprint>
			<date type="published" when="2008">2008</date>
			<biblScope unit="page" from="203" to="212" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">Towards a Repository of Common Programming Technologies Knowledge</title>
		<author>
			<persName><forename type="first">D</forename><surname>Ratiu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Feilkas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Deissenboeck</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Jürjens</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Marinescu</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of the Int. Workshop on Semantic Technologies in System Maintenance (STSM)</title>
				<meeting>of the Int. Workshop on Semantic Technologies in System Maintenance (STSM)</meeting>
		<imprint>
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">Large-scale, AST-based APIusage analysis of open-source Java projects</title>
		<author>
			<persName><forename type="first">R</forename><surname>Lämmel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Pek</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Starek</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">SAC&apos;11 -ACM 2011 SYMPOSIUM ON APPLIED COMPUTING, Technical Track on &quot;Programming Languages</title>
				<imprint>
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
	<note>to appear</note>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">Graph Technology in Reverse Engineering: The TGraph Approach</title>
		<author>
			<persName><forename type="first">J</forename><surname>Ebert</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Riediger</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Winter</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">WSR 2008</title>
		<title level="s">ser. GI-EditionProceedings</title>
		<imprint>
			<publisher>Gesellschaft für Informatik</publisher>
			<date type="published" when="2008">2008</date>
			<biblScope unit="volume">126</biblScope>
			<biblScope unit="page" from="67" to="81" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">Querying Software Abstraction Graphs</title>
		<author>
			<persName><forename type="first">D</forename><surname>Bildhauer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Ebert</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Query Technologies and Applications for Program Comprehension (QTAPC 2008)</title>
				<imprint>
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
	<note>Workshop at ICPC 2008</note>
</biblStruct>

<biblStruct xml:id="b13">
	<analytic>
		<title level="a" type="main">UMLDiff: an algorithm for objectoriented design differencing</title>
		<author>
			<persName><forename type="first">Z</forename><surname>Xing</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Stroulia</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">20th IEEE/ACM International Conference on Automated Software Engineering (ASE 2005), Proceedings. ACM</title>
				<imprint>
			<date type="published" when="2005">2005</date>
			<biblScope unit="page" from="54" to="65" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">Jadeite: improving API documentation using usage information</title>
		<author>
			<persName><forename type="first">J</forename><surname>Stylos</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><forename type="middle">A</forename><surname>Myers</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Z</forename><surname>Yang</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of the 27th Intern. Conf. on Human Factors in Computing Systems, CHI 2009</title>
				<meeting>of the 27th Intern. Conf. on Human Factors in Computing Systems, CHI 2009</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2009">2009</date>
			<biblScope unit="page" from="4429" to="4434" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title level="a" type="main">Mica: A Web-Search Tool for Finding API Components and Examples</title>
		<author>
			<persName><forename type="first">J</forename><surname>Stylos</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><forename type="middle">A</forename><surname>Myers</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">IEEE Symposium on Visual Languages and Human-Centric Computing (VL/HCC 2006)</title>
				<imprint>
			<date type="published" when="2006">2006. 2006</date>
			<biblScope unit="page" from="195" to="202" />
		</imprint>
	</monogr>
	<note>Proceedings. IEEE</note>
</biblStruct>

<biblStruct xml:id="b16">
	<analytic>
		<title level="a" type="main">MAPO: mining API usages from open source repositories</title>
		<author>
			<persName><forename type="first">T</forename><surname>Xie</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Pei</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">MSR &apos;06: Proceedings of the 2006 international workshop on Mining software repositories</title>
				<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2006">2006</date>
			<biblScope unit="page" from="54" to="57" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<analytic>
		<title level="a" type="main">Jungloid mining: helping to navigate the API jungle</title>
		<author>
			<persName><forename type="first">D</forename><surname>Mandelin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">L</forename><surname>Xu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Bodík</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Kimelman</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of the 2005 ACM SIGPLAN conference on Programming language design and implementation (PLDI 2005)</title>
				<meeting>of the 2005 ACM SIGPLAN conference on Programming language design and implementation (PLDI 2005)</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2005">2005</date>
			<biblScope unit="page" from="48" to="61" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b18">
	<analytic>
		<title level="a" type="main">Learning from examples to improve code completion systems</title>
		<author>
			<persName><forename type="first">M</forename><surname>Bruch</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Monperrus</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Mezini</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of ESEC/SIGSOFT FSE 2009</title>
				<meeting>ESEC/SIGSOFT FSE 2009</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2009">2009</date>
			<biblScope unit="page" from="213" to="222" />
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
