├── .editorconfig ├── .github ├── CODEOWNERS └── ISSUE_TEMPLATE │ ├── 01-template-for-feature.md │ ├── 02-template-for-bug.md │ ├── 03-template-for-task.md │ └── config.yml ├── .gitignore ├── LICENSE ├── pom.xml ├── readme.adoc └── src ├── it ├── jpms │ ├── jqassistant │ │ └── it.xml │ ├── module1 │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ ├── com │ │ │ └── buschmais │ │ │ │ └── jqassistant │ │ │ │ └── plugin │ │ │ │ └── java │ │ │ │ └── it │ │ │ │ └── jpms │ │ │ │ └── module1 │ │ │ │ ├── api │ │ │ │ └── MyService.java │ │ │ │ └── impl │ │ │ │ └── MyServiceImpl.java │ │ │ └── module-info.java │ ├── module2 │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ ├── com │ │ │ └── buschmais │ │ │ │ └── jqassistant │ │ │ │ └── plugin │ │ │ │ └── java │ │ │ │ └── it │ │ │ │ └── jpms │ │ │ │ └── module2 │ │ │ │ └── impl │ │ │ │ └── Main.java │ │ │ └── module-info.java │ └── pom.xml └── settings.xml ├── main ├── asciidoc │ ├── java-type-hierarchy.puml │ ├── release-notes.adoc │ └── scanner.adoc ├── java │ └── com │ │ └── buschmais │ │ └── jqassistant │ │ └── plugin │ │ └── java │ │ ├── api │ │ ├── annotation │ │ │ └── jQASuppress.java │ │ ├── model │ │ │ ├── AbstractDescriptor.java │ │ │ ├── AccessModifierDescriptor.java │ │ │ ├── AnnotatedDescriptor.java │ │ │ ├── AnnotationDescriptor.java │ │ │ ├── AnnotationTypeDescriptor.java │ │ │ ├── AnnotationValueDescriptor.java │ │ │ ├── ByteCodeDescriptor.java │ │ │ ├── ClassDescriptor.java │ │ │ ├── ClassFileDescriptor.java │ │ │ ├── ClassTypeDescriptor.java │ │ │ ├── ClassValueDescriptor.java │ │ │ ├── ConstructorDescriptor.java │ │ │ ├── Declares.java │ │ │ ├── EnumDescriptor.java │ │ │ ├── EnumTypeDescriptor.java │ │ │ ├── EnumValueDescriptor.java │ │ │ ├── ExportedPackageDescriptor.java │ │ │ ├── FieldDescriptor.java │ │ │ ├── IndexTemplate.java │ │ │ ├── InterfaceTypeDescriptor.java │ │ │ ├── InvokesDescriptor.java │ │ │ ├── JarArchiveDescriptor.java │ │ │ ├── JavaArtifactFileDescriptor.java │ │ │ ├── JavaByteCodeDescriptor.java │ │ │ ├── JavaClassesDirectoryDescriptor.java │ │ │ ├── JavaDescriptor.java │ │ │ ├── JavaSuppressDescriptor.java │ │ │ ├── LambdaMethodDescriptor.java │ │ │ ├── LineNumberDescriptor.java │ │ │ ├── ManifestEntryDescriptor.java │ │ │ ├── ManifestFileDescriptor.java │ │ │ ├── ManifestSectionDescriptor.java │ │ │ ├── MemberDescriptor.java │ │ │ ├── MethodDescriptor.java │ │ │ ├── ModuleDescriptor.java │ │ │ ├── OpenPackageDescriptor.java │ │ │ ├── PackageDescriptor.java │ │ │ ├── PackageMemberDescriptor.java │ │ │ ├── PackageToModuleDescriptor.java │ │ │ ├── ParameterDescriptor.java │ │ │ ├── PrimitiveDescriptor.java │ │ │ ├── PrimitiveValueDescriptor.java │ │ │ ├── PropertyFileDescriptor.java │ │ │ ├── ProvidedServiceDescriptor.java │ │ │ ├── ReadsDescriptor.java │ │ │ ├── RecordTypeDescriptor.java │ │ │ ├── RequiresDescriptor.java │ │ │ ├── ServiceLoaderDescriptor.java │ │ │ ├── SignatureDescriptor.java │ │ │ ├── TypeDependsOnDescriptor.java │ │ │ ├── TypeDescriptor.java │ │ │ ├── TypedDescriptor.java │ │ │ ├── VariableDescriptor.java │ │ │ ├── VisibilityModifier.java │ │ │ ├── WritesDescriptor.java │ │ │ ├── XmlPropertyFileDescriptor.java │ │ │ └── generics │ │ │ │ ├── BoundDescriptor.java │ │ │ │ ├── GenericArrayTypeDescriptor.java │ │ │ │ ├── GenericDeclarationDescriptor.java │ │ │ │ ├── HasActualTypeArgumentDescriptor.java │ │ │ │ ├── ParameterizedTypeDescriptor.java │ │ │ │ ├── TypeVariableDescriptor.java │ │ │ │ └── WildcardTypeDescriptor.java │ │ ├── report │ │ │ ├── Java.java │ │ │ ├── JavaGenericsReportHelper.java │ │ │ └── TypeSourceHelper.java │ │ └── scanner │ │ │ ├── ArtifactScopedTypeResolver.java │ │ │ ├── JavaScope.java │ │ │ ├── SignatureHelper.java │ │ │ ├── TypeCache.java │ │ │ └── TypeResolver.java │ │ └── impl │ │ └── scanner │ │ ├── ClassFileScannerConfiguration.java │ │ ├── ClassFileScannerPlugin.java │ │ ├── ClassTypeScannerPlugin.java │ │ ├── JarScannerPlugin.java │ │ ├── JavaClassesDirectoryScannerPlugin.java │ │ ├── ManifestFileScannerPlugin.java │ │ ├── PackageDirectoryScannerPlugin.java │ │ ├── PropertyFileScannerPlugin.java │ │ ├── ServiceLoaderFileScannerPlugin.java │ │ ├── XmlPropertyFileScannerPlugin.java │ │ └── visitor │ │ ├── AbstractAnnotationVisitor.java │ │ ├── AnnotationDefaultVisitor.java │ │ ├── AnnotationValueVisitor.java │ │ ├── ClassVisitor.java │ │ ├── FieldVisitor.java │ │ ├── MethodComplexityVisitor.java │ │ ├── MethodLoCVisitor.java │ │ ├── MethodVisitor.java │ │ ├── ModuleVisitor.java │ │ ├── SuppressAnnotationVisitor.java │ │ ├── VisitorHelper.java │ │ ├── delegate │ │ ├── DelegatingAnnotationVisitor.java │ │ ├── DelegatingMethodVisitor.java │ │ └── Delegator.java │ │ └── generics │ │ ├── AbstractBoundVisitor.java │ │ ├── AbstractGenericDeclarationVisitor.java │ │ ├── ClassSignatureVisitor.java │ │ ├── MethodSignatureVisitor.java │ │ └── TypeVariableResolver.java └── resources │ └── META-INF │ ├── jqassistant-plugin.xml │ └── jqassistant-rules │ ├── java-classpath.xml │ └── java.xml └── test ├── java └── com │ └── buschmais │ └── jqassistant │ └── plugin │ └── java │ └── test │ ├── AbstractJavaPluginIT.java │ ├── assertj │ ├── FieldDescriptorCondition.java │ ├── MethodDescriptorCondition.java │ └── TypeDescriptorCondition.java │ ├── language │ └── JavaLanguageElementTest.java │ ├── matcher │ ├── AbstractMemberDescriptorMatcher.java │ ├── AnnotationValueDescriptorMatcher.java │ ├── FieldDescriptorMatcher.java │ ├── MethodDescriptorMatcher.java │ ├── PackageDescriptorMatcher.java │ ├── PropertyDescriptorMatcher.java │ ├── PropertyFileDescriptorMatchers.java │ ├── TypeDescriptorMatcher.java │ └── ValueDescriptorMatcher.java │ ├── rules │ ├── ClasspathIT.java │ ├── DefaultMethodIT.java │ ├── DependencyIT.java │ ├── DeprecatedIT.java │ ├── FunctionalInterfaceIT.java │ ├── GeneratedTypeIT.java │ ├── InnerTypeIT.java │ ├── JavaTestIT.java │ ├── LambdaMethodIT.java │ ├── LifecycleAnnotationIT.java │ ├── LombokIT.java │ ├── MemberInheritedFromIT.java │ ├── MethodOverloadsIT.java │ ├── MethodOverridesIT.java │ ├── PackageAnnotatedByIT.java │ ├── ThrowableIT.java │ ├── TypeAssignableFromIT.java │ ├── TypeParameterIT.java │ ├── VirtualDependsOnIT.java │ └── VirtualInvokesIT.java │ ├── scanner │ ├── AnnotationIT.java │ ├── AnonymousInnerClassIT.java │ ├── ArrayIT.java │ ├── ByteCodeVersionIT.java │ ├── ConstructorIT.java │ ├── CyclomaticComplexityIT.java │ ├── EnumerationIT.java │ ├── FieldValueIT.java │ ├── GenericsIT.java │ ├── InheritanceIT.java │ ├── InvalidClassFileIT.java │ ├── JavaClassesDirectoryScannerPluginTest.java │ ├── JavaRuntimePT.java │ ├── ManifestFileIT.java │ ├── NestedInnerClassesIT.java │ ├── PackageIT.java │ ├── PojoIT.java │ ├── PropertyFileIT.java │ ├── ServiceLoaderIT.java │ ├── SuppressIT.java │ ├── TypeResolverIT.java │ ├── VisibilityIT.java │ ├── XmlPropertyFileScannerPluginIT.java │ └── generics │ │ └── JavaGenericsIT.java │ └── set │ ├── rules │ ├── classpath │ │ └── resolve │ │ │ ├── a │ │ │ ├── AnnotationType.java │ │ │ ├── ClassType.java │ │ │ ├── EnumType.java │ │ │ ├── ExceptionType.java │ │ │ ├── InterfaceType.java │ │ │ └── ValueType.java │ │ │ └── b │ │ │ └── DependentType.java │ ├── dependency │ │ ├── packages │ │ │ ├── a │ │ │ │ └── A.java │ │ │ └── b │ │ │ │ └── B.java │ │ └── types │ │ │ ├── DependentType.java │ │ │ ├── FieldAnnotation.java │ │ │ ├── FieldAnnotationValueType.java │ │ │ ├── FieldType.java │ │ │ ├── FieldTypeParameter.java │ │ │ ├── ImplementedInterface.java │ │ │ ├── ImplementedInterfaceTypeParameter.java │ │ │ ├── InvokeMethodType.java │ │ │ ├── LocalVariable.java │ │ │ ├── LocalVariableAnnotation.java │ │ │ ├── LocalVariableAnnotationValueType.java │ │ │ ├── MethodAnnotation.java │ │ │ ├── MethodAnnotationValueType.java │ │ │ ├── MethodException.java │ │ │ ├── MethodParameter.java │ │ │ ├── MethodParameterTypeParameter.java │ │ │ ├── MethodReturnType.java │ │ │ ├── MethodReturnTypeParameter.java │ │ │ ├── SuperClass.java │ │ │ ├── SuperClassTypeParameter.java │ │ │ ├── TypeAnnotation.java │ │ │ └── TypeAnnotationValueType.java │ ├── deprecated │ │ ├── DeprecatedType.java │ │ └── package-info.java │ ├── exception │ │ ├── FirstLevelError.java │ │ ├── FirstLevelException.java │ │ ├── FirstLevelRuntimeException.java │ │ ├── FirstLevelThrowable.java │ │ ├── SecondLevelError.java │ │ ├── SecondLevelException.java │ │ ├── SecondLevelRuntimeException.java │ │ └── SecondLevelThrowable.java │ ├── generated │ │ ├── Generated.java │ │ └── NotGenerated.java │ ├── inheritance │ │ ├── AbstractClassType.java │ │ ├── ClientType.java │ │ ├── InterfaceType.java │ │ └── SubClassType.java │ ├── innertype │ │ └── OuterType.java │ ├── java │ │ ├── DefaultMethod.java │ │ ├── FunctionalInterface.java │ │ ├── FunctionalInterfaceWithoutAnnotation.java │ │ ├── LambdaMethod.java │ │ ├── MarkerInterface.java │ │ └── NonFunctionalInterface.java │ ├── lifecycleannotation │ │ └── ManagedResource.java │ ├── lombok │ │ ├── Person.java │ │ └── lombok.config │ ├── methodoverloads │ │ └── InterfaceType.java │ ├── packageannotation │ │ ├── PackageClass.java │ │ └── package-info.java │ └── virtualdependson │ │ ├── ClassType.java │ │ ├── ClassTypeClient.java │ │ ├── InterfaceType.java │ │ ├── InterfaceTypeClient.java │ │ └── SubClassType.java │ └── scanner │ ├── annotation │ ├── AnnotatedType.java │ ├── Annotation.java │ ├── AnnotationWithDefaultValue.java │ ├── Enumeration.java │ └── NestedAnnotation.java │ ├── array │ └── Array.java │ ├── constructor │ ├── enumeration │ └── EnumerationType.java │ ├── fieldvalue │ └── FieldValue.java │ ├── generics │ ├── ExtendsGeneric.java │ ├── GenericFields.java │ ├── GenericMethods.java │ ├── GenericTypeDeclarations.java │ ├── ImplementsGeneric.java │ └── dependson │ │ ├── BoundGenericMethod.java │ │ ├── BoundGenericType.java │ │ ├── ExtendsGenericClass.java │ │ ├── GenericMembers.java │ │ ├── GenericType.java │ │ ├── ImplementsGenericInterface.java │ │ ├── NestedGenericMethod.java │ │ └── NestedGenericType.java │ ├── inheritance │ ├── SubInterface.java │ └── SuperInterface.java │ ├── innerclass │ ├── AnonymousInnerClass.java │ └── NestedInnerClasses.java │ ├── metric │ └── CyclomaticComplexityType.java │ ├── pojo │ └── Pojo.java │ ├── resolver │ ├── A.java │ └── B.java │ ├── serviceloader │ ├── OuterClass.java │ ├── Service.java │ └── ServiceImpl.java │ ├── suppress │ └── Suppress.java │ └── vsibility │ └── Public.java └── resources ├── META-INF ├── MANIFEST.MF ├── invalid.properties ├── jqassistant-plugin.xml ├── jqassistant-rules │ ├── generated.xml │ ├── javaruntime.xml │ └── suppress.xml ├── services │ └── com.buschmais.jqassistant.plugin.java.test.set.scanner.serviceloader.Service └── test.properties ├── com └── buschmais │ └── jqassistant │ └── plugin │ └── java │ └── test │ └── set │ └── scanner │ └── empty │ └── readme.txt └── set └── scanner └── propertyfiles ├── properties-2-props.xml └── properties-empty.xml /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | insert_final_newline = true 8 | indent_style = space 9 | 10 | [*.{java,xml}] 11 | indent_size = 4 12 | trim_trailing_whitespace = true 13 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @obfischer @DirkMahler @StephanPirnbaum 2 | 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/01-template-for-feature.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature Request Template 3 | about: Request a feature for this particular subproject. 4 | title: New Feature 5 | labels: status:teamdiscussion 6 | assignees: '' 7 | 8 | --- 9 | _This hint can be removed_ 10 | **We are happy, what you are going to send us your feature request. Please try to fillout as many sections as good as you can. If you can't provide us any information for a particular section, that is not problem. It is more important to us, to know more about our users and their needs. Even if this template looks very formal, we aren't.** 11 | 12 | ### Feature Description 13 | _Remove this hint: Provide here a short description of the feature you would like to see. Try to use the form of a user story. See https://en.wikipedia.org/wiki/User_story._ 14 | 15 | I, as... 16 | would like... 17 | to that... 18 | 19 | ### Additional information on the requested Feature 20 | _Remove this hint: Feel free to let us know what ever you wan't :wink:_ 21 | 22 | ### How to Test 23 | _Remove this hint: How can we test if the feature works as you expect it to work?_ 24 | 25 | To test this feature... 26 | 27 | ### Available Test data 28 | _Remove this hint: To test new features, we need some examples or test data sets. Please let us know if you can provide them for us or there we can find them. 29 | 30 | ### Definition of Done for the Implementers 31 | _Remove this hint: these checkboxes can be checked like this: [x]_ 32 | - [ ] We got a final feedback from the reporting user (_if applicable_) 33 | - [ ] Unittests have been written (_if applicable_) 34 | - [ ] Integration tests have been written (_if applicable_) 35 | - [ ] Test coverage is the same or even better then before (_if applicable_) 36 | - [ ] Documentation has been written (_if applicable_) 37 | - [ ] Added a note on the new feature to the release notes (_if applicable_) 38 | 39 | 40 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/02-template-for-bug.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug Report Template 3 | about: Report a bug using this template. 4 | title: Bug Report 5 | labels: type:bug 6 | assignees: '' 7 | --- 8 | 9 | _Remove this hint:_ 10 | **We are happy, to know about the problems you have while using jQAssistant. Sometimes we learn 11 | more about us and our projects from the bugs you find. Please try to fillout as many sections as good as you can. 12 | If you can't provide us any information for a particular section, that is not problem. 13 | Even if this template looks very formal, we aren't.** 14 | 15 | ### Bug Description 16 | 17 | 18 | ### Expected Behaviour 19 | _Remove this hint: What did you actual expect from jQAssistant?_ 20 | 21 | ### Your Environment 22 | _Remove this hint: Some bugs are releated to the environment jQAssitant is running in. Please help us 23 | to find out, if the problem is only related to the crappy code we have written or to the environment._ 24 | 25 | - *JDK:* 26 | - *OS:* 27 | - *XYZ:* 28 | 29 | ### How can we reproduce the bug? 30 | _Remove this hint: Pick one of these options. Use the Preview feature of this editor to get a sense which option we like best_ 31 | 32 | #### Awesome :star::star::star::star::star: 33 | Provide a (link to a) minimal demo app showing the faulty behaviour. 34 | 35 | #### Sweet :star::star::star::star: 36 | Provide some concise code examples or some data you use. 37 | 38 | #### Good :star::star::star: 39 | Provide your own project and instructions how to reproduce the problem. 40 | 41 | #### Meh :star::star: 42 | Provide a code sample with a bunch of magic parameters which we need to interpolate by guessing to reconstruct the actual problem. 43 | 44 | #### Worst :poop: 45 | The source code or the data can't be disclosed and refuse to provide any of the above. Expect this issue to be closed by a bunch of angry aliens :alien::alien::alien::alien::alien: that will hunt you down and :fire: your :computer:. You've been warned. :fire_engine: 46 | 47 | ### How could we have prevented this Bug? 48 | _Remove this hint: Is there anything we could have done to prevent this problem?_ 49 | 50 | ### Definition of Done for the Implementers 51 | _Remove this hint: these checkboxes can be checked like this: [x]_ 52 | - [ ] We got a final feedback from the reporting user (_if applicable_) 53 | - [ ] Unittests have been written (_if applicable_) 54 | - [ ] Integration tests have been written (_if applicable_) 55 | - [ ] Test coverage is the same or even better then before (_if applicable_) 56 | - [ ] Documentation has been written (_if applicable_) 57 | - [ ] Added a note on the new feature to the release notes (_if applicable_) 58 | 59 | 60 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/03-template-for-task.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Task Template 3 | about: Used mainly by the team behind jQAssistant for issues which aren't a feature nor a bug, but must be done and should'nt be forgotten. 4 | title: Please fullfil this task 5 | labels: type:task 6 | assignees: '' 7 | --- 8 | 9 | ### Task Description 10 | 11 | ### Definition of Done for the Implementers 12 | _Remove this hint: these checkboxes can be checked like this: [x]_ 13 | - [ ] We got a final feedback from the reporting user (_if applicable_) 14 | - [ ] Unittests have been written (_if applicable_) 15 | - [ ] Integration tests have been written (_if applicable_) 16 | - [ ] Test coverage is the same or even better then before (_if applicable_) 17 | - [ ] Documentation has been written (_if applicable_) 18 | - [ ] Added a note on the new feature to the release notes (_if applicable_) 19 | 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | 3 | contact_links: 4 | - name: Use Stackoverflow for your question on jQAssistant 5 | url: https://stackoverflow.com/questions/tagged/jqassistant 6 | about: Please use stackoverflow for supporting issues. Using stackoverflow will help us to have all questions in a plublic space and you have the chance to get help from the whole jQAssistant community. 7 | - name: Use our Idea Hub for new Ideas and Suggestions 8 | url: https://github.com/jQAssistant/jQA-Idea-Hub 9 | about: Some features might be not releated to any particular subproject or will affect all of them. To report such issues, please use this project. 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | *.iml 3 | *.ipr 4 | *~ 5 | *.log 6 | /*.html 7 | .DS_Store 8 | pom.xml.versionsBackup 9 | .java-version 10 | *.backup 11 | 12 | # Files generated by the release tooling of jQAssistant 13 | pom.xml.updatetorelease 14 | pom.xml.updatetonextdevversion 15 | 16 | # Ignore temporary shell scripts used to script small tasks 17 | *.sh.ignore 18 | 19 | # Maven related files and directories 20 | target 21 | /.mvn 22 | -------------------------------------------------------------------------------- /readme.adoc: -------------------------------------------------------------------------------- 1 | = jQAssistant Java Plugin 2 | 3 | This is the Java Plugin of https://jqassistant.org[jQAssistant^]. 4 | It enables jQAssistant to scan and to analyze Java related 5 | artifacts like: 6 | 7 | - Manifest files 8 | - Jar archives 9 | - Java class files 10 | - Property files 11 | - Service Provider Interfaces 12 | 13 | For more information on jQAssistant see https://jqassistant.org[^]. 14 | -------------------------------------------------------------------------------- /src/it/jpms/module1/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | 4 | 5 | @project.groupId@ 6 | @project.artifactId@.it.jpms.parent 7 | @project.version@ 8 | 9 | 10 | @project.artifactId@.it.jpms.module1 11 | 12 | 13 | 14 | com.fasterxml.jackson.core 15 | jackson-core 16 | 2.16.0 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/it/jpms/module1/src/main/java/com/buschmais/jqassistant/plugin/java/it/jpms/module1/api/MyService.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.it.jpms.module1.api; 2 | 3 | public interface MyService { 4 | 5 | void run(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/it/jpms/module1/src/main/java/com/buschmais/jqassistant/plugin/java/it/jpms/module1/impl/MyServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.it.jpms.module1.impl; 2 | 3 | import com.buschmais.jqassistant.plugin.java.it.jpms.module1.api.MyService; 4 | 5 | public class MyServiceImpl implements MyService { 6 | 7 | public void run() { 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/it/jpms/module1/src/main/java/module-info.java: -------------------------------------------------------------------------------- 1 | module java.it.jpms.module1 { 2 | requires com.fasterxml.jackson.core; 3 | 4 | exports com.buschmais.jqassistant.plugin.java.it.jpms.module1.api; 5 | exports com.buschmais.jqassistant.plugin.java.it.jpms.module1.impl to java.it.jpms.module2; 6 | 7 | opens com.buschmais.jqassistant.plugin.java.it.jpms.module1.api; 8 | opens com.buschmais.jqassistant.plugin.java.it.jpms.module1.impl to java.it.jpms.module2; 9 | 10 | provides com.buschmais.jqassistant.plugin.java.it.jpms.module1.api.MyService with com.buschmais.jqassistant.plugin.java.it.jpms.module1.impl.MyServiceImpl; 11 | } 12 | -------------------------------------------------------------------------------- /src/it/jpms/module2/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | 4 | 5 | @project.groupId@ 6 | @project.artifactId@.it.jpms.parent 7 | @project.version@ 8 | 9 | 10 | @project.artifactId@.it.jpms.module2 11 | 12 | 13 | 14 | @project.groupId@ 15 | @project.artifactId@.it.jpms.module1 16 | @project.version@ 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/it/jpms/module2/src/main/java/com/buschmais/jqassistant/plugin/java/it/jpms/module2/impl/Main.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.it.jpms.module2.impl; 2 | 3 | import com.buschmais.jqassistant.plugin.java.it.jpms.module1.api.MyService; 4 | 5 | import java.util.ServiceLoader; 6 | 7 | public class Main { 8 | 9 | public static void main(String... args) { 10 | MyService myService = ServiceLoader.load(MyService.class) 11 | .findFirst() 12 | .orElseThrow(() -> new IllegalStateException("Service not found")); 13 | myService.run(); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/it/jpms/module2/src/main/java/module-info.java: -------------------------------------------------------------------------------- 1 | open module java.it.jpms.module2 { 2 | 3 | requires java.it.jpms.module1; 4 | requires static transitive java.se; 5 | 6 | uses com.buschmais.jqassistant.plugin.java.it.jpms.module1.api.MyService; 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/it/jpms/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | 4 | @project.groupId@ 5 | @project.artifactId@.it.jpms.parent 6 | @project.version@ 7 | pom 8 | 9 | 10 | 11 | 12 | 13 | org.apache.maven.plugins 14 | maven-compiler-plugin 15 | 3.11.0 16 | 17 | 11 18 | 19 | 20 | 21 | 22 | 23 | 24 | com.buschmais.jqassistant 25 | jqassistant-maven-plugin 26 | @maven.jqassistant.previous.version@ 27 | 28 | 29 | default-cli 30 | 31 | scan 32 | analyze 33 | 34 | 35 | 36 | jqassistant: 37 | default-plugins: 38 | - group-id: @project.groupId@ 39 | artifact-id: @project.artifactId@ 40 | version: @project.version@ 41 | scan: 42 | properties: 43 | maven3.dependencies.scan: true 44 | analyze: 45 | groups: 46 | - it 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | module1 57 | module2 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /src/it/settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | it-repo 6 | 7 | true 8 | 9 | 10 | 11 | local.central 12 | file://@localRepository@ 13 | 14 | true 15 | 16 | 17 | true 18 | always 19 | 20 | 21 | 22 | 23 | 24 | local.central 25 | file://@localRepository@ 26 | 27 | true 28 | 29 | 30 | true 31 | always 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/main/asciidoc/java-type-hierarchy.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | class Class 4 | class Method 5 | class Field 6 | 7 | interface Bound 8 | interface TypeVariable { 9 | name 10 | } 11 | interface GenericArrayType 12 | interface ParameterizedType 13 | interface WildcardType 14 | 15 | interface GenericDeclaration 16 | 17 | Bound <|.. Class 18 | Bound <|.. GenericArrayType 19 | Bound <|.. ParameterizedType 20 | Bound <|.. WildcardType 21 | Bound <|.. TypeVariable 22 | 23 | GenericDeclaration <|.. Class 24 | GenericDeclaration <|.. Method 25 | 26 | GenericArrayType -- Bound : componentType 27 | 28 | ParameterizedType -- "0..*" Bound : actualTypeArguments 29 | ParameterizedType -- "1" Bound : rawType 30 | ParameterizedType -- "1" Bound : ownerType 31 | 32 | WildcardType -- "0..*" Bound : upperBounds 33 | WildcardType -- "0..*" Bound : lowerBounds 34 | 35 | TypeVariable -- "0..*" Bound : upperBounds 36 | 37 | GenericDeclaration -- "0..*" TypeVariable : typeParameters 38 | 39 | Method -- "1" Bound : genericReturnType 40 | Method -- "0..*" Bound : genericParameterTypes 41 | Method -- "1" Bound : genericExceptionTypes 42 | 43 | Field -- "1" Bound : genericType 44 | 45 | @enduml 46 | 47 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/annotation/jQASuppress.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.annotation; 2 | 3 | import java.lang.annotation.Retention; 4 | 5 | import static java.lang.annotation.RetentionPolicy.CLASS; 6 | 7 | /** 8 | * Indicates that rule ids (constraints or concepts) should be suppressed for 9 | * the annotated element. 10 | */ 11 | @Retention(CLASS) 12 | public @interface jQASuppress { 13 | 14 | /** 15 | * The rule ids. 16 | * 17 | * @return The rule ids. 18 | */ 19 | String[] value(); 20 | 21 | /** 22 | * The column to be used to identify the suppressed elements 23 | * 24 | * @return The column to be used to identify the suppressed elements 25 | */ 26 | String column() default ""; 27 | 28 | /** 29 | * The human-readable reason for this suppression. 30 | */ 31 | String reason() default ""; 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/AbstractDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Property; 4 | 5 | public interface AbstractDescriptor { 6 | 7 | @Property("abstract") 8 | Boolean isAbstract(); 9 | 10 | void setAbstract(Boolean isAbstract); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/AccessModifierDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Property; 4 | 5 | /** 6 | * Interface that describes java elements with access modifiers. 7 | * 8 | * @author Herklotz 9 | */ 10 | public interface AccessModifierDescriptor { 11 | 12 | @Property("visibility") 13 | String getVisibility(); 14 | 15 | void setVisibility(String visibility); 16 | 17 | @Property("static") 18 | Boolean isStatic(); 19 | 20 | void setStatic(Boolean s); 21 | 22 | @Property("final") 23 | Boolean isFinal(); 24 | 25 | void setFinal(Boolean f); 26 | 27 | @Property("synthetic") 28 | Boolean isSynthetic(); 29 | 30 | void setSynthetic(Boolean s); 31 | 32 | Boolean isTransitive(); 33 | void setTransitive(Boolean transitive); 34 | 35 | Boolean isMandated(); 36 | void setMandated(Boolean mandated); 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/AnnotatedDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 6 | import com.buschmais.xo.neo4j.api.annotation.Relation; 7 | 8 | /** 9 | * Interface describing an {@link Descriptor} which is annotated by 10 | * {@link AnnotationValueDescriptor}s. 11 | */ 12 | public interface AnnotatedDescriptor extends Descriptor { 13 | 14 | /** 15 | * Return the annotations this descriptor is annotated by. 16 | * 17 | * @return The annotations this descriptor is annotated by. 18 | */ 19 | @Relation("ANNOTATED_BY") 20 | List getAnnotatedBy(); 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/AnnotationDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Label; 4 | 5 | @Label("Annotation") 6 | public interface AnnotationDescriptor { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/AnnotationTypeDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | /** 4 | * Denotes an annotation type. 5 | */ 6 | public interface AnnotationTypeDescriptor extends ClassFileDescriptor, AnnotationDescriptor { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/AnnotationValueDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.common.api.model.ValueDescriptor; 6 | import com.buschmais.xo.neo4j.api.annotation.Relation; 7 | 8 | /** 9 | * Represents an annotation value. 10 | */ 11 | public interface AnnotationValueDescriptor extends JavaByteCodeDescriptor, TypedDescriptor, ValueDescriptor>>, AnnotationDescriptor { 12 | 13 | @Relation("HAS") 14 | @Override 15 | List> getValue(); 16 | 17 | @Override 18 | void setValue(List> value); 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ByteCodeDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.api.annotation.Abstract; 4 | import com.buschmais.xo.neo4j.api.annotation.Label; 5 | 6 | @Label("ByteCode") 7 | @Abstract 8 | public interface ByteCodeDescriptor { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ClassDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Label; 4 | 5 | @Label("Class") 6 | public interface ClassDescriptor extends JavaByteCodeDescriptor { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ClassFileDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.common.api.model.FileDescriptor; 6 | import com.buschmais.jqassistant.plugin.common.api.model.ValidDescriptor; 7 | import com.buschmais.jqassistant.plugin.java.api.model.generics.BoundDescriptor; 8 | import com.buschmais.jqassistant.plugin.java.api.report.Java; 9 | import com.buschmais.xo.neo4j.api.annotation.Relation; 10 | 11 | @Java(Java.JavaLanguageElement.Type) 12 | public interface ClassFileDescriptor 13 | extends TypeDescriptor, FileDescriptor, AnnotatedDescriptor, AccessModifierDescriptor, AbstractDescriptor, ValidDescriptor { 14 | 15 | /** 16 | * Return the super class. 17 | * 18 | * @return The super class. 19 | */ 20 | @Relation("EXTENDS") 21 | TypeDescriptor getSuperClass(); 22 | 23 | /** 24 | * Set the super class. 25 | * 26 | * @param superClass 27 | * The super class. 28 | */ 29 | void setSuperClass(TypeDescriptor superClass); 30 | 31 | /** 32 | * Return the generic super class. 33 | * 34 | * @return The generic super class. 35 | */ 36 | @Relation("EXTENDS_GENERIC") 37 | BoundDescriptor getGenericSuperClass(); 38 | 39 | /** 40 | * Set the generic super class. 41 | * 42 | * @param genericSuperClass 43 | * The generic super class. 44 | */ 45 | void setGenericSuperClass(BoundDescriptor genericSuperClass); 46 | 47 | /** 48 | * Return the implemented interfaces. 49 | * 50 | * @return The implemented interfaces. 51 | */ 52 | @Relation("IMPLEMENTS") 53 | List getInterfaces(); 54 | 55 | /** 56 | * Return the implemented generic interfaces. 57 | * 58 | * @return The implemented generic interfaces. 59 | */ 60 | @Relation("IMPLEMENTS_GENERIC") 61 | List getGenericInterfaces(); 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ClassTypeDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | /** 4 | * Denotes a class type. 5 | */ 6 | public interface ClassTypeDescriptor extends ClassFileDescriptor, ClassDescriptor { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ClassValueDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.plugin.common.api.model.ValueDescriptor; 4 | import com.buschmais.xo.neo4j.api.annotation.Relation; 5 | 6 | /** 7 | * Represents a class value (e.g. a referenced class). 8 | */ 9 | public interface ClassValueDescriptor extends ValueDescriptor, ClassDescriptor { 10 | 11 | @Relation("IS") 12 | @Override 13 | TypeDescriptor getValue(); 14 | 15 | @Override 16 | void setValue(TypeDescriptor typeDescriptor); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ConstructorDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.report.Java; 4 | import com.buschmais.xo.neo4j.api.annotation.Label; 5 | 6 | @Java(Java.JavaLanguageElement.Constructor) 7 | @Label(value = "Constructor") 8 | public interface ConstructorDescriptor extends MethodDescriptor { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/Declares.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | import com.buschmais.xo.neo4j.api.annotation.Relation; 9 | 10 | /** 11 | * Defines the declares relation used for fields, methods and inner classes. 12 | */ 13 | @Relation("DECLARES") 14 | @Retention(RetentionPolicy.RUNTIME) 15 | @Target(ElementType.METHOD) 16 | public @interface Declares { 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/EnumDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.api.annotation.Abstract; 4 | import com.buschmais.xo.neo4j.api.annotation.Label; 5 | 6 | @Label("Enum") 7 | @Abstract 8 | public interface EnumDescriptor extends JavaByteCodeDescriptor { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/EnumTypeDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | /** 4 | * Denotes an enumeration type. 5 | */ 6 | public interface EnumTypeDescriptor extends ClassFileDescriptor, EnumDescriptor { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/EnumValueDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.plugin.common.api.model.ValueDescriptor; 4 | import com.buschmais.xo.neo4j.api.annotation.Relation; 5 | 6 | /** 7 | * Represents an enumeration value. 8 | */ 9 | public interface EnumValueDescriptor extends TypedDescriptor, ValueDescriptor, EnumDescriptor { 10 | 11 | @Relation("IS") 12 | @Override 13 | FieldDescriptor getValue(); 14 | 15 | @Override 16 | void setValue(FieldDescriptor fieldDescriptor); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ExportedPackageDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Label; 4 | 5 | @Label("ExportedPackage") 6 | public interface ExportedPackageDescriptor extends JavaDescriptor, PackageToModuleDescriptor { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/FieldDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.java.api.report.Java; 6 | import com.buschmais.xo.neo4j.api.annotation.Label; 7 | import com.buschmais.xo.neo4j.api.annotation.Property; 8 | import com.buschmais.xo.neo4j.api.annotation.Relation; 9 | 10 | /** 11 | * Describes a field (i.e. static or instance variable) of a Java class. 12 | */ 13 | @Java(Java.JavaLanguageElement.Field) 14 | @Label(value = "Field") 15 | public interface FieldDescriptor extends MemberDescriptor, TypedDescriptor, AccessModifierDescriptor { 16 | 17 | /** 18 | * @return the transientField 19 | */ 20 | @Property("transient") 21 | Boolean isTransient(); 22 | 23 | /** 24 | * @param transientField 25 | * the transientField to set 26 | */ 27 | void setTransient(Boolean transientField); 28 | 29 | /** 30 | * @return the volatileField 31 | */ 32 | @Property("volatile") 33 | Boolean isVolatile(); 34 | 35 | /** 36 | * @param volatileField 37 | * the volatileField to set 38 | */ 39 | void setVolatile(Boolean volatileField); 40 | 41 | List getWrittenBy(); 42 | 43 | List getReadBy(); 44 | 45 | @Relation("HAS") 46 | PrimitiveValueDescriptor getValue(); 47 | 48 | void setValue(PrimitiveValueDescriptor valueDescriptor); 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/IndexTemplate.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Property; 4 | 5 | public interface IndexTemplate { 6 | 7 | @Property("index") 8 | int getIndex(); 9 | 10 | void setIndex(int index); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/InterfaceTypeDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Label; 4 | 5 | /** 6 | * Denotes an interface type. 7 | */ 8 | @Label("Interface") 9 | public interface InterfaceTypeDescriptor extends ClassFileDescriptor { 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/InvokesDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.report.Java; 5 | import com.buschmais.xo.neo4j.api.annotation.Relation; 6 | 7 | import static com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 8 | import static com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; 9 | 10 | /** 11 | * Defines an INVOKES relation between two methods. 12 | */ 13 | @Relation("INVOKES") 14 | @Java(Java.JavaLanguageElement.MethodInvocation) 15 | public interface InvokesDescriptor extends Descriptor, LineNumberDescriptor { 16 | 17 | @Outgoing 18 | MethodDescriptor getInvokingMethod(); 19 | 20 | @Incoming 21 | MethodDescriptor getInvokedMethod(); 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/JarArchiveDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.plugin.common.api.model.ZipArchiveDescriptor; 4 | import com.buschmais.xo.neo4j.api.annotation.Label; 5 | 6 | @Label("Jar") 7 | public interface JarArchiveDescriptor extends JavaArtifactFileDescriptor, ZipArchiveDescriptor { 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/JavaByteCodeDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.api.annotation.Abstract; 4 | 5 | /** 6 | * Defines the combination of labels "Java" and "ByteCode". 7 | */ 8 | @Abstract 9 | public interface JavaByteCodeDescriptor extends JavaDescriptor, ByteCodeDescriptor { 10 | 11 | /** 12 | * Return the name of the source file. 13 | * 14 | * @return The name of the source file. 15 | */ 16 | String getSourceFileName(); 17 | 18 | /** 19 | * Set the name of the source file. 20 | * 21 | * @param sourceFileName 22 | * The name of the source file. 23 | */ 24 | void setSourceFileName(String sourceFileName); 25 | 26 | /** 27 | * Return the byte code version of the class file. 28 | * 29 | * @return The byte code version of the class file. 30 | */ 31 | int getByteCodeVersion(); 32 | 33 | /** 34 | * Set the byte code version of the class file. 35 | * 36 | * @param byteCodeVersion 37 | * The byte code version of the class file. 38 | */ 39 | void setByteCodeVersion(int byteCodeVersion); 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/JavaClassesDirectoryDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.plugin.common.api.model.DirectoryDescriptor; 4 | import com.buschmais.jqassistant.plugin.common.api.report.Generic; 5 | 6 | /** 7 | * Defines a directory containing java classes. 8 | */ 9 | @Generic(Generic.GenericLanguageElement.ArtifactFile) 10 | public interface JavaClassesDirectoryDescriptor extends JavaArtifactFileDescriptor, DirectoryDescriptor { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/JavaDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.api.annotation.Abstract; 4 | import com.buschmais.xo.neo4j.api.annotation.Label; 5 | 6 | /** 7 | * Defines label "Java" which is applied to all nodes generated by this plugin. 8 | */ 9 | @Abstract 10 | @Label("Java") 11 | public interface JavaDescriptor { 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/JavaSuppressDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.core.report.api.model.Suppress; 4 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 5 | 6 | public interface JavaSuppressDescriptor extends JavaDescriptor, Suppress, Descriptor { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/LambdaMethodDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Label; 4 | 5 | @Label("Lambda") 6 | public interface LambdaMethodDescriptor extends MethodDescriptor { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/LineNumberDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Property; 4 | 5 | /** 6 | * Defines a descriptor containing line number information. 7 | */ 8 | public interface LineNumberDescriptor { 9 | 10 | @Property("lineNumber") 11 | Integer getLineNumber(); 12 | 13 | void setLineNumber(Integer lineNumber); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ManifestEntryDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.plugin.common.api.model.ValueDescriptor; 4 | import com.buschmais.xo.neo4j.api.annotation.Label; 5 | import com.buschmais.xo.neo4j.api.annotation.Property; 6 | 7 | @Label("ManifestEntry") 8 | public interface ManifestEntryDescriptor extends ValueDescriptor { 9 | 10 | /** 11 | * Set the value. 12 | * 13 | * @param value 14 | * The value. 15 | */ 16 | void setValue(String value); 17 | 18 | /** 19 | * Return the value. 20 | * 21 | * @return The value. 22 | */ 23 | @Property("value") 24 | String getValue(); 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ManifestFileDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.common.api.model.FileDescriptor; 6 | import com.buschmais.xo.neo4j.api.annotation.Label; 7 | 8 | import static com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; 9 | 10 | @Label("Manifest") 11 | public interface ManifestFileDescriptor extends JavaDescriptor, FileDescriptor { 12 | 13 | @Declares 14 | @Outgoing 15 | ManifestSectionDescriptor getMainSection(); 16 | 17 | void setMainSection(ManifestSectionDescriptor mainSection); 18 | 19 | @Declares 20 | @Outgoing 21 | List getManifestSections(); 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ManifestSectionDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.common.api.model.NamedDescriptor; 6 | import com.buschmais.xo.neo4j.api.annotation.Label; 7 | import com.buschmais.xo.neo4j.api.annotation.Relation; 8 | 9 | import static com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; 10 | 11 | @Label("ManifestSection") 12 | public interface ManifestSectionDescriptor extends JavaDescriptor, NamedDescriptor { 13 | 14 | @Relation("HAS") 15 | @Outgoing 16 | List getManifestEntries(); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/MemberDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 4 | import com.buschmais.jqassistant.plugin.common.api.model.NamedDescriptor; 5 | import com.buschmais.xo.api.annotation.Abstract; 6 | import com.buschmais.xo.neo4j.api.annotation.Label; 7 | 8 | import static com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 9 | 10 | /** 11 | * Defines a member of Java type. 12 | */ 13 | @Label("Member") 14 | @Abstract 15 | public interface MemberDescriptor extends JavaByteCodeDescriptor, NamedDescriptor, SignatureDescriptor, AnnotatedDescriptor, AccessModifierDescriptor, Descriptor { 16 | 17 | /** 18 | * Return the declaring type. 19 | * 20 | * @return The declaring type. 21 | */ 22 | @Incoming 23 | @Declares 24 | TypeDescriptor getDeclaringType(); 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ModuleDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.core.store.api.model.FullQualifiedNameDescriptor; 6 | import com.buschmais.xo.neo4j.api.annotation.Label; 7 | import com.buschmais.xo.neo4j.api.annotation.Relation; 8 | import com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 9 | import com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; 10 | 11 | @Label("Module") 12 | public interface ModuleDescriptor extends JavaByteCodeDescriptor, FullQualifiedNameDescriptor, AccessModifierDescriptor { 13 | 14 | String getVersion(); 15 | 16 | void setVersion(String version); 17 | 18 | Boolean isOpen(); 19 | 20 | void setOpen(Boolean open); 21 | 22 | @Relation("DECLARES_MAIN_CLASS") 23 | TypeDescriptor getMainClass(); 24 | 25 | void setMainClass(TypeDescriptor mainClassType); 26 | 27 | @Outgoing 28 | List getRequiredModules(); 29 | 30 | @Incoming 31 | List getRequiringModules(); 32 | 33 | @Relation("EXPORTS") 34 | List getExportedPackages(); 35 | 36 | @Relation("USES") 37 | List getUsesServices(); 38 | 39 | @Relation("PROVIDES") 40 | List getProvidesServices(); 41 | 42 | @Relation("OPENS") 43 | List getOpenPackages(); 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/OpenPackageDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Label; 4 | 5 | @Label("OpenPackage") 6 | public interface OpenPackageDescriptor extends JavaDescriptor, PackageToModuleDescriptor { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/PackageDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.core.store.api.model.FullQualifiedNameDescriptor; 4 | import com.buschmais.jqassistant.plugin.common.api.model.DirectoryDescriptor; 5 | import com.buschmais.jqassistant.plugin.java.api.report.Java; 6 | import com.buschmais.xo.neo4j.api.annotation.Label; 7 | 8 | import static com.buschmais.jqassistant.plugin.java.api.report.Java.JavaLanguageElement.Package; 9 | 10 | /** 11 | * Describes a Java package. 12 | */ 13 | @Java(Package) 14 | @Label(value = "Package", usingIndexedPropertyOf = FullQualifiedNameDescriptor.class) 15 | public interface PackageDescriptor extends JavaDescriptor, PackageMemberDescriptor, DirectoryDescriptor { 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/PackageMemberDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.core.store.api.model.FullQualifiedNameDescriptor; 4 | import com.buschmais.jqassistant.plugin.common.api.model.NamedDescriptor; 5 | 6 | /** 7 | * Defines a common base descriptor for all members of {@link PackageDescriptor}s. 8 | */ 9 | public interface PackageMemberDescriptor extends FullQualifiedNameDescriptor, NamedDescriptor { 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/PackageToModuleDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 6 | import com.buschmais.xo.api.annotation.Abstract; 7 | import com.buschmais.xo.neo4j.api.annotation.Relation; 8 | 9 | @Abstract 10 | public interface PackageToModuleDescriptor extends AccessModifierDescriptor, Descriptor { 11 | 12 | @Relation("OF_PACKAGE") 13 | PackageDescriptor getPackage(); 14 | 15 | void setPackage(PackageDescriptor target); 16 | 17 | @Relation("TO_MODULE") 18 | List getToModules(); 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ParameterDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Label; 4 | 5 | /** 6 | * Describes a parameter of a method. 7 | */ 8 | @Label(value = "Parameter") 9 | public interface ParameterDescriptor extends JavaByteCodeDescriptor, TypedDescriptor, AnnotatedDescriptor, IndexTemplate { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/PrimitiveDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.api.annotation.Abstract; 4 | import com.buschmais.xo.neo4j.api.annotation.Label; 5 | 6 | /** 7 | * Represents a primitive value. 8 | */ 9 | @Label("Primitive") 10 | @Abstract 11 | public interface PrimitiveDescriptor extends JavaByteCodeDescriptor { 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/PrimitiveValueDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.plugin.common.api.model.ValueDescriptor; 4 | import com.buschmais.xo.neo4j.api.annotation.Property; 5 | 6 | /** 7 | * Represents a primitive value. 8 | */ 9 | public interface PrimitiveValueDescriptor extends PrimitiveDescriptor, TypedDescriptor, ValueDescriptor { 10 | 11 | @Property("value") 12 | @Override 13 | Object getValue(); 14 | 15 | @Override 16 | void setValue(Object value); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/PropertyFileDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.common.api.model.FileDescriptor; 6 | import com.buschmais.jqassistant.plugin.common.api.model.PropertyDescriptor; 7 | import com.buschmais.xo.neo4j.api.annotation.Label; 8 | import com.buschmais.xo.neo4j.api.annotation.Relation; 9 | 10 | /** 11 | * A descriptor representing a property file. 12 | */ 13 | @Label(value = "Properties") 14 | public interface PropertyFileDescriptor extends JavaDescriptor, FileDescriptor { 15 | 16 | @Relation("HAS") 17 | List getProperties(); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ProvidedServiceDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 6 | import com.buschmais.xo.neo4j.api.annotation.Label; 7 | import com.buschmais.xo.neo4j.api.annotation.Relation; 8 | 9 | @Label("ProvidedService") 10 | public interface ProvidedServiceDescriptor extends JavaDescriptor, Descriptor { 11 | 12 | @Relation("OF_TYPE") 13 | TypeDescriptor getService(); 14 | 15 | void setService(TypeDescriptor service); 16 | 17 | @Relation("WITH_PROVIDER") 18 | List getProviders(); 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ReadsDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.report.Java; 5 | import com.buschmais.xo.neo4j.api.annotation.Relation; 6 | 7 | import static com.buschmais.jqassistant.plugin.java.api.report.Java.JavaLanguageElement.ReadField; 8 | import static com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 9 | import static com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; 10 | 11 | /** 12 | * Defines a READs relation between a method and a field. 13 | */ 14 | @Relation("READS") 15 | @Java(ReadField) 16 | public interface ReadsDescriptor extends Descriptor, LineNumberDescriptor { 17 | 18 | @Outgoing 19 | MethodDescriptor getMethod(); 20 | 21 | @Incoming 22 | FieldDescriptor getField(); 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/RecordTypeDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Label; 4 | 5 | /** 6 | * Denotes a record type. 7 | */ 8 | @Label("Record") 9 | public interface RecordTypeDescriptor extends ClassFileDescriptor { 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/RequiresDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 4 | import com.buschmais.xo.neo4j.api.annotation.Relation; 5 | import com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 6 | import com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; 7 | 8 | @Relation("REQUIRES") 9 | public interface RequiresDescriptor extends AccessModifierDescriptor, Descriptor { 10 | 11 | @Outgoing 12 | ModuleDescriptor getRequiringModule(); 13 | 14 | @Incoming 15 | ModuleDescriptor getRequiredModule(); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/ServiceLoaderDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.common.api.model.FileDescriptor; 6 | import com.buschmais.xo.neo4j.api.annotation.Label; 7 | import com.buschmais.xo.neo4j.api.annotation.Relation; 8 | 9 | /** 10 | * 11 | */ 12 | @Label("ServiceLoader") 13 | public interface ServiceLoaderDescriptor extends JavaDescriptor, FileDescriptor, TypedDescriptor { 14 | 15 | @Relation("CONTAINS") 16 | List getContains(); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/SignatureDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | public interface SignatureDescriptor { 4 | 5 | /** 6 | * Return the signature. 7 | * 8 | * @return The signature. 9 | */ 10 | String getSignature(); 11 | 12 | void setSignature(String signature); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/TypeDependsOnDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.report.Java; 5 | import com.buschmais.xo.neo4j.api.annotation.Relation; 6 | import com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 7 | import com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; 8 | 9 | import static com.buschmais.jqassistant.plugin.java.api.report.Java.JavaLanguageElement.TypeDepdendency; 10 | 11 | @Java(TypeDepdendency) 12 | @Relation("DEPENDS_ON") 13 | public interface TypeDependsOnDescriptor extends Descriptor { 14 | 15 | @Incoming 16 | TypeDescriptor getDependency(); 17 | 18 | @Outgoing 19 | TypeDescriptor getDependent(); 20 | 21 | Integer getWeight(); 22 | 23 | void setWeight(Integer weight); 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/TypeDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import java.util.List; 4 | import java.util.Set; 5 | 6 | import com.buschmais.jqassistant.core.store.api.model.FullQualifiedNameDescriptor; 7 | import com.buschmais.jqassistant.plugin.java.api.model.generics.TypeVariableDescriptor; 8 | import com.buschmais.xo.api.annotation.ResultOf; 9 | import com.buschmais.xo.api.annotation.ResultOf.Parameter; 10 | import com.buschmais.xo.neo4j.api.annotation.Cypher; 11 | import com.buschmais.xo.neo4j.api.annotation.Label; 12 | import com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 13 | 14 | import static com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; 15 | 16 | /** 17 | * Describes a Java type. 18 | */ 19 | @Label(value = "Type", usingIndexedPropertyOf = FullQualifiedNameDescriptor.class) 20 | public interface TypeDescriptor extends JavaByteCodeDescriptor, PackageMemberDescriptor { 21 | 22 | /** 23 | * Resolve a required {@link TypeVariableDescriptor} by name. 24 | * 25 | * @param name 26 | * The name. 27 | * @return The resolved {@link TypeVariableDescriptor}. 28 | */ 29 | @ResultOf 30 | @Cypher("MATCH (type:Type) WHERE id(type)=$this MERGE (type)-[:REQUIRES_TYPE_PARAMETER]->(variable:Java:ByteCode:Bound:TypeVariable{name:$name}) RETURN variable") 31 | TypeVariableDescriptor requireTypeParameter(@Parameter("name") String name); 32 | 33 | /** 34 | * Return the declared methods. 35 | * 36 | * @return The declared methods. 37 | */ 38 | @Outgoing 39 | @Declares 40 | List getDeclaredMethods(); 41 | 42 | /** 43 | * Return the declared fields. 44 | * 45 | * @return The declared fields. 46 | */ 47 | @Outgoing 48 | @Declares 49 | List getDeclaredFields(); 50 | 51 | /** 52 | * Return the declared members, i.e. fields and methods. 53 | * 54 | * @return The declared members. 55 | */ 56 | @Outgoing 57 | @Declares 58 | List getDeclaredMembers(); 59 | 60 | /** 61 | * Return the declared inner classes. 62 | * 63 | * @return The declared inner classes. 64 | */ 65 | @Outgoing 66 | @Declares 67 | Set getDeclaredInnerClasses(); 68 | 69 | @Outgoing 70 | List getDependencies(); 71 | 72 | @Incoming 73 | List getDependents(); 74 | 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/TypedDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.model.generics.BoundDescriptor; 4 | import com.buschmais.xo.neo4j.api.annotation.Relation; 5 | 6 | /** 7 | * Interface for value descriptors which provide a type information. 8 | */ 9 | public interface TypedDescriptor { 10 | 11 | @Relation("OF_TYPE") 12 | TypeDescriptor getType(); 13 | 14 | void setType(TypeDescriptor type); 15 | 16 | @Relation("OF_GENERIC_TYPE") 17 | BoundDescriptor getGenericType(); 18 | 19 | void setGenericType(BoundDescriptor genericType); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/VariableDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.plugin.common.api.model.NamedDescriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.report.Java; 5 | import com.buschmais.xo.neo4j.api.annotation.Label; 6 | import com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 7 | 8 | /** 9 | * Describes a field (i.e. static or instance variable) of a Java class. 10 | */ 11 | @Java(Java.JavaLanguageElement.Field) 12 | @Label(value = "Variable") 13 | public interface VariableDescriptor extends JavaByteCodeDescriptor, SignatureDescriptor, NamedDescriptor, TypedDescriptor { 14 | 15 | @Declares 16 | @Incoming 17 | MethodDescriptor getMethod(); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/VisibilityModifier.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.buschmais.jqassistant.plugin.java.api.model; 5 | 6 | /** 7 | * Enum of all access modifiers. 8 | * 9 | * @author Herklotz 10 | */ 11 | public enum VisibilityModifier { 12 | 13 | /** 14 | * Modifier: private. 15 | */ 16 | PRIVATE, 17 | /** 18 | * Modifier: default. 19 | */ 20 | DEFAULT, 21 | /** 22 | * Modifier: protected. 23 | */ 24 | PROTECTED, 25 | /** 26 | * Modifier: public. 27 | */ 28 | PUBLIC; 29 | 30 | /** 31 | * Return the value to be stored. 32 | * 33 | * @return The value. 34 | */ 35 | public String getValue() { 36 | return name().toLowerCase(); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/WritesDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.report.Java; 5 | import com.buschmais.xo.neo4j.api.annotation.Relation; 6 | 7 | import static com.buschmais.jqassistant.plugin.java.api.report.Java.JavaLanguageElement.WriteField; 8 | import static com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 9 | import static com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; 10 | 11 | /** 12 | * Defines a WRITES relation between a method and a field. 13 | */ 14 | @Relation("WRITES") 15 | @Java(WriteField) 16 | public interface WritesDescriptor extends Descriptor, LineNumberDescriptor { 17 | 18 | @Outgoing 19 | MethodDescriptor getMethod(); 20 | 21 | @Incoming 22 | FieldDescriptor getField(); 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/XmlPropertyFileDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model; 2 | 3 | import com.buschmais.jqassistant.plugin.xml.api.model.XmlDocumentDescriptor; 4 | 5 | /** 6 | * A descriptor representing a XML based property file. 7 | */ 8 | public interface XmlPropertyFileDescriptor 9 | extends PropertyFileDescriptor, XmlDocumentDescriptor { 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/generics/BoundDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model.generics; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 6 | import com.buschmais.jqassistant.plugin.java.api.model.JavaByteCodeDescriptor; 7 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 8 | import com.buschmais.xo.neo4j.api.annotation.Label; 9 | import com.buschmais.xo.neo4j.api.annotation.Relation; 10 | import com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 11 | 12 | @Label("Bound") 13 | public interface BoundDescriptor extends JavaByteCodeDescriptor, Descriptor { 14 | 15 | @Relation("OF_RAW_TYPE") 16 | TypeDescriptor getRawType(); 17 | 18 | void setRawType(TypeDescriptor rawType); 19 | 20 | @Incoming 21 | List getParameterizedType(); 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/generics/GenericArrayTypeDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model.generics; 2 | 3 | import com.buschmais.xo.neo4j.api.annotation.Label; 4 | import com.buschmais.xo.neo4j.api.annotation.Relation; 5 | 6 | @Label("GenericArrayType") 7 | public interface GenericArrayTypeDescriptor extends BoundDescriptor { 8 | 9 | @Relation("HAS_COMPONENT_TYPE") 10 | BoundDescriptor getComponentType(); 11 | 12 | void setComponentType(BoundDescriptor componentType); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/generics/GenericDeclarationDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model.generics; 2 | 3 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.model.JavaByteCodeDescriptor; 5 | import com.buschmais.xo.api.annotation.Abstract; 6 | import com.buschmais.xo.api.annotation.ResultOf; 7 | import com.buschmais.xo.api.annotation.ResultOf.Parameter; 8 | import com.buschmais.xo.neo4j.api.annotation.Cypher; 9 | import com.buschmais.xo.neo4j.api.annotation.Label; 10 | 11 | @Abstract 12 | @Label("GenericDeclaration") 13 | public interface GenericDeclarationDescriptor extends JavaByteCodeDescriptor, Descriptor { 14 | 15 | @ResultOf 16 | @Cypher("MATCH (declaration:GenericDeclaration) WHERE id(declaration)=$this " + // 17 | "MERGE (declaration)-[:DECLARES_TYPE_PARAMETER{index:$index}]->(typeParameter:Java:ByteCode:Bound:TypeVariable) " + // 18 | "RETURN typeParameter") 19 | TypeVariableDescriptor resolveTypeParameter(@Parameter("index") int index); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/generics/HasActualTypeArgumentDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model.generics; 2 | 3 | import com.buschmais.jqassistant.core.store.api.model.Descriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.model.IndexTemplate; 5 | import com.buschmais.xo.neo4j.api.annotation.Relation; 6 | import com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 7 | import com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; 8 | 9 | @Relation("HAS_ACTUAL_TYPE_ARGUMENT") 10 | public interface HasActualTypeArgumentDescriptor extends IndexTemplate, Descriptor { 11 | 12 | @Outgoing 13 | ParameterizedTypeDescriptor getParameterizedType(); 14 | 15 | @Incoming 16 | BoundDescriptor getTypeArgument(); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/generics/ParameterizedTypeDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model.generics; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.xo.neo4j.api.annotation.Label; 6 | import com.buschmais.xo.neo4j.api.annotation.Relation; 7 | import com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; 8 | 9 | @Label("ParameterizedType") 10 | public interface ParameterizedTypeDescriptor extends BoundDescriptor { 11 | 12 | @Outgoing 13 | @Relation 14 | List getActualTypeArguments(); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/generics/TypeVariableDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model.generics; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.common.api.model.NamedDescriptor; 6 | import com.buschmais.xo.neo4j.api.annotation.Label; 7 | import com.buschmais.xo.neo4j.api.annotation.Relation; 8 | import com.buschmais.xo.neo4j.api.annotation.Relation.Incoming; 9 | 10 | @Label("TypeVariable") 11 | public interface TypeVariableDescriptor extends BoundDescriptor, NamedDescriptor { 12 | 13 | @Incoming 14 | @Relation("DECLARES_TYPE_PARAMETER") 15 | GenericDeclarationDescriptor getDeclaredBy(); 16 | 17 | @Relation("HAS_UPPER_BOUND") 18 | List getUpperBounds(); 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/model/generics/WildcardTypeDescriptor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.model.generics; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.xo.neo4j.api.annotation.Label; 6 | import com.buschmais.xo.neo4j.api.annotation.Relation; 7 | 8 | @Label("WildcardType") 9 | public interface WildcardTypeDescriptor extends BoundDescriptor { 10 | 11 | @Relation("HAS_UPPER_BOUND") 12 | List getUpperBounds(); 13 | 14 | @Relation("HAS_LOWER_BOUND") 15 | List getLowerBounds(); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/api/scanner/JavaScope.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.api.scanner; 2 | 3 | import com.buschmais.jqassistant.core.scanner.api.Scope; 4 | 5 | /** 6 | * Defines the scopes for java. 7 | */ 8 | public enum JavaScope implements Scope { 9 | 10 | CLASSPATH; 11 | 12 | @Override 13 | public String getPrefix() { 14 | return "java"; 15 | } 16 | 17 | @Override 18 | public String getName() { 19 | return name(); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/ClassFileScannerConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | import lombok.ToString; 6 | 7 | @Builder 8 | @Getter 9 | @ToString 10 | public class ClassFileScannerConfiguration { 11 | 12 | private boolean includeLocalVariables; 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/ClassTypeScannerPlugin.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | 6 | import com.buschmais.jqassistant.core.scanner.api.Scanner; 7 | import com.buschmais.jqassistant.core.scanner.api.Scope; 8 | import com.buschmais.jqassistant.plugin.common.api.scanner.AbstractScannerPlugin; 9 | import com.buschmais.jqassistant.plugin.common.api.scanner.filesystem.AbstractVirtualFileResource; 10 | import com.buschmais.jqassistant.plugin.common.api.scanner.filesystem.FileResource; 11 | import com.buschmais.jqassistant.plugin.java.api.model.ClassFileDescriptor; 12 | 13 | import static com.buschmais.jqassistant.plugin.java.api.scanner.JavaScope.CLASSPATH; 14 | 15 | public class ClassTypeScannerPlugin extends AbstractScannerPlugin, ClassFileDescriptor> { 16 | 17 | @Override 18 | public boolean accepts(Class item, String path, Scope scope) throws IOException { 19 | return CLASSPATH.equals(scope); 20 | } 21 | 22 | @Override 23 | public ClassFileDescriptor scan(final Class item, String path, Scope scope, Scanner scanner) throws IOException { 24 | final String fileName = "/" + item.getName() 25 | .replace('.', '/') + ".class"; 26 | FileResource fileResource = new AbstractVirtualFileResource() { 27 | @Override 28 | public InputStream createStream() { 29 | return item.getResourceAsStream(fileName); 30 | } 31 | 32 | @Override 33 | protected String getRelativePath() { 34 | return path; 35 | } 36 | }; 37 | return scanner.scan(fileResource, fileName, scope); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/JarScannerPlugin.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner; 2 | 3 | import com.buschmais.jqassistant.core.scanner.api.ScannerContext; 4 | import com.buschmais.jqassistant.core.scanner.api.Scope; 5 | import com.buschmais.jqassistant.plugin.common.api.scanner.AbstractZipArchiveScannerPlugin; 6 | import com.buschmais.jqassistant.plugin.java.api.model.JarArchiveDescriptor; 7 | import com.buschmais.jqassistant.plugin.java.api.scanner.ArtifactScopedTypeResolver; 8 | import com.buschmais.jqassistant.plugin.java.api.scanner.JavaScope; 9 | import com.buschmais.jqassistant.plugin.java.api.scanner.TypeResolver; 10 | 11 | public class JarScannerPlugin extends AbstractZipArchiveScannerPlugin { 12 | 13 | @Override 14 | protected String getExtension() { 15 | return ".jar"; 16 | } 17 | 18 | @Override 19 | protected Scope createScope(Scope currentScope, JarArchiveDescriptor archiveDescriptor, ScannerContext scannerContext) { 20 | scannerContext.push(TypeResolver.class, new ArtifactScopedTypeResolver(archiveDescriptor)); 21 | return JavaScope.CLASSPATH; 22 | } 23 | 24 | @Override 25 | protected void destroyScope(ScannerContext scannerContext) { 26 | scannerContext.pop(TypeResolver.class); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/JavaClassesDirectoryScannerPlugin.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner; 2 | 3 | import java.io.File; 4 | import java.util.Arrays; 5 | 6 | import com.buschmais.jqassistant.core.scanner.api.ScannerContext; 7 | import com.buschmais.jqassistant.core.scanner.api.Scope; 8 | import com.buschmais.jqassistant.core.store.api.Store; 9 | import com.buschmais.jqassistant.plugin.common.api.scanner.AbstractDirectoryScannerPlugin; 10 | import com.buschmais.jqassistant.plugin.java.api.model.JavaArtifactFileDescriptor; 11 | import com.buschmais.jqassistant.plugin.java.api.model.JavaClassesDirectoryDescriptor; 12 | import com.buschmais.jqassistant.plugin.java.api.scanner.ArtifactScopedTypeResolver; 13 | import com.buschmais.jqassistant.plugin.java.api.scanner.JavaScope; 14 | import com.buschmais.jqassistant.plugin.java.api.scanner.TypeResolver; 15 | 16 | /** 17 | * A scanner plugin for directories containing java classes. 18 | */ 19 | public class JavaClassesDirectoryScannerPlugin 20 | extends AbstractDirectoryScannerPlugin { 21 | 22 | @Override 23 | protected Scope getRequiredScope() { 24 | return JavaScope.CLASSPATH; 25 | } 26 | 27 | @Override 28 | protected void enterContainer(File directory, JavaClassesDirectoryDescriptor javaClassesDirectoryDescriptor, ScannerContext context) { 29 | context.push(TypeResolver.class, new ArtifactScopedTypeResolver(javaClassesDirectoryDescriptor)); 30 | } 31 | 32 | @Override 33 | protected void leaveContainer(File directory, JavaClassesDirectoryDescriptor javaClassesDirectoryDescriptor, ScannerContext context) { 34 | context.pop(TypeResolver.class); 35 | } 36 | 37 | @Override 38 | protected JavaClassesDirectoryDescriptor getContainerDescriptor(File classPathDirectory, ScannerContext scannerContext) { 39 | JavaArtifactFileDescriptor javaArtifactDescriptor = scannerContext.peekOrDefault(JavaArtifactFileDescriptor.class, null); 40 | Store store = scannerContext.getStore(); 41 | if (javaArtifactDescriptor == null) { 42 | return store.create(JavaClassesDirectoryDescriptor.class); 43 | } 44 | if (JavaClassesDirectoryDescriptor.class.isAssignableFrom(javaArtifactDescriptor.getClass())) { 45 | return JavaClassesDirectoryDescriptor.class.cast(javaArtifactDescriptor); 46 | } 47 | throw new IllegalStateException("Expected an instance of " + JavaClassesDirectoryDescriptor.class.getName() + " but got " 48 | + Arrays.asList(javaArtifactDescriptor.getClass().getInterfaces())); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/PackageDirectoryScannerPlugin.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner; 2 | 3 | import java.io.IOException; 4 | 5 | import com.buschmais.jqassistant.core.scanner.api.Scanner; 6 | import com.buschmais.jqassistant.core.scanner.api.ScannerContext; 7 | import com.buschmais.jqassistant.core.scanner.api.ScannerPlugin.Requires; 8 | import com.buschmais.jqassistant.core.scanner.api.Scope; 9 | import com.buschmais.jqassistant.plugin.common.api.model.DirectoryDescriptor; 10 | import com.buschmais.jqassistant.plugin.common.api.scanner.AbstractScannerPlugin; 11 | import com.buschmais.jqassistant.plugin.common.api.scanner.filesystem.DirectoryResource; 12 | import com.buschmais.jqassistant.plugin.java.api.model.PackageDescriptor; 13 | 14 | import static com.buschmais.jqassistant.plugin.java.api.scanner.JavaScope.CLASSPATH; 15 | 16 | /** 17 | * Implementation of the {@link AbstractScannerPlugin} for Java packages. 18 | */ 19 | @Requires(DirectoryDescriptor.class) 20 | public class PackageDirectoryScannerPlugin extends AbstractScannerPlugin { 21 | 22 | @Override 23 | public boolean accepts(DirectoryResource item, String path, Scope scope) throws IOException { 24 | return (CLASSPATH.equals(scope) && path != null && !path.startsWith("/META-INF")); 25 | } 26 | 27 | @Override 28 | public PackageDescriptor scan(DirectoryResource item, String path, Scope scope, Scanner scanner) throws IOException { 29 | ScannerContext context = scanner.getContext(); 30 | DirectoryDescriptor directoryDescriptor = context.getCurrentDescriptor(); 31 | PackageDescriptor descriptor = context.getStore().addDescriptorType(directoryDescriptor, PackageDescriptor.class); 32 | String packageName = path.substring(1).replaceAll("/", "."); 33 | String name; 34 | int separatorIndex = packageName.lastIndexOf('.'); 35 | if (separatorIndex != -1) { 36 | name = packageName.substring(separatorIndex + 1); 37 | } else { 38 | name = packageName; 39 | } 40 | descriptor.setName(name); 41 | descriptor.setFullQualifiedName(packageName); 42 | return descriptor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/AnnotationDefaultVisitor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner.visitor; 2 | 3 | import com.buschmais.jqassistant.plugin.common.api.model.ValueDescriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.model.MethodDescriptor; 5 | import com.buschmais.jqassistant.plugin.java.api.scanner.TypeCache; 6 | 7 | /** 8 | * Visitor for default values of annotation methods. 9 | * 10 | * Creates dependencies of the method to the type of the default value. 11 | */ 12 | public class AnnotationDefaultVisitor extends AbstractAnnotationVisitor { 13 | 14 | /** 15 | * Constructor. 16 | * 17 | * @param visitorHelper 18 | * The 19 | * {@link com.buschmais.jqassistant.plugin.java.impl.scanner.visitor.VisitorHelper} 20 | * . 21 | */ 22 | protected AnnotationDefaultVisitor(TypeCache.CachedType containingType, MethodDescriptor descriptor, VisitorHelper visitorHelper) { 23 | super(containingType, descriptor, visitorHelper); 24 | } 25 | 26 | @Override 27 | protected void setValue(MethodDescriptor descriptor, ValueDescriptor value) { 28 | descriptor.setHasDefault(value); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/AnnotationValueVisitor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner.visitor; 2 | 3 | import com.buschmais.jqassistant.plugin.common.api.model.ValueDescriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.model.AnnotationValueDescriptor; 5 | import com.buschmais.jqassistant.plugin.java.api.scanner.TypeCache; 6 | 7 | /** 8 | * An annotation visitor that adds a {@link ValueDescriptor} to the current 9 | * {@link AnnotationValueDescriptor}. 10 | */ 11 | public class AnnotationValueVisitor extends AbstractAnnotationVisitor { 12 | 13 | /** 14 | * Constructor. 15 | * 16 | * @param visitorHelper 17 | * The 18 | * {@link com.buschmais.jqassistant.plugin.java.impl.scanner.visitor.VisitorHelper} 19 | * . 20 | */ 21 | protected AnnotationValueVisitor(TypeCache.CachedType containingType, AnnotationValueDescriptor descriptor, VisitorHelper visitorHelper) { 22 | super(containingType, descriptor, visitorHelper); 23 | } 24 | 25 | @Override 26 | protected void setValue(AnnotationValueDescriptor descriptor, ValueDescriptor value) { 27 | descriptor.getValue().add(value); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/FieldVisitor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner.visitor; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.model.FieldDescriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.scanner.SignatureHelper; 5 | import com.buschmais.jqassistant.plugin.java.api.scanner.TypeCache; 6 | 7 | import org.objectweb.asm.AnnotationVisitor; 8 | 9 | public class FieldVisitor extends org.objectweb.asm.FieldVisitor { 10 | 11 | private final TypeCache.CachedType containingType; 12 | private final FieldDescriptor fieldDescriptor; 13 | private final VisitorHelper visitorHelper; 14 | 15 | protected FieldVisitor(TypeCache.CachedType containingType, FieldDescriptor fieldDescriptor, VisitorHelper visitorHelper) { 16 | super(VisitorHelper.ASM_OPCODES); 17 | this.containingType = containingType; 18 | this.fieldDescriptor = fieldDescriptor; 19 | this.visitorHelper = visitorHelper; 20 | } 21 | 22 | @Override 23 | public AnnotationVisitor visitAnnotation(String arg0, boolean arg1) { 24 | return visitorHelper.addAnnotation(containingType, fieldDescriptor, SignatureHelper.getType(arg0)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/MethodLoCVisitor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner.visitor; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | import com.buschmais.jqassistant.plugin.java.api.model.MethodDescriptor; 7 | 8 | import org.objectweb.asm.Label; 9 | import org.objectweb.asm.MethodVisitor; 10 | 11 | /** 12 | * Visitor for calculating the LoC statistics of a method. 13 | */ 14 | class MethodLoCVisitor extends MethodVisitor { 15 | 16 | private final MethodDescriptor methodDescriptor; 17 | 18 | private Integer lineNumber = null; 19 | private Integer firstLineNumber = null; 20 | private Integer lastLineNumber = null; 21 | private Set effectiveLines = new HashSet<>(); 22 | 23 | public MethodLoCVisitor(MethodDescriptor methodDescriptor) { 24 | super(VisitorHelper.ASM_OPCODES); 25 | this.methodDescriptor = methodDescriptor; 26 | } 27 | 28 | @Override 29 | public void visitLineNumber(int line, Label start) { 30 | if (this.lineNumber == null) { 31 | this.firstLineNumber = line; 32 | this.lastLineNumber = line; 33 | } else { 34 | this.firstLineNumber = Math.min(line, this.firstLineNumber); 35 | this.lastLineNumber = Math.max(line, this.lastLineNumber); 36 | } 37 | this.lineNumber = line; 38 | this.effectiveLines.add(line); 39 | } 40 | 41 | @Override 42 | public void visitEnd() { 43 | methodDescriptor.setFirstLineNumber(firstLineNumber); 44 | methodDescriptor.setLastLineNumber(lastLineNumber); 45 | if (!effectiveLines.isEmpty()) { 46 | methodDescriptor.setEffectiveLineCount(effectiveLines.size()); 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/SuppressAnnotationVisitor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner.visitor; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.buschmais.jqassistant.plugin.java.api.annotation.jQASuppress; 7 | import com.buschmais.jqassistant.plugin.java.api.model.JavaSuppressDescriptor; 8 | 9 | import org.objectweb.asm.AnnotationVisitor; 10 | 11 | /** 12 | * {@link AnnotationVisitor} for processing jQASuppress annotations. 13 | */ 14 | class SuppressAnnotationVisitor extends AnnotationVisitor { 15 | 16 | private final JavaSuppressDescriptor suppressDescriptor; 17 | private String currentAttribute; 18 | 19 | private List suppressIds = new ArrayList<>(); 20 | 21 | private String suppressColumn; 22 | 23 | public SuppressAnnotationVisitor(JavaSuppressDescriptor suppressDescriptor) { 24 | super(VisitorHelper.ASM_OPCODES); 25 | this.suppressDescriptor = suppressDescriptor; 26 | } 27 | 28 | @Override 29 | public void visit(String name, Object value) { 30 | if (name != null) { 31 | switch (name) { 32 | case "column": 33 | this.suppressColumn = value.toString(); 34 | break; 35 | case "reason": 36 | break; 37 | default: 38 | throw new IllegalArgumentException("Unknown attribute '" + name + "' for " + jQASuppress.class.getName()); 39 | } 40 | } else { 41 | switch (currentAttribute) { 42 | case "value": 43 | suppressIds.add(value.toString()); 44 | break; 45 | default: 46 | throw new IllegalArgumentException("Unknown attribute '" + currentAttribute + "' for " + jQASuppress.class.getName()); 47 | } 48 | } 49 | } 50 | 51 | @Override 52 | public AnnotationVisitor visitArray(String name) { 53 | this.currentAttribute = name; 54 | return this; 55 | } 56 | 57 | @Override 58 | public void visitEnd() { 59 | suppressDescriptor.setSuppressIds(suppressIds.toArray(new String[suppressIds.size()])); 60 | suppressDescriptor.setSuppressColumn(suppressColumn); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/delegate/DelegatingAnnotationVisitor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner.visitor.delegate; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.java.impl.scanner.visitor.VisitorHelper; 6 | 7 | import org.objectweb.asm.AnnotationVisitor; 8 | 9 | public class DelegatingAnnotationVisitor extends AnnotationVisitor { 10 | 11 | private Delegator delegator; 12 | 13 | public DelegatingAnnotationVisitor(List visitors) { 14 | super(VisitorHelper.ASM_OPCODES); 15 | this.delegator = new Delegator<>(visitors); 16 | } 17 | 18 | @Override 19 | public void visit(String name, Object value) { 20 | delegator.accept(visitor -> visitor.visit(name, value)); 21 | } 22 | 23 | @Override 24 | public void visitEnum(String name, String descriptor, String value) { 25 | delegator.accept(visitor -> visitor.visitEnum(name, descriptor, value)); 26 | } 27 | 28 | @Override 29 | public AnnotationVisitor visitAnnotation(String name, String descriptor) { 30 | return new DelegatingAnnotationVisitor(delegator.apply(visitor -> visitor.visitAnnotation(name, descriptor))); 31 | } 32 | 33 | @Override 34 | public AnnotationVisitor visitArray(String name) { 35 | return new DelegatingAnnotationVisitor(delegator.apply(visitor -> visitor.visitArray(name))); 36 | } 37 | 38 | @Override 39 | public void visitEnd() { 40 | delegator.accept(visitor -> visitor.visitEnd()); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/delegate/Delegator.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner.visitor.delegate; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import java.util.function.Consumer; 6 | import java.util.function.Function; 7 | 8 | import lombok.RequiredArgsConstructor; 9 | 10 | /** 11 | * Provides methods for delegating method invocations to delegates. 12 | * 13 | * @param 14 | * The delegate type. 15 | */ 16 | @RequiredArgsConstructor 17 | class Delegator { 18 | 19 | private final List delegates; 20 | 21 | /** 22 | * Delegate to a method without return value. 23 | * 24 | * @param consumer 25 | * The Consumer. 26 | */ 27 | void accept(Consumer consumer) { 28 | for (D delegate : delegates) { 29 | if (delegate != null) { 30 | consumer.accept(delegate); 31 | } 32 | } 33 | } 34 | 35 | /** 36 | * Delegate to a {@link Function}. 37 | * 38 | * @param function 39 | * The {@link Function}. 40 | * @param 41 | * The expected return type. 42 | * @return A {@link List} of returned values, may include null values. 43 | */ 44 | List apply(Function function) { 45 | List list = new ArrayList<>(delegates.size()); 46 | for (D delegate : delegates) { 47 | if (delegate != null) { 48 | T value = function.apply(delegate); 49 | list.add(value); 50 | } else { 51 | list.add(null); 52 | } 53 | } 54 | return list; 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/generics/ClassSignatureVisitor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner.visitor.generics; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.model.ClassFileDescriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 5 | import com.buschmais.jqassistant.plugin.java.api.model.generics.BoundDescriptor; 6 | import com.buschmais.jqassistant.plugin.java.api.scanner.TypeCache; 7 | import com.buschmais.jqassistant.plugin.java.impl.scanner.visitor.VisitorHelper; 8 | 9 | import org.objectweb.asm.signature.SignatureVisitor; 10 | 11 | public class ClassSignatureVisitor extends AbstractGenericDeclarationVisitor { 12 | 13 | public ClassSignatureVisitor(TypeCache.CachedType cachedType, VisitorHelper visitorHelper) { 14 | super(visitorHelper, cachedType.getTypeDescriptor(), cachedType); 15 | } 16 | 17 | @Override 18 | public SignatureVisitor visitSuperclass() { 19 | return new AbstractBoundVisitor(visitorHelper, containingType) { 20 | @Override 21 | protected void apply(TypeDescriptor rawTypeBound, BoundDescriptor bound) { 22 | descriptor.setSuperClass(rawTypeBound); 23 | descriptor.setGenericSuperClass(bound); 24 | } 25 | }; 26 | } 27 | 28 | @Override 29 | public SignatureVisitor visitInterface() { 30 | return new AbstractBoundVisitor(visitorHelper, containingType) { 31 | @Override 32 | protected void apply(TypeDescriptor rawTypeBound, BoundDescriptor bound) { 33 | descriptor.getInterfaces().add(rawTypeBound); 34 | descriptor.getGenericInterfaces().add(bound); 35 | } 36 | }; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/generics/MethodSignatureVisitor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner.visitor.generics; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.model.MethodDescriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.model.ParameterDescriptor; 5 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 6 | import com.buschmais.jqassistant.plugin.java.api.model.generics.BoundDescriptor; 7 | import com.buschmais.jqassistant.plugin.java.api.scanner.TypeCache; 8 | import com.buschmais.jqassistant.plugin.java.impl.scanner.visitor.VisitorHelper; 9 | 10 | import org.objectweb.asm.signature.SignatureVisitor; 11 | 12 | /** 13 | * Visitor for method signatures. 14 | */ 15 | public class MethodSignatureVisitor extends AbstractGenericDeclarationVisitor { 16 | 17 | private int parameterIndex = 0; 18 | 19 | public MethodSignatureVisitor(TypeCache.CachedType containingType, MethodDescriptor methodDescriptor, VisitorHelper visitorHelper) { 20 | super(visitorHelper, methodDescriptor, containingType); 21 | } 22 | 23 | @Override 24 | public SignatureVisitor visitParameterType() { 25 | final ParameterDescriptor parameterDescriptor = visitorHelper.addParameterDescriptor(descriptor, parameterIndex); 26 | parameterIndex++; 27 | return new AbstractBoundVisitor(visitorHelper, containingType) { 28 | @Override 29 | protected void apply(TypeDescriptor rawTypeBound, BoundDescriptor bound) { 30 | parameterDescriptor.setType(rawTypeBound); 31 | parameterDescriptor.setGenericType(bound); 32 | } 33 | }; 34 | } 35 | 36 | @Override 37 | public SignatureVisitor visitReturnType() { 38 | return new AbstractBoundVisitor(visitorHelper, containingType) { 39 | @Override 40 | protected void apply(TypeDescriptor rawTypeBound, BoundDescriptor bound) { 41 | descriptor.setReturns(rawTypeBound); 42 | descriptor.setReturnsGeneric(bound); 43 | } 44 | }; 45 | } 46 | 47 | @Override 48 | public SignatureVisitor visitExceptionType() { 49 | return new AbstractBoundVisitor(visitorHelper, containingType) { 50 | @Override 51 | protected void apply(TypeDescriptor rawTypeBound, BoundDescriptor bound) { 52 | // raw type not added here, already done by class visitor 53 | descriptor.getThrowsGeneric().add(bound); 54 | } 55 | }; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/generics/TypeVariableResolver.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.impl.scanner.visitor.generics; 2 | 3 | import java.util.*; 4 | 5 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 6 | import com.buschmais.jqassistant.plugin.java.api.model.generics.TypeVariableDescriptor; 7 | 8 | import lombok.RequiredArgsConstructor; 9 | 10 | public class TypeVariableResolver { 11 | 12 | private final Deque typeVariableDeclarations = new LinkedList<>(); 13 | 14 | public void push() { 15 | typeVariableDeclarations.offerFirst(new TypeVariableDeclarations()); 16 | } 17 | 18 | public void pop() { 19 | typeVariableDeclarations.removeFirst(); 20 | } 21 | 22 | public void declare(TypeVariableDescriptor typeVariable) { 23 | typeVariableDeclarations.getFirst().put(typeVariable); 24 | } 25 | 26 | public TypeVariableDescriptor resolve(String name, TypeDescriptor containingType) { 27 | Optional typeVariableOptional = typeVariableDeclarations.stream().map(genericDeclarations -> genericDeclarations.get(name)) 28 | .filter(value -> value != null).findFirst(); 29 | if (typeVariableOptional.isPresent()) { 30 | return typeVariableOptional.get(); 31 | } 32 | // No declaration found, add a required type variable to the containing type 33 | return containingType.requireTypeParameter(name); 34 | } 35 | 36 | @RequiredArgsConstructor 37 | private static class TypeVariableDeclarations { 38 | 39 | private final Map typeVariables = new HashMap<>(); 40 | 41 | void put(TypeVariableDescriptor typeVariable) { 42 | typeVariables.put(typeVariable.getName(), typeVariable); 43 | } 44 | 45 | TypeVariableDescriptor get(String name) { 46 | return typeVariables.get(name); 47 | } 48 | 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/assertj/FieldDescriptorCondition.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.assertj; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.model.FieldDescriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 5 | 6 | import org.assertj.core.api.Condition; 7 | 8 | /** 9 | * A {@link Condition} for asserting a {@link TypeDescriptor} by its name. 10 | */ 11 | public class FieldDescriptorCondition extends Condition { 12 | 13 | private final String expectedTypeName; 14 | 15 | private final String expectedFieldName; 16 | 17 | private FieldDescriptorCondition(String expectedTypeName, String expectedFieldName) { 18 | super("field '" + expectedTypeName + "#" + expectedFieldName + "'"); 19 | this.expectedTypeName = expectedTypeName; 20 | this.expectedFieldName = expectedFieldName; 21 | } 22 | 23 | @Override 24 | public boolean matches(FieldDescriptor value) { 25 | return value.getName() 26 | .equals(expectedFieldName) && value.getDeclaringType() 27 | .getFullQualifiedName() 28 | .equals(expectedTypeName); 29 | } 30 | 31 | public static FieldDescriptorCondition fieldDescriptor(Class expectedType, String expectedFieldName) { 32 | return new FieldDescriptorCondition(expectedType.getName(), expectedFieldName); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/assertj/MethodDescriptorCondition.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.assertj; 2 | 3 | import java.lang.reflect.Executable; 4 | import java.lang.reflect.Method; 5 | import java.util.Arrays; 6 | 7 | import com.buschmais.jqassistant.plugin.java.api.model.MethodDescriptor; 8 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 9 | 10 | import org.assertj.core.api.Condition; 11 | 12 | import static java.util.stream.Collectors.joining; 13 | 14 | /** 15 | * A {@link Condition} for asserting a {@link TypeDescriptor} by its name. 16 | */ 17 | public class MethodDescriptorCondition extends Condition { 18 | 19 | private final String expectedTypeName; 20 | 21 | private final String expectedSignature; 22 | 23 | private MethodDescriptorCondition(String expectedTypeName, String expectedSignature) { 24 | super("method '" + expectedTypeName + "#" + expectedSignature + "'"); 25 | this.expectedTypeName = expectedTypeName; 26 | this.expectedSignature = expectedSignature; 27 | } 28 | 29 | @Override 30 | public boolean matches(MethodDescriptor value) { 31 | return value.getSignature() 32 | .equals(expectedSignature) && value.getDeclaringType() 33 | .getFullQualifiedName() 34 | .equals(expectedTypeName); 35 | } 36 | 37 | public static MethodDescriptorCondition methodDescriptor(Class type, String name, Class... parameterTypes) throws NoSuchMethodException { 38 | Method method = type.getDeclaredMethod(name); 39 | return new MethodDescriptorCondition(type.getName(), method.getReturnType() 40 | .getTypeName() + " " + name + getDeclaredParameters(type.getDeclaredConstructor(parameterTypes))); 41 | } 42 | 43 | public static MethodDescriptorCondition constructorDescriptor(Class type, Class... parameterTypes) throws NoSuchMethodException { 44 | return new MethodDescriptorCondition(type.getName(), "void " + getDeclaredParameters(type.getDeclaredConstructor(parameterTypes))); 45 | } 46 | 47 | private static StringBuilder getDeclaredParameters(Executable executable) { 48 | StringBuilder signature = new StringBuilder().append('('); 49 | signature.append(Arrays.stream(executable.getParameterTypes()) 50 | .map(Class::getTypeName) 51 | .collect(joining(","))); 52 | signature.append(')'); 53 | return signature; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/assertj/TypeDescriptorCondition.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.assertj; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 4 | 5 | import org.assertj.core.api.Condition; 6 | 7 | /** 8 | * A {@link Condition} for asserting a {@link TypeDescriptor} by its name. 9 | */ 10 | public class TypeDescriptorCondition extends Condition { 11 | 12 | private final String expectedFullyQualifiedName; 13 | 14 | private TypeDescriptorCondition(String expectedFullyQualifiedName) { 15 | super("type '" + expectedFullyQualifiedName + "'"); 16 | this.expectedFullyQualifiedName = expectedFullyQualifiedName; 17 | } 18 | 19 | @Override 20 | public boolean matches(TypeDescriptor value) { 21 | return value.getFullQualifiedName() 22 | .equals(expectedFullyQualifiedName); 23 | } 24 | 25 | public static TypeDescriptorCondition typeDescriptor(String expectedFullyQualifiedName) { 26 | return new TypeDescriptorCondition(expectedFullyQualifiedName); 27 | } 28 | 29 | public static TypeDescriptorCondition typeDescriptor(Class expectedType) { 30 | return new TypeDescriptorCondition(expectedType.getName()); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/matcher/AbstractMemberDescriptorMatcher.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.matcher; 2 | 3 | import java.lang.reflect.Member; 4 | 5 | import com.buschmais.jqassistant.plugin.java.api.model.MemberDescriptor; 6 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 7 | 8 | import org.hamcrest.Description; 9 | import org.hamcrest.TypeSafeMatcher; 10 | 11 | import static com.buschmais.jqassistant.plugin.java.test.matcher.TypeDescriptorMatcher.typeDescriptor; 12 | 13 | /** 14 | * A matcher for 15 | * {@link com.buschmais.jqassistant.plugin.java.api.model.MemberDescriptor} s. 16 | */ 17 | public class AbstractMemberDescriptorMatcher extends TypeSafeMatcher { 18 | 19 | private Class type; 20 | private Member member; 21 | private String signature; 22 | 23 | AbstractMemberDescriptorMatcher(Class type, Member member, String signature) { 24 | this.type = type; 25 | this.member = member; 26 | this.signature = signature; 27 | } 28 | 29 | @Override 30 | protected boolean matchesSafely(T item) { 31 | return typeDescriptor(member.getDeclaringClass()).matches(item.getDeclaringType()) && this.signature.equals(item.getSignature()); 32 | } 33 | 34 | @Override 35 | public void describeTo(Description description) { 36 | description.appendText(type.getSimpleName()).appendText("(").appendText(member.getDeclaringClass().getName()).appendText("#").appendText(signature) 37 | .appendText(")"); 38 | } 39 | 40 | @Override 41 | protected void describeMismatchSafely(T item, Description mismatchDescription) { 42 | mismatchDescription.appendText(item.getClass().getSimpleName()); 43 | TypeDescriptor declaringType = item.getDeclaringType(); 44 | if (declaringType != null) { 45 | mismatchDescription.appendText("(").appendText(declaringType.getFullQualifiedName()); 46 | } 47 | mismatchDescription.appendText("#").appendText(item.getSignature()).appendText(")"); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/matcher/AnnotationValueDescriptorMatcher.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.matcher; 2 | 3 | import java.lang.annotation.Annotation; 4 | 5 | import com.buschmais.jqassistant.plugin.java.api.model.AnnotationValueDescriptor; 6 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 7 | 8 | import org.hamcrest.Description; 9 | import org.hamcrest.Matcher; 10 | import org.hamcrest.TypeSafeMatcher; 11 | 12 | import static com.buschmais.jqassistant.plugin.java.test.matcher.TypeDescriptorMatcher.typeDescriptor; 13 | 14 | /** 15 | * A matcher for {@link AnnotationValueDescriptor}s. 16 | */ 17 | public class AnnotationValueDescriptorMatcher extends TypeSafeMatcher { 18 | 19 | private Matcher typeMatcher; 20 | private Matcher valueMatcher; 21 | 22 | protected AnnotationValueDescriptorMatcher(Matcher typeMatcher, Matcher valueMatcher) { 23 | this.typeMatcher = typeMatcher; 24 | this.valueMatcher = valueMatcher; 25 | } 26 | 27 | @Override 28 | protected boolean matchesSafely(AnnotationValueDescriptor item) { 29 | return typeMatcher.matches(item.getType()) && valueMatcher.matches(item.getValue()); 30 | } 31 | 32 | @Override 33 | public void describeTo(Description description) { 34 | description.appendText("an annotation value with type '"); 35 | typeMatcher.describeTo(description); 36 | description.appendText("' and value '"); 37 | valueMatcher.describeTo(description); 38 | description.appendText("'"); 39 | } 40 | 41 | @Override 42 | protected void describeMismatchSafely(AnnotationValueDescriptor item, Description mismatchDescription) { 43 | mismatchDescription.appendText("an annotation value with type '"); 44 | typeMatcher.describeMismatch(item.getType(), mismatchDescription); 45 | mismatchDescription.appendText("' and value '"); 46 | valueMatcher.describeMismatch(item, mismatchDescription); 47 | mismatchDescription.appendText("'"); 48 | } 49 | 50 | /** 51 | * Return a {@link AnnotationValueDescriptorMatcher} for annotations. 52 | * 53 | * @param annotation 54 | * The expected annotation 55 | * @param valueMatcher 56 | * The matcher for the annotation values. 57 | * @return The {@link AnnotationValueDescriptorMatcher}. 58 | */ 59 | public static Matcher annotationValueDescriptor(Class annotation, Matcher valueMatcher) 60 | throws NoSuchFieldException { 61 | return new AnnotationValueDescriptorMatcher(typeDescriptor(annotation), valueMatcher); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/matcher/FieldDescriptorMatcher.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.matcher; 2 | 3 | import java.lang.reflect.Field; 4 | 5 | import com.buschmais.jqassistant.plugin.java.api.model.FieldDescriptor; 6 | 7 | import org.hamcrest.Matcher; 8 | 9 | /** 10 | * A matcher for {@FieldDescriptor}s. 11 | * 12 | * @deprecated Replaced by {@link com.buschmais.jqassistant.plugin.java.test.assertj.FieldDescriptorCondition}. 13 | */ 14 | @Deprecated 15 | public class FieldDescriptorMatcher extends AbstractMemberDescriptorMatcher { 16 | 17 | /** 18 | * Constructor. 19 | * 20 | * @param field 21 | * The expected field. 22 | */ 23 | protected FieldDescriptorMatcher(Field field) { 24 | super(FieldDescriptor.class, field, field.getType() 25 | .getTypeName() + " " + field.getName()); 26 | } 27 | 28 | /** 29 | * Return a {@link FieldDescriptorMatcher}. 30 | * 31 | * @param type 32 | * The class containing the expected field. 33 | * @param field 34 | * The name of the expected field. 35 | * @return The {@link FieldDescriptorMatcher}. 36 | */ 37 | public static Matcher fieldDescriptor(Class type, String field) throws NoSuchFieldException { 38 | return fieldDescriptor(type.getDeclaredField(field)); 39 | } 40 | 41 | /** 42 | * Return a {@link FieldDescriptorMatcher}. 43 | * 44 | * @param field 45 | * The expected field. 46 | * @return The {@link FieldDescriptorMatcher}. 47 | */ 48 | public static Matcher fieldDescriptor(Field field) { 49 | return new FieldDescriptorMatcher(field); 50 | } 51 | 52 | /** 53 | * Return a {@link FieldDescriptorMatcher} for an enumeration value. 54 | * 55 | * @param enumeration 56 | * The expected enumeration. 57 | * @return The {@link FieldDescriptorMatcher}. 58 | */ 59 | public static Matcher fieldDescriptor(Enum> enumeration) throws NoSuchFieldException { 60 | return fieldDescriptor(enumeration.getClass(), enumeration.name()); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/matcher/PackageDescriptorMatcher.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.matcher; 2 | 3 | import com.buschmais.jqassistant.core.test.matcher.AbstractDescriptorMatcher; 4 | import com.buschmais.jqassistant.plugin.java.api.model.PackageDescriptor; 5 | 6 | import org.hamcrest.Matcher; 7 | 8 | /** 9 | * A matcher for {@link PackageDescriptor}s. 10 | */ 11 | public class PackageDescriptorMatcher extends AbstractDescriptorMatcher { 12 | 13 | /** 14 | * Constructor. 15 | * 16 | * @param p 17 | * The expected package. 18 | */ 19 | protected PackageDescriptorMatcher(Package p) { 20 | super(PackageDescriptor.class, p.getName()); 21 | } 22 | 23 | /** 24 | * Constructor. 25 | * 26 | * @param name 27 | * The expected full qualified package name. 28 | */ 29 | protected PackageDescriptorMatcher(String name) { 30 | super(PackageDescriptor.class, name); 31 | } 32 | 33 | /** 34 | * Return a {@link PackageDescriptorMatcher} . 35 | * 36 | * @param p 37 | * The expected package. 38 | * @return The {@link PackageDescriptorMatcher}. 39 | */ 40 | public static Matcher packageDescriptor(Package p) { 41 | return new PackageDescriptorMatcher(p); 42 | } 43 | 44 | /** 45 | * Return a {@link PackageDescriptorMatcher}. 46 | * 47 | * @param name 48 | * The expected full qualified package name. 49 | * @return The {@link PackageDescriptorMatcher}. 50 | */ 51 | public static Matcher packageDescriptor(String name) { 52 | return new PackageDescriptorMatcher(name); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/matcher/PropertyDescriptorMatcher.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.matcher; 2 | 3 | import com.buschmais.jqassistant.plugin.common.api.model.PropertyDescriptor; 4 | 5 | import org.hamcrest.Matcher; 6 | 7 | import static org.hamcrest.core.IsEqual.equalTo; 8 | 9 | public class PropertyDescriptorMatcher 10 | extends ValueDescriptorMatcher { 11 | 12 | protected PropertyDescriptorMatcher(String expectedName, Matcher valueMatcher) { 13 | super(expectedName, valueMatcher, "property"); 14 | } 15 | 16 | public static Matcher propertyDescriptor(String keyName, String expectedValue) { 17 | return new PropertyDescriptorMatcher(keyName, equalTo(expectedValue)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/matcher/TypeDescriptorMatcher.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.matcher; 2 | 3 | import com.buschmais.jqassistant.core.test.matcher.AbstractDescriptorMatcher; 4 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 5 | 6 | import org.hamcrest.Matcher; 7 | 8 | /** 9 | * A matcher for {@link TypeDescriptor}s. 10 | * 11 | * @deprecated Replaced by {@link com.buschmais.jqassistant.plugin.java.test.assertj.TypeDescriptorCondition}. 12 | */ 13 | @Deprecated 14 | public class TypeDescriptorMatcher extends AbstractDescriptorMatcher { 15 | 16 | /** 17 | * Constructor. 18 | * 19 | * @param type 20 | * The expected class. 21 | */ 22 | protected TypeDescriptorMatcher(Class type) { 23 | super(TypeDescriptor.class, type.getName()); 24 | } 25 | 26 | /** 27 | * Constructor. 28 | * 29 | * @param name 30 | * The expected full qualified types name. 31 | */ 32 | protected TypeDescriptorMatcher(String name) { 33 | super(TypeDescriptor.class, name); 34 | } 35 | 36 | /** 37 | * Return a {@link TypeDescriptorMatcher} . 38 | * 39 | * @param type 40 | * The expected types. 41 | * @return The {@link TypeDescriptorMatcher}. 42 | */ 43 | public static Matcher typeDescriptor(Class type) { 44 | return new TypeDescriptorMatcher(type); 45 | } 46 | 47 | /** 48 | * Return a {@link TypeDescriptorMatcher}. 49 | * 50 | * @param name 51 | * The expected full qualified types name. 52 | * @return The {@link TypeDescriptorMatcher}. 53 | */ 54 | public static Matcher typeDescriptor(String name) { 55 | return new TypeDescriptorMatcher(name); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/matcher/ValueDescriptorMatcher.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.matcher; 2 | 3 | import com.buschmais.jqassistant.plugin.common.api.model.ValueDescriptor; 4 | 5 | import org.hamcrest.Description; 6 | import org.hamcrest.Matcher; 7 | import org.hamcrest.TypeSafeMatcher; 8 | 9 | /** 10 | * A matcher for {@link ValueDescriptor}s. 11 | */ 12 | public class ValueDescriptorMatcher> extends TypeSafeMatcher { 13 | 14 | private String nameOfThing; 15 | private String expectedName; 16 | private Matcher valueMatcher; 17 | 18 | protected ValueDescriptorMatcher(String expectedName, Matcher valueMatcher) { 19 | this.expectedName = expectedName; 20 | this.valueMatcher = valueMatcher; 21 | this.nameOfThing = "value"; 22 | } 23 | 24 | public ValueDescriptorMatcher(String expectedName, Matcher valueMatcher, String name) { 25 | this(expectedName, valueMatcher); 26 | nameOfThing = name; 27 | } 28 | 29 | @Override 30 | protected boolean matchesSafely(T item) { 31 | return (expectedName == null || expectedName.equals(item.getName())) && valueMatcher.matches(item.getValue()); 32 | } 33 | 34 | @Override 35 | public void describeTo(Description description) { 36 | description.appendText("a ").appendText(nameOfThing) 37 | .appendText(" with name '").appendText(this.expectedName) 38 | .appendText("' and value '"); 39 | valueMatcher.describeTo(description); 40 | description.appendText("'"); 41 | } 42 | 43 | @Override 44 | protected void describeMismatchSafely(T item, Description mismatchDescription) { 45 | mismatchDescription.appendText("a value with name '").appendText(item.getName()).appendText("' and value '"); 46 | valueMatcher.describeMismatch(item, mismatchDescription); 47 | mismatchDescription.appendText("'"); 48 | } 49 | 50 | /** 51 | * Return a {@link ValueDescriptorMatcher} for a named valued. 52 | * 53 | * @param name 54 | * The expected name. 55 | * @param valueMatcher 56 | * The matcher for the value. 57 | * @return The {@link ValueDescriptorMatcher}. 58 | */ 59 | public static Matcher> valueDescriptor(String name, Matcher valueMatcher) { 60 | return new ValueDescriptorMatcher(name, valueMatcher); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/rules/DefaultMethodIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.rules; 2 | 3 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 4 | import com.buschmais.jqassistant.plugin.java.test.set.rules.java.DefaultMethod; 5 | 6 | import org.junit.jupiter.api.Test; 7 | 8 | import static com.buschmais.jqassistant.core.report.api.model.Result.Status.SUCCESS; 9 | import static com.buschmais.jqassistant.plugin.java.test.matcher.MethodDescriptorMatcher.methodDescriptor; 10 | import static org.assertj.core.api.Assertions.assertThat; 11 | import static org.hamcrest.MatcherAssert.assertThat; 12 | import static org.hamcrest.core.IsCollectionContaining.hasItem; 13 | 14 | /** 15 | * Tests for the concept java:DefaultMethod. 16 | */ 17 | class DefaultMethodIT extends AbstractJavaPluginIT { 18 | 19 | /** 20 | * Verifies the concept "java:DefaultMethod". 21 | * 22 | * @throws java.io.IOException 23 | * If the test fails. 24 | */ 25 | @Test 26 | void defaultMethod() throws Exception { 27 | scanClasses(DefaultMethod.class); 28 | assertThat(applyConcept("java:DefaultMethod").getStatus()).isEqualTo(SUCCESS); 29 | store.beginTransaction(); 30 | TestResult result = query("MATCH (m:Method:Default) RETURN m"); 31 | assertThat(result.getRows().size()).isEqualTo(1); 32 | assertThat(result.getColumn("m"), hasItem(methodDescriptor(DefaultMethod.class, "add", int.class, int.class))); 33 | store.commitTransaction(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/rules/DeprecatedIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.rules; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.scanner.JavaScope; 4 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 5 | import com.buschmais.jqassistant.plugin.java.test.set.rules.deprecated.DeprecatedType; 6 | 7 | import org.junit.jupiter.api.Test; 8 | 9 | import static com.buschmais.jqassistant.core.report.api.model.Result.Status.SUCCESS; 10 | import static com.buschmais.jqassistant.plugin.java.test.matcher.FieldDescriptorMatcher.fieldDescriptor; 11 | import static com.buschmais.jqassistant.plugin.java.test.matcher.MethodDescriptorMatcher.methodDescriptor; 12 | import static com.buschmais.jqassistant.plugin.java.test.matcher.TypeDescriptorMatcher.typeDescriptor; 13 | import static org.assertj.core.api.Assertions.assertThat; 14 | import static org.hamcrest.MatcherAssert.assertThat; 15 | import static org.hamcrest.core.IsCollectionContaining.hasItem; 16 | 17 | /** 18 | * Tests for the concept java:Deprecated. 19 | */ 20 | @SuppressWarnings("deprecation") 21 | class DeprecatedIT extends AbstractJavaPluginIT { 22 | 23 | /** 24 | * Verifies the concept "java:Deprecated". 25 | * 26 | * @throws java.io.IOException 27 | * If the test fails. 28 | */ 29 | @Test 30 | void deprecated() throws Exception { 31 | scanClasses(DeprecatedType.class); 32 | String packageInfoName = DeprecatedType.class.getPackage().getName() + ".package-info"; 33 | scanClassPathResource(JavaScope.CLASSPATH, "/" + packageInfoName.replaceAll("\\.", "/") + ".class"); 34 | assertThat(applyConcept("java:Deprecated").getStatus()).isEqualTo(SUCCESS); 35 | store.beginTransaction(); 36 | assertThat(query("MATCH (element:Type:Class:Deprecated) RETURN element").getColumn("element"), hasItem(typeDescriptor(DeprecatedType.class))); 37 | assertThat(query("MATCH (element:Type:Interface:Deprecated) RETURN element as element").getColumn("element"), hasItem(typeDescriptor(packageInfoName))); 38 | assertThat(query("MATCH (element:Field:Deprecated) RETURN element").getColumn("element"), hasItem(fieldDescriptor(DeprecatedType.class, "value"))); 39 | assertThat(query("MATCH (element:Method:Deprecated) RETURN element").getColumn("element"), hasItem(methodDescriptor(DeprecatedType.class, "getValue"))); 40 | assertThat(query("MATCH (element:Method:Deprecated) RETURN element").getColumn("element"), 41 | hasItem(methodDescriptor(DeprecatedType.class, "setValue", int.class))); 42 | assertThat(query("MATCH (element:Parameter:Deprecated{index:0}) RETURN element").getRows().size()).isEqualTo(1); 43 | store.commitTransaction(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/rules/FunctionalInterfaceIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.rules; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 4 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 5 | import com.buschmais.jqassistant.plugin.java.test.set.rules.java.FunctionalInterface; 6 | import com.buschmais.jqassistant.plugin.java.test.set.rules.java.FunctionalInterfaceWithoutAnnotation; 7 | import com.buschmais.jqassistant.plugin.java.test.set.rules.java.MarkerInterface; 8 | import com.buschmais.jqassistant.plugin.java.test.set.rules.java.NonFunctionalInterface; 9 | 10 | import org.junit.jupiter.api.Test; 11 | 12 | import static com.buschmais.jqassistant.core.report.api.model.Result.Status.SUCCESS; 13 | import static com.buschmais.jqassistant.plugin.java.test.assertj.TypeDescriptorCondition.typeDescriptor; 14 | import static org.assertj.core.api.Assertions.assertThat; 15 | 16 | /** 17 | * Tests for the concept java:FunctionalInterface. 18 | */ 19 | class FunctionalInterfaceIT extends AbstractJavaPluginIT { 20 | 21 | /** 22 | * Verifies the concept "java:FunctionalInterface". 23 | * 24 | * @throws java.io.IOException 25 | * If the test fails. 26 | */ 27 | @Test 28 | void functionalInterface() throws Exception { 29 | scanClasses(FunctionalInterface.class, MarkerInterface.class, NonFunctionalInterface.class, FunctionalInterfaceWithoutAnnotation.class); 30 | assertThat(applyConcept("java:FunctionalInterface").getStatus()).isEqualTo(SUCCESS); 31 | store.beginTransaction(); 32 | TestResult result = query("MATCH (fi:Type:FunctionalInterface) RETURN fi"); 33 | assertThat(result.getColumn("fi")).haveExactly(1, typeDescriptor(FunctionalInterface.class)) 34 | .haveExactly(1, typeDescriptor(FunctionalInterfaceWithoutAnnotation.class)); 35 | store.commitTransaction(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/rules/GeneratedTypeIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.rules; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | import com.buschmais.jqassistant.core.report.api.model.Result; 7 | import com.buschmais.jqassistant.core.rule.api.model.Concept; 8 | import com.buschmais.jqassistant.plugin.java.api.model.JavaArtifactFileDescriptor; 9 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 10 | import com.buschmais.jqassistant.plugin.java.test.set.rules.generated.Generated; 11 | import com.buschmais.jqassistant.plugin.java.test.set.rules.generated.NotGenerated; 12 | 13 | import org.junit.jupiter.api.Test; 14 | 15 | import static com.buschmais.jqassistant.core.report.api.model.Result.Status.SUCCESS; 16 | import static org.assertj.core.api.Assertions.assertThat; 17 | 18 | /** 19 | * Tests for the concept java:GeneratedType. 20 | */ 21 | class GeneratedTypeIT extends AbstractJavaPluginIT { 22 | 23 | @Test 24 | void generatedTypes() throws Exception { 25 | scanClasses(Generated.class, NotGenerated.class); 26 | 27 | Result result = applyConcept("java:GeneratedType"); // implicitly executes concept "test:GeneratedType" 28 | 29 | assertThat(result.getStatus()).isEqualTo(SUCCESS); 30 | assertThat(result.getRows()).isEmpty(); 31 | TestResult query = query( 32 | "MATCH (artifact:Artifact)-[:CONTAINS]->(generatedType:Java:Type:Generated) RETURN artifact as Artifact, count(generatedType) as GeneratedTypes ORDER BY GeneratedTypes desc"); 33 | List> rows = query.getRows(); 34 | assertThat(rows).hasSize(1); 35 | Map row = rows.get(0); 36 | assertThat(row.get("Artifact")).isInstanceOf(JavaArtifactFileDescriptor.class); 37 | assertThat(row.get("GeneratedTypes")).isEqualTo(1l); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/rules/InnerTypeIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.rules; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.core.rule.api.model.RuleException; 6 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 7 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 8 | import com.buschmais.jqassistant.plugin.java.test.set.rules.innertype.OuterType; 9 | 10 | import org.junit.jupiter.api.Test; 11 | 12 | import static com.buschmais.jqassistant.core.report.api.model.Result.Status.SUCCESS; 13 | import static com.buschmais.jqassistant.plugin.java.test.assertj.TypeDescriptorCondition.typeDescriptor; 14 | import static org.assertj.core.api.Assertions.assertThat; 15 | 16 | class InnerTypeIT extends AbstractJavaPluginIT { 17 | 18 | /** 19 | * Verifies the concept "java:InnerType". 20 | */ 21 | @Test 22 | void innerType() throws RuleException, ClassNotFoundException { 23 | scanClasses(OuterType.class, OuterType.InnerClass.class, OuterType.InnerEnum.class, OuterType.InnerInterface.class, OuterType.InnerAnnotation.class); 24 | scanInnerClass(OuterType.class, "1"); 25 | assertThat(applyConcept("java:InnerType").getStatus()).isEqualTo(SUCCESS); 26 | store.beginTransaction(); 27 | assertThat(query("match (t:Inner:Type) return t").getColumn("t")).haveExactly(1, typeDescriptor(OuterType.InnerClass.class)) 28 | .haveExactly(1, typeDescriptor(OuterType.InnerEnum.class)) 29 | .haveExactly(1, typeDescriptor(OuterType.InnerInterface.class)) 30 | .haveExactly(1, typeDescriptor(OuterType.InnerAnnotation.class)) 31 | .haveExactly(1, typeDescriptor(OuterType.class.getName() + "$1")); 32 | store.commitTransaction(); 33 | } 34 | 35 | /** 36 | * Verifies the concept "java:InnerType". 37 | */ 38 | @Test 39 | void anonymousInnerTypes() throws RuleException, ClassNotFoundException { 40 | scanClasses(OuterType.class, OuterType.InnerClass.class, OuterType.InnerEnum.class, OuterType.InnerInterface.class, OuterType.InnerAnnotation.class); 41 | scanInnerClass(OuterType.class, "1"); 42 | assertThat(applyConcept("java:AnonymousInnerType").getStatus()).isEqualTo(SUCCESS); 43 | store.beginTransaction(); 44 | List result = query("match (t:Anonymous:Inner:Type) return t").getColumn("t"); 45 | assertThat(result).hasSize(1) 46 | .haveExactly(1, typeDescriptor(OuterType.class.getName() + "$1")); 47 | store.commitTransaction(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/rules/LambdaMethodIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.rules; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.java.api.model.MethodDescriptor; 6 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 7 | import com.buschmais.jqassistant.plugin.java.test.set.rules.java.LambdaMethod; 8 | 9 | import org.junit.jupiter.api.Test; 10 | 11 | import static com.buschmais.jqassistant.plugin.java.test.matcher.MethodDescriptorMatcher.methodDescriptor; 12 | import static org.assertj.core.api.Assertions.assertThat; 13 | import static org.hamcrest.MatcherAssert.assertThat; 14 | import static org.hamcrest.core.IsCollectionContaining.hasItem; 15 | 16 | class LambdaMethodIT extends AbstractJavaPluginIT { 17 | 18 | /** 19 | * Verifies the concept "java:LambdaMethod". 20 | * 21 | * @throws java.io.IOException 22 | * If the test fails. 23 | */ 24 | @Test 25 | void lambdaMethod() throws Exception { 26 | scanClasses(LambdaMethod.class); 27 | 28 | store.beginTransaction(); 29 | TestResult result = query("MATCH (m:Method{name:'withLambda'})-[:INVOKES]->(l:Method:Lambda) RETURN m,l"); 30 | assertThat(result.getRows().size()).isEqualTo(1); 31 | assertThat(result.getColumn("m"), hasItem(methodDescriptor(LambdaMethod.class, "withLambda"))); 32 | List lambdaMethods = result.getColumn("l"); 33 | assertThat(lambdaMethods.size()).isEqualTo(1); 34 | MethodDescriptor methodDescriptor = lambdaMethods.get(0); 35 | assertThat(methodDescriptor.getName()).isEqualTo("lambda$withLambda$0"); 36 | store.commitTransaction(); 37 | } 38 | 39 | @Test 40 | void methodReference() throws Exception { 41 | scanClasses(LambdaMethod.class); 42 | 43 | store.beginTransaction(); 44 | TestResult result = query("MATCH (m:Method{name:'withMethodReference'})-[:INVOKES]->(:Method{signature:'void println(java.lang.String)'})<-[:DECLARES]-(:Type{fqn:'java.io.PrintStream'}) RETURN m"); 45 | assertThat(result.getRows().size()).isEqualTo(1); 46 | assertThat(result.getColumn("m"), hasItem(methodDescriptor(LambdaMethod.class, "withMethodReference"))); 47 | store.commitTransaction(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/rules/LifecycleAnnotationIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.rules; 2 | 3 | import com.buschmais.jqassistant.core.rule.api.model.RuleException; 4 | import com.buschmais.jqassistant.plugin.java.api.model.MethodDescriptor; 5 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 6 | import com.buschmais.jqassistant.plugin.java.test.set.rules.lifecycleannotation.ManagedResource; 7 | 8 | import org.junit.jupiter.api.Test; 9 | 10 | import static com.buschmais.jqassistant.plugin.java.test.matcher.MethodDescriptorMatcher.methodDescriptor; 11 | import static org.hamcrest.MatcherAssert.assertThat; 12 | 13 | class LifecycleAnnotationIT extends AbstractJavaPluginIT { 14 | 15 | @Test 16 | void postConstruct() throws NoSuchMethodException, RuleException { 17 | scanClasses(ManagedResource.class); 18 | applyConcept("java:PostConstruct"); 19 | store.beginTransaction(); 20 | MethodDescriptor m = store.executeQuery("MATCH (m:PostConstruct:Method) RETURN m").getSingleResult().get("m", MethodDescriptor.class); 21 | assertThat(m, methodDescriptor(ManagedResource.class, "postConstruct")); 22 | } 23 | 24 | @Test 25 | void preDestroy() throws NoSuchMethodException, RuleException { 26 | scanClasses(ManagedResource.class); 27 | applyConcept("java:PreDestroy"); 28 | store.beginTransaction(); 29 | MethodDescriptor m = store.executeQuery("MATCH (m:PreDestroy:Method) RETURN m").getSingleResult().get("m", MethodDescriptor.class); 30 | assertThat(m, methodDescriptor(ManagedResource.class, "preDestroy")); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/rules/LombokIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.rules; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.core.report.api.model.Column; 6 | import com.buschmais.jqassistant.core.report.api.model.Result; 7 | import com.buschmais.jqassistant.core.report.api.model.Row; 8 | import com.buschmais.jqassistant.core.rule.api.model.Concept; 9 | import com.buschmais.jqassistant.core.rule.api.model.RuleException; 10 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 11 | import com.buschmais.jqassistant.plugin.java.test.set.rules.lombok.Person; 12 | 13 | import org.junit.jupiter.api.Test; 14 | 15 | import static com.buschmais.jqassistant.core.report.api.model.Result.Status.SUCCESS; 16 | import static org.assertj.core.api.Assertions.assertThat; 17 | 18 | class LombokIT extends AbstractJavaPluginIT { 19 | 20 | @Test 21 | void generatedLombokType() throws RuleException { 22 | scanClasses(Person.class, Person.PersonBuilder.class); 23 | 24 | Result result = applyConcept("java:GeneratedLombokType"); 25 | assertThat(result.getStatus()).isEqualTo(SUCCESS); 26 | List rows = result.getRows(); 27 | assertThat(rows).hasSize(1); 28 | 29 | Row row = rows.get(0); 30 | Column generatedType = row.getColumns() 31 | .get("GeneratedTypes"); 32 | assertThat(generatedType).isNotNull(); 33 | assertThat(generatedType.getValue()).isEqualTo(1L); 34 | } 35 | 36 | @Test 37 | void generatedType() throws RuleException { 38 | scanClasses(Person.class, Person.PersonBuilder.class); 39 | 40 | Result result = applyConcept("java:GeneratedType"); 41 | assertThat(result.getStatus()).isEqualTo(SUCCESS); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/rules/PackageAnnotatedByIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.rules; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import com.buschmais.jqassistant.core.report.api.model.Result; 7 | import com.buschmais.jqassistant.core.rule.api.model.Concept; 8 | import com.buschmais.jqassistant.plugin.java.api.scanner.JavaScope; 9 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 10 | import com.buschmais.jqassistant.plugin.java.test.set.rules.packageannotation.PackageClass; 11 | 12 | import org.junit.jupiter.api.Test; 13 | 14 | import static com.buschmais.jqassistant.core.report.api.model.Result.Status.SUCCESS; 15 | import static org.assertj.core.api.Assertions.assertThat; 16 | 17 | /** 18 | * Tests for the concept java:PackageAnnotatedBy. 19 | */ 20 | class PackageAnnotatedByIT extends AbstractJavaPluginIT { 21 | 22 | /** 23 | * Verifies the concept "java:PackageAnnotatedBy". 24 | */ 25 | @Test 26 | void packageAnnotatedBy() throws Exception { 27 | scanClassesAndPackages(PackageClass.class); 28 | Result result = applyConcept("java:PackageAnnotatedBy"); 29 | assertThat(result.getStatus()).isEqualTo(SUCCESS); 30 | assertThat(result.getRows().size()).isEqualTo(1); 31 | 32 | store.beginTransaction(); 33 | assertThat(query("MATCH (p:Package)-[:ANNOTATED_BY]->(:Annotation) RETURN p").getRows().size()).isEqualTo(1); 34 | store.commitTransaction(); 35 | } 36 | 37 | private void scanClassesAndPackages(Class clazz) { 38 | Map pluginProps = new HashMap<>(); 39 | pluginProps.put("file.include", "/" + clazz.getPackage().getName().replace(".", "/") + "/**"); 40 | getScanner(pluginProps).scan(getClassesDirectory(clazz), "/", JavaScope.CLASSPATH); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/rules/VirtualDependsOnIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.rules; 2 | 3 | import java.io.IOException; 4 | import java.util.List; 5 | 6 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 7 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 8 | import com.buschmais.jqassistant.plugin.java.test.set.rules.virtualdependson.*; 9 | 10 | import org.junit.jupiter.api.Test; 11 | 12 | import static com.buschmais.jqassistant.core.report.api.model.Result.Status.SUCCESS; 13 | import static com.buschmais.jqassistant.plugin.java.test.matcher.TypeDescriptorMatcher.typeDescriptor; 14 | import static org.assertj.core.api.Assertions.assertThat; 15 | import static org.hamcrest.MatcherAssert.assertThat; 16 | 17 | /** 18 | * Tests for the concept java:VirtualDependsOn. 19 | */ 20 | class VirtualDependsOnIT extends AbstractJavaPluginIT { 21 | 22 | /** 23 | * Verifies the concept "java:VirtualDependsOn" for a class implementing an 24 | * interface. 25 | * 26 | * @throws IOException 27 | * If the test fails. 28 | */ 29 | @Test 30 | void invokeInterfaceMethod() throws Exception { 31 | scanClasses(ClassType.class, InterfaceType.class, InterfaceTypeClient.class); 32 | assertThat(applyConcept("java:VirtualDependsOn").getStatus()).isEqualTo(SUCCESS); 33 | store.beginTransaction(); 34 | List types = query("MATCH (client:Type)-[:VIRTUAL_DEPENDS_ON]->(type:Type) WHERE client.name='InterfaceTypeClient' RETURN type") 35 | .getColumn("type"); 36 | assertThat(types.size()).isEqualTo(1); 37 | assertThat(types.get(0), typeDescriptor(ClassType.class)); 38 | store.commitTransaction(); 39 | } 40 | 41 | /** 42 | * Verifies the concept "java:VirtualInvokes" for a sub class extending a class. 43 | * 44 | * @throws IOException 45 | * If the test fails. 46 | */ 47 | @Test 48 | void invokeClassMethod() throws Exception { 49 | scanClasses(ClassType.class, SubClassType.class, ClassTypeClient.class); 50 | assertThat(applyConcept("java:VirtualDependsOn").getStatus()).isEqualTo(SUCCESS); 51 | store.beginTransaction(); 52 | List types = query("MATCH (client:Type)-[:VIRTUAL_DEPENDS_ON]->(type:Type) WHERE client.name='ClassTypeClient' RETURN type") 53 | .getColumn("type"); 54 | assertThat(types.size()).isEqualTo(1); 55 | assertThat(types.get(0), typeDescriptor(SubClassType.class)); 56 | store.commitTransaction(); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/ArrayIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import com.buschmais.jqassistant.plugin.java.api.model.FieldDescriptor; 7 | import com.buschmais.jqassistant.plugin.java.api.model.MethodDescriptor; 8 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 9 | import com.buschmais.jqassistant.plugin.java.test.set.scanner.array.Array; 10 | 11 | import org.junit.jupiter.api.Test; 12 | 13 | import static com.buschmais.jqassistant.plugin.java.test.assertj.FieldDescriptorCondition.fieldDescriptor; 14 | import static com.buschmais.jqassistant.plugin.java.test.assertj.MethodDescriptorCondition.methodDescriptor; 15 | import static org.assertj.core.api.Assertions.assertThat; 16 | 17 | class ArrayIT extends AbstractJavaPluginIT { 18 | 19 | @Test 20 | void field() throws ReflectiveOperationException { 21 | scanClasses(Array.class); 22 | store.beginTransaction(); 23 | Map parameters = new HashMap(); 24 | parameters.put("className", Array.class.getName()); 25 | TestResult testResult = query("MATCH (t:Type)-[:DECLARES]->(f:Field) WHERE t.fqn=$className RETURN f", parameters); 26 | assertThat(testResult.getColumn("f")).haveExactly(1, fieldDescriptor(Array.class, "stringArray")); 27 | testResult = query("MATCH (t:Type)-[:DECLARES]->(m:Method) WHERE t.fqn=$className RETURN m", parameters); 28 | assertThat(testResult.getColumn("m")).haveExactly(1, methodDescriptor(Array.class, "getStringArray")) 29 | .haveExactly(1, methodDescriptor(Array.class, "getStringArray")); 30 | store.commitTransaction(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/ByteCodeVersionIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.java.api.model.ClassFileDescriptor; 6 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 7 | import com.buschmais.jqassistant.plugin.java.test.set.scanner.pojo.Pojo; 8 | 9 | import org.junit.jupiter.api.Test; 10 | 11 | import static com.buschmais.jqassistant.core.report.api.model.Result.Status.SUCCESS; 12 | import static com.buschmais.jqassistant.plugin.java.test.matcher.TypeDescriptorMatcher.typeDescriptor; 13 | import static org.assertj.core.api.Assertions.assertThat; 14 | import static org.hamcrest.MatcherAssert.assertThat; 15 | 16 | /** 17 | * Verifies functionality related to byte code and java versions. 18 | */ 19 | class ByteCodeVersionIT extends AbstractJavaPluginIT { 20 | 21 | @Test 22 | void byteCodeVersion() { 23 | scanClasses(Pojo.class); 24 | store.beginTransaction(); 25 | List types = query("MATCH (t:Type) WHERE t.name='Pojo' RETURN t").getColumn("t"); 26 | assertThat(types).hasSize(1); 27 | ClassFileDescriptor pojo = types.get(0); 28 | assertThat(pojo.getByteCodeVersion()).isGreaterThan(52); // Java 8 29 | store.commitTransaction(); 30 | 31 | } 32 | 33 | @Test 34 | void javaVersion() throws Exception { 35 | scanClasses(Pojo.class); 36 | assertThat(applyConcept("java:JavaVersion").getStatus()).isEqualTo(SUCCESS); 37 | store.beginTransaction(); 38 | List types = query("MATCH (t:Type) WHERE t.name='Pojo' and t.javaVersion starts with 'Java ' RETURN t").getColumn("t"); 39 | assertThat(types).hasSize(1); 40 | ClassFileDescriptor pojo = types.get(0); 41 | assertThat(pojo, typeDescriptor(Pojo.class)); 42 | store.commitTransaction(); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/ConstructorIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.model.ConstructorDescriptor; 4 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 5 | import com.buschmais.jqassistant.plugin.java.test.set.scanner.constructor.ImplicitDefaultConstructor; 6 | import com.buschmais.jqassistant.plugin.java.test.set.scanner.constructor.OverloadedConstructor; 7 | 8 | import org.junit.jupiter.api.Test; 9 | 10 | import static com.buschmais.jqassistant.plugin.java.test.assertj.MethodDescriptorCondition.constructorDescriptor; 11 | import static org.assertj.core.api.Assertions.assertThat; 12 | 13 | /** 14 | * Contains test which verify correct scanning of constructors. 15 | */ 16 | class ConstructorIT extends AbstractJavaPluginIT { 17 | 18 | /** 19 | * Verifies scanning of {@link ImplicitDefaultConstructor}. 20 | * 21 | * @throws NoSuchMethodException 22 | * If the test fails. 23 | */ 24 | @Test 25 | void implicitDefaultConstructor() throws NoSuchMethodException { 26 | scanClasses(ImplicitDefaultConstructor.class); 27 | store.beginTransaction(); 28 | assertThat(query("MATCH (c:Method:Constructor) RETURN c").getColumn("c")).haveExactly(1, 29 | constructorDescriptor(ImplicitDefaultConstructor.class)); 30 | // the constructor of java.lang.Object is not scanned but should be identified as constructor 31 | assertThat(query("MATCH (c:Method:Constructor) RETURN c").getColumn("c")).haveExactly(1, constructorDescriptor(Object.class)); 32 | store.commitTransaction(); 33 | } 34 | 35 | /** 36 | * Verifies scanning of {@link OverloadedConstructor}. 37 | * 38 | * @throws NoSuchMethodException 39 | * If the test fails. 40 | */ 41 | @Test 42 | void overloadedConstructors() throws NoSuchMethodException { 43 | scanClasses(OverloadedConstructor.class); 44 | store.beginTransaction(); 45 | assertThat(query("MATCH (c:Method:Constructor) RETURN c").getColumn("c")).haveExactly(1, 46 | constructorDescriptor(OverloadedConstructor.class)) 47 | .haveExactly(1, constructorDescriptor(OverloadedConstructor.class, String.class)); 48 | store.commitTransaction(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/CyclomaticComplexityIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import java.util.HashMap; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import com.buschmais.jqassistant.plugin.java.api.model.MethodDescriptor; 8 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 9 | import com.buschmais.jqassistant.plugin.java.test.set.scanner.metric.CyclomaticComplexityType; 10 | 11 | import org.junit.jupiter.api.Test; 12 | 13 | import static org.assertj.core.api.Assertions.assertThat; 14 | 15 | class CyclomaticComplexityIT extends AbstractJavaPluginIT { 16 | 17 | @Test 18 | void cyclomaticComplexity() { 19 | Map expectedComplexities = new HashMap<>(); 20 | expectedComplexities.put("", 1); 21 | expectedComplexities.put("ifStatement", 2); 22 | expectedComplexities.put("caseStatement", 4); 23 | expectedComplexities.put("tryCatch", 3); 24 | expectedComplexities.put("nestedTryCatch", 5); 25 | expectedComplexities.put("tryWithResources", 3); 26 | scanClasses(CyclomaticComplexityType.class); 27 | store.beginTransaction(); 28 | List methods = query("match (:Class)-[:DECLARES]->(m:Method) return m").getColumn("m"); 29 | assertThat(methods.size()).isEqualTo(expectedComplexities.size()); 30 | for (MethodDescriptor methodDescriptor : methods) { 31 | String name = methodDescriptor.getName(); 32 | int cyclomaticComplexity = methodDescriptor.getCyclomaticComplexity(); 33 | Integer expectedComplexity = expectedComplexities.get(name); 34 | assertThat(expectedComplexity).as("Expecting a CC for method " + name).isNotNull(); 35 | assertThat(cyclomaticComplexity).as("Invalid CC for method " + name).isEqualTo(expectedComplexity); 36 | } 37 | store.commitTransaction(); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/EnumerationIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.model.ConstructorDescriptor; 4 | import com.buschmais.jqassistant.plugin.java.api.model.FieldDescriptor; 5 | import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; 6 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 7 | import com.buschmais.jqassistant.plugin.java.test.set.scanner.enumeration.EnumerationType; 8 | 9 | import org.junit.jupiter.api.Test; 10 | 11 | import static com.buschmais.jqassistant.plugin.java.test.assertj.FieldDescriptorCondition.fieldDescriptor; 12 | import static com.buschmais.jqassistant.plugin.java.test.assertj.MethodDescriptorCondition.constructorDescriptor; 13 | import static com.buschmais.jqassistant.plugin.java.test.assertj.TypeDescriptorCondition.typeDescriptor; 14 | import static org.assertj.core.api.Assertions.assertThat; 15 | 16 | /** 17 | * Contains test which verify correct scanning of constructors. 18 | */ 19 | class EnumerationIT extends AbstractJavaPluginIT { 20 | 21 | /** 22 | * Verifies scanning of {@link EnumerationType}. 23 | * 24 | * @throws NoSuchMethodException 25 | * If the test fails. 26 | */ 27 | @Test 28 | void implicitDefaultConstructor() throws ReflectiveOperationException { 29 | scanClasses(EnumerationType.class); 30 | store.beginTransaction(); 31 | assertThat(query("MATCH (e:Type:Enum) RETURN e").getColumn("e")).haveExactly(1, typeDescriptor(EnumerationType.class)); 32 | assertThat(query("MATCH (e:Type:Enum)-[:EXTENDS]->(s) RETURN s").getColumn("s")).haveExactly(1, typeDescriptor(Enum.class)); 33 | assertThat(query("MATCH (e:Type:Enum)-[:DECLARES]->(f:Field) RETURN f").getColumn("f")).haveExactly(1, 34 | fieldDescriptor(EnumerationType.class, "A")) 35 | .haveExactly(1, fieldDescriptor(EnumerationType.class, "B")) 36 | .haveExactly(1, fieldDescriptor(EnumerationType.class, "value")); 37 | assertThat(query("MATCH (e:Type:Enum)-[:DECLARES]->(c:Constructor) RETURN c").getColumn("c")).haveExactly(1, 38 | constructorDescriptor(EnumerationType.class, String.class, int.class, boolean.class)); 39 | store.commitTransaction(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/FieldValueIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | import com.buschmais.jqassistant.core.shared.map.MapBuilder; 7 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 8 | import com.buschmais.jqassistant.plugin.java.test.set.scanner.fieldvalue.FieldValue; 9 | 10 | import org.junit.jupiter.api.Test; 11 | 12 | import static org.assertj.core.api.Assertions.assertThat; 13 | 14 | /** 15 | * Contains test which verify correct scanning static field values. 16 | */ 17 | class FieldValueIT extends AbstractJavaPluginIT { 18 | 19 | /** 20 | * Verifies an annotation on class level. 21 | * 22 | */ 23 | @Test 24 | void fieldValues() { 25 | scanClasses(FieldValue.class); 26 | store.beginTransaction(); 27 | assertThat(getFieldValue("stringValue", String.class)).isEqualTo("StringValue"); 28 | assertThat(getFieldValue("longValue", Number.class).longValue()).isEqualTo(1l); 29 | store.commitTransaction(); 30 | } 31 | 32 | private V getFieldValue(String fieldName, Class type) { 33 | Map params = MapBuilder. builder().entry("fieldName", fieldName).build(); 34 | TestResult testResult = query("MATCH (:Type)-[:DECLARES]->(f:Field)-[:HAS]->(v:Value:Primitive) WHERE f.name=$fieldName RETURN v.value as value", 35 | params); 36 | List> rows = testResult.getRows(); 37 | assertThat(rows.size()).isEqualTo(1); 38 | Map row = rows.get(0); 39 | return type.cast(row.get("value")); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/InheritanceIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import java.io.IOException; 4 | 5 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 6 | import com.buschmais.jqassistant.plugin.java.test.set.scanner.inheritance.SubInterface; 7 | import com.buschmais.jqassistant.plugin.java.test.set.scanner.inheritance.SuperInterface; 8 | 9 | import org.junit.jupiter.api.Test; 10 | 11 | import static com.buschmais.jqassistant.plugin.java.test.matcher.TypeDescriptorMatcher.typeDescriptor; 12 | import static org.hamcrest.CoreMatchers.hasItem; 13 | import static org.hamcrest.MatcherAssert.assertThat; 14 | 15 | class InheritanceIT extends AbstractJavaPluginIT { 16 | 17 | /** 18 | * Verifies scanning of interface hierarchies. 19 | * 20 | * @throws java.io.IOException 21 | * If the test fails. 22 | * @throws NoSuchMethodException 23 | * If the test fails. 24 | */ 25 | @Test 26 | void interfaces() throws IOException, NoSuchMethodException, NoSuchFieldException { 27 | scanClasses(SuperInterface.class, SubInterface.class); 28 | store.beginTransaction(); 29 | assertThat(query("MATCH (sub:Type:Interface)-[:IMPLEMENTS]->(super:Type:Interface) RETURN sub").getColumn("sub"), 30 | hasItem(typeDescriptor(SubInterface.class))); 31 | store.commitTransaction(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/JavaRuntimePT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import java.io.File; 4 | 5 | import com.buschmais.jqassistant.core.rule.api.model.RuleException; 6 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 7 | 8 | import org.junit.jupiter.api.Test; 9 | 10 | import static org.junit.Assume.assumeNotNull; 11 | import static org.junit.Assume.assumeTrue; 12 | 13 | class JavaRuntimePT extends AbstractJavaPluginIT { 14 | 15 | /** 16 | * The list of primitive types. 17 | */ 18 | public static final Class[] PRIMITIVE_TYPES = new Class[] { void.class, boolean.class, short.class, int.class, float.class, double.class, 19 | long.class }; 20 | 21 | /** 22 | * Scans the rt.jar of the Java Runtime Environment specified by the environment 23 | * variable java.home. 24 | */ 25 | @Test 26 | @TestStore(type = TestStore.Type.FILE) 27 | void javaRuntime01Scan() { 28 | String javaHome = System.getProperty("java.home"); 29 | assumeNotNull("java.home is not set.", javaHome); 30 | File runtimeJar = new File(javaHome + "/lib/rt.jar"); 31 | assumeTrue("Java Runtime JAR not found: " + runtimeJar.getAbsolutePath(), runtimeJar.exists()); 32 | store.beginTransaction(); 33 | getScanner().scan(runtimeJar, runtimeJar.getAbsolutePath(), null); 34 | store.commitTransaction(); 35 | } 36 | 37 | @Test 38 | @TestStore(type = TestStore.Type.FILE, reset = false) 39 | public void javaRuntime02VirtualDependsOn() throws RuleException { 40 | applyConcept("java:VirtualDependsOn"); 41 | } 42 | 43 | @Test 44 | @TestStore(type = TestStore.Type.FILE, reset = false) 45 | public void javaRuntime03VirtualInvokes() throws RuleException { 46 | applyConcept("java:VirtualInvokes"); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/ManifestFileIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import java.io.IOException; 4 | import java.util.List; 5 | 6 | import com.buschmais.jqassistant.plugin.java.api.model.ManifestFileDescriptor; 7 | import com.buschmais.jqassistant.plugin.java.api.model.ManifestSectionDescriptor; 8 | import com.buschmais.jqassistant.plugin.java.api.scanner.JavaScope; 9 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 10 | 11 | import org.junit.jupiter.api.Test; 12 | 13 | import static org.assertj.core.api.Assertions.assertThat; 14 | 15 | /** 16 | * Contains tests regarding manifest files. 17 | */ 18 | class ManifestFileIT extends AbstractJavaPluginIT { 19 | 20 | /** 21 | * Verifies that manifest files are scanned. 22 | * 23 | * @throws java.io.IOException 24 | * If the test fails. 25 | */ 26 | @Test 27 | void manifestFile() throws IOException { 28 | scanClassPathResource(JavaScope.CLASSPATH, "/META-INF/MANIFEST.MF"); 29 | store.beginTransaction(); 30 | List manifestFileDescriptors = query("MATCH (mf:Manifest:File) RETURN mf").getColumn("mf"); 31 | assertThat(manifestFileDescriptors.size()).isEqualTo(1); 32 | 33 | ManifestFileDescriptor manifestFileDescriptor = manifestFileDescriptors.get(0); 34 | assertThat(manifestFileDescriptor.getFileName()).endsWith("/META-INF/MANIFEST.MF"); 35 | 36 | List manifestSections = query("MATCH (mf:Manifest:File)-[:DECLARES]->(ms:ManifestSection) WHERE ms.name='Main' RETURN ms") 37 | .getColumn("ms"); 38 | assertThat(manifestSections.size()).isEqualTo(1); 39 | store.commitTransaction(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/NestedInnerClassesIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import java.io.IOException; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 8 | import com.buschmais.jqassistant.plugin.java.test.set.scanner.innerclass.NestedInnerClasses; 9 | 10 | import org.hamcrest.Matcher; 11 | import org.junit.jupiter.api.Test; 12 | 13 | import static com.buschmais.jqassistant.plugin.java.test.matcher.TypeDescriptorMatcher.typeDescriptor; 14 | import static org.assertj.core.api.Assertions.assertThat; 15 | import static org.hamcrest.MatcherAssert.assertThat; 16 | 17 | /** 18 | * Contains test on relations between outer and inner classes. 19 | */ 20 | class NestedInnerClassesIT extends AbstractJavaPluginIT { 21 | 22 | /** 23 | * Scans an outer class. 24 | * 25 | * @throws IOException 26 | * If the test fails. 27 | */ 28 | @Test 29 | void nestedInnerClasses() throws IOException { 30 | scanClasses(NestedInnerClasses.class, NestedInnerClasses.FirstLevel.class, NestedInnerClasses.FirstLevel.SecondLevel.class); 31 | store.beginTransaction(); 32 | List> rows = query("MATCH (t1:Type)-[:DECLARES]->(t2:Type)-[:DECLARES]->(t3:Type) RETURN t1, t2, t3").getRows(); 33 | assertThat(rows.size()).isEqualTo(1); 34 | Map row = rows.get(0); 35 | assertThat(row.get("t1"), (Matcher) typeDescriptor(NestedInnerClasses.class)); 36 | assertThat(row.get("t2"), (Matcher) typeDescriptor(NestedInnerClasses.FirstLevel.class)); 37 | assertThat(row.get("t3"), (Matcher) typeDescriptor(NestedInnerClasses.FirstLevel.SecondLevel.class)); 38 | store.commitTransaction(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/PackageIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.buschmais.jqassistant.plugin.java.api.model.PackageDescriptor; 7 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 8 | import com.buschmais.jqassistant.plugin.java.test.set.scanner.pojo.Pojo; 9 | 10 | import org.hamcrest.Matcher; 11 | import org.junit.jupiter.api.Test; 12 | 13 | import static com.buschmais.jqassistant.plugin.java.test.matcher.PackageDescriptorMatcher.packageDescriptor; 14 | import static org.hamcrest.MatcherAssert.assertThat; 15 | import static org.hamcrest.core.AllOf.allOf; 16 | import static org.hamcrest.core.IsCollectionContaining.hasItem; 17 | 18 | /** 19 | * Contains tests regarding packages. 20 | */ 21 | class PackageIT extends AbstractJavaPluginIT { 22 | 23 | private static final String EMPTY_PACKAGE = "com.buschmais.jqassistant.plugin.java.test.set.scanner.empty"; 24 | 25 | /** 26 | * Verifies that all packages are added to the artifact while scanning a 27 | * directory. 28 | * 29 | */ 30 | @Test 31 | void artifactContainsPackages() { 32 | scanClassPathDirectory(getClassesDirectory(Pojo.class)); 33 | store.beginTransaction(); 34 | // Assert that all packages of Pojo.class are contained in the artifact 35 | List>> packageMatchers = new ArrayList<>(); 36 | String currentPackage = Pojo.class.getPackage().getName(); 37 | do { 38 | packageMatchers.add(hasItem(packageDescriptor(currentPackage))); 39 | int separatorIndex = currentPackage.lastIndexOf('.'); 40 | if (separatorIndex != -1) { 41 | currentPackage = currentPackage.substring(0, separatorIndex); 42 | } else { 43 | currentPackage = null; 44 | } 45 | } while (currentPackage != null); 46 | assertThat(query("MATCH (a:Artifact:Directory)-[:CONTAINS]->(p:Java:Package) RETURN p").getColumn("p"), allOf(packageMatchers)); 47 | assertThat(query("MATCH (a:Artifact:Directory)-[:CONTAINS]->(p:Java:Package) WHERE NOT (p)-[:CONTAINS]->(:Type) RETURN p").getColumn("p"), 48 | hasItem(packageDescriptor(EMPTY_PACKAGE))); 49 | store.commitTransaction(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/XmlPropertyFileScannerPluginIT.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.scanner; 2 | 3 | import java.io.IOException; 4 | import java.util.List; 5 | 6 | import com.buschmais.jqassistant.plugin.common.api.model.FileDescriptor; 7 | import com.buschmais.jqassistant.plugin.java.api.model.PropertyFileDescriptor; 8 | import com.buschmais.jqassistant.plugin.java.api.scanner.JavaScope; 9 | import com.buschmais.jqassistant.plugin.java.test.AbstractJavaPluginIT; 10 | 11 | import org.junit.jupiter.api.AfterEach; 12 | import org.junit.jupiter.api.Test; 13 | 14 | import static com.buschmais.jqassistant.plugin.java.test.matcher.PropertyDescriptorMatcher.propertyDescriptor; 15 | import static com.buschmais.jqassistant.plugin.java.test.matcher.PropertyFileDescriptorMatchers.*; 16 | import static org.assertj.core.api.Assertions.assertThat; 17 | import static org.hamcrest.MatcherAssert.assertThat; 18 | 19 | class XmlPropertyFileScannerPluginIT extends AbstractJavaPluginIT { 20 | 21 | @AfterEach 22 | void commitTransaction() { 23 | if (store.hasActiveTransaction()) { 24 | store.commitTransaction(); 25 | } 26 | } 27 | 28 | @Test 29 | void emptyPropertiesFileDoesNotHaveProperties() throws IOException { 30 | scanClassPathResource(JavaScope.CLASSPATH, "/set/scanner/propertyfiles/properties-empty.xml"); 31 | store.beginTransaction(); 32 | List fileDescriptors = 33 | query("MATCH (f:File:Xml:Properties) RETURN f").getColumn("f"); 34 | 35 | assertThat(fileDescriptors).isNotNull(); 36 | assertThat(fileDescriptors).hasSize(1); 37 | 38 | PropertyFileDescriptor propertyFileDescriptor = (PropertyFileDescriptor)fileDescriptors.get(0); 39 | assertThat(propertyFileDescriptor, hasNoProperties()); 40 | } 41 | 42 | @Test 43 | void propertiesFileHasProperties() throws IOException { 44 | scanClassPathResource(JavaScope.CLASSPATH, "/set/scanner/propertyfiles/properties-2-props.xml"); 45 | store.beginTransaction(); 46 | List fileDescriptors = 47 | query("MATCH (f:File:Xml:Properties) RETURN f").getColumn("f"); 48 | 49 | assertThat(fileDescriptors).isNotNull(); 50 | assertThat(fileDescriptors).hasSize(1); 51 | 52 | PropertyFileDescriptor propertyFileDescriptor = (PropertyFileDescriptor)fileDescriptors.get(0); 53 | 54 | assertThat(propertyFileDescriptor, hasProperties(2)); 55 | assertThat(propertyFileDescriptor, containsProperties(propertyDescriptor("keyA", "valueA"), 56 | propertyDescriptor("keyB", "valueB"))); 57 | } 58 | 59 | 60 | } 61 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/classpath/resolve/a/AnnotationType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.classpath.resolve.a; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | @Retention(RetentionPolicy.RUNTIME) 7 | public @interface AnnotationType { 8 | 9 | Class classValue() default Object.class; 10 | 11 | EnumType enumValue() default EnumType.A; 12 | } 13 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/classpath/resolve/a/ClassType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.classpath.resolve.a; 2 | 3 | public class ClassType { 4 | 5 | public int foo = 42; 6 | 7 | public void bar(int value) { 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/classpath/resolve/a/EnumType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.classpath.resolve.a; 2 | 3 | public enum EnumType { 4 | A, B; 5 | } 6 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/classpath/resolve/a/ExceptionType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.classpath.resolve.a; 2 | 3 | public class ExceptionType extends Exception { 4 | 5 | ExceptionType(String message) { 6 | super(message); 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/classpath/resolve/a/InterfaceType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.classpath.resolve.a; 2 | 3 | public interface InterfaceType { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/classpath/resolve/a/ValueType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.classpath.resolve.a; 2 | 3 | public class ValueType { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/classpath/resolve/b/DependentType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.classpath.resolve.b; 2 | 3 | import java.util.List; 4 | 5 | import com.buschmais.jqassistant.plugin.java.test.set.rules.classpath.resolve.a.*; 6 | 7 | @AnnotationType(classValue = ValueType.class, enumValue = EnumType.B) 8 | public class DependentType extends ClassType implements InterfaceType { 9 | 10 | @AnnotationType 11 | private ClassType field; 12 | 13 | private List genericType; 14 | 15 | @AnnotationType 16 | public ClassType signature(@AnnotationType ClassType classType) throws ExceptionType { 17 | return null; 18 | } 19 | 20 | public void fieldAccess(ClassType classType) { 21 | int foo1 = classType.foo; 22 | int foo2 = classType.foo; 23 | classType.foo = foo; 24 | classType.foo = foo; 25 | } 26 | 27 | public void methodInvocation(ClassType classType) { 28 | classType.bar(1); 29 | classType.bar(2); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/packages/a/A.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.packages.a; 2 | 3 | import com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.packages.b.B; 4 | 5 | /** 6 | * A class depending on {@link B}. 7 | */ 8 | public class A { 9 | 10 | private B b; 11 | 12 | public B getB() { 13 | return b; 14 | } 15 | 16 | public void setB(B b) { 17 | this.b = b; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/packages/b/B.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.packages.b; 2 | 3 | import com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.packages.a.A; 4 | 5 | /** 6 | * A class depending on {@link A}. 7 | */ 8 | public class B { 9 | 10 | private A a; 11 | 12 | public A getA() { 13 | return a; 14 | } 15 | 16 | public void setA(A a) { 17 | this.a = a; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/DependentType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | @TypeAnnotation(TypeAnnotationValueType.class) 4 | public class DependentType extends SuperClass implements ImplementedInterface { 5 | 6 | @FieldAnnotation(FieldAnnotationValueType.class) 7 | private FieldType field; 8 | 9 | @MethodAnnotation(MethodAnnotationValueType.class) 10 | public MethodReturnType iterator(MethodParameter n) throws MethodException { 11 | @LocalVariableAnnotation(LocalVariableAnnotationValueType.class) 12 | LocalVariable localVariable = new LocalVariable(); 13 | LocalVariable.ReadStaticVariable readStaticVariable = LocalVariable.readStaticVariable; 14 | LocalVariable.ReadVariable readVariable = localVariable.readVariable; 15 | LocalVariable.writeStaticVariable = null; 16 | localVariable.writeVariable = null; 17 | InvokeMethodType invokeMethodType = new InvokeMethodType(); 18 | try { 19 | invokeMethodType.invoke(null); 20 | } catch (InvokeMethodType.InvokeMethodException e) { 21 | } 22 | return null; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/FieldAnnotation.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * An annotation on field level. 10 | */ 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Target(ElementType.FIELD) 13 | public @interface FieldAnnotation { 14 | 15 | Class value(); 16 | } 17 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/FieldAnnotationValueType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class FieldAnnotationValueType { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/FieldType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class FieldType { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/FieldTypeParameter.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class FieldTypeParameter { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/ImplementedInterface.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public interface ImplementedInterface { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/ImplementedInterfaceTypeParameter.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class ImplementedInterfaceTypeParameter { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/InvokeMethodType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class InvokeMethodType { 4 | 5 | public InvokeMethodReturnType invoke(InvokeMethodParameterType parameter) 6 | throws InvokeMethodException { 7 | return null; 8 | } 9 | 10 | public class InvokeMethodReturnType { 11 | } 12 | 13 | public class InvokeMethodReturnTypeParameter { 14 | } 15 | 16 | public class InvokeMethodParameterType { 17 | } 18 | 19 | public class InvokeMethodParameterTypeTypeParameter { 20 | } 21 | 22 | public class InvokeMethodException extends Exception { 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/LocalVariable.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class LocalVariable { 4 | 5 | public ReadVariable readVariable; 6 | 7 | public static ReadStaticVariable readStaticVariable; 8 | 9 | public WriteVariable writeVariable; 10 | 11 | public static WriteStaticVariable writeStaticVariable; 12 | 13 | public class ReadVariable { 14 | } 15 | 16 | public class ReadStaticVariable { 17 | } 18 | 19 | public class WriteVariable { 20 | } 21 | 22 | public class WriteStaticVariable { 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/LocalVariableAnnotation.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * An annotation on field level. 10 | */ 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Target(ElementType.LOCAL_VARIABLE) 13 | public @interface LocalVariableAnnotation { 14 | 15 | Class value(); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/LocalVariableAnnotationValueType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class LocalVariableAnnotationValueType { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/MethodAnnotation.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * An annotation on method level. 10 | */ 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Target(ElementType.METHOD) 13 | public @interface MethodAnnotation { 14 | 15 | Class value(); 16 | } 17 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/MethodAnnotationValueType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class MethodAnnotationValueType { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/MethodException.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class MethodException extends Exception { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/MethodParameter.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class MethodParameter { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/MethodParameterTypeParameter.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class MethodParameterTypeParameter { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/MethodReturnType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class MethodReturnType { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/MethodReturnTypeParameter.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class MethodReturnTypeParameter { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/SuperClass.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | /** 4 | * A super class. 5 | */ 6 | public class SuperClass { 7 | } 8 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/SuperClassTypeParameter.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class SuperClassTypeParameter { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/TypeAnnotation.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * An annotation on types level. 10 | */ 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Target(ElementType.TYPE) 13 | public @interface TypeAnnotation { 14 | 15 | Class value(); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/dependency/types/TypeAnnotationValueType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.dependency.types; 2 | 3 | public class TypeAnnotationValueType { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/deprecated/DeprecatedType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.deprecated; 2 | 3 | @Deprecated 4 | public class DeprecatedType { 5 | 6 | @Deprecated 7 | private int value; 8 | 9 | @Deprecated 10 | public int getValue() { 11 | return value; 12 | } 13 | 14 | @Deprecated 15 | public void setValue(@Deprecated int value) { 16 | this.value = value; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/deprecated/package-info.java: -------------------------------------------------------------------------------- 1 | @Deprecated 2 | package com.buschmais.jqassistant.plugin.java.test.set.rules.deprecated; -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/exception/FirstLevelError.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.exception; 2 | 3 | public class FirstLevelError extends Error { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/exception/FirstLevelException.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.exception; 2 | 3 | public class FirstLevelException extends Exception { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/exception/FirstLevelRuntimeException.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.exception; 2 | 3 | public class FirstLevelRuntimeException extends RuntimeException { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/exception/FirstLevelThrowable.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.exception; 2 | 3 | public class FirstLevelThrowable extends Throwable { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/exception/SecondLevelError.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.exception; 2 | 3 | public class SecondLevelError extends FirstLevelError { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/exception/SecondLevelException.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.exception; 2 | 3 | public class SecondLevelException extends FirstLevelException { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/exception/SecondLevelRuntimeException.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.exception; 2 | 3 | public class SecondLevelRuntimeException extends FirstLevelRuntimeException { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/exception/SecondLevelThrowable.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.exception; 2 | 3 | public class SecondLevelThrowable extends FirstLevelThrowable { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/generated/Generated.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.generated; 2 | 3 | @javax.annotation.Generated("test") 4 | public class Generated { 5 | } 6 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/generated/NotGenerated.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.generated; 2 | 3 | public class NotGenerated { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/inheritance/AbstractClassType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.inheritance; 2 | 3 | public abstract class AbstractClassType implements InterfaceType { 4 | 5 | protected int abstractClassField; 6 | 7 | protected int overriddenAbstractClassField; 8 | 9 | @Override 10 | public void method() { 11 | abstractClassField = 0; 12 | overriddenAbstractClassField = 0; 13 | } 14 | 15 | @Override 16 | public final void abstractClassMethod() { 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/inheritance/ClientType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.inheritance; 2 | 3 | public class ClientType { 4 | 5 | private SubClassType subClassType = new SubClassType(); 6 | 7 | private AbstractClassType abstractClassType = subClassType; 8 | 9 | private InterfaceType interfaceType = subClassType; 10 | 11 | public void methodOnInterfaceType() { 12 | interfaceType.method(); 13 | } 14 | 15 | public void methodOnAbstractClassType() { 16 | abstractClassType.method(); 17 | } 18 | 19 | public void methodOnSubClassType() { 20 | subClassType.method(); 21 | } 22 | 23 | public void abstractClassMethodOnInterfaceType() { 24 | interfaceType.abstractClassMethod(); 25 | } 26 | 27 | public void abstractClassMethodOnAbstractClassType() { 28 | abstractClassType.abstractClassMethod(); 29 | } 30 | 31 | public void abstractClassMethodOnSubType() { 32 | subClassType.abstractClassMethod(); 33 | } 34 | 35 | public void subClassMethodOnInterfaceType() { 36 | interfaceType.subClassMethod(); 37 | } 38 | 39 | public void subClassMethodOnAbstractClassType() { 40 | abstractClassType.subClassMethod(); 41 | } 42 | 43 | public void subClassMethodOnSubType() { 44 | subClassType.subClassMethod(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/inheritance/InterfaceType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.inheritance; 2 | 3 | public interface InterfaceType { 4 | 5 | void method(); 6 | 7 | void abstractClassMethod(); 8 | 9 | void subClassMethod(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/inheritance/SubClassType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.inheritance; 2 | 3 | public class SubClassType extends AbstractClassType { 4 | 5 | private int overriddenAbstractClassField; 6 | 7 | private int subClassField; 8 | 9 | @Override 10 | public void method() { 11 | super.method(); // must not create a VIRTUAL_INVOKES on this method 12 | abstractClassField = 0; 13 | overriddenAbstractClassField = 0; 14 | subClassField = 0; 15 | } 16 | 17 | @Override 18 | public final void subClassMethod() { 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/innertype/OuterType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.innertype; 2 | 3 | import java.util.Comparator; 4 | 5 | public class OuterType { 6 | 7 | public class InnerClass { 8 | } 9 | 10 | public enum InnerEnum { 11 | } 12 | 13 | public interface InnerInterface { 14 | } 15 | 16 | public @interface InnerAnnotation { 17 | } 18 | 19 | public void doSomething() { 20 | Comparator comparator = new Comparator() { 21 | @Override 22 | public int compare(Object o1, Object o2) { 23 | return 0; 24 | } 25 | }; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/java/DefaultMethod.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.java; 2 | 3 | /** 4 | * An interface defining a default method. 5 | */ 6 | public interface DefaultMethod { 7 | 8 | default int add(int a, int b) { 9 | return a + b; 10 | } 11 | 12 | int sub(int a, int b); 13 | } 14 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/java/FunctionalInterface.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.java; 2 | 3 | /** 4 | * A functional interface. 5 | */ 6 | @java.lang.FunctionalInterface 7 | public interface FunctionalInterface { 8 | 9 | int add(int a, int b); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/java/FunctionalInterfaceWithoutAnnotation.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.java; 2 | 3 | /** 4 | * A functional interface without the {@linkplain java.lang.FunctionalInterface} 5 | * annotation. 6 | */ 7 | public interface FunctionalInterfaceWithoutAnnotation { 8 | 9 | int add(int a, int b); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/java/LambdaMethod.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.java; 2 | 3 | import java.util.stream.Stream; 4 | 5 | public class LambdaMethod { 6 | 7 | public void withLambda() { 8 | Stream.of("Hello", "World").forEach(s -> System.out.println(s)); 9 | } 10 | 11 | public void withMethodReference() { 12 | Stream.of("Hello", "World").forEach(System.out::println); 13 | } 14 | 15 | public void withoutLambda() { 16 | System.out.println("Hello World!"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/java/MarkerInterface.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.java; 2 | 3 | public class MarkerInterface { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/java/NonFunctionalInterface.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.java; 2 | 3 | /** 4 | * A non-functional interface. 5 | */ 6 | public interface NonFunctionalInterface { 7 | int add(int a, int b); 8 | 9 | int sub(int a, int c); 10 | } 11 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/lifecycleannotation/ManagedResource.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.lifecycleannotation; 2 | 3 | import javax.annotation.PostConstruct; 4 | import javax.annotation.PreDestroy; 5 | 6 | public class ManagedResource { 7 | 8 | @PostConstruct 9 | public void postConstruct() { 10 | 11 | } 12 | 13 | @PreDestroy 14 | public void preDestroy() { 15 | 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/lombok/Person.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.lombok; 2 | 3 | import lombok.Builder; 4 | 5 | @Builder 6 | public class Person { 7 | } 8 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/lombok/lombok.config: -------------------------------------------------------------------------------- 1 | lombok.addLombokGeneratedAnnotation=true 2 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/methodoverloads/InterfaceType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.methodoverloads; 2 | 3 | import com.buschmais.jqassistant.plugin.java.test.set.rules.virtualdependson.ClassType; 4 | import com.buschmais.jqassistant.plugin.java.test.set.rules.virtualdependson.SubClassType; 5 | 6 | /** 7 | * An interface type. 8 | */ 9 | public interface InterfaceType { 10 | 11 | void doSomething(String value); 12 | 13 | void doSomething(int value); 14 | 15 | /** 16 | * Only declared in {@link InterfaceType} and {@link ClassType}, not overridden 17 | * by {@link SubClassType}. 18 | */ 19 | void doSomething(boolean value); 20 | } 21 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/packageannotation/PackageClass.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.packageannotation; 2 | 3 | public class PackageClass { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/packageannotation/package-info.java: -------------------------------------------------------------------------------- 1 | @Deprecated 2 | package com.buschmais.jqassistant.plugin.java.test.set.rules.packageannotation; 3 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/virtualdependson/ClassType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.virtualdependson; 2 | 3 | /** 4 | * A class type. 5 | */ 6 | public class ClassType implements InterfaceType { 7 | 8 | @Override 9 | public void doSomething() { 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/virtualdependson/ClassTypeClient.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.virtualdependson; 2 | 3 | public class ClassTypeClient { 4 | 5 | public void invokeClassTypeMethod(ClassType classType) { 6 | classType.doSomething(); 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/virtualdependson/InterfaceType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.virtualdependson; 2 | 3 | /** 4 | * An interface type. 5 | */ 6 | public interface InterfaceType { 7 | 8 | void doSomething(); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/virtualdependson/InterfaceTypeClient.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.virtualdependson; 2 | 3 | public class InterfaceTypeClient { 4 | 5 | public void invokeInterfaceTypeMethod(InterfaceType interfaceType) { 6 | interfaceType.doSomething(); 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/rules/virtualdependson/SubClassType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.rules.virtualdependson; 2 | 3 | /** 4 | * A sub class type. 5 | */ 6 | public class SubClassType extends ClassType { 7 | 8 | @Override 9 | public void doSomething() { 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/annotation/AnnotatedType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.annotation; 2 | 3 | /** 4 | * An annotated type. 5 | */ 6 | @Annotation(value = "class", arrayValue = { "a", "b" }, classValue = Number.class, enumerationValue = Enumeration.NON_DEFAULT, nestedAnnotationValue = @NestedAnnotation("nestedClass"), nestedAnnotationValues = @NestedAnnotation("nestedClasses")) 7 | public class AnnotatedType { 8 | 9 | @Annotation(value = "field") 10 | private String annotatedField; 11 | 12 | @Annotation("method") 13 | public void annotatedMethod(@Annotation("parameter") String parameter) { 14 | @SuppressWarnings("unused") 15 | @Annotation("localField") 16 | String annotatedLocalField = "value"; 17 | } 18 | 19 | public class GenericInnerAnnotatedType { 20 | /** 21 | * Defines a generic constructor with an annotated parameter. 22 | * 23 | * @param parameter 24 | * The parameter. 25 | */ 26 | public GenericInnerAnnotatedType(@Annotation("parameter") T parameter) { 27 | } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/annotation/Annotation.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.annotation; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | import static com.buschmais.jqassistant.plugin.java.test.set.scanner.annotation.Enumeration.DEFAULT; 7 | 8 | /** 9 | * An annotation containing values of all supported types. 10 | */ 11 | @Retention(RetentionPolicy.RUNTIME) 12 | public @interface Annotation { 13 | 14 | String value(); 15 | 16 | String[] arrayValue() default {}; 17 | 18 | Class classValue() default Object.class; 19 | 20 | Enumeration enumerationValue() default DEFAULT; 21 | 22 | NestedAnnotation nestedAnnotationValue() default @NestedAnnotation("default"); 23 | 24 | NestedAnnotation[] nestedAnnotationValues() default @NestedAnnotation("default"); 25 | } 26 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/annotation/AnnotationWithDefaultValue.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.annotation; 2 | 3 | /** 4 | * Defines an annotation with a value having a default. 5 | */ 6 | public @interface AnnotationWithDefaultValue { 7 | 8 | Class classValue() default Number.class; 9 | 10 | Enumeration enumerationValue() default Enumeration.DEFAULT; 11 | 12 | double primitiveValue() default 0; 13 | 14 | Class[] arrayValue() default { Integer.class, Double.class }; 15 | 16 | NestedAnnotation annotationValue() default @NestedAnnotation("test"); 17 | } 18 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/annotation/Enumeration.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.annotation; 2 | 3 | /** 4 | * An enumeration. 5 | */ 6 | public enum Enumeration { 7 | DEFAULT, NON_DEFAULT; 8 | } 9 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/annotation/NestedAnnotation.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.annotation; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | /** 7 | * A annotation which will be nested in {@link Annotation}. 8 | */ 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface NestedAnnotation { 11 | 12 | String value(); 13 | } 14 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/array/Array.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.array; 2 | 3 | /** 4 | * A types containing a string array. 5 | */ 6 | public class Array { 7 | 8 | private String[] stringArray; 9 | 10 | public String[] getStringArray() { 11 | return stringArray; 12 | } 13 | 14 | public void setStringArray(String[] stringArray) { 15 | this.stringArray = stringArray; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/constructor/ImplicitDefaultConstructor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.constructor; 2 | 3 | /** 4 | * A class with no explicit defined constructor. 5 | */ 6 | public class ImplicitDefaultConstructor { 7 | } 8 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/constructor/OverloadedConstructor.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.constructor; 2 | 3 | /** 4 | * A class with an explicit default and an overloaded constructor. 5 | */ 6 | public class OverloadedConstructor { 7 | 8 | public OverloadedConstructor() { 9 | } 10 | 11 | public OverloadedConstructor(String value) { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/enumeration/EnumerationType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.enumeration; 2 | 3 | /** 4 | * An enum type. 5 | */ 6 | public enum EnumerationType { 7 | 8 | A(true), B(false); 9 | 10 | @SuppressWarnings("unused") 11 | private boolean value; 12 | 13 | EnumerationType(boolean value) { 14 | this.value = value; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/fieldvalue/FieldValue.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.fieldvalue; 2 | 3 | public class FieldValue { 4 | 5 | private static final String stringValue = "StringValue"; 6 | 7 | private static final int longValue = 1; 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/ExtendsGeneric.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics; 2 | 3 | import java.util.AbstractList; 4 | 5 | public class ExtendsGeneric extends AbstractList { 6 | 7 | @Override 8 | public String get(int index) { 9 | return null; 10 | } 11 | 12 | @Override 13 | public int size() { 14 | return 0; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/GenericFields.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics; 2 | 3 | import java.util.HashMap; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | public class GenericFields { 8 | 9 | private X typeVariable; 10 | 11 | private X[] arrayOfTypeVariable; 12 | 13 | private Map parameterizedType; 14 | 15 | private List> nestedParameterizedType; 16 | 17 | private List upperBoundWildcard; 18 | 19 | private List lowerBoundWildcard; 20 | 21 | private List unboundWildcard; 22 | 23 | private List arrayOfPrimitive; 24 | 25 | public void method() { 26 | Map parameterizedType = new HashMap<>(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/GenericMethods.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics; 2 | 3 | import java.io.IOException; 4 | 5 | public class GenericMethods { 6 | 7 | void genericParameter(X x) { 8 | } 9 | 10 | X genericReturnType() { 11 | return null; 12 | } 13 | 14 | void genericException() throws E { 15 | } 16 | 17 | X overwriteTypeParameter() { 18 | return null; 19 | } 20 | 21 | void genericVariable() { 22 | X x = null; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/GenericTypeDeclarations.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | 6 | /** 7 | * Provides structures for type parameters on outer and inner classes. 8 | */ 9 | public class GenericTypeDeclarations> { 10 | 11 | private X x; 12 | 13 | private Y y; 14 | 15 | public class Inner extends GenericTypeDeclarations { 16 | 17 | /** 18 | * References the inner class parameter 19 | */ 20 | private X x; 21 | 22 | /** 23 | * References the outer class parameter, will be required 24 | */ 25 | private Y y; 26 | 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/ImplementsGeneric.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics; 2 | 3 | import java.util.List; 4 | 5 | public interface ImplementsGeneric extends List { 6 | } 7 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/dependson/BoundGenericMethod.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics.dependson; 2 | 3 | public class BoundGenericMethod { 4 | 5 | X get(X value) { 6 | return null; 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/dependson/BoundGenericType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics.dependson; 2 | 3 | public class BoundGenericType { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/dependson/ExtendsGenericClass.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics.dependson; 2 | 3 | public abstract class ExtendsGenericClass extends GenericType { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/dependson/GenericMembers.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics.dependson; 2 | 3 | import java.util.List; 4 | import java.util.Set; 5 | 6 | public class GenericMembers { 7 | 8 | @SuppressWarnings("unused") 9 | private List integerList; 10 | 11 | Set get(List value) { 12 | return null; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/dependson/GenericType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics.dependson; 2 | 3 | public class GenericType { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/dependson/ImplementsGenericInterface.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics.dependson; 2 | 3 | public abstract class ImplementsGenericInterface implements Iterable { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/dependson/NestedGenericMethod.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics.dependson; 2 | 3 | public class NestedGenericMethod { 4 | 5 | > X get(Y value) { 6 | return null; 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/generics/dependson/NestedGenericType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.generics.dependson; 2 | 3 | public class NestedGenericType> { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/inheritance/SubInterface.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.inheritance; 2 | 3 | public interface SubInterface extends SuperInterface { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/inheritance/SuperInterface.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.inheritance; 2 | 3 | /** 4 | * Created by dimahler on 7/7/2014. 5 | */ 6 | public interface SuperInterface { 7 | } 8 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/innerclass/AnonymousInnerClass.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.innerclass; 2 | 3 | import java.util.Iterator; 4 | 5 | /** 6 | * Created with IntelliJ IDEA. User: Dirk Mahler Date: 03.07.13 Time: 08:52 To 7 | * change this template use File | Settings | File Templates. 8 | */ 9 | public class AnonymousInnerClass { 10 | 11 | public Iterator iterator() { 12 | return new Iterator() { 13 | @Override 14 | public boolean hasNext() { 15 | return false; 16 | } 17 | 18 | @Override 19 | public X next() { 20 | return null; 21 | } 22 | 23 | @Override 24 | public void remove() { 25 | } 26 | }; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/innerclass/NestedInnerClasses.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.innerclass; 2 | 3 | public class NestedInnerClasses { 4 | 5 | public void doSomething() { 6 | new FirstLevel().doSomething(); 7 | } 8 | 9 | public class FirstLevel { 10 | 11 | public void doSomething() { 12 | new SecondLevel().doSomething(); 13 | } 14 | 15 | public class SecondLevel { 16 | 17 | public void doSomething() { 18 | } 19 | 20 | } 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/metric/CyclomaticComplexityType.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.metric; 2 | 3 | import java.io.FileInputStream; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | 7 | /** 8 | * Defines a class for verifying calculation of cyclomatic complexity metrics of 9 | * the class scanner. 10 | */ 11 | public class CyclomaticComplexityType { 12 | 13 | public CyclomaticComplexityType() { 14 | } 15 | 16 | public void ifStatement(boolean value) { 17 | if (value) { 18 | System.out.println("if"); 19 | } else { 20 | System.out.println("else"); 21 | } 22 | } 23 | 24 | public void caseStatement(int value) { 25 | switch (value) { 26 | case 0: 27 | System.out.println("0"); 28 | break; 29 | case 1: 30 | System.out.println("1"); 31 | break; 32 | default: 33 | System.out.println("default"); 34 | } 35 | } 36 | 37 | public void tryCatch() { 38 | System.out.println("before"); 39 | try { 40 | System.out.println("try"); 41 | } catch (IllegalStateException e) { 42 | throw new RuntimeException(e); 43 | } finally { 44 | System.out.println("finally"); 45 | } 46 | System.out.println("after"); 47 | } 48 | 49 | public void nestedTryCatch() { 50 | System.out.println("before"); 51 | try { 52 | try { 53 | System.out.println("try"); 54 | } catch (IllegalStateException e) { 55 | throw new RuntimeException(e); 56 | } finally { 57 | System.out.println("finally"); 58 | } 59 | } catch (IllegalArgumentException e) { 60 | throw new RuntimeException(e); 61 | } 62 | System.out.println("after"); 63 | } 64 | 65 | public void tryWithResources() { 66 | System.out.println("before"); 67 | try (InputStream is = new FileInputStream("test")) { 68 | System.out.println("try"); 69 | } catch (IOException e) { 70 | throw new RuntimeException(e); 71 | } 72 | System.out.println("after"); 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/pojo/Pojo.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.pojo; 2 | 3 | public class Pojo { 4 | 5 | private String stringValue; 6 | 7 | private int intValue; 8 | 9 | public String getStringValue() { 10 | return stringValue; 11 | } 12 | 13 | public void setStringValue(String stringValue) { 14 | this.stringValue = stringValue; 15 | } 16 | 17 | public int getIntValue() { 18 | return intValue; 19 | } 20 | 21 | public void setIntValue(int intValue) { 22 | this.intValue = intValue; 23 | } 24 | 25 | @Override 26 | public boolean equals(Object o) { 27 | if (this == o) { 28 | return true; 29 | } 30 | if (o == null || getClass() != o.getClass()) { 31 | return false; 32 | } 33 | // this is a line not containing any code to verify effectiveLineCount metric 34 | Pojo pojo = (Pojo) o; 35 | if (intValue != pojo.intValue) { 36 | return false; 37 | } 38 | return stringValue != null ? stringValue.equals(pojo.stringValue) : pojo.stringValue == null; 39 | } 40 | 41 | @Override 42 | public int hashCode() { 43 | int result = stringValue != null ? stringValue.hashCode() : 0; 44 | result = 31 * result + intValue; 45 | return result; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/resolver/A.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.resolver; 2 | 3 | /** 4 | * A test class. 5 | */ 6 | public class A { 7 | } 8 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/resolver/B.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.resolver; 2 | 3 | /** 4 | * A test class with a dependency. 5 | */ 6 | public class B { 7 | 8 | private A a; 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/serviceloader/OuterClass.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.serviceloader; 2 | 3 | public class OuterClass { 4 | 5 | public static class InnerClassServiceImpl implements Service { 6 | 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/serviceloader/Service.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.serviceloader; 2 | 3 | /** 4 | * A service definition. 5 | */ 6 | public interface Service { 7 | } 8 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/serviceloader/ServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.serviceloader; 2 | 3 | /** 4 | * A service implementation. 5 | */ 6 | public class ServiceImpl implements Service { 7 | } 8 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/suppress/Suppress.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.suppress; 2 | 3 | import com.buschmais.jqassistant.plugin.java.api.annotation.jQASuppress; 4 | 5 | @jQASuppress(value = "suppress:Class", reason = "For testing this annotation") 6 | public class Suppress { 7 | 8 | @jQASuppress({ "suppress:Field" }) 9 | private String value; 10 | 11 | @jQASuppress(value = { "suppress:Method", "suppress:MethodInPrimaryColumn", "suppress:MethodInNonPrimaryColumn" }, column = "method") 12 | public void doSomething() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/test/java/com/buschmais/jqassistant/plugin/java/test/set/scanner/vsibility/Public.java: -------------------------------------------------------------------------------- 1 | package com.buschmais.jqassistant.plugin.java.test.set.scanner.vsibility; 2 | 3 | public class Public { 4 | 5 | public int field; 6 | 7 | public void method() { 8 | } 9 | 10 | class Default { 11 | int field; 12 | 13 | void method() { 14 | } 15 | } 16 | 17 | protected class Protected { 18 | protected int field; 19 | 20 | protected void method() { 21 | } 22 | } 23 | 24 | @SuppressWarnings("unused") 25 | private class Private { 26 | private int field; 27 | 28 | private void method() { 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/test/resources/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Implementation-Vendor: buschmais GbR 3 | -------------------------------------------------------------------------------- /src/test/resources/META-INF/invalid.properties: -------------------------------------------------------------------------------- 1 | value=\uxxxx -------------------------------------------------------------------------------- /src/test/resources/META-INF/jqassistant-plugin.xml: -------------------------------------------------------------------------------- 1 | 3 | Provides concepts related to the JavaRuntime Test 4 | 5 | generated.xml 6 | javaruntime.xml 7 | suppress.xml 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/test/resources/META-INF/jqassistant-rules/generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Provide generated types by extending the concept "java:GeneratedType". 6 | (t:Type{fqn:"com.buschmais.jqassistant.plugin.java.test.set.rules.generated.Generated"}) 9 | SET 10 | t:Generated 11 | RETURN 12 | a, t 13 | ]]> 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/test/resources/META-INF/jqassistant-rules/javaruntime.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Creates the missing package structure of the JRE. 4 | (t:Type) 7 | WHERE 8 | t.fqn is not null 9 | WITH 10 | t, substring(t.fqn, 0, length(t.fqn)-length(t.name)-1) as packageName 11 | MERGE 12 | (p:Package{fqn:packageName}) 13 | MERGE 14 | (p)-[:CONTAINS]->(t) 15 | RETURN 16 | p.fqn, count(t) 17 | ]]> 18 | 19 | 20 | 21 | 22 | Creates the missing package structure of the JRE. 23 | (t1:Type), 26 | (p2:Package)-[:CONTAINS]->(t2:Type), 27 | (t1)-[typeDependsOn:DEPENDS_ON]->(t2) 28 | WHERE 29 | p1 <> p2 30 | WITH 31 | p1, p2, count(typeDependsOn) as weight, sum(typeDependsOn.weight) as aggregatedWeight 32 | MERGE 33 | (p1)-[packageDependsOn:DEPENDS_ON]->(p2) 34 | SET 35 | packageDependsOn.weight=weight, 36 | packageDependsOn.aggregatedWeight=aggregatedWeight 37 | RETURN 38 | p1.fqn, collect(p2.fqn) 39 | ]]> 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/test/resources/META-INF/services/com.buschmais.jqassistant.plugin.java.test.set.scanner.serviceloader.Service: -------------------------------------------------------------------------------- 1 | # A comment that needs to be ignored 2 | # Another comment that starts with a white space 3 | # The next line is just left empty 4 | 5 | com.buschmais.jqassistant.plugin.java.test.set.scanner.serviceloader.ServiceImpl 6 | com.buschmais.jqassistant.plugin.java.test.set.scanner.serviceloader.OuterClass$InnerClassServiceImpl 7 | -------------------------------------------------------------------------------- /src/test/resources/META-INF/test.properties: -------------------------------------------------------------------------------- 1 | foo=bar 2 | -------------------------------------------------------------------------------- /src/test/resources/com/buschmais/jqassistant/plugin/java/test/set/scanner/empty/readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jqassistant-archive/jqa-java-plugin/5d6a42c4cc6129c26c833b7609beb6464e656806/src/test/resources/com/buschmais/jqassistant/plugin/java/test/set/scanner/empty/readme.txt -------------------------------------------------------------------------------- /src/test/resources/set/scanner/propertyfiles/properties-2-props.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam 5 | nonumy eirmod tempor invidunt ut labore et 6 | dolore magna aliquyam erat, sed diam voluptua. 7 | 8 | valueA 9 | valueB 10 | -------------------------------------------------------------------------------- /src/test/resources/set/scanner/propertyfiles/properties-empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | --------------------------------------------------------------------------------