Using JQAssistant

In PLC4X we are using a tool called JQAssistant for enforcing quality assurance rules.

JQAssistant can be thought of as a set of two components:

  • A set of scanners that analyse a project and stores the gathered information in for of linked graphs in a Neo4j database.

  • An engine that executes defined rules against the graph created during the scan phase of the build

These rules can produce either reports and tables or they are used to enforce rules.

If a pre-defined rule is violated the failed checks can be marked as warning or error that breaks the build.

In contrast to using the maven-enforcer-plugin doing cross-domain checks is really simple as all information is available in one big graph.

Currently the following scanners are active:

  • CDI

  • Common

  • Common Test

  • Core Analysis

  • EJB3

  • GraphML

  • JAX-RS

  • JPA 2

  • JSON

  • JUnit

  • Java

  • Java 9

  • Java EE 6

  • Maven 3

  • OSGi

  • RDBMS

  • TestNG

  • Tycho

  • XML

  • YAML

These rules that are automatically checked during the build are defined in src/jjqassistant. If defined in a reactor project, the rules apply to all modules of that (sub-)reactor. So if they are defined in the root module of the project, it applies to all modules.

Defining JQAssistant rules

TODO: Finish this "little detail" …​

Using the Web-UI

The scan and analysis is automatically performed during a normal Maven build. In order to do ad-hoc queries against the project or develop new rules, the Web-UI is very helpful.

To start the Web-UI, all you need to do, is run the following command (after a build):

mvn jqassistant:server

This will start a Neo4j server with web console.

[INFO] --- jqassistant-maven-plugin:1.3.0:server (default-cli) @ plclogger ---
[INFO] Connecting to store at 'file:/Users/christofer.dutz/Projects/Apache/PLC4X/target/jqassistant/store/'
2018-04-05 19:11:14.369+0200 INFO  [o.n.s.CommunityNeoServer] No SSL certificate found, generating a self-signed certificate..
2018-04-05 19:11:14.683+0200 INFO  [o.n.s.CommunityNeoServer] Starting HTTP on port 7474 (8 threads available)
2018-04-05 19:11:14.859+0200 INFO  [o.n.s.w.Jetty9WebServer] Mounting static content at /webadmin
2018-04-05 19:11:14.892+0200 INFO  [o.n.s.w.Jetty9WebServer] Mounting static content at /browser
Apr 05, 2018 7:11:15 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFORMATION: Initiating Jersey application, version 'Jersey: 1.19 02/11/2015 03:25 AM'
Apr 05, 2018 7:11:15 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFORMATION: Initiating Jersey application, version 'Jersey: 1.19 02/11/2015 03:25 AM'
Apr 05, 2018 7:11:15 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFORMATION: Initiating Jersey application, version 'Jersey: 1.19 02/11/2015 03:25 AM'
2018-04-05 19:11:15.396+0200 INFO  [o.n.s.CommunityNeoServer] Remote interface ready and available at http://localhost:7474/
[INFO] Running server for module org.apache.plc4x:plc4x-parent:0.0.1-SNAPSHOT
[INFO] Press <Enter> to finish.

So when visiting the anounced url with a browser, you can use the pretty useful neo4j web console.

Neo4j Web Console

Using IntelliJ Idea

IntelliJ comes with some interesting Neo4J support. Unfortunately this only supports Neo4j 3.

Unfortunately the process of enabling this toolset is a little less comfortable than the Web-UI version.

Even if JQAssistant uses Neo4j 2 per default, we can force it to use Neo4j 3 by providing an additional commandline parameter.

mvn -Djqassistant.neo4jVersion=3 clean install

JQAssistant uses Neo4j 3 and the resulting data directory is then in Neo4j 3 format.

In this case the server has to be started with the same parameter:

mvn -Djqassistant.neo4jVersion=3 jqassistant:server

As soon as the server is started, we can connect from the IntelliJ plugin.

Note: The connection settings also contain a username and a password.

neo4j intellij settings

It appears that this can simply be left empty of can contain random values.

After creating the connection, the Graph Neo4j view should list the new connection.

neo4j intellij database connections view

You can now use this to perform queries

neo4j intellij query results