From the last milestone to the first stable release
It’s now about 19 months ago that the first lines of source code have been committed to the jQAssistant repository at GitHub. At this time it was just a prototype for playing around and collecting some ideas of what could be done with software structures in a graph database – the initial inspiration came from Michael Hunger and his project called class-graph.
Since then jQAssistant has grown rapidly – functionality has been added, code refactored, documentation written, performance optimized, milestones released and a web site launched. Lots of ideas were provided by friends, colleagues and developers who stumbled over the project; presentations and demonstrations were given at Java User Groups and conferences (Java Day Riga 2013, JavaLand 2014) – feedback has always been very positive.
Now as the functionality has reached a meaningful level and the code base is mature enough jQAssistant should get its first stable release – it will be available before the end of this year. Until then another milestone (M4) and a release candidate will be published. The current developer snapshot already contains some interesting changes, e.g.
- New concepts and constraints, e.g. Exceptions, JUnit3/4, Maven and CDI
- Severity for constraints and concepts
- Much better scanning performance
- Documentation enhancements
Some things still need to be done, let’s have a look at what’s on the list:
1. Command Line Interface
Several people requested tooling which is indepent of any specific build framework like Maven. Thus a command line client will be available which will support operations like:
jqassistant scan -f classes/
jqassistant scan –files my-big.war,my-even-bigger.ear
jqassistant scan -u http://somehost/any.jar
2. Plugin API
At its heart jQAssistant is just a little framework on top of Neo4j which allows scanning, executing rules and reporting the results. The important thing to know is that the actual work is performed by plugins – and the intention is to enable users to implement their own functionality according to their needs. A first step has already been done by publishing the API for custom reports. In a very near future there will be also documentation available on how to distribute your own rules and – even more interesting – on how to create scanners for your own languages (e.g. DSLs) or descriptors in any file format. If you’re able to parse the input and define how the information should look like as a graph then you will be surprised how easy it can be to store your software structures in Neo4j – especially if you model your data using eXtended Objects, the cute little brother of jQAssistant.
3. License Change
To be compatible with the license model of the embedded instance of Neo4j Community Edition there will be a change from ASL 2.0 to GPLv3. It will still be possible to use jQAssistant in private or commercial contexts for free – the main difference is that any derivative work based on jQAssistant which is distributed needs to be licensed accordingly.
Probably the most useful but also the biggest challenge – the documentation needs to be enhanced: better explanation of the concepts, APIs, more examples, etc.
Beside these points there are other interesting things going on. What would you think about a standalone jQAssistant server instance which is informed by your CI server that a new artifact has been deployed to your artifact repository and which will automatically perform a scan, execute a pre-defined set of rules and create reports – e.g. impact analysis on other artifacts? It’s already work in progress. There’s also an idea for implementing an extension for Maven and JUnit to dynamically create test suites according to classes which have been changed by a commit: the tests which are potentially affected will be executed first to provide faster feedback to developers.
Do you see other interesting use cases? jQAssistant is a community project – any contribution is highly welcome: this includes ideas, feedback on existing or missing functionality, bug reports, feature requests, documentation enhancements, blog posts, tweets, pull requests, etc.