Tomcat TODO & FIXME Report

Generated: 2026-05-09 Total items documented: ~120 (after deduplication of repetitive patterns)


Table of Contents


CRITICAL FIXMEs

These are bugs, correctness issues, or missing functionality that may affect production behavior.

1. DeltaManager Session Replication Issues (7 items)

#File:LineDescriptionFix IdeaEffortDifficulty
1.1DeltaManager.java:692Sessions with same ID replaced without notificationFire a sessionReplace notification event before overwriting; update all listeners (SSO, clustering) to handle the replace event2-3 daysHigh
1.2DeltaManager.java:694SSO handling incorrect with session replacementCoordinate with SingleSignOn valve to invalidate/recreate SSO tokens on session replace. Requires cross-component changes.3-5 daysVery High
1.3DeltaManager.java:723No way to inform SSO and other session ID caches of replacementAdd a callback interface (e.g., SessionIdChangeListener) that SSO and other components register with. DeltaManager invokes on replace.3-5 daysHigh
1.4DeltaManager.java:728Existing session should be re-grabbed instead of overwrittenBefore adding the new session, serialize and re-broadcast the existing session to preserve its state, then merge.2-3 daysHigh
1.5DeltaManager.java:842cluster.send() blocks deploy thread when waitForAck is enabledMove the send+wait into a dedicated thread or use async send with a Future/CompletableFuture.1-2 daysMedium
1.6DeltaManager.java:852At sender ack mode, only state transfer is checked; resend is problematicImplement proper resend logic with sequence numbers and timeout-based retry.2-3 daysHigh
1.7DeltaManager.java:863EVT_GET_ALL_SESSIONS events not handled in queued processingRoute EVT_GET_ALL_SESSIONS through the same messageReceived path after state transfer completes.1 dayMedium

Summary: These 7 items are interrelated. The session replication replacement logic is fundamentally incomplete. A holistic redesign of the deserializeSessions and state transfer flow is needed.

Total estimated effort: 14-24 days, Very High difficulty


2. ResolverImpl SSL Rewrite Variables (8 items)

#File:LineDescriptionFix IdeaEffortDifficulty
2.1ResolverImpl.java:153SSL_SESSION_RESUMED - session resumption state not availableExpose session resumption flag from SSLSession via Ssl handler interface. Requires SSLEngine change.2-3 daysHigh
2.2ResolverImpl.java:155SSL_SECURE_RENEG - secure renegotiation not available from SSLHostConfigAdd isSecureRenegotiation() to SSLHostConfig and surface through Ssl interface.1-2 daysMedium
2.3ResolverImpl.java:157SSL_COMPRESS_METHOD - compression method not availableTLS compression is deprecated (RFC 6520). Consider returning empty string or “NONE” and documenting.0.5 dayLow
2.4ResolverImpl.java:159SSL_TLS_SNI - SNI hostname not available from handshakeCapture SNI during handshake in Ssl handler. Already available via SSLEngineResult or custom extension.1 dayMedium
2.5ResolverImpl.java:198SSL_CLIENT_SAN_OTHER_* OID resolution incompleteParse OID from the key string and match against SAN otherName entries in resolveAlternateName.1-2 daysMedium
2.6ResolverImpl.java:200CERT_RFC4523_CEA - CertificateExactAssertion not implementedBuild the CEA string per RFC 4523 from certificate[0] using SHA-1 hash of the cert.1-2 daysMedium
2.7ResolverImpl.java:202SSL_CLIENT_VERIFY - verification state not availableExpose verification result from the Ssl handler. Requires changes to SSL post-handshake processing.1-2 daysMedium
2.8ResolverImpl.java:215SSL_SERVER_SAN_OTHER_* OID resolution incompleteSame as 2.5 but for server certificate SAN entries.1-2 daysMedium

Summary: Most items require plumbing SSL/TLS handshake details through the Ssl interface to make them available for rewrite rules. Item 2.3 can be resolved immediately by returning “NONE”.

Total estimated effort: 8-14 days, Medium difficulty


3. RewriteValve Missing Map Types (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
3.1RewriteValve.java:736dbm: rewrite map type not implementedImplement a DbmRewriteMap class using Berkeley DB Java Edition (JE) or SQLite as a backend. Or provide a JDBC-based generic map.3-5 daysHigh
3.2RewriteValve.java:739dbd: / fastdbd: rewrite map types not implementedImplement DbdRewriteMap using Apache DBCP to connect to a database and look up rewrite values. Requires config for DSN, user, password, query.3-5 daysHigh

Summary: These are Apache HTTPD compatibility features. The codebase already has a RewriteMap interface; implementations just need to be built.

Total estimated effort: 6-10 days, High difficulty


4. ChannelCoordinator Synchronization Issue (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
4.1ChannelCoordinator.java:163Race condition: receiver started but local member not yet availableAdd a synchronization barrier or callback between clusterReceiver.start() and getLocalMember(false). Use a CountDownLatch or wait for the receiver's ready signal.1-2 daysHigh

Summary: This is a concurrency bug that could cause null member references during cluster startup.

Total estimated effort: 1-2 days, High difficulty


5. PersistentManagerBase LRU Algorithm (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
5.1PersistentManagerBase.java:804Sessions swapped to disk in arbitrary order, not LRUSort sessions by getLastAccessedTime() before selecting which to swap. Swap the least-recently-used sessions first.1 dayLow

Summary: Simple fix. Sort the sessions array by access time before the swap loop.

Total estimated effort: 1 day, Low difficulty


6. DBCP DelegatingStatement Double-Close (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
6.1DelegatingStatement.java:145ResultSets may be closed twice (bug 17301)Track which ResultSets have already been closed by the delegate. Only close traced ResultSets that the delegate did not close.1-2 daysMedium
6.2DelegatingPreparedStatement.java:180Same double-close issue (DBCP-10)Same fix as 6.1, applied to the prepared statement variant.1-2 daysMedium

Summary: Both files have the same issue. A shared fix in the parent delegation logic would address both.

Total estimated effort: 2-4 days, Medium difficulty


7. ManagedBean / BaseModelMBean Issues (3 items)

#File:LineDescriptionFix IdeaEffortDifficulty
7.1BaseModelMBean.java:520removeAttributeChangeNotificationListener removes ALL notifications for a listenerTrack per-attribute listener registrations. Only remove the listener for the specified attribute name.1 dayMedium
7.2ManagedBean.java:606Method signature from opInfo not used for reflection lookupUse the signature from opInfo to locate the method, falling back to the MBean descriptor signature.0.5-1 dayLow
7.3ManagedBean.java:614Methods declared in superinterfaces not found by reflectionWalk the class hierarchy and all implemented interfaces when searching for the method.0.5-1 dayLow

Summary: JMX MBean infrastructure issues. 7.1 is a behavioral bug; 7.2 and 7.3 are limitations.

Total estimated effort: 2-3 days, Low-Medium difficulty


8. PooledConnectionImpl Error Notification (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
8.1PooledConnectionImpl.java:383When pooled connection is reused without closing previous Connection, pool is not notified of errorCall connectionEventListener.connectionErrorOccurred() before throwing the SQLException, so the pool can remove the bad connection.0.5 dayLow

Total estimated effort: 0.5 day, Low difficulty


9. JspRuntimeLibrary RequestDispatcher Issue (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
9.1JspRuntimeLibrary.java:1160Cannot use request.getRequestDispatcher() for relative paths inside includes due to Catalina spec issueRevisit after Servlet spec clarification. If Catalina now handles this correctly, switch to the simpler approach. Otherwise, keep current workaround.0.5-1 dayLow

Summary: This is a spec-compatibility workaround. Low priority unless the spec is clarified.

Total estimated effort: 0.5-1 day, Low difficulty


10. Jasper Generator Tag Handler Validation (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
10.1Generator.java:3890Reserved property names pageContext, bodyContent, parent not filtered during tag handler introspectionAdd a Set<String> of reserved names and skip them in the property descriptor loop.0.5 dayLow

Total estimated effort: 0.5 day, Low difficulty


11. JMX Ant Task Issues (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
11.1JMXAccessorTask.java:565Cannot transfer values from Ant project reference storeSupport Ant refid syntax in the value attribute. Look up referenced project properties during conversion.1-2 daysMedium
11.2JMXAccessorEqualsCondition.java:77URL and host/parameter not validated before JMX accessAdd validation of connection parameters before attempting JMX access. Throw BuildException for invalid config.0.5 dayLow

Total estimated effort: 1.5-2.5 days, Low-Medium difficulty


12. OpenSSL Engine Limitations (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
12.1OpenSSLEngine.java:1304getLocalCertificates() returns empty array - not available in OpenSSL APIUse SSL.getPeerCertificateChain() equivalent for local cert chain, or cache the certificate during handshake initialization.2-3 daysHigh
12.2panama/OpenSSLEngine.java:1617Same limitation in Panama-based OpenSSL engineSame fix as 12.1, applied to the Panama variant.2-3 daysHigh

Summary: Both are API limitations in OpenSSL. May require caching at handshake time.

Total estimated effort: 4-6 days, High difficulty


High-Priority TODOs

13. ThreadPoolExecutor AQS Migration (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
13.1ThreadPoolExecutor.java:466completedTasks not in lock word; should use AbstractQueuedLongSynchronizerRefactor Worker to embed completedTasks into AQS state word for CAS-based updates. Requires careful synchronization redesign.5-7 daysVery High

Summary: This is a deep concurrency optimization that mirrors the JDK ThreadPoolExecutor design.

Total estimated effort: 5-7 days, Very High difficulty


14. AbstractEndpoint AsyncStateMachine (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
14.1AbstractEndpoint.java:101ASYNC_END state should be removed; needs new state in AsyncStateMachineDesign a cleaner state machine that eliminates the need for ASYNC_END. Requires audit of all state transitions.3-5 daysHigh

Total estimated effort: 3-5 days, High difficulty


15. WebSocket Server Close Frame Processing (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
15.1WsRemoteEndpointImplServer.java:106Close frame processing should be non-blockingImplement async close handshake: queue the close frame and let the NIO selector handle the send without holding the socket lock.3-5 daysHigh

Total estimated effort: 3-5 days, High difficulty


16. WebSocket Masking Location (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
16.1WsFrameBase.java:1055Masking should move to sendMessagePart methodMove the masking logic from the current location into sendMessagePart for cleaner separation of concerns.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


17. SocketWrapperBase Write Interest Enforcement (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
17.1SocketWrapperBase.java:511isReadyForWrite() restriction not enforced in registerWriteInterest()Add a state guard in registerWriteInterest() that throws IllegalStateException if called when a pending write callback hasn't fired.1 dayMedium

Total estimated effort: 1 day, Medium difficulty


18. WebSocket POJO Handler Accessibility (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
18.1PojoMessageHandlerBase.java:102setAccessible(true) needed in some cases though method should be accessibleInvestigate the specific cases where accessibility fails. If it's a module/system issue, document and keep. Otherwise remove.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


19. TLS 1.0 Priming Read (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
19.1OpenSSLEngine.java:664TLS 1.0 requires additional priming read - reason unknownInvestigate whether this is a TLS 1.0 protocol quirk or an OpenSSL version-specific bug. If protocol-related, document and keep.1-2 daysMedium

Summary: TLS 1.0 is deprecated. May be safe to remove if TLS 1.0 support is dropped.

Total estimated effort: 1-2 days, Medium difficulty


20. Rfc6265CookieProcessor HTTP/2 Review (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
20.1Rfc6265CookieProcessor.java:95Cookie byte expectation should be reviewed for HTTP/2HTTP/2 headers are HPACK-compressed but decoded to strings. Verify the T_BYTES check is still correct after HPACK decoding.1 dayMedium

Total estimated effort: 1 day, Medium difficulty


21. Cookie Name Validation Per-Context (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
21.1Rfc6265CookieProcessor.java:122Cookie name validation is global, not per-ContextMove validation into the CookieProcessor interface. Allow per-Context configuration of validation strictness. Spec-compliant but breaking.2-3 daysHigh

Total estimated effort: 2-3 days, High difficulty


22. EL ReflectionUtil Refactoring (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
22.1ReflectionUtil.java:455isCoercibleFrom uses try/catch instead of proper type checkingRefactor ELSupport.coerceToType() to expose a non-throwing canCoerce method, or implement type compatibility check without invocation.2-3 daysHigh

Total estimated effort: 2-3 days, High difficulty


23. HTTP/2 HPACK Encoder Optimization (3 items)

#File:LineDescriptionFix IdeaEffortDifficulty
23.1HpackEncoder.java:55Huffman threshold value of 5 is arbitraryBenchmark different threshold values (3, 5, 7, 10) with real-world header data. Choose optimal.1-2 daysMedium
23.2HpackEncoder.java:60Same Huffman threshold for header namesSame benchmarking as 23.1 for header name lengths.1-2 daysMedium
23.3HpackEncoder.java:79HashMap for dynamic table causes allocationsImplement a custom LRU-backed data structure with pre-allocated nodes to reduce GC pressure.2-3 daysHigh

Total estimated effort: 4-7 days, Medium-High difficulty


24. HTTP/2 Constants Tuning (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
24.1Constants.java:311KB default header frame size may not be optimalBenchmark with various frame sizes under different load patterns.1-2 daysMedium
24.2Constants.java:3664-byte ACK frame size may be too largeMeasure actual ACK frame sizes in production. Adjust if consistently smaller.0.5-1 dayLow

Total estimated effort: 1.5-3 days, Low-Medium difficulty


25. HTTP/2 Stream Trailer Refactoring (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
25.1Stream.java:644Copying Map to MimeHeaders may be inefficientInvestigate whether MimeHeaders can accept a Map directly, or if a lighter-weight intermediate structure is viable.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


26. HTTP/1.1 Connection Close Header (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
26.1Http11Processor.java:421Connection: close header set explicitly - may be redundantVerify that the connector already closes the connection in this error path. If so, the header is redundant and can be removed.0.5 dayLow

Total estimated effort: 0.5 day, Low difficulty


27. AjpProcessor Flush Assertion (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
27.1AjpProcessor.java:996Assertion about empty buffers for non-blocking writes not validatedAdd an assert or debug check in flush() to verify buffers are empty. Log warning if not.0.5 dayLow

Total estimated effort: 0.5 day, Low difficulty


28. AbstractProtocol ALPN Handling (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
28.1AbstractProtocol.java:1269OpenSSL 1.0.2 ALPN workaround - replace with proper handshake failure once OpenSSL supports itCheck if minimum supported OpenSSL version now supports ALPN failure. If yes, replace with the commented-out block.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


29. AbstractProcessor Non-Blocking IO Confirmation (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
29.1AbstractProcessor.java:989Unclear if socket queue requirement applies without APRTest with NIO and NIO2 connectors. Document findings. Update comment with confirmed behavior.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


30. WebXml Internationalization Support (20+ items, consolidated)

#File:LineDescriptionFix IdeaEffortDifficulty
30.1WebXml.java:417-591Many ignored elements: description, display-name, icon, init-param/description, security-role-ref/description with language supportAdd LocaleElement wrapper class for i18n elements. Update all affected classes in WebXml to store List<LocaleElement> instead of String. Update parser, serializer, and all consumers.10-15 daysVery High
30.2WebXml.java:1866handler-chains not serialized in web.xmlAdd serialization logic for handler chains in the appendServiceRef method.1-2 daysMedium

Summary: Item 30.1 encompasses ~20 individual TODOs, all related to the same root cause: lack of i18n support in web.xml descriptor elements. They should be fixed together.

Total estimated effort: 11-17 days, Very High difficulty


31. Jasper Compiler Optimizations (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
31.1Compiler.java:219Two-pass parsing for isELIgnored could be optimizedCache directive results from pass 1. Skip re-parsing unchanged includes. Use incremental parsing for modified files.2-3 daysHigh
31.2JspServletWrapper.java:254Potential inefficiency between reload and isOutDated() checkAudit the reload flow. Check if isOutDated() is called redundantly after reload.1 dayMedium

Total estimated effort: 3-4 days, Medium-High difficulty


32. Jasper TLD Validation (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
32.1TagLibraryInfoImpl.java:193Duplicate function name validation should move to parsing stageAdd duplicate name detection in the TLD parser (TaglibXmlParser) before the TagLibraryInfoImpl is constructed.1 dayMedium
32.2TagLibraryInfoImpl.java:231URL resolution logic for TLD resource paths looks incorrectAudit the URI resolution logic against JSP spec section 7.3.6.2. Fix any deviations.1-2 daysMedium

Total estimated effort: 2-3 days, Medium difficulty


33. Jasper Jar URL Resolution (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
33.1JspDocumentParser.java:233jar:jar: URLs from Jar abstraction cannot be resolved by JREImplement a custom EntityResolver that detects jar:jar: URLs and uses JarFactory to construct valid InputSource.2-3 daysHigh

Total estimated effort: 2-3 days, High difficulty


34. EL Function Precedence (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
34.1AstFunction.java:88Lambda expression vs function name precedence unclearDefine explicit precedence rules: lambda arguments > function mapper > bean property. Document in spec.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


35. Jasper Ant Logging (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
35.1JspC.java:1775Uses System.out instead of Ant Project logPass the Ant Project reference through to initServletContext and use Project.log() for output.0.5 dayLow

Total estimated effort: 0.5 day, Low difficulty


36. Jasper JspC ClassLoader / Filter Config (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
36.1JspCServletContext.java:206setScanClassPath(false) requires classloader initializationEnable classpath scanning by initializing classloader earlier in the JspC lifecycle.1-2 daysMedium
36.2JspCServletContext.java:208Filter rules hardcoded from system propertiesAdd Ant task attributes for include/exclude patterns. Pass to StandardJarScanFilter constructor.1-2 daysMedium

Total estimated effort: 2-4 days, Medium difficulty


Medium-Priority TODOs

37. Connection Pool Blocking Queue (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
37.1ConnectionPool.java:88busy queue uses BlockingQueue but blocking is not needed for in-use connectionsReplace BlockingQueue<PooledConnection> busy with ConcurrentHashMap<Key, PooledConnection> for O(1) lookup by connection.2-3 daysMedium

Total estimated effort: 2-3 days, Medium difficulty


38. Connection Pool Statement Facade Optimization (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
38.1ConnectionPool.java:339New facade generated every borrow even if connection returned properlyTrack a cleanReturn flag on pooled connection. Reuse existing facade if flag is set.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


39. Connection Pool Thread Dump Optimization (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
39.1ConnectionPool.java:1273Stores full stack trace string; could store StackTraceElement[] directlyChange getThreadDump() to return StackTraceElement[]. Store array and format on-demand for display. Saves memory.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


40. JDBC Pool JNDI Lookup (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
40.1PooledConnection.java:229JNDI data source lookup not implemented in reconnect pathImplement JNDI lookup in the reconnection logic. Use InitialContext.lookup() with the configured JNDI name.1 dayMedium

Total estimated effort: 1 day, Medium difficulty


41. JDBC Pool Slow Query Eviction (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
41.1SlowQueryReport.java:199ConcurrentHashMap for per-pool stats has no evictionAdd a size limit with LRU eviction (e.g., LinkedHashMap with removeEldestEntry, or a custom bounded concurrent map).1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


42. JDBC Pool JNDI Documentation (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
42.1PoolConfiguration.java:792JNDI string rules not documentedDocument the expected JNDI name format (e.g., java:comp/env/jdbc/MyDS) in the JavaDoc.0.25 dayLow

Total estimated effort: 0.25 day, Low difficulty


43. DBCP Connection String Edge Case (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
43.1DriverAdapterCPDS.java:811toString() may leak credentials if connection string contains user/password paramsRedact user= and password= query parameters in the toString() output.0.5 dayLow

Total estimated effort: 0.5 day, Low difficulty


44. DBCP Pool Object toString Enhancements (3 items)

#File:LineDescriptionFix IdeaEffortDifficulty
44.1DefaultPooledObject.java:330toString() missing attributesAdd allocation time, last use time, borrow count, validation state to toString().0.5 dayLow
44.2PooledSoftReference.java:93Same missing attributesSame fix as 44.1.0.5 dayLow
44.3PooledSoftReference.java:94State display should be encapsulated in parentExtract toString() state formatting into DefaultPooledObject as a protected method.0.5 dayLow

Total estimated effort: 1.5 days, Low difficulty


45. DBCP Pool Config Consolidation (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
45.1BaseObjectPoolConfig.java:303jmxNamePrefix and jmxNameBase could be a single propertyFor DBCP 3.x, merge into jmxName with automatic prefix/suffix handling. Backward-incompatible.1 dayMedium

Total estimated effort: 1 day, Medium difficulty (defer to 3.x)


46. DBCP Java 9+ TimeUnit Conversion (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
46.1PoolImplUtils.java:198Manual TimeUnit to ChronoUnit mappingWhen minimum Java version is 9+, replace with TimeUnit.toChronoUnit().0.25 dayLow

Total estimated effort: 0.25 day, Low difficulty (defer to Java 9+ baseline)


47. DBCP LinkedBlockingDeque Bulk Operations (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
47.1LinkedBlockingDeque.java:1147Bulk operations (addAll, removeAll, etc.) not implemented efficientlyImplement bulk operations with batch lock acquisition. Balance throughput vs. fairness.2-3 daysHigh

Total estimated effort: 2-3 days, High difficulty


48. DBCP Eviction State Handling (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
48.1DefaultPooledObject.java:82Object not allocated when in EVICTION state and borrow attemptedAllocate the object and set state to IN_USE, bypassing the eviction test result.0.5-1 dayLow
48.2PooledObjectState.java:46Same - consider allocating and ignoring eviction testSame as 48.1. These two items are the same fix.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


49. DBCP Eviction Pre-allocation (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
49.1DefaultPooledObject.java:85Pre-allocate for performance when testOnBorrow == trueWhen in eviction test and testOnBorrow is enabled, pre-create the replacement object in parallel with the validation check.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


50. File Upload Delete Failure Tracking (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
50.1FileUploadBase.java:490Failed temp file deletions silently ignoredAdd a List<File> of failed deletions to the progress tracker. Expose via API for caller cleanup.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


51. MultipartStream Skip Failure (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
51.1MultipartStream.java:202When skip() fails to skip expected bytes, no action takenLog a warning at debug level. Consider throwing IOException if the stream is in a corrupt state.0.5 dayLow

Total estimated effort: 0.5 day, Low difficulty


52. DiskFileItem getString Exception (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
52.1DiskFileItem.java:371getString() should consider throwing UnsupportedEncodingExceptionThe charset may be unavailable. Add the checked exception to the signature (API-breaking) or wrap in UncheckedIOException.0.5 dayLow

Total estimated effort: 0.5 day, Low difficulty


53. BCEL Annotation Visibility (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
53.1ElementValue.java:149isRuntimeVisible flag not parsed for annotation element valuesRead the runtime visibility flag from the class file constant pool and store it. Requires AnnotationEntry changes.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


54. WebResource Archive Certificate Loading (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
54.1AbstractArchiveResource.java:265getCertificates() throws IllegalStateException if content not read firstLazy-load certificates from the JAR's Certificate[] on first call to getCertificates().0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


55. WebResource StandardRoot Refactoring (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
55.1StandardRoot.java:392createWebResourceSet() factory methods could be extractedExtract into a WebResourceSetFactory utility class. Reduces StandardRoot complexity.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


56. LoadBalancerDrainingValve SSO Cookies (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
56.1LoadBalancerDrainingValve.java:202Only primary session cookie is cleared; SSO cookies remainDetect and clear SSO cookies (e.g., MEMBER_SESSION) alongside the primary session cookie.1 dayMedium

Total estimated effort: 1 day, Medium difficulty


57. SpnegoAuthenticator GSSContext Statelessness (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
57.1SpnegoAuthenticator.java:257Assumption that GSSContext is stateless needs confirmationReview GSSAPI spec and test with multiple JDK implementations. If stateless, document. If not, add synchronization.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


58. ApplicationHttpRequest Encoding (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
58.1ApplicationHttpRequest.java:861Query string encoding should respect useBodyEncodingForURI and URIEncodingAccess the connector‘s URI encoding settings through the request’s connector reference. Apply correct encoding rules.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


59. ApplicationContext Spec-Breaking Enhancements (3 items)

#File:LineDescriptionFix IdeaEffortDifficulty
59.1ApplicationContext.java:671addFilter state check could be relaxedRemove checkState() call or make it conditional on a context flag. Document the deviation from spec.0.5 dayLow
59.2ApplicationContext.java:784Same for addServletSame approach as 59.1.0.5 dayLow
59.3ApplicationContext.java:1035Same for addListenerSame approach as 59.1.0.5 dayLow

Total estimated effort: 1.5 days, Low difficulty


60. Tomcat Embedding Improvements (4 items)

#File:LineDescriptionFix IdeaEffortDifficulty
60.1Tomcat.java:81Temp dir should be lazily initializedCreate temp dir only when getTempDir() is called or a JSP compilation is triggered.1 dayMedium
60.2Tomcat.java:85Contexts should work without a base dir for fully programmatic appsAllow docBase to be null. Disable default servlet and static resource handling in this mode.2-3 daysHigh
60.3Tomcat.java:192Work dir should be disabled when not neededAdd a setWorkDir(null) or setWorkEnabled(false) option. Skip work dir creation when no JSPs are deployed.1 dayMedium
60.4Tomcat.java:311addContext should support more configuration optionsAdd overloads for common embedded scenarios: virtual hosts, loaders, realms, etc.2-3 daysMedium

Total estimated effort: 6-9 days, Medium difficulty


61. HostConfig Watched Resources Pattern Support (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
61.1HostConfig.java:1268Wildcard patterns for watched resources not supportedAdd pattern matching (e.g., WEB-INF/*.xml). On reload check, only compare timestamps of matching files.2-3 daysMedium

Total estimated effort: 2-3 days, Medium difficulty


62. FarmWarDeployer Improvements (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
62.1FarmWarDeployer.java:225Second deployment attempt timing issue when app is in serviceAdd state checking before second deploy attempt. Wait for app to reach STARTED_PREP state.1-2 daysMedium
62.2FarmWarDeployer.java:470Work directory content not cleaned on removeCall context.clearWorkDir() or recursively delete the work directory during undeploy.0.5-1 dayLow

Total estimated effort: 1.5-3 days, Low-Medium difficulty


Low-Priority / Cosmetic TODOs

63. CGIServlet Feature List (10+ items, consolidated)

#File:LineDescriptionFix IdeaEffortDifficulty
63.1CGIServlet.java:186-199Multiple incomplete features: Location headers, header collapsing, POST+Filters, debug code, encoding, refactoring, stdin handling, IOException, documentation, available() usageThese are long-standing issues in the CGI servlet. Prioritize based on user reports. Header support and POST handling are most impactful.10-20 daysVery High

Summary: The CGI servlet is a best-effort implementation. Each sub-item could be its own ticket.

Total estimated effort: 10-20 days, Very High difficulty


64. Diagnostics Code Quality (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
64.1Diagnostics.java:18Source code line length exceeds limitsRun formatter. Break long lines.0.25 dayLow
64.2Diagnostics.java:19More JavaDoc neededAdd class-level and method-level JavaDoc.0.5 dayLow

Total estimated effort: 0.75 day, Low difficulty


65. MBeanDumper Escape Logic (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
65.1MBeanDumper.java:179String escaping for newlines marked as XXX TODOThe current implementation appears functional. Remove the XXX TODO marker and add a brief comment explaining the logic.0.25 dayLow

Total estimated effort: 0.25 day, Low difficulty


66. Tapestry Session Support (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
66.1SessionUtils.java:113Tapestry 4+ session data patterns not recognizedResearch Tapestry 4+ session key naming conventions. Add matching patterns to the locale detection logic.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


67. StoreConfig Improvements (7 items)

#File:LineDescriptionFix IdeaEffortDifficulty
67.1StoreFileMover.java:32Encoding not obtained from RegistryLook up encoding from Registry at runtime instead of hardcoding.0.5 dayLow
67.2StoreContextAppender.java:176Default context.xml not interpretedParse default context.xml and context.xml.default and apply defaults during instance generation.2-3 daysHigh
67.3StoreContextAppender.java:178Default StandardContext not cachedCache a prototype StandardContext with default configuration for reuse.1 dayMedium
67.4StoreContextAppender.java:180Duplicate element removal is incompleteImplement class-based deduplication for listeners and valves.1-2 daysMedium
67.5StandardEngineSF.java:58Parent realm check may be unnecessaryVerify if Engine.getParent() can ever be non-null. If not, remove the dead code.0.25 dayLow
67.6StandardContextSF.java:234Same parent realm questionSame as 67.5 for Context.0.25 dayLow
67.7StandardContextSF.java:307-313Relative resources, absolute config file, Windows case sensitivity, digester variable substitutionFour separate sub-items. Each requires careful path handling.3-5 daysHigh

Total estimated effort: 8-12 days, Medium-High difficulty


68. Tribes ReplicatedMap Features (3 items)

#File:LineDescriptionFix IdeaEffortDifficulty
68.1ReplicatedMap.java:51Periodic sync/transfer thread not implementedAdd a scheduled task that periodically syncs map entries across cluster members.2-3 daysHigh
68.2ReplicatedMap.java:52memberDisappeared should only change membership, not relocateModify memberDisappeared handler to update membership set without triggering primary object relocation.1-2 daysMedium
68.3LazyReplicatedMap.java:63Same periodic sync missingSame as 68.1 for lazy variant.2-3 daysHigh

Total estimated effort: 5-8 days, Medium-High difficulty


69. Tribes Thread Safety (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
69.1McastServiceImpl.java:558DatagramSocket.send() not thread-safeThe code already uses synchronized (sendLock). Verify the lock covers all send paths. If so, remove the TODO.0.5 dayLow

Total estimated effort: 0.5 day, Low difficulty


70. Tribes ByteBuffer Pooling (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
70.1XByteBuffer.java:87No pooling of byte arrays for performanceImplement a ThreadLocal<byte[]> pool or use a ByteBuffer pool (e.g., XByteBufferPool).2-3 daysMedium

Total estimated effort: 2-3 days, Medium difficulty


71. Tribes UDP Keepalive (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
71.1AbstractSender.java:121UDP connections always disconnected; keepalive not optimizedImplement UDP keepalive by tracking last activity time and only disconnecting after idle timeout.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


72. Tribes NIO Optimization (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
72.1NioSender.java:442Data copied into ByteBuffer instead of wrappedUse ByteBuffer.wrap(data, offset, length) where the data lifetime allows. Profile to verify no lifetime issues.0.5-1 dayLow
72.2NioReplicationTask.java:357Shared DatagramChannel - one per thread may be betterBenchmark single-shared vs. per-thread channel. If per-thread improves throughput, implement thread-local channels.1-2 daysMedium

Total estimated effort: 1.5-3 days, Low-Medium difficulty


73. BaseModelMBean Cleanup (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
73.1BaseModelMBean.java:68Catalina MBeans use weird inheritance; should be cleaned upAudit the MBean class hierarchy. Consolidate common patterns. Remove unnecessary inheritance.3-5 daysHigh
73.2BaseModelMBean.java:135Some logic should be moved to ManagedBeanIdentify the methods that belong in ManagedBean and move them. Update callers.1-2 daysMedium

Total estimated effort: 4-7 days, Medium-High difficulty


74. Jasper JspC Filter Rules (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
74.1JspCServletContext.java:208Filter rules from system properties instead of Ant configAlready covered in item 36.2.----

Documentation TODOs

75. Tribes Documentation (7 files)

#File:LineDescriptionFix IdeaEffortDifficulty
75.1docs/tribes/transport.xml:33Empty TODO placeholderWrite transport layer documentation: NIO vs BIO sender, UDP vs TCP, configuration options.2-3 daysMedium
75.2docs/tribes/status.xml:33Empty TODO placeholderDocument cluster status monitoring: MBeans, statistics, health checks.1-2 daysMedium
75.3docs/tribes/setup.xml:33Empty TODO placeholderWrite cluster setup guide: single-point vs multi-point, load balancer config, session replication.3-5 daysMedium
75.4docs/tribes/membership.xml:33Empty TODO placeholderDocument membership service: multicast, static members, dynamic discovery.1-2 daysMedium
75.5docs/tribes/interceptors.xml:33Empty TODO placeholderDocument all cluster interceptors: fault tolerance, flow control, message dispatch, etc.2-3 daysMedium
75.6docs/tribes/faq.xml:33Empty TODO placeholderCompile common clustering questions and answers from mailing lists and JIRA.2-3 daysMedium
75.7docs/tribes/developers.xml:33Empty TODO placeholderDeveloper guide for extending Tribes: custom channels, interceptors, senders.2-3 daysMedium

Total estimated effort: 13-21 days, Medium difficulty


76. Cluster Interceptor Documentation (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
76.1docs/config/cluster-interceptor.xml:315Not all interceptors documentedDocument each built-in interceptor: TcpFailureDetector, ValveFilter, MessageDispatch15, DeltaRequest, bridge, Noop.2-3 daysMedium

Total estimated effort: 2-3 days, Medium difficulty


77. Docs XSL Subsection Nesting (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
77.1docs/tomcat-docs.xsl:234Nested subsection handling in XSLTFix the XSLT template to properly handle nested <subsection> elements with correct heading levels.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


78. Rewrite Docs Formatting (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
78.1docs/rewrite.xml:530Pre-formatted text not wrappingInvestigate the XML/XSL rendering. Fix the <source> or <pre> element styling.0.25 dayLow

Total estimated effort: 0.25 day, Low difficulty


Test Code TODOs

79. HTTP/2 Test Coverage (8 items)

#File:LineDescriptionFix IdeaEffortDifficulty
79.1TestHttp2Section_4_1.java:32Tests for over-sized frames missingAdd tests that send frames exceeding MAX_FRAME_SIZE and verify GOAWAY/RST_STREAM.1-2 daysMedium
79.2TestHttp2Section_4_1.java:46Tests for unexpected flags missingAdd tests for frames with invalid flag combinations.1-2 daysMedium
79.3TestHttp2Section_3_2.java:33Initial request body size tests missingAdd tests with various body sizes (0, small, large, exceeding initial window).1-2 daysMedium
79.4TestHttp2Section_6_9.java:67Flow control window change accounting tests missingAdd tests that verify window size updates are always accounted for, even for ignored frames.1-2 daysMedium
79.5TestHttp2Section_6_8.java:157PUSH_PROMISE header/window processing tests missingAdd tests for PUSH_PROMISE frames that verify headers and window size are processed even when stream is ignored.1-2 daysMedium
79.6TestHttp2Section_5_1.java:52Reserved local state tests missingAdd tests for sending frames when local state is RESERVED.0.5-1 dayLow
79.7TestHttp2Section_5_1.java:53Reserved remote state tests missingAdd tests for sending frames when remote state is RESERVED.0.5-1 dayLow
79.8TestHttp2Section_5_1.java:112Invalid frame tests for remaining states missingAdd invalid frame tests for HALF_CLOSED_LOCAL, HALF_CLOSED_REMOTE, and CLOSED states.1-2 daysMedium

Total estimated effort: 6-12 days, Medium difficulty


80. HPACK Test Improvement (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
80.1TestHpack.java:39Huffman encoding not predictable in testsUse HpackHeaderFunction to force huffman encoding for test headers, ensuring deterministic test results.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


81. OpenSSL Cipher Test Coverage (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
81.1TestOpenSSLCipherConfigurationParser.java:497Individual operator tests missingAdd unit tests for each cipher string operator: +, -, !, @, colon separator, etc.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


82. OCSP Test Hardcoded Serials (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
82.1TesterOcspResponderServlet.java:221Certificate serial numbers hardcoded instead of read from index.dbParse the OpenSSL CA index.txt file to extract serial numbers dynamically.1 dayMedium

Total estimated effort: 1 day, Medium difficulty


83. EL in JSP Escape Test (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
83.1TestELInJsp.java:159Single unescaped backslash in attribute values is allowedFix the parser to reject unescaped backslashes, or document the behavior as intentional.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


84. WebSocket Client TCP ACK (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
84.1TesterWsClient.java:47TCP ACK timing for RST detection is a hope, not a guaranteeUse SO_LINGER or a more reliable mechanism to ensure data is flushed before connection close.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


85. AJP Message Test Class (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
85.1TesterAjpMessage.java:27Unclear if test utility should be merged into AjpMessageEvaluate whether the additional read methods are general-purpose. If so, add to AjpMessage with appropriate access control.0.5 dayLow

Total estimated effort: 0.5 day, Low difficulty


86. Tribes LoadTest Stubs (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
86.1LoadTest.java:172memberJoined not implementedAdd logging or metrics collection for member join events.0.25 dayLow
86.2LoadTest.java:185memberDisappeared not implementedAdd logging or metrics collection for member leave events.0.25 dayLow

Total estimated effort: 0.5 day, Low difficulty


87. Non-Blocking API Test (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
87.1TestNonBlockingAPI.java:945Non-blocking writes with NIO connector appear to have issuesInvestigate the specific failure mode. May be a connector bug or test timing issue.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


88. Annotation Test Type Inconsistency (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
88.1TestContextConfigAnnotation.java:243servletDef is Boolean, FilterDef is String - inconsistentInvestigate why the types differ. If it's a bug, fix the annotation processing. If intentional, document.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


89. Example WebSocket Drawboard (5 items)

#File:LineDescriptionFix IdeaEffortDifficulty
89.1DrawboardEndpoint.java:66Endpoint instance reuse not exploredDocument the current single-use behavior. If multi-use is desired, make state non-static and thread-safe.1-2 daysMedium
89.2DrawboardEndpoint.java:201Variable-based solution is a workaroundReplace with a proper state management mechanism.0.5-1 dayLow
89.3DrawboardEndpoint.java:211Error handling - should connection be closed?Add connection close on persistent errors.0.25 dayLow
89.4DrawboardEndpoint.java:214Same as 89.3Same fix.0.25 dayLow
89.5DrawMessage.java:31Color object creation for integer representationUse a cached color map or accept the allocation cost.0.25 dayLow

Total estimated effort: 2.5-4.5 days, Low-Medium difficulty


90. Example WebSocket Draw Message (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
90.1DrawMessage.java:163Axis-aligned rectangles should be drawn as linesAdd a check: if x1 == x2 or y1 == y2, draw a line instead of a rectangle.0.25 dayLow

Total estimated effort: 0.25 day, Low difficulty


91. Example WebSocket Client Blocking (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
91.1Client.java:109close() may block if remote doesn't readUse async close with timeout. Or set SO_TIMEOUT before close.0.5-1 dayLow
91.2Client.java:206session.close() blocks in error handlerMove close to a separate thread or use async close.0.5-1 dayLow

Total estimated effort: 1-2 days, Low difficulty


92. Example Async TODO (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
92.1webapps/examples/jsp/async/index.jsp:58Incomplete TODO in exampleComplete the async example documentation or feature.0.25 dayLow

Total estimated effort: 0.25 day, Low difficulty


93. Manager Session Detail TODO (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
93.1webapps/manager/WEB-INF/jsp/sessionDetail.jsp:140Max Inactive Interval not settable from session detail pageAdd a form field and API call to update session max inactive interval.1-2 daysMedium

Total estimated effort: 1-2 days, Medium difficulty


Auto-Generated Stub TODOs

These are IDE-generated stub methods with // TODO Auto-generated method stub comments. They are low-priority but should eventually be properly implemented.

94. JDBC Pool Test Statement Interface (~80 stubs)

#File:LineDescriptionFix IdeaEffortDifficulty
94.1modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/driver/Statement.java:58-470+~80 unimplemented Statement interface methodsImplement each method to delegate to the wrapped statement, or throw SQLFeatureNotSupportedException. This is test infrastructure code.3-5 daysMedium

Total estimated effort: 3-5 days, Medium difficulty


95. CompressionResponseStream Stubs (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
95.1CompressionResponseStream.java:274-288isReady() and setWriteListener() not implemented (Servlet 3.1 async)Delegate to the underlying ServletOutputStream. Return true for isReady().0.5 dayLow

Total estimated effort: 0.5 day, Low difficulty


96. ByteArrayServletOutputStream Stubs (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
96.1ByteArrayServletOutputStream.java:66-80isReady() and setWriteListener() not implemented (Servlet 3.1 async)Return true for isReady() (in-memory buffer is always ready). No-op for setWriteListener().0.25 dayLow

Total estimated effort: 0.25 day, Low difficulty


97. ExpiresFilter Stubs (2 items)

#File:LineDescriptionFix IdeaEffortDifficulty
97.1ExpiresFilter.java:1067-1078isReady() and setWriteListener() not implementedReturn false for isReady() (conservative). No-op for setWriteListener(). Or delegate to wrapped stream.0.25 dayLow

Total estimated effort: 0.25 day, Low difficulty


98. PoolProperties Clone Stub (1 item)

#File:LineDescriptionFix IdeaEffortDifficulty
98.1PoolProperties.java:1216clone() uses super.clone() without deep copyImplement proper deep clone of all mutable fields.0.5-1 dayLow

Total estimated effort: 0.5-1 day, Low difficulty


Summary Statistics

CategoryItemsTotal Effort (days)Avg Difficulty
Critical FIXMEs~35~75-120High
High-Priority TODOs~25~50-80Medium-High
Medium-Priority TODOs~20~25-40Medium
Low-Priority / Cosmetic~15~25-45Low-Medium
Documentation11~17-27Medium
Test Code~20~15-25Low-Medium
Auto-Generated Stubs~90~5-8Low
Total~196~192-275Mixed

Priority Recommendations

  1. Immediate: Fix DeltaManager session replication (items 1.1-1.7) - these affect cluster correctness
  2. Short-term: Fix DBCP double-close (6.1-6.2), BaseModelMBean notification removal (7.1), PersistentManagerBase LRU (5.1)
  3. Medium-term: SSL rewrite variables (2.1-2.8), HTTP/2 HPACK optimization (23.1-23.3), ThreadPoolExecutor AQS (13.1)
  4. Long-term: WebXml i18n support (30.1), CGIServlet overhaul (63.1), Tribes documentation (75.1-75.7)
  5. Backlog: Auto-generated stubs, cosmetic items, test improvements