{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://stella-ops.org/schemas/java-entrypoint-resolver.schema.json", "title": "StellaOps Java Entrypoint Resolver Schema", "description": "Schema for Java-specific entrypoint resolution, bytecode analysis, reflection handling, and framework patterns. Unblocks Java Analyzer tasks 21-005 through 21-011 (7 tasks).", "type": "object", "definitions": { "JavaEntrypointConfig": { "type": "object", "description": "Java-specific entrypoint resolution configuration", "required": ["config_id", "java_version_range"], "properties": { "config_id": { "type": "string" }, "java_version_range": { "type": "string", "description": "Supported Java version range (e.g., >=8, 11-17, 21+)" }, "version": { "type": "string" }, "bytecode_analysis": { "$ref": "#/definitions/BytecodeAnalysisConfig" }, "reflection_handling": { "$ref": "#/definitions/ReflectionHandlingConfig" }, "framework_resolvers": { "type": "array", "items": { "$ref": "#/definitions/FrameworkResolver" } }, "annotation_processors": { "type": "array", "items": { "$ref": "#/definitions/AnnotationProcessor" } }, "class_hierarchy_rules": { "type": "array", "items": { "$ref": "#/definitions/ClassHierarchyRule" } }, "interface_implementation_rules": { "type": "array", "items": { "$ref": "#/definitions/InterfaceImplementationRule" } }, "lambda_resolution": { "$ref": "#/definitions/LambdaResolutionConfig" }, "method_reference_resolution": { "$ref": "#/definitions/MethodReferenceConfig" }, "build_tool_integration": { "$ref": "#/definitions/BuildToolIntegration" } } }, "BytecodeAnalysisConfig": { "type": "object", "description": "Configuration for bytecode-level analysis", "properties": { "enabled": { "type": "boolean", "default": true }, "class_file_version_min": { "type": "integer", "description": "Minimum class file version (52 = Java 8)", "default": 52 }, "class_file_version_max": { "type": "integer", "description": "Maximum class file version (65 = Java 21)", "default": 65 }, "analyze_invoke_dynamic": { "type": "boolean", "default": true, "description": "Analyze invokedynamic for lambdas and method refs" }, "analyze_method_handles": { "type": "boolean", "default": true }, "analyze_constant_pool": { "type": "boolean", "default": true }, "stack_frame_analysis": { "type": "boolean", "default": false, "description": "Perform stack frame analysis for data flow" }, "instruction_patterns": { "type": "array", "items": { "$ref": "#/definitions/InstructionPattern" } }, "max_method_size": { "type": "integer", "default": 65535, "description": "Max bytecode bytes per method to analyze" } } }, "InstructionPattern": { "type": "object", "description": "Bytecode instruction pattern for entry detection", "required": ["pattern_id", "opcodes"], "properties": { "pattern_id": { "type": "string" }, "opcodes": { "type": "array", "items": { "type": "string", "enum": ["INVOKEVIRTUAL", "INVOKEINTERFACE", "INVOKESPECIAL", "INVOKESTATIC", "INVOKEDYNAMIC", "GETSTATIC", "PUTSTATIC", "GETFIELD", "PUTFIELD", "NEW", "ANEWARRAY", "CHECKCAST", "INSTANCEOF", "LDC", "LDC_W", "LDC2_W"] } }, "operand_pattern": { "type": "string", "description": "Regex pattern for operand (class/method reference)" }, "entry_type": { "type": "string", "enum": ["main_method", "servlet_init", "servlet_service", "ejb_lifecycle", "jni_entry", "test_entry", "annotation_driven"] }, "confidence": { "type": "number", "minimum": 0, "maximum": 1 } } }, "ReflectionHandlingConfig": { "type": "object", "description": "Configuration for handling reflection-based invocations", "properties": { "enabled": { "type": "boolean", "default": true }, "confidence_penalty": { "type": "number", "default": 0.3, "description": "Confidence reduction for reflection-based paths" }, "track_class_forname": { "type": "boolean", "default": true }, "track_method_invoke": { "type": "boolean", "default": true }, "track_constructor_newinstance": { "type": "boolean", "default": true }, "track_proxy_creation": { "type": "boolean", "default": true }, "string_constant_resolution": { "type": "boolean", "default": true, "description": "Resolve string constants passed to Class.forName" }, "known_reflection_patterns": { "type": "array", "items": { "$ref": "#/definitions/ReflectionPattern" } }, "reflection_config_files": { "type": "array", "items": { "type": "string" }, "description": "GraalVM/Quarkus reflection config file paths" } } }, "ReflectionPattern": { "type": "object", "description": "Known reflection usage pattern", "required": ["pattern_id", "class_pattern", "method_pattern"], "properties": { "pattern_id": { "type": "string" }, "class_pattern": { "type": "string", "description": "Regex for target class" }, "method_pattern": { "type": "string", "description": "Regex for target method" }, "resolution_strategy": { "type": "string", "enum": ["string_constant", "config_file", "annotation_hint", "heuristic"] }, "entry_type_hint": { "type": "string" } } }, "FrameworkResolver": { "type": "object", "description": "Framework-specific entrypoint resolver", "required": ["framework_id", "name", "detection_strategy"], "properties": { "framework_id": { "type": "string" }, "name": { "type": "string" }, "version_range": { "type": "string" }, "detection_strategy": { "$ref": "#/definitions/FrameworkDetection" }, "entrypoint_rules": { "type": "array", "items": { "$ref": "#/definitions/FrameworkEntrypointRule" } }, "lifecycle_callbacks": { "type": "array", "items": { "$ref": "#/definitions/LifecycleCallback" } }, "dependency_injection": { "$ref": "#/definitions/DependencyInjectionConfig" }, "aop_support": { "$ref": "#/definitions/AopConfig" } } }, "FrameworkDetection": { "type": "object", "description": "How to detect framework presence", "properties": { "marker_classes": { "type": "array", "items": { "type": "string" }, "description": "Classes that indicate framework presence" }, "marker_annotations": { "type": "array", "items": { "type": "string" } }, "pom_dependencies": { "type": "array", "items": { "type": "string" }, "description": "Maven coordinates (groupId:artifactId)" }, "gradle_dependencies": { "type": "array", "items": { "type": "string" } }, "config_files": { "type": "array", "items": { "type": "string" }, "description": "Config files indicating framework (e.g., application.properties)" } } }, "FrameworkEntrypointRule": { "type": "object", "description": "Rule for detecting framework-specific entrypoints", "required": ["rule_id", "type"], "properties": { "rule_id": { "type": "string" }, "type": { "type": "string", "enum": ["annotation", "interface", "superclass", "method_name", "xml_config", "properties_config"] }, "annotation_fqcn": { "type": "string", "description": "Fully qualified annotation class name" }, "annotation_attributes": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Required annotation attributes" }, "interface_fqcn": { "type": "string" }, "superclass_fqcn": { "type": "string" }, "method_signature_pattern": { "type": "string" }, "xml_xpath": { "type": "string", "description": "XPath for XML-configured entries" }, "entry_type": { "type": "string", "enum": ["http_endpoint", "grpc_method", "message_consumer", "scheduled_job", "event_handler", "ejb_method", "servlet_method", "jax_rs_resource", "graphql_resolver", "websocket_handler"] }, "metadata_extraction": { "$ref": "#/definitions/JavaMetadataExtraction" }, "confidence": { "type": "number", "minimum": 0, "maximum": 1 } } }, "JavaMetadataExtraction": { "type": "object", "description": "Rules for extracting metadata from Java entrypoints", "properties": { "http_method_from": { "type": "string", "description": "Expression to extract HTTP method" }, "path_from": { "type": "string", "description": "Expression to extract path" }, "consumes_from": { "type": "string" }, "produces_from": { "type": "string" }, "security_annotation": { "type": "string" }, "role_annotation": { "type": "string" }, "transaction_annotation": { "type": "string" } } }, "LifecycleCallback": { "type": "object", "description": "Framework lifecycle callback as potential entrypoint", "required": ["callback_id", "type"], "properties": { "callback_id": { "type": "string" }, "type": { "type": "string", "enum": ["post_construct", "pre_destroy", "init", "destroy", "startup", "shutdown", "context_initialized", "context_destroyed"] }, "annotation_fqcn": { "type": "string" }, "interface_method": { "type": "string" }, "execution_phase": { "type": "string", "enum": ["startup", "runtime", "shutdown"] }, "confidence": { "type": "number", "minimum": 0, "maximum": 1 } } }, "DependencyInjectionConfig": { "type": "object", "description": "Dependency injection analysis configuration", "properties": { "enabled": { "type": "boolean", "default": true }, "inject_annotations": { "type": "array", "items": { "type": "string" }, "default": ["javax.inject.Inject", "jakarta.inject.Inject", "org.springframework.beans.factory.annotation.Autowired", "com.google.inject.Inject"] }, "qualifier_annotations": { "type": "array", "items": { "type": "string" } }, "scope_annotations": { "type": "array", "items": { "type": "string" } }, "track_bean_creation": { "type": "boolean", "default": true } } }, "AopConfig": { "type": "object", "description": "Aspect-Oriented Programming support", "properties": { "enabled": { "type": "boolean", "default": true }, "aspect_annotations": { "type": "array", "items": { "type": "string" }, "default": ["org.aspectj.lang.annotation.Aspect"] }, "pointcut_annotations": { "type": "array", "items": { "type": "string" }, "default": ["org.aspectj.lang.annotation.Before", "org.aspectj.lang.annotation.After", "org.aspectj.lang.annotation.Around"] }, "track_interceptors": { "type": "boolean", "default": true } } }, "AnnotationProcessor": { "type": "object", "description": "Annotation-based entrypoint processor", "required": ["processor_id", "annotation_fqcn"], "properties": { "processor_id": { "type": "string" }, "annotation_fqcn": { "type": "string", "description": "Fully qualified class name of annotation" }, "target_types": { "type": "array", "items": { "type": "string", "enum": ["TYPE", "METHOD", "FIELD", "PARAMETER", "CONSTRUCTOR", "LOCAL_VARIABLE", "ANNOTATION_TYPE", "PACKAGE", "TYPE_PARAMETER", "TYPE_USE"] } }, "required_attributes": { "type": "array", "items": { "type": "string" } }, "entry_type": { "type": "string" }, "metadata_mapping": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Maps annotation attributes to metadata fields" }, "confidence": { "type": "number", "minimum": 0, "maximum": 1 } } }, "ClassHierarchyRule": { "type": "object", "description": "Rule based on class hierarchy (extends)", "required": ["rule_id", "superclass_fqcn"], "properties": { "rule_id": { "type": "string" }, "superclass_fqcn": { "type": "string" }, "entry_methods": { "type": "array", "items": { "type": "string" }, "description": "Method signatures that are entrypoints" }, "entry_type": { "type": "string" }, "include_indirect": { "type": "boolean", "default": true, "description": "Include indirect subclasses" }, "confidence": { "type": "number", "minimum": 0, "maximum": 1 } } }, "InterfaceImplementationRule": { "type": "object", "description": "Rule based on interface implementation", "required": ["rule_id", "interface_fqcn"], "properties": { "rule_id": { "type": "string" }, "interface_fqcn": { "type": "string" }, "entry_methods": { "type": "array", "items": { "type": "string" } }, "entry_type": { "type": "string" }, "confidence": { "type": "number", "minimum": 0, "maximum": 1 } } }, "LambdaResolutionConfig": { "type": "object", "description": "Configuration for resolving lambda expressions", "properties": { "enabled": { "type": "boolean", "default": true }, "track_functional_interfaces": { "type": "boolean", "default": true }, "known_functional_interfaces": { "type": "array", "items": { "type": "string" }, "default": [ "java.lang.Runnable", "java.util.concurrent.Callable", "java.util.function.Consumer", "java.util.function.Supplier", "java.util.function.Function", "java.util.function.Predicate", "java.util.function.BiConsumer", "java.util.function.BiFunction" ] }, "track_lambda_capture": { "type": "boolean", "default": true, "description": "Track captured variables in lambdas" }, "confidence_for_lambda": { "type": "number", "default": 0.8 } } }, "MethodReferenceConfig": { "type": "object", "description": "Configuration for resolving method references", "properties": { "enabled": { "type": "boolean", "default": true }, "reference_types": { "type": "array", "items": { "type": "string", "enum": ["STATIC", "BOUND", "UNBOUND", "CONSTRUCTOR"] }, "default": ["STATIC", "BOUND", "UNBOUND", "CONSTRUCTOR"] }, "confidence_for_reference": { "type": "number", "default": 0.9 } } }, "BuildToolIntegration": { "type": "object", "description": "Build tool integration for classpath resolution", "properties": { "maven": { "$ref": "#/definitions/MavenConfig" }, "gradle": { "$ref": "#/definitions/GradleConfig" }, "ant": { "$ref": "#/definitions/AntConfig" } } }, "MavenConfig": { "type": "object", "properties": { "enabled": { "type": "boolean", "default": true }, "resolve_dependencies": { "type": "boolean", "default": true }, "include_test_scope": { "type": "boolean", "default": false }, "profiles_to_activate": { "type": "array", "items": { "type": "string" } }, "settings_xml_path": { "type": "string" }, "local_repo_path": { "type": "string" } } }, "GradleConfig": { "type": "object", "properties": { "enabled": { "type": "boolean", "default": true }, "resolve_dependencies": { "type": "boolean", "default": true }, "configurations": { "type": "array", "items": { "type": "string" }, "default": ["compileClasspath", "runtimeClasspath"] }, "init_script_path": { "type": "string" } } }, "AntConfig": { "type": "object", "properties": { "enabled": { "type": "boolean", "default": false }, "build_file_path": { "type": "string", "default": "build.xml" }, "target": { "type": "string" } } }, "ResolvedEntrypoint": { "type": "object", "description": "Resolved Java entrypoint", "required": ["entry_id", "class_fqcn", "method_signature", "entry_type"], "properties": { "entry_id": { "type": "string" }, "class_fqcn": { "type": "string", "description": "Fully qualified class name" }, "method_signature": { "type": "string", "description": "JVM method signature" }, "method_name": { "type": "string" }, "method_descriptor": { "type": "string", "description": "JVM method descriptor (e.g., (Ljava/lang/String;)V)" }, "entry_type": { "type": "string", "enum": ["http_endpoint", "grpc_method", "message_consumer", "scheduled_job", "event_handler", "ejb_method", "servlet_method", "jax_rs_resource", "graphql_resolver", "websocket_handler", "main_method", "junit_test", "testng_test", "cli_command"] }, "source_location": { "$ref": "#/definitions/JavaSourceLocation" }, "bytecode_location": { "$ref": "#/definitions/BytecodeLocation" }, "confidence": { "type": "number", "minimum": 0, "maximum": 1 }, "resolution_path": { "type": "array", "items": { "type": "string" }, "description": "Chain of rules that resolved this entrypoint" }, "framework": { "type": "string" }, "http_metadata": { "$ref": "#/definitions/JavaHttpMetadata" }, "parameters": { "type": "array", "items": { "$ref": "#/definitions/JavaParameter" } }, "return_type": { "type": "string" }, "throws_types": { "type": "array", "items": { "type": "string" } }, "annotations": { "type": "array", "items": { "$ref": "#/definitions/JavaAnnotation" } }, "modifiers": { "type": "array", "items": { "type": "string", "enum": ["PUBLIC", "PRIVATE", "PROTECTED", "STATIC", "FINAL", "SYNCHRONIZED", "NATIVE", "ABSTRACT", "STRICTFP"] } }, "symbol_id": { "type": "string", "pattern": "^sym:java:[A-Za-z0-9_-]+$", "description": "RichGraph SymbolID" }, "taint_sources": { "type": "array", "items": { "$ref": "#/definitions/TaintSource" } } } }, "JavaSourceLocation": { "type": "object", "description": "Source code location", "properties": { "file_path": { "type": "string" }, "line_start": { "type": "integer" }, "line_end": { "type": "integer" }, "column_start": { "type": "integer" }, "column_end": { "type": "integer" }, "source_root": { "type": "string" } } }, "BytecodeLocation": { "type": "object", "description": "Bytecode location", "properties": { "jar_path": { "type": "string" }, "class_file_path": { "type": "string" }, "method_index": { "type": "integer" }, "bytecode_offset": { "type": "integer" }, "class_file_version": { "type": "integer" } } }, "JavaHttpMetadata": { "type": "object", "description": "HTTP endpoint metadata for Java", "properties": { "method": { "type": "string", "enum": ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS", "TRACE"] }, "path": { "type": "string" }, "path_variables": { "type": "array", "items": { "type": "string" } }, "request_params": { "type": "array", "items": { "type": "string" } }, "headers": { "type": "array", "items": { "type": "string" } }, "consumes": { "type": "array", "items": { "type": "string" } }, "produces": { "type": "array", "items": { "type": "string" } }, "security_constraints": { "$ref": "#/definitions/SecurityConstraints" } } }, "SecurityConstraints": { "type": "object", "properties": { "authentication_required": { "type": "boolean" }, "roles_allowed": { "type": "array", "items": { "type": "string" } }, "security_annotation": { "type": "string" }, "csrf_protection": { "type": "boolean" } } }, "JavaParameter": { "type": "object", "description": "Method parameter", "properties": { "name": { "type": "string" }, "type_fqcn": { "type": "string" }, "type_descriptor": { "type": "string" }, "generic_type": { "type": "string" }, "index": { "type": "integer" }, "source": { "type": "string", "enum": ["path", "query", "header", "body", "form", "cookie", "matrix", "bean"] }, "required": { "type": "boolean" }, "default_value": { "type": "string" }, "validation_annotations": { "type": "array", "items": { "type": "string" } }, "is_taint_source": { "type": "boolean", "description": "Whether this parameter is a potential taint source" } } }, "JavaAnnotation": { "type": "object", "description": "Annotation on entrypoint", "properties": { "fqcn": { "type": "string" }, "attributes": { "type": "object", "additionalProperties": true }, "retention": { "type": "string", "enum": ["SOURCE", "CLASS", "RUNTIME"] } } }, "TaintSource": { "type": "object", "description": "Taint source information", "properties": { "parameter_index": { "type": "integer" }, "parameter_name": { "type": "string" }, "taint_type": { "type": "string", "enum": ["user_input", "file_input", "network_input", "database_input", "environment"] }, "sanitization_required": { "type": "array", "items": { "type": "string" } } } }, "JavaEntrypointReport": { "type": "object", "description": "Java entrypoint resolution report", "required": ["report_id", "scan_id", "entrypoints"], "properties": { "report_id": { "type": "string", "format": "uuid" }, "scan_id": { "type": "string" }, "generated_at": { "type": "string", "format": "date-time" }, "config_used": { "type": "string" }, "java_version_detected": { "type": "string" }, "entrypoints": { "type": "array", "items": { "$ref": "#/definitions/ResolvedEntrypoint" } }, "frameworks_detected": { "type": "array", "items": { "$ref": "#/definitions/DetectedFramework" } }, "statistics": { "$ref": "#/definitions/JavaEntrypointStatistics" }, "build_info": { "$ref": "#/definitions/BuildInfo" }, "analysis_warnings": { "type": "array", "items": { "type": "string" } }, "analysis_duration_ms": { "type": "integer" }, "digest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" } } }, "DetectedFramework": { "type": "object", "properties": { "framework_id": { "type": "string" }, "name": { "type": "string" }, "version": { "type": "string" }, "detection_confidence": { "type": "number", "minimum": 0, "maximum": 1 }, "detection_evidence": { "type": "array", "items": { "type": "string" } } } }, "JavaEntrypointStatistics": { "type": "object", "properties": { "total_entrypoints": { "type": "integer" }, "by_type": { "type": "object", "additionalProperties": { "type": "integer" } }, "by_framework": { "type": "object", "additionalProperties": { "type": "integer" } }, "by_confidence": { "type": "object", "properties": { "high": { "type": "integer" }, "medium": { "type": "integer" }, "low": { "type": "integer" } } }, "classes_analyzed": { "type": "integer" }, "methods_analyzed": { "type": "integer" }, "reflection_usages": { "type": "integer" }, "lambda_expressions": { "type": "integer" }, "taint_sources_identified": { "type": "integer" } } }, "BuildInfo": { "type": "object", "properties": { "build_tool": { "type": "string", "enum": ["maven", "gradle", "ant", "unknown"] }, "java_source_version": { "type": "string" }, "java_target_version": { "type": "string" }, "modules_detected": { "type": "array", "items": { "type": "string" } }, "dependencies_count": { "type": "integer" } } } }, "properties": { "configs": { "type": "array", "items": { "$ref": "#/definitions/JavaEntrypointConfig" } }, "reports": { "type": "array", "items": { "$ref": "#/definitions/JavaEntrypointReport" } } }, "examples": [ { "configs": [ { "config_id": "java-spring-resolver", "java_version_range": ">=11", "version": "1.0.0", "bytecode_analysis": { "enabled": true, "class_file_version_min": 55, "class_file_version_max": 65, "analyze_invoke_dynamic": true, "analyze_method_handles": true, "analyze_constant_pool": true, "stack_frame_analysis": false, "max_method_size": 65535 }, "reflection_handling": { "enabled": true, "confidence_penalty": 0.3, "track_class_forname": true, "track_method_invoke": true, "track_constructor_newinstance": true, "track_proxy_creation": true, "string_constant_resolution": true }, "framework_resolvers": [ { "framework_id": "spring-boot", "name": "Spring Boot", "version_range": ">=2.0.0", "detection_strategy": { "marker_classes": ["org.springframework.boot.SpringApplication"], "marker_annotations": ["org.springframework.boot.autoconfigure.SpringBootApplication"], "pom_dependencies": ["org.springframework.boot:spring-boot-starter"] }, "entrypoint_rules": [ { "rule_id": "spring-get-mapping", "type": "annotation", "annotation_fqcn": "org.springframework.web.bind.annotation.GetMapping", "entry_type": "http_endpoint", "metadata_extraction": { "http_method_from": "GET", "path_from": "value || path" }, "confidence": 0.98 }, { "rule_id": "spring-post-mapping", "type": "annotation", "annotation_fqcn": "org.springframework.web.bind.annotation.PostMapping", "entry_type": "http_endpoint", "metadata_extraction": { "http_method_from": "POST", "path_from": "value || path" }, "confidence": 0.98 }, { "rule_id": "spring-scheduled", "type": "annotation", "annotation_fqcn": "org.springframework.scheduling.annotation.Scheduled", "entry_type": "scheduled_job", "confidence": 0.95 } ], "lifecycle_callbacks": [ { "callback_id": "spring-post-construct", "type": "post_construct", "annotation_fqcn": "javax.annotation.PostConstruct", "execution_phase": "startup", "confidence": 0.85 } ], "dependency_injection": { "enabled": true, "inject_annotations": ["org.springframework.beans.factory.annotation.Autowired", "javax.inject.Inject"], "track_bean_creation": true }, "aop_support": { "enabled": true, "track_interceptors": true } } ], "lambda_resolution": { "enabled": true, "track_functional_interfaces": true, "track_lambda_capture": true, "confidence_for_lambda": 0.8 }, "method_reference_resolution": { "enabled": true, "reference_types": ["STATIC", "BOUND", "UNBOUND", "CONSTRUCTOR"], "confidence_for_reference": 0.9 }, "build_tool_integration": { "maven": { "enabled": true, "resolve_dependencies": true, "include_test_scope": false }, "gradle": { "enabled": true, "resolve_dependencies": true, "configurations": ["compileClasspath", "runtimeClasspath"] } } } ] } ] }