Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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