Share
Embed
Dirk Mahler on Software Analyse mit jQAssistant & Neo4j
Enterprise Java User Group Austria
January 18, 2016
Transcript
59 slides
-
by Software Analysis Using jQAssistant and Neo4j eJUG Vienna Graph
Database Austria 01/2016 Dirk Mahler -
2 AGENDA jQAssistant Software As A Graph
About Structures, Rules and Code Verifying Rules With The Graph Model Wrap Up Q&A -
4 http://jQAssistant.org Open Source: GPLv3 Current release: 1.1.1
initiated: 03/2013 first stable release: 04/2015 Neo4j Community Edition http://neo4j.org embedded, no installation necessary -
5 The Idea Scan software structures Store
in a database Execute queries Explore Add high level concepts Find constraint violations Create Reports Database Find all… -
7 Available scanner plugins Plugin API is public
*.class RDBMS Schema Git JaCoCo FindBugs CheckStyle Liquibase JAR, WAR, EAR ZIP application.xml web.xml MANIFEST.MF /META-INF/services/* beans.xml pom.xml surefire-reports.xml GZ *.properties *.xsd M2 Repository *.yaml -
8 Getting Started – Command Line unzip jqassistant.distribution-1.1.1.zip
cd jqassistant.distribution-1.1.1/bin jqassistant.sh scan –f model.jar jqassistant.sh scan –f acme.war jqassistant.sh scan –f acme.ear jqassistant.sh scan –u http://somewhere.com/acme.ear jqassistant.sh scan –u maven:repository::http://host/releases jqassistant.sh scan –u rdbms:schema::jdbc:oracle:thin:user/secret@host:1521:sid jqassistant.sh server http://localhost:7474 -
9 Getting Started – Maven Project <build> <plugins> <plugin>
<groupId>com.buschmais.jqassistant.scm</groupId> <artifactId>jqassistant-maven-plugin</artifactId> <version>1.1.1</version> </plugin> </plugins> </build> mvn install mvn jqassistant:scan mvn jqassistant:server http://localhost:7474 -
11 All we need is… Nodes Labels
Properties Relationships Modeling is just… Taking a pen Drawing the structures on a whiteboard (i.e. the database) We don‘t need… Foreign keys Tables and schemas Deep knowledge in graph theory Type EXTENDS fqn:org.springframework.samples. petclinic.model.Owner -
Project Artifact Maven CONTAINS Package name:org CONTAINS Package name:springframework CONTAINS
Package name:petclinic Package CONTAINS name:model name:petclinic CONTAINS Package name:samples CREATES -
RETURNS READS Field DECLARES name:address Package name:model Class Type CONTAINS
fqn:org.springframework. samples.petclinic. model.Person name:Person Annotation ANNOTATED_BY Type OF_TYPE fqn:javax.persistence.MappedSuperclass Type EXTENDS Class fqn:org.springframework. samples.petclinic. model.Owner name:Owner Type OF_TYPE fqn:java.lang.String DECLARES Method name:getAddress() Annotation ANNOTATED_BY Type OF_TYPE fqn:javax.persistence.Entity -
14 Type Type Class EXTENDS Explore an application using
queries Which class extends from another class? Let‘s convert this to ASCII art… () as nodes -[]-> as directed relationships -
15 Type Type Class EXTENDS Explore an application using
queries Which class extends from another class? Let‘s convert this to ASCII art… () as nodes -[]-> as directed relationships ()-[]->() -
16 C2 Type C1 Type Class EXTENDS Explore an
application using queries Which class extends from another class? Let‘s convert this to ASCII art… () as nodes -[]-> as directed relationships (c1)-[]->(c2) -
17 C2 Type C1 Type Class EXTENDS Explore an
application using queries Which class extends from another class? Let‘s convert this to ASCII art… () as nodes -[]-> as directed relationships (c1)-[:EXTENDS]->(c2) -
18 Explore an application using queries Which class
extends from another class? Let‘s convert this to ASCII art… () as nodes -[]-> as directed relationships (c1:Class)-[:EXTENDS]->(c2:Type) C2 Type C1 Type Class EXTENDS -
19 Explore an application using queries Which class
extends from another class? Pattern matching is the core principle of Cypher MATCH (c1:Class)-[:EXTENDS]->(c2:Type) RETURN c1.fqn, c2.fqn C2 Type C1 Type Class EXTENDS -
About Structures, Rules And Code Analysis of software systems using
jQAssistant and Neo4j 21 -
23 Sketch of an architecture My Big Fat Demo
Application -
24 Sketch of an architecture Business modules Shopping
Cart Usermanagement -
25 Sketch of an architecture Allowed dependencies between
business modules Shopping Cart Usermanagement -
26 Sketch of an architecture Technical layering JSF-UI
REST Business Logic Persistence JSF-UI REST Business Logic Persistence -
27 Sketch of an architecture Allowed dependencies between
technical layers JSF-UI REST Business Logic Persistence JSF-UI REST Business Logic Persistence -
28 Sketch of an architecture Allowed dependencies between
business modules and technical layers JSF-UI REST Business Logic Persistence JSF-UI REST Business Logic Persistence -
29 Sketch of an architecture Allowed dependencies between
business modules and technical layers JSF-UI REST Business Logic Persistence JSF-UI REST Business Logic Persistence -
30 Sketch of an architecture Abstraction between layers
(API vs. Implementation) JSF-UI REST Business Logic Persistence JSF-UI REST Business Logic Persistence -
31 Sketch of an architecture Forbidden dependency JSF-UI
REST Business Logic Persistence JSF-UI REST Business Logic Persistence -
32 Sketch of an architecture Allowed external dependencies
per layer JSF-UI REST EJB JPA JSF-UI REST Business Logic Persistence -
Translation of architecture rules into a project structure
Java language element: Package org.jqassistant.demo 33 -
Translation of architecture rules into a project structure
Java language element: Package Definition of business modules on „top level“ 34 Shopping Cart „org.jqassistant.demo.cart“ Usermanagement „org.jqassistant.demo.user“ -
35 Translation of architecture rules into a project structure
Java language element: Package Technical layers …demo.cart.ui …demo.cart.rest …demo.cart.logic …demo.cart.persistence JSF-UI REST Business Logic Persistence -
36 Translation of architecture rules into a project structure
Java language element: Package Technical layers …demo.cart.ui …demo.cart.rest …demo.cart.logic.api …demo.cart.logic.impl …demo.cart.persistence.api …demo.cart.persistence.impl JSF-UI REST Business Logic Persistence -
37 Package Names All packages in a Maven
module must be prefixed with ${groupId}.${artifactId} Example: groupId=org.jqassistant artifactId=demo => org.jqassistant.demo -
38 Class Names Message Driven Beans must have
a suffix „MDB“. -
39 Class location JPA entities must be located
in „model“ packages. -
40 Test design Every test method must contain
at least one assertion. Each assertion must provide a human readable message. -
41 Abstraction Remote APIs must be interfaces declaring
only primitives or immutables as parameter or return types. OSGi-Bundles must only export dedicated API packages. -
43 Source Code Java, Properties, XML, YML People Architect, Developer,
Test Documentation UML, Wiki, readme.txt Tools Compiler, Static Code Analysis, CI -
44 Source Code – Abstraction levels Folder, File File
System Package, Class, Field, Method, Annotation Java Abstraction, Immutable, Factory Design Module, Layer, Dependency Architecture -
45 Source Code – Automated validation Folder, File File
System Package, Class, Field, Method, Annotation Java Abstraction, Immutable, Factory Design Module, Layer, Dependency Architecture -
46 Java elements represent higher level concepts Package
Module Annotated Class Entity Constraints apply to these concepts JPA entities must be located in „model“ packages -
47 Concepts and Constraints How to make them
visible? Is there a language to describe them? -
49 Analyze Execution of rules Defined in
AsciiDoc or XML documents Concepts Enrich data model Constraints Detect violations Group Allow different execution profiles -
51 Concept == JPA Entities [[jpa2:Entity]] .Labels all types
annotated with @javax.persistence.Entity with Jpa and Entity. [source,cypher,role=concept] ---- MATCH (t:Type)-[:ANNOTATED_BY]->()-[:OF_TYPE]->(a:Type) WHERE a.fqn ="javax.persistence.Entity" SET t:Jpa:Entity RETURN t AS Entity ---- -
52 Concept Entity Jpa Type Class fqn:org.springframework. samples.petclinic. model.Owner
name:Owner Annotation ANNOTATED_BY Type OF_TYPE fqn:javax.persistence.Entity -
53 Constraint [[model:JpaEntityInModelPackage]] .All JPA entities must be located
in packages named "model". [source,cypher,role=constraint,requiresConcepts="jpa2:Entity"] ---- MATCH (package:Package)-[:CONTAINS]->(entity:Jpa:Entity) WHERE package.name <> "model" RETURN entity AS EntityInWrongPackage ---- -
54 Group [[default]] [role=group,includesConstraints="model:JpaEntityInModelPackage"] == Naming Rules The following
naming rules apply: - <<model:JpaEntityInModelPackage>> -
55 AsciiDoc Markup Language Rendering to
DocBook HTML PDF Executable specification Coding rules Design & Architecture -
58 Holistic and extensible view on code structure and
system architecture Exploration of existing structures Validation of rules using concepts from architecture & design language Executable architecture and design specification