Full Code of sdaschner/jaxrs-analyzer for AI

master 4ac62942202d cached
317 files
972.9 KB
224.6k tokens
1901 symbols
1 requests
Download .txt
Showing preview only (1,088K chars total). Download the full file or copy to clipboard to get everything.
Repository: sdaschner/jaxrs-analyzer
Branch: master
Commit: 4ac62942202d
Files: 317
Total size: 972.9 KB

Directory structure:
gitextract_st1raaxs/

├── .gitignore
├── Changelog.adoc
├── Documentation.adoc
├── LICENSE
├── README.adoc
├── pom.xml
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── sebastian_daschner/
    │   │           └── jaxrs_analyzer/
    │   │               ├── JAXRSAnalyzer.java
    │   │               ├── LogProvider.java
    │   │               ├── Main.java
    │   │               ├── analysis/
    │   │               │   ├── JobRegistry.java
    │   │               │   ├── ProjectAnalyzer.java
    │   │               │   ├── bytecode/
    │   │               │   │   ├── BytecodeAnalyzer.java
    │   │               │   │   ├── MethodContentAnalyzer.java
    │   │               │   │   ├── ResourceMethodContentAnalyzer.java
    │   │               │   │   ├── SubResourceLocatorMethodContentAnalyzer.java
    │   │               │   │   ├── collection/
    │   │               │   │   │   └── InstructionBuilder.java
    │   │               │   │   ├── reduction/
    │   │               │   │   │   ├── InstructionFinder.java
    │   │               │   │   │   ├── RelevantInstructionReducer.java
    │   │               │   │   │   └── StackSizeSimulator.java
    │   │               │   │   └── simulation/
    │   │               │   │       ├── InjectableArgumentMethodSimulator.java
    │   │               │   │       ├── KnownJsonResultMethod.java
    │   │               │   │       ├── KnownResponseResultMethod.java
    │   │               │   │       ├── MethodPool.java
    │   │               │   │       └── MethodSimulator.java
    │   │               │   ├── classes/
    │   │               │   │   ├── ContextClassReader.java
    │   │               │   │   ├── JAXRSAnnotatedSuperMethodClassVisitor.java
    │   │               │   │   ├── JAXRSAnnotatedSuperMethodVisitor.java
    │   │               │   │   ├── JAXRSClassVisitor.java
    │   │               │   │   ├── JAXRSFieldVisitor.java
    │   │               │   │   ├── JAXRSMethodVisitor.java
    │   │               │   │   ├── ProjectMethodClassVisitor.java
    │   │               │   │   ├── ProjectMethodVisitor.java
    │   │               │   │   └── annotation/
    │   │               │   │       ├── ApplicationPathAnnotationVisitor.java
    │   │               │   │       ├── ClassAndMethodAnnotationVisitor.java
    │   │               │   │       ├── ConsumesAnnotationVisitor.java
    │   │               │   │       ├── DefaultValueAnnotationVisitor.java
    │   │               │   │       ├── ParamAnnotationVisitor.java
    │   │               │   │       ├── PathAnnotationVisitor.java
    │   │               │   │       ├── ProducesAnnotationVisitor.java
    │   │               │   │       └── ValueAnnotationVisitor.java
    │   │               │   ├── javadoc/
    │   │               │   │   ├── JavaDocAnalyzer.java
    │   │               │   │   ├── JavaDocParserVisitor.java
    │   │               │   │   └── ResponseCommentExtractor.java
    │   │               │   └── results/
    │   │               │       ├── DynamicTypeAnalyzer.java
    │   │               │       ├── JavaDocParameterResolver.java
    │   │               │       ├── JavaTypeAnalyzer.java
    │   │               │       ├── JsonMapper.java
    │   │               │       ├── PathNormalizer.java
    │   │               │       ├── ResponseTypeNormalizer.java
    │   │               │       ├── ResultInterpreter.java
    │   │               │       └── StringParameterResolver.java
    │   │               ├── backend/
    │   │               │   ├── Backend.java
    │   │               │   ├── ComparatorUtils.java
    │   │               │   ├── JsonRepresentationAppender.java
    │   │               │   ├── StringBackend.java
    │   │               │   ├── asciidoc/
    │   │               │   │   └── AsciiDocBackend.java
    │   │               │   ├── markdown/
    │   │               │   │   └── MarkdownBackend.java
    │   │               │   ├── plaintext/
    │   │               │   │   └── PlainTextBackend.java
    │   │               │   └── swagger/
    │   │               │       ├── DefinitionNameBuilder.java
    │   │               │       ├── SchemaBuilder.java
    │   │               │       ├── SwaggerBackend.java
    │   │               │       ├── SwaggerOptions.java
    │   │               │       └── SwaggerScheme.java
    │   │               ├── model/
    │   │               │   ├── JavaUtils.java
    │   │               │   ├── Types.java
    │   │               │   ├── elements/
    │   │               │   │   ├── Element.java
    │   │               │   │   ├── HttpResponse.java
    │   │               │   │   ├── JsonArray.java
    │   │               │   │   ├── JsonObject.java
    │   │               │   │   ├── JsonValue.java
    │   │               │   │   └── MethodHandle.java
    │   │               │   ├── instructions/
    │   │               │   │   ├── DefaultInstruction.java
    │   │               │   │   ├── DupInstruction.java
    │   │               │   │   ├── ExceptionHandlerInstruction.java
    │   │               │   │   ├── GetFieldInstruction.java
    │   │               │   │   ├── GetPropertyInstruction.java
    │   │               │   │   ├── GetStaticInstruction.java
    │   │               │   │   ├── Instruction.java
    │   │               │   │   ├── InvokeDynamicInstruction.java
    │   │               │   │   ├── InvokeInstruction.java
    │   │               │   │   ├── LoadInstruction.java
    │   │               │   │   ├── LoadStoreInstruction.java
    │   │               │   │   ├── LoadStoreInstructionPlaceholder.java
    │   │               │   │   ├── NewInstruction.java
    │   │               │   │   ├── PushInstruction.java
    │   │               │   │   ├── ReturnInstruction.java
    │   │               │   │   ├── SizeChangingInstruction.java
    │   │               │   │   ├── StoreInstruction.java
    │   │               │   │   └── ThrowInstruction.java
    │   │               │   ├── javadoc/
    │   │               │   │   ├── ClassComment.java
    │   │               │   │   ├── MemberComment.java
    │   │               │   │   ├── MemberParameterTag.java
    │   │               │   │   └── MethodComment.java
    │   │               │   ├── methods/
    │   │               │   │   ├── IdentifiableMethod.java
    │   │               │   │   ├── Method.java
    │   │               │   │   ├── MethodIdentifier.java
    │   │               │   │   └── ProjectMethod.java
    │   │               │   ├── rest/
    │   │               │   │   ├── HttpMethod.java
    │   │               │   │   ├── MethodParameter.java
    │   │               │   │   ├── ParameterType.java
    │   │               │   │   ├── Project.java
    │   │               │   │   ├── ResourceMethod.java
    │   │               │   │   ├── Resources.java
    │   │               │   │   ├── Response.java
    │   │               │   │   ├── TypeIdentifier.java
    │   │               │   │   ├── TypeRepresentation.java
    │   │               │   │   └── TypeRepresentationVisitor.java
    │   │               │   └── results/
    │   │               │       ├── ClassResult.java
    │   │               │       └── MethodResult.java
    │   │               └── utils/
    │   │                   ├── DebugUtils.java
    │   │                   ├── Pair.java
    │   │                   └── StringUtils.java
    │   └── resources/
    │       └── META-INF/
    │           └── services/
    │               └── com.sebastian_daschner.jaxrs_analyzer.backend.Backend
    └── test/
        ├── java/
        │   └── com/
        │       └── sebastian_daschner/
        │           ├── jaxrs_analyzer/
        │           │   ├── MainTest.java
        │           │   ├── analysis/
        │           │   │   ├── ProjectAnalyzerTest.java
        │           │   │   ├── bytecode/
        │           │   │   │   ├── SubResourceLocatorMethodContentAnalyzerTest.java
        │           │   │   │   ├── collection/
        │           │   │   │   │   ├── ByteCodeCollectorTest.java
        │           │   │   │   │   └── testclasses/
        │           │   │   │   │       ├── TestClass1.java
        │           │   │   │   │       ├── TestClass2.java
        │           │   │   │   │       ├── TestClass3.java
        │           │   │   │   │       ├── TestClass4.java
        │           │   │   │   │       ├── TestClass5.java
        │           │   │   │   │       ├── TestClass6.java
        │           │   │   │   │       ├── TestClass7.java
        │           │   │   │   │       ├── TestClass8.java
        │           │   │   │   │       └── TestClass9.java
        │           │   │   │   ├── reduction/
        │           │   │   │   │   ├── RelevantInstructionReducerTest.java
        │           │   │   │   │   └── testclasses/
        │           │   │   │   │       ├── TestClass1.java
        │           │   │   │   │       ├── TestClass10.java
        │           │   │   │   │       ├── TestClass2.java
        │           │   │   │   │       ├── TestClass3.java
        │           │   │   │   │       ├── TestClass4.java
        │           │   │   │   │       ├── TestClass5.java
        │           │   │   │   │       ├── TestClass6.java
        │           │   │   │   │       ├── TestClass7.java
        │           │   │   │   │       ├── TestClass8.java
        │           │   │   │   │       └── TestClass9.java
        │           │   │   │   └── subresource/
        │           │   │   │       ├── TestClass1.java
        │           │   │   │       ├── TestClass2.java
        │           │   │   │       ├── TestClass3.java
        │           │   │   │       ├── TestClass4.java
        │           │   │   │       └── TestClass5.java
        │           │   │   ├── classes/
        │           │   │   │   ├── JAXRSMethodVisitorTest.java
        │           │   │   │   ├── ResourceMethodContentAnalyzerTest.java
        │           │   │   │   └── testclasses/
        │           │   │   │       └── resource/
        │           │   │   │           ├── json/
        │           │   │   │           │   ├── TestClass1.java
        │           │   │   │           │   ├── TestClass10.java
        │           │   │   │           │   ├── TestClass2.java
        │           │   │   │           │   ├── TestClass3.java
        │           │   │   │           │   ├── TestClass4.java
        │           │   │   │           │   ├── TestClass5.java
        │           │   │   │           │   ├── TestClass6.java
        │           │   │   │           │   ├── TestClass7.java
        │           │   │   │           │   ├── TestClass8.java
        │           │   │   │           │   └── TestClass9.java
        │           │   │   │           ├── object/
        │           │   │   │           │   ├── TestClass1.java
        │           │   │   │           │   ├── TestClass10.java
        │           │   │   │           │   ├── TestClass11.java
        │           │   │   │           │   ├── TestClass12.java
        │           │   │   │           │   ├── TestClass13.java
        │           │   │   │           │   ├── TestClass14.java
        │           │   │   │           │   ├── TestClass2.java
        │           │   │   │           │   ├── TestClass3.java
        │           │   │   │           │   ├── TestClass4.java
        │           │   │   │           │   ├── TestClass5.java
        │           │   │   │           │   ├── TestClass6.java
        │           │   │   │           │   ├── TestClass7.java
        │           │   │   │           │   ├── TestClass8.java
        │           │   │   │           │   └── TestClass9.java
        │           │   │   │           └── response/
        │           │   │   │               ├── TestClass1.java
        │           │   │   │               ├── TestClass10.java
        │           │   │   │               ├── TestClass11.java
        │           │   │   │               ├── TestClass12.java
        │           │   │   │               ├── TestClass13.java
        │           │   │   │               ├── TestClass14.java
        │           │   │   │               ├── TestClass15.java
        │           │   │   │               ├── TestClass16.java
        │           │   │   │               ├── TestClass17.java
        │           │   │   │               ├── TestClass18.java
        │           │   │   │               ├── TestClass19.java
        │           │   │   │               ├── TestClass2.java
        │           │   │   │               ├── TestClass20.java
        │           │   │   │               ├── TestClass21.java
        │           │   │   │               ├── TestClass22.java
        │           │   │   │               ├── TestClass23.java
        │           │   │   │               ├── TestClass24.java
        │           │   │   │               ├── TestClass25.java
        │           │   │   │               ├── TestClass26.java
        │           │   │   │               ├── TestClass27.java
        │           │   │   │               ├── TestClass28.java
        │           │   │   │               ├── TestClass29.java
        │           │   │   │               ├── TestClass3.java
        │           │   │   │               ├── TestClass30.java
        │           │   │   │               ├── TestClass31.java
        │           │   │   │               ├── TestClass32.java
        │           │   │   │               ├── TestClass33.java
        │           │   │   │               ├── TestClass34.java
        │           │   │   │               ├── TestClass35.java
        │           │   │   │               ├── TestClass36.java
        │           │   │   │               ├── TestClass37.java
        │           │   │   │               ├── TestClass38.java
        │           │   │   │               ├── TestClass39.java
        │           │   │   │               ├── TestClass4.java
        │           │   │   │               ├── TestClass40.java
        │           │   │   │               ├── TestClass41.java
        │           │   │   │               ├── TestClass42.java
        │           │   │   │               ├── TestClass43.java
        │           │   │   │               ├── TestClass44.java
        │           │   │   │               ├── TestClass45.java
        │           │   │   │               ├── TestClass46.java
        │           │   │   │               ├── TestClass47.java
        │           │   │   │               ├── TestClass48.java
        │           │   │   │               ├── TestClass49.java
        │           │   │   │               ├── TestClass5.java
        │           │   │   │               ├── TestClass50.java
        │           │   │   │               ├── TestClass51.java
        │           │   │   │               ├── TestClass52.java
        │           │   │   │               ├── TestClass53.java
        │           │   │   │               ├── TestClass54.java
        │           │   │   │               ├── TestClass55.java
        │           │   │   │               ├── TestClass56.java
        │           │   │   │               ├── TestClass57.java
        │           │   │   │               ├── TestClass58.java
        │           │   │   │               ├── TestClass59.java
        │           │   │   │               ├── TestClass6.java
        │           │   │   │               ├── TestClass60.java
        │           │   │   │               ├── TestClass61.java
        │           │   │   │               ├── TestClass62.java
        │           │   │   │               ├── TestClass7.java
        │           │   │   │               ├── TestClass8.java
        │           │   │   │               └── TestClass9.java
        │           │   │   ├── javadoc/
        │           │   │   │   └── ResponseCommentExtractorTest.java
        │           │   │   ├── project/
        │           │   │   │   └── classes/
        │           │   │   │       ├── ClassAnalyzerTest.java
        │           │   │   │       └── testclasses/
        │           │   │   │           ├── TestClass1.java
        │           │   │   │           ├── TestClass10.java
        │           │   │   │           ├── TestClass11.java
        │           │   │   │           ├── TestClass12.java
        │           │   │   │           ├── TestClass13.java
        │           │   │   │           ├── TestClass14.java
        │           │   │   │           ├── TestClass15.java
        │           │   │   │           ├── TestClass16.java
        │           │   │   │           ├── TestClass2.java
        │           │   │   │           ├── TestClass3.java
        │           │   │   │           ├── TestClass4.java
        │           │   │   │           ├── TestClass5.java
        │           │   │   │           ├── TestClass6.java
        │           │   │   │           ├── TestClass7.java
        │           │   │   │           ├── TestClass8.java
        │           │   │   │           └── TestClass9.java
        │           │   │   ├── results/
        │           │   │   │   ├── DynamicTypeAnalyzerTest.java
        │           │   │   │   ├── JavaTypeAnalyzerTest.java
        │           │   │   │   ├── PathNormalizerTest.java
        │           │   │   │   ├── ResultInterpreterTest.java
        │           │   │   │   ├── TypeUtils.java
        │           │   │   │   └── testclasses/
        │           │   │   │       └── typeanalyzer/
        │           │   │   │           ├── TestClass1.java
        │           │   │   │           ├── TestClass10.java
        │           │   │   │           ├── TestClass11.java
        │           │   │   │           ├── TestClass12.java
        │           │   │   │           ├── TestClass13.java
        │           │   │   │           ├── TestClass14.java
        │           │   │   │           ├── TestClass15.java
        │           │   │   │           ├── TestClass16.java
        │           │   │   │           ├── TestClass17.java
        │           │   │   │           ├── TestClass18.java
        │           │   │   │           ├── TestClass19.java
        │           │   │   │           ├── TestClass2.java
        │           │   │   │           ├── TestClass20.java
        │           │   │   │           ├── TestClass21.java
        │           │   │   │           ├── TestClass22.java
        │           │   │   │           ├── TestClass23.java
        │           │   │   │           ├── TestClass24.java
        │           │   │   │           ├── TestClass25.java
        │           │   │   │           ├── TestClass26.java
        │           │   │   │           ├── TestClass27.java
        │           │   │   │           ├── TestClass28.java
        │           │   │   │           ├── TestClass29.java
        │           │   │   │           ├── TestClass3.java
        │           │   │   │           ├── TestClass30.java
        │           │   │   │           ├── TestClass4.java
        │           │   │   │           ├── TestClass5.java
        │           │   │   │           ├── TestClass6.java
        │           │   │   │           ├── TestClass7.java
        │           │   │   │           └── TestClass8.java
        │           │   │   └── utils/
        │           │   │       ├── JavaUtilSignatureTest.java
        │           │   │       ├── JavaUtilsTest.java
        │           │   │       └── TestClassUtils.java
        │           │   ├── backend/
        │           │   │   ├── JsonRepresentationAppenderTest.java
        │           │   │   ├── asciidoc/
        │           │   │   │   └── AsciiDocBackendTest.java
        │           │   │   ├── markdown/
        │           │   │   │   └── MarkdownBackendTest.java
        │           │   │   ├── plaintext/
        │           │   │   │   └── PlainTextBackendTest.java
        │           │   │   └── swagger/
        │           │   │       ├── SchemaBuilderTest.java
        │           │   │       ├── SwaggerBackendTest.java
        │           │   │       └── TypeIdentifierTestSupport.java
        │           │   ├── builder/
        │           │   │   ├── ClassResultBuilder.java
        │           │   │   ├── HttpResponseBuilder.java
        │           │   │   ├── MethodResultBuilder.java
        │           │   │   ├── ResourceMethodBuilder.java
        │           │   │   ├── ResourcesBuilder.java
        │           │   │   └── ResponseBuilder.java
        │           │   └── model/
        │           │       ├── rest/
        │           │       │   └── CollectionTypeRepresentationTest.java
        │           │       └── types/
        │           │           └── TypeTest.java
        │           └── test/
        │               ├── Enumeration.java
        │               └── Model.java
        └── jaxrs-test/
            └── com/
                └── sebastian_daschner/
                    └── jaxrs_test/
                        ├── AbstractResources.java
                        ├── ComplexResources.java
                        ├── Enumeration.java
                        ├── IgnoredTestResources.java
                        ├── JsonResources.java
                        ├── Manager.java
                        ├── Model.java
                        ├── ResourceWithoutClassLevelJavadoc.java
                        ├── Resources.java
                        ├── RestActivator.java
                        ├── SomeSubResource.java
                        ├── SubResources.java
                        ├── Test.java
                        ├── TestResources.java
                        └── TestStore.java

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml

*.iml
.idea/

*.class


================================================
FILE: Changelog.adoc
================================================
= Changelog
Sebastian Daschner

// new versions are placed on the top

== v0.18 SNAPSHOT

== v0.17
- Markdown support
- Added resource description in remaining backends
- Support to ignore JAX-RS boundary classes
- fixed minor JavaDoc issues

== v0.16
- Added AsciiDoc prettification
- Fixed error on empty application path
- Minor fixes

== v0.15
- Fixed JavaDoc erased types

== v0.14
- Fixed test related execution phase

== v0.13
- Improved class loading functionality while analyzing
- Support empty domain (https://github.com/sdaschner/jaxrs-analyzer/issues/42[#42^])
- Output dir is now editable in maven plugin (https://github.com/sdaschner/jaxrs-analyzer-maven-plugin/issues/13[#13^])
- Ignore properties in representations via Jackson annotations (https://github.com/sdaschner/jaxrs-analyzer/issues/87[#87^])

== v0.12
- Fixed JavaDoc related class loading

== v0.11
- Added JavaDoc analysis for JAX-RS resources
- Added backend SPI
- Improved path parameter resolution for extended path regexes
- Fixed local variable analysis for corner cases

== v0.10
- Changed internals to ASM
- Improved type analysis
- Improved analysis of POJO type inheritance
- Supported Swagger tags
- Added option to change Swagger schemes
- Supported `@DefaultValue`
- Improved entity body support for "`Stringifiable`" types
- Changed Swagger output to pretty printed JSON

== v0.9
- Enhanced type resolution for generic types and generic methods
- Improved Swagger type output
- Added actual type names to Swagger output
- Sorted Swagger JSON

== v0.8
- Improved type resolution for type arguments
- Fixed errors in swagger specification
- Fixed Maven plugin error on missing Java EE 7 dependency

== v0.7
- Restructured Java type representation
- Improved type resolution for nested JSR-353 calls
- Improved type analysis for nested & recursive types & methods
- Improved method resolution on inherited types
- Fixed CLI calls with relative paths

== v0.6
- Fixed class loading issue on Windows systems
- Fixed potential error on invoke interface in nested methods
- Added type workaround for Map request / response body types
- Fixed potential error when using `Stream#collect`

== v0.5
- Improved handling of abstract JAX-RS methods
- Added more functionality to the CLI tool (e.g. ability to specify several class paths)
- Changed CLI tool interface to convenient Unix-style parameters
- Added more log information -- especially on debug level

== v0.4
- Added AsciiDoc backend
- Improved variable type resolution
- Added WebApplicationException handling (thrown WAE's in the code are recognized for the result)
- Improved `void` method analysis
- Added project information (name, version, etc.) to backends

== v0.3
- Improved POJO getter analysis for return types (e.g. isXY() -> boolean, etc.)
- Added JDK 1.8 Streams as known methods (analysis will notice and simulate these)
- Improved JAXB analysis of POJOs (all `XmlAccessorType's`, `XmlElement` and `XmlTransient` supported)

== v0.2
- Minor updated needed for Sonatype release

== v0.1
- JAX-RS 2.0 annotations analysis
- `Response` return types analysis (determines where the returned objects ``come from'', follows method invocations, actual arguments, etc.)
- JSON-P API analysis (e.g. methods with return type `JsonObject` or JSON-P contained in `Response#entity()`)
- Analysis of POJO responses
- JAXB analysis of POJOs (only `XmlAccessorType#PUBLIC_MEMBER`)
- JDK 1.8 lambdas analysis
- Swagger API JSON backend format
- Plain text backend format


================================================
FILE: Documentation.adoc
================================================
= JAX-RS Analyzer
Sebastian Daschner

The JAX-RS Analyzer generates an overview of all JAX-RS resources in a JavaEE project.
Besides other approaches this tool uses Bytecode analysis to maximise the extracted information.

The Analyzer is available as https://github.com/sdaschner/jaxrs-analyzer-maven-plugin/[Maven plugin] or standalone version (executable jar file).

== Quickstart (tl;dr)
Just add the latest release version of the JAX-RS Analyzer to your Maven pom.xml in the `<plugins>`-section:

----
<plugin>
    <groupId>com.sebastian-daschner</groupId>
    <artifactId>jaxrs-analyzer-maven-plugin</artifactId>
    <version>0.17</version>
    <executions>
        <execution>
            <goals>
                <goal>analyze-jaxrs</goal>
            </goals>
            <configuration>
                <backend>swagger</backend>
            </configuration>
        </execution>
    </executions>
</plugin>
----

For an introductional video see https://blog.sebastian-daschner.com/entries/jaxrs_analyzer_explained_video[JAX-RS Analyzer explained (Video)].

== Maven Plugin
Please see the https://github.com/sdaschner/jaxrs-analyzer-maven-plugin[Maven plugin project] and a https://github.com/sdaschner/jaxrs-analyzer-maven-plugin/blob/master/Documentation.adoc[documentation] of all parameters.

== Standalone
Instead of using the Maven plugin, the tool can also run directly from the jar file.

You can download the latest version https://github.com/sdaschner/jaxrs-analyzer/releases[here].
Alternatively the executable can be build with `mvn clean install`.

Run the jar file with `java -jar jaxrs-analyzer.jar [options] <projectPathToCompiledClasses> [projectPathToCompiledClasses...]`, e.g. `java -jar jaxrs-analyzer.jar -b swagger ../yourProject/target/classes`.

The `projectPath` entries may be directories or jar files containing the classes to be analyzed.

Following available options:

* `-b <backend>` The backend to choose: `swagger` (default), `plaintext`, `asciidoc`, `markdown`
* `-cp <class path>[:class paths...]` The additional class paths containing classes which are used in the project (separated by colon); this may be directories or jar-files
* `-X` Debug enabled (prints error debugging information on Standard error out)
* `-n <project name>` The name of the project
* `-v <project version>` The version of the project
* `-d <project domain>` The domain of the project
* `-o <output file>` The location of the analysis output (will be printed to standard out if omitted)

Following available backend specific options (only have effect if the corresponding backend is selected):

* `--swaggerSchemes <scheme>[,schemes]` The Swagger schemes: `http` (default), `https`, `ws`, `wss`
* `--renderSwaggerTags` Enables rendering of Swagger tags (default tag will be used per default)
* `--swaggerTagsPathOffset <path offset>` The number at which path position the Swagger tags will be extracted (0 will be used per default)
* `--ignoredRootResources <fully qualified classname [class,...]>` JAX-RS root resource classes which should be ignored by analyze (empty per default). Note that these ignores only cause the classes to be ignored as root resources; they might still be taken into account as JAX-RS sub-resources.

== Backends
The Analyzer supports Plaintext, AsciiDoc, Markdown and Swagger as output format.
The latter three can be processed further.

AsciiDoc and Markdown are human-readable, lightweight markup languages.
They can easily converted to PDF, HTML, and many more.

The Swagger JSON file can be used with Swagger UI or the http://editor.swagger.io[Swagger Editor].

 Swagger UI is a dependency-free collection of HTML, Javascript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API.

== Changelog
For the latest changes see the https://github.com/sdaschner/jaxrs-analyzer/blob/master/Changelog.adoc[Changelog].

== Contributing
Feedback, bug reports and ideas for improvement are very welcome! Feel free to fork, comment, file an issue, etc. ;-)


================================================
FILE: LICENSE
================================================
Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2015 Sebastian Daschner

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.



================================================
FILE: README.adoc
================================================
= JAX-RS Analyzer
Sebastian Daschner

Generates an overview of all JAX-RS resources in a project by bytecode analysis.

*Yet another such JAX-RS tool?* +
Yes, but this gathers the information about the JAX-RS resource classes by bytecode analysis (not just by reflection).
This gains more information in several situations. You don't need additional annotations on your JAX-RS resource methods.
Using the JSR 339 standard is sufficient.

Java 8 is needed for the Analyzer.

For usage see the https://github.com/sdaschner/jaxrs-analyzer/blob/master/Documentation.adoc[documentation].

== Maven Plugin
The Analyzer can be added to your project via https://github.com/sdaschner/jaxrs-analyzer-maven-plugin[Maven plugin].

== Gradle Plugin
For `Gradle` based projects - third-party https://github.com/grimmjo/jaxrs-analyzer-gradle-plugin[Gradle plugin] could be used.

== Standalone
Instead of using the Maven plugin, the tool can also run directly from the jar file.
You can download the latest version https://github.com/sdaschner/jaxrs-analyzer/releases[here].

== Backends
The Analyzer supports Plaintext, AsciiDoc, Markdown and Swagger as output format.

== Documentation / Feature list
+...+ can be found https://github.com/sdaschner/jaxrs-analyzer/blob/master/Documentation.adoc[here].

Feedback, bug reports and ideas for improvement are very welcome! Feel free to fork, comment, file an issue, etc. ;-)


================================================
FILE: pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sebastian-daschner</groupId>
    <artifactId>jaxrs-analyzer</artifactId>
    <version>0.18-SNAPSHOT</version>
    <name>JAX-RS Analyzer</name>
    <packaging>jar</packaging>

    <description>Generates REST documentation by analysing JAX-RS projects.</description>
    <url>https://github.com/sdaschner/jaxrs-analyzer</url>

    <licenses>
        <license>
            <name>The Apache License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
        </license>
    </licenses>

    <developers>
        <developer>
            <name>Sebastian Daschner</name>
            <organization>sebastian-daschner.com</organization>
            <organizationUrl>https://www.sebastian-daschner.com</organizationUrl>
        </developer>
    </developers>

    <dependencies>

        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.json</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
        <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
            <version>6.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm-util</artifactId>
            <version>6.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.5</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>1.10.19</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>net.jcip</groupId>
            <artifactId>jcip-annotations</artifactId>
            <version>1.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.github.javaparser</groupId>
            <artifactId>javaparser-core</artifactId>
            <version>3.5.3</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>jaxrs-analyzer</finalName>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.sebastian_daschner.jaxrs_analyzer.Main</mainClass>
                                </transformer>
                            </transformers>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>com/sun/javadoc/**</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.javadoc.failOnError>false</maven.javadoc.failOnError>
    </properties>

    <scm>
        <connection>scm:git:git@github.com:sdaschner/jaxrs-analyzer.git</connection>
        <developerConnection>scm:git:git@github.com:sdaschner/jaxrs-analyzer.git</developerConnection>
        <url>scm:git:git@github.com:sdaschner/jaxrs-analyzer.git</url>
        <tag>HEAD</tag>
    </scm>

    <distributionManagement>
        <snapshotRepository>
            <id>ossrh-snapshots</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
        </snapshotRepository>
        <repository>
            <id>ossrh</id>
            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
        </repository>
    </distributionManagement>

    <profiles>
        <profile>
            <id>release-sign-artifacts</id>
            <activation>
                <property>
                    <name>performRelease</name>
                    <value>true</value>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>3.0.1</version>
                        <executions>
                            <execution>
                                <id>attach-sources</id>
                                <goals>
                                    <goal>jar-no-fork</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <version>1.6</version>
                        <executions>
                            <execution>
                                <id>sign-artifacts</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-release-plugin</artifactId>
                        <version>2.5.3</version>
                        <configuration>
                            <tagNameFormat>v@{project.version}</tagNameFormat>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

</project>


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/JAXRSAnalyzer.java
================================================
package com.sebastian_daschner.jaxrs_analyzer;

import com.sebastian_daschner.jaxrs_analyzer.analysis.ProjectAnalyzer;
import com.sebastian_daschner.jaxrs_analyzer.backend.Backend;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.Project;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.Resources;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Path;
import java.util.*;
import java.util.stream.StreamSupport;

/**
 * Generates REST documentation of JAX-RS projects automatically by bytecode analysis.
 *
 * @author Sebastian Daschner
 */
public class JAXRSAnalyzer {

    private final Analysis analysis;

    /**
     * Constructs a JAX-RS Analyzer.
     */
    public JAXRSAnalyzer(Analysis analysis) {
        Objects.requireNonNull(analysis);
        Objects.requireNonNull(analysis.projectClassPaths);
        Objects.requireNonNull(analysis.projectSourcePaths);
        Objects.requireNonNull(analysis.classPaths);
        Objects.requireNonNull(analysis.projectName);
        Objects.requireNonNull(analysis.projectVersion);
        Objects.requireNonNull(analysis.backend);

        if (analysis.projectClassPaths.isEmpty())
            throw new IllegalArgumentException("At least one project path is mandatory");

        this.analysis = analysis;
    }

    /**
     * Analyzes the JAX-RS project at the class path and produces the output as configured.
     */
    public void analyze() {
        final Resources resources = new ProjectAnalyzer(analysis.classPaths)
                .analyze(analysis.projectClassPaths, analysis.projectSourcePaths, analysis.ignoredResources);

        if (resources.isEmpty()) {
            LogProvider.info("Empty JAX-RS analysis result, omitting output");
            return;
        }

        final Project project = new Project(analysis.projectName, analysis.projectVersion, resources);
        final byte[] output = analysis.backend.render(project);

        if (analysis.outputLocation != null) {
            outputToFile(output, analysis.outputLocation);
        } else {
            outputToConsole(output);
        }
    }

    private void outputToConsole(final byte[] output) {
        try {
            System.out.write(output);
            System.out.flush();
        } catch (IOException e) {
            LogProvider.error("Could not write the output, reason: " + e.getMessage());
            LogProvider.debug(e);
        }
    }

    private static void outputToFile(final byte[] output, final Path outputLocation) {
        try (final OutputStream stream = new FileOutputStream(outputLocation.toFile())) {
            stream.write(output);
            stream.flush();
        } catch (IOException e) {
            LogProvider.error("Could not write to the specified output location, reason: " + e.getMessage());
            LogProvider.debug(e);
        }
    }

    public static Backend constructBackend(final String backendType) {
        final ServiceLoader<Backend> backends = ServiceLoader.load(Backend.class);
        return StreamSupport.stream(backends.spliterator(), false)
                .filter(b -> backendType.equalsIgnoreCase(b.getName()))
                .findAny()
                .orElseThrow(() -> new IllegalArgumentException("Unknown backend type " + backendType));
    }

    public static class Analysis {

        private final Set<Path> projectClassPaths = new HashSet<>();
        private final Set<Path> projectSourcePaths = new HashSet<>();
        private final Set<Path> classPaths = new HashSet<>();
        private final Set<String> ignoredResources = new HashSet<>();
        private String projectName;
        private String projectVersion;
        private Path outputLocation;
        private Backend backend;

        public Set<Path> getProjectClassPaths() {
            return projectClassPaths;
        }

        public void addProjectClassPath(Path classPath) {
            projectClassPaths.add(classPath);
        }

        public void addProjectSourcePath(Path sourcePath) {
            projectSourcePaths.add(sourcePath);
        }

        public void addClassPath(Path classPath) {
            classPaths.add(classPath);
        }

        public void addIgnoredResource(String ignored) {
            ignoredResources.add(ignored);
        }

        public void configureBackend(Map<String, String> attributes) {
            if (backend != null)
                backend.configure(attributes);
        }

        public void setProjectName(String projectName) {
            this.projectName = projectName;
        }

        public void setProjectVersion(String projectVersion) {
            this.projectVersion = projectVersion;
        }

        public void setOutputLocation(Path outputLocation) {
            this.outputLocation = outputLocation;
        }

        public void setBackend(Backend backend) {
            this.backend = backend;
        }

        public Backend getBackend() {
            return backend;
        }
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/LogProvider.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.function.Consumer;

/**
 * Exposes functionality to replace / retrieve an external logger.
 *
 * @author Sebastian Daschner
 */
public final class LogProvider {

    private static Consumer<String> infoLogger = System.err::println;
    private static Consumer<String> debugLogger = s -> {
        // do nothing
    };
    private static Consumer<String> errorLogger = System.err::println;

    private LogProvider() {
        throw new UnsupportedOperationException();
    }

    /**
     * Injects an own info logger functionality. Overwrites the previously associated info logger.
     *
     * @param logger The new info logger
     */
    public static void injectInfoLogger(final Consumer<String> logger) {
        LogProvider.infoLogger = logger;
    }

    /**
     * Injects an own debug logger functionality. Overwrites the previously associated debug logger.
     *
     * @param logger The new debug logger
     */
    public static void injectDebugLogger(final Consumer<String> logger) {
        LogProvider.debugLogger = logger;
    }

    /**
     * Injects an own error logger functionality. Overwrites the previously associated error logger.
     *
     * @param logger The new error logger
     */
    public static void injectErrorLogger(final Consumer<String> logger) {
        LogProvider.errorLogger = logger;
    }

    /**
     * Logs a message to the configured info logger.
     *
     * @param message The message to log
     */
    public static void info(final String message) {
        infoLogger.accept(message);
    }

    /**
     * Logs a message to the configured debug logger.
     *
     * @param message The message to log
     */
    public static void debug(final String message) {
        debugLogger.accept(message);
    }

    /**
     * Logs the stacktrace of the throwable to the debug logger.
     *
     * @param throwable The throwable to log
     */
    public static void debug(final Throwable throwable) {
        final StringWriter errors = new StringWriter();
        throwable.printStackTrace(new PrintWriter(errors));
        debugLogger.accept(errors.toString());
    }

    /**
     * Logs a message to the configured error logger.
     *
     * @param message The message to log
     */
    public static void error(final String message) {
        errorLogger.accept(message);
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/Main.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.sebastian_daschner.jaxrs_analyzer;

import com.sebastian_daschner.jaxrs_analyzer.backend.Backend;
import com.sebastian_daschner.jaxrs_analyzer.backend.StringBackend;
import com.sebastian_daschner.jaxrs_analyzer.backend.swagger.SwaggerOptions;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Inspects the information of JAX-RS classes via bytecode analysis.
 *
 * @author Sebastian Daschner
 */
public class Main {

    private static final String DEFAULT_NAME = "project";
    private static final String DEFAULT_VERSION = "0.1-SNAPSHOT";
    private static final String DEFAULT_BACKEND = "swagger";
    private static final String COMMA_LIST_SEPARATOR = ",";

    private static final JAXRSAnalyzer.Analysis analysis = new JAXRSAnalyzer.Analysis();
    private static final Map<String, String> attributes = new HashMap<>();

    /**
     * Inspects JAX-RS projects and outputs the gathered information.
     * <p>
     * Argument usage: {@code [options] projectPath [projectPaths...]}
     * <p>
     * The {@code projectPath} entries may be directories or jar-files containing the classes to be analyzed
     * <p>
     * Following available options:
     * <ul>
     * <li>{@code -b backend} The backend to choose: {@code swagger} (default), {@code plaintext}, {@code asciidoc}, {@code markdown}</li>
     * <li>{@code -cp class path[:class paths...]} The additional class paths which contain classes which are used in the project</li>
     * <li>{@code -sp source path[:source paths...]} The optional source paths  needed for JavaDoc analysis</li>
     * <li>{@code -X} Debug enabled (prints error debugging information on Standard error out)</li>
     * <li>{@code -n project name} The name of the project</li>
     * <li>{@code -v project version} The version of the project</li>
     * <li>{@code -d project domain} The domain of the project</li>
     * <li>{@code -o output file} The location of the analysis output (will be printed to standard out if omitted)</li>
     * <li>{@code -e encoding} The source file encoding</li>
     * </ul>
     * <p>
     * Following available backend specific options (only have effect if the corresponding backend is selected):
     * <ul>
     * <li>{@code --swaggerSchemes scheme[,schemes]} The Swagger schemes: {@code http} (default), {@code https}, {@code ws}, {@code wss}")</li>
     * <li>{@code --renderSwaggerTags} Enables rendering of Swagger tags (will not be rendered per default)</li>
     * <li>{@code --swaggerTagsPathOffset path offset} The number at which path position the Swagger tags should be extracted ({@code 0} per default)</li>
     * <li>{@code --ignoredRootResources class[,classes]} JAX-RS root resource classes which should be ignored by analyze (empty per default)</li>
     * </ul>
     *
     * @param args The arguments
     */
    public static void main(final String... args) {
        if (args.length < 1) {
            printUsageAndExit();
        }

        try {
            setDefaults();
            extractArgs(args);
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage() + '\n');
            printUsageAndExit();
        }

        validateArgs();
        configureBackend();

        new JAXRSAnalyzer(analysis).analyze();
    }

    private static void setDefaults() {
        analysis.setProjectName(DEFAULT_NAME);
        analysis.setProjectVersion(DEFAULT_VERSION);
    }

    private static void extractArgs(String[] args) {
        try {
            for (int i = 0; i < args.length; i++) {
                if (args[i].startsWith("-")) {
                    switch (args[i]) {
                        case "-b":
                            analysis.setBackend(extractBackend(args[++i]));
                            break;
                        case "-cp":
                            extractClassPaths(args[++i]).forEach(analysis::addClassPath);
                            break;
                        case "-sp":
                            extractClassPaths(args[++i]).forEach(analysis::addProjectSourcePath);
                            break;
                        case "-X":
                            LogProvider.injectDebugLogger(System.err::println);
                            break;
                        case "-n":
                            analysis.setProjectName(args[++i]);
                            break;
                        case "-v":
                            analysis.setProjectVersion(args[++i]);
                            break;
                        case "-d":
                            attributes.put(SwaggerOptions.DOMAIN, args[++i]);
                            break;
                        case "-o":
                            analysis.setOutputLocation(Paths.get(args[++i]));
                            break;
                        case "-e":
                            System.setProperty("project.build.sourceEncoding", args[++i]);
                            break;
                        case "--swaggerSchemes":
                            attributes.put(SwaggerOptions.SWAGGER_SCHEMES, args[++i]);
                            break;
                        case "--renderSwaggerTags":
                            attributes.put(SwaggerOptions.RENDER_SWAGGER_TAGS, "true");
                            break;
                        case "--swaggerTagsPathOffset":
                            attributes.put(SwaggerOptions.SWAGGER_TAGS_PATH_OFFSET, args[++i]);
                            break;
                        case "--noInlinePrettify":
                            attributes.put(StringBackend.INLINE_PRETTIFY, "false");
                            break;
                        case "--ignoredRootResources":
                            extractList(args[++i]).forEach(analysis::addIgnoredResource);
                            break;
                        case "-a":
                            addAttribute(args[++i]);
                            break;
                        default:
                            throw new IllegalArgumentException("Unknown option " + args[i]);
                    }
                } else {
                    final Path path = Paths.get(args[i].replaceFirst("^~", System.getProperty("user.home")));
                    if (!path.toFile().exists()) {
                        System.err.println("Location " + path.toFile() + " doesn't exist\n");
                        printUsageAndExit();
                    }
                    analysis.addProjectClassPath(path);
                }
            }
        } catch (IndexOutOfBoundsException e) {
            throw new IllegalArgumentException("Please provide valid number of arguments");
        }
    }

    static Map<String, String> addAttribute(String attribute) {
        int separatorIndex = attribute.indexOf('=');

        if (separatorIndex < 0) {
            attributes.put(attribute, "");
        } else {
            attributes.put(attribute.substring(0, separatorIndex).trim(), attribute.substring(separatorIndex + 1).trim());
        }

        return attributes;
    }

    private static Backend extractBackend(final String name) {
        return JAXRSAnalyzer.constructBackend(name.toLowerCase());
    }

    private static List<Path> extractClassPaths(final String classPaths) {
        final List<Path> paths = Stream.of(classPaths.split(File.pathSeparator))
                .map(s -> s.replaceFirst("^~", System.getProperty("user.home")))
                .map(Paths::get).collect(Collectors.toList());
        paths.forEach(p -> {
            if (!p.toFile().exists()) {
                throw new IllegalArgumentException("Class path " + p.toFile() + " doesn't exist");
            }
        });
        return paths;
    }

    private static List<String> extractList(String list) {
        return Stream.of(list.split(COMMA_LIST_SEPARATOR))
                .map(String::trim)
                .filter(item -> !item.isEmpty())
                .collect(Collectors.toList());
    }

    private static void validateArgs() {
        if (analysis.getProjectClassPaths().isEmpty()) {
            System.err.println("Please provide at least one project path\n");
            printUsageAndExit();
        }
    }

    private static void configureBackend() {
        if (analysis.getBackend() == null)
            analysis.setBackend(JAXRSAnalyzer.constructBackend(DEFAULT_BACKEND));
        analysis.configureBackend(attributes);
    }

    private static void printUsageAndExit() {
        System.err.println("Usage: java -jar jaxrs-analyzer.jar [options] classPath [classPaths...]");
        System.err.println("The classPath entries may be directories or jar-files containing the classes to be analyzed\n");
        System.err.println("Following available options:\n");
        System.err.println(" -b <backend> The backend to choose: swagger (default), plaintext, asciidoc, markdown");
        System.err.println(" -cp <class path>[:class paths] Additional class paths (separated with colon) which contain classes used in the project (may be directories or jar-files)");
        System.err.println(" -sp <source path>[:source paths] Optional source paths (separated with colon) needed for JavaDoc analysis (may be directories or jar-files)");
        System.err.println(" -X Debug enabled (enabled error debugging information)");
        System.err.println(" -n <project name> The name of the project");
        System.err.println(" -v <project version> The version of the project");
        System.err.println(" -d <project domain> The domain of the project");
        System.err.println(" -o <output file> The location of the analysis output (will be printed to standard out if omitted)");
        System.err.println(" -a <attribute name>=<attribute value> Set custom attributes for backends.");
        System.err.println(" -e <encoding> The source file encoding");
        System.err.println("\nFollowing available backend specific options (only have effect if the corresponding backend is selected):\n");
        System.err.println(" --swaggerSchemes <scheme>[,schemes] The Swagger schemes: http (default), https, ws, wss");
        System.err.println(" --renderSwaggerTags Enables rendering of Swagger tags (default tag will be used per default)");
        System.err.println(" --swaggerTagsPathOffset <path offset> The number at which path position the Swagger tags will be extracted (0 will be used per default)");
        System.err.println(" --ignoredRootResources <fully qualified classname [class,...]> JAX-RS root resource classes which should be ignored by analyze (empty per default)");
        System.err.println(" --noPrettyPrint Don't pretty print inline JSON body representations (will be pretty printed per default)");
        System.err.println("\nExample: java -jar jaxrs-analyzer.jar -b swagger -n \"My Project\" -cp ~/libs/lib1.jar:~/libs/project/bin ~/project/target/classes");
        System.exit(1);
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/JobRegistry.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis;

import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult;
import com.sebastian_daschner.jaxrs_analyzer.utils.Pair;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * Thread-safe singleton of unhandled class analysis jobs.
 *
 * @author Sebastian Daschner
 */
public class JobRegistry {

    private static final JobRegistry INSTANCE = new JobRegistry();
    private Queue<Pair<String, ClassResult>> unhandledClasses = new ConcurrentLinkedQueue<>();

    private JobRegistry() {
        // only one instance allowed
    }

    /**
     * Adds the (sub-)resource class name to the analysis list with the associated class result.
     */
    public void analyzeResourceClass(final String className, final ClassResult classResult) {
        // TODO check if class has already been analyzed
        unhandledClasses.add(Pair.of(className, classResult));
    }

    /**
     * Returns a class which has not been analyzed yet.
     *
     * @return An unhandled class or {@code null} if all classes have been analyzed
     */
    public Pair<String, ClassResult> nextUnhandledClass() {
        return unhandledClasses.poll();
    }

    public static JobRegistry getInstance() {
        return INSTANCE;
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/ProjectAnalyzer.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis;

import com.sebastian_daschner.jaxrs_analyzer.LogProvider;
import com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.BytecodeAnalyzer;
import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.ContextClassReader;
import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.JAXRSClassVisitor;
import com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocAnalyzer;
import com.sebastian_daschner.jaxrs_analyzer.analysis.results.ResultInterpreter;
import com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.Resources;
import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult;
import com.sebastian_daschner.jaxrs_analyzer.utils.Pair;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;

import javax.ws.rs.ApplicationPath;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import static com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils.isAnnotationPresent;

/**
 * Analyzes the JAX-RS project. This class is thread-safe.
 *
 * @author Sebastian Daschner
 */
public class ProjectAnalyzer {

    // TODO test following scenario:
    // 2 Maven modules -> a, b; a needs b
    // b contains interface with @Path & resource methods
    // a contains impl of iface without annotations
    // b should have result

    private final Lock lock = new ReentrantLock();
    private final Set<String> classes = new HashSet<>();
    private final ResultInterpreter resultInterpreter = new ResultInterpreter();
    private final BytecodeAnalyzer bytecodeAnalyzer = new BytecodeAnalyzer();
    private final JavaDocAnalyzer javaDocAnalyzer = new JavaDocAnalyzer();

    /**
     * Creates a project analyzer with given class path locations where to search for classes.
     *
     * @param classPaths The locations of additional class paths (can be directories or jar-files)
     */
    public ProjectAnalyzer(final Set<Path> classPaths) {
        classPaths.forEach(this::addToClassPool);
    }

    /**
     * Analyzes all classes in the given project path.
     *
     * @param projectClassPaths  The project class paths
     * @param projectSourcePaths The project source file paths
     * @param ignoredResources   The fully-qualified root resource class names to be ignored
     * @return The REST resource representations
     */
    public Resources analyze(Set<Path> projectClassPaths, Set<Path> projectSourcePaths, Set<String> ignoredResources) {
        lock.lock();
        try {
            projectClassPaths.forEach(this::addProjectPath);

            // analyze relevant classes
            final JobRegistry jobRegistry = JobRegistry.getInstance();
            final Set<ClassResult> classResults = new HashSet<>();

            classes.stream()
                    .filter(this::isJAXRSRootResource)
                    .filter(r -> !ignoredResources.contains(r))
                    .forEach(c -> jobRegistry.analyzeResourceClass(c, new ClassResult()));

            Pair<String, ClassResult> classResultPair;
            while ((classResultPair = jobRegistry.nextUnhandledClass()) != null) {
                final ClassResult classResult = classResultPair.getRight();

                classResults.add(classResult);
                analyzeClass(classResultPair.getLeft(), classResult);

                bytecodeAnalyzer.analyzeBytecode(classResult);
            }

            javaDocAnalyzer.analyze(projectSourcePaths, classResults);

            return resultInterpreter.interpret(classResults);
        } finally {
            lock.unlock();
        }
    }

    private boolean isJAXRSRootResource(String className) {
        final Class<?> clazz = JavaUtils.loadClassFromName(className);
        return clazz != null && (isAnnotationPresent(clazz, javax.ws.rs.Path.class) || isAnnotationPresent(clazz, ApplicationPath.class));
    }

    private void analyzeClass(final String className, ClassResult classResult) {
        try {
            final ClassReader classReader = new ContextClassReader(className);
            final ClassVisitor visitor = new JAXRSClassVisitor(classResult);

            classReader.accept(visitor, ClassReader.EXPAND_FRAMES);
        } catch (IOException e) {
            LogProvider.error("The class " + className + " could not be loaded!");
            LogProvider.debug(e);
        }
    }

    /**
     * Adds the location to the class pool.
     *
     * @param location The location of a jar file or a directory
     */
    private void addToClassPool(final Path location) {
        if (!location.toFile().exists())
            throw new IllegalArgumentException("The location '" + location + "' does not exist!");
        try {
            ContextClassReader.addClassPath(location.toUri().toURL());
        } catch (Exception e) {
            throw new IllegalArgumentException("The location '" + location + "' could not be loaded to the class path!", e);
        }
    }

    /**
     * Adds the project paths and loads all classes.
     *
     * @param path The project path
     */
    private void addProjectPath(final Path path) {
        addToClassPool(path);

        if (path.toFile().isFile() && path.toString().endsWith(".jar")) {
            addJarClasses(path);
        } else if (path.toFile().isDirectory()) {
            addDirectoryClasses(path, Paths.get(""));
        } else {
            throw new IllegalArgumentException("The project path '" + path + "' must be a jar file or a directory");
        }
    }

    /**
     * Adds all classes in the given jar-file location to the set of known classes.
     *
     * @param location The location of the jar-file
     */
    private void addJarClasses(final Path location) {
        try (final JarFile jarFile = new JarFile(location.toFile())) {
            final Enumeration<JarEntry> entries = jarFile.entries();
            while (entries.hasMoreElements()) {
                final JarEntry entry = entries.nextElement();
                final String entryName = entry.getName();
                if (entryName.endsWith(".class"))
                    classes.add(toQualifiedClassName(entryName));
            }
        } catch (IOException e) {
            throw new IllegalArgumentException("Could not read jar-file '" + location + "', reason: " + e.getMessage());
        }
    }

    /**
     * Adds all classes in the given directory location to the set of known classes.
     *
     * @param location The location of the current directory
     * @param subPath  The sub-path which is relevant for the package names or {@code null} if currently in the root directory
     */
    private void addDirectoryClasses(final Path location, final Path subPath) {
        for (final File file : location.toFile().listFiles()) {
            if (file.isDirectory())
                addDirectoryClasses(location.resolve(file.getName()), subPath.resolve(file.getName()));
            else if (file.isFile() && file.getName().endsWith(".class")) {
                final String classFileName = subPath.resolve(file.getName()).toString();
                classes.add(toQualifiedClassName(classFileName));
            }
        }
    }

    /**
     * Converts the given file name of a class-file to the fully-qualified class name.
     *
     * @param fileName The file name (e.g. a/package/AClass.class)
     * @return The fully-qualified class name (e.g. a.package.AClass)
     */
    private static String toQualifiedClassName(final String fileName) {
        final String replacedSeparators = fileName.replace(File.separatorChar, '.');
        return replacedSeparators.substring(0, replacedSeparators.length() - ".class".length());
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/BytecodeAnalyzer.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode;

import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;

/**
 * @author Sebastian Daschner
 */
public class BytecodeAnalyzer {

    private final ResourceMethodContentAnalyzer methodContentAnalyzer = new ResourceMethodContentAnalyzer();
    private final SubResourceLocatorMethodContentAnalyzer subResourceLocatorAnalyzer = new SubResourceLocatorMethodContentAnalyzer();

    /**
     * Analyzes the bytecode instructions of the method results and interprets JAX-RS relevant information.
     */
    public void analyzeBytecode(final ClassResult classResult) {
        classResult.getMethods().forEach(this::analyzeBytecode);
    }

    private void analyzeBytecode(final MethodResult methodResult) {
        if (methodResult.getHttpMethod() == null) {
            // sub-resource
            subResourceLocatorAnalyzer.analyze(methodResult);
        } else {
            methodContentAnalyzer.analyze(methodResult);
        }
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/MethodContentAnalyzer.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode;

import com.sebastian_daschner.jaxrs_analyzer.LogProvider;
import com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.reduction.RelevantInstructionReducer;
import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.ContextClassReader;
import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.ProjectMethodClassVisitor;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.Instruction;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.InvokeInstruction;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.ProjectMethod;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;

import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * Analyzes the content of a method. Sub classes have to be thread-safe.
 *
 * @author Sebastian Daschner
 */
abstract class MethodContentAnalyzer {

    /**
     * The number of package hierarchies which are taken to identify project resources.
     */
    private static final int PROJECT_PACKAGE_HIERARCHIES = 2;
    private final RelevantInstructionReducer instructionReducer = new RelevantInstructionReducer();
    private String projectPackagePrefix;

    /**
     * Interprets the relevant instructions for the given method.
     *
     * @param instructions The instructions to reduce
     * @return The reduced instructions
     */
    List<Instruction> interpretRelevantInstructions(final List<Instruction> instructions) {
        return instructionReducer.reduceInstructions(instructions);
    }

    /**
     * Builds the project package prefix for the class of given method.
     * The current project which is analyzed is identified by the first two package nodes.
     */
    void buildPackagePrefix(final String className) {
        // TODO test
        final int lastPackageSeparator = className.lastIndexOf('/');
        final String packageName = className.substring(0, lastPackageSeparator == -1 ? className.length() : lastPackageSeparator);
        final String[] splitPackage = packageName.split("/");

        if (splitPackage.length >= PROJECT_PACKAGE_HIERARCHIES) {
            projectPackagePrefix = IntStream.range(0, PROJECT_PACKAGE_HIERARCHIES).mapToObj(i -> splitPackage[i]).collect(Collectors.joining("/"));
        } else {
            projectPackagePrefix = packageName;
        }
    }

    /**
     * Searches for own project method invoke instructions in the given list.
     *
     * @param instructions The instructions where to search
     * @return The found project methods
     */
    Set<ProjectMethod> findProjectMethods(final List<Instruction> instructions) {
        final Set<ProjectMethod> projectMethods = new HashSet<>();

        addProjectMethods(instructions, projectMethods);

        return projectMethods;
    }

    /**
     * Adds all project methods called in the given {@code instructions} to the {@code projectMethods} recursively.
     *
     * @param instructions   The instructions of the current method
     * @param projectMethods All found project methods
     */
    private void addProjectMethods(final List<Instruction> instructions, final Set<ProjectMethod> projectMethods) {
        Set<MethodIdentifier> projectMethodIdentifiers = findUnhandledProjectMethodIdentifiers(instructions, projectMethods);

        for (MethodIdentifier identifier : projectMethodIdentifiers) {
            // TODO cache results -> singleton pool?

            final MethodResult methodResult = visitProjectMethod(identifier);
            if (methodResult == null) {
                continue;
            }

            final List<Instruction> nestedMethodInstructions = interpretRelevantInstructions(methodResult.getInstructions());
            projectMethods.add(new ProjectMethod(identifier, nestedMethodInstructions));
            addProjectMethods(nestedMethodInstructions, projectMethods);
        }
    }

    private MethodResult visitProjectMethod(MethodIdentifier identifier) {
        try {
            final ClassReader classReader = new ContextClassReader(identifier.getContainingClass());
            final MethodResult methodResult = new MethodResult();
            methodResult.setOriginalMethodSignature(identifier);
            final ClassVisitor visitor = new ProjectMethodClassVisitor(methodResult, identifier);

            classReader.accept(visitor, ClassReader.EXPAND_FRAMES);
            return methodResult;
        } catch (IOException e) {
            LogProvider.error("Could not analyze project method " + identifier.getContainingClass() + "#" + identifier.getMethodName());
            LogProvider.debug(e);
            return null;
        }
    }

    /**
     * Returns project method identifiers of invoke instructions which are not included in the {@code projectMethods}.
     *
     * @param instructions   The instructions of the current method
     * @param projectMethods All found project methods
     * @return The new method identifiers of unhandled project method invoke instructions
     */
    private Set<MethodIdentifier> findUnhandledProjectMethodIdentifiers(final List<Instruction> instructions, final Set<ProjectMethod> projectMethods) {
        // find own methods
        return instructions.stream().filter(i -> i.getType() == Instruction.InstructionType.INVOKE || i.getType() == Instruction.InstructionType.METHOD_HANDLE)
                .map(i -> (InvokeInstruction) i).filter(this::isProjectMethod).map(InvokeInstruction::getIdentifier)
                .filter(i -> projectMethods.stream().noneMatch(m -> m.matches(i)))
                .collect(Collectors.toSet());
    }

    /**
     * Checks if the given instruction invokes a method defined in the analyzed project.
     *
     * @param instruction The invoke instruction
     * @return {@code true} if method was defined in the project
     */
    private boolean isProjectMethod(final InvokeInstruction instruction) {
        final MethodIdentifier identifier = instruction.getIdentifier();

        // check if method is in own package
        return identifier.getContainingClass().startsWith(projectPackagePrefix);
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/ResourceMethodContentAnalyzer.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode;

import com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.simulation.MethodPool;
import com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.simulation.MethodSimulator;
import com.sebastian_daschner.jaxrs_analyzer.model.Types;
import com.sebastian_daschner.jaxrs_analyzer.model.elements.Element;
import com.sebastian_daschner.jaxrs_analyzer.model.elements.HttpResponse;
import com.sebastian_daschner.jaxrs_analyzer.model.elements.JsonValue;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.Instruction;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.ProjectMethod;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;

import java.util.List;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;

/**
 * Analyzes JAX-RS resource methods. This class is thread-safe.
 *
 * @author Sebastian Daschner
 */
class ResourceMethodContentAnalyzer extends MethodContentAnalyzer {

    private final Lock lock = new ReentrantLock();

    /**
     * Analyzes the method (including own project methods).
     *
     * @param methodResult The method result
     */
    void analyze(final MethodResult methodResult) {
        lock.lock();
        try {
            buildPackagePrefix(methodResult.getParentResource().getOriginalClass());

            final List<Instruction> visitedInstructions = interpretRelevantInstructions(methodResult.getInstructions());

            // find project defined methods in invoke occurrences
            final Set<ProjectMethod> projectMethods = findProjectMethods(visitedInstructions);

            // add project methods to global method pool
            projectMethods.forEach(MethodPool.getInstance()::addProjectMethod);

            Element returnedElement = new MethodSimulator().simulate(visitedInstructions);
            final String returnType = methodResult.getOriginalMethodSignature().getReturnType();

            // void resource methods are interpreted later; stop analyzing on error
            if (Types.PRIMITIVE_VOID.equals(returnType)) {
                return;
            }

            if (returnedElement == null) {
                // happens for abstract methods or if there is no return
                return;
            }

            final Set<Object> possibleObjects = returnedElement.getPossibleValues().stream().filter(o -> !(o instanceof HttpResponse))
                    .collect(Collectors.toSet());

            // for non-Response methods add a default if there are non-Response objects or none objects at all
            if (!Types.RESPONSE.equals(returnType)) {
                final HttpResponse defaultResponse = new HttpResponse();

                if (Types.OBJECT.equals(returnType))
                    defaultResponse.getEntityTypes().addAll(returnedElement.getTypes());
                else
                    defaultResponse.getEntityTypes().add(returnType);

                possibleObjects.stream().filter(o -> o instanceof JsonValue).map(o -> (JsonValue) o).forEach(defaultResponse.getInlineEntities()::add);

                defaultResponse.getContentTypes().addAll(methodResult.getResponseMediaTypes());

                methodResult.getResponses().add(defaultResponse);
            }

            // add Response results as well
            returnedElement.getPossibleValues().stream().filter(o -> o instanceof HttpResponse).map(o -> (HttpResponse) o).forEach(methodResult.getResponses()::add);
        } finally {
            lock.unlock();
        }
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/SubResourceLocatorMethodContentAnalyzer.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode;

import com.sebastian_daschner.jaxrs_analyzer.analysis.JobRegistry;
import com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.simulation.MethodPool;
import com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.simulation.MethodSimulator;
import com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils;
import com.sebastian_daschner.jaxrs_analyzer.model.elements.Element;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.Instruction;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.ProjectMethod;
import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;

import java.util.List;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import static java.util.Collections.singleton;

/**
 * Analyzes sub-resource-locator methods. This class is thread-safe.
 *
 * @author Sebastian Daschner
 */
class SubResourceLocatorMethodContentAnalyzer extends MethodContentAnalyzer {

    private final Lock lock = new ReentrantLock();
    private final MethodSimulator simulator = new MethodSimulator();

    /**
     * Analyzes the sub-resource locator method as a class result (which will be the content of a method result).
     *
     * @param methodResult The method result of the sub-resource locator (containing the instructions, and a sub-resource class result)
     */
    void analyze(final MethodResult methodResult) {
        lock.lock();
        try {
            buildPackagePrefix(methodResult.getParentResource().getOriginalClass());

            determineReturnTypes(methodResult).stream()
                    // FEATURE handle several sub-resource impl's
                    .reduce((l, r) -> JavaUtils.determineMostSpecificType(l, r))
                    .ifPresent(t -> registerSubResourceJob(t, methodResult.getSubResource()));
        } finally {
            lock.unlock();
        }
    }

    /**
     * Determines the possible return types of the sub-resource-locator by analyzing the bytecode.
     * This will analyze the concrete returned types (which then are further analyzed).
     */
    private Set<String> determineReturnTypes(final MethodResult result) {
        final List<Instruction> visitedInstructions = interpretRelevantInstructions(result.getInstructions());

        // find project defined methods in invoke occurrences
        final Set<ProjectMethod> projectMethods = findProjectMethods(visitedInstructions);

        // add project methods to global method pool
        projectMethods.forEach(MethodPool.getInstance()::addProjectMethod);

        final Element returnedElement = simulator.simulate(visitedInstructions);
        if (returnedElement == null) {
            // happens for abstract methods or if there is no return
            return singleton(result.getOriginalMethodSignature().getReturnType());
        }

        return returnedElement.getTypes();
    }

    private void registerSubResourceJob(final String type, final ClassResult classResult) {
        final String className = JavaUtils.toClassName(type);
        JobRegistry.getInstance().analyzeResourceClass(className, classResult);
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/InstructionBuilder.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.collection;

import com.sebastian_daschner.jaxrs_analyzer.LogProvider;
import com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.*;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier;
import org.objectweb.asm.Handle;
import org.objectweb.asm.Label;
import org.objectweb.asm.Opcodes;

import java.lang.reflect.Field;

import static com.sebastian_daschner.jaxrs_analyzer.model.Types.*;
import static com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier.of;
import static org.objectweb.asm.Opcodes.*;
import static org.objectweb.asm.util.Printer.OPCODES;

/**
 * @author Sebastian Daschner
 */
public final class InstructionBuilder {

    private InstructionBuilder() {
        throw new UnsupportedOperationException();
    }

    public static Instruction buildFieldInstruction(final int opcode, final String ownerClass, final String name, final String desc, final Label label) {
        // TODO remove
        if (org.objectweb.asm.Type.getObjectType(ownerClass).getClassName().equals(ownerClass.replace('.', '/')))
            throw new AssertionError("!");

        final String opcodeName = OPCODES[opcode];

        switch (opcode) {
            case GETSTATIC:
                final Object value = getStaticValue(name, ownerClass);
                return new GetStaticInstruction(ownerClass, name, desc, value, label);
            case PUTSTATIC:
                return new SizeChangingInstruction(opcodeName, 0, 1, label);
            case GETFIELD:
                return new GetFieldInstruction(ownerClass, name, desc, label);
            case PUTFIELD:
                return new SizeChangingInstruction(opcodeName, 0, 2, label);
            default:
                throw new IllegalArgumentException("Opcode " + opcode + " not a field instruction");
        }
    }

    public static Instruction buildInstruction(final int opcode, final Label label) {
        final String opcodeName = OPCODES[opcode];

        switch (opcode) {
            case ICONST_0:
                return new PushInstruction(0, PRIMITIVE_INT, label);
            case ICONST_1:
                return new PushInstruction(1, PRIMITIVE_INT, label);
            case ICONST_2:
                return new PushInstruction(2, PRIMITIVE_INT, label);
            case ICONST_3:
                return new PushInstruction(3, PRIMITIVE_INT, label);
            case ICONST_4:
                return new PushInstruction(4, PRIMITIVE_INT, label);
            case ICONST_5:
                return new PushInstruction(5, PRIMITIVE_INT, label);
            case ICONST_M1:
                return new PushInstruction(-1, PRIMITIVE_INT, label);
            case DCONST_0:
                return new PushInstruction(0d, PRIMITIVE_DOUBLE, label);
            case DCONST_1:
                return new PushInstruction(1d, PRIMITIVE_DOUBLE, label);
            case FCONST_0:
                return new PushInstruction(1f, PRIMITIVE_FLOAT, label);
            case FCONST_1:
                return new PushInstruction(1f, PRIMITIVE_FLOAT, label);
            case FCONST_2:
                return new PushInstruction(2f, PRIMITIVE_FLOAT, label);
            case LCONST_0:
                return new PushInstruction(0L, PRIMITIVE_LONG, label);
            case LCONST_1:
                return new PushInstruction(1L, PRIMITIVE_LONG, label);
            case IALOAD:
            case LALOAD:
            case FALOAD:
            case DALOAD:
            case AALOAD:
            case BALOAD:
            case CALOAD:
            case SALOAD:
                return new SizeChangingInstruction(opcodeName, 1, 2, label);
            case IASTORE:
            case LASTORE:
            case FASTORE:
            case DASTORE:
            case AASTORE:
            case BASTORE:
            case CASTORE:
            case SASTORE:
                return new SizeChangingInstruction(opcodeName, 0, 3, label);
            case DUP_X1:
            case DUP2_X1:
                return new SizeChangingInstruction(opcodeName, 3, 2, label);
            case DUP_X2:
            case DUP2_X2:
                return new SizeChangingInstruction(opcodeName, 4, 3, label);
            case ARRAYLENGTH:
            case I2L:
            case I2F:
            case I2D:
            case L2I:
            case L2F:
            case L2D:
            case F2I:
            case F2L:
            case F2D:
            case D2I:
            case D2L:
            case D2F:
            case I2B:
            case I2C:
            case I2S:
            case INEG:
            case LNEG:
            case FNEG:
            case DNEG:
            case SWAP:
                return new SizeChangingInstruction(opcodeName, 1, 1, label);
            case IADD:
            case LADD:
            case FADD:
            case DADD:
            case ISUB:
            case LSUB:
            case FSUB:
            case DSUB:
            case IMUL:
            case LMUL:
            case FMUL:
            case DMUL:
            case IDIV:
            case LDIV:
            case FDIV:
            case DDIV:
            case IREM:
            case LREM:
            case FREM:
            case DREM:
            case ISHL:
            case LSHL:
            case ISHR:
            case LSHR:
            case IUSHR:
            case LUSHR:
            case IAND:
            case LAND:
            case IOR:
            case LOR:
            case IXOR:
            case LXOR:
            case LCMP:
            case FCMPL:
            case FCMPG:
            case DCMPL:
            case DCMPG:
                return new SizeChangingInstruction(opcodeName, 1, 2, label);
            case IRETURN:
            case LRETURN:
            case FRETURN:
            case DRETURN:
            case ARETURN:
                return new ReturnInstruction(label);
            case ATHROW:
                return new ThrowInstruction(label);
            case RETURN:
            case NOP:
                return new DefaultInstruction(opcodeName, label);
            case POP:
            case POP2:
            case MONITORENTER:
            case MONITOREXIT:
                return new SizeChangingInstruction(opcodeName, 0, 1, label);
            case ACONST_NULL:
                return new SizeChangingInstruction(opcodeName, 1, 0, label);
            case DUP:
            case DUP2:
                return new DupInstruction(label);
            default:
                throw new IllegalArgumentException("Unexpected opcode " + opcode);
        }
    }

    public static Instruction buildLoadStoreInstruction(int opcode, int index, Label label) {
        switch (opcode) {
            case ILOAD:
            case LLOAD:
            case FLOAD:
            case DLOAD:
            case ALOAD:
                return new LoadStoreInstructionPlaceholder(Instruction.InstructionType.LOAD_PLACEHOLDER, index, label);
            case ISTORE:
            case LSTORE:
            case FSTORE:
            case DSTORE:
            case ASTORE:
                return new LoadStoreInstructionPlaceholder(Instruction.InstructionType.STORE_PLACEHOLDER, index, label);
            case RET:
                return new DefaultInstruction(OPCODES[opcode], label);
            default:
                throw new IllegalArgumentException("Unexpected opcode " + opcode);
        }
    }

    public static Instruction buildTypeInstruction(int opcode, String className, final Label label) {
        final String opcodeName = OPCODES[opcode];

        switch (opcode) {
            case NEW:
                return new NewInstruction(className, label);
            case ANEWARRAY:
            case INSTANCEOF:
                return new SizeChangingInstruction(opcodeName, 1, 1, label);
            case CHECKCAST:
                return new DefaultInstruction(opcodeName, label);
            default:
                throw new IllegalArgumentException("Unexpected opcode " + opcode);
        }
    }

    public static InvokeInstruction buildInvokeInstruction(final int opcode, String containingClass, String name, String desc, final Label label) {
        switch (opcode) {
            case INVOKEINTERFACE:
            case INVOKEVIRTUAL:
            case INVOKESPECIAL:
                return new InvokeInstruction(of(containingClass, name, desc, false), label);
            case INVOKESTATIC:
                return new InvokeInstruction(of(containingClass, name, desc, true), label);
            default:
                throw new IllegalArgumentException("Unexpected opcode " + opcode);
        }
    }

    public static Instruction buildInvokeDynamic(final String className, final String name, final String desc, final Handle handle, final Label label) {
        final MethodIdentifier actualIdentifier = of(handle.getOwner(), handle.getName(), handle.getDesc(), handle.getTag() == Opcodes.H_INVOKESTATIC);

        final MethodIdentifier dynamicIdentifier = of(className, name, desc, true);
        return new InvokeDynamicInstruction(actualIdentifier, dynamicIdentifier, label);
    }

    public static Instruction buildJumpInstruction(int opcode, final Label label) {
        final String opcodeName = OPCODES[opcode];

        switch (opcode) {
            case IFEQ:
            case IFNE:
            case IFLT:
            case IFGE:
            case IFGT:
            case IFLE:
            case IFNULL:
            case IFNONNULL:
                return new SizeChangingInstruction(opcodeName, 0, 1, label);
            case JSR:
                return new SizeChangingInstruction(opcodeName, 1, 0, label);
            case GOTO:
                return new DefaultInstruction(opcodeName, label);
            case IF_ICMPEQ:
            case IF_ICMPNE:
            case IF_ICMPLT:
            case IF_ICMPGE:
            case IF_ICMPGT:
            case IF_ICMPLE:
            case IF_ACMPEQ:
            case IF_ACMPNE:
                return new SizeChangingInstruction(opcodeName, 0, 2, label);
            default:
                throw new IllegalArgumentException("Unexpected opcode " + opcode);
        }
    }

    public static Instruction buildIntInstruction(int opcode, int operand, final Label label) {
        switch (opcode) {
            case BIPUSH:
            case SIPUSH:
                return new PushInstruction(operand, PRIMITIVE_INT, label);
            case NEWARRAY:
                return new SizeChangingInstruction(OPCODES[NEWARRAY], 1, 1, label);
            default:
                throw new IllegalArgumentException("Unexpected opcode " + opcode);
        }
    }

    private static Object getStaticValue(String name, String containingClass) {
        final Field field;
        try {
            // needs to load same class instance in Maven plugin, not from extended classloader
            final Class<?> clazz = Class.forName(containingClass.replace('/', '.'));
            field = clazz.getDeclaredField(name);
            field.setAccessible(true);
            return field.get(null);
        } catch (Exception e) {
            LogProvider.error("Could not access static property, reason: " + e.getMessage());
            LogProvider.debug(e);
            return null;
        }
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/InstructionFinder.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.reduction;

import com.sebastian_daschner.jaxrs_analyzer.model.instructions.Instruction;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.LoadInstruction;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.LoadStoreInstruction;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.function.Predicate;

/**
 * Searches for specific instruction occurrences in the byte code.
 *
 * @author Sebastian Daschner
 */
final class InstructionFinder {

    private InstructionFinder() {
        throw new UnsupportedOperationException();
    }

    /**
     * Searches for all LOAD indexes which occur in the given instructions.
     * The LOAD instruction is checked against the given predicate if it should be ignored.
     *
     * @param instructions  The instructions where to search
     * @param isLoadIgnored The ignore predicate
     * @return All found LOAD indexes
     */
    static Set<Integer> findLoadIndexes(final List<Instruction> instructions, final Predicate<LoadInstruction> isLoadIgnored) {
        return instructions.stream().filter(i -> i.getType() == Instruction.InstructionType.LOAD).map(i -> (LoadInstruction) i)
                .filter(i -> !isLoadIgnored.test(i)).map(LoadInstruction::getNumber).collect(TreeSet::new, Set::add, Set::addAll);
    }

    /**
     * Searches for all LOAD &amp; STORE occurrences with {@code index} in the given instructions.
     *
     * @param index        The LOAD / STORE index
     * @param instructions The instructions where to search
     * @return The positions of all found LOAD_{@code index} / STORE_{@code index}
     */
    static Set<Integer> findLoadStores(final int index, final List<Instruction> instructions) {
        final Predicate<Instruction> loadStoreType = instruction -> instruction.getType() == Instruction.InstructionType.LOAD
                || instruction.getType() == Instruction.InstructionType.STORE;
        return find(loadStoreType.and(instruction -> ((LoadStoreInstruction) instruction).getNumber() == index), instructions);
    }

    /**
     * Searches for return instructions in the given instructions.
     *
     * @param instructions The instructions where to search
     * @return The positions of all found return instructions
     */
    static Set<Integer> findReturnsAndThrows(final List<Instruction> instructions) {
        return find(instruction -> instruction.getType() == Instruction.InstructionType.RETURN || instruction.getType() == Instruction.InstructionType.THROW, instructions);
    }

    /**
     * Searches for certain instruction positions be testing against the predicate.
     *
     * @param predicate    The criteria predicate
     * @param instructions The instructions where to search
     * @return The positions of all matching instructions
     */
    private static Set<Integer> find(final Predicate<Instruction> predicate, final List<Instruction> instructions) {
        final Set<Integer> positions = new HashSet<>();

        for (int i = 0; i < instructions.size(); i++) {
            final Instruction instruction = instructions.get(i);
            if (predicate.test(instruction)) {
                positions.add(i);
            }
        }

        return positions;
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/RelevantInstructionReducer.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.reduction;

import com.sebastian_daschner.jaxrs_analyzer.model.instructions.Instruction;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.LoadInstruction;

import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Determines the instructions, which are relevant for the return value of a method by simulating a runtime stack with the byte code. This class is thread-safe.
 *
 * @author Sebastian Daschner
 */
public class RelevantInstructionReducer {

    /**
     * These variable names will not be backtracked.
     */
    private static final String[] VARIABLE_NAMES_TO_IGNORE = {"this"};
    private final Lock lock = new ReentrantLock();
    private final StackSizeSimulator stackSizeSimulator = new StackSizeSimulator();
    private List<Instruction> instructions;

    /**
     * Returns all instructions which are somewhat "relevant" for the returned object of the method.
     * The instructions are visited backwards - starting from the return statement.
     * Load and Store operations are handled as well.
     *
     * @param instructions The instructions to reduce
     * @return The relevant instructions
     */
    public List<Instruction> reduceInstructions(final List<Instruction> instructions) {
        lock.lock();
        try {
            this.instructions = instructions;
            stackSizeSimulator.buildStackSizes(instructions);

            return reduceInstructionsInternal(instructions);
        } finally {
            lock.unlock();
        }
    }

    /**
     * Returns all reduced instructions.
     *
     * @param instructions All instructions
     * @return The relevant instructions
     */
    private List<Instruction> reduceInstructionsInternal(final List<Instruction> instructions) {
        final List<Instruction> visitedInstructions = new LinkedList<>();
        final Set<Integer> visitedInstructionPositions = new HashSet<>();
        final Set<Integer> handledLoadIndexes = new HashSet<>();
        final Set<Integer> backtrackPositions = new LinkedHashSet<>(findSortedBacktrackPositions());

        while (!visitedInstructionPositions.containsAll(backtrackPositions)) {

            // unvisited backtrack position
            final int backtrackPosition = backtrackPositions.stream().filter(pos -> !visitedInstructionPositions.contains(pos))
                    .findFirst().orElseThrow(IllegalStateException::new);

            final List<Integer> lastVisitedPositions = stackSizeSimulator.simulateStatementBackwards(backtrackPosition);
            final List<Instruction> lastVisitedInstructions = lastVisitedPositions.stream().map(instructions::get).collect(Collectors.toList());

            visitedInstructionPositions.addAll(lastVisitedPositions);
            visitedInstructions.addAll(lastVisitedInstructions);

            // unhandled load indexes
            final Set<Integer> unhandledLoadIndexes = findUnhandledLoadIndexes(handledLoadIndexes, lastVisitedInstructions);

            // for each load occurrence index -> find load/store backtrack positions (reverse order matters here)
            final SortedSet<Integer> loadStoreBacktrackPositions = findLoadStoreBacktrackPositions(unhandledLoadIndexes);

            handledLoadIndexes.addAll(unhandledLoadIndexes);

            loadStoreBacktrackPositions.stream().forEach(backtrackPositions::add);
        }

        // sort in method natural order
        Collections.reverse(visitedInstructions);

        return visitedInstructions;
    }

    private List<Integer> findSortedBacktrackPositions() {
        final List<Integer> startPositions = new LinkedList<>(InstructionFinder.findReturnsAndThrows(instructions));

        // start with last return
        Collections.sort(startPositions, Comparator.reverseOrder());
        return startPositions;
    }


    /**
     * Searches for load indexes in the {@code lastVisitedInstructions} which are not contained in {@code handledLoadIndexes}.
     *
     * @param handledLoadIndexes      The load indexed which have been handled so far
     * @param lastVisitedInstructions The last visited instructions
     * @return The unhandled load indexes
     */
    private Set<Integer> findUnhandledLoadIndexes(final Set<Integer> handledLoadIndexes, final List<Instruction> lastVisitedInstructions) {
        final Set<Integer> lastLoadIndexes = InstructionFinder.findLoadIndexes(lastVisitedInstructions, RelevantInstructionReducer::isLoadIgnored);

        return lastLoadIndexes.stream().filter(k -> !handledLoadIndexes.contains(k)).collect(Collectors.toSet());
    }

    /**
     * Checks if the given LOAD instruction should be ignored for backtracking.
     *
     * @param instruction The instruction to check
     * @return {@code true} if the LOAD instruction will be ignored
     */
    private static boolean isLoadIgnored(final LoadInstruction instruction) {
        return Stream.of(VARIABLE_NAMES_TO_IGNORE).anyMatch(instruction.getName()::equals);
    }

    /**
     * Returns all backtrack positions of the given LOAD / STORE indexes in the instructions.
     * The backtrack positions of both LOAD and store instructions are the next positions where the runtime stack size is {@code 0}.
     *
     * @param unhandledLoadIndexes The LOAD/STORE indexes to find
     * @return The backtrack positions of the LOAD / STORE indexes
     */
    private SortedSet<Integer> findLoadStoreBacktrackPositions(final Set<Integer> unhandledLoadIndexes) {
        return unhandledLoadIndexes.stream()
                .map(index -> stackSizeSimulator.findLoadStoreBacktrackPositions(InstructionFinder.findLoadStores(index, instructions)))
                .collect(() -> new TreeSet<>(Comparator.reverseOrder()), Set::addAll, Set::addAll);
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/StackSizeSimulator.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.reduction;

import com.sebastian_daschner.jaxrs_analyzer.utils.Pair;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.Instruction;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Simulates runtime stack sizes of instructions.
 *
 * @author Sebastian Daschner
 */
class StackSizeSimulator {

    private List<Pair<Integer, Integer>> stackSizes;

    /**
     * Initializes the runtime stack sizes with the given instructions. This has to be called before {@link StackSizeSimulator#simulateStatementBackwards}
     *
     * @param instructions The instructions to simulate
     */
    void buildStackSizes(final List<Instruction> instructions) {
        stackSizes = new ArrayList<>();
        int stackSize = 0;

        for (Instruction instruction : instructions) {
            final int previousStackSize = stackSize;

            stackSize += instruction.getStackSizeDifference();

            if (isStackCleared(instruction))
                stackSize = 0;

            if (stackSize < 0) {
                throw new IllegalStateException("Runtime stack under-flow occurred.");
            }

            stackSizes.add(Pair.of(previousStackSize, stackSize));
        }
    }

    /**
     * Checks if the stack will be cleared on invoking the given instruction.
     *
     * @param instruction The instruction
     * @return {@code true} if the stack will be cleared
     */
    private static boolean isStackCleared(final Instruction instruction) {
        return instruction.getType() == Instruction.InstructionType.RETURN || instruction.getType() == Instruction.InstructionType.THROW;
    }

    /**
     * Returns the instruction positions which are visited <i>backwards</i> from {@code backtrackPosition}
     * until the runtime stack is empty.
     *
     * @param backtrackPosition The backtrack position where to start
     * @return All positions <i>backwards</i> until the previous empty position
     */
    List<Integer> simulateStatementBackwards(final int backtrackPosition) {
        // search for previous zero-position in stackSizes
        int currentPosition = backtrackPosition;

        // check against stack size before the instruction was executed
        while (stackSizes.get(currentPosition).getLeft() > 0) {
            currentPosition--;
        }

        return Stream.iterate(backtrackPosition, c -> --c).limit(backtrackPosition - currentPosition + 1)
                .collect(LinkedList::new, Collection::add, Collection::addAll);
    }

    /**
     * Returns all backtrack positions of the given instruction positions.
     * The backtrack positions of both LOAD and store instructions are the next positions where the runtime stack size is {@code 0}.
     *
     * @param loadStorePositions The LOAD/STORE positions
     * @return The backtrack positions
     */
    Set<Integer> findLoadStoreBacktrackPositions(final Set<Integer> loadStorePositions) {
        // go to this or next zero-position
        return loadStorePositions.stream().map(this::findBacktrackPosition).collect(Collectors.toSet());
    }

    /**
     * Returns the next position where the stack will be empty.
     *
     * @param position The current position
     * @return The next empty position
     */
    private int findBacktrackPosition(final int position) {
        int currentPosition = position;

        // check against stack size after the instruction was executed
        while (stackSizes.get(currentPosition).getRight() > 0) {
            currentPosition++;
        }

        return currentPosition;
    }

}

================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/InjectableArgumentMethodSimulator.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.simulation;

import com.sebastian_daschner.jaxrs_analyzer.model.elements.Element;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.Instruction;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.IntStream;

/**
 * Simulates the the instructions of a project method. The parameters of the method can be set with the actual arguments. This class is thread-safe.
 *
 * @author Sebastian Daschner
 */
public class InjectableArgumentMethodSimulator extends MethodSimulator {

    /**
     * The called methods in a single recursive method simulation. Used to prevent infinite loops while analysing recursion.
     */
    private static final List<MethodIdentifier> EXECUTED_PATH_METHODS = Collections.synchronizedList(new LinkedList<>());

    private final Lock lock = new ReentrantLock();

    /**
     * Simulates the instructions of the method which will be called with the given arguments.
     *
     * @param arguments    The argument values
     * @param instructions The instructions of the method
     * @param identifier   The identifier of the method
     * @return The return value or {@code null} if return type is void
     */
    public Element simulate(final List<Element> arguments, final List<Instruction> instructions, final MethodIdentifier identifier) {
        // prevent infinite loops on analysing recursion
        if (EXECUTED_PATH_METHODS.contains(identifier))
            return new Element();

        lock.lock();
        EXECUTED_PATH_METHODS.add(identifier);
        try {

            injectArguments(arguments, identifier);

            return simulateInternal(instructions);
        } finally {
            EXECUTED_PATH_METHODS.remove(identifier);
            lock.unlock();
        }
    }

    /**
     * Injects the arguments of the method invocation to the local variables.
     *
     * @param arguments The argument values
     */
    private void injectArguments(final List<Element> arguments, final MethodIdentifier identifier) {
        final boolean staticMethod = identifier.isStaticMethod();
        final int startIndex = staticMethod ? 0 : 1;
        final int endIndex = staticMethod ? arguments.size() - 1 : arguments.size();

        IntStream.rangeClosed(startIndex, endIndex).forEach(i -> localVariables.put(i, arguments.get(staticMethod ? i : i - 1)));
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/KnownJsonResultMethod.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.simulation;

import com.sebastian_daschner.jaxrs_analyzer.model.elements.Element;
import com.sebastian_daschner.jaxrs_analyzer.model.elements.JsonArray;
import com.sebastian_daschner.jaxrs_analyzer.model.elements.JsonObject;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.IdentifiableMethod;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier;

import java.util.List;
import java.util.function.BiFunction;

import static com.sebastian_daschner.jaxrs_analyzer.model.Types.*;

/**
 * Known JSON methods which apply logic to the result or to the return element.
 *
 * @author Sebastian Daschner
 */
enum KnownJsonResultMethod implements IdentifiableMethod {

    JSON_ARRAY_BUILDER_CREATE(MethodIdentifier.ofStatic(CLASS_JSON, "createArrayBuilder", JSON_ARRAY_BUILDER), (object, arguments) -> new Element(JSON_ARRAY, new JsonArray())),

    JSON_ARRAY_BUILDER_ADD_BIG_DECIMAL(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "add", JSON_ARRAY_BUILDER, BIG_DECIMAL),
            (object, arguments) -> addToArray(object, arguments, BIG_DECIMAL)),

    JSON_ARRAY_BUILDER_ADD_BIG_INTEGER(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "add", JSON_ARRAY_BUILDER, BIG_INTEGER),
            (object, arguments) -> addToArray(object, arguments, BIG_INTEGER)),

    JSON_ARRAY_BUILDER_ADD_STRING(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "add", JSON_ARRAY_BUILDER, STRING),
            (object, arguments) -> addToArray(object, arguments, STRING)),

    JSON_ARRAY_BUILDER_ADD_INT(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "add", JSON_ARRAY_BUILDER, PRIMITIVE_INT),
            (object, arguments) -> addToArray(object, arguments, INTEGER)),

    JSON_ARRAY_BUILDER_ADD_LONG(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "add", JSON_ARRAY_BUILDER, PRIMITIVE_LONG),
            (object, arguments) -> addToArray(object, arguments, LONG)),

    JSON_ARRAY_BUILDER_ADD_DOUBLE(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "add", JSON_ARRAY_BUILDER, PRIMITIVE_DOUBLE),
            (object, arguments) -> addToArray(object, arguments, DOUBLE)),

    JSON_ARRAY_BUILDER_ADD_BOOLEAN(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "add", JSON_ARRAY_BUILDER, PRIMITIVE_BOOLEAN),
            (object, arguments) -> addToArray(object, arguments, PRIMITIVE_BOOLEAN)),

    JSON_ARRAY_BUILDER_ADD_JSON(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "add", JSON_ARRAY_BUILDER, JSON_VALUE),
            KnownJsonResultMethod::addToArray),

    JSON_ARRAY_BUILDER_ADD_JSON_OBJECT(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "add", JSON_ARRAY_BUILDER, JSON_OBJECT_BUILDER), (object, arguments) ->
            addToArray(object, arguments, JSON_OBJECT)),

    JSON_ARRAY_BUILDER_ADD_JSON_ARRAY(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "add", JSON_ARRAY_BUILDER, JSON_ARRAY_BUILDER), (object, arguments) ->
            addToArray(object, arguments, JSON_ARRAY)),

    JSON_ARRAY_BUILDER_ADD_NULL(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "addNull", JSON_ARRAY_BUILDER),
            (object, arguments) -> {
                object.getPossibleValues().stream().filter(o -> o instanceof JsonArray).map(o -> (JsonArray) o)
                        .forEach(a -> a.getElements().add(new Element(OBJECT, null)));
                return object;
            }),

    JSON_ARRAY_BUILDER_BUILD(MethodIdentifier.ofNonStatic(CLASS_JSON_ARRAY_BUILDER, "build", JSON_ARRAY), (object, arguments) -> {
        Element json = new Element(JSON_ARRAY);
        json.getPossibleValues().addAll(object.getPossibleValues());
        return json;
    }),

    JSON_OBJECT_BUILDER_CREATE(MethodIdentifier.ofStatic(CLASS_JSON, "createObjectBuilder", JSON_OBJECT_BUILDER), (object, arguments) -> new Element(JSON_OBJECT, new JsonObject())),

    JSON_OBJECT_BUILDER_ADD_BIG_DECIMAL(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "add", JSON_OBJECT_BUILDER, STRING, BIG_DECIMAL),
            (object, arguments) -> mergeJsonStructure(object, arguments, BIG_DECIMAL)),

    JSON_OBJECT_BUILDER_ADD_BIG_INTEGER(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "add", JSON_OBJECT_BUILDER, STRING, BIG_INTEGER),
            (object, arguments) -> mergeJsonStructure(object, arguments, BIG_INTEGER)),

    JSON_OBJECT_BUILDER_ADD_STRING(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "add", JSON_OBJECT_BUILDER, STRING, STRING),
            (object, arguments) -> mergeJsonStructure(object, arguments, STRING)),

    JSON_OBJECT_BUILDER_ADD_INT(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "add", JSON_OBJECT_BUILDER, STRING, PRIMITIVE_INT),
            (object, arguments) -> mergeJsonStructure(object, arguments, INTEGER)),

    JSON_OBJECT_BUILDER_ADD_LONG(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "add", JSON_OBJECT_BUILDER, STRING, PRIMITIVE_LONG),
            (object, arguments) -> mergeJsonStructure(object, arguments, LONG)),

    JSON_OBJECT_BUILDER_ADD_DOUBLE(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "add", JSON_OBJECT_BUILDER, STRING, PRIMITIVE_DOUBLE),
            (object, arguments) -> mergeJsonStructure(object, arguments, DOUBLE)),

    JSON_OBJECT_BUILDER_ADD_BOOLEAN(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "add", JSON_OBJECT_BUILDER, STRING, PRIMITIVE_BOOLEAN),
            (object, arguments) -> mergeJsonStructure(object, arguments, PRIMITIVE_BOOLEAN)),

    JSON_OBJECT_BUILDER_ADD_JSON(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "add", JSON_OBJECT_BUILDER, STRING, JSON_VALUE),
            KnownJsonResultMethod::mergeJsonStructure),

    JSON_OBJECT_BUILDER_ADD_JSON_OBJECT(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "add", JSON_OBJECT_BUILDER, STRING, JSON_OBJECT_BUILDER), (object, arguments) ->
            mergeJsonStructure(object, arguments, JSON_OBJECT)),

    JSON_OBJECT_BUILDER_ADD_JSON_ARRAY(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "add", JSON_OBJECT_BUILDER, STRING, JSON_ARRAY_BUILDER), (object, arguments) ->
            mergeJsonStructure(object, arguments, JSON_ARRAY)),

    JSON_OBJECT_BUILDER_ADD_NULL(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "addNull", JSON_OBJECT_BUILDER, STRING),
            (object, arguments) -> {
                object.getPossibleValues().stream()
                        .filter(o -> o instanceof JsonObject).map(o -> (JsonObject) o)
                        .forEach(o -> arguments.get(0).getPossibleValues().stream().map(s -> (String) s)
                                .forEach(s -> o.getStructure().merge(s, new Element(OBJECT, null), Element::merge)));
                return object;
            }),

    JSON_OBJECT_BUILDER_BUILD(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT_BUILDER, "build", JSON_OBJECT), (object, arguments) -> {
        final Element json = new Element(JSON_OBJECT);
        json.getPossibleValues().addAll(object.getPossibleValues());
        return json;
    }),

    JSON_OBJECT_GET_BOOLEAN(MethodIdentifier.ofNonStatic(CLASS_JSON_OBJECT, "getBoolean", PRIMITIVE_BOOLEAN, STRING),
            (object, arguments) -> object.getPossibleValues().stream()
                    .filter(o -> o instanceof JsonObject).map(o -> (JsonObject) o)
                    .map(o -> arguments.get(0).getPossibleValues().stream()
                            .map(s -> (String) s).map(s -> o.getStructure().get(s))
                            .reduce(new Element(PRIMITIVE_BOOLEAN), Element::merge))
                    .reduce(new Element(PRIMITIVE_BOOLEAN), Element::merge));

    private final MethodIdentifier identifier;

    private final BiFunction<Element, List<Element>, Element> function;

    KnownJsonResultMethod(final MethodIdentifier identifier,
                          final BiFunction<Element, List<Element>, Element> function) {
        this.identifier = identifier;
        this.function = function;
    }

    @Override
    public Element invoke(final Element object, final List<Element> arguments) {
        if (arguments.size() != identifier.getParameters().size())
            throw new IllegalArgumentException("Method arguments do not match expected signature!");

        return function.apply(object, arguments);
    }

    @Override
    public boolean matches(final MethodIdentifier identifier) {
        return this.identifier.equals(identifier);
    }

    private static Element addToArray(final Element object, final List<Element> arguments) {
        return addToArray(object, arguments.get(0));
    }

    private static Element addToArray(final Element object, final List<Element> arguments, final String typeOverride) {
        final Element element = new Element(typeOverride);
        element.getPossibleValues().addAll(arguments.get(0).getPossibleValues());
        return addToArray(object, element);
    }

    private static Element addToArray(final Element object, final Element argument) {
        object.getPossibleValues().stream()
                .filter(o -> o instanceof JsonArray).map(o -> (JsonArray) o)
                .forEach(a -> a.getElements().add(argument));
        return object;
    }

    private static Element mergeJsonStructure(final Element object, final List<Element> arguments) {
        final Element element = new Element(arguments.get(1).getTypes());
        element.merge(arguments.get(1));
        return mergeJsonStructure(object, arguments.get(0), element);
    }

    private static Element mergeJsonStructure(final Element object, final List<Element> arguments, final String typeOverride) {
        final Element element = new Element(typeOverride);
        element.getPossibleValues().addAll(arguments.get(1).getPossibleValues());
        return mergeJsonStructure(object, arguments.get(0), element);
    }

    private static Element mergeJsonStructure(final Element object, final Element key, final Element argument) {
        object.getPossibleValues().stream()
                .filter(o -> o instanceof JsonObject).map(o -> (JsonObject) o)
                .forEach(o -> key.getPossibleValues().stream().map(s -> (String) s)
                        .forEach(s -> o.getStructure().merge(s, argument, Element::merge)));
        return object;
    }

}



================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/KnownResponseResultMethod.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.simulation;

import com.sebastian_daschner.jaxrs_analyzer.model.elements.Element;
import com.sebastian_daschner.jaxrs_analyzer.model.elements.HttpResponse;
import com.sebastian_daschner.jaxrs_analyzer.model.elements.JsonValue;
import com.sebastian_daschner.jaxrs_analyzer.model.elements.MethodHandle;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.IdentifiableMethod;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.Method;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier;

import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.BiFunction;
import java.util.stream.Collectors;

import static com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils.INITIALIZER_NAME;
import static com.sebastian_daschner.jaxrs_analyzer.model.Types.*;
import static com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier.ofNonStatic;
import static com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier.ofStatic;

/**
 * Known methods which apply logic to the result or to the return element.
 *
 * @author Sebastian Daschner
 */
enum KnownResponseResultMethod implements IdentifiableMethod {

    // non-static methods in ResponseBuilder --------------------------

    RESPONSE_BUILDER_BUILD(ofNonStatic(CLASS_RESPONSE_BUILDER, "build", RESPONSE), (object, arguments) -> object),

    RESPONSE_BUILDER_CACHE_CONTROL(ofNonStatic(CLASS_RESPONSE_BUILDER, "cacheControl", RESPONSE_BUILDER, "Ljavax/ws/rs/core/CacheControl;"), (object, arguments) ->
            addHeader(object, HttpHeaders.CACHE_CONTROL)),

    RESPONSE_BUILDER_CONTENT_LOCATION(ofNonStatic(CLASS_RESPONSE_BUILDER, "contentLocation", RESPONSE_BUILDER, URI), (object, arguments) ->
            addHeader(object, HttpHeaders.CONTENT_LOCATION)),

    RESPONSE_BUILDER_COOKIE(ofNonStatic(CLASS_RESPONSE_BUILDER, "cookie", RESPONSE_BUILDER, "[Ljavax/ws/rs/core/NewCookie;"), (object, arguments) ->
            addHeader(object, HttpHeaders.SET_COOKIE)),

    RESPONSE_BUILDER_ENCODING(ofNonStatic(CLASS_RESPONSE_BUILDER, "encoding", RESPONSE_BUILDER, STRING), (object, arguments) ->
            addHeader(object, HttpHeaders.CONTENT_ENCODING)),

    RESPONSE_BUILDER_ENTITY(ofNonStatic(CLASS_RESPONSE_BUILDER, "entity", RESPONSE_BUILDER, OBJECT), (object, arguments) ->
            addEntity(object, arguments.get(0))),

    RESPONSE_BUILDER_ENTITY_ANNOTATION(ofNonStatic(CLASS_RESPONSE_BUILDER, "entity", RESPONSE_BUILDER, OBJECT, "[Ljava/lang/annotation/Annotation;"), (object, arguments) ->
            addEntity(object, arguments.get(0))),

    RESPONSE_BUILDER_EXPIRES(ofNonStatic(CLASS_RESPONSE_BUILDER, "expires", RESPONSE_BUILDER, DATE), (object, arguments) ->
            addHeader(object, HttpHeaders.EXPIRES)),

    RESPONSE_BUILDER_HEADER(ofNonStatic(CLASS_RESPONSE_BUILDER, "header", RESPONSE_BUILDER, STRING, OBJECT), (object, arguments) -> {
        arguments.get(0).getPossibleValues().stream()
                .map(header -> (String) header).forEach(h -> addHeader(object, h));
        return object;
    }),

    RESPONSE_BUILDER_LANGUAGE_LOCALE(ofNonStatic(CLASS_RESPONSE_BUILDER, "language", RESPONSE_BUILDER, "Ljava/util/Locale;"), (object, arguments) ->
            addHeader(object, HttpHeaders.CONTENT_LANGUAGE)),

    RESPONSE_BUILDER_LANGUAGE_STRING(ofNonStatic(CLASS_RESPONSE_BUILDER, "language", RESPONSE_BUILDER, STRING), (object, arguments) ->
            addHeader(object, HttpHeaders.CONTENT_LANGUAGE)),

    RESPONSE_BUILDER_LAST_MODIFIED(ofNonStatic(CLASS_RESPONSE_BUILDER, "lastModified", RESPONSE_BUILDER, DATE), (object, arguments) ->
            addHeader(object, HttpHeaders.LAST_MODIFIED)),

    RESPONSE_BUILDER_LINK_URI(ofNonStatic(CLASS_RESPONSE_BUILDER, "link", RESPONSE_BUILDER, URI, STRING), (object, arguments) ->
            addHeader(object, HttpHeaders.LINK)),

    RESPONSE_BUILDER_LINK_STRING(ofNonStatic(CLASS_RESPONSE_BUILDER, "link", RESPONSE_BUILDER, STRING, STRING), (object, arguments) ->
            addHeader(object, HttpHeaders.LINK)),

    RESPONSE_BUILDER_LINKS(ofNonStatic(CLASS_RESPONSE_BUILDER, "links", RESPONSE_BUILDER, "[Ljavax/ws/rs/core/Link;"), (object, arguments) ->
            addHeader(object, HttpHeaders.LINK)),

    RESPONSE_BUILDER_LOCATION(ofNonStatic(CLASS_RESPONSE_BUILDER, "location", RESPONSE_BUILDER, URI), (object, arguments) ->
            addHeader(object, HttpHeaders.LOCATION)),

    RESPONSE_BUILDER_STATUS_ENUM(ofNonStatic(CLASS_RESPONSE_BUILDER, "status", RESPONSE_BUILDER, RESPONSE_STATUS), (object, arguments) -> {
        arguments.get(0).getPossibleValues().stream()
                .map(status -> ((Response.Status) status).getStatusCode()).forEach(s -> addStatus(object, s));
        return object;
    }),

    RESPONSE_BUILDER_STATUS_INT(ofNonStatic(CLASS_RESPONSE_BUILDER, "status", RESPONSE_BUILDER, PRIMITIVE_INT), (object, arguments) -> {
        arguments.get(0).getPossibleValues().stream()
                .map(status -> (int) status).forEach(s -> addStatus(object, s));
        return object;
    }),

    RESPONSE_BUILDER_TAG_ENTITY(ofNonStatic(CLASS_RESPONSE_BUILDER, "tag", RESPONSE_BUILDER, ENTITY_TAG), (object, arguments) ->
            addHeader(object, HttpHeaders.ETAG)),

    RESPONSE_BUILDER_TAG_STRING(ofNonStatic(CLASS_RESPONSE_BUILDER, "tag", RESPONSE_BUILDER, STRING), (object, arguments) ->
            addHeader(object, HttpHeaders.ETAG)),

    RESPONSE_BUILDER_TYPE(ofNonStatic(CLASS_RESPONSE_BUILDER, "type", RESPONSE_BUILDER, "Ljavax/ws/rs/core/MediaType;"), (object, arguments) -> {
        arguments.get(0).getPossibleValues().stream()
                .map(m -> (MediaType) m).map(m -> m.getType() + '/' + m.getSubtype()).forEach(t -> addContentType(object, t));
        return object;
    }),

    RESPONSE_BUILDER_TYPE_STRING(ofNonStatic(CLASS_RESPONSE_BUILDER, "type", RESPONSE_BUILDER, STRING), (object, arguments) -> {
        arguments.get(0).getPossibleValues().stream()
                .map(t -> (String) t).forEach(t -> addContentType(object, t));
        return object;
    }),

    RESPONSE_BUILDER_VARIANT(ofNonStatic(CLASS_RESPONSE_BUILDER, "variant", RESPONSE_BUILDER, VARIANT), (object, arguments) -> {
        addHeader(object, HttpHeaders.CONTENT_LANGUAGE);
        addHeader(object, HttpHeaders.CONTENT_ENCODING);
        return object;
    }),

    RESPONSE_BUILDER_VARIANTS_LIST(ofNonStatic(CLASS_RESPONSE_BUILDER, "variants", RESPONSE_BUILDER, LIST), (object, arguments) ->
            addHeader(object, HttpHeaders.VARY)),

    RESPONSE_BUILDER_VARIANTS_ARRAY(ofNonStatic(CLASS_RESPONSE_BUILDER, "variants", RESPONSE_BUILDER, "[Ljavax/ws/rs/core/Variant;"), (object, arguments) ->
            addHeader(object, HttpHeaders.VARY)),

    // static methods in Response --------------------------

    RESPONSE_STATUS_ENUM(ofStatic(CLASS_RESPONSE, "status", RESPONSE_BUILDER, RESPONSE_STATUS), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        arguments.get(0).getPossibleValues().stream()
                .map(status -> ((Response.Status) status).getStatusCode()).forEach(s -> addStatus(object, s));
        return object;
    }),

    RESPONSE_STATUS_INT(ofStatic(CLASS_RESPONSE, "status", RESPONSE_BUILDER, PRIMITIVE_INT), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        arguments.get(0).getPossibleValues().stream()
                .map(status -> (int) status).forEach(s -> addStatus(object, s));
        return object;
    }),

    RESPONSE_OK(ofStatic(CLASS_RESPONSE, "ok", RESPONSE_BUILDER), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        return addStatus(object, Response.Status.OK.getStatusCode());
    }),

    RESPONSE_OK_ENTITY(ofStatic(CLASS_RESPONSE, "ok", RESPONSE_BUILDER, OBJECT), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        addStatus(object, Response.Status.OK.getStatusCode());
        return addEntity(object, arguments.get(0));
    }),

    RESPONSE_OK_VARIANT(ofStatic(CLASS_RESPONSE, "ok", RESPONSE_BUILDER, OBJECT, VARIANT), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        addStatus(object, Response.Status.OK.getStatusCode());
        addEntity(object, arguments.get(0));
        addHeader(object, HttpHeaders.CONTENT_LANGUAGE);
        return addHeader(object, HttpHeaders.CONTENT_ENCODING);
    }),

    RESPONSE_OK_MEDIATYPE(ofStatic(CLASS_RESPONSE, "ok", RESPONSE_BUILDER, OBJECT, "Ljavax/ws/rs/core/MediaType;"), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        addStatus(object, Response.Status.OK.getStatusCode());
        arguments.get(1).getPossibleValues().stream().map(m -> (MediaType) m)
                .map(m -> m.getType() + '/' + m.getSubtype()).forEach(t -> addContentType(object, t));
        return addEntity(object, arguments.get(0));
    }),

    RESPONSE_OK_MEDIATYPE_STRING(ofStatic(CLASS_RESPONSE, "ok", RESPONSE_BUILDER, OBJECT, STRING), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        addStatus(object, Response.Status.OK.getStatusCode());
        arguments.get(1).getPossibleValues().stream()
                .map(t -> (String) t).forEach(t -> addContentType(object, t));
        return addEntity(object, arguments.get(0));
    }),

    RESPONSE_ACCEPTED(ofStatic(CLASS_RESPONSE, "accepted", RESPONSE_BUILDER), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        return addStatus(object, Response.Status.ACCEPTED.getStatusCode());
    }),

    RESPONSE_ACCEPTED_ENTITY(ofStatic(CLASS_RESPONSE, "accepted", RESPONSE_BUILDER, OBJECT), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        addStatus(object, Response.Status.ACCEPTED.getStatusCode());
        return addEntity(object, arguments.get(0));
    }),

    RESPONSE_CREATED(ofStatic(CLASS_RESPONSE, "created", RESPONSE_BUILDER, URI), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        addStatus(object, Response.Status.CREATED.getStatusCode());
        return addHeader(object, HttpHeaders.LOCATION);
    }),

    RESPONSE_NO_CONTENT(ofStatic(CLASS_RESPONSE, "noContent", RESPONSE_BUILDER), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        return addStatus(object, Response.Status.NO_CONTENT.getStatusCode());
    }),

    RESPONSE_NOT_ACCEPTABLE(ofStatic(CLASS_RESPONSE, "notAcceptable", RESPONSE_BUILDER, LIST), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        addStatus(object, Response.Status.NOT_ACCEPTABLE.getStatusCode());
        return addHeader(object, HttpHeaders.VARY);
    }),

    RESPONSE_NOT_MODIFIED(ofStatic(CLASS_RESPONSE, "notModified", RESPONSE_BUILDER), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        return addStatus(object, Response.Status.NOT_MODIFIED.getStatusCode());
    }),

    RESPONSE_NOT_MODIFIED_ENTITYTAG(ofStatic(CLASS_RESPONSE, "notModified", RESPONSE_BUILDER, ENTITY_TAG), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        addStatus(object, Response.Status.NOT_MODIFIED.getStatusCode());
        return addHeader(object, HttpHeaders.ETAG);
    }),

    RESPONSE_NOT_MODIFIED_ENTITYTAG_STRING(ofStatic(CLASS_RESPONSE, "notModified", RESPONSE_BUILDER, STRING), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        addStatus(object, Response.Status.NOT_MODIFIED.getStatusCode());
        return addHeader(object, HttpHeaders.ETAG);
    }),

    RESPONSE_SEE_OTHER(ofStatic(CLASS_RESPONSE, "seeOther", RESPONSE_BUILDER, URI), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        addStatus(object, Response.Status.SEE_OTHER.getStatusCode());
        return addHeader(object, HttpHeaders.LOCATION);
    }),

    RESPONSE_TEMPORARY_REDIRECT(ofStatic(CLASS_RESPONSE, "temporaryRedirect", RESPONSE_BUILDER, URI), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        addStatus(object, Response.Status.TEMPORARY_REDIRECT.getStatusCode());
        return addHeader(object, HttpHeaders.LOCATION);
    }),

    RESPONSE_SERVER_ERROR(ofStatic(CLASS_RESPONSE, "serverError", RESPONSE_BUILDER), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        return addStatus(object, Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
    }),

    // WebApplicationExceptions --------------------------

    WEB_APPLICATION_EXCEPTION_EMPTY(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        return addStatus(object, Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
    }),

    WEB_APPLICATION_EXCEPTION_MESSAGE(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, STRING), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        return addStatus(object, Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
    }),

    WEB_APPLICATION_EXCEPTION_RESPONSE(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, RESPONSE), (notAvailable, arguments) -> arguments.get(0)),

    WEB_APPLICATION_EXCEPTION_MESSAGE_RESPONSE(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, STRING, RESPONSE),
            (notAvailable, arguments) -> arguments.get(1)),

    WEB_APPLICATION_EXCEPTION_STATUS(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, PRIMITIVE_INT), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        arguments.get(0).getPossibleValues().stream()
                .map(status -> (int) status).forEach(s -> addStatus(object, s));
        return object;
    }),

    WEB_APPLICATION_EXCEPTION_MESSAGE_STATUS(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, STRING, PRIMITIVE_INT), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        arguments.get(1).getPossibleValues().stream()
                .map(status -> (int) status).forEach(s -> addStatus(object, s));
        return object;
    }),

    WEB_APPLICATION_EXCEPTION_RESPONSE_STATUS(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, RESPONSE_STATUS), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        arguments.get(0).getPossibleValues().stream()
                .map(status -> ((Response.Status) status).getStatusCode()).forEach(s -> addStatus(object, s));
        return object;
    }),

    WEB_APPLICATION_EXCEPTION_MESSAGE_RESPONSE_STATUS(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, STRING, RESPONSE_STATUS), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        arguments.get(1).getPossibleValues().stream()
                .map(status -> ((Response.Status) status).getStatusCode()).forEach(s -> addStatus(object, s));
        return object;
    }),

    WEB_APPLICATION_EXCEPTION_CAUSE(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, THROWABLE), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        return addStatus(object, Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
    }),

    WEB_APPLICATION_EXCEPTION_MESSAGE_CAUSE(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, STRING, THROWABLE), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        return addStatus(object, Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
    }),

    WEB_APPLICATION_EXCEPTION_CAUSE_RESPONSE(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, THROWABLE, RESPONSE),
            (notAvailable, arguments) -> arguments.get(1)),

    WEB_APPLICATION_EXCEPTION_MESSAGE_CAUSE_RESPONSE(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, STRING, THROWABLE, RESPONSE),
            (notAvailable, arguments) -> arguments.get(2)),

    WEB_APPLICATION_EXCEPTION_CAUSE_STATUS(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, THROWABLE, PRIMITIVE_INT), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        arguments.get(1).getPossibleValues().stream()
                .map(status -> (int) status).forEach(s -> addStatus(object, s));
        return object;
    }),

    WEB_APPLICATION_EXCEPTION_MESSAGE_CAUSE_STATUS(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, STRING, THROWABLE, PRIMITIVE_INT), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        arguments.get(2).getPossibleValues().stream()
                .map(status -> (int) status).forEach(s -> addStatus(object, s));
        return object;
    }),

    WEB_APPLICATION_EXCEPTION_CAUSE_RESPONSE_STATUS(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, THROWABLE, RESPONSE_STATUS), (notAvailable, arguments) -> {
        final Element object = new Element(RESPONSE, new HttpResponse());
        arguments.get(1).getPossibleValues().stream()
                .map(status -> ((Response.Status) status).getStatusCode()).forEach(s -> addStatus(object, s));
        return object;
    }),

    WEB_APPLICATION_EXCEPTION_MESSAGE_CAUSE_RESPONSE_STATUS(ofNonStatic(CLASS_WEB_APPLICATION_EXCEPTION, INITIALIZER_NAME, PRIMITIVE_VOID, STRING, THROWABLE, RESPONSE_STATUS),
            (notAvailable, arguments) -> {
                final Element object = new Element(RESPONSE, new HttpResponse());
                arguments.get(2).getPossibleValues().stream()
                        .map(status -> ((Response.Status) status).getStatusCode()).forEach(s -> addStatus(object, s));
                return object;
            }),

    // other methods --------------------------

    RESOURCE_CONTEXT_INIT(ofNonStatic(CLASS_RESOURCE_CONTEXT, "getResource", OBJECT, CLASS),
            (object, arguments) -> new Element(arguments.get(0).getPossibleValues().stream()
                    .filter(s -> s instanceof String).map(s -> (String) s).collect(Collectors.toSet()))
    ),

    RESOURCE_CONTEXT_GET(ofNonStatic(CLASS_RESOURCE_CONTEXT, "initResource", OBJECT, OBJECT),
            (object, arguments) -> new Element(arguments.get(0).getTypes())),

    INTEGER_VALUE_OF(ofStatic(CLASS_INTEGER, "valueOf", PRIMITIVE_INT, INTEGER),
            (object, arguments) -> new Element(INTEGER, arguments.get(0).getPossibleValues().toArray())),

    DOUBLE_VALUE_OF(ofStatic(CLASS_DOUBLE, "valueOf", PRIMITIVE_DOUBLE, DOUBLE),
            (object, arguments) -> new Element(INTEGER, arguments.get(0).getPossibleValues().toArray())),

    LONG_VALUE_OF(ofStatic(CLASS_LONG, "valueOf", PRIMITIVE_LONG, LONG),
            (object, arguments) -> new Element(INTEGER, arguments.get(0).getPossibleValues().toArray())),

    // stream related methods --------------------------

    LIST_STREAM(ofNonStatic(CLASS_LIST, "stream", STREAM),
            (object, arguments) -> new Element(object.getTypes())),

    LIST_FOR_EACH(ofNonStatic(CLASS_LIST, "forEach", PRIMITIVE_VOID, CONSUMER), (object, arguments) -> {
        if (arguments.get(0) instanceof MethodHandle)
            ((Method) arguments.get(0)).invoke(null, Collections.singletonList(object));
        return null;
    }),

    SET_STREAM(ofNonStatic(CLASS_SET, "stream", STREAM),
            (object, arguments) -> new Element(object.getTypes())),

    SET_FOR_EACH(ofNonStatic(CLASS_SET, "forEach", PRIMITIVE_VOID, CONSUMER), (object, arguments) -> {
        if (arguments.get(0) instanceof MethodHandle)
            ((Method) arguments.get(0)).invoke(null, Collections.singletonList(object));
        return null;
    }),

    STREAM_COLLECT(ofNonStatic(CLASS_STREAM, "collect", OBJECT, SUPPLIER, BI_CONSUMER, BI_CONSUMER),
            (object, arguments) -> {
                if (arguments.get(0) instanceof MethodHandle && arguments.get(1) instanceof MethodHandle) {
                    final Element collectionElement = ((Method) arguments.get(0)).invoke(null, Collections.emptyList());
                    ((Method) arguments.get(1)).invoke(null, Arrays.asList(collectionElement, object));
                    return collectionElement;
                }
                return new Element();
            }),

    STREAM_FOR_EACH(ofNonStatic(CLASS_STREAM, "forEach", PRIMITIVE_VOID, CONSUMER), (object, arguments) -> {
        if (arguments.get(0) instanceof MethodHandle)
            ((Method) arguments.get(0)).invoke(null, Collections.singletonList(object));
        return null;
    }),

    STREAM_MAP(ofNonStatic(CLASS_STREAM, "map", STREAM, "Ljava/util/function/Function;"), (object, arguments) -> {
        if (arguments.get(0) instanceof MethodHandle) {
            return ((MethodHandle) arguments.get(0)).invoke(null, Collections.singletonList(object));
        }
        return new Element();
    });

    private final MethodIdentifier identifier;

    private final BiFunction<Element, List<Element>, Element> function;

    KnownResponseResultMethod(final MethodIdentifier identifier,
                              final BiFunction<Element, List<Element>, Element> function) {
        this.identifier = identifier;
        this.function = function;
    }

    @Override
    public Element invoke(final Element object, final List<Element> arguments) {
        if (arguments.size() != identifier.getParameters().size())
            throw new IllegalArgumentException("Method arguments do not match expected signature!");

        return function.apply(object, arguments);
    }

    @Override
    public boolean matches(final MethodIdentifier identifier) {
        return this.identifier.equals(identifier);
    }

    private static Element addHeader(final Element object, final String header) {
        object.getPossibleValues().stream().filter(r -> r instanceof HttpResponse).map(r -> (HttpResponse) r).forEach(r -> r.getHeaders().add(header));
        return object;
    }

    private static Element addEntity(final Element object, final Element argument) {
        object.getPossibleValues().stream().filter(r -> r instanceof HttpResponse).map(r -> (HttpResponse) r)
                .forEach(r -> {
                    r.getEntityTypes().addAll(argument.getTypes());
                    argument.getPossibleValues().stream().filter(j -> j instanceof JsonValue).map(j -> (JsonValue) j).forEach(j -> r.getInlineEntities().add(j));
                });
        return object;
    }

    private static Element addStatus(final Element object, final Integer status) {
        object.getPossibleValues().stream().filter(r -> r instanceof HttpResponse).map(r -> (HttpResponse) r).forEach(r -> r.getStatuses().add(status));
        return object;
    }

    private static Element addContentType(final Element object, final String type) {
        object.getPossibleValues().stream().filter(r -> r instanceof HttpResponse).map(r -> (HttpResponse) r).forEach(r -> r.getContentTypes().add(type));
        return object;
    }

}

================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/MethodPool.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.simulation;

import com.sebastian_daschner.jaxrs_analyzer.model.elements.Element;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.IdentifiableMethod;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.Method;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.ProjectMethod;

import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.function.Function;
import java.util.stream.Stream;

import static com.sebastian_daschner.jaxrs_analyzer.model.Types.PRIMITIVE_VOID;

/**
 * A thread-safe singleton pool of known {@link Method}s.
 *
 * @author Sebastian Daschner
 */
public class MethodPool {

    /**
     * The only instance of the method pool.
     */
    private static final MethodPool INSTANCE = new MethodPool();
    private static final Function<MethodIdentifier, Method> DEFAULT_METHOD = identifier -> (object, arguments) -> {
        if (!PRIMITIVE_VOID.equals(identifier.getReturnType()))
            return new Element(identifier.getReturnType());
        return null;
    };

    private final List<IdentifiableMethod> availableMethods;
    private final ReadWriteLock readWriteLock;

    private MethodPool() {
        availableMethods = new LinkedList<>();

        // order matters, known methods are taken first
        Stream.of(KnownResponseResultMethod.values()).forEach(availableMethods::add);
        Stream.of(KnownJsonResultMethod.values()).forEach(availableMethods::add);

        readWriteLock = new ReentrantReadWriteLock();
    }

    /**
     * Adds a project method to the pool.
     *
     * @param method The method to add
     */
    public void addProjectMethod(final ProjectMethod method) {
        readWriteLock.writeLock().lock();
        try {
            availableMethods.add(method);
        } finally {
            readWriteLock.writeLock().unlock();
        }
    }

    /**
     * Returns a method identified by an method identifier.
     *
     * @param identifier The method identifier
     * @return The found method or a default handler
     */
    public Method get(final MethodIdentifier identifier) {
        // search for available methods
        readWriteLock.readLock().lock();
        try {
            final Optional<? extends IdentifiableMethod> method = availableMethods.stream().filter(m -> m.matches(identifier)).findAny();
            if (method.isPresent())
                return method.get();
        } finally {
            readWriteLock.readLock().unlock();
        }

        // apply default behaviour
        return DEFAULT_METHOD.apply(identifier);
    }

    /**
     * Returns the singleton instance.
     *
     * @return The method pool
     */
    public static MethodPool getInstance() {
        return INSTANCE;
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/MethodSimulator.java
================================================
/*
 * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.simulation;

import com.sebastian_daschner.jaxrs_analyzer.model.Types;
import com.sebastian_daschner.jaxrs_analyzer.model.elements.Element;
import com.sebastian_daschner.jaxrs_analyzer.model.elements.MethodHandle;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.*;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.Method;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier;
import org.objectweb.asm.Label;

import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import static com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils.determineLeastSpecificType;
import static com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils.toType;

/**
 * Simulates the instructions of a method. This class is thread-safe.
 *
 * @author Sebastian Daschner
 */
public class MethodSimulator {

    private final Lock lock = new ReentrantLock();
    private final MethodPool methodPool = MethodPool.getInstance();
    private final Stack<Element> runtimeStack = new Stack<>();
    private final MultivaluedMap<Label, Integer> variableInvalidation = new MultivaluedHashMap<>();
    private Label active;

    Map<Integer, Element> localVariables = new HashMap<>();

    private Element returnElement;

    /**
     * Simulates the instructions and collects information about the resource method.
     *
     * @param instructions The instructions of the method
     * @return The return element merged with all possible values
     */
    public Element simulate(final List<Instruction> instructions) {
        lock.lock();
        try {
            returnElement = null;
            return simulateInternal(instructions);
        } finally {
            lock.unlock();
        }
    }

    /**
     * Simulates the instructions of the method.
     *
     * @param instructions The instructions to simulate
     * @return The return element of the method
     */
    Element simulateInternal(final List<Instruction> instructions) {
        instructions.forEach(this::simulate);

        return returnElement;
    }

    /**
     * Simulates the instruction.
     *
     * @param instruction The instruction to simulate
     */
    private void simulate(final Instruction instruction) {
        switch (instruction.getType()) {
            case PUSH:
                final PushInstruction pushInstruction = (PushInstruction) instruction;
                runtimeStack.push(new Element(pushInstruction.getValueType(), pushInstruction.getValue()));
                break;
            case METHOD_HANDLE:
                simulateMethodHandle((InvokeDynamicInstruction) instruction);
                break;
            case INVOKE:
                simulateInvoke((InvokeInstruction) instruction);
                break;
            case GET_FIELD:
                runtimeStack.pop();
                runtimeStack.push(new Element(((GetFieldInstruction) instruction).getPropertyType()));
                break;
            case GET_STATIC:
                final GetStaticInstruction getStaticInstruction = (GetStaticInstruction) instruction;
                final Object value = getStaticInstruction.getValue();
                if (value != null)
                    runtimeStack.push(new Element(getStaticInstruction.getPropertyType(), value));
                else
                    runtimeStack.push(new Element(getStaticInstruction.getPropertyType()));
                break;
            case LOAD:
                final LoadInstruction loadInstruction = (LoadInstruction) instruction;
                runtimeStack.push(localVariables.getOrDefault(loadInstruction.getNumber(), new Element(loadInstruction.getVariableType())));
                runtimeStack.peek().getTypes().add(loadInstruction.getVariableType());
                variableInvalidation.add(loadInstruction.getValidUntil(), loadInstruction.getNumber());
                break;
            case STORE:
                simulateStore((StoreInstruction) instruction);
                break;
            case SIZE_CHANGE:
                simulateSizeChange((SizeChangingInstruction) instruction);
                break;
            case NEW:
                final NewInstruction newInstruction = (NewInstruction) instruction;
                runtimeStack.push(new Element(toType(newInstruction.getClassName())));
                break;
            case DUP:
                runtimeStack.push(runtimeStack.peek());
                break;
            case OTHER:
                // do nothing
                break;
            case RETURN:
                mergeReturnElement(runtimeStack.pop());
            case THROW:
                mergePossibleResponse();
                // stack has to be empty for further analysis
                runtimeStack.clear();
                break;
            default:
                throw new IllegalArgumentException("Instruction without type!");
        }

        if (instruction.getLabel() != active && variableInvalidation.containsKey(active)) {
            variableInvalidation.get(active).forEach(localVariables::remove);
        }
        active = instruction.getLabel();
    }

    /**
     * Simulates the invoke dynamic call. Pushes a method handle on the stack.
     *
     * @param instruction The instruction to simulate
     */
    private void simulateMethodHandle(final InvokeDynamicInstruction instruction) {
        final List<Element> arguments = IntStream.range(0, instruction.getDynamicIdentifier().getParameters().size())
                .mapToObj(t -> runtimeStack.pop()).collect(Collectors.toList());
        Collections.reverse(arguments);

        if (!instruction.getDynamicIdentifier().isStaticMethod())
            // first parameter is `this`
            arguments.remove(0);

        // adds the transferred arguments of the bootstrap call
        runtimeStack.push(new MethodHandle(instruction.getDynamicIdentifier().getReturnType(), instruction.getIdentifier(), arguments));
    }

    /**
     * Simulates the invoke instruction.
     *
     * @param instruction The instruction to simulate
     */
    private void simulateInvoke(final InvokeInstruction instruction) {
        final List<Element> arguments = new LinkedList<>();
        MethodIdentifier identifier = instruction.getIdentifier();

        IntStream.range(0, identifier.getParameters().size()).forEach(i -> arguments.add(runtimeStack.pop()));
        Collections.reverse(arguments);

        Element object = null;
        Method method;
        if (!identifier.isStaticMethod()) {
            object = runtimeStack.pop();
            if (object instanceof MethodHandle) {
                method = (Method) object;
            } else {
                method = methodPool.get(identifier);
            }
        } else {
            method = methodPool.get(identifier);
        }
        final Element returnedElement = method.invoke(object, arguments);
        if (returnedElement != null)
            runtimeStack.push(returnedElement);
        else if (!identifier.getReturnType().equals(Types.PRIMITIVE_VOID))
            runtimeStack.push(new Element(identifier.getReturnType()));
    }

    /**
     * Simulates the store instruction.
     *
     * @param instruction The instruction to simulate
     */
    private void simulateStore(final StoreInstruction instruction) {
        final int index = instruction.getNumber();
        final Element elementToStore = runtimeStack.pop();

        if (elementToStore instanceof MethodHandle)
            mergeMethodHandleStore(index, (MethodHandle) elementToStore);
        else
            mergeElementStore(index, instruction.getVariableType(), elementToStore);
    }

    /**
     * Merges a stored element to the local variables.
     *
     * @param index   The index of the variable
     * @param type    The type of the variable or the element (whatever is more specific)
     * @param element The element to merge
     */
    private void mergeElementStore(final int index, final String type, final Element element) {
        // new element must be created for immutability
        final String elementType = type.equals(Types.OBJECT) ? determineLeastSpecificType(element.getTypes().toArray(new String[element.getTypes().size()])) : type;
        final Element created = new Element(elementType);
        created.merge(element);
        localVariables.merge(index, created, Element::merge);
    }

    /**
     * Merges a stored method handle to the local variables.
     *
     * @param index        The index of the variable
     * @param methodHandle The method handle to merge
     */
    private void mergeMethodHandleStore(final int index, final MethodHandle methodHandle) {
        localVariables.merge(index, new MethodHandle(methodHandle), Element::merge);
    }

    /**
     * Checks if the current stack element is eligible for being merged with the returned element.
     */
    private void mergePossibleResponse() {
        // TODO only HttpResponse element?
        if (!runtimeStack.isEmpty() && runtimeStack.peek().getTypes().contains(Types.RESPONSE)) {
            mergeReturnElement(runtimeStack.peek());
        }
    }

    /**
     * Simulates the size change instruction.
     *
     * @param instruction The instruction to simulate
     */
    private void simulateSizeChange(final SizeChangingInstruction instruction) {
        IntStream.range(0, instruction.getNumberOfPops()).forEach(i -> runtimeStack.pop());
        IntStream.range(0, instruction.getNumberOfPushes()).forEach(i -> runtimeStack.push(new Element()));
    }

    /**
     * Merges the {@code returnElement} with the given element which was popped from the stack.
     * If the {@code returnElement} existed before, the values are merged.
     *
     * @param stackElement The popped element
     */
    private void mergeReturnElement(final Element stackElement) {
        if (returnElement != null)
            stackElement.merge(returnElement);
        returnElement = stackElement;
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/ContextClassReader.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;

import org.objectweb.asm.ClassReader;

import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * A {@link ClassReader} that is able to use a separate {@link ClassLoader}.
 *
 * @author Sebastian Daschner
 */
public class ContextClassReader extends ClassReader {

    private static final ExtensibleClassLoader CLASS_LOADER = new ExtensibleClassLoader();

    public ContextClassReader(final String className) throws IOException {
        super(CLASS_LOADER.getResourceAsStream(className.replace('.', '/') + ".class"));
    }

    public static ClassLoader getClassLoader() {
        return CLASS_LOADER;
    }

    public static void addClassPath(final URL url) {
        CLASS_LOADER.addURL(url);
    }

    private static class ExtensibleClassLoader extends URLClassLoader {

        ExtensibleClassLoader() {
            super(new URL[]{});
        }

        @Override
        public void addURL(final URL url) {
            super.addURL(url);
        }

    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSAnnotatedSuperMethodClassVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;

import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Type;

import java.lang.reflect.Method;

import static org.objectweb.asm.Opcodes.*;

/**
 * @author Sebastian Daschner
 */
class JAXRSAnnotatedSuperMethodClassVisitor extends ClassVisitor {

    private final MethodResult methodResult;
    private final Method method;

    JAXRSAnnotatedSuperMethodClassVisitor(final MethodResult methodResult, final Method method) {
        super(ASM5);
        this.methodResult = methodResult;
        this.method = method;
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
        final boolean legalModifiers = ((access & ACC_SYNTHETIC) | (access & ACC_STATIC) | (access & ACC_NATIVE)) == 0;

        final String descriptor = Type.getMethodDescriptor(method);
        if (legalModifiers && method.getName().equals(name) && (descriptor.equals(desc) || descriptor.equals(signature)))
            return new JAXRSAnnotatedSuperMethodVisitor(methodResult);

        return null;
    }

}



================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSAnnotatedSuperMethodVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;

import com.sebastian_daschner.jaxrs_analyzer.LogProvider;
import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation.*;
import com.sebastian_daschner.jaxrs_analyzer.model.Types;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.HttpMethod;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.MethodParameter;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.ParameterType;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.TypeIdentifier;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.MethodVisitor;

import java.util.BitSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.objectweb.asm.Opcodes.ASM5;

/**
 * @author Sebastian Daschner
 */
class JAXRSAnnotatedSuperMethodVisitor extends MethodVisitor {

    private final MethodResult methodResult;
    private final List<String> parameterTypes;
    private final Map<Integer, MethodParameter> methodParameters;
    private final BitSet annotatedParameters;

    JAXRSAnnotatedSuperMethodVisitor(final MethodResult methodResult) {
        super(ASM5);
        this.methodResult = methodResult;
        parameterTypes = methodResult.getOriginalMethodSignature().getParameters();
        annotatedParameters = new BitSet(parameterTypes.size());
        methodParameters = new HashMap<>();
    }

    @Override
    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
        switch (desc) {
            case Types.GET:
                methodResult.setHttpMethod(HttpMethod.GET);
                break;
            case Types.POST:
                methodResult.setHttpMethod(HttpMethod.POST);
                break;
            case Types.PUT:
                methodResult.setHttpMethod(HttpMethod.PUT);
                break;
            case Types.DELETE:
                methodResult.setHttpMethod(HttpMethod.DELETE);
                break;
            case Types.HEAD:
                methodResult.setHttpMethod(HttpMethod.HEAD);
                break;
            case Types.OPTIONS:
                methodResult.setHttpMethod(HttpMethod.OPTIONS);
                break;
            case Types.DEPRECATED:
                methodResult.setDeprecated(true);
                break;
            case Types.PATH:
                return new PathAnnotationVisitor(methodResult);
            case Types.CONSUMES:
                return new ConsumesAnnotationVisitor(methodResult);
            case Types.PRODUCES:
                return new ProducesAnnotationVisitor(methodResult);
        }
        return null;
    }

    @Override
    public AnnotationVisitor visitParameterAnnotation(final int index, final String annotationDesc, final boolean visible) {
        switch (annotationDesc) {
            case Types.PATH_PARAM:
                return paramAnnotationVisitor(index, ParameterType.PATH);
            case Types.QUERY_PARAM:
                return paramAnnotationVisitor(index, ParameterType.QUERY);
            case Types.HEADER_PARAM:
                return paramAnnotationVisitor(index, ParameterType.HEADER);
            case Types.FORM_PARAM:
                return paramAnnotationVisitor(index, ParameterType.FORM);
            case Types.COOKIE_PARAM:
                return paramAnnotationVisitor(index, ParameterType.COOKIE);
            case Types.MATRIX_PARAM:
                return paramAnnotationVisitor(index, ParameterType.MATRIX);
            case Types.DEFAULT_VALUE:
                return defaultAnnotationVisitor(index);
            case Types.SUSPENDED:
                LogProvider.debug("Handling of " + annotationDesc + " not yet implemented");
            case Types.CONTEXT:
                annotatedParameters.set(index);
            default:
                return null;
        }
    }

    private AnnotationVisitor paramAnnotationVisitor(final int index, final ParameterType parameterType) {
        annotatedParameters.set(index);
        final String type = parameterTypes.get(index);

        MethodParameter methodParameter = methodParameters.get(index);
        if (methodParameter == null) {
            methodParameter = new MethodParameter(TypeIdentifier.ofType(type), parameterType);
            methodParameters.put(index, methodParameter);
        } else {
            methodParameter.setParameterType(parameterType);
        }

        return new ParamAnnotationVisitor(methodParameter);
    }

    private AnnotationVisitor defaultAnnotationVisitor(final int index) {
        final String type = parameterTypes.get(index);

        MethodParameter methodParameter = methodParameters.get(index);
        if (methodParameter == null) {
            methodParameter = new MethodParameter(TypeIdentifier.ofType(type));
            methodParameters.put(index, methodParameter);
        }

        return new DefaultValueAnnotationVisitor(methodParameter);
    }

    @Override
    public void visitEnd() {
        if (annotatedParameters.cardinality() != parameterTypes.size()) {
            final String requestBodyType = parameterTypes.get(annotatedParameters.nextClearBit(0));
            methodResult.setRequestBodyType(requestBodyType);
        }
        methodResult.getMethodParameters().addAll(methodParameters.values());
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSClassVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;

import com.sebastian_daschner.jaxrs_analyzer.LogProvider;
import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation.ApplicationPathAnnotationVisitor;
import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation.ConsumesAnnotationVisitor;
import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation.PathAnnotationVisitor;
import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation.ProducesAnnotationVisitor;
import com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils;
import com.sebastian_daschner.jaxrs_analyzer.model.Types;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier;
import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;
import org.objectweb.asm.*;

import javax.ws.rs.*;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.stream.Stream;

import static com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils.isAnnotationPresent;
import static org.objectweb.asm.Opcodes.*;

/**
 * @author Sebastian Daschner
 */
public class JAXRSClassVisitor extends ClassVisitor {

    private static final Class<? extends Annotation>[] RELEVANT_METHOD_ANNOTATIONS = new Class[]{Path.class, GET.class, PUT.class, POST.class, DELETE.class, OPTIONS.class, HEAD.class};

    private final ClassResult classResult;

    public JAXRSClassVisitor(final ClassResult classResult) {
        super(ASM5);
        this.classResult = classResult;
    }

    @Override
    public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
        classResult.setOriginalClass(name);
    }

    @Override
    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
        switch (desc) {
            case Types.PATH:
                return new PathAnnotationVisitor(classResult);
            case Types.APPLICATION_PATH:
                return new ApplicationPathAnnotationVisitor(classResult);
            case Types.CONSUMES:
                return new ConsumesAnnotationVisitor(classResult);
            case Types.PRODUCES:
                return new ProducesAnnotationVisitor(classResult);
            case Types.DEPRECATED:
                classResult.setDeprecated(true);
                break;
        }
        return null;
    }

    @Override
    public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
        if ((access & ACC_STATIC) == 0)
            return new JAXRSFieldVisitor(classResult, desc, signature);
        return null;
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
        final boolean legalModifiers = ((access & ACC_SYNTHETIC) | (access & ACC_STATIC) | (access & ACC_NATIVE)) == 0;
        final String methodSignature = signature == null ? desc : signature;
        final MethodIdentifier identifier = MethodIdentifier.of(classResult.getOriginalClass(), name, methodSignature, false);

        if (legalModifiers && !"<init>".equals(name)) {
            final MethodResult methodResult = new MethodResult();
            if (hasJAXRSAnnotations(classResult.getOriginalClass(), name, methodSignature))
                return new JAXRSMethodVisitor(identifier, classResult, methodResult, true);
            else {
                final Method annotatedSuperMethod = searchAnnotatedSuperMethod(classResult.getOriginalClass(), name, methodSignature);
                if (annotatedSuperMethod != null) {
                    try {
                        return new JAXRSMethodVisitor(identifier, classResult, methodResult, false);
                    } finally {
                        classResult.getMethods().stream().filter(m -> m.equals(methodResult)).findAny().ifPresent(m -> visitJAXRSSuperMethod(annotatedSuperMethod, m));
                    }
                }
            }
        }
        return null;
    }

    private static boolean hasJAXRSAnnotations(final String className, final String methodName, final String signature) {
        final Method method = JavaUtils.findMethod(className, methodName, signature);
        return method != null && hasJAXRSAnnotations(method);
    }

    private static Method searchAnnotatedSuperMethod(final String className, final String methodName, final String methodSignature) {
        final List<Class<?>> superTypes = determineSuperTypes(className);
        return superTypes.stream().map(c -> {
            final Method superAnnotatedMethod = JavaUtils.findMethod(c, methodName, methodSignature);
            if (superAnnotatedMethod != null && hasJAXRSAnnotations(superAnnotatedMethod))
                return superAnnotatedMethod;
            return null;
        }).filter(Objects::nonNull).findAny().orElse(null);
    }

    private static List<Class<?>> determineSuperTypes(final String className) {
        final Class<?> loadedClass = JavaUtils.loadClassFromName(className);
        if (loadedClass == null)
            return Collections.emptyList();

        final List<Class<?>> superClasses = new ArrayList<>();
        final Queue<Class<?>> classesToCheck = new LinkedBlockingQueue<>();
        Class<?> currentClass = loadedClass;

        do {
            if (currentClass.getSuperclass() != null && Object.class != currentClass.getSuperclass())
                classesToCheck.add(currentClass.getSuperclass());

            Stream.of(currentClass.getInterfaces()).forEach(classesToCheck::add);

            if (currentClass != loadedClass)
                superClasses.add(currentClass);

        } while ((currentClass = classesToCheck.poll()) != null);

        return superClasses;
    }

    private static boolean hasJAXRSAnnotations(final Method method) {
        for (final Object annotation : method.getDeclaredAnnotations()) {
            // TODO test both
            if (Stream.of(RELEVANT_METHOD_ANNOTATIONS).map(a -> JavaUtils.getAnnotation(method, a))
                    .filter(Objects::nonNull).anyMatch(a -> a.getClass().isAssignableFrom(annotation.getClass())))
                return true;

            if (isAnnotationPresent(annotation.getClass(), HttpMethod.class))
                return true;
        }
        return false;
    }

    private void visitJAXRSSuperMethod(Method method, MethodResult methodResult) {
        try {

            final ClassReader classReader = new ContextClassReader(method.getDeclaringClass().getCanonicalName());
            final ClassVisitor visitor = new JAXRSAnnotatedSuperMethodClassVisitor(methodResult, method);

            classReader.accept(visitor, ClassReader.EXPAND_FRAMES);
        } catch (IOException e) {
            LogProvider.error("Could not analyze JAX-RS super annotated method " + method);
            LogProvider.debug(e);
        }
    }

}



================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSFieldVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;

import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation.DefaultValueAnnotationVisitor;
import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation.ParamAnnotationVisitor;
import com.sebastian_daschner.jaxrs_analyzer.model.Types;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.MethodParameter;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.ParameterType;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.TypeIdentifier;
import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.Opcodes;

/**
 * @author Sebastian Daschner
 */
class JAXRSFieldVisitor extends FieldVisitor {

    private final ClassResult classResult;
    private final String signature;
    private MethodParameter parameter;

    JAXRSFieldVisitor(final ClassResult classResult, final String desc, final String signature) {
        super(Opcodes.ASM5);
        this.classResult = classResult;
        this.signature = signature == null ? desc : signature;
    }

    @Override
    public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
        switch (desc) {
            case Types.PATH_PARAM:
                return paramAnnotationVisitor(ParameterType.PATH);
            case Types.QUERY_PARAM:
                return paramAnnotationVisitor(ParameterType.QUERY);
            case Types.HEADER_PARAM:
                return paramAnnotationVisitor(ParameterType.HEADER);
            case Types.FORM_PARAM:
                return paramAnnotationVisitor(ParameterType.FORM);
            case Types.COOKIE_PARAM:
                return paramAnnotationVisitor(ParameterType.COOKIE);
            case Types.MATRIX_PARAM:
                return paramAnnotationVisitor(ParameterType.MATRIX);
            case Types.DEFAULT_VALUE:
                return defaultAnnotationVisitor();
            default:
                return null;
        }
    }

    private AnnotationVisitor paramAnnotationVisitor(final ParameterType parameterType) {
        if (parameter == null)
            parameter = new MethodParameter(TypeIdentifier.ofType(signature), parameterType);
        else
            parameter.setParameterType(parameterType);
        return new ParamAnnotationVisitor(parameter);
    }

    private AnnotationVisitor defaultAnnotationVisitor() {
        if (parameter == null)
            parameter = new MethodParameter(TypeIdentifier.ofType(signature));
        return new DefaultValueAnnotationVisitor(parameter);
    }

    @Override
    public void visitEnd() {
        if (parameter != null)
            classResult.getClassFields().add(parameter);
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSMethodVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;

import com.sebastian_daschner.jaxrs_analyzer.LogProvider;
import com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.collection.InstructionBuilder;
import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation.*;
import com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils;
import com.sebastian_daschner.jaxrs_analyzer.model.Types;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.HttpMethod;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.MethodParameter;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.ParameterType;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.TypeIdentifier;
import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Opcodes;

import java.util.BitSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Sebastian Daschner
 */
class JAXRSMethodVisitor extends ProjectMethodVisitor {

    private final List<String> parameterTypes;
    private final Map<Integer, MethodParameter> methodParameters;
    private final BitSet annotatedParameters;
    private final boolean methodAnnotated;

    JAXRSMethodVisitor(final MethodIdentifier identifier, final ClassResult classResult, final MethodResult methodResult, final boolean methodAnnotated) {
        super(methodResult, identifier.getContainingClass());
        this.methodAnnotated = methodAnnotated;

        parameterTypes = identifier.getParameters();
        annotatedParameters = new BitSet(parameterTypes.size());
        methodParameters = new HashMap<>();

        methodResult.setOriginalMethodSignature(identifier);
        classResult.add(methodResult);
    }

    @Override
    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
        switch (desc) {
            case Types.GET:
                methodResult.setHttpMethod(HttpMethod.GET);
                break;
            case Types.POST:
                methodResult.setHttpMethod(HttpMethod.POST);
                break;
            case Types.PUT:
                methodResult.setHttpMethod(HttpMethod.PUT);
                break;
            case Types.DELETE:
                methodResult.setHttpMethod(HttpMethod.DELETE);
                break;
            case Types.HEAD:
                methodResult.setHttpMethod(HttpMethod.HEAD);
                break;
            case Types.OPTIONS:
                methodResult.setHttpMethod(HttpMethod.OPTIONS);
                break;
            case Types.DEPRECATED:
                methodResult.setDeprecated(true);
                break;
            case Types.PATH:
                return new PathAnnotationVisitor(methodResult);
            case Types.CONSUMES:
                return new ConsumesAnnotationVisitor(methodResult);
            case Types.PRODUCES:
                return new ProducesAnnotationVisitor(methodResult);
        }
        return null;
    }

    @Override
    public AnnotationVisitor visitParameterAnnotation(final int index, final String annotationDesc, final boolean visible) {
        switch (annotationDesc) {
            case Types.PATH_PARAM:
                return paramAnnotationVisitor(index, ParameterType.PATH);
            case Types.QUERY_PARAM:
                return paramAnnotationVisitor(index, ParameterType.QUERY);
            case Types.HEADER_PARAM:
                return paramAnnotationVisitor(index, ParameterType.HEADER);
            case Types.FORM_PARAM:
                return paramAnnotationVisitor(index, ParameterType.FORM);
            case Types.COOKIE_PARAM:
                return paramAnnotationVisitor(index, ParameterType.COOKIE);
            case Types.MATRIX_PARAM:
                return paramAnnotationVisitor(index, ParameterType.MATRIX);
            case Types.DEFAULT_VALUE:
                return defaultAnnotationVisitor(index);
            case Types.SUSPENDED:
                LogProvider.debug("Handling of " + annotationDesc + " not yet implemented");
            case Types.CONTEXT:
                annotatedParameters.set(index);
            default:
                return null;
        }
    }

    private AnnotationVisitor paramAnnotationVisitor(final int index, final ParameterType parameterType) {
        annotatedParameters.set(index);
        final String type = parameterTypes.get(index);

        MethodParameter methodParameter = methodParameters.get(index);
        if (methodParameter == null) {
            methodParameter = new MethodParameter(TypeIdentifier.ofType(type), parameterType);
            methodParameters.put(index, methodParameter);
        } else {
            methodParameter.setParameterType(parameterType);
        }

        return new ParamAnnotationVisitor(methodParameter);
    }

    private AnnotationVisitor defaultAnnotationVisitor(final int index) {
        final String type = parameterTypes.get(index);

        MethodParameter methodParameter = methodParameters.computeIfAbsent(index, i -> new MethodParameter(TypeIdentifier.ofType(type)));

        return new DefaultValueAnnotationVisitor(methodParameter);
    }

    @Override
    public void visitEnd() {
        super.visitEnd();
        // determine request body parameter
        if (methodAnnotated) {
            if (annotatedParameters.cardinality() != parameterTypes.size()) {
                final String requestBodyType = parameterTypes.get(annotatedParameters.nextClearBit(0));
                methodResult.setRequestBodyType(requestBodyType);
            }
            methodResult.getMethodParameters().addAll(methodParameters.values());

            final Class<?> containingClass = JavaUtils.loadClassFromName(methodResult.getOriginalMethodSignature().getContainingClass());

            if (containingClass != null && containingClass.isInterface()) {
                methodResult.getInstructions().add(InstructionBuilder.buildInstruction(Opcodes.ICONST_0, null));
                methodResult.getInstructions().add(InstructionBuilder.buildInstruction(Opcodes.ARETURN, null));
            }
        }

        // TODO determine potential super methods which are annotated with JAX-RS annotations.
        if (methodResult.getHttpMethod() == null) {
            // method is a sub resource locator
            final ClassResult classResult = new ClassResult();
            methodResult.setSubResource(classResult);
        }
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/ProjectMethodClassVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;

import com.sebastian_daschner.jaxrs_analyzer.LogProvider;
import com.sebastian_daschner.jaxrs_analyzer.model.Types;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;

import java.io.IOException;

import static org.objectweb.asm.Opcodes.*;

/**
 * @author Sebastian Daschner
 */
public class ProjectMethodClassVisitor extends ClassVisitor {

    private final MethodResult methodResult;
    private final MethodIdentifier identifier;
    private boolean methodFound;
    private String superName;

    public ProjectMethodClassVisitor(final MethodResult methodResult, final MethodIdentifier identifier) {
        super(ASM5);
        this.methodResult = methodResult;
        this.identifier = identifier;
    }

    @Override
    public void visit(final int version, final int access, final String name, final String signature, final String superName, final String[] interfaces) {
        this.superName = superName;
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
        // TODO allow abstract?
        final boolean legalModifiers = (access & ACC_ABSTRACT | access & ACC_NATIVE) == 0;

        final String methodSignature = identifier.getSignature();
        if (legalModifiers && identifier.getMethodName().equals(name) && (methodSignature.equals(desc) || methodSignature.equals(signature))) {
            methodFound = true;
            return new ProjectMethodVisitor(methodResult, identifier.getContainingClass());
        }

        return null;
    }

    @Override
    public void visitEnd() {
        // if method hasn't been found it may be on a super class (invoke_virtual)
        if (!methodFound && !superName.equals(Types.CLASS_OBJECT)) {
            try {
                final ClassReader classReader = new ContextClassReader(superName);
                final ClassVisitor visitor = new ProjectMethodClassVisitor(methodResult, identifier);

                classReader.accept(visitor, ClassReader.EXPAND_FRAMES);
            } catch (IOException e) {
                LogProvider.error("Could not analyze project method " + superName + "#" + identifier.getMethodName());
                LogProvider.debug(e);
            }
        }
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/ProjectMethodVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;

import com.sebastian_daschner.jaxrs_analyzer.model.Types;
import com.sebastian_daschner.jaxrs_analyzer.model.instructions.*;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;
import org.objectweb.asm.Handle;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Type;

import java.util.*;
import java.util.stream.Stream;

import static com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.collection.InstructionBuilder.*;
import static com.sebastian_daschner.jaxrs_analyzer.model.instructions.Instruction.InstructionType.LOAD_PLACEHOLDER;
import static com.sebastian_daschner.jaxrs_analyzer.model.instructions.Instruction.InstructionType.STORE_PLACEHOLDER;
import static org.objectweb.asm.Opcodes.*;
import static org.objectweb.asm.util.Printer.OPCODES;

/**
 * @author Sebastian Daschner
 */
class ProjectMethodVisitor extends MethodVisitor {

    private final Set<Label> exceptionHandlers = new HashSet<>();
    private final List<Label> visitedLabels = new ArrayList<>();
    final MethodResult methodResult;
    private final String className;

    ProjectMethodVisitor(MethodResult methodResult, String className) {
        super(ASM5);
        // TODO refactor to list of instructions only
        this.methodResult = methodResult;
        this.className = className;
    }

    @Override
    public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
        exceptionHandlers.add(handler);
    }

    @Override
    public void visitLabel(Label label) {
        visitedLabels.add(label);
        if (exceptionHandlers.remove(label))
            methodResult.getInstructions().add(new ExceptionHandlerInstruction(label));
    }

    @Override
    public void visitMaxs(final int maxStack, final int maxLocals) {
        super.visitMaxs(maxStack, maxLocals);
    }

    @Override
    public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
        // resolve LOAD & STORE placeholders
        ListIterator<Instruction> iterator = methodResult.getInstructions().listIterator();
        while (iterator.hasNext()) {
            final Instruction instruction = iterator.next();
            if (instruction.getType() != LOAD_PLACEHOLDER && instruction.getType() != STORE_PLACEHOLDER)
                continue;

            final LoadStoreInstructionPlaceholder placeholder = (LoadStoreInstructionPlaceholder) instruction;
            if (placeholder.getNumber() != index)
                continue;

            final Label label = placeholder.getLabel();
            if (isLabelActive(label, start, end)) {
                final String type = signature != null ? signature : desc;
                iterator.set(placeholder.getType() == LOAD_PLACEHOLDER ? new LoadInstruction(index, type, name, label, end) : new StoreInstruction(index, type, name, label));
            }
        }
    }

    private boolean isLabelActive(final Label label, final Label start, final Label end) {
        boolean startVisited = false;
        for (final Label current : visitedLabels) {
            if (current == start)
                startVisited = true;
            if (current == label)
                return startVisited;
            if (current == end)
                return false;
        }
        return false;
    }

    @Override
    public void visitInsn(int opcode) {
        methodResult.getInstructions().add(buildInstruction(opcode, getLastLabel()));
    }

    @Override
    public void visitIntInsn(int opcode, int operand) {
        methodResult.getInstructions().add(buildIntInstruction(opcode, operand, getLastLabel()));
    }

    @Override
    public void visitVarInsn(int opcode, int index) {
        final Label label = !visitedLabels.isEmpty() ? visitedLabels.get(visitedLabels.size() - 1) : null;
        methodResult.getInstructions().add(buildLoadStoreInstruction(opcode, index, label));
    }

    @Override
    public void visitTypeInsn(int opcode, String className) {
        methodResult.getInstructions().add(buildTypeInstruction(opcode, className, getLastLabel()));
    }

    @Override
    public void visitFieldInsn(int opcode, String owner, String name, String desc) {
        methodResult.getInstructions().add(buildFieldInstruction(opcode, owner, name, desc, getLastLabel()));
    }

    @Override
    public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
        methodResult.getInstructions().add(buildInvokeInstruction(opcode, owner, name, desc, getLastLabel()));
    }

    @Override
    public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
        final Handle handle = Stream.of(bsmArgs).filter(a -> a instanceof Handle).map(a -> (Handle) a)
                .findAny().orElse(bsm);

        methodResult.getInstructions().add(buildInvokeDynamic(className, name, desc, handle, getLastLabel()));
    }

    @Override
    public void visitJumpInsn(int opcode, Label label) {
        methodResult.getInstructions().add(buildJumpInstruction(opcode, label));
    }

    @Override
    public void visitLdcInsn(Object object) {
        methodResult.getInstructions().add(createLdcInstruction(object, getLastLabel()));
    }

    private Label getLastLabel() {
        if (visitedLabels.isEmpty())
            return null;
        return visitedLabels.get(visitedLabels.size() - 1);
    }

    private PushInstruction createLdcInstruction(final Object object, final Label label) {
        // see MethodVisitor
        if (object instanceof Integer) {
            return new PushInstruction(object, Types.INTEGER, label);
        }
        if (object instanceof Float) {
            return new PushInstruction(object, Types.FLOAT, label);
        }
        if (object instanceof Long) {
            return new PushInstruction(object, Types.LONG, label);
        }
        if (object instanceof Double) {
            return new PushInstruction(object, Types.DOUBLE, label);
        }
        if (object instanceof String) {
            return new PushInstruction(object, Types.STRING, label);
        }
        if (object instanceof Type) {
            return new PushInstruction(((Type) object).getDescriptor(), Types.CLASS, label);
        }
        return new PushInstruction(object, Type.getDescriptor(object.getClass()), label);
    }

    @Override
    public void visitIincInsn(int var, int increment) {
        methodResult.getInstructions().add(new DefaultInstruction(OPCODES[IINC], getLastLabel()));
    }

    @Override
    public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
        methodResult.getInstructions().add(new SizeChangingInstruction(OPCODES[TABLESWITCH], 0, 1, getLastLabel()));
    }

    @Override
    public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
        methodResult.getInstructions().add(new SizeChangingInstruction(OPCODES[LOOKUPSWITCH], 0, 1, getLastLabel()));
    }

    @Override
    public void visitMultiANewArrayInsn(String desc, int dimensions) {
        methodResult.getInstructions().add(new SizeChangingInstruction(OPCODES[MULTIANEWARRAY], 1, dimensions, getLastLabel()));
    }

    @Override
    public void visitEnd() {
        // resolve unresolved placeholders
        final ListIterator<Instruction> listIterator = methodResult.getInstructions().listIterator();
        while (listIterator.hasNext()) {
            final Instruction instruction = listIterator.next();
            if (instruction.getType() == LOAD_PLACEHOLDER) {
                listIterator.set(new LoadInstruction(((LoadStoreInstructionPlaceholder) instruction).getNumber(), Types.OBJECT, instruction.getLabel(), null));
            } else if (instruction.getType() == STORE_PLACEHOLDER) {
                listIterator.set(new StoreInstruction(((LoadStoreInstructionPlaceholder) instruction).getNumber(), Types.OBJECT, instruction.getLabel()));
            }
        }
    }
}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ApplicationPathAnnotationVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;

import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult;

/**
 * @author Sebastian Daschner
 */
public class ApplicationPathAnnotationVisitor extends ValueAnnotationVisitor {

    private final ClassResult classResult;

    public ApplicationPathAnnotationVisitor(final ClassResult classResult) {
        this.classResult = classResult;
    }

    @Override
    protected void visitValue(final String value) {
        classResult.setApplicationPath(value);
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ClassAndMethodAnnotationVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;

import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;

import java.util.Objects;

/**
 * @author Sebastian Daschner
 */
abstract class ClassAndMethodAnnotationVisitor extends ValueAnnotationVisitor {

    private final ClassResult classResult;
    private final MethodResult methodResult;

    ClassAndMethodAnnotationVisitor(final ClassResult classResult) {
        this(classResult, null);
        Objects.requireNonNull(classResult);
    }

    ClassAndMethodAnnotationVisitor(final MethodResult methodResult) {
        this(null, methodResult);
        Objects.requireNonNull(methodResult);
    }

    private ClassAndMethodAnnotationVisitor(final ClassResult classResult, final MethodResult methodResult) {
        this.classResult = classResult;
        this.methodResult = methodResult;
    }

    protected abstract void visitValue(String value, ClassResult classResult);

    protected abstract void visitValue(String value, MethodResult methodResult);

    @Override
    protected final void visitValue(final String value) {
        if (classResult != null)
            visitValue(value, classResult);
        else
            visitValue(value, methodResult);
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ConsumesAnnotationVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;

import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;

/**
 * @author Sebastian Daschner
 */
public class ConsumesAnnotationVisitor extends ClassAndMethodAnnotationVisitor {

    public ConsumesAnnotationVisitor(final ClassResult classResult) {
        super(classResult);
    }

    public ConsumesAnnotationVisitor(final MethodResult methodResult) {
        super(methodResult);
    }

    @Override
    protected void visitValue(final String value, final ClassResult classResult) {
        classResult.getRequestMediaTypes().add(value);
    }

    @Override
    protected void visitValue(final String value, final MethodResult methodResult) {
        methodResult.getRequestMediaTypes().add(value);
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/DefaultValueAnnotationVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;

import com.sebastian_daschner.jaxrs_analyzer.model.rest.MethodParameter;

/**
 * Visits the {@link javax.ws.rs.DefaultValue} annotation and sets the configured value.
 *
 * @author Daryl Teo
 * @author Sebastian Daschner
 */
public class DefaultValueAnnotationVisitor extends ValueAnnotationVisitor {

    private final MethodParameter parameter;

    public DefaultValueAnnotationVisitor(final MethodParameter parameter) {
        this.parameter = parameter;
    }

    @Override
    protected void visitValue(String value) {
        parameter.setDefaultValue(value);
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ParamAnnotationVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;

import com.sebastian_daschner.jaxrs_analyzer.model.rest.MethodParameter;

/**
 * @author Sebastian Daschner
 */
public class ParamAnnotationVisitor extends ValueAnnotationVisitor {

    private final MethodParameter parameter;

    public ParamAnnotationVisitor(final MethodParameter parameter) {
        this.parameter = parameter;
    }

    @Override
    protected void visitValue(final String value) {
        parameter.setName(value);
    }

}


================================================
FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/PathAnnotationVisitor.java
================================================
package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;

import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult;
import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult;

/**
 * @author Sebastian Daschner
 */
public class PathAnnotationVisitor extends ClassAndMethod
Download .txt
gitextract_st1raaxs/

├── .gitignore
├── Changelog.adoc
├── Documentation.adoc
├── LICENSE
├── README.adoc
├── pom.xml
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── sebastian_daschner/
    │   │           └── jaxrs_analyzer/
    │   │               ├── JAXRSAnalyzer.java
    │   │               ├── LogProvider.java
    │   │               ├── Main.java
    │   │               ├── analysis/
    │   │               │   ├── JobRegistry.java
    │   │               │   ├── ProjectAnalyzer.java
    │   │               │   ├── bytecode/
    │   │               │   │   ├── BytecodeAnalyzer.java
    │   │               │   │   ├── MethodContentAnalyzer.java
    │   │               │   │   ├── ResourceMethodContentAnalyzer.java
    │   │               │   │   ├── SubResourceLocatorMethodContentAnalyzer.java
    │   │               │   │   ├── collection/
    │   │               │   │   │   └── InstructionBuilder.java
    │   │               │   │   ├── reduction/
    │   │               │   │   │   ├── InstructionFinder.java
    │   │               │   │   │   ├── RelevantInstructionReducer.java
    │   │               │   │   │   └── StackSizeSimulator.java
    │   │               │   │   └── simulation/
    │   │               │   │       ├── InjectableArgumentMethodSimulator.java
    │   │               │   │       ├── KnownJsonResultMethod.java
    │   │               │   │       ├── KnownResponseResultMethod.java
    │   │               │   │       ├── MethodPool.java
    │   │               │   │       └── MethodSimulator.java
    │   │               │   ├── classes/
    │   │               │   │   ├── ContextClassReader.java
    │   │               │   │   ├── JAXRSAnnotatedSuperMethodClassVisitor.java
    │   │               │   │   ├── JAXRSAnnotatedSuperMethodVisitor.java
    │   │               │   │   ├── JAXRSClassVisitor.java
    │   │               │   │   ├── JAXRSFieldVisitor.java
    │   │               │   │   ├── JAXRSMethodVisitor.java
    │   │               │   │   ├── ProjectMethodClassVisitor.java
    │   │               │   │   ├── ProjectMethodVisitor.java
    │   │               │   │   └── annotation/
    │   │               │   │       ├── ApplicationPathAnnotationVisitor.java
    │   │               │   │       ├── ClassAndMethodAnnotationVisitor.java
    │   │               │   │       ├── ConsumesAnnotationVisitor.java
    │   │               │   │       ├── DefaultValueAnnotationVisitor.java
    │   │               │   │       ├── ParamAnnotationVisitor.java
    │   │               │   │       ├── PathAnnotationVisitor.java
    │   │               │   │       ├── ProducesAnnotationVisitor.java
    │   │               │   │       └── ValueAnnotationVisitor.java
    │   │               │   ├── javadoc/
    │   │               │   │   ├── JavaDocAnalyzer.java
    │   │               │   │   ├── JavaDocParserVisitor.java
    │   │               │   │   └── ResponseCommentExtractor.java
    │   │               │   └── results/
    │   │               │       ├── DynamicTypeAnalyzer.java
    │   │               │       ├── JavaDocParameterResolver.java
    │   │               │       ├── JavaTypeAnalyzer.java
    │   │               │       ├── JsonMapper.java
    │   │               │       ├── PathNormalizer.java
    │   │               │       ├── ResponseTypeNormalizer.java
    │   │               │       ├── ResultInterpreter.java
    │   │               │       └── StringParameterResolver.java
    │   │               ├── backend/
    │   │               │   ├── Backend.java
    │   │               │   ├── ComparatorUtils.java
    │   │               │   ├── JsonRepresentationAppender.java
    │   │               │   ├── StringBackend.java
    │   │               │   ├── asciidoc/
    │   │               │   │   └── AsciiDocBackend.java
    │   │               │   ├── markdown/
    │   │               │   │   └── MarkdownBackend.java
    │   │               │   ├── plaintext/
    │   │               │   │   └── PlainTextBackend.java
    │   │               │   └── swagger/
    │   │               │       ├── DefinitionNameBuilder.java
    │   │               │       ├── SchemaBuilder.java
    │   │               │       ├── SwaggerBackend.java
    │   │               │       ├── SwaggerOptions.java
    │   │               │       └── SwaggerScheme.java
    │   │               ├── model/
    │   │               │   ├── JavaUtils.java
    │   │               │   ├── Types.java
    │   │               │   ├── elements/
    │   │               │   │   ├── Element.java
    │   │               │   │   ├── HttpResponse.java
    │   │               │   │   ├── JsonArray.java
    │   │               │   │   ├── JsonObject.java
    │   │               │   │   ├── JsonValue.java
    │   │               │   │   └── MethodHandle.java
    │   │               │   ├── instructions/
    │   │               │   │   ├── DefaultInstruction.java
    │   │               │   │   ├── DupInstruction.java
    │   │               │   │   ├── ExceptionHandlerInstruction.java
    │   │               │   │   ├── GetFieldInstruction.java
    │   │               │   │   ├── GetPropertyInstruction.java
    │   │               │   │   ├── GetStaticInstruction.java
    │   │               │   │   ├── Instruction.java
    │   │               │   │   ├── InvokeDynamicInstruction.java
    │   │               │   │   ├── InvokeInstruction.java
    │   │               │   │   ├── LoadInstruction.java
    │   │               │   │   ├── LoadStoreInstruction.java
    │   │               │   │   ├── LoadStoreInstructionPlaceholder.java
    │   │               │   │   ├── NewInstruction.java
    │   │               │   │   ├── PushInstruction.java
    │   │               │   │   ├── ReturnInstruction.java
    │   │               │   │   ├── SizeChangingInstruction.java
    │   │               │   │   ├── StoreInstruction.java
    │   │               │   │   └── ThrowInstruction.java
    │   │               │   ├── javadoc/
    │   │               │   │   ├── ClassComment.java
    │   │               │   │   ├── MemberComment.java
    │   │               │   │   ├── MemberParameterTag.java
    │   │               │   │   └── MethodComment.java
    │   │               │   ├── methods/
    │   │               │   │   ├── IdentifiableMethod.java
    │   │               │   │   ├── Method.java
    │   │               │   │   ├── MethodIdentifier.java
    │   │               │   │   └── ProjectMethod.java
    │   │               │   ├── rest/
    │   │               │   │   ├── HttpMethod.java
    │   │               │   │   ├── MethodParameter.java
    │   │               │   │   ├── ParameterType.java
    │   │               │   │   ├── Project.java
    │   │               │   │   ├── ResourceMethod.java
    │   │               │   │   ├── Resources.java
    │   │               │   │   ├── Response.java
    │   │               │   │   ├── TypeIdentifier.java
    │   │               │   │   ├── TypeRepresentation.java
    │   │               │   │   └── TypeRepresentationVisitor.java
    │   │               │   └── results/
    │   │               │       ├── ClassResult.java
    │   │               │       └── MethodResult.java
    │   │               └── utils/
    │   │                   ├── DebugUtils.java
    │   │                   ├── Pair.java
    │   │                   └── StringUtils.java
    │   └── resources/
    │       └── META-INF/
    │           └── services/
    │               └── com.sebastian_daschner.jaxrs_analyzer.backend.Backend
    └── test/
        ├── java/
        │   └── com/
        │       └── sebastian_daschner/
        │           ├── jaxrs_analyzer/
        │           │   ├── MainTest.java
        │           │   ├── analysis/
        │           │   │   ├── ProjectAnalyzerTest.java
        │           │   │   ├── bytecode/
        │           │   │   │   ├── SubResourceLocatorMethodContentAnalyzerTest.java
        │           │   │   │   ├── collection/
        │           │   │   │   │   ├── ByteCodeCollectorTest.java
        │           │   │   │   │   └── testclasses/
        │           │   │   │   │       ├── TestClass1.java
        │           │   │   │   │       ├── TestClass2.java
        │           │   │   │   │       ├── TestClass3.java
        │           │   │   │   │       ├── TestClass4.java
        │           │   │   │   │       ├── TestClass5.java
        │           │   │   │   │       ├── TestClass6.java
        │           │   │   │   │       ├── TestClass7.java
        │           │   │   │   │       ├── TestClass8.java
        │           │   │   │   │       └── TestClass9.java
        │           │   │   │   ├── reduction/
        │           │   │   │   │   ├── RelevantInstructionReducerTest.java
        │           │   │   │   │   └── testclasses/
        │           │   │   │   │       ├── TestClass1.java
        │           │   │   │   │       ├── TestClass10.java
        │           │   │   │   │       ├── TestClass2.java
        │           │   │   │   │       ├── TestClass3.java
        │           │   │   │   │       ├── TestClass4.java
        │           │   │   │   │       ├── TestClass5.java
        │           │   │   │   │       ├── TestClass6.java
        │           │   │   │   │       ├── TestClass7.java
        │           │   │   │   │       ├── TestClass8.java
        │           │   │   │   │       └── TestClass9.java
        │           │   │   │   └── subresource/
        │           │   │   │       ├── TestClass1.java
        │           │   │   │       ├── TestClass2.java
        │           │   │   │       ├── TestClass3.java
        │           │   │   │       ├── TestClass4.java
        │           │   │   │       └── TestClass5.java
        │           │   │   ├── classes/
        │           │   │   │   ├── JAXRSMethodVisitorTest.java
        │           │   │   │   ├── ResourceMethodContentAnalyzerTest.java
        │           │   │   │   └── testclasses/
        │           │   │   │       └── resource/
        │           │   │   │           ├── json/
        │           │   │   │           │   ├── TestClass1.java
        │           │   │   │           │   ├── TestClass10.java
        │           │   │   │           │   ├── TestClass2.java
        │           │   │   │           │   ├── TestClass3.java
        │           │   │   │           │   ├── TestClass4.java
        │           │   │   │           │   ├── TestClass5.java
        │           │   │   │           │   ├── TestClass6.java
        │           │   │   │           │   ├── TestClass7.java
        │           │   │   │           │   ├── TestClass8.java
        │           │   │   │           │   └── TestClass9.java
        │           │   │   │           ├── object/
        │           │   │   │           │   ├── TestClass1.java
        │           │   │   │           │   ├── TestClass10.java
        │           │   │   │           │   ├── TestClass11.java
        │           │   │   │           │   ├── TestClass12.java
        │           │   │   │           │   ├── TestClass13.java
        │           │   │   │           │   ├── TestClass14.java
        │           │   │   │           │   ├── TestClass2.java
        │           │   │   │           │   ├── TestClass3.java
        │           │   │   │           │   ├── TestClass4.java
        │           │   │   │           │   ├── TestClass5.java
        │           │   │   │           │   ├── TestClass6.java
        │           │   │   │           │   ├── TestClass7.java
        │           │   │   │           │   ├── TestClass8.java
        │           │   │   │           │   └── TestClass9.java
        │           │   │   │           └── response/
        │           │   │   │               ├── TestClass1.java
        │           │   │   │               ├── TestClass10.java
        │           │   │   │               ├── TestClass11.java
        │           │   │   │               ├── TestClass12.java
        │           │   │   │               ├── TestClass13.java
        │           │   │   │               ├── TestClass14.java
        │           │   │   │               ├── TestClass15.java
        │           │   │   │               ├── TestClass16.java
        │           │   │   │               ├── TestClass17.java
        │           │   │   │               ├── TestClass18.java
        │           │   │   │               ├── TestClass19.java
        │           │   │   │               ├── TestClass2.java
        │           │   │   │               ├── TestClass20.java
        │           │   │   │               ├── TestClass21.java
        │           │   │   │               ├── TestClass22.java
        │           │   │   │               ├── TestClass23.java
        │           │   │   │               ├── TestClass24.java
        │           │   │   │               ├── TestClass25.java
        │           │   │   │               ├── TestClass26.java
        │           │   │   │               ├── TestClass27.java
        │           │   │   │               ├── TestClass28.java
        │           │   │   │               ├── TestClass29.java
        │           │   │   │               ├── TestClass3.java
        │           │   │   │               ├── TestClass30.java
        │           │   │   │               ├── TestClass31.java
        │           │   │   │               ├── TestClass32.java
        │           │   │   │               ├── TestClass33.java
        │           │   │   │               ├── TestClass34.java
        │           │   │   │               ├── TestClass35.java
        │           │   │   │               ├── TestClass36.java
        │           │   │   │               ├── TestClass37.java
        │           │   │   │               ├── TestClass38.java
        │           │   │   │               ├── TestClass39.java
        │           │   │   │               ├── TestClass4.java
        │           │   │   │               ├── TestClass40.java
        │           │   │   │               ├── TestClass41.java
        │           │   │   │               ├── TestClass42.java
        │           │   │   │               ├── TestClass43.java
        │           │   │   │               ├── TestClass44.java
        │           │   │   │               ├── TestClass45.java
        │           │   │   │               ├── TestClass46.java
        │           │   │   │               ├── TestClass47.java
        │           │   │   │               ├── TestClass48.java
        │           │   │   │               ├── TestClass49.java
        │           │   │   │               ├── TestClass5.java
        │           │   │   │               ├── TestClass50.java
        │           │   │   │               ├── TestClass51.java
        │           │   │   │               ├── TestClass52.java
        │           │   │   │               ├── TestClass53.java
        │           │   │   │               ├── TestClass54.java
        │           │   │   │               ├── TestClass55.java
        │           │   │   │               ├── TestClass56.java
        │           │   │   │               ├── TestClass57.java
        │           │   │   │               ├── TestClass58.java
        │           │   │   │               ├── TestClass59.java
        │           │   │   │               ├── TestClass6.java
        │           │   │   │               ├── TestClass60.java
        │           │   │   │               ├── TestClass61.java
        │           │   │   │               ├── TestClass62.java
        │           │   │   │               ├── TestClass7.java
        │           │   │   │               ├── TestClass8.java
        │           │   │   │               └── TestClass9.java
        │           │   │   ├── javadoc/
        │           │   │   │   └── ResponseCommentExtractorTest.java
        │           │   │   ├── project/
        │           │   │   │   └── classes/
        │           │   │   │       ├── ClassAnalyzerTest.java
        │           │   │   │       └── testclasses/
        │           │   │   │           ├── TestClass1.java
        │           │   │   │           ├── TestClass10.java
        │           │   │   │           ├── TestClass11.java
        │           │   │   │           ├── TestClass12.java
        │           │   │   │           ├── TestClass13.java
        │           │   │   │           ├── TestClass14.java
        │           │   │   │           ├── TestClass15.java
        │           │   │   │           ├── TestClass16.java
        │           │   │   │           ├── TestClass2.java
        │           │   │   │           ├── TestClass3.java
        │           │   │   │           ├── TestClass4.java
        │           │   │   │           ├── TestClass5.java
        │           │   │   │           ├── TestClass6.java
        │           │   │   │           ├── TestClass7.java
        │           │   │   │           ├── TestClass8.java
        │           │   │   │           └── TestClass9.java
        │           │   │   ├── results/
        │           │   │   │   ├── DynamicTypeAnalyzerTest.java
        │           │   │   │   ├── JavaTypeAnalyzerTest.java
        │           │   │   │   ├── PathNormalizerTest.java
        │           │   │   │   ├── ResultInterpreterTest.java
        │           │   │   │   ├── TypeUtils.java
        │           │   │   │   └── testclasses/
        │           │   │   │       └── typeanalyzer/
        │           │   │   │           ├── TestClass1.java
        │           │   │   │           ├── TestClass10.java
        │           │   │   │           ├── TestClass11.java
        │           │   │   │           ├── TestClass12.java
        │           │   │   │           ├── TestClass13.java
        │           │   │   │           ├── TestClass14.java
        │           │   │   │           ├── TestClass15.java
        │           │   │   │           ├── TestClass16.java
        │           │   │   │           ├── TestClass17.java
        │           │   │   │           ├── TestClass18.java
        │           │   │   │           ├── TestClass19.java
        │           │   │   │           ├── TestClass2.java
        │           │   │   │           ├── TestClass20.java
        │           │   │   │           ├── TestClass21.java
        │           │   │   │           ├── TestClass22.java
        │           │   │   │           ├── TestClass23.java
        │           │   │   │           ├── TestClass24.java
        │           │   │   │           ├── TestClass25.java
        │           │   │   │           ├── TestClass26.java
        │           │   │   │           ├── TestClass27.java
        │           │   │   │           ├── TestClass28.java
        │           │   │   │           ├── TestClass29.java
        │           │   │   │           ├── TestClass3.java
        │           │   │   │           ├── TestClass30.java
        │           │   │   │           ├── TestClass4.java
        │           │   │   │           ├── TestClass5.java
        │           │   │   │           ├── TestClass6.java
        │           │   │   │           ├── TestClass7.java
        │           │   │   │           └── TestClass8.java
        │           │   │   └── utils/
        │           │   │       ├── JavaUtilSignatureTest.java
        │           │   │       ├── JavaUtilsTest.java
        │           │   │       └── TestClassUtils.java
        │           │   ├── backend/
        │           │   │   ├── JsonRepresentationAppenderTest.java
        │           │   │   ├── asciidoc/
        │           │   │   │   └── AsciiDocBackendTest.java
        │           │   │   ├── markdown/
        │           │   │   │   └── MarkdownBackendTest.java
        │           │   │   ├── plaintext/
        │           │   │   │   └── PlainTextBackendTest.java
        │           │   │   └── swagger/
        │           │   │       ├── SchemaBuilderTest.java
        │           │   │       ├── SwaggerBackendTest.java
        │           │   │       └── TypeIdentifierTestSupport.java
        │           │   ├── builder/
        │           │   │   ├── ClassResultBuilder.java
        │           │   │   ├── HttpResponseBuilder.java
        │           │   │   ├── MethodResultBuilder.java
        │           │   │   ├── ResourceMethodBuilder.java
        │           │   │   ├── ResourcesBuilder.java
        │           │   │   └── ResponseBuilder.java
        │           │   └── model/
        │           │       ├── rest/
        │           │       │   └── CollectionTypeRepresentationTest.java
        │           │       └── types/
        │           │           └── TypeTest.java
        │           └── test/
        │               ├── Enumeration.java
        │               └── Model.java
        └── jaxrs-test/
            └── com/
                └── sebastian_daschner/
                    └── jaxrs_test/
                        ├── AbstractResources.java
                        ├── ComplexResources.java
                        ├── Enumeration.java
                        ├── IgnoredTestResources.java
                        ├── JsonResources.java
                        ├── Manager.java
                        ├── Model.java
                        ├── ResourceWithoutClassLevelJavadoc.java
                        ├── Resources.java
                        ├── RestActivator.java
                        ├── SomeSubResource.java
                        ├── SubResources.java
                        ├── Test.java
                        ├── TestResources.java
                        └── TestStore.java
Download .txt
SYMBOL INDEX (1901 symbols across 309 files)

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/JAXRSAnalyzer.java
  class JAXRSAnalyzer (line 20) | public class JAXRSAnalyzer {
    method JAXRSAnalyzer (line 27) | public JAXRSAnalyzer(Analysis analysis) {
    method analyze (line 45) | public void analyze() {
    method outputToConsole (line 64) | private void outputToConsole(final byte[] output) {
    method outputToFile (line 74) | private static void outputToFile(final byte[] output, final Path outpu...
    method constructBackend (line 84) | public static Backend constructBackend(final String backendType) {
    class Analysis (line 92) | public static class Analysis {
      method getProjectClassPaths (line 103) | public Set<Path> getProjectClassPaths() {
      method addProjectClassPath (line 107) | public void addProjectClassPath(Path classPath) {
      method addProjectSourcePath (line 111) | public void addProjectSourcePath(Path sourcePath) {
      method addClassPath (line 115) | public void addClassPath(Path classPath) {
      method addIgnoredResource (line 119) | public void addIgnoredResource(String ignored) {
      method configureBackend (line 123) | public void configureBackend(Map<String, String> attributes) {
      method setProjectName (line 128) | public void setProjectName(String projectName) {
      method setProjectVersion (line 132) | public void setProjectVersion(String projectVersion) {
      method setOutputLocation (line 136) | public void setOutputLocation(Path outputLocation) {
      method setBackend (line 140) | public void setBackend(Backend backend) {
      method getBackend (line 144) | public Backend getBackend() {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/LogProvider.java
  class LogProvider (line 28) | public final class LogProvider {
    method LogProvider (line 36) | private LogProvider() {
    method injectInfoLogger (line 45) | public static void injectInfoLogger(final Consumer<String> logger) {
    method injectDebugLogger (line 54) | public static void injectDebugLogger(final Consumer<String> logger) {
    method injectErrorLogger (line 63) | public static void injectErrorLogger(final Consumer<String> logger) {
    method info (line 72) | public static void info(final String message) {
    method debug (line 81) | public static void debug(final String message) {
    method debug (line 90) | public static void debug(final Throwable throwable) {
    method error (line 101) | public static void error(final String message) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/Main.java
  class Main (line 36) | public class Main {
    method main (line 76) | public static void main(final String... args) {
    method setDefaults (line 95) | private static void setDefaults() {
    method extractArgs (line 100) | private static void extractArgs(String[] args) {
    method addAttribute (line 167) | static Map<String, String> addAttribute(String attribute) {
    method extractBackend (line 179) | private static Backend extractBackend(final String name) {
    method extractClassPaths (line 183) | private static List<Path> extractClassPaths(final String classPaths) {
    method extractList (line 195) | private static List<String> extractList(String list) {
    method validateArgs (line 202) | private static void validateArgs() {
    method configureBackend (line 209) | private static void configureBackend() {
    method printUsageAndExit (line 215) | private static void printUsageAndExit() {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/JobRegistry.java
  class JobRegistry (line 14) | public class JobRegistry {
    method JobRegistry (line 19) | private JobRegistry() {
    method analyzeResourceClass (line 26) | public void analyzeResourceClass(final String className, final ClassRe...
    method nextUnhandledClass (line 36) | public Pair<String, ClassResult> nextUnhandledClass() {
    method getInstance (line 40) | public static JobRegistry getInstance() {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/ProjectAnalyzer.java
  class ProjectAnalyzer (line 52) | public class ProjectAnalyzer {
    method ProjectAnalyzer (line 71) | public ProjectAnalyzer(final Set<Path> classPaths) {
    method analyze (line 83) | public Resources analyze(Set<Path> projectClassPaths, Set<Path> projec...
    method isJAXRSRootResource (line 115) | private boolean isJAXRSRootResource(String className) {
    method analyzeClass (line 120) | private void analyzeClass(final String className, ClassResult classRes...
    method addToClassPool (line 137) | private void addToClassPool(final Path location) {
    method addProjectPath (line 152) | private void addProjectPath(final Path path) {
    method addJarClasses (line 169) | private void addJarClasses(final Path location) {
    method addDirectoryClasses (line 189) | private void addDirectoryClasses(final Path location, final Path subPa...
    method toQualifiedClassName (line 206) | private static String toQualifiedClassName(final String fileName) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/BytecodeAnalyzer.java
  class BytecodeAnalyzer (line 9) | public class BytecodeAnalyzer {
    method analyzeBytecode (line 17) | public void analyzeBytecode(final ClassResult classResult) {
    method analyzeBytecode (line 21) | private void analyzeBytecode(final MethodResult methodResult) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/MethodContentAnalyzer.java
  class MethodContentAnalyzer (line 43) | abstract class MethodContentAnalyzer {
    method interpretRelevantInstructions (line 58) | List<Instruction> interpretRelevantInstructions(final List<Instruction...
    method buildPackagePrefix (line 66) | void buildPackagePrefix(final String className) {
    method findProjectMethods (line 85) | Set<ProjectMethod> findProjectMethods(final List<Instruction> instruct...
    method addProjectMethods (line 99) | private void addProjectMethods(final List<Instruction> instructions, f...
    method visitProjectMethod (line 116) | private MethodResult visitProjectMethod(MethodIdentifier identifier) {
    method findUnhandledProjectMethodIdentifiers (line 139) | private Set<MethodIdentifier> findUnhandledProjectMethodIdentifiers(fi...
    method isProjectMethod (line 153) | private boolean isProjectMethod(final InvokeInstruction instruction) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/ResourceMethodContentAnalyzer.java
  class ResourceMethodContentAnalyzer (line 40) | class ResourceMethodContentAnalyzer extends MethodContentAnalyzer {
    method analyze (line 49) | void analyze(final MethodResult methodResult) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/SubResourceLocatorMethodContentAnalyzer.java
  class SubResourceLocatorMethodContentAnalyzer (line 41) | class SubResourceLocatorMethodContentAnalyzer extends MethodContentAnaly...
    method analyze (line 51) | void analyze(final MethodResult methodResult) {
    method determineReturnTypes (line 69) | private Set<String> determineReturnTypes(final MethodResult result) {
    method registerSubResourceJob (line 87) | private void registerSubResourceJob(final String type, final ClassResu...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/InstructionBuilder.java
  class InstructionBuilder (line 21) | public final class InstructionBuilder {
    method InstructionBuilder (line 23) | private InstructionBuilder() {
    method buildFieldInstruction (line 27) | public static Instruction buildFieldInstruction(final int opcode, fina...
    method buildInstruction (line 49) | public static Instruction buildInstruction(final int opcode, final Lab...
    method buildLoadStoreInstruction (line 191) | public static Instruction buildLoadStoreInstruction(int opcode, int in...
    method buildTypeInstruction (line 212) | public static Instruction buildTypeInstruction(int opcode, String clas...
    method buildInvokeInstruction (line 228) | public static InvokeInstruction buildInvokeInstruction(final int opcod...
    method buildInvokeDynamic (line 241) | public static Instruction buildInvokeDynamic(final String className, f...
    method buildJumpInstruction (line 248) | public static Instruction buildJumpInstruction(int opcode, final Label...
    method buildIntInstruction (line 279) | public static Instruction buildIntInstruction(int opcode, int operand,...
    method getStaticValue (line 291) | private static Object getStaticValue(String name, String containingCla...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/InstructionFinder.java
  class InstructionFinder (line 34) | final class InstructionFinder {
    method InstructionFinder (line 36) | private InstructionFinder() {
    method findLoadIndexes (line 48) | static Set<Integer> findLoadIndexes(final List<Instruction> instructio...
    method findLoadStores (line 60) | static Set<Integer> findLoadStores(final int index, final List<Instruc...
    method findReturnsAndThrows (line 72) | static Set<Integer> findReturnsAndThrows(final List<Instruction> instr...
    method find (line 83) | private static Set<Integer> find(final Predicate<Instruction> predicat...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/RelevantInstructionReducer.java
  class RelevantInstructionReducer (line 33) | public class RelevantInstructionReducer {
    method reduceInstructions (line 51) | public List<Instruction> reduceInstructions(final List<Instruction> in...
    method reduceInstructionsInternal (line 69) | private List<Instruction> reduceInstructionsInternal(final List<Instru...
    method findSortedBacktrackPositions (line 104) | private List<Integer> findSortedBacktrackPositions() {
    method findUnhandledLoadIndexes (line 120) | private Set<Integer> findUnhandledLoadIndexes(final Set<Integer> handl...
    method isLoadIgnored (line 132) | private static boolean isLoadIgnored(final LoadInstruction instruction) {
    method findLoadStoreBacktrackPositions (line 143) | private SortedSet<Integer> findLoadStoreBacktrackPositions(final Set<I...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/StackSizeSimulator.java
  class StackSizeSimulator (line 31) | class StackSizeSimulator {
    method buildStackSizes (line 40) | void buildStackSizes(final List<Instruction> instructions) {
    method isStackCleared (line 66) | private static boolean isStackCleared(final Instruction instruction) {
    method simulateStatementBackwards (line 77) | List<Integer> simulateStatementBackwards(final int backtrackPosition) {
    method findLoadStoreBacktrackPositions (line 97) | Set<Integer> findLoadStoreBacktrackPositions(final Set<Integer> loadSt...
    method findBacktrackPosition (line 108) | private int findBacktrackPosition(final int position) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/InjectableArgumentMethodSimulator.java
  class InjectableArgumentMethodSimulator (line 35) | public class InjectableArgumentMethodSimulator extends MethodSimulator {
    method simulate (line 52) | public Element simulate(final List<Element> arguments, final List<Inst...
    method injectArguments (line 75) | private void injectArguments(final List<Element> arguments, final Meth...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/KnownJsonResultMethod.java
  type KnownJsonResultMethod (line 35) | enum KnownJsonResultMethod implements IdentifiableMethod {
    method KnownJsonResultMethod (line 141) | KnownJsonResultMethod(final MethodIdentifier identifier,
    method invoke (line 147) | @Override
    method matches (line 155) | @Override
    method addToArray (line 160) | private static Element addToArray(final Element object, final List<Ele...
    method addToArray (line 164) | private static Element addToArray(final Element object, final List<Ele...
    method addToArray (line 170) | private static Element addToArray(final Element object, final Element ...
    method mergeJsonStructure (line 177) | private static Element mergeJsonStructure(final Element object, final ...
    method mergeJsonStructure (line 183) | private static Element mergeJsonStructure(final Element object, final ...
    method mergeJsonStructure (line 189) | private static Element mergeJsonStructure(final Element object, final ...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/KnownResponseResultMethod.java
  type KnownResponseResultMethod (line 46) | enum KnownResponseResultMethod implements IdentifiableMethod {
    method KnownResponseResultMethod (line 411) | KnownResponseResultMethod(final MethodIdentifier identifier,
    method invoke (line 417) | @Override
    method matches (line 425) | @Override
    method addHeader (line 430) | private static Element addHeader(final Element object, final String he...
    method addEntity (line 435) | private static Element addEntity(final Element object, final Element a...
    method addStatus (line 444) | private static Element addStatus(final Element object, final Integer s...
    method addContentType (line 449) | private static Element addContentType(final Element object, final Stri...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/MethodPool.java
  class MethodPool (line 40) | public class MethodPool {
    method MethodPool (line 55) | private MethodPool() {
    method addProjectMethod (line 70) | public void addProjectMethod(final ProjectMethod method) {
    method get (line 85) | public Method get(final MethodIdentifier identifier) {
    method getInstance (line 105) | public static MethodPool getInstance() {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/MethodSimulator.java
  class MethodSimulator (line 43) | public class MethodSimulator {
    method simulate (line 61) | public Element simulate(final List<Instruction> instructions) {
    method simulateInternal (line 77) | Element simulateInternal(final List<Instruction> instructions) {
    method simulate (line 88) | private void simulate(final Instruction instruction) {
    method simulateMethodHandle (line 156) | private void simulateMethodHandle(final InvokeDynamicInstruction instr...
    method simulateInvoke (line 174) | private void simulateInvoke(final InvokeInstruction instruction) {
    method simulateStore (line 205) | private void simulateStore(final StoreInstruction instruction) {
    method mergeElementStore (line 222) | private void mergeElementStore(final int index, final String type, fin...
    method mergeMethodHandleStore (line 236) | private void mergeMethodHandleStore(final int index, final MethodHandl...
    method mergePossibleResponse (line 243) | private void mergePossibleResponse() {
    method simulateSizeChange (line 255) | private void simulateSizeChange(final SizeChangingInstruction instruct...
    method mergeReturnElement (line 266) | private void mergeReturnElement(final Element stackElement) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/ContextClassReader.java
  class ContextClassReader (line 14) | public class ContextClassReader extends ClassReader {
    method ContextClassReader (line 18) | public ContextClassReader(final String className) throws IOException {
    method getClassLoader (line 22) | public static ClassLoader getClassLoader() {
    method addClassPath (line 26) | public static void addClassPath(final URL url) {
    class ExtensibleClassLoader (line 30) | private static class ExtensibleClassLoader extends URLClassLoader {
      method ExtensibleClassLoader (line 32) | ExtensibleClassLoader() {
      method addURL (line 36) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSAnnotatedSuperMethodClassVisitor.java
  class JAXRSAnnotatedSuperMethodClassVisitor (line 15) | class JAXRSAnnotatedSuperMethodClassVisitor extends ClassVisitor {
    method JAXRSAnnotatedSuperMethodClassVisitor (line 20) | JAXRSAnnotatedSuperMethodClassVisitor(final MethodResult methodResult,...
    method visitMethod (line 26) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSAnnotatedSuperMethodVisitor.java
  class JAXRSAnnotatedSuperMethodVisitor (line 24) | class JAXRSAnnotatedSuperMethodVisitor extends MethodVisitor {
    method JAXRSAnnotatedSuperMethodVisitor (line 31) | JAXRSAnnotatedSuperMethodVisitor(final MethodResult methodResult) {
    method visitAnnotation (line 39) | @Override
    method visitParameterAnnotation (line 73) | @Override
    method paramAnnotationVisitor (line 99) | private AnnotationVisitor paramAnnotationVisitor(final int index, fina...
    method defaultAnnotationVisitor (line 114) | private AnnotationVisitor defaultAnnotationVisitor(final int index) {
    method visitEnd (line 126) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSClassVisitor.java
  class JAXRSClassVisitor (line 29) | public class JAXRSClassVisitor extends ClassVisitor {
    method JAXRSClassVisitor (line 35) | public JAXRSClassVisitor(final ClassResult classResult) {
    method visit (line 40) | @Override
    method visitAnnotation (line 45) | @Override
    method visitField (line 63) | @Override
    method visitMethod (line 70) | @Override
    method hasJAXRSAnnotations (line 94) | private static boolean hasJAXRSAnnotations(final String className, fin...
    method searchAnnotatedSuperMethod (line 99) | private static Method searchAnnotatedSuperMethod(final String classNam...
    method determineSuperTypes (line 109) | private static List<Class<?>> determineSuperTypes(final String classNa...
    method hasJAXRSAnnotations (line 132) | private static boolean hasJAXRSAnnotations(final Method method) {
    method visitJAXRSSuperMethod (line 145) | private void visitJAXRSSuperMethod(Method method, MethodResult methodR...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSFieldVisitor.java
  class JAXRSFieldVisitor (line 17) | class JAXRSFieldVisitor extends FieldVisitor {
    method JAXRSFieldVisitor (line 23) | JAXRSFieldVisitor(final ClassResult classResult, final String desc, fi...
    method visitAnnotation (line 29) | @Override
    method paramAnnotationVisitor (line 51) | private AnnotationVisitor paramAnnotationVisitor(final ParameterType p...
    method defaultAnnotationVisitor (line 59) | private AnnotationVisitor defaultAnnotationVisitor() {
    method visitEnd (line 65) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSMethodVisitor.java
  class JAXRSMethodVisitor (line 26) | class JAXRSMethodVisitor extends ProjectMethodVisitor {
    method JAXRSMethodVisitor (line 33) | JAXRSMethodVisitor(final MethodIdentifier identifier, final ClassResul...
    method visitAnnotation (line 45) | @Override
    method visitParameterAnnotation (line 79) | @Override
    method paramAnnotationVisitor (line 105) | private AnnotationVisitor paramAnnotationVisitor(final int index, fina...
    method defaultAnnotationVisitor (line 120) | private AnnotationVisitor defaultAnnotationVisitor(final int index) {
    method visitEnd (line 128) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/ProjectMethodClassVisitor.java
  class ProjectMethodClassVisitor (line 18) | public class ProjectMethodClassVisitor extends ClassVisitor {
    method ProjectMethodClassVisitor (line 25) | public ProjectMethodClassVisitor(final MethodResult methodResult, fina...
    method visit (line 31) | @Override
    method visitMethod (line 36) | @Override
    method visitEnd (line 50) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/ProjectMethodVisitor.java
  class ProjectMethodVisitor (line 23) | class ProjectMethodVisitor extends MethodVisitor {
    method ProjectMethodVisitor (line 30) | ProjectMethodVisitor(MethodResult methodResult, String className) {
    method visitTryCatchBlock (line 37) | @Override
    method visitLabel (line 42) | @Override
    method visitMaxs (line 49) | @Override
    method visitLocalVariable (line 54) | @Override
    method isLabelActive (line 75) | private boolean isLabelActive(final Label label, final Label start, fi...
    method visitInsn (line 88) | @Override
    method visitIntInsn (line 93) | @Override
    method visitVarInsn (line 98) | @Override
    method visitTypeInsn (line 104) | @Override
    method visitFieldInsn (line 109) | @Override
    method visitMethodInsn (line 114) | @Override
    method visitInvokeDynamicInsn (line 119) | @Override
    method visitJumpInsn (line 127) | @Override
    method visitLdcInsn (line 132) | @Override
    method getLastLabel (line 137) | private Label getLastLabel() {
    method createLdcInstruction (line 143) | private PushInstruction createLdcInstruction(final Object object, fina...
    method visitIincInsn (line 166) | @Override
    method visitTableSwitchInsn (line 171) | @Override
    method visitLookupSwitchInsn (line 176) | @Override
    method visitMultiANewArrayInsn (line 181) | @Override
    method visitEnd (line 186) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ApplicationPathAnnotationVisitor.java
  class ApplicationPathAnnotationVisitor (line 8) | public class ApplicationPathAnnotationVisitor extends ValueAnnotationVis...
    method ApplicationPathAnnotationVisitor (line 12) | public ApplicationPathAnnotationVisitor(final ClassResult classResult) {
    method visitValue (line 16) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ClassAndMethodAnnotationVisitor.java
  class ClassAndMethodAnnotationVisitor (line 11) | abstract class ClassAndMethodAnnotationVisitor extends ValueAnnotationVi...
    method ClassAndMethodAnnotationVisitor (line 16) | ClassAndMethodAnnotationVisitor(final ClassResult classResult) {
    method ClassAndMethodAnnotationVisitor (line 21) | ClassAndMethodAnnotationVisitor(final MethodResult methodResult) {
    method ClassAndMethodAnnotationVisitor (line 26) | private ClassAndMethodAnnotationVisitor(final ClassResult classResult,...
    method visitValue (line 31) | protected abstract void visitValue(String value, ClassResult classResu...
    method visitValue (line 33) | protected abstract void visitValue(String value, MethodResult methodRe...
    method visitValue (line 35) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ConsumesAnnotationVisitor.java
  class ConsumesAnnotationVisitor (line 9) | public class ConsumesAnnotationVisitor extends ClassAndMethodAnnotationV...
    method ConsumesAnnotationVisitor (line 11) | public ConsumesAnnotationVisitor(final ClassResult classResult) {
    method ConsumesAnnotationVisitor (line 15) | public ConsumesAnnotationVisitor(final MethodResult methodResult) {
    method visitValue (line 19) | @Override
    method visitValue (line 24) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/DefaultValueAnnotationVisitor.java
  class DefaultValueAnnotationVisitor (line 11) | public class DefaultValueAnnotationVisitor extends ValueAnnotationVisitor {
    method DefaultValueAnnotationVisitor (line 15) | public DefaultValueAnnotationVisitor(final MethodParameter parameter) {
    method visitValue (line 19) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ParamAnnotationVisitor.java
  class ParamAnnotationVisitor (line 8) | public class ParamAnnotationVisitor extends ValueAnnotationVisitor {
    method ParamAnnotationVisitor (line 12) | public ParamAnnotationVisitor(final MethodParameter parameter) {
    method visitValue (line 16) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/PathAnnotationVisitor.java
  class PathAnnotationVisitor (line 9) | public class PathAnnotationVisitor extends ClassAndMethodAnnotationVisit...
    method PathAnnotationVisitor (line 11) | public PathAnnotationVisitor(final ClassResult classResult) {
    method PathAnnotationVisitor (line 15) | public PathAnnotationVisitor(final MethodResult methodResult) {
    method visitValue (line 19) | @Override
    method visitValue (line 24) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ProducesAnnotationVisitor.java
  class ProducesAnnotationVisitor (line 9) | public class ProducesAnnotationVisitor extends ClassAndMethodAnnotationV...
    method ProducesAnnotationVisitor (line 11) | public ProducesAnnotationVisitor(final ClassResult classResult) {
    method ProducesAnnotationVisitor (line 15) | public ProducesAnnotationVisitor(final MethodResult methodResult) {
    method visitValue (line 19) | @Override
    method visitValue (line 24) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ValueAnnotationVisitor.java
  class ValueAnnotationVisitor (line 9) | abstract class ValueAnnotationVisitor extends AnnotationVisitor {
    method ValueAnnotationVisitor (line 13) | ValueAnnotationVisitor() {
    method visitValue (line 17) | protected abstract void visitValue(String value);
    method visit (line 19) | @Override
    method visitArray (line 26) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/javadoc/JavaDocAnalyzer.java
  class JavaDocAnalyzer (line 26) | public class JavaDocAnalyzer {
    method analyze (line 30) | public void analyze(final Set<Path> projectSourcePaths, final Set<Clas...
    method invokeParser (line 35) | private void invokeParser(Set<Path> projectSourcePaths) {
    method invokeParser (line 46) | private void invokeParser(Path sourcePath) throws IOException {
    method parseJavaDoc (line 61) | private static void parseJavaDoc(Path path, JavaDocParserVisitor visit...
    method combineResults (line 70) | private void combineResults(final Set<ClassResult> classResults) {
    method findMethodResult (line 77) | private MethodResult findMethodResult(final MethodIdentifier identifie...
    method equalsSimpleTypeNames (line 96) | private boolean equalsSimpleTypeNames(MethodIdentifier identifier, Met...
    method parameterMatch (line 104) | private boolean parameterMatch(List<String> originalTypes, List<String...
    method matchesTypeBestEffort (line 114) | private boolean matchesTypeBestEffort(String originalType, String type) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/javadoc/JavaDocParserVisitor.java
  class JavaDocParserVisitor (line 38) | public class JavaDocParserVisitor extends VoidVisitorAdapter<Void> {
    method JavaDocParserVisitor (line 45) | public JavaDocParserVisitor(Map<MethodIdentifier, MethodComment> metho...
    method visit (line 49) | @Override
    method visit (line 55) | @Override
    method toJavaDoc (line 67) | private Javadoc toJavaDoc(Comment comment) {
    method isDeprecated (line 71) | private boolean isDeprecated(Javadoc javadoc) {
    method calculateClassName (line 75) | private String calculateClassName(ClassOrInterfaceDeclaration classOrI...
    method recordClassComment (line 81) | private void recordClassComment(Javadoc javadoc) {
    method visit (line 87) | @Override
    method createFieldComment (line 96) | private void createFieldComment(Javadoc javadoc, FieldDeclaration fiel...
    method visit (line 105) | @Override
    method recordMethodComment (line 114) | private void recordMethodComment(Javadoc javadoc, MethodDeclaration me...
    method createMethodParameterTags (line 122) | private List<MemberParameterTag> createMethodParameterTags(Javadoc jav...
    method createMethodParameterTag (line 129) | private MemberParameterTag createMethodParameterTag(JavadocBlockTag ta...
    method createMemberParamTag (line 138) | private MemberParameterTag createMemberParamTag(JavadocDescription jav...
    method createMemberParamValue (line 146) | private String createMemberParamValue(AnnotationExpr a) {
    method createResponseComments (line 157) | private Map<Integer, String> createResponseComments(Javadoc javadoc) {
    method calculateMethodIdentifier (line 171) | private MethodIdentifier calculateMethodIdentifier(MethodDeclaration m...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/javadoc/ResponseCommentExtractor.java
  class ResponseCommentExtractor (line 6) | class ResponseCommentExtractor {
    method ResponseCommentExtractor (line 8) | private ResponseCommentExtractor() {
    method extract (line 13) | static Pair<Integer, String> extract(String comment) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/DynamicTypeAnalyzer.java
  class DynamicTypeAnalyzer (line 35) | class DynamicTypeAnalyzer {
    method DynamicTypeAnalyzer (line 42) | DynamicTypeAnalyzer(final Map<TypeIdentifier, TypeRepresentation> type...
    method analyze (line 52) | TypeIdentifier analyze(final JsonValue jsonValue) {
    method analyzeInternal (line 56) | private TypeIdentifier analyzeInternal(final JsonValue jsonValue) {
    method analyzeInternal (line 76) | private TypeIdentifier analyzeInternal(final JsonArray jsonArray) {
    method analyzeInternal (line 90) | private TypeIdentifier analyzeInternal(final JsonObject jsonObject) {
    method findExistingCollection (line 103) | private TypeIdentifier findExistingCollection(final TypeRepresentation...
    method findExistingType (line 110) | private TypeIdentifier findExistingType(final HashMap<String, TypeIden...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/JavaDocParameterResolver.java
  class JavaDocParameterResolver (line 22) | final class JavaDocParameterResolver {
    method JavaDocParameterResolver (line 26) | private JavaDocParameterResolver() {
    method findParameterDoc (line 30) | static Optional<MemberParameterTag> findParameterDoc(final MethodParam...
    method findFieldDoc (line 36) | static Optional<MemberParameterTag> findFieldDoc(final MethodParameter...
    method findRequestBodyDoc (line 45) | static Optional<MemberParameterTag> findRequestBodyDoc(final MethodCom...
    method hasAnnotation (line 51) | private static boolean hasAnnotation(final MethodParameter parameter, ...
    method isRequestBody (line 57) | private static boolean isRequestBody(final Map<String, String> annotat...
    method findKnownAnnotation (line 62) | private static boolean findKnownAnnotation(String simpleTypeName) {
    method annotationTypeMatches (line 66) | private static boolean annotationTypeMatches(final String qualifiedTyp...
    method getJavaType (line 71) | private static String getJavaType(final ParameterType parameterType) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/JavaTypeAnalyzer.java
  class JavaTypeAnalyzer (line 45) | class JavaTypeAnalyzer {
    method JavaTypeAnalyzer (line 56) | JavaTypeAnalyzer(final Map<TypeIdentifier, TypeRepresentation> typeRep...
    method analyze (line 69) | TypeIdentifier analyze(final String rootType) {
    method isJDKType (line 81) | private static boolean isJDKType(final String type) {
    method analyzeInternal (line 86) | private TypeRepresentation analyzeInternal(final TypeIdentifier identi...
    method analyzeClass (line 99) | private Map<String, TypeIdentifier> analyzeClass(final String type, fi...
    method getXmlAccessType (line 124) | private XmlAccessType getXmlAccessType(final Class<?> clazz) {
    method isRelevant (line 136) | private static boolean isRelevant(final Field field, final XmlAccessTy...
    method hasIgnoreAnnotation (line 159) | private static <T extends AccessibleObject & Member> boolean hasIgnore...
    method isTypeIgnored (line 163) | private static boolean isTypeIgnored(final Class<?> declaringClass) {
    method isRelevant (line 175) | private static boolean isRelevant(final Method method, final XmlAccess...
    method extractPropertyName (line 201) | private static String extractPropertyName(final String name) {
    method isGetter (line 208) | private static boolean isGetter(final Method method) {
    method mapField (line 222) | private static Pair<String, String> mapField(final Field field, final ...
    method mapGetter (line 230) | private static Pair<String, String> mapGetter(final Method method, fin...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/JsonMapper.java
  class JsonMapper (line 38) | final class JsonMapper {
    method JsonMapper (line 40) | private JsonMapper() {
    method map (line 50) | static javax.json.JsonValue map(final JsonValue jsonValue) {
    method map (line 56) | private static javax.json.JsonArray map(final JsonArray jsonArray) {
    method addToArray (line 62) | private static void addToArray(final JsonArrayBuilder builder, final E...
    method map (line 79) | private static javax.json.JsonObject map(final JsonObject jsonObject) {
    method addToObject (line 85) | private static void addToObject(final JsonObjectBuilder builder, final...
    method addToObject (line 95) | private static void addToObject(final JsonObjectBuilder builder, final...
    method addToObject (line 110) | static void addToObject(final JsonObjectBuilder builder, final String ...
    method addToArray (line 147) | static void addToArray(final JsonArrayBuilder builder, final String ty...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/PathNormalizer.java
  class PathNormalizer (line 31) | final class PathNormalizer {
    method PathNormalizer (line 33) | private PathNormalizer() {
    method getApplicationPath (line 42) | static String getApplicationPath(final Set<ClassResult> classResults) {
    method getPath (line 54) | static String getPath(final MethodResult methodResult) {
    method determinePaths (line 66) | private static List<String> determinePaths(final MethodResult methodRe...
    method addNonBlank (line 94) | private static void addNonBlank(final String string, final List<String...
    method normalize (line 105) | private static String normalize(final String path) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/ResponseTypeNormalizer.java
  class ResponseTypeNormalizer (line 31) | final class ResponseTypeNormalizer {
    method ResponseTypeNormalizer (line 33) | private ResponseTypeNormalizer() {
    method normalizeCollection (line 43) | static String normalizeCollection(final String type) {
    method normalizeResponseWrapper (line 59) | static String normalizeResponseWrapper(final String type) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/ResultInterpreter.java
  class ResultInterpreter (line 42) | public class ResultInterpreter {
    method interpret (line 54) | public Resources interpret(final Set<ClassResult> classResults) {
    method interpretClassResult (line 73) | private void interpretClassResult(final ClassResult classResult) {
    method interpretMethodResult (line 83) | private void interpretMethodResult(final MethodResult methodResult, fi...
    method interpretResourceMethod (line 104) | private ResourceMethod interpretResourceMethod(final MethodResult meth...
    method addResponseComments (line 139) | private void addResponseComments(MethodResult methodResult, ResourceMe...
    method addResponseComment (line 155) | private void addResponseComment(Integer status, String comment, Resour...
    method hasDeprecationTag (line 159) | private boolean hasDeprecationTag(MethodComment doc) {
    method hasClassDeprecationTag (line 165) | private boolean hasClassDeprecationTag(MemberComment doc) {
    method addParameterDescriptions (line 169) | private void addParameterDescriptions(final Set<MethodParameter> metho...
    method findRequestBodyDescription (line 184) | private String findRequestBodyDescription(final MethodComment methodDo...
    method updateMethodParameters (line 194) | private void updateMethodParameters(final Set<MethodParameter> paramet...
    method addDefaultResponses (line 203) | private void addDefaultResponses(final MethodResult methodResult) {
    method interpretResponse (line 215) | private void interpretResponse(final HttpResponse httpResponse, final ...
    method addMediaTypes (line 240) | private void addMediaTypes(final MethodResult methodResult, final Clas...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/StringParameterResolver.java
  class StringParameterResolver (line 16) | class StringParameterResolver {
    method StringParameterResolver (line 21) | StringParameterResolver(final Map<TypeIdentifier, TypeRepresentation> ...
    method replaceParametersTypes (line 26) | void replaceParametersTypes(final Set<MethodParameter> parameters) {
    method isStringOrPrimitive (line 50) | private boolean isStringOrPrimitive(final TypeIdentifier componentType) {
    method isEnum (line 54) | private boolean isEnum(final TypeRepresentation typeRepresentation) {
    method isCollection (line 58) | private boolean isCollection(final TypeRepresentation typeRepresentati...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/Backend.java
  type Backend (line 28) | public interface Backend {
    method render (line 36) | byte[] render(Project project);
    method getName (line 41) | String getName();
    method configure (line 46) | default void configure(Map<String, String> config) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/ComparatorUtils.java
  class ComparatorUtils (line 13) | public final class ComparatorUtils {
    method ComparatorUtils (line 15) | private ComparatorUtils() {
    method mapKeyComparator (line 19) | public static <T extends Comparable<? super T>> Comparator<Map.Entry<T...
    method parameterComparator (line 23) | public static Comparator<MethodParameter> parameterComparator() {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/JsonRepresentationAppender.java
  class JsonRepresentationAppender (line 32) | class JsonRepresentationAppender implements TypeRepresentationVisitor {
    method JsonRepresentationAppender (line 39) | JsonRepresentationAppender(final StringBuilder builder, final Map<Type...
    method visit (line 44) | @Override
    method visitStart (line 68) | @Override
    method visitEnd (line 73) | @Override
    method visit (line 78) | @Override
    method toPrimitiveType (line 86) | private static String toPrimitiveType(final TypeIdentifier value) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/StringBackend.java
  class StringBackend (line 24) | public abstract class StringBackend implements Backend {
    method configure (line 37) | @Override
    method render (line 42) | @Override
    method initRender (line 56) | private void initRender(final Project project) {
    method renderInternal (line 64) | private String renderInternal() {
    method appendHeader (line 72) | private void appendHeader() {
    method appendResource (line 77) | private void appendResource(final String resource) {
    method appendFirstLine (line 88) | protected abstract void appendFirstLine();
    method appendMethod (line 90) | protected abstract void appendMethod(String baseUri, String resource, ...
    method appendRequest (line 92) | protected abstract void appendRequest(ResourceMethod resourceMethod);
    method appendResponse (line 94) | protected abstract void appendResponse(ResourceMethod resourceMethod);
    method appendResourceEnd (line 96) | protected void appendResourceEnd() {
    method doVisit (line 99) | protected String doVisit(final TypeRepresentation typeRepresentation) {
    method toReadableComponentType (line 108) | protected String toReadableComponentType(TypeIdentifier componentType) {
    method serialize (line 113) | private static byte[] serialize(final String output) {
    method format (line 117) | private String format(final String json) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/asciidoc/AsciiDocBackend.java
  class AsciiDocBackend (line 26) | public class AsciiDocBackend extends StringBackend {
    method appendMethod (line 32) | @Override
    method appendRequest (line 44) | @Override
    method appendParams (line 73) | private void appendParams(final String name, final Set<MethodParameter...
    method appendResponse (line 86) | @Override
    method generateSample (line 111) | private void generateSample(TypeRepresentation r) {
    method toTypeOrCollection (line 117) | private String toTypeOrCollection(final TypeIdentifier type) {
    method toString (line 125) | private static String toString(final Set<String> set) {
    method getName (line 129) | @Override
    method appendFirstLine (line 134) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/markdown/MarkdownBackend.java
  class MarkdownBackend (line 27) | public class MarkdownBackend extends StringBackend {
    method appendMethod (line 33) | @Override
    method appendRequest (line 45) | @Override
    method appendParams (line 74) | private void appendParams(final String name, final Set<MethodParameter...
    method appendResponse (line 87) | @Override
    method generateSample (line 112) | private void generateSample(TypeRepresentation r) {
    method toTypeOrCollection (line 118) | private String toTypeOrCollection(final TypeIdentifier type) {
    method toString (line 126) | private static String toString(final Set<String> set) {
    method getName (line 130) | @Override
    method appendFirstLine (line 135) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/plaintext/PlainTextBackend.java
  class PlainTextBackend (line 37) | public class PlainTextBackend extends StringBackend {
    method appendMethod (line 43) | @Override
    method appendRequest (line 55) | @Override
    method appendParams (line 87) | private void appendParams(final String name, final Set<MethodParameter...
    method appendResponse (line 98) | @Override
    method appendResourceEnd (line 127) | @Override
    method toTypeOrCollection (line 132) | private String toTypeOrCollection(final TypeIdentifier type) {
    method toString (line 140) | private static String toString(final Set<String> set) {
    method getName (line 144) | @Override
    method appendFirstLine (line 149) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/DefinitionNameBuilder.java
  class DefinitionNameBuilder (line 9) | class DefinitionNameBuilder {
    method buildDefinitionName (line 11) | String buildDefinitionName(final String typeName, Map<String, Pair<Str...
    method buildDefinitionName (line 26) | private String buildDefinitionName(String typeName) {
    method isDynamicType (line 32) | private boolean isDynamicType(String typeName) {
    method buildDynamicName (line 36) | private String buildDynamicName(String typeName) {
    method extractDynamicSuffix (line 40) | private String extractDynamicSuffix(String typeName) {
    method buildJavaTypeName (line 45) | private String buildJavaTypeName(String typeName) {
    method isOnlyType (line 49) | private boolean isOnlyType(String typeName, String definition, Map<Str...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/SchemaBuilder.java
  class SchemaBuilder (line 39) | class SchemaBuilder {
    method SchemaBuilder (line 52) | SchemaBuilder(final Map<TypeIdentifier, TypeRepresentation> typeRepres...
    method build (line 63) | JsonObjectBuilder build(final TypeIdentifier identifier) {
    method getDefinitions (line 133) | JsonObject getDefinitions() {
    method add (line 139) | private void add(final JsonObjectBuilder builder, final TypeRepresenta...
    method addObject (line 154) | private void addObject(final JsonObjectBuilder builder, final TypeIden...
    method addPrimitive (line 173) | private void addPrimitive(final JsonObjectBuilder builder, final Swagg...
    method toSwaggerType (line 183) | private static SwaggerType toSwaggerType(final String type) {
    type SwaggerType (line 204) | private enum SwaggerType {
      method toString (line 208) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/SwaggerBackend.java
  class SwaggerBackend (line 46) | public class SwaggerBackend implements Backend {
    method configure (line 60) | @Override
    method render (line 65) | @Override
    method modifyJson (line 84) | private JsonObject modifyJson(final JsonObject json) {
    method renderInternal (line 90) | private JsonObject renderInternal() {
    method appendHeader (line 98) | private void appendHeader() {
    method renderHeader (line 103) | private void renderHeader() {
    method renderTags (line 111) | private void renderTags() {
    method extractTag (line 123) | private String extractTag(final String s) {
    method appendPaths (line 133) | private void appendPaths() {
    method buildPathDefinition (line 139) | private JsonObjectBuilder buildPathDefinition(final String s) {
    method consolidateMultipleMethodsForSamePath (line 149) | private Map<String, ResourceMethod> consolidateMultipleMethodsForSameP...
    method buildForMethod (line 156) | private JsonObjectBuilder buildForMethod(final ResourceMethod method, ...
    method buildParameters (line 180) | private JsonArrayBuilder buildParameters(final ResourceMethod method) {
    method buildParameters (line 202) | private void buildParameters(final Set<MethodParameter> parameters, fi...
    method buildResponses (line 223) | private JsonObjectBuilder buildResponses(final ResourceMethod method) {
    method appendDefinitions (line 246) | private void appendDefinitions() {
    method getName (line 251) | @Override
    method getSwaggerParameterType (line 256) | private static String getSwaggerParameterType(final ParameterType para...
    method serialize (line 272) | private static byte[] serialize(final JsonObject jsonObject) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/SwaggerOptions.java
  class SwaggerOptions (line 20) | public class SwaggerOptions {
    method getDomain (line 59) | String getDomain() {
    method getSchemes (line 63) | Set<SwaggerScheme> getSchemes() {
    method isRenderTags (line 67) | boolean isRenderTags() {
    method getTagsPathOffset (line 71) | int getTagsPathOffset() {
    method getJsonPatch (line 75) | JsonPatch getJsonPatch() {
    method configure (line 79) | void configure(final Map<String, String> config) {
    method extractSwaggerSchemes (line 108) | private Set<SwaggerScheme> extractSwaggerSchemes(final String schemes) {
    method extractSwaggerScheme (line 114) | private SwaggerScheme extractSwaggerScheme(final String scheme) {
    method readPatch (line 129) | private static JsonPatch readPatch(final String patchFile) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/SwaggerScheme.java
  type SwaggerScheme (line 8) | enum SwaggerScheme {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/JavaUtils.java
  class JavaUtils (line 43) | public final class JavaUtils {
    method JavaUtils (line 47) | private JavaUtils() {
    method isInitializerName (line 57) | public static boolean isInitializerName(final String name) {
    method getAnnotation (line 66) | public static <A extends Annotation> A getAnnotation(final AnnotatedEl...
    method isAnnotationPresent (line 78) | public static boolean isAnnotationPresent(final AnnotatedElement annot...
    method determineMostSpecificType (line 89) | public static String determineMostSpecificType(final String... types) {
    method determineMostSpecific (line 106) | private static String determineMostSpecific(final String firstType, fi...
    method determineLeastSpecificType (line 173) | public static String determineLeastSpecificType(final String... types) {
    method determineLeastSpecific (line 190) | private static String determineLeastSpecific(final String firstType, f...
    method isAssignableTo (line 201) | public static boolean isAssignableTo(final String leftType, final Stri...
    method hasTypeParameters (line 219) | private static boolean hasTypeParameters(final String type) {
    method toClassName (line 230) | public static String toClassName(final String type) {
    method toType (line 271) | public static String toType(final String className) {
    method toReadableType (line 280) | public static String toReadableType(final String type) {
    method getType (line 290) | public static String getType(final Object value) {
    method getTypeParameters (line 297) | public static List<String> getTypeParameters(final String type) {
    method getReturnType (line 324) | public static String getReturnType(final String methodSignature) {
    method getReturnType (line 328) | public static String getReturnType(final String methodSignature, final...
    method getTypeVariables (line 333) | private static Map<String, String> getTypeVariables(final String type) {
    method loadClassFromName (line 351) | public static Class<?> loadClassFromName(final String className) {
    method loadClassFromType (line 384) | public static Class<?> loadClassFromType(final String type) {
    method findMethod (line 388) | public static Method findMethod(final String className, final String m...
    method findMethod (line 396) | public static Method findMethod(final Class<?> loadedClass, final Stri...
    method getMethodSignature (line 405) | public static String getMethodSignature(final String returnType, final...
    method getMethodSignature (line 410) | public static String getMethodSignature(final Method method) {
    method getFieldDescriptor (line 426) | public static String getFieldDescriptor(final Field field, final Strin...
    method resolvePotentialTypeVariables (line 443) | private static String resolvePotentialTypeVariables(final String signa...
    method getParameters (line 470) | public static List<String> getParameters(final String methodDesc) {
    method resolveMethodSignature (line 505) | private static String[] resolveMethodSignature(final String methodDesc) {
    method resolveTypeParameters (line 516) | private static Map<String, String> resolveTypeParameters(final String ...
    method getNextType (line 535) | private static String getNextType(final char[] buf, final int off) {
    method getNextType (line 562) | private static String getNextType(char[] buf, int off, int len) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/Types.java
  class Types (line 10) | public final class Types {
    method Types (line 12) | private Types() {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/Element.java
  class Element (line 31) | public class Element {
    method Element (line 36) | public Element() {
    method Element (line 40) | public Element(final String type, final Object... values) {
    method Element (line 44) | public Element(final Set<String> types, final Object... values) {
    method merge (line 63) | public Element merge(final Element element) {
    method getPossibleValues (line 69) | public Set<Object> getPossibleValues() {
    method getTypes (line 73) | public Set<String> getTypes() {
    method equals (line 77) | @Override
    method hashCode (line 88) | @Override
    method toString (line 95) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/HttpResponse.java
  class HttpResponse (line 25) | public class HttpResponse {
    method getStatuses (line 33) | public Set<Integer> getStatuses() {
    method getHeaders (line 37) | public Set<String> getHeaders() {
    method getContentTypes (line 41) | public Set<String> getContentTypes() {
    method getEntityTypes (line 45) | public Set<String> getEntityTypes() {
    method getInlineEntities (line 49) | public Set<JsonValue> getInlineEntities() {
    method equals (line 53) | @Override
    method hashCode (line 67) | @Override
    method toString (line 77) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/JsonArray.java
  class JsonArray (line 27) | public class JsonArray implements JsonValue {
    method merge (line 31) | @Override
    method getElements (line 37) | public List<Element> getElements() {
    method equals (line 41) | @Override
    method hashCode (line 51) | @Override
    method toString (line 56) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/JsonObject.java
  class JsonObject (line 27) | public class JsonObject implements JsonValue {
    method merge (line 31) | @Override
    method getStructure (line 37) | public Map<String, Element> getStructure() {
    method equals (line 41) | @Override
    method hashCode (line 51) | @Override
    method toString (line 56) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/JsonValue.java
  type JsonValue (line 24) | public interface JsonValue {
    method merge (line 32) | JsonValue merge(JsonValue jsonValue);

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/MethodHandle.java
  class MethodHandle (line 35) | public class MethodHandle extends Element implements Method {
    method MethodHandle (line 47) | public MethodHandle(final String returnType, final MethodIdentifier ha...
    method MethodHandle (line 53) | public MethodHandle(final MethodHandle methodHandle) {
    method getPossibleIdentifiers (line 59) | public Set<MethodIdentifier> getPossibleIdentifiers() {
    method getTransferredArguments (line 63) | public List<Element> getTransferredArguments() {
    method invoke (line 67) | @Override
    method merge (line 87) | @Override
    method toString (line 103) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/DefaultInstruction.java
  class DefaultInstruction (line 27) | public class DefaultInstruction extends Instruction {
    method DefaultInstruction (line 31) | public DefaultInstruction(final String description, final Label label) {
    method getType (line 36) | @Override
    method getStackSizeDifference (line 41) | @Override
    method equals (line 46) | @Override
    method hashCode (line 59) | @Override
    method toString (line 67) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/DupInstruction.java
  class DupInstruction (line 26) | public class DupInstruction extends Instruction {
    method DupInstruction (line 28) | public DupInstruction(final Label label) {
    method getStackSizeDifference (line 32) | @Override
    method getType (line 37) | @Override
    method equals (line 42) | @Override
    method hashCode (line 49) | @Override
    method toString (line 54) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/ExceptionHandlerInstruction.java
  class ExceptionHandlerInstruction (line 26) | public class ExceptionHandlerInstruction extends SizeChangingInstruction {
    method ExceptionHandlerInstruction (line 30) | public ExceptionHandlerInstruction(final Label label) {
    method toString (line 34) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/GetFieldInstruction.java
  class GetFieldInstruction (line 26) | public class GetFieldInstruction extends GetPropertyInstruction {
    method GetFieldInstruction (line 28) | public GetFieldInstruction(final String containingClass, final String ...
    method getType (line 32) | @Override
    method getStackSizeDifference (line 37) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/GetPropertyInstruction.java
  class GetPropertyInstruction (line 26) | public abstract class GetPropertyInstruction extends Instruction {
    method GetPropertyInstruction (line 32) | protected GetPropertyInstruction(final String containingClass, final S...
    method getContainingClass (line 39) | public String getContainingClass() {
    method getPropertyName (line 43) | public String getPropertyName() {
    method getPropertyType (line 47) | public String getPropertyType() {
    method equals (line 51) | @Override
    method hashCode (line 67) | @Override
    method toString (line 77) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/GetStaticInstruction.java
  class GetStaticInstruction (line 26) | public class GetStaticInstruction extends GetPropertyInstruction {
    method GetStaticInstruction (line 30) | public GetStaticInstruction(final String containingClass, final String...
    method getValue (line 35) | public Object getValue() {
    method getType (line 39) | @Override
    method getStackSizeDifference (line 44) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/Instruction.java
  class Instruction (line 26) | public abstract class Instruction {
    method Instruction (line 30) | public Instruction(final Label label) {
    method getStackSizeDifference (line 34) | public abstract int getStackSizeDifference();
    method getType (line 36) | public abstract InstructionType getType();
    method getLabel (line 38) | public Label getLabel() {
    type InstructionType (line 45) | public enum InstructionType {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/InvokeDynamicInstruction.java
  class InvokeDynamicInstruction (line 29) | public class InvokeDynamicInstruction extends InvokeInstruction {
    method InvokeDynamicInstruction (line 33) | public InvokeDynamicInstruction(final MethodIdentifier methodHandleIde...
    method getStackSizeDifference (line 39) | @Override
    method getDynamicIdentifier (line 45) | public MethodIdentifier getDynamicIdentifier() {
    method getType (line 49) | @Override
    method equals (line 54) | @Override
    method hashCode (line 64) | @Override
    method toString (line 69) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/InvokeInstruction.java
  class InvokeInstruction (line 28) | public class InvokeInstruction extends Instruction {
    method InvokeInstruction (line 32) | public InvokeInstruction(final MethodIdentifier identifier, final Labe...
    method getStackSizeDifference (line 37) | @Override
    method getType (line 49) | @Override
    method getIdentifier (line 54) | public MethodIdentifier getIdentifier() {
    method equals (line 58) | @Override
    method hashCode (line 68) | @Override
    method toString (line 73) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/LoadInstruction.java
  class LoadInstruction (line 26) | public class LoadInstruction extends LoadStoreInstruction {
    method LoadInstruction (line 30) | public LoadInstruction(final int number, final String variableType, fi...
    method LoadInstruction (line 35) | public LoadInstruction(final int number, final String variableType, fi...
    method getStackSizeDifference (line 40) | @Override
    method getType (line 45) | @Override
    method getValidUntil (line 50) | public Label getValidUntil() {
    method toString (line 54) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/LoadStoreInstruction.java
  class LoadStoreInstruction (line 29) | public abstract class LoadStoreInstruction extends Instruction {
    method LoadStoreInstruction (line 40) | protected LoadStoreInstruction(final int number, final String variable...
    method LoadStoreInstruction (line 49) | protected LoadStoreInstruction(final int number, final String variable...
    method getNumber (line 59) | public int getNumber() {
    method getVariableType (line 63) | public String getVariableType() {
    method getName (line 67) | public String getName() {
    method equals (line 71) | @Override
    method hashCode (line 86) | @Override
    method toString (line 96) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/LoadStoreInstructionPlaceholder.java
  class LoadStoreInstructionPlaceholder (line 8) | public class LoadStoreInstructionPlaceholder extends Instruction {
    method LoadStoreInstructionPlaceholder (line 13) | public LoadStoreInstructionPlaceholder(final InstructionType type, fin...
    method getNumber (line 22) | public int getNumber() {
    method getStackSizeDifference (line 26) | @Override
    method getType (line 31) | @Override
    method equals (line 36) | @Override
    method hashCode (line 47) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/NewInstruction.java
  class NewInstruction (line 28) | public class NewInstruction extends Instruction {
    method NewInstruction (line 32) | public NewInstruction(final String className, final Label label) {
    method getClassName (line 39) | public String getClassName() {
    method getStackSizeDifference (line 43) | @Override
    method getType (line 48) | @Override
    method equals (line 53) | @Override
    method hashCode (line 63) | @Override
    method toString (line 68) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/PushInstruction.java
  class PushInstruction (line 26) | public class PushInstruction extends Instruction {
    method PushInstruction (line 31) | public PushInstruction(final Object value, final String valueType, fin...
    method getValue (line 37) | public Object getValue() {
    method getValueType (line 41) | public String getValueType() {
    method getType (line 45) | @Override
    method getStackSizeDifference (line 50) | @Override
    method equals (line 55) | @Override
    method hashCode (line 66) | @Override
    method toString (line 73) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/ReturnInstruction.java
  class ReturnInstruction (line 26) | public class ReturnInstruction extends Instruction {
    method ReturnInstruction (line 28) | public ReturnInstruction(final Label label) {
    method getType (line 32) | @Override
    method getStackSizeDifference (line 37) | @Override
    method equals (line 42) | @Override
    method hashCode (line 48) | @Override
    method toString (line 53) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/SizeChangingInstruction.java
  class SizeChangingInstruction (line 27) | public class SizeChangingInstruction extends DefaultInstruction {
    method SizeChangingInstruction (line 32) | public SizeChangingInstruction(final String description, final int num...
    method getNumberOfPushes (line 42) | public int getNumberOfPushes() {
    method getNumberOfPops (line 46) | public int getNumberOfPops() {
    method getType (line 50) | @Override
    method getStackSizeDifference (line 55) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/StoreInstruction.java
  class StoreInstruction (line 26) | public class StoreInstruction extends LoadStoreInstruction {
    method StoreInstruction (line 28) | public StoreInstruction(final int number, final String variableType, f...
    method StoreInstruction (line 32) | public StoreInstruction(final int number, final String variableType, f...
    method getStackSizeDifference (line 36) | @Override
    method getType (line 41) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/ThrowInstruction.java
  class ThrowInstruction (line 26) | public class ThrowInstruction extends Instruction {
    method ThrowInstruction (line 28) | public ThrowInstruction(final Label label) {
    method getType (line 32) | @Override
    method getStackSizeDifference (line 37) | @Override
    method equals (line 42) | @Override
    method hashCode (line 48) | @Override
    method toString (line 53) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/javadoc/ClassComment.java
  class ClassComment (line 8) | public class ClassComment extends MemberComment {
    method ClassComment (line 12) | public ClassComment() {
    method ClassComment (line 16) | public ClassComment(String comment, Map<Integer, String> responseComme...
    method getFieldComments (line 20) | public List<MemberParameterTag> getFieldComments() {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/javadoc/MemberComment.java
  class MemberComment (line 6) | public class MemberComment {
    method MemberComment (line 12) | public MemberComment(String comment, Map<Integer, String> responseComm...
    method getComment (line 18) | public String getComment() {
    method isDeprecated (line 22) | public boolean isDeprecated() {
    method getResponseComments (line 26) | public Map<Integer, String> getResponseComments() {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/javadoc/MemberParameterTag.java
  class MemberParameterTag (line 13) | public class MemberParameterTag {
    method MemberParameterTag (line 22) | public MemberParameterTag(String comment, Map<String, String> annotati...
    method getComment (line 27) | public String getComment() {
    method getAnnotations (line 31) | public Map<String, String> getAnnotations() {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/javadoc/MethodComment.java
  class MethodComment (line 7) | public class MethodComment extends MemberComment {
    method MethodComment (line 12) | public MethodComment(String comment) {
    method MethodComment (line 16) | public MethodComment(String comment, List<MemberParameterTag> paramTag...
    method getParamTags (line 22) | public List<MemberParameterTag> getParamTags() {
    method getContainingClassComment (line 26) | public ClassComment getContainingClassComment() {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/methods/IdentifiableMethod.java
  type IdentifiableMethod (line 24) | public interface IdentifiableMethod extends Method {
    method matches (line 32) | boolean matches(final MethodIdentifier identifier);

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/methods/Method.java
  type Method (line 29) | public interface Method {
    method invoke (line 38) | Element invoke(Element object, List<Element> arguments);

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/methods/MethodIdentifier.java
  class MethodIdentifier (line 33) | public class MethodIdentifier {
    method MethodIdentifier (line 48) | private MethodIdentifier(final String containingClass, final String me...
    method getSignature (line 63) | public String getSignature() {
    method getContainingClass (line 69) | public String getContainingClass() {
    method getMethodName (line 73) | public String getMethodName() {
    method getParameters (line 77) | public List<String> getParameters() {
    method getReturnType (line 81) | public String getReturnType() {
    method isStaticMethod (line 85) | public boolean isStaticMethod() {
    method equals (line 89) | @Override
    method hashCode (line 115) | @Override
    method toString (line 125) | @Override
    method of (line 145) | public static MethodIdentifier of(final String containingClass, final ...
    method ofNonStatic (line 160) | public static MethodIdentifier ofNonStatic(final String containingClas...
    method ofStatic (line 173) | public static MethodIdentifier ofStatic(final String containingClass, ...
    method of (line 177) | private static MethodIdentifier of(String containingClass, String meth...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/methods/ProjectMethod.java
  class ProjectMethod (line 30) | public class ProjectMethod implements IdentifiableMethod {
    method ProjectMethod (line 35) | public ProjectMethod(final MethodIdentifier identifier, final List<Ins...
    method matches (line 40) | @Override
    method invoke (line 45) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/HttpMethod.java
  type HttpMethod (line 24) | public enum HttpMethod {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/MethodParameter.java
  class MethodParameter (line 9) | public class MethodParameter {
    method MethodParameter (line 21) | public MethodParameter(final TypeIdentifier type) {
    method MethodParameter (line 25) | public MethodParameter(final TypeIdentifier type, final ParameterType ...
    method getType (line 30) | public TypeIdentifier getType() {
    method setType (line 34) | public void setType(final TypeIdentifier type) {
    method getParameterType (line 38) | public ParameterType getParameterType() {
    method setParameterType (line 42) | public void setParameterType(final ParameterType parameterType) {
    method getName (line 46) | public String getName() {
    method setName (line 50) | public void setName(final String name) {
    method getDescription (line 54) | public String getDescription() {
    method setDescription (line 58) | public void setDescription(final String description) {
    method getDefaultValue (line 62) | public String getDefaultValue() {
    method setDefaultValue (line 66) | public void setDefaultValue(final String defaultValue) {
    method equals (line 70) | @Override
    method hashCode (line 84) | @Override
    method toString (line 94) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/ParameterType.java
  type ParameterType (line 8) | public enum ParameterType {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/Project.java
  class Project (line 10) | public class Project {
    method Project (line 16) | public Project(final String name, final String version, final Resource...
    method getName (line 24) | public String getName() {
    method getVersion (line 28) | public String getVersion() {
    method getResources (line 32) | public Resources getResources() {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/ResourceMethod.java
  class ResourceMethod (line 30) | public class ResourceMethod {
    method ResourceMethod (line 43) | public ResourceMethod() {
    method ResourceMethod (line 46) | public ResourceMethod(final HttpMethod method, final String descriptio...
    method getMethod (line 52) | public HttpMethod getMethod() {
    method getMethodParameters (line 56) | public Set<MethodParameter> getMethodParameters() {
    method getRequestBody (line 60) | public TypeIdentifier getRequestBody() {
    method setRequestBody (line 64) | public void setRequestBody(final TypeIdentifier requestBody) {
    method getRequestMediaTypes (line 68) | public Set<String> getRequestMediaTypes() {
    method getResponseMediaTypes (line 72) | public Set<String> getResponseMediaTypes() {
    method getResponses (line 76) | public Map<Integer, Response> getResponses() {
    method isDeprecated (line 80) | public boolean isDeprecated() {
    method setDeprecated (line 84) | public void setDeprecated(boolean deprecated) {
    method getDescription (line 88) | public String getDescription() {
    method getRequestBodyDescription (line 92) | public String getRequestBodyDescription() {
    method setRequestBodyDescription (line 96) | public void setRequestBodyDescription(final String requestBodyDescript...
    method combine (line 100) | public ResourceMethod combine(ResourceMethod with) {
    method mergeRequestBodyDescription (line 128) | private String mergeRequestBodyDescription(ResourceMethod other) {
    method equals (line 140) | @Override
    method hashCode (line 159) | @Override
    method toString (line 173) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/Resources.java
  class Resources (line 27) | public class Resources {
    method addMethod (line 39) | public void addMethod(final String resource, final ResourceMethod meth...
    method getResources (line 49) | public Set<String> getResources() {
    method getMethods (line 59) | public Set<ResourceMethod> getMethods(final String resource) {
    method isEmpty (line 66) | public boolean isEmpty() {
    method consolidateMultiplePaths (line 74) | public void consolidateMultiplePaths() {
    method consolidateMultipleMethodsForSamePath (line 81) | private void consolidateMultipleMethodsForSamePath(String path, Set<Re...
    method getTypeRepresentations (line 88) | public Map<TypeIdentifier, TypeRepresentation> getTypeRepresentations() {
    method getBasePath (line 92) | public String getBasePath() {
    method setBasePath (line 96) | public void setBasePath(final String basePath) {
    method equals (line 100) | @Override
    method hashCode (line 112) | @Override
    method toString (line 120) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/Response.java
  class Response (line 27) | public class Response {
    method Response (line 33) | public Response() {
    method Response (line 37) | public Response(final TypeIdentifier responseBody) {
    method Response (line 42) | public Response(TypeIdentifier responseBody, String description) {
    method getHeaders (line 47) | public Set<String> getHeaders() {
    method getResponseBody (line 51) | public TypeIdentifier getResponseBody() {
    method getDescription (line 55) | public String getDescription() {
    method equals (line 59) | @Override
    method hashCode (line 70) | @Override
    method toString (line 77) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/TypeIdentifier.java
  class TypeIdentifier (line 14) | public abstract class TypeIdentifier {
    method equals (line 19) | @Override
    method getType (line 22) | public abstract String getType();
    method getName (line 24) | public abstract String getName();
    method ofType (line 26) | public static TypeIdentifier ofType(final String type) {
    method ofDynamic (line 30) | public static TypeIdentifier ofDynamic() {
    class JavaTypeIdentifier (line 34) | private static class JavaTypeIdentifier extends TypeIdentifier {
      method JavaTypeIdentifier (line 37) | public JavaTypeIdentifier(final String type) {
      method getType (line 42) | @Override
      method getName (line 47) | @Override
      method equals (line 52) | @Override
      method hashCode (line 62) | @Override
      method toString (line 67) | @Override
    class DynamicTypeIdentifier (line 75) | private static class DynamicTypeIdentifier extends TypeIdentifier {
      method DynamicTypeIdentifier (line 79) | public DynamicTypeIdentifier(final int number) {
      method getType (line 83) | @Override
      method getName (line 88) | @Override
      method equals (line 93) | @Override
      method hashCode (line 103) | @Override
      method toString (line 108) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/TypeRepresentation.java
  class TypeRepresentation (line 29) | public abstract class TypeRepresentation {
    method TypeRepresentation (line 33) | private TypeRepresentation(final TypeIdentifier identifier) {
    method accept (line 37) | public abstract void accept(final TypeRepresentationVisitor visitor);
    method getIdentifier (line 39) | public TypeIdentifier getIdentifier() {
    method getComponentType (line 48) | public abstract TypeIdentifier getComponentType();
    method equals (line 50) | @Override
    method hashCode (line 59) | @Override
    method ofConcrete (line 71) | public static TypeRepresentation ofConcrete(final TypeIdentifier ident...
    method ofConcrete (line 82) | public static TypeRepresentation ofConcrete(final TypeIdentifier ident...
    method ofCollection (line 95) | public static TypeRepresentation ofCollection(final TypeIdentifier ide...
    method ofEnum (line 106) | public static TypeRepresentation ofEnum(final TypeIdentifier identifie...
    class ConcreteTypeRepresentation (line 110) | public static class ConcreteTypeRepresentation extends TypeRepresentat...
      method ConcreteTypeRepresentation (line 114) | private ConcreteTypeRepresentation(final TypeIdentifier identifier, ...
      method getProperties (line 119) | public Map<String, TypeIdentifier> getProperties() {
      method getComponentType (line 123) | @Override
      method accept (line 128) | @Override
      method contentEquals (line 139) | public boolean contentEquals(final Map<String, TypeIdentifier> prope...
      method toString (line 143) | @Override
    class CollectionTypeRepresentation (line 152) | public static class CollectionTypeRepresentation extends TypeRepresent...
      method CollectionTypeRepresentation (line 156) | private CollectionTypeRepresentation(final TypeIdentifier identifier...
      method getRepresentation (line 161) | public TypeRepresentation getRepresentation() {
      method getComponentType (line 165) | @Override
      method accept (line 170) | @Override
      method contentEquals (line 184) | public boolean contentEquals(final TypeRepresentation representation) {
      method toString (line 205) | @Override
    class EnumTypeRepresentation (line 214) | public static class EnumTypeRepresentation extends TypeRepresentation {
      method EnumTypeRepresentation (line 218) | private EnumTypeRepresentation(final TypeIdentifier identifier, fina...
      method getEnumValues (line 223) | public Set<String> getEnumValues() {
      method accept (line 227) | @Override
      method getComponentType (line 232) | @Override
      method toString (line 237) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/TypeRepresentationVisitor.java
  type TypeRepresentationVisitor (line 8) | public interface TypeRepresentationVisitor {
    method visit (line 10) | void visit(TypeRepresentation.ConcreteTypeRepresentation representation);
    method visitStart (line 12) | void visitStart(TypeRepresentation.CollectionTypeRepresentation repres...
    method visitEnd (line 13) | void visitEnd(TypeRepresentation.CollectionTypeRepresentation represen...
    method visit (line 15) | void visit(TypeRepresentation.EnumTypeRepresentation representation);

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/results/ClassResult.java
  class ClassResult (line 30) | public class ClassResult {
    method getApplicationPath (line 42) | public String getApplicationPath() {
    method setApplicationPath (line 46) | public void setApplicationPath(final String applicationPath) {
    method getResourcePath (line 50) | public String getResourcePath() {
    method setResourcePath (line 54) | public void setResourcePath(final String resourcePath) {
    method getOriginalClass (line 58) | public String getOriginalClass() {
    method setOriginalClass (line 62) | public void setOriginalClass(String originalClass) {
    method getClassFields (line 66) | public Set<MethodParameter> getClassFields() {
    method getMethods (line 70) | public Set<MethodResult> getMethods() {
    method add (line 74) | public void add(final MethodResult methodResult) {
    method getRequestMediaTypes (line 79) | public Set<String> getRequestMediaTypes() {
    method getResponseMediaTypes (line 83) | public Set<String> getResponseMediaTypes() {
    method getParentSubResourceLocator (line 87) | public MethodResult getParentSubResourceLocator() {
    method setParentSubResourceLocator (line 91) | public void setParentSubResourceLocator(final MethodResult parentSubRe...
    method isDeprecated (line 95) | public boolean isDeprecated() {
    method setDeprecated (line 99) | public void setDeprecated(boolean deprecated) {
    method equals (line 103) | @Override
    method hashCode (line 120) | @Override
    method toString (line 132) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/results/MethodResult.java
  class MethodResult (line 36) | public class MethodResult {
    method getRequestMediaTypes (line 52) | public Set<String> getRequestMediaTypes() {
    method getResponseMediaTypes (line 56) | public Set<String> getResponseMediaTypes() {
    method getMethodParameters (line 60) | public Set<MethodParameter> getMethodParameters() {
    method getResponses (line 64) | public Set<HttpResponse> getResponses() {
    method getInstructions (line 68) | public List<Instruction> getInstructions() {
    method getPath (line 72) | public String getPath() {
    method setPath (line 76) | public void setPath(final String path) {
    method getRequestBodyType (line 80) | public String getRequestBodyType() {
    method setRequestBodyType (line 84) | public void setRequestBodyType(final String requestBodyType) {
    method getOriginalMethodSignature (line 88) | public MethodIdentifier getOriginalMethodSignature() {
    method setOriginalMethodSignature (line 92) | public void setOriginalMethodSignature(MethodIdentifier originalMethod...
    method getHttpMethod (line 96) | public HttpMethod getHttpMethod() {
    method setHttpMethod (line 100) | public void setHttpMethod(final HttpMethod httpMethod) {
    method getSubResource (line 104) | public ClassResult getSubResource() {
    method setSubResource (line 108) | public void setSubResource(final ClassResult subResource) {
    method getParentResource (line 113) | public ClassResult getParentResource() {
    method setParentResource (line 117) | public void setParentResource(final ClassResult parentResource) {
    method getMethodDoc (line 121) | public MethodComment getMethodDoc() {
    method setMethodDoc (line 125) | public void setMethodDoc(final MethodComment methodDoc) {
    method isDeprecated (line 129) | public boolean isDeprecated() {
    method setDeprecated (line 133) | public void setDeprecated(boolean deprecated) {
    method equals (line 137) | @Override
    method hashCode (line 160) | @Override
    method toString (line 176) | @Override

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/utils/DebugUtils.java
  class DebugUtils (line 10) | public final class DebugUtils {
    method DebugUtils (line 15) | private DebugUtils() {
    method prettyToString (line 25) | public static String prettyToString(final Object object) {
    method prettyToString (line 36) | public static String prettyToString(final Object object, final int ind...

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/utils/Pair.java
  class Pair (line 26) | public class Pair<T, U> {
    method Pair (line 31) | private Pair(final T left, final U right) {
    method getLeft (line 36) | public T getLeft() {
    method getRight (line 40) | public U getRight() {
    method equals (line 44) | @Override
    method hashCode (line 55) | @Override
    method toString (line 62) | @Override
    method of (line 79) | public static <V, W> Pair<V, W> of(final V left, final W right) {

FILE: src/main/java/com/sebastian_daschner/jaxrs_analyzer/utils/StringUtils.java
  class StringUtils (line 24) | public final class StringUtils {
    method StringUtils (line 26) | private StringUtils() {
    method requireNonBlank (line 36) | public static void requireNonBlank(final String arg) {
    method isBlank (line 47) | public static boolean isBlank(final String string) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/MainTest.java
  class MainTest (line 15) | public class MainTest {
    method shouldAddBinaryAttributes (line 17) | @Test
    method shouldAddSingleAttributes (line 24) | @Test
    method shouldAddEmptyAttributeValues (line 31) | @Test
    method shouldLoadSwaggerFromJavaService (line 38) | @Test
    method shouldLoadPlainTextFromJavaService (line 44) | @Test
    method shouldLoadAsciiDocFromJavaService (line 50) | @Test

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/ProjectAnalyzerTest.java
  class ProjectAnalyzerTest (line 43) | public class ProjectAnalyzerTest {
    method setUp (line 49) | @Before
    method test (line 73) | @Test
    method assertResourceEquals (line 88) | private static void assertResourceEquals(final Resources expectedResou...
    method assertTypeIdentifierEquals (line 117) | private static void assertTypeIdentifierEquals(final String message, f...
    method assertRepresentationEquals (line 131) | private static void assertRepresentationEquals(final String message, f...
    method getResources (line 151) | private static Resources getResources() {
    method addMethods (line 327) | private static void addMethods(final Resources resources, final String...
    method findClassFiles (line 331) | private static List<JavaFileObject> findClassFiles(final String classP...

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/SubResourceLocatorMethodContentAnalyzerTest.java
  class SubResourceLocatorMethodContentAnalyzerTest (line 32) | @RunWith(Parameterized.class)
    method SubResourceLocatorMethodContentAnalyzerTest (line 44) | public SubResourceLocatorMethodContentAnalyzerTest(final String testCl...
    method data (line 55) | @Parameterized.Parameters(name = "{0}")
    method test (line 76) | @Test
    method tearDown (line 101) | @AfterClass
    method injectJobRegistry (line 106) | private static void injectJobRegistry(final JobRegistry jobRegistry) t...

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/ByteCodeCollectorTest.java
  class ByteCodeCollectorTest (line 40) | @RunWith(Parameterized.class)
    method ByteCodeCollectorTest (line 47) | public ByteCodeCollectorTest(final String testClassSimpleName, final S...
    method data (line 53) | @Parameterized.Parameters(name = "{0}")
    method test (line 74) | @Test

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass1.java
  class TestClass1 (line 25) | public class TestClass1 {
    method method (line 27) | public void method() {
    method getResult (line 33) | public static List<Instruction> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass2.java
  class TestClass2 (line 25) | public class TestClass2 {
    method method (line 27) | public void method() {
    method getResult (line 35) | public static List<Instruction> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass3.java
  class TestClass3 (line 26) | public class TestClass3 {
    method method (line 28) | public int method(final int number) {
    method getResult (line 37) | public static List<Instruction> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass4.java
  class TestClass4 (line 26) | public class TestClass4 {
    method method (line 28) | public int method(final int number) {
    method getResult (line 36) | public static List<Instruction> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass5.java
  class TestClass5 (line 25) | public class TestClass5 {
    method method (line 27) | public int method(final int number) {
    method getResult (line 33) | public static List<Instruction> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass6.java
  class TestClass6 (line 25) | public class TestClass6 {
    method method (line 27) | public synchronized int method(final int number) {
    method getResult (line 31) | public static List<Instruction> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass7.java
  class TestClass7 (line 25) | public class TestClass7 {
    method method (line 27) | public synchronized int method(final int number) {
    method getResult (line 52) | public static List<Instruction> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass8.java
  class TestClass8 (line 25) | public class TestClass8 {
    method method (line 27) | public double method(final int number) {
    method getResult (line 36) | public static List<Instruction> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass9.java
  class TestClass9 (line 30) | public class TestClass9 {
    method method (line 32) | public Response method(final int number) {
    method getResult (line 36) | public static List<Instruction> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/RelevantInstructionReducerTest.java
  class RelevantInstructionReducerTest (line 40) | @RunWith(Parameterized.class)
    method RelevantInstructionReducerTest (line 47) | public RelevantInstructionReducerTest(final String testClass, final Li...
    method data (line 53) | @Parameterized.Parameters
    method test (line 86) | @Test
    method getInstructions (line 96) | private static List<Instruction> getInstructions(final Method method) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass1.java
  class TestClass1 (line 21) | public class TestClass1 {
    method method (line 23) | public Response method() {
    method expected1 (line 28) | public Response expected1() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass10.java
  class TestClass10 (line 22) | public class TestClass10 {
    method method (line 24) | public Response method() {
    method response (line 29) | private Response response() {
    method expected1 (line 35) | public Response expected1() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass2.java
  class TestClass2 (line 21) | public class TestClass2 {
    method method (line 23) | public Response method() {
    method expected1 (line 31) | public Response expected1() {
    method expected2 (line 35) | public Response expected2() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass3.java
  class TestClass3 (line 21) | public class TestClass3 {
    method method (line 23) | public Response method() {
    method expected1 (line 33) | public Response expected1() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass4.java
  class TestClass4 (line 21) | public class TestClass4 {
    method method (line 23) | public Response method() {
    method expected1 (line 31) | public Response expected1() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass5.java
  class TestClass5 (line 21) | public class TestClass5 {
    method method (line 23) | public Response method() {
    method expected1 (line 31) | public Response expected1() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass6.java
  class TestClass6 (line 27) | public class TestClass6 {
    method method (line 29) | public Response method(final int number) {
    method instructions (line 35) | public static List<Instruction> instructions() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass7.java
  class TestClass7 (line 21) | public class TestClass7 {
    method method (line 23) | public Response method() {
    method otherMethod (line 32) | private boolean otherMethod() {
    method expected1 (line 36) | public Response expected1() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass8.java
  class TestClass8 (line 21) | public class TestClass8 {
    method method (line 23) | public Response method() {
    method otherMethod (line 32) | private boolean otherMethod() {
    method expected1 (line 36) | public Response expected1() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass9.java
  class TestClass9 (line 22) | public class TestClass9 {
    method method (line 24) | public Response method() {
    method expected1 (line 33) | public Response expected1() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/subresource/TestClass1.java
  class TestClass1 (line 8) | public class TestClass1 {
    method method (line 10) | public SubResource method() {
    method getResult (line 15) | public static Set<String> getResult() {
    class SubResource (line 19) | private class SubResource {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/subresource/TestClass2.java
  class TestClass2 (line 8) | public class TestClass2 {
    method method (line 10) | public Object method() {
    method getResult (line 15) | public static Set<String> getResult() {
    class SubResource (line 19) | private class SubResource {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/subresource/TestClass3.java
  class TestClass3 (line 9) | public class TestClass3 {
    method method (line 11) | public Object method() {
    method getResult (line 17) | public static Set<String> getResult() {
    class SubResource (line 21) | private class SubResource {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/subresource/TestClass4.java
  class TestClass4 (line 7) | public class TestClass4 {
    method method (line 11) | public Object method() {
    method getResult (line 15) | public static Set<String> getResult() {
    class SubResource (line 19) | private class SubResource {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/subresource/TestClass5.java
  class TestClass5 (line 9) | public class TestClass5 {
    method method (line 11) | public Object method() {
    method getResult (line 18) | public static Set<String> getResult() {
    class SubResource (line 25) | private class SubResource {
    class AnotherSubResource (line 28) | private class AnotherSubResource {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSMethodVisitorTest.java
  class JAXRSMethodVisitorTest (line 17) | public class JAXRSMethodVisitorTest {
    method setUp (line 22) | @Before
    method test (line 29) | @Test

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/ResourceMethodContentAnalyzerTest.java
  class ResourceMethodContentAnalyzerTest (line 44) | @RunWith(Parameterized.class)
    method setUpLogger (line 51) | @BeforeClass
    method ResourceMethodContentAnalyzerTest (line 56) | public ResourceMethodContentAnalyzerTest(final String testClassSimpleN...
    method data (line 62) | @Parameterized.Parameters(name = "{0}")
    method test (line 86) | @Test

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass1.java
  class TestClass1 (line 30) | public class TestClass1 {
    method method (line 32) | @javax.ws.rs.GET
    method getResult (line 37) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass10.java
  class TestClass10 (line 31) | public class TestClass10 {
    method method (line 35) | @javax.ws.rs.GET public javax.json.JsonArray method() {
    method getResult (line 42) | public static Set<HttpResponse> getResult() {
    type Converter (line 53) | private interface Converter {
      method convert (line 54) | String convert(String string);

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass2.java
  class TestClass2 (line 31) | public class TestClass2 {
    method method (line 33) | @javax.ws.rs.GET
    method getResult (line 44) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass3.java
  class TestClass3 (line 32) | public class TestClass3 {
    method method (line 34) | @javax.ws.rs.GET
    method getResult (line 44) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass4.java
  class TestClass4 (line 31) | public class TestClass4 {
    method method (line 33) | @javax.ws.rs.GET
    method getResult (line 44) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass5.java
  class TestClass5 (line 31) | public class TestClass5 {
    method method (line 33) | @javax.ws.rs.GET
    method getResult (line 44) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass6.java
  class TestClass6 (line 30) | public class TestClass6 {
    method method (line 32) | @javax.ws.rs.GET
    method getResult (line 48) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass7.java
  class TestClass7 (line 30) | public class TestClass7 {
    method method (line 32) | @javax.ws.rs.GET
    method getResult (line 40) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass8.java
  class TestClass8 (line 32) | public class TestClass8 {
    method method (line 34) | @javax.ws.rs.GET
    method getResult (line 42) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass9.java
  class TestClass9 (line 30) | public class TestClass9 {
    method method (line 32) | @javax.ws.rs.GET public javax.json.JsonArray method() {
    method stateMachineNames (line 38) | private List<String> stateMachineNames() {
    method getResult (line 42) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass1.java
  class TestClass1 (line 9) | public class TestClass1 {
    method method (line 11) | @javax.ws.rs.GET
    method getResult (line 16) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass10.java
  class TestClass10 (line 12) | public class TestClass10 {
    method method (line 14) | @javax.ws.rs.GET public String method() {
    method getDailyAccesses (line 30) | private Map<String, Map<LocalDate, Integer>> getDailyAccesses() {
    method getAll (line 34) | public Map<String, Set<Instant>> getAll() {
    method calculateDailyAccesses (line 38) | private Map<LocalDate, Integer> calculateDailyAccesses(final Set<Insta...
    method getResult (line 44) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass11.java
  class TestClass11 (line 10) | public class TestClass11 {
    method method (line 12) | @javax.ws.rs.GET public String method() {
    method getInstance (line 17) | public <T> T getInstance(final Class<T> clazz) {
    method getResult (line 21) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass12.java
  class TestClass12 (line 10) | public class TestClass12<T> {
    method method (line 14) | @javax.ws.rs.GET public String method(final T body) {
    method getResult (line 19) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass13.java
  class TestClass13 (line 10) | public class TestClass13 {
    method method (line 14) | @javax.ws.rs.GET public String method() {
    method getResult (line 20) | public static Set<HttpResponse> getResult() {
    class TestManager (line 24) | private static class TestManager<T> {
      method getTest (line 28) | public T getTest() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass14.java
  class TestClass14 (line 10) | public class TestClass14<T> {
    method method (line 14) | @javax.ws.rs.GET public String method(final T body) {
    method getResult (line 20) | public static Set<HttpResponse> getResult() {
    class TestManager (line 24) | private static class TestManager<T> {
      method getTest (line 28) | public <U> T getTest(final U object) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass2.java
  class TestClass2 (line 9) | public class TestClass2 {
    method method (line 11) | @javax.ws.rs.GET
    method getResult (line 18) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass3.java
  class TestClass3 (line 10) | public class TestClass3 {
    method method (line 12) | @javax.ws.rs.GET public List<String> method() {
    method getResult (line 18) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass4.java
  class TestClass4 (line 8) | public class TestClass4 {
    method method (line 10) | @javax.ws.rs.GET
    method getResult (line 17) | public static Set<HttpResponse> getResult() {
    class Model (line 24) | private class Model {
      method Model (line 25) | public Model(final String string) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass5.java
  class TestClass5 (line 10) | public class TestClass5 {
    method method (line 12) | @javax.ws.rs.GET public List<Model> method() {
    method getResult (line 18) | public static Set<HttpResponse> getResult() {
    class Model (line 25) | private class Model {
      method Model (line 26) | public Model(final String string) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass6.java
  class TestClass6 (line 7) | public class TestClass6 {
    method method (line 9) | @javax.ws.rs.GET public List<Model> method() {
    method getResult (line 15) | public static Set<HttpResponse> getResult() {
    class Model (line 22) | private class Model {
      method Model (line 23) | public Model(final String string) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass7.java
  class TestClass7 (line 9) | public class TestClass7 {
    method method (line 11) | @javax.ws.rs.GET public List<Model> method() {
    method getResult (line 17) | public static Set<HttpResponse> getResult() {
    class Model (line 27) | private class Model {
      method Model (line 28) | public Model(final String string) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass8.java
  class TestClass8 (line 9) | public class TestClass8 {
    method method (line 11) | @javax.ws.rs.GET public List<Model> method() {
    method handleResponse (line 17) | private List<Model> handleResponse() {
    method getResult (line 21) | public static Set<HttpResponse> getResult() {
    class Model (line 31) | private class Model {
      method Model (line 32) | public Model(final String string) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass9.java
  class TestClass9 (line 8) | public class TestClass9 {
    method method (line 10) | @javax.ws.rs.GET public void method() {
    method getResult (line 15) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass1.java
  class TestClass1 (line 27) | public class TestClass1 {
    method method (line 29) | @javax.ws.rs.GET public Response method() {
    method getResult (line 36) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass10.java
  class TestClass10 (line 25) | public class TestClass10 {
    method method (line 27) | @javax.ws.rs.GET public Response method(final String id) {
    method getResult (line 32) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass11.java
  class TestClass11 (line 28) | public class TestClass11 {
    method method (line 30) | @javax.ws.rs.GET
    method getResult (line 38) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass12.java
  class TestClass12 (line 26) | public class TestClass12 {
    method method (line 28) | @javax.ws.rs.GET public Response method(final String id) {
    method getStatus (line 33) | private int getStatus() {
    method getResult (line 39) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass13.java
  class TestClass13 (line 25) | public class TestClass13 {
    method method (line 27) | @javax.ws.rs.GET public Response method(final String id) {
    method getStatus (line 36) | private int getStatus() {
    method getResult (line 40) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass14.java
  class TestClass14 (line 27) | public class TestClass14 {
    method method (line 29) | @javax.ws.rs.GET public Response method(final String id) {
    method getStatus (line 38) | private int getStatus() {
    method getResult (line 42) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass15.java
  class TestClass15 (line 30) | public class TestClass15 {
    method method (line 32) | @javax.ws.rs.GET public Response method(final String id) {
    method createResponse (line 39) | private Response createResponse(final Response.Status status) {
    method getResult (line 43) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass16.java
  class TestClass16 (line 29) | public class TestClass16 {
    method TestClass16 (line 31) | public TestClass16(final String test) {
    method method (line 35) | @javax.ws.rs.GET public Response method(final String id) {
    method getResult (line 41) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass17.java
  class TestClass17 (line 29) | public class TestClass17 {
    method method (line 32) | @javax.ws.rs.GET
    method getResult (line 39) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass18.java
  class TestClass18 (line 28) | public class TestClass18 {
    method method (line 31) | @javax.ws.rs.GET public Response method() {
    method getResult (line 38) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass19.java
  class TestClass19 (line 28) | public class TestClass19 {
    method method (line 31) | @javax.ws.rs.GET public Response method() {
    method getResult (line 46) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass2.java
  class TestClass2 (line 26) | public class TestClass2 {
    method method (line 28) | @javax.ws.rs.GET public Response method() {
    method getResult (line 36) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass20.java
  class TestClass20 (line 29) | public class TestClass20 {
    method method (line 32) | @javax.ws.rs.GET public Response method() {
    method getResult (line 40) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass21.java
  class TestClass21 (line 30) | public class TestClass21 {
    method method (line 33) | @javax.ws.rs.GET
    method getResult (line 42) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass22.java
  class TestClass22 (line 29) | public class TestClass22 {
    method method (line 32) | @javax.ws.rs.GET public Response method() {
    method getResult (line 53) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass23.java
  class TestClass23 (line 31) | public class TestClass23 {
    method method (line 34) | @javax.ws.rs.GET
    method getResult (line 47) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass24.java
  class TestClass24 (line 30) | public class TestClass24 {
    method method (line 33) | @javax.ws.rs.GET public Response method() {
    method getResult (line 41) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass25.java
  class TestClass25 (line 26) | public class TestClass25 {
    method method (line 28) | @javax.ws.rs.GET public Response method() {
    method getResult (line 37) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass26.java
  class TestClass26 (line 26) | public class TestClass26 {
    method method (line 28) | @javax.ws.rs.GET public Response method(final String id) {
    method response (line 33) | private Response response() {
    method getResult (line 39) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass27.java
  class TestClass27 (line 27) | public class TestClass27 {
    method method (line 29) | @javax.ws.rs.GET public Response method(final String id) {
    method otherResponse (line 36) | private Response otherResponse() {
    method response (line 40) | private Response response() {
    method getResult (line 46) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass28.java
  class TestClass28 (line 26) | public class TestClass28 {
    method method (line 28) | @javax.ws.rs.GET public Response method(final String id) {
    method response (line 33) | private static Response response() {
    method getResult (line 39) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass29.java
  class TestClass29 (line 27) | public class TestClass29 {
    method method (line 29) | @javax.ws.rs.GET public Response method(final String id) {
    method getResult (line 36) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass3.java
  class TestClass3 (line 26) | public class TestClass3 {
    method method (line 28) | @javax.ws.rs.GET public Response method() {
    method getResult (line 37) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass30.java
  class TestClass30 (line 27) | public class TestClass30 {
    method method (line 29) | @javax.ws.rs.GET public Response method(final String id) {
    method response (line 36) | private Response response(final Response.Status status) {
    method getResult (line 40) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass31.java
  class TestClass31 (line 28) | public class TestClass31 {
    method method (line 30) | @javax.ws.rs.GET public Response method(final String id) {
    method response (line 41) | private Response response(final Response.Status status) {
    method responseWithHeader (line 45) | private Response responseWithHeader(final Response.Status status) {
    method anotherResponse (line 49) | private Response anotherResponse(final Response.Status status) {
    method getResult (line 54) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass32.java
  class TestClass32 (line 26) | public class TestClass32 {
    method method (line 28) | @javax.ws.rs.GET public Response method() {
    method getResult (line 33) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass33.java
  class TestClass33 (line 27) | public class TestClass33 {
    method method (line 29) | @javax.ws.rs.GET public Response method(final String id) {
    method response (line 35) | private Response response(final Response.Status status, final String s...
    method getResult (line 40) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass34.java
  class TestClass34 (line 26) | public class TestClass34 {
    method method (line 30) | @javax.ws.rs.GET public Response method() {
    method getResult (line 35) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass35.java
  class TestClass35 (line 26) | public class TestClass35 {
    method method (line 28) | @javax.ws.rs.GET public Response method() {
    method getResult (line 33) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass36.java
  class TestClass36 (line 26) | public class TestClass36 {
    method method (line 28) | @javax.ws.rs.GET public Response method() {
    method response (line 33) | private BiFunction<String, Double, Response> response(final Response.S...
    method getResult (line 37) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass37.java
  class TestClass37 (line 32) | public class TestClass37 {
    method method (line 34) | @javax.ws.rs.GET
    method getResult (line 41) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass38.java
  class TestClass38 (line 31) | public class TestClass38 {
    method method (line 33) | @javax.ws.rs.GET
    method getResult (line 41) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass39.java
  class TestClass39 (line 34) | public class TestClass39 {
    method method (line 38) | @javax.ws.rs.GET
    method buildJsonArray (line 43) | public javax.json.JsonArray buildJsonArray() {
    method getResult (line 50) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass4.java
  class TestClass4 (line 27) | public class TestClass4 {
    method method (line 29) | @javax.ws.rs.GET
    method responseBuilder (line 40) | private Response.ResponseBuilder responseBuilder(final Response.Status...
    method getResult (line 44) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass40.java
  class TestClass40 (line 35) | public class TestClass40 {
    method method (line 37) | @javax.ws.rs.GET
    method getResult (line 58) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass41.java
  class TestClass41 (line 26) | public class TestClass41 {
    method method (line 28) | @javax.ws.rs.GET public Response method() {
    method getResult (line 34) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass42.java
  class TestClass42 (line 33) | public class TestClass42 {
    method method (line 37) | @javax.ws.rs.GET
    method buildJsonArray (line 42) | public javax.json.JsonArray buildJsonArray() {
    method toObject (line 47) | private javax.json.JsonObject toObject(final Object o) {
    method getResult (line 51) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass43.java
  class TestClass43 (line 33) | public class TestClass43 {
    method method (line 37) | @javax.ws.rs.GET
    method buildJsonArray (line 42) | public javax.json.JsonArray buildJsonArray() {
    method getResult (line 48) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass44.java
  class TestClass44 (line 27) | public class TestClass44 {
    method method (line 31) | @javax.ws.rs.GET
    method getResult (line 37) | public static Set<HttpResponse> getResult() {
    class User (line 47) | private static class User {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass45.java
  class TestClass45 (line 25) | public class TestClass45 {
    method method (line 29) | @javax.ws.rs.GET
    method getResult (line 37) | public static Set<HttpResponse> getResult() {
    class User (line 50) | private static class User {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass46.java
  class TestClass46 (line 28) | public class TestClass46 {
    method method (line 32) | @javax.ws.rs.GET
    method getResult (line 64) | public static Set<HttpResponse> getResult() {
    class User (line 83) | private static class User {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass47.java
  class TestClass47 (line 25) | public class TestClass47 {
    method method (line 29) | @javax.ws.rs.GET
    method getResult (line 37) | public static Set<HttpResponse> getResult() {
    class User (line 50) | private static class User {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass48.java
  class TestClass48 (line 25) | public class TestClass48 {
    method method (line 29) | @javax.ws.rs.GET
    method getResult (line 37) | public static Set<HttpResponse> getResult() {
    class User (line 50) | private static class User {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass49.java
  class TestClass49 (line 10) | public class TestClass49 {
    method method (line 14) | @javax.ws.rs.GET public Response method(@PathParam("input") String inp...
    method getResult (line 18) | public static Set<HttpResponse> getResult() {
    type Converter (line 26) | private interface Converter {
      method convert (line 27) | String convert(String string);

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass5.java
  class TestClass5 (line 27) | public class TestClass5 {
    method method (line 31) | @javax.ws.rs.GET public Response method() {
    method buildWithStatus (line 41) | private static Response buildWithStatus(final Response.Status status) {
    method getResult (line 45) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass50.java
  class TestClass50 (line 10) | public class TestClass50 {
    method method (line 14) | @javax.ws.rs.GET public Response method(@PathParam("input") String inp...
    method getResult (line 18) | public static Set<HttpResponse> getResult() {
    type Converter (line 26) | private interface Converter {
      method convert (line 27) | String convert(String string);

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass51.java
  class TestClass51 (line 10) | public class TestClass51 {
    method method (line 14) | @javax.ws.rs.GET public Response method(@PathParam("input") String inp...
    method getResult (line 18) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass52.java
  class TestClass52 (line 10) | public class TestClass52 {
    method method (line 14) | @javax.ws.rs.GET public Response method(@PathParam("input") String inp...
    method getResult (line 18) | public static Set<HttpResponse> getResult() {
    method getStatus (line 25) | public int getStatus() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass53.java
  class TestClass53 (line 25) | public class TestClass53 {
    method method (line 27) | @javax.ws.rs.GET public Response method(final String id) {
    method getResult (line 33) | public static Set<HttpResponse> getResult() {
    class InnerTestClass (line 41) | private class InnerTestClass {
      method InnerTestClass (line 43) | public InnerTestClass(final int number) {
      method method (line 47) | @javax.ws.rs.GET public int method() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass54.java
  class TestClass54 (line 25) | public class TestClass54 {
    method method (line 27) | @javax.ws.rs.GET public Response method(final String id) {
    method getResult (line 34) | public static Set<HttpResponse> getResult() {
    class InnerTestClass (line 45) | private class InnerTestClass {
      method InnerTestClass (line 47) | public InnerTestClass(final Response.ResponseBuilder builder) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass55.java
  class TestClass55 (line 26) | public class TestClass55 {
    method method (line 28) | @javax.ws.rs.GET public Response method(final String id) {
    method getResult (line 34) | public static Set<HttpResponse> getResult() {
    method status (line 44) | private int status(final int number) {
    method status (line 48) | private int status(final Integer number) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass56.java
  class TestClass56 (line 25) | public class TestClass56 {
    method method (line 27) | @javax.ws.rs.GET public Response method(final String id) {
    method createResponse (line 31) | private Response createResponse(final TestEnum test) {
    method getResult (line 35) | public static Set<HttpResponse> getResult() {
  type TestEnum (line 49) | enum TestEnum {
    method TestEnum (line 55) | TestEnum(final int status) {
    method getStatus (line 59) | public int getStatus() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass57.java
  class TestClass57 (line 25) | public class TestClass57 {
    method method (line 27) | @javax.ws.rs.GET public Response method(final String id) {
    method save (line 31) | private int save(final String id) {
    method getResult (line 37) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass58.java
  class TestClass58 (line 25) | public class TestClass58 {
    method method (line 27) | @javax.ws.rs.GET public Response method(final String id) {
    method save (line 31) | private int save(final String id) {
    method saveInternal (line 35) | private int saveInternal(final String id) {
    method saveInternal2 (line 41) | private int saveInternal2(final String s) {
    method getResult (line 47) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass59.java
  class TestClass59 (line 26) | public class TestClass59 {
    method method (line 30) | @javax.ws.rs.GET
    method getResult (line 38) | public static Set<HttpResponse> getResult() {
    type ConfigurationManager (line 49) | private interface ConfigurationManager {
      method getConfiguration (line 50) | Configuration getConfiguration(String name);
      class Configuration (line 52) | class Configuration {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass6.java
  class TestClass6 (line 28) | public class TestClass6 {
    method method (line 32) | @javax.ws.rs.GET public Response method(final String id) {
    method getResult (line 41) | public static Set<HttpResponse> getResult() {
    class InnerTestClass6 (line 53) | private class InnerTestClass6 {
      method method (line 57) | @javax.ws.rs.GET public void method(final String id) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass60.java
  class TestClass60 (line 25) | public class TestClass60 {
    method method (line 29) | @javax.ws.rs.GET
    method getResult (line 37) | public static Set<HttpResponse> getResult() {
    class ConfigurationManager (line 49) | private class ConfigurationManager {
      method getConfiguration (line 50) | public Configuration getConfiguration(String cacheName) {
      class Configuration (line 63) | class Configuration {
        method Configuration (line 64) | public Configuration() {
        method Configuration (line 67) | public Configuration(final boolean active) {
        method isActive (line 70) | boolean isActive() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass61.java
  class TestClass61 (line 26) | public class TestClass61 {
    method method (line 28) | @javax.ws.rs.GET public Response method(final String name) {
    method getInstance (line 32) | public <T> T getInstance(final Class<T> clazz) {
    method getResult (line 37) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass62.java
  class TestClass62 (line 27) | public class TestClass62 {
    method method (line 29) | @GET
    method getResult (line 42) | public static Set<HttpResponse> getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass7.java
  class TestClass7 (line 27) | public class TestClass7 {
    method method (line 31) | @javax.ws.rs.GET public Response method(final String id) {
    method getResult (line 40) | public static Set<HttpResponse> getResult() {
    class InnerTestClass6 (line 48) | private class InnerTestClass6 {
      method method (line 52) | public void method(final String id) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass8.java
  class TestClass8 (line 27) | public class TestClass8 {
    method method (line 31) | @javax.ws.rs.GET
    method getResult (line 42) | public static Set<HttpResponse> getResult() {
    class InnerTestClass6 (line 51) | private class InnerTestClass6 {
      method getModel (line 55) | public String getModel(final String id) {
      method method (line 59) | public int method(final int number) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass9.java
  class TestClass9 (line 27) | public class TestClass9 {
    method method (line 31) | @javax.ws.rs.GET public Response method(final String id) {
    method getResult (line 42) | public static Set<HttpResponse> getResult() {
    class InnerTestClass6 (line 50) | private class InnerTestClass6 {
      method method (line 54) | @javax.ws.rs.GET public int method(final int number) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/javadoc/ResponseCommentExtractorTest.java
  class ResponseCommentExtractorTest (line 14) | @RunWith(Parameterized.class)
    method testExtract (line 23) | @Test
    method data (line 28) | @Parameterized.Parameters
    method data (line 40) | private static Object[] data(String commentText, int status, String co...
    method nullData (line 44) | private static Object[] nullData(String commentText) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/ClassAnalyzerTest.java
  class ClassAnalyzerTest (line 40) | @RunWith(Parameterized.class)
    method ClassAnalyzerTest (line 47) | public ClassAnalyzerTest(final String testClassSimpleName, final Strin...
    method data (line 53) | @Parameterized.Parameters(name = "{0}")
    method test (line 77) | @Test

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass1.java
  class TestClass1 (line 30) | @Path("test")
    method method (line 33) | @GET
    method getResult (line 41) | public static ClassResult getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass10.java
  class TestClass10 (line 17) | @Path("test")
    method getInfo (line 20) | @Override
    method getResult (line 27) | public static ClassResult getResult() {
  class ATestClass10 (line 35) | abstract class ATestClass10 {
    method getInfo (line 37) | @POST
    method createResponse (line 41) | protected final Response createResponse(final Map<String, Integer> map) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass11.java
  class TestClass11 (line 18) | @Path("test")
    method getInfo (line 21) | @Override
    method getResult (line 26) | public static ClassResult getResult() {
  class ATestClass11 (line 35) | abstract class ATestClass11 {
    method getInfo (line 37) | @POST
    method getContent (line 41) | protected final GenericEntity<List<String>> getContent(final String co...

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass12.java
  class TestClass12 (line 31) | @Path("test")
    method getInfo (line 34) | @GET
    method getResult (line 40) | public static ClassResult getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass13.java
  class TestClass13 (line 31) | @Path("test")
    method getInfo (line 34) | @GET
    method getResult (line 40) | public static ClassResult getResult() {
    type Model (line 49) | public interface Model {
      method getString (line 50) | String getString();

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass14.java
  class TestClass14 (line 35) | @Path("test")
    method getInfo (line 42) | @GET
    method getResult (line 48) | public static ClassResult getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass15.java
  class TestClass15 (line 34) | @Path("test")
    method getInfo (line 41) | @GET
    method getResult (line 47) | public static ClassResult getResult() {
    type InnerTestClass15 (line 62) | private enum InnerTestClass15 {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass16.java
  class TestClass16 (line 34) | @Path("test")
    method getInfo (line 41) | @GET
    method getResult (line 47) | public static ClassResult getResult() {
    class StringValueOfParam (line 62) | private static class StringValueOfParam {
      method valueOf (line 63) | public static StringValueOfParam valueOf(String value) {
    class StringFromStringParam (line 68) | private static class StringFromStringParam {
      method fromString (line 69) | public static StringFromStringParam fromString(String value) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass2.java
  class TestClass2 (line 34) | @Path("test")
    method method (line 38) | @GET
    method post (line 45) | @POST
    method getResult (line 50) | public static ClassResult getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass3.java
  class TestClass3 (line 35) | @Path("test")
    method method (line 39) | @GET
    method getResult (line 44) | public static ClassResult getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass4.java
  class TestClass4 (line 31) | @Path("test")
    method getInfo (line 34) | @GET
    method getResult (line 40) | public static ClassResult getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass5.java
  class TestClass5 (line 30) | @Path("test")
    method getInfo (line 33) | @GET
    method getResult (line 37) | public static ClassResult getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass6.java
  type TestClass6 (line 30) | @Path("test")
    method getInfo (line 33) | @GET
    method getResult (line 37) | static ClassResult getResult() {
    class Model (line 44) | class Model {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass7.java
  class TestClass7 (line 29) | @Path("test")
    method getInfo (line 32) | @POST
    method getResult (line 36) | public static ClassResult getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass8.java
  class TestClass8 (line 31) | @Path("test")
    method getInfo (line 34) | @Override
    method getResult (line 39) | public static ClassResult getResult() {
  class ATestClass8 (line 47) | abstract class ATestClass8 {
    method getInfo (line 49) | @POST
    method createResponse (line 53) | protected final Response createResponse() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/project/classes/testclasses/TestClass9.java
  class TestClass9 (line 33) | @Path("test")
    method getInfo (line 39) | @GET
    method getResult (line 45) | public static ClassResult getResult() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/DynamicTypeAnalyzerTest.java
  class DynamicTypeAnalyzerTest (line 22) | public class DynamicTypeAnalyzerTest {
    method setUp (line 27) | @Before
    method testPrimitives (line 33) | @Test
    method testArraysAndObjects (line 53) | @Test
    method testArraysAndObjectsNestedTypes (line 75) | @Test
    method testEqualTypes (line 117) | @Test
    method getRepresentation (line 164) | private <T extends TypeRepresentation> T getRepresentation(final Strin...
    method jsonNumber (line 168) | private static JsonNumber jsonNumber(final double number) {
    method jsonString (line 172) | private static JsonString jsonString(final String string) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/JavaTypeAnalyzerTest.java
  class JavaTypeAnalyzerTest (line 34) | @RunWith(Parameterized.class)
    method JavaTypeAnalyzerTest (line 44) | public JavaTypeAnalyzerTest(final String testClassSimpleName, final St...
    method data (line 54) | @Parameterized.Parameters(name = "{0}")
    method test (line 77) | @Test

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/PathNormalizerTest.java
  class PathNormalizerTest (line 19) | @RunWith(Parameterized.class)
    method test (line 31) | @Test
    method testData (line 39) | @Parameterized.Parameters(name = "{0}, {1}, {2} -> {3}")
    method buildClassStructure (line 59) | private static ClassResult buildClassStructure(final String path, fina...
    method findDeepestMethodResult (line 67) | private static MethodResult findDeepestMethodResult(final ClassResult ...

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/ResultInterpreterTest.java
  class ResultInterpreterTest (line 38) | public class ResultInterpreterTest {
    method setUp (line 42) | @Before
    method testStandard (line 47) | @Test
    method testSubResource (line 68) | @Test
    method testRootResource (line 95) | @Test
    method testNormalizeGenericEntityNoCollection (line 114) | @Test
    method testContentTypes (line 137) | @Test
    method testOverrideAnnotationContentType (line 158) | @Test
    method testNestedBasePath (line 180) | @Test
    method testDefaultStatusCodes (line 201) | @Test
    method testNormalize (line 227) | @Test
    method testAmbiguousEntityTypes (line 254) | @Test
    method testDescriptions (line 284) | @Test
    type ConfigurationManager (line 310) | private interface ConfigurationManager {
      class Configuration (line 311) | @XmlAccessorType(XmlAccessType.FIELD)

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/TypeUtils.java
  class TypeUtils (line 7) | public final class TypeUtils {
    method TypeUtils (line 16) | private TypeUtils() {
    method equals (line 24) | public static boolean equals(final TypeRepresentation first, final Typ...

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass1.java
  class TestClass1 (line 29) | public class TestClass1 {
    method getTest (line 37) | public String getTest() {
    method getInt (line 41) | public int getInt() {
    method getStaticString (line 45) | public static String getStaticString() {
    method string (line 49) | public String string() {
    method expectedTypeRepresentations (line 53) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 63) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass10.java
  class TestClass10 (line 30) | @XmlAccessorType(XmlAccessType.FIELD)
    method isFirst (line 37) | public boolean isFirst() {
    method getSecond (line 41) | public Map getSecond() {
    method expectedTypeRepresentations (line 45) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 55) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass11.java
  class TestClass11 (line 30) | @XmlAccessorType(XmlAccessType.FIELD)
    method expectedTypeRepresentations (line 37) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 48) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass12.java
  class TestClass12 (line 27) | @XmlAccessorType(XmlAccessType.FIELD)
    class InnerTestClass (line 33) | @XmlAccessorType(XmlAccessType.FIELD)
    method expectedTypeRepresentations (line 39) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 58) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass13.java
  class TestClass13 (line 26) | public class TestClass13 {
    method getLongAndString (line 31) | public GenericFields<Long, String> getLongAndString() {
    method getStringAndLong (line 35) | public GenericFields<String, Long> getStringAndLong() {
    class GenericFields (line 39) | private static class GenericFields<A, B> {
      method getA (line 47) | public A getA() {
      method getB (line 51) | public B getB() {
      method getListA (line 55) | public List<A> getListA() {
    method expectedTypeRepresentations (line 61) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 94) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass14.java
  class TestClass14 (line 28) | @XmlAccessorType(XmlAccessType.FIELD)
    method getLongAndString (line 34) | public GenericFields<Long, String> getLongAndString() {
    method getStringAndLong (line 38) | public GenericFields<String, Long> getStringAndLong() {
    class GenericFields (line 42) | @XmlAccessorType(XmlAccessType.FIELD)
      method getA (line 51) | public A getA() {
      method getB (line 55) | public B getB() {
      method getListA (line 59) | public List<A> getListA() {
    method expectedTypeRepresentations (line 65) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 98) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass15.java
  class TestClass15 (line 12) | public class TestClass15 extends SuperTestClass1 {
    method getFoobar (line 16) | public String getFoobar() {
    method setFoobar (line 20) | public void setFoobar(String foobar) {
    method expectedTypeRepresentations (line 24) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 33) | public static TypeIdentifier expectedIdentifier() {
  class SuperTestClass1 (line 39) | class SuperTestClass1 {
    method getTest (line 43) | public String getTest() {
    method setTest (line 47) | public void setTest(String test) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass16.java
  class TestClass16 (line 11) | public class TestClass16 extends SuperTestClass2 {
    method expectedTypeRepresentations (line 16) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 29) | public static TypeIdentifier expectedIdentifier() {
  class SuperTestClass2 (line 35) | @XmlAccessorType(XmlAccessType.FIELD)

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass17.java
  class TestClass17 (line 9) | public class TestClass17 extends SuperTestClass3 {
    method getWorld (line 14) | public String getWorld() {
    method setWorld (line 18) | public void setWorld(String world) {
    method getPartner (line 22) | public SuperTestClass3 getPartner() {
    method setPartner (line 26) | public void setPartner(SuperTestClass3 partner) {
    method expectedTypeRepresentations (line 30) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 43) | public static TypeIdentifier expectedIdentifier() {
  class SuperTestClass3 (line 49) | class SuperTestClass3 {
    method getHello (line 52) | public String getHello() {
    method setHello (line 56) | public void setHello(String hello) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass18.java
  class TestClass18 (line 15) | @XmlAccessorType(XmlAccessType.FIELD)
    method expectedTypeRepresentations (line 21) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 32) | public static TypeIdentifier expectedIdentifier() {
  class SuperTestClass4 (line 38) | @XmlAccessorType(XmlAccessType.FIELD)

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass19.java
  class TestClass19 (line 12) | public class TestClass19 extends SuperTestClass5 {
    method getFoobar (line 16) | public String getFoobar() {
    method setFoobar (line 20) | public void setFoobar(String foobar) {
    method expectedTypeRepresentations (line 24) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 35) | public static TypeIdentifier expectedIdentifier() {
  class SuperTestClass5 (line 41) | class SuperTestClass5 extends SuperTestClass6 {
    method getTest (line 45) | public String getTest() {
    method setTest (line 49) | public void setTest(String test) {
    method getOveridden (line 53) | public String getOveridden() {
  class SuperTestClass6 (line 59) | abstract class SuperTestClass6 {
    method getHello (line 63) | public String getHello() {
    method setHello (line 67) | public void setHello(String hello) {
    method getOveridden (line 71) | public abstract Object getOveridden();

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass2.java
  class TestClass2 (line 27) | public class TestClass2 {
    method getFirst (line 37) | @XmlTransient
    method getSecond (line 42) | public String getSecond() {
    method expectedTypeRepresentations (line 46) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 50) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass20.java
  class TestClass20 (line 12) | public class TestClass20 implements Interface1, Interface2 {
    method getFoobar (line 16) | public String getFoobar() {
    method setFoobar (line 20) | public void setFoobar(String foobar) {
    method expectedTypeRepresentations (line 24) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 36) | public static TypeIdentifier expectedIdentifier() {
    method getTest1 (line 40) | @Override
    method getTest2 (line 45) | @Override
  type Interface1 (line 51) | interface Interface1 {
    method getTest1 (line 53) | String getTest1();
  type Interface2 (line 57) | interface Interface2 extends Interface3 {
    method getTest2 (line 59) | String getTest2();
    method getTest3 (line 61) | default String getTest3() {
  type Interface3 (line 66) | interface Interface3 {
    method getTest3 (line 68) | Object getTest3();
    method getTest4 (line 70) | default String getTest4() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass21.java
  class TestClass21 (line 29) | public class TestClass21 {
    method getInner (line 33) | public InnerTestClass21 getInner() {
    method setInner (line 37) | public void setInner(final InnerTestClass21 inner) {
    method expectedTypeRepresentations (line 41) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 50) | public static TypeIdentifier expectedIdentifier() {
    type InnerTestClass21 (line 54) | private enum InnerTestClass21 {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass22.java
  class TestClass22 (line 33) | public class TestClass22 {
    method getTest (line 42) | public String getTest() {
    method getInt (line 46) | public int getInt() {
    method getStaticString (line 50) | public static String getStaticString() {
    method string (line 54) | public String string() {
    method expectedTypeRepresentations (line 58) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 69) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass23.java
  class TestClass23 (line 34) | @XmlAccessorType(XmlAccessType.FIELD)
    method expectedTypeRepresentations (line 42) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 53) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass24.java
  class TestClass24 (line 31) | @XmlAccessorType(XmlAccessType.FIELD)
    class InnerTestClass (line 37) | @JsonIgnoreType
    method expectedTypeRepresentations (line 43) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 55) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass25.java
  class TestClass25 (line 33) | public class TestClass25 {
    method getTest (line 42) | @JsonIgnore
    method getInt (line 47) | public int getInt() {
    method getStaticString (line 51) | public static String getStaticString() {
    method string (line 55) | public String string() {
    method expectedTypeRepresentations (line 59) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 69) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass26.java
  class TestClass26 (line 16) | public class TestClass26 extends SuperTestClass26 {
    method getFoobar (line 20) | public String getFoobar() {
    method setFoobar (line 24) | public void setFoobar(String foobar) {
    method expectedTypeRepresentations (line 28) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 36) | public static TypeIdentifier expectedIdentifier() {
  class SuperTestClass26 (line 43) | class SuperTestClass26 {
    method getTest (line 48) | public String getTest() {
    method setTest (line 52) | public void setTest(String test) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass27.java
  class TestClass27 (line 20) | public class TestClass27 extends SuperTestClass27 {
    method getFoobar (line 24) | public String getFoobar() {
    method setFoobar (line 28) | public void setFoobar(String foobar) {
    method expectedTypeRepresentations (line 32) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 40) | public static TypeIdentifier expectedIdentifier() {
  class SuperTestClass27 (line 46) | @JsonIgnoreType
    method getTest (line 51) | public String getTest() {
    method setTest (line 55) | public void setTest(String test) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass28.java
  class TestClass28 (line 16) | public class TestClass28 extends SuperTestClass28 {
    method getFoobar (line 20) | public String getFoobar() {
    method setFoobar (line 24) | public void setFoobar(String foobar) {
    method expectedTypeRepresentations (line 28) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 36) | public static TypeIdentifier expectedIdentifier() {
  class SuperTestClass28 (line 43) | class SuperTestClass28 {
    method getTest (line 47) | @JsonIgnore
    method setTest (line 52) | public void setTest(String test) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass29.java
  class TestClass29 (line 33) | public class TestClass29 {
    method isTest (line 45) | public boolean isTest() {
    method getInt (line 49) | public int getInt() {
    method getStaticString (line 53) | public static String getStaticString() {
    method string (line 57) | public String string() {
    method expectedTypeRepresentations (line 61) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 70) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass3.java
  class TestClass3 (line 28) | @XmlRootElement
    method getFirrst (line 38) | public InnerClass getFirrst() {
    method getSeccond (line 42) | public Type getSeccond() {
    method expectedTypeRepresentations (line 46) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 65) | public static TypeIdentifier expectedIdentifier() {
    method getThirrd (line 69) | public AnotherInner getThirrd() {
    type Type (line 73) | private enum Type {
    class InnerClass (line 77) | private class InnerClass {
      method getName (line 80) | public String getName() {
    class AnotherInner (line 85) | private class AnotherInner {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass30.java
  class TestClass30 (line 33) | public class TestClass30 {
    method isTestName (line 46) | public boolean isTestName() {
    method isTestname (line 50) | public boolean isTestname() {
    method getInt (line 54) | public int getInt() {
    method getStaticString (line 58) | public static String getStaticString() {
    method string (line 62) | public String string() {
    method expectedTypeRepresentations (line 66) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 76) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass4.java
  class TestClass4 (line 26) | public class TestClass4 {
    method getFirst (line 32) | public LocalDate getFirst() {
    method getSecond (line 36) | public Date getSecond() {
    method expectedTypeRepresentations (line 40) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 49) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass5.java
  class TestClass5 (line 26) | @XmlRootElement
    method getIgnored (line 35) | public List<String> getIgnored() {
    method getSecond (line 39) | @XmlElement
    method expectedTypeRepresentations (line 44) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 61) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass6.java
  class TestClass6 (line 30) | public class TestClass6 {
    method isFirst (line 35) | public boolean isFirst() {
    method getSecond (line 39) | public String getSecond() {
    method getFake (line 44) | public void getFake() {
    method isFake (line 47) | public String isFake() {
    method getThird (line 51) | @XmlElement
    method expectedTypeRepresentations (line 56) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 66) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass7.java
  class TestClass7 (line 33) | @XmlRootElement
    method isFirst (line 42) | public boolean isFirst() {
    method getSecond (line 46) | public String getSecond() {
    method expectedTypeRepresentations (line 50) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 60) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/testclasses/typeanalyzer/TestClass8.java
  class TestClass8 (line 32) | @XmlRootElement
    method isFirst (line 41) | public boolean isFirst() {
    method getSecond (line 45) | public String getSecond() {
    method expectedTypeRepresentations (line 49) | public static Set<TypeRepresentation> expectedTypeRepresentations() {
    method expectedIdentifier (line 57) | public static TypeIdentifier expectedIdentifier() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/utils/JavaUtilSignatureTest.java
  class JavaUtilSignatureTest (line 17) | @RunWith(Parameterized.class)
    method JavaUtilSignatureTest (line 23) | public JavaUtilSignatureTest(final String signature, final List<String...
    method testGetParameters (line 28) | @Test
    method data (line 38) | @Parameterized.Parameters
    method testData (line 56) | private static Object[] testData(String signature, List<String> types) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/utils/JavaUtilsTest.java
  class JavaUtilsTest (line 11) | public class JavaUtilsTest {
    method testGetTypeParameters (line 13) | @Test
    method testIsAssignableToSame (line 25) | @Test
    method testIsAssignableToPrimitives (line 32) | @Test
    method testIsAssignableToArray (line 40) | @Test
    method testIsAssignableToInheritance (line 60) | @Test
    method testIsAssignableToGeneric (line 68) | @Test
    method testIsAssignableToParameterized (line 76) | @Test
    method testIsAssignableToDifferentTypes (line 84) | @Test
    method testIsAssignableToParameterizedInheritedParameters (line 90) | @Test
    method testIsAssignableToParameterizedInheritedParametersExtended (line 98) | @Test
    method testIsAssignableToCollection (line 106) | @Test
    method testIsAssignableToOddParameterizedTypes (line 113) | @Test
    method testDetermineMostSpecificTypeOnlyOne (line 133) | @Test
    method testDetermineMostSpecificTypeParameterized (line 139) | @Test
    method testDetermineMostSpecificTypeArray (line 150) | @Test
    method testDetermineMostSpecificTypeObject (line 161) | @Test
    method testDetermineMostSpecificTypeInheritance (line 172) | @Test
    method testDetermineMostSpecificTypeParameterizedInner (line 183) | @Test
    method testDetermineMostSpecificTypeParameterizedInheritance (line 195) | @Test
    method testDetermineMostSpecificTypeParameterizedInnerInheritance (line 207) | @Test
    method testToReadableTypes (line 219) | @Test

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/utils/TestClassUtils.java
  class TestClassUtils (line 25) | public class TestClassUtils {
    method TestClassUtils (line 27) | private TestClassUtils() {
    method getClasses (line 38) | public static Set<String> getClasses(final String packageName) throws ...

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/backend/JsonRepresentationAppenderTest.java
  class JsonRepresentationAppenderTest (line 16) | public class JsonRepresentationAppenderTest {
    method setup (line 26) | @Before
    method testVisitPrimitive (line 33) | @Test
    method testMissingRepresentation (line 39) | @Test
    method testEnum (line 45) | @Test
    method testEnumEmpty (line 51) | @Test
    method testVisitSimpleList (line 57) | @Test
    method testVisitMultipleList (line 79) | @Test
    method testVisitDynamic (line 98) | @Test
    method testVisitConcrete (line 108) | @Test
    method testVisitConcreteWithNested (line 126) | @Test
    method testVisitConcreteWithNestedPreventSuppression (line 141) | @Test
    method testVisitRecursiveType (line 202) | @Test
    method testVisitCyclicRecursiveType (line 223) | @Test
    method clear (line 254) | private static void clear(final StringBuilder builder) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/backend/asciidoc/AsciiDocBackendTest.java
  class AsciiDocBackendTest (line 24) | @RunWith(Parameterized.class)
    method AsciiDocBackendTest (line 32) | public AsciiDocBackendTest(Resources resources, String expectedOutput,...
    method test (line 39) | @Test
    method data (line 48) | @Parameterized.Parameters
    method add (line 353) | public static void add(final Collection<Object[]> data, final Resource...

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/backend/markdown/MarkdownBackendTest.java
  class MarkdownBackendTest (line 31) | @RunWith(Parameterized.class)
    method MarkdownBackendTest (line 39) | public MarkdownBackendTest(Resources resources, String expectedOutput,...
    method test (line 46) | @Test
    method data (line 55) | @Parameterized.Parameters
    method add (line 335) | public static void add(final Collection<Object[]> data, final Resource...

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/backend/plaintext/PlainTextBackendTest.java
  class PlainTextBackendTest (line 30) | @RunWith(Parameterized.class)
    method PlainTextBackendTest (line 37) | public PlainTextBackendTest(final Resources resources, final String ex...
    method test (line 43) | @Test
    method data (line 51) | @Parameterized.Parameters
    method add (line 260) | public static void add(final Collection<Object[]> data, final Resource...

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/SchemaBuilderTest.java
  class SchemaBuilderTest (line 19) | public class SchemaBuilderTest {
    method resetRepresentations (line 27) | @Before
    method testSimpleDefinitions (line 33) | @Test
    method testMultipleDefinitionsNameCollisions (line 80) | @Test
    method testSingleDynamicDefinitionMissingNestedType (line 117) | @Test
    method testMultipleDifferentDefinitions (line 142) | @Test
    method testSameDynamicDefinitions (line 169) | @Test
    method testDifferentDynamicDefinitions (line 205) | @Test
    method testEnumDefinitions (line 241) | @Test
    method type (line 266) | private static JsonObject type(final String type) {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/SwaggerBackendTest.java
  class SwaggerBackendTest (line 44) | @RunWith(Parameterized.class)
    method SwaggerBackendTest (line 51) | public SwaggerBackendTest(final Resources resources, final String expe...
    method test (line 58) | @Test
    method data (line 77) | @Parameterized.Parameters
    method add (line 254) | public static void add(final Collection<Object[]> data, final Resource...
    method add (line 260) | public static void add(final Collection<Object[]> data, final Resource...

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/TypeIdentifierTestSupport.java
  class TypeIdentifierTestSupport (line 8) | final class TypeIdentifierTestSupport {
    method TypeIdentifierTestSupport (line 10) | private TypeIdentifierTestSupport() {
    method resetTypeIdentifierCounter (line 13) | static void resetTypeIdentifierCounter() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/builder/ClassResultBuilder.java
  class ClassResultBuilder (line 28) | public class ClassResultBuilder {
    method ClassResultBuilder (line 32) | private ClassResultBuilder() {
    method withApplicationPath (line 36) | public static ClassResultBuilder withApplicationPath(final String appl...
    method withResourcePath (line 42) | public static ClassResultBuilder withResourcePath(final String resourc...
    method andMethods (line 48) | public ClassResultBuilder andMethods(final MethodResult... methodResul...
    method andAcceptMediaTypes (line 53) | public ClassResultBuilder andAcceptMediaTypes(final String... mediaTyp...
    method andResponseMediaTypes (line 58) | public ClassResultBuilder andResponseMediaTypes(final String... mediaT...
    method andMatrixParam (line 63) | public ClassResultBuilder andMatrixParam(final String name, final Stri...
    method andMatrixParam (line 68) | public ClassResultBuilder andMatrixParam(final String name, final Stri...
    method andQueryParam (line 73) | public ClassResultBuilder andQueryParam(final String name, final Strin...
    method andQueryParam (line 78) | public ClassResultBuilder andQueryParam(final String name, final Strin...
    method andPathParam (line 83) | public ClassResultBuilder andPathParam(final String name, final String...
    method andPathParam (line 88) | public ClassResultBuilder andPathParam(final String name, final String...
    method andCookieParam (line 93) | public ClassResultBuilder andCookieParam(final String name, final Stri...
    method andCookieParam (line 98) | public ClassResultBuilder andCookieParam(final String name, final Stri...
    method andHeaderParam (line 103) | public ClassResultBuilder andHeaderParam(final String name, final Stri...
    method andHeaderParam (line 108) | public ClassResultBuilder andHeaderParam(final String name, final Stri...
    method andFormParam (line 113) | public ClassResultBuilder andFormParam(final String name, final String...
    method andFormParam (line 118) | public ClassResultBuilder andFormParam(final String name, final String...
    method andParam (line 123) | private ClassResultBuilder andParam(final ParameterType parameterType,...
    method andDeprecated (line 131) | public ClassResultBuilder andDeprecated(final boolean deprecated) {
    method build (line 136) | public ClassResult build() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/builder/HttpResponseBuilder.java
  class HttpResponseBuilder (line 24) | public class HttpResponseBuilder {
    method HttpResponseBuilder (line 28) | private HttpResponseBuilder() {
    method newBuilder (line 32) | public static HttpResponseBuilder newBuilder() {
    method withStatues (line 36) | public static HttpResponseBuilder withStatues(final Integer... statues) {
    method andInlineEntities (line 42) | public HttpResponseBuilder andInlineEntities(final JsonValue... jsonVa...
    method andHeaders (line 47) | public HttpResponseBuilder andHeaders(final String... headers) {
    method andContentTypes (line 52) | public HttpResponseBuilder andContentTypes(final String... contentType...
    method andEntityTypes (line 57) | public HttpResponseBuilder andEntityTypes(final String... entityTypes) {
    method build (line 62) | public HttpResponse build() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/builder/MethodResultBuilder.java
  class MethodResultBuilder (line 30) | public class MethodResultBuilder {
    method MethodResultBuilder (line 34) | private MethodResultBuilder() {
    method newBuilder (line 38) | public static MethodResultBuilder newBuilder() {
    method withResponses (line 42) | public static MethodResultBuilder withResponses(final HttpResponse... ...
    method andMethodDoc (line 48) | public MethodResultBuilder andMethodDoc(final MethodComment methodDoc) {
    method andPath (line 53) | public MethodResultBuilder andPath(final String path) {
    method andMethod (line 58) | public MethodResultBuilder andMethod(final HttpMethod httpMethod) {
    method andRequestMediaTypes (line 63) | public MethodResultBuilder andRequestMediaTypes(final String... mediaT...
    method andResponseMediaTypes (line 68) | public MethodResultBuilder andResponseMediaTypes(final String... media...
    method andRequestBodyType (line 73) | public MethodResultBuilder andRequestBodyType(final String type) {
    method andMatrixParam (line 78) | public MethodResultBuilder andMatrixParam(final String name, final Str...
    method andMatrixParam (line 83) | public MethodResultBuilder andMatrixParam(final String name, final Str...
    method andQueryParam (line 88) | public MethodResultBuilder andQueryParam(final String name, final Stri...
    method andQueryParam (line 93) | public MethodResultBuilder andQueryParam(final String name, final Stri...
    method andPathParam (line 98) | public MethodResultBuilder andPathParam(final String name, final Strin...
    method andPathParam (line 103) | public MethodResultBuilder andPathParam(final String name, final Strin...
    method andCookieParam (line 108) | public MethodResultBuilder andCookieParam(final String name, final Str...
    method andCookieParam (line 113) | public MethodResultBuilder andCookieParam(final String name, final Str...
    method andHeaderParam (line 118) | public MethodResultBuilder andHeaderParam(final String name, final Str...
    method andHeaderParam (line 123) | public MethodResultBuilder andHeaderParam(final String name, final Str...
    method andFormParam (line 128) | public MethodResultBuilder andFormParam(final String name, final Strin...
    method andFormParam (line 133) | public MethodResultBuilder andFormParam(final String name, final Strin...
    method andParam (line 138) | private MethodResultBuilder andParam(final ParameterType parameterType...
    method andDeprecated (line 146) | public MethodResultBuilder andDeprecated(final boolean deprecated) {
    method build (line 151) | public MethodResult build() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/builder/ResourceMethodBuilder.java
  class ResourceMethodBuilder (line 23) | public class ResourceMethodBuilder {
    method ResourceMethodBuilder (line 27) | private ResourceMethodBuilder(final HttpMethod method) {
    method ResourceMethodBuilder (line 31) | public ResourceMethodBuilder(final HttpMethod method, final String des...
    method withMethod (line 35) | public static ResourceMethodBuilder withMethod(final HttpMethod method) {
    method withMethod (line 39) | public static ResourceMethodBuilder withMethod(final HttpMethod method...
    method andRequestBodyType (line 43) | public ResourceMethodBuilder andRequestBodyType(final String type) {
    method andRequestBodyType (line 48) | public ResourceMethodBuilder andRequestBodyType(final String type, fin...
    method andRequestBodyType (line 54) | public ResourceMethodBuilder andRequestBodyType(final TypeIdentifier i...
    method andResponse (line 59) | public ResourceMethodBuilder andResponse(final int status, final Respo...
    method andAcceptMediaTypes (line 64) | public ResourceMethodBuilder andAcceptMediaTypes(final String... media...
    method andResponseMediaTypes (line 69) | public ResourceMethodBuilder andResponseMediaTypes(final String... med...
    method andMatrixParam (line 74) | public ResourceMethodBuilder andMatrixParam(final String name, final S...
    method andMatrixParam (line 79) | public ResourceMethodBuilder andMatrixParam(final String name, final S...
    method andQueryParam (line 84) | public ResourceMethodBuilder andQueryParam(final String name, final St...
    method andQueryParam (line 89) | public ResourceMethodBuilder andQueryParam(final String name, final St...
    method andQueryParam (line 94) | public ResourceMethodBuilder andQueryParam(final String name, final St...
    method andPathParam (line 99) | public ResourceMethodBuilder andPathParam(final String name, final Str...
    method andPathParam (line 104) | public ResourceMethodBuilder andPathParam(final String name, final Str...
    method andPathParam (line 109) | public ResourceMethodBuilder andPathParam(final String name, final Str...
    method andCookieParam (line 114) | public ResourceMethodBuilder andCookieParam(final String name, final S...
    method andCookieParam (line 119) | public ResourceMethodBuilder andCookieParam(final String name, final S...
    method andHeaderParam (line 124) | public ResourceMethodBuilder andHeaderParam(final String name, final S...
    method andHeaderParam (line 129) | public ResourceMethodBuilder andHeaderParam(final String name, final S...
    method andFormParam (line 134) | public ResourceMethodBuilder andFormParam(final String name, final Str...
    method andFormParam (line 139) | public ResourceMethodBuilder andFormParam(final String name, final Str...
    method andParam (line 144) | public ResourceMethodBuilder andParam(final ParameterType parameterTyp...
    method andDeprecated (line 153) | public ResourceMethodBuilder andDeprecated(final boolean deprecated) {
    method build (line 158) | public ResourceMethod build() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/builder/ResourcesBuilder.java
  class ResourcesBuilder (line 29) | public class ResourcesBuilder {
    method ResourcesBuilder (line 33) | private ResourcesBuilder() {
    method withBase (line 37) | public static ResourcesBuilder withBase(final String baseUri) {
    method andResource (line 43) | public ResourcesBuilder andResource(final String resource, final Resou...
    method andTypeRepresentation (line 48) | public ResourcesBuilder andTypeRepresentation(final TypeIdentifier ide...
    method build (line 53) | public Resources build() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/builder/ResponseBuilder.java
  class ResponseBuilder (line 27) | public class ResponseBuilder {
    method ResponseBuilder (line 31) | private ResponseBuilder(final Response response) {
    method newBuilder (line 35) | public static ResponseBuilder newBuilder() {
    method withResponseBody (line 39) | public static ResponseBuilder withResponseBody(final TypeIdentifier re...
    method andHeaders (line 43) | public ResponseBuilder andHeaders(final String... headers) {
    method build (line 48) | public Response build() {

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/CollectionTypeRepresentationTest.java
  class CollectionTypeRepresentationTest (line 14) | public class CollectionTypeRepresentationTest {
    method testContentEqualsConcrete (line 16) | @Test
    method testContentEqualsCollection (line 35) | @Test

FILE: src/test/java/com/sebastian_daschner/jaxrs_analyzer/model/types/TypeTest.java
  class TypeTest (line 6) | public class TypeTest {

FILE: src/test/java/com/sebastian_daschner/test/Enumeration.java
  type Enumeration (line 3) | public enum Enumeration {

FILE: src/test/java/com/sebastian_daschner/test/Model.java
  class Model (line 3) | public class Model {

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/AbstractResources.java
  class AbstractResources (line 26) | public abstract class AbstractResources {
    method getInfo (line 28) | @GET
    method getString (line 34) | @GET
    method putComplex (line 41) | @PUT

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/ComplexResources.java
  class ComplexResources (line 36) | @Stateless
    method getInfo (line 46) | @Override
    method getStatus (line 51) | @Override
    method getStrings (line 56) | @GET
    method getString (line 65) | @Override
    method subResources (line 70) | @Path("sub")
    method createSomeSubResource (line 75) | private SomeSubResource createSomeSubResource() {
    method anotherSubResource (line 79) | @Path("anotherSub")
    method anotherSubresResource (line 84) | @Path("anotherSubres")
    method get (line 95) | @GET

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/Enumeration.java
  type Enumeration (line 22) | public enum Enumeration {

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/IgnoredTestResources.java
  class IgnoredTestResources (line 33) | @Path("/ignored")
    method test (line 47) | @GET
    method getModels (line 54) | @GET
    method foobar (line 59) | public <T extends Comparable<? super T>> T foobar() {
    method simplePost (line 63) | @POST
    method put (line 72) | @PUT
    method deleteTest (line 84) | @DELETE
    method getModel (line 90) | @GET
    method delete (line 98) | @DELETE
    method anotherDelete (line 118) | @DELETE

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/JsonResources.java
  class JsonResources (line 30) | @Path("json_tests")
    method getJson (line 33) | @GET
    method post (line 38) | @POST
    method getInfo (line 47) | @Path("info")

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/Manager.java
  class Manager (line 24) | @Stateless
    method getInstance (line 27) | public <U> U getInstance(final Class<U> clazz, final T object) {

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/Model.java
  class Model (line 24) | @Entity
    method Model (line 38) | public Model() {
    method Model (line 42) | public Model(final String name) {
    method getId (line 46) | public long getId() {
    method setId (line 50) | public void setId(final long id) {
    method getName (line 54) | public String getName() {
    method setName (line 58) | public void setName(final String name) {
    method toString (line 62) | @Override

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/ResourceWithoutClassLevelJavadoc.java
  class ResourceWithoutClassLevelJavadoc (line 27) | @Stateless
    method testJson (line 42) | @GET

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/Resources.java
  type Resources (line 25) | public interface Resources {
    method getStatus (line 27) | @GET

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/RestActivator.java
  class RestActivator (line 25) | @ApplicationPath("rest")

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/SomeSubResource.java
  type SomeSubResource (line 22) | public interface SomeSubResource {

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/SubResources.java
  class SubResources (line 25) | @Path("subsub")
    method SubResources (line 36) | public SubResources(final String name) {
    method getSub (line 46) | @GET
    method postSub (line 58) | @POST

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/TestResources.java
  class TestResources (line 34) | @Path("/test")
    method test (line 48) | @GET
    method testJson (line 55) | @GET
    method getModels (line 62) | @GET
    method foobar (line 67) | public <T extends Comparable<? super T>> T foobar() {
    method simplePost (line 71) | @POST
    method put (line 80) | @PUT
    method deleteTest (line 92) | @DELETE
    method getModel (line 98) | @GET
    method delete (line 106) | @DELETE
    method anotherDelete (line 126) | @DELETE

FILE: src/test/jaxrs-test/com/sebastian_daschner/jaxrs_test/TestStore.java
  class TestStore (line 25) | @Stateless
    method getModel (line 28) | public Model getModel(final String id) {
    method addModel (line 32) | public String addModel(final Model model) {
    method getModels (line 36) | public List<Model> getModels() {
    method delete (line 40) | public void delete(final String id) {
Condensed preview — 317 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,074K chars).
[
  {
    "path": ".gitignore",
    "chars": 147,
    "preview": "target/\npom.xml.tag\npom.xml.releaseBackup\npom.xml.versionsBackup\npom.xml.next\nrelease.properties\ndependency-reduced-pom."
  },
  {
    "path": "Changelog.adoc",
    "chars": 3507,
    "preview": "= Changelog\nSebastian Daschner\n\n// new versions are placed on the top\n\n== v0.18 SNAPSHOT\n\n== v0.17\n- Markdown support\n- "
  },
  {
    "path": "Documentation.adoc",
    "chars": 4038,
    "preview": "= JAX-RS Analyzer\nSebastian Daschner\n\nThe JAX-RS Analyzer generates an overview of all JAX-RS resources in a JavaEE proj"
  },
  {
    "path": "LICENSE",
    "chars": 11316,
    "preview": "Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licens"
  },
  {
    "path": "README.adoc",
    "chars": 1408,
    "preview": "= JAX-RS Analyzer\nSebastian Daschner\n\nGenerates an overview of all JAX-RS resources in a project by bytecode analysis.\n\n"
  },
  {
    "path": "pom.xml",
    "chars": 7233,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/JAXRSAnalyzer.java",
    "chars": 5039,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer;\n\nimport com.sebastian_daschner.jaxrs_analyzer.analysis.ProjectAnalyzer;\ni"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/LogProvider.java",
    "chars": 3096,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/Main.java",
    "chars": 11775,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/JobRegistry.java",
    "chars": 1310,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis;\n\nimport com.sebastian_daschner.jaxrs_analyzer.model.results.Clas"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/ProjectAnalyzer.java",
    "chars": 8635,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/BytecodeAnalyzer.java",
    "chars": 1091,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode;\n\nimport com.sebastian_daschner.jaxrs_analyzer.model.res"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/MethodContentAnalyzer.java",
    "chars": 7054,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/ResourceMethodContentAnalyzer.java",
    "chars": 4283,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/SubResourceLocatorMethodContentAnalyzer.java",
    "chars": 3919,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/InstructionBuilder.java",
    "chars": 11340,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.collection;\n\nimport com.sebastian_daschner.jaxrs_analyze"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/InstructionFinder.java",
    "chars": 3992,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/RelevantInstructionReducer.java",
    "chars": 6559,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/StackSizeSimulator.java",
    "chars": 4300,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/InjectableArgumentMethodSimulator.java",
    "chars": 3246,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/KnownJsonResultMethod.java",
    "chars": 10936,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/KnownResponseResultMethod.java",
    "chars": 24858,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/MethodPool.java",
    "chars": 3641,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/simulation/MethodSimulator.java",
    "chars": 10879,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/ContextClassReader.java",
    "chars": 1064,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;\n\nimport org.objectweb.asm.ClassReader;\n\nimport java.io.I"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSAnnotatedSuperMethodClassVisitor.java",
    "chars": 1254,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;\n\nimport com.sebastian_daschner.jaxrs_analyzer.model.resu"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSAnnotatedSuperMethodVisitor.java",
    "chars": 5395,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;\n\nimport com.sebastian_daschner.jaxrs_analyzer.LogProvide"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSClassVisitor.java",
    "chars": 7082,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;\n\nimport com.sebastian_daschner.jaxrs_analyzer.LogProvide"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSFieldVisitor.java",
    "chars": 2802,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;\n\nimport com.sebastian_daschner.jaxrs_analyzer.analysis.c"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSMethodVisitor.java",
    "chars": 6628,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;\n\nimport com.sebastian_daschner.jaxrs_analyzer.LogProvide"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/ProjectMethodClassVisitor.java",
    "chars": 2532,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;\n\nimport com.sebastian_daschner.jaxrs_analyzer.LogProvide"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/ProjectMethodVisitor.java",
    "chars": 8071,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;\n\nimport com.sebastian_daschner.jaxrs_analyzer.model.Type"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ApplicationPathAnnotationVisitor.java",
    "chars": 557,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;\n\nimport com.sebastian_daschner.jaxrs_analyzer"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ClassAndMethodAnnotationVisitor.java",
    "chars": 1346,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;\n\nimport com.sebastian_daschner.jaxrs_analyzer"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ConsumesAnnotationVisitor.java",
    "chars": 878,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;\n\nimport com.sebastian_daschner.jaxrs_analyzer"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/DefaultValueAnnotationVisitor.java",
    "chars": 654,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;\n\nimport com.sebastian_daschner.jaxrs_analyzer"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ParamAnnotationVisitor.java",
    "chars": 525,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;\n\nimport com.sebastian_daschner.jaxrs_analyzer"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/PathAnnotationVisitor.java",
    "chars": 836,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;\n\nimport com.sebastian_daschner.jaxrs_analyzer"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ProducesAnnotationVisitor.java",
    "chars": 880,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;\n\nimport com.sebastian_daschner.jaxrs_analyzer"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/annotation/ValueAnnotationVisitor.java",
    "chars": 866,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation;\n\nimport org.objectweb.asm.AnnotationVisitor;\n"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/javadoc/JavaDocAnalyzer.java",
    "chars": 4944,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc;\n\nimport com.github.javaparser.JavaParser;\nimport com.git"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/javadoc/JavaDocParserVisitor.java",
    "chars": 8244,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc;\n\nimport com.github.javaparser.ast.NodeList;\nimport com.g"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/javadoc/ResponseCommentExtractor.java",
    "chars": 858,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc;\n\nimport com.sebastian_daschner.jaxrs_analyzer.LogProvide"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/DynamicTypeAnalyzer.java",
    "chars": 5120,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/JavaDocParameterResolver.java",
    "chars": 3618,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.results;\n\nimport com.sebastian_daschner.jaxrs_analyzer.model.java"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/JavaTypeAnalyzer.java",
    "chars": 9974,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/JsonMapper.java",
    "chars": 5945,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/PathNormalizer.java",
    "chars": 4852,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/ResponseTypeNormalizer.java",
    "chars": 2040,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/ResultInterpreter.java",
    "chars": 11006,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/analysis/results/StringParameterResolver.java",
    "chars": 2661,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.results;\n\nimport com.sebastian_daschner.jaxrs_analyzer.model.Type"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/Backend.java",
    "chars": 1352,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/ComparatorUtils.java",
    "chars": 712,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.backend;\n\nimport com.sebastian_daschner.jaxrs_analyzer.model.rest.MethodPa"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/JsonRepresentationAppender.java",
    "chars": 3941,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.backend;\n\nimport static com.sebastian_daschner.jaxrs_analyzer.backend.Comp"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/StringBackend.java",
    "chars": 4789,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.backend;\n\nimport com.sebastian_daschner.jaxrs_analyzer.model.rest.*;\n\nimpo"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/asciidoc/AsciiDocBackend.java",
    "chars": 6271,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.backend.asciidoc;\n\nimport java.util.Optional;\nimport java.util.Set;\nimport"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/markdown/MarkdownBackend.java",
    "chars": 6254,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.backend.markdown;\n\nimport java.util.Optional;\nimport java.util.Set;\nimport"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/plaintext/PlainTextBackend.java",
    "chars": 6521,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/DefinitionNameBuilder.java",
    "chars": 2048,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.backend.swagger;\n\nimport com.sebastian_daschner.jaxrs_analyzer.model.rest."
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/SchemaBuilder.java",
    "chars": 7931,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/SwaggerBackend.java",
    "chars": 11478,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/SwaggerOptions.java",
    "chars": 4628,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.backend.swagger;\n\nimport com.sebastian_daschner.jaxrs_analyzer.LogProvider"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/backend/swagger/SwaggerScheme.java",
    "chars": 190,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.backend.swagger;\n\n/**\n * The Swagger transfer protocols.\n *\n * @author Seb"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/JavaUtils.java",
    "chars": 22486,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/Types.java",
    "chars": 7463,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.model;\n\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.uti"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/Element.java",
    "chars": 2837,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/HttpResponse.java",
    "chars": 2708,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/JsonArray.java",
    "chars": 1665,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/JsonObject.java",
    "chars": 1678,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/JsonValue.java",
    "chars": 1021,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/elements/MethodHandle.java",
    "chars": 4652,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/DefaultInstruction.java",
    "chars": 2271,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/DupInstruction.java",
    "chars": 1423,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/ExceptionHandlerInstruction.java",
    "chars": 1201,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/GetFieldInstruction.java",
    "chars": 1261,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/GetPropertyInstruction.java",
    "chars": 3091,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/GetStaticInstruction.java",
    "chars": 1406,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/Instruction.java",
    "chars": 1395,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/InvokeDynamicInstruction.java",
    "chars": 2423,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/InvokeInstruction.java",
    "chars": 2201,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/LoadInstruction.java",
    "chars": 1967,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/LoadStoreInstruction.java",
    "chars": 3249,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/LoadStoreInstructionPlaceholder.java",
    "chars": 1416,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.model.instructions;\n\nimport org.objectweb.asm.Label;\n\n/**\n * @author Sebas"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/NewInstruction.java",
    "chars": 1867,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/PushInstruction.java",
    "chars": 2279,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/ReturnInstruction.java",
    "chars": 1440,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/SizeChangingInstruction.java",
    "chars": 1820,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/StoreInstruction.java",
    "chars": 1389,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/instructions/ThrowInstruction.java",
    "chars": 1433,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/javadoc/ClassComment.java",
    "chars": 621,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.model.javadoc;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimpo"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/javadoc/MemberComment.java",
    "chars": 771,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.model.javadoc;\n\nimport java.util.Collections;\nimport java.util.Map;\n\npubli"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/javadoc/MemberParameterTag.java",
    "chars": 954,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.model.javadoc;\n\nimport java.util.Collections;\nimport java.util.Map;\n\n/**\n "
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/javadoc/MethodComment.java",
    "chars": 987,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.model.javadoc;\n\nimport java.util.Collections;\nimport java.util.List;\nimpor"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/methods/IdentifiableMethod.java",
    "chars": 1135,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/methods/Method.java",
    "chars": 1380,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/methods/MethodIdentifier.java",
    "chars": 6666,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/methods/ProjectMethod.java",
    "chars": 1831,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/HttpMethod.java",
    "chars": 847,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/MethodParameter.java",
    "chars": 3204,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.model.rest;\n\n/**\n * Represents a single resource method parameter (like qu"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/ParameterType.java",
    "chars": 266,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.model.rest;\n\n/**\n * The available parameter types. Needed for identificati"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/Project.java",
    "chars": 787,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.model.rest;\n\nimport com.sebastian_daschner.jaxrs_analyzer.utils.StringUtil"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/ResourceMethod.java",
    "chars": 6583,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/Resources.java",
    "chars": 4226,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/Response.java",
    "chars": 2398,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/TypeIdentifier.java",
    "chars": 2921,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.model.rest;\n\nimport com.sebastian_daschner.jaxrs_analyzer.model.Types;\n\nim"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/TypeRepresentation.java",
    "chars": 9014,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/rest/TypeRepresentationVisitor.java",
    "chars": 534,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.model.rest;\n\n/**\n * Visitor for the {@link TypeRepresentation} implementat"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/results/ClassResult.java",
    "chars": 4850,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/model/results/MethodResult.java",
    "chars": 6789,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/utils/DebugUtils.java",
    "chars": 2526,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.utils;\n\nimport java.util.Map;\nimport java.util.TreeMap;\nimport java.util.s"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/utils/Pair.java",
    "chars": 2333,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/java/com/sebastian_daschner/jaxrs_analyzer/utils/StringUtils.java",
    "chars": 1731,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/main/resources/META-INF/services/com.sebastian_daschner.jaxrs_analyzer.backend.Backend",
    "chars": 284,
    "preview": "com.sebastian_daschner.jaxrs_analyzer.backend.markdown.MarkdownBackend\ncom.sebastian_daschner.jaxrs_analyzer.backend.asc"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/MainTest.java",
    "chars": 1921,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer;\n\nimport com.sebastian_daschner.jaxrs_analyzer.backend.Backend;\nimport com"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/ProjectAnalyzerTest.java",
    "chars": 21447,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/SubResourceLocatorMethodContentAnalyzerTest.java",
    "chars": 5119,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode;\n\nimport com.sebastian_daschner.jaxrs_analyzer.analysis."
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/ByteCodeCollectorTest.java",
    "chars": 3772,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass1.java",
    "chars": 1894,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass2.java",
    "chars": 2079,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass3.java",
    "chars": 2223,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass4.java",
    "chars": 2786,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass5.java",
    "chars": 2460,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass6.java",
    "chars": 1504,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass7.java",
    "chars": 3549,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass8.java",
    "chars": 1682,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/collection/testclasses/TestClass9.java",
    "chars": 2124,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/RelevantInstructionReducerTest.java",
    "chars": 4742,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass1.java",
    "chars": 1037,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass10.java",
    "chars": 1299,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass2.java",
    "chars": 1251,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass3.java",
    "chars": 1273,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass4.java",
    "chars": 1268,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass5.java",
    "chars": 1150,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass6.java",
    "chars": 2874,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass7.java",
    "chars": 1283,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass8.java",
    "chars": 1283,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/reduction/testclasses/TestClass9.java",
    "chars": 1420,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/subresource/TestClass1.java",
    "chars": 559,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.subresource;\n\nimport javax.ws.rs.container.ResourceConte"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/subresource/TestClass2.java",
    "chars": 555,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.subresource;\n\nimport javax.ws.rs.container.ResourceConte"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/subresource/TestClass3.java",
    "chars": 646,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.subresource;\n\nimport javax.ws.rs.container.ResourceConte"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/subresource/TestClass4.java",
    "chars": 548,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.subresource;\n\nimport javax.ws.rs.container.ResourceConte"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/bytecode/subresource/TestClass5.java",
    "chars": 1032,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.bytecode.subresource;\n\nimport javax.ws.rs.container.ResourceConte"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/JAXRSMethodVisitorTest.java",
    "chars": 1937,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes;\n\nimport com.sebastian_daschner.jaxrs_analyzer.model.inst"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/ResourceMethodContentAnalyzerTest.java",
    "chars": 4816,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass1.java",
    "chars": 1809,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass10.java",
    "chars": 1998,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass2.java",
    "chars": 2157,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass3.java",
    "chars": 2427,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass4.java",
    "chars": 2251,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass5.java",
    "chars": 2277,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass6.java",
    "chars": 4470,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass7.java",
    "chars": 2149,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass8.java",
    "chars": 2059,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/json/TestClass9.java",
    "chars": 1874,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass1.java",
    "chars": 607,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass10.java",
    "chars": 1894,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass11.java",
    "chars": 788,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass12.java",
    "chars": 737,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass13.java",
    "chars": 982,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass14.java",
    "chars": 1116,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass2.java",
    "chars": 666,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass3.java",
    "chars": 726,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass4.java",
    "chars": 800,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass5.java",
    "chars": 910,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass6.java",
    "chars": 783,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass7.java",
    "chars": 1056,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass8.java",
    "chars": 1139,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/object/TestClass9.java",
    "chars": 472,
    "preview": "package com.sebastian_daschner.jaxrs_analyzer.analysis.classes.testclasses.resource.object;\n\nimport com.sebastian_daschn"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass1.java",
    "chars": 1497,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass10.java",
    "chars": 1242,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass11.java",
    "chars": 1677,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass12.java",
    "chars": 1432,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass13.java",
    "chars": 1434,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass14.java",
    "chars": 1682,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass15.java",
    "chars": 1802,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass16.java",
    "chars": 1549,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass17.java",
    "chars": 1619,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass18.java",
    "chars": 1768,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass19.java",
    "chars": 3479,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass2.java",
    "chars": 1369,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass20.java",
    "chars": 2125,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass21.java",
    "chars": 2301,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass22.java",
    "chars": 2589,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass23.java",
    "chars": 2073,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass24.java",
    "chars": 1753,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass25.java",
    "chars": 1513,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass26.java",
    "chars": 1588,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass27.java",
    "chars": 1923,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass28.java",
    "chars": 1596,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass29.java",
    "chars": 1658,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass3.java",
    "chars": 1479,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass30.java",
    "chars": 1758,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass31.java",
    "chars": 2538,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass32.java",
    "chars": 1461,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass33.java",
    "chars": 1749,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass34.java",
    "chars": 1539,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass35.java",
    "chars": 1500,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass36.java",
    "chars": 1630,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass37.java",
    "chars": 2525,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "src/test/java/com/sebastian_daschner/jaxrs_analyzer/analysis/classes/testclasses/resource/response/TestClass38.java",
    "chars": 2458,
    "preview": "/*\n * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com\n *\n * Licensed under the Apache License, Version 2.0"
  }
]

// ... and 117 more files (download for full content)

About this extraction

This page contains the full source code of the sdaschner/jaxrs-analyzer GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 317 files (972.9 KB), approximately 224.6k tokens, and a symbol index with 1901 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!