DEV Community

Jan Mewes
Jan Mewes

Posted on • Edited on

Hotspot Analysis for a Java Project

Software projects tend to become very complex and difficult to maintain. With the help of refactoring, the code can be made relatively easy to understand. However, in a real-world project, it seems impossible to have a very high code quality everywhere.

For the hotspots of a program, the locations with a high complexity and change rate, the refactoring efforts will most likely have the highest return on investment. This blog post explores a way how they can be identified in a Java project.

Apache Wicket was chosen as an example project. For its analysis, the open-source tools SonarCube, Code Charta, and Code Maat, and Python scripting are being used. The complexity is measured with SonarCube's Cognitive complexity metric and the change rate by the number of commits for a particular file.

Environment

The steps below are done in a DigitalOcean droplet, except of the final visualization.

  • Ubuntu 18.04
  • Pre-installed Docker

Preparation

Download of required repositories

The following repositories will be required along they way:

mkdir ~/src && cd ~/src git clone https://github.com/apache/wicket.git git clone https://github.com/adamtornhill/code-maat.git git clone https://github.com/experimental-software/code-analytics.git 
Enter fullscreen mode Exit fullscreen mode

Tool setup

A SonarCube server can be started with this docker run instruction:

docker run --env ES_JAVA_OPTS="-Xms750m -Xmx750m" -d -p 9000:9000 -p 9092:9092 sonarqube 
Enter fullscreen mode Exit fullscreen mode

We will also need a couple of system tools later:

apt update && apt install maven npm leiningen unzip -y 
Enter fullscreen mode Exit fullscreen mode

Code Charta needs to be installed via the Node Package Manager:

npm install codecharta-analysis -g npm install codecharta-visualization -g 
Enter fullscreen mode Exit fullscreen mode

For Code Mate there is no binary distribution, we need to compile it by ourselves:

cd ~/src/code-maat lein uberjar mkdir ~/bin cp target/code-maat-1.1-SNAPSHOT-standalone.jar ~/bin/code-maat.jar 
Enter fullscreen mode Exit fullscreen mode

By installing the sonar-scanner CLI tool, we can import a Java project without changing it's configuration:

cd ~/bin curl https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.3.0.1492-linux.zip \ > sonar-scanner-cli-3.3.0.1492-linux.zip unzip sonar-scanner-cli-3.3.0.1492-linux.zip PATH="$PATH:~/bin/sonar-scanner-3.3.0.1492-linux/bin" 
Enter fullscreen mode Exit fullscreen mode

Analysis

Now we can actually start the code analysis. The first step is to import the Java project into SonarCube:

cd ~/src/wicket mvn install sonar-scanner -Dsonar.projectKey=wicket \ -Dsonar.source=. -Dsonar.java.binaries=. \ -Dsonar.exclusions='**/*.js,**/*.xml' curl http://localhost:9000/api/ce/task?id=AWrweUgHuDEJjgfjbZpz \ | jq '.task.status' 
Enter fullscreen mode Exit fullscreen mode

Next, we extract the data from SonarCube into a JSON file which is the basis of the final code visualization:

ccsh sonarimport http://localhost:9000 wicket > /tmp/sonar.json 
Enter fullscreen mode Exit fullscreen mode

The counting of the number of commits for each file will be done with Code Maat which takes the git log as input:

cd ~/src/wicket git log --since="1 year" --all --numstat --date=short \ --pretty=format:'--%h--%ad--%aN' --no-renames \ > /tmp/gitlog.txt java -jar ~/bin/code-maat.jar --log /tmp/gitlog.txt \ --version-control git2 --analysis revisions \ > /tmp/codemaat-revisions.txt 
Enter fullscreen mode Exit fullscreen mode

Then we can enrich the sonar.json file with the information extracted by Code Maat with a little helper script:

cd ~/src/code-analytics python enrich_codecharta_data.py --sonar-json /tmp/sonar.json \ --codemaat-csv /tmp/codemaat-revisions.txt 
Enter fullscreen mode Exit fullscreen mode

Finally, we can start the Code Charta visualization, load the sonar.json in its GUI and select the metrics we want to visualize.

codecharta-visualization 
Enter fullscreen mode Exit fullscreen mode

Result

Top comments (1)

Collapse
 
janux_de profile image
Jan Mewes