Mining API Popularity 40 35 # projects using an API element 30 - - PowerPoint PPT Presentation

mining api popularity
SMART_READER_LITE
LIVE PREVIEW

Mining API Popularity 40 35 # projects using an API element 30 - - PowerPoint PPT Presentation

Mining API Popularity 40 35 # projects using an API element 30 junit.framework.TestSuite javax.swing.JScrollPane javax.swing.border.Border 25 20 15 10 junit.framework.AssertionFailedError java.io.StringBufferInputStream


slide-1
SLIDE 1

Mining API Popularity

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

time span Jan 2008 Jan 2009 5 10 15 20 30 35 40 javax.swing.JScrollPane javax.swing.border.Border junit.framework.TestSuite # projects using an API element 25 java.io.StringBufferInputStream java.lang.String junit.framework.AssertionFailedError

slide-2
SLIDE 2

Mining API Popularity

java.io.StringBufferInputStream

API

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

slide-3
SLIDE 3

Mining API Popularity

popular/used unpopular/unused

slide-4
SLIDE 4

Mining API Popularity

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

slide-5
SLIDE 5

Mining API Popularity

  • API quality
  • API usability
  • API compatibility
  • ...
slide-6
SLIDE 6

How was it till now?

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

documentation forums emails and groups bug-tracking systems

slide-7
SLIDE 7

Mining API Popularity

import java.util.Iterator; import java.util.List; import java.util.Set; public class BcelTypeMunger extends ConcreteTypeMunger { private boolean mungeNewParent (BcelClassWeaver weaver) { LazyClassGen target =

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

2 P r

  • j

e c t s

Jan’08 Jan’09

slide-8
SLIDE 8

Mining API Popularity

import java.util.Iterator; import java.util.List; import java.util.Set; public class BcelTypeMunger extends ConcreteTypeMunger { private boolean mungeNewParent (BcelClassWeaver weaver) { LazyClassGen target =

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

2 P r

  • j

e c t s

time span Jan 2008 Jan 2009 5 10 15 20 30 35 40 javax.swing.JScrollPane javax.swing.border.Border junit.framework.TestSuite # projects using an API element 25 java.io.StringBufferInputStream java.lang.String junit.framework.AssertionFailedError

usage trends

Jan’08 Jan’09

slide-9
SLIDE 9

API users API producers

Who would benefit?

time span Jan 2008 Jan 2009 5 10 15 20 30 35 40 javax.swing.JScrollPane javax.swing.border.Border junit.framework.TestSuite # projects using an API element 25 java.io.StringBufferInputStream java.lang.String junit.framework.AssertionFailedError

slide-10
SLIDE 10

API users

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

slide-11
SLIDE 11

API producers

want to produce good product want feedback from the users

slide-12
SLIDE 12

Examples

time span Jan 2008 Jan 2009 5 10 15 20 30 35 40 javax.swing.JScrollPane javax.swing.border.Border junit.framework.TestSuite # projects using an API element 25 java.io.StringBufferInputStream java.lang.String junit.framework.AssertionFailedError

java.lang.String - code smell java.io.StringBufferInputStream code defect junit.framework.AssertionFailerError compatibility problems

slide-13
SLIDE 13

Hypothesis

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

slide-14
SLIDE 14

Evaluation Scenario

time span Jan 2008 Jan 2009 5 10 15 20 30 35 40 javax.swing.JScrollPane javax.swing.border.Border junit.framework.TestSuite # projects using an API element 25 java.io.StringBufferInputStream java.lang.String junit.framework.AssertionFailedError

time span Jan 2008 Jan 2009 5 10 15 20 30 35 40 javax.swing.JScrollPane javax.swing.border.Border junit.framework.TestSuite # projects using an API element 25 java.io.StringBufferInputStream java.lang.String junit.framework.AssertionFailedError

13 months Jan 2009 Jan 2008 Oct 2008 8 months

junit.framework.AssertionFailerError

slide-15
SLIDE 15

Evaluation Results

Trends 67% 33% 0% 1% 98% 1% 0% 18% 82%

slide-16
SLIDE 16

Restrictions

  • The approach might cancel itself? No.
  • Unused imports remain in code? No.
  • Works only for Java? No.
slide-17
SLIDE 17
  • Target the recommendations better.
  • Analyze more data.
  • Make user surveys.

Future Work

  • Find reasons behind a decline in usage.
slide-18
SLIDE 18

time span Jan 2008 Jan 2009 5 10 15 20 30 35 40 javax.swing.JScrollPane javax.swing.border.Border junit.framework.TestSuite # projects using an API element 25 java.io.StringBufferInputStream java.lang.String junit.framework.AssertionFailedError

Evaluation Results

22

Trends 67% 33% 0% 1% 98% 1% 0% 18% 82%

How was it till now?

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

documentation forums emails and groups bug-tracking systems

  • Target the recommendations better.
  • Analyze more data.
  • Make user surveys.

Future Work

  • Find reasons behind a decline in usage.