MiningAPI Popularity - Semantic Scholar

Report 2 Downloads 51 Views
Mining API Popularity # projects using an API element

40 35 30

junit.framework.TestSuite javax.swing.JScrollPane javax.swing.border.Border

25 20 15 10

junit.framework.AssertionFailedError java.io.StringBufferInputStream java.lang.String

5

Jan 2008

time span

Jan 2009

Yana Mileva,Valentin Dallmeier, Andres Zeller Saarland University, Germany

Mining API Popularity java.io.StringBufferInputStream

API

java.io.StringReader java.io.PrintStream ...

Mining API Popularity

popular/used

unpopular/unused

Mining API Popularity import java.util.Iterator; import java.util.List; import java.util.Set; public class BcelTypeMunger extends ConcreteTypeMunger { import java.util.Iterator; import java.util.List; private boolean mungeNewParent(BcelClassWeaver weaver) import java.util.Set; import java.util.Iterator; { import java.util.List; LazyClassGen target = weaver.getLazyClassGen(); public class BcelTypeMunger extends ConcreteTypeMunger { import java.util.Set; boolean cont = true; cont = weaver) enforce_abstractMethods(weaver); private boolean public classmungeNewParent(BcelClassWeaver BcelTypeMunger extends ConcreteTypeMunger { { List methods = newParent.getWithoutIter(true); LazyClassGen target =mungeNewParent(BcelClassWeaver weaver.getLazyClassGen(); private boolean weaver) for (int i = 0; i < method.size(); i++){ boolean cont = true; { import java.util.Iterator; ResolvedMember superMethod = iter.next(); cont = enforce_abstractMethods(weaver); LazyClassGen target = weaver.getLazyClassGen(); import java.util.List; } boolean cont = true; import java.util.Set; } List methods = newParent.getWithoutIter(true); cont = enforce_abstractMethods(weaver); for (int i = 0; i < method.size(); i++){ public classsuperMethod BcelTypeMunger extends ConcreteTypeMunger { ResolvedMember = iter.next(); List methods = newParent.getWithoutIter(true); } for (int i = 0; i < method.size(); i++){ private boolean mungeNewParent(BcelClassWeaver weaver) } ResolvedMember superMethod = iter.next(); { } LazyClassGen target = weaver.getLazyClassGen(); } import java.util.Iterator; boolean cont = true; import java.util.List; cont = enforce_abstractMethods(weaver); import java.util.Iterator; import java.util.Set; import java.util.List; List methods = newParent.getWithoutIter(true); import java.util.Set; public class BcelTypeMunger extends ConcreteTypeMunger for (int {i = 0; i < method.size(); i++){ superMethod = iter.next(); publicResolvedMember class BcelTypeMunger extends ConcreteTypeMunger { private boolean mungeNewParent(BcelClassWeaver weaver) } { } private boolean mungeNewParent(BcelClassWeaver weaver) LazyClassGen target = weaver.getLazyClassGen(); { boolean cont = true; LazyClassGen target = weaver.getLazyClassGen(); cont = enforce_abstractMethods(weaver); boolean cont = true; cont = enforce_abstractMethods(weaver); List methods = newParent.getWithoutIter(true); for (int i = 0; i < method.size(); i++){ List methods = newParent.getWithoutIter(true); ResolvedMember superMethod = iter.next(); for (int i = 0; i < method.size(); i++){ } ResolvedMember superMethod = iter.next(); } } }

Mining API Popularity • API quality • API usability • API compatibility • ...

How was it till now? bug-tracking systems

forums

• API quality • API usability • API compatibility • ...

documentation

emails and groups

Mining API Popularity import java.util.Iterator; import java.util.List; import java.util.Set; public class BcelTypeMunger extends ConcreteTypeMunger {

import java.util.Iterator; import java.util.Iterator; import java.util.List; import java.util.List; import java.util.Set; import java.util.Set;

private boolean mungeNewParent(BcelClassWeaver weaver) { LazyClassGen target = weaver.getLazyClassGen(); boolean cont = true; cont = enforce_abstractMethods(weaver); public class BcelTypeMunger extends ConcreteTypeMunger {

public class BcelTypeMunger extends List methods = newParent.getWithoutIter(true); private boolean mungeNewParent(BcelClassWeaver weaver) ConcreteTypeMunger {

for (int i = 0; i < method.size(); i++){ import java.util.Iterator; ResolvedMember superMethod = iter.next(); LazyClassGen target = weaver.getLazyClassGen();

ts

{

ResolvedMember superMethod = iter.next(); { LazyClassGen target = weaver.getLazyClassGen(); boolean cont = true; cont = enforce_abstractMethods(weaver); import java.util.Iterator;

0

} } import java.util.Iterator; import java.util.List; import java.util.Set;

Pr oj ec

java.util.List; } private boolean import mungeNewParent boolean cont = true; import java.util.Set; } = enforce_abstractMethods(weaver); (BcelClassWeaver cont weaver) public class BcelTypeMunger extends ConcreteTypeMunger { { List methods = newParent.getWithoutIter(true); for (int i < method.size(); i++){ LazyClassGen target = i = 0; private boolean mungeNewParent(BcelClassWeaver weaver)

20

import java.util.List; List methods = newParent.getWithoutIter(true); import java.util.Set; public class BcelTypeMunger extends ConcreteTypeMunger for (int {i = 0; i < method.size(); i++){ superMethod = iter.next(); publicResolvedMember class BcelTypeMunger extends ConcreteTypeMunger { private boolean mungeNewParent(BcelClassWeaver weaver) } { } private boolean mungeNewParent(BcelClassWeaver weaver) LazyClassGen target = weaver.getLazyClassGen(); { boolean cont = true; LazyClassGen target = weaver.getLazyClassGen(); cont = enforce_abstractMethods(weaver); boolean cont = true; cont = enforce_abstractMethods(weaver); List methods = newParent.getWithoutIter(true); for (int i = 0; i < method.size(); i++){ List methods = newParent.getWithoutIter(true); ResolvedMember superMethod = iter.next(); for (int i = 0; i < method.size(); i++){ } ResolvedMember superMethod = iter.next(); } } }

Jan’08

Jan’09

Mining API Popularity import java.util.Iterator; import java.util.List; import java.util.Set;

40

import java.util.Iterator; import java.util.Iterator; import java.util.List; import java.util.List; import java.util.Set; import java.util.Set;

private boolean mungeNewParent(BcelClassWeaver weaver) { LazyClassGen target = weaver.getLazyClassGen(); boolean cont = true; cont = enforce_abstractMethods(weaver); public class BcelTypeMunger extends ConcreteTypeMunger {

public class BcelTypeMunger extends List methods = newParent.getWithoutIter(true); private boolean mungeNewParent(BcelClassWeaver weaver) ConcreteTypeMunger {

for (int i = 0; i < method.size(); i++){ import java.util.Iterator; ResolvedMember superMethod = iter.next(); LazyClassGen target = weaver.getLazyClassGen(); import java.util.List; } mungeNewParent boolean cont = true; import java.util.Set; } cont = enforce_abstractMethods(weaver);

ts

{

{

ResolvedMember superMethod = iter.next();

LazyClassGen target = weaver.getLazyClassGen(); boolean cont = true; cont = enforce_abstractMethods(weaver); import java.util.Iterator;

0

} } import java.util.Iterator; import java.util.List; import java.util.Set;

Pr oj ec

private boolean (BcelClassWeaver weaver) public class BcelTypeMunger extends ConcreteTypeMunger { { List methods = newParent.getWithoutIter(true); for (int i < method.size(); i++){ LazyClassGen target = i = 0; private boolean mungeNewParent(BcelClassWeaver weaver)

20

import java.util.List; List methods = newParent.getWithoutIter(true); import java.util.Set; public class BcelTypeMunger extends ConcreteTypeMunger for (int {i = 0; i < method.size(); i++){ ResolvedMember superMethod = iter.next(); public class BcelTypeMunger extends ConcreteTypeMunger { private boolean mungeNewParent(BcelClassWeaver weaver) } { } private boolean mungeNewParent(BcelClassWeaver weaver) LazyClassGen target = weaver.getLazyClassGen(); { boolean cont = true; LazyClassGen target = weaver.getLazyClassGen(); cont = enforce_abstractMethods(weaver); boolean cont = true; cont = enforce_abstractMethods(weaver); List methods = newParent.getWithoutIter(true); for (int i = 0; i < method.size(); i++){ List methods = newParent.getWithoutIter(true); ResolvedMember superMethod = iter.next(); for (int i = 0; i < method.size(); i++){ } ResolvedMember superMethod = iter.next(); } } }

Jan’08

Jan’09

# projects using an API element

public class BcelTypeMunger extends ConcreteTypeMunger {

35 30

junit.framework.TestSuite javax.swing.JScrollPane javax.swing.border.Border

25 20 15 10

junit.framework.AssertionFailedError java.io.StringBufferInputStream java.lang.String

5

Jan 2008

time span

usage trends

Jan 2009

Who would benefit? # projects using an API element

40 35 30

junit.framework.TestSuite javax.swing.JScrollPane javax.swing.border.Border

25 20 15 10

junit.framework.AssertionFailedError java.io.StringBufferInputStream java.lang.String

5

Jan 2008

API users

time span

Jan 2009

API producers

API users always want to use the best product want free of defects software don’t want to waste time

API producers want to produce good product want feedback from the users

Examples junit.framework.AssertionFailerError compatibility problems

# projects using an API element

40 35 30

junit.framework.TestSuite javax.swing.JScrollPane javax.swing.border.Border

25

java.io.StringBufferInputStream code defect

20 15 10

junit.framework.AssertionFailedError java.io.StringBufferInputStream java.lang.String

5

Jan 2008

time span

Jan 2009

java.lang.String - code smell

Hypothesis The past usage trend of an API element is predictive of the future usage trend of the same element.

Evaluation Scenario junit.framework.AssertionFailerError 35 30

Oct 2008

junit.framework.TestSuite javax.swing.JScrollPane javax.swing.border.Border

25

Jan 2009

8 months

20 15 10

junit.framework.AssertionFailedError 40 java.io.StringBufferInputStream java.lang.String

5

Jan 2008

# projects using an API element

Jan 2008

# projects using an API element

40

35 30

junit.framework.TestSuite

time span javax.swing.JScrollPane

Jan 2009

javax.swing.border.Border

13 months

25 20 15 10

junit.framework.AssertionFailedError java.io.StringBufferInputStream java.lang.String

5

Jan 2008

time span

Jan 2009

Evaluation Results Trends 67%

33%

0%

1%

98%

1%

0%

18%

82%

Restrictions • The approach might cancel itself? No. • Unused imports remain in code? No. • Works only for Java? No.

Future Work • Find reasons behind a decline in usage. • Target the recommendations better. • Analyze more data. • Make user surveys.

How was it till now? bug-tracking systems

forums

• API quality • API usability • API compatibility • ...

documentation

emails and groups

# projects using an API element

40 35 30

junit.framework.TestSuite javax.swing.JScrollPane javax.swing.border.Border

25 20 15 10

junit.framework.AssertionFailedError java.io.StringBufferInputStream java.lang.String

5

Jan 2008

Evaluation Results Trends 67%

33%

0%

1%

98%

1%

0%

18%

82%

22

time span

Future Work • Find reasons behind a decline in usage. • Target the recommendations better. • Analyze more data. • Make user surveys.

Jan 2009