A tool to detect migration code between two Java third-party libraries
MigrationMiner is an open source tool that provides the developer with easy-to-use and comprehensive way of extracting, from given list of input projects, existing migrations between two third-party libraries using program analysis based on Abstract Syntax Tree (AST) code representation. In a nutshell, MigrationMiner (i) detects, (ii) extracts, (iii) filters, and (iv) collects code changes related to any performed migration. For a given input project, MigrationMiner detects any migration undergone between two java libraries and returns the names and versions of both retired and new libraries. Thereafter, MigrationMiner extracts the specific code changes, from the client code, and which belong to the migration changes (it should at least have one removed method from the retired library, and one added method from the new library) from all other unrelated code changes within the commits. Next, MigrationMiner filters code changes to only keep fragments that contain migration traces i.e., a code fragment, generated by the diff utility, which contains the removed and added methods, respectively from the retired and the new library. Finally, MigrationMiner collects the library API documentation that is associated with every method in the client code. The output of MigrationMiner, for each detected migration between two libraries, is a set of migration traces, with their code context, and their corresponding documentation.
@inproceedings{alrubaye2019migrationminer, title={MigrationMiner: An Automated Detection Tool of Third-Party Java Library Migration at the Method Level}, author={Alrubaye, Hussein and Mkaouer, Mohamed Wiem and Ouni, Ali}, booktitle={2019 IEEE International Conference on Software Maintenance and Evolution (ICSME)}, pages={414--417}, year={2019}, organization={IEEE} }
mysql -u root -p
source ./MigrationMinerDBSQL.sql
After running the commands, the database should be created with all tables and views.
After running Main.java, the database Tables will be filled with any migration infomation found. For each potential migration, the following information can be found in database, whose schema is as follows:
There will be a generated HTML file named "MigrationMinnerOutput.html" that has the summary of all migrations detected, and for each migration, all its corresponding code fragments along with their Library documentation. An illutrative example of this file is in the following picture:
After running Main.java, You could read the output as objects by writing the following code. or run TestClient.java. That could help you to integrate the tool with your code.
//Return list of migrations between two pairs of libraries( added/removed)
LinkedList<MigrationRule> migrationRules= new MigrationRuleDB().getMigrationRulesWithoutVersion(1);
for (MigrationRule migrationRule : migrationRules) {
System.out.println("== Migration Rule "+ migrationRule.FromLibrary +
" <==> "+ migrationRule.ToLibrary +"==");
/*
* For every migrations, retrieve list of collected of fragments for migration at method level.
* every fragment has N added methods M removed methods
*/
ArrayList<Segment> segmentList = new MigrationSegmentsDB().getSegmentsObj(migrationRule.ID);
for (Segment segment : segmentList) {
segment.print();
// Print all removed method signatures With Docs
printMethodWithDocs( migrationRule.FromLibrary,segment.removedCode);
// Print all added method signatures With Docs
printMethodWithDocs( migrationRule.ToLibrary,segment.addedCode);
} // End fragment for every migration
} // End library migration
/*
* This method takes list of methods signatures with library that methods belong to.
* It will print the signatures and Docs for every method
*/
void printMethodWithDocs(String libraryName,ArrayList<String> listOfMethods ) {
// For every add method print the Docs
for(String methodSignature: listOfMethods){
// Convert method signatures as String to Object
MethodObj methodFormObj= MethodObj.GenerateSignature(methodSignature);
//retrieve Docs from the library for method has that name
ArrayList<MethodDocs> toLibrary = new LibraryDocumentationDB()
.getDocs( libraryName,methodFormObj.methodName);
//Map method signatures to docs
MethodDocs methodFromDocs = MethodDocs.GetObjDocs(toLibrary, methodFormObj);
if(methodFromDocs.methodObj== null) {
System.err.println("Cannot find Docs for: "+ methodSignature);
continue;
}
methodFromDocs.print();
}
}
Alrubaye, Hussein, Mohamed Wiem Mkaouer, Igor Khokhlov, Leon Reznik, Ali Ouni, and Jason Mcgoff. Learning to Recommend Third-Party Library Migration Opportunities at the API Level.Journal of Applied Soft Computing (2020).
Alrubaye, H., & Mkaouer, M. W. (2018, October). Automating the detection of third-party Java library migration at the function level. In Proceedings of the 28th Annual International Conference on Computer Science and Software Engineering (pp. 60-71). IBM Corp.
Alrubaye, H., Mkaouer, & M. W., Ali, O (2019). On the Use of Information Retrieval to Automate the Detection of Third-Party Java Library Migration At The Function Level, 27th IEEE/ACM International Conference on Program Comprehension 2019.
Alrubaye, H., & Wiem, M. (2019). Variability in Library Evolution. Software Engineering for Variability Intensive Systems: Foundations and Applications, 295.
Aljohani, A. (2019). An empirical study on discovering a new self-admitted technical debt type-API-debt. Thesis. Rochester Institute of Technology.
Alrubaye, H., Mkaouer, & M. W., Ali, O (2019). MigrationMiner: An Automated Detection Tool of Third-Party Java Library Migration at the Method Level. 2019 IEEE International Conference on Software Maintenance and Evolution (ICSME).
This software is licensed under the MIT license.