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 & 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
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
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.