DEV Community

Genne23v
Genne23v

Posted on

For Contributors to my OpenSSG

Like Prettier and ESLint in Javascript, I needed to add Java formatting and linting tools. For formatting, I looked at google-java-format, codestyle, and spotless. Since I'm not using Java framework, I can only use plugin to format my code. Although google-java-format does not support configurability, I just chose to follow Google Java format as I believe they have most common language format standard. To use google-java-format in MacOS, go to IntelliJ IDEA -> Preference (Windows: File -> Setting) and search "plugin" menu. Then, find google-java-format using search bar. Now all you need to do is to install the plugin. I didn't have to enable it, I think it needs to be enabled in some cases. You can refer to the documentation. To format your code, go to Code menu and select Reformat code or Reformat file. It will format your code.

Image description

To lint my code I found Spotbugs and SonarLint. I tried them both in my project. Each one found different types of errors. SpotBugs found potential null cases in my code more than SonarLint while SonarLink advised me to reduce complexity. I had a bad smell that I have very complex logic that might need to be more concise. I have three logics with high number of complexity. I know it's good time to fix the smell, I just leave it in my to-do-list to fix later. So I decided to add Spotbug in my CONTRIBUTING.md. Installing Spotbug is same as other plugins. After installation, go to View -> Tool Windows. Then you will see Spotbugs menu (Follow same for SonarLint). Run it to see the result of linting your file and you will see the error messages on your console. In case you don't understand the error message, you can find more details on SpotBugs bug description.

First I had to deal with reliance on default encoding in FileWriter and FileReader. It means that I need to specify encoding method for file read and write. So I updated my code with InputStreamRead and OutputStreamWrite as below.

File htmlFile = new File(filename);
FileOutputStream fs = new FileOutputStream(htmlFile);
var fileWriter = new OutputStreamWriter(fs, "UTF-8");
Enter fullscreen mode Exit fullscreen mode

I added UTF-8 in OutputStreamWriter otherwise it will use platform default encoding which could produce an unpredictable bug.

Then I need to add some null check as per SpotBugs suggestions. I used Paths.get(file).getFilename() in many places to get the file name to add it to the link or to a part of text in html files. It's called Possible null pointer dereference.

I also had May expose internal static state by storing a mutable object in my DOMNode class. This error is from a shallow copy of mutable object that could produce unintended changes in private property. So I updated my copy constructor and setter to create a new object for deep copy.

Rest of errors are minor issues such as replacing a string in multiple places with constant variable, removing useless variable and modules, initializing variables, and adding default case to switch statement. I found it good practise to keep these error in mind while coding. It's very helpful to write a better code.

I wish I could go back to where I started my OpenSSG, so that I could create a package to make things automated. I know Java syntax and methods, but more importantly I didn't know Java environment. There aren't many Java CLI tools, so I couldn't find good articles how to start Java CLI programming. I will add pre-commit hooks after referencing to the repo that I found.

Top comments (0)