Monday, September 14, 2015

OSGi - Update Java Source code programmatically


Hi,

This time its OSGi.

Problem
For my new assignment only I was and is the team; this time requirement was

Many times naive developers code in Java and leaves 
    • code un-formatted
    • does not remove unnecessary imports
    • does not remove unused variables
    • etc....
 Can we correct such code up to certain extent pro-grammatically?  

Solution
As I gradually started looking into Sonar, SonarQube etc I find that all these tools gives problem with our code but not the solution to those problems.  Then I searched for such APIs/Frameworks which could give me both - Problems in my code and Solution to them.

I finally landed at Eclipse JDT world.  On further digging I find that I need to make one headless OSGi plugin/application to achieve what I want.

After making headless eclipse plugin and certain RnD, I was not getting workbench object which is only available once Eclipse IDE opens.  

  • So this is the case where IDE needs to be opened to run code/application.  
  • Once IDE is opened then project is loaded which needs to be examined that means you need eclipse project.  
  • Then warnings/errors that we can configure in Eclipse gives proposals for problems (errors and warnings).  These proposals contains priority & changes based on context which can be applied to certain problem as a solution.


Ex.  If there are two or more imports which are not used by your program and when program is parsed by Eclipse it will check for first unused import and gives two proposals which are - (1) To remove that import only (2) Organize import which will remove all such unused imports.

Approach 1
So what I did programmatically as my initial approach (Yes there is one more approach which I am using now):
  • Used APIs to open project first
  • From Eclipse Project convert it to Java project
  • Collect names of specific files (called Documents in Eclipse APIs)
  • Open file (it will load it in IDE)
  • Parse each file for problems
  • For each problem get JavaProposals
  • Pick best suited proposals or if you do not want to address certain problem skip it
  • Apply proposal
  • Save Document
  • Close Document (So that too many documents does not get open)
  • Close Project
  • This is how you can go for each file.

Approach 2
After some more RnD I changed my approach which is more performant:
  • In Eclipse APIs certain Action classes are available to execute certain menu actions such as FormatAllAction
  • There is one menu item in Eclipse which is Java -> Code Style -> Clean Up
  • This Clean Up can be used for 
    • Format a file (formatting options can be configured)
    • Organize imports
    • Remove unused variables
    • Add serialize UID 
    • and few more....
  • So, I created my own profile and applied required settings
  • Run Action class for CleanUp
  • And I am done.

In this approach you can only resolve problems which are available in Code Clean Up option while in #1 you can do anything which is available as proposal.

This way we can correct code up to certain extent.  There are more action classes which are available and can be used.  If I made any further changes then I will certainly update here.

Although now I am on my way of giving a thought if I can do same without opening IDE :)

Thanks
Shailendra