Skip to main content

My first serious Groovy class ..... decompiling java classes with closures

After I read the chapter 6 "closures" of the book Groovy and Grails Recipe, and I decided to use the power of closures of Groovy for resource (files) with other problem that I had, decompile in one step every class of jar library.

Well, the purpose of this class is call an external java decompiler (jad) from a Groovy class and execute the command into directory where the jar file was decompressed. And by using the power of closures executes recursively into this directory until find the classes.

Well, no more words, here the class
package demo

class Executor {
 // directory where the library(jar) was decompressed
 def path

 /**
  * Execute the decompilation of the classes into the directory defined in the path
  * @return
  */
 def decompileClasses(){
  def directory = new File(path)
  //make use of closures defined in the Object class
  directory.eachFileRecurse {
   def name = it.absolutePath
   //if the current resource hasn't a .class extension continues with next one
   if (name.indexOf(".class") < 0)
    return
   println "Processing ..." + it
   //getting the name of the class with the absolute path
   name = name.substring(0, name.indexOf( ".class")) + ".java"
   //defining the external command in order to be executed for every class file 
   def command = "D:\\Jad.exe -o -r -d " +  path +" -ff -nodos -v -s java " + it
   //execute the command
   def proc = command.execute()
   def outputCatcher = new StringBuffer()
   def errorCatcher = new StringBuffer()
   // Wait for the command to finish
   proc.consumeProcessOutput(outputCatcher, errorCatcher)
   proc.waitFor()
   // Obtain status and output
   // Obtain status and output
   println "return code: ${proc.exitValue()}"
   println 'out:\n' + outputCatcher
   println 'err:\n' + errorCatcher
  }
 }
}

def executor = new Executor(path:"D:\\myfolder\\my_jar")
executor.decompileClasses()


You can find more about "executing external processes" here and here

The Jad decompile executable file is located in this link

So, it is really useful the use of closures in Groovy. So you can see that I didn't use an static void main like java, here the point, I have created a groovy file named Decompiler.groovy, it contains the groovy class and the groovy script, so when the groovy file is compiled the Decompiler groovy class is created, and it contains the calling to the Executor class and the decompileClasses() method.

Well, I hope to follow posting about Groovy in the future.

Comments

Popular posts from this blog

How to .. Integration Non-SAP J2EE-based Web Applications into SAP Portal with SSO Part 1

We are going to integrate Non-SAP J2EE-based Web Applications into the SAP Portal with Application Integrator and SSO. In this part, I will discuss the overall of these posts and configure the iView with Application Integrator Overview of Integration. To perform this integration must take into account the following steps: Deployment of the portal application for the creation of the system portal object Create and set the type of Application Integrator iView that will contain the applications to integrate. Installing SAPSSOEXT and SAPSECU libraries Deployment of the application gateway called SsoGatewayWeb Changing the target application. This integration has the following restrictions: It applies only for web applications based on J2EE Servlet. Depend exclusively on the sucessful load of the libraries supported by SAP (sapssoext and sapsecu) in both Windows and UNIX environments. The target application must have created a profile for the user id logged to the SAP portal, this sh

WebDynpro for Java: Tutorial of the Basic Usage of RoadMap Component

We will create a local Development component project of the type Web Dynpro as follow Our project will contain only 3 views with the purpose of show the basic usage of the roadMap object. After, we create our component controller RoadMap and the RoadMapView view as follow Now, we will create the 2 views more, the previous one will contain only the RoadMap Object (RoadMapView) used in all the project, the other ones show the flow between screens. Here the list of the 3 views: RoadMapView,  InitView, and ConfirmView. Now, we will add the component RoadMap object (it is on the Standar Complex Group) to the RoadMapView view, but first delete the default object added to the view, after we will need to add two steps (it could be more, depends of your logic) to our roadmap object. In order to do that we will use the Outline view of the NWDS. We add the two steps as follow The type steps to add at the RoadMap object will be ot the "RoadMapStep" type. The name of the steps are: Init