| // |
| // Licensed to the Apache Software Foundation (ASF) under one or more |
| // contributor license agreements. See the NOTICE file distributed with |
| // this work for additional information regarding copyright ownership. |
| // The ASF licenses this file to You under the Apache License, Version 2.0 |
| // (the "License"); you may not use this file except in compliance with |
| // the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| :imagesdir: ../images/ |
| |
| == Using JQAssistant |
| |
| In PLC4X we are using a tool called `https://jqassistant.org/[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 8 |
| - 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. |
| |
| image::neo4j-web-console.png[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. |
| |
| image::neo4j-intellij-settings.png[width=800] |
| |
| 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. |
| |
| image::neo4j-intellij-database-connections-view.png[width=300] |
| |
| You can now use this to perform queries |
| |
| image::neo4j-intellij-query-results.png[width=800] |