Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap - #4809

Merged
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types
Sep 1, 2026
Merged

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap#4809
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types

Conversation

@serhiy-bzhezytskyy

Copy link
Copy Markdown
Contributor

Follow-up to @dsmiley's suggestion on #4761 (review thread on QueryComponent.java): rather than keep the remove()+add() workaround needed there because getResponseHeader()'s declared return type (NamedList<Object>) doesn't have a put(), this tightens the declared type to what it always actually is at runtime -- SimpleOrderedMap<Object> -- removing the internal unchecked cast and letting the 4 call sites in QueryComponent/CombinedQueryComponent use put() directly.

This also closes the actual hole that caused #4761's ClassCastException: MockResponseBuilder's mock was stubbing getResponseHeader() to return a bare NamedList, which the contract allowed but reality never produced. With the tightened return type, that mismatch is now a compile error instead of a runtime ClassCastException.

Compatibility note: this is binary-incompatible for any external caller compiled against the old NamedList signature -- verified locally (compiled a caller against the old class files, ran it against the new ones without recompiling): NoSuchMethodError on both getResponseHeader() and addResponseHeader(NamedList). SolrQueryResponse is @since solr 0.9 public API with no experimental/internal marker, so flagging this explicitly rather than treating it as a purely internal cleanup -- your call whether that's acceptable for 11.0.

AI-assisted (Claude Sonnet 5)

…leOrderedMap
getResponseHeader() always returned an actual SimpleOrderedMap internally,
masked by an unchecked cast; declaring the real type removes the cast and
lets 4 call sites in QueryComponent/CombinedQueryComponent use put() instead
of asShallowMap().put()/remove()+add(). It also turns the exact class of bug
hit in SOLR-18373 (a test mock returning a plain NamedList, causing a
runtime ClassCastException) into a compile error instead.
Binary-incompatible for external callers compiled against the old NamedList
signature (verified: NoSuchMethodError). Flagging for review since this is
long-standing public API, not something marked experimental/internal.

@dsmileydsmiley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For Solr 11. The binary incompatibility break for a prolific API like this wouldn't be nice for Solr plugin writers.

@dsmileydsmiley added this to the 11.x milestone Aug 25, 2026
@epugh

Copy link
Copy Markdown
Contributor

@serhiy-bzhezytskyy can you add a changelog since this is a binary incompatbility?

@serhiy-bzhezytskyy

Copy link
Copy Markdown
ContributorAuthor

Added — see changelog/unreleased/SOLR-solrqueryresponse-return-types.yml.

Resolved in QueryComponent and CombinedQueryComponent: kept the direct
SimpleOrderedMap.put() calls and dropped updateResponseHeader, whose only
purpose was to cast around getResponseHeader()'s old NamedList return type.
@dsmiley
dsmiley merged commit 2da4736 into apache:mainSep 1, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@serhiy-bzhezytskyy@epugh@dsmiley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap - #4809

Merged
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types
Sep 1, 2026
Merged

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap#4809
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types

Conversation

@serhiy-bzhezytskyy

Copy link
Copy Markdown
Contributor

Follow-up to @dsmiley's suggestion on #4761 (review thread on QueryComponent.java): rather than keep the remove()+add() workaround needed there because getResponseHeader()'s declared return type (NamedList<Object>) doesn't have a put(), this tightens the declared type to what it always actually is at runtime -- SimpleOrderedMap<Object> -- removing the internal unchecked cast and letting the 4 call sites in QueryComponent/CombinedQueryComponent use put() directly.

This also closes the actual hole that caused #4761's ClassCastException: MockResponseBuilder's mock was stubbing getResponseHeader() to return a bare NamedList, which the contract allowed but reality never produced. With the tightened return type, that mismatch is now a compile error instead of a runtime ClassCastException.

Compatibility note: this is binary-incompatible for any external caller compiled against the old NamedList signature -- verified locally (compiled a caller against the old class files, ran it against the new ones without recompiling): NoSuchMethodError on both getResponseHeader() and addResponseHeader(NamedList). SolrQueryResponse is @since solr 0.9 public API with no experimental/internal marker, so flagging this explicitly rather than treating it as a purely internal cleanup -- your call whether that's acceptable for 11.0.

AI-assisted (Claude Sonnet 5)

…leOrderedMap
getResponseHeader() always returned an actual SimpleOrderedMap internally,
masked by an unchecked cast; declaring the real type removes the cast and
lets 4 call sites in QueryComponent/CombinedQueryComponent use put() instead
of asShallowMap().put()/remove()+add(). It also turns the exact class of bug
hit in SOLR-18373 (a test mock returning a plain NamedList, causing a
runtime ClassCastException) into a compile error instead.
Binary-incompatible for external callers compiled against the old NamedList
signature (verified: NoSuchMethodError). Flagging for review since this is
long-standing public API, not something marked experimental/internal.

@dsmileydsmiley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For Solr 11. The binary incompatibility break for a prolific API like this wouldn't be nice for Solr plugin writers.

@dsmileydsmiley added this to the 11.x milestone Aug 25, 2026
@epugh

Copy link
Copy Markdown
Contributor

@serhiy-bzhezytskyy can you add a changelog since this is a binary incompatbility?

@serhiy-bzhezytskyy

Copy link
Copy Markdown
ContributorAuthor

Added — see changelog/unreleased/SOLR-solrqueryresponse-return-types.yml.

Resolved in QueryComponent and CombinedQueryComponent: kept the direct
SimpleOrderedMap.put() calls and dropped updateResponseHeader, whose only
purpose was to cast around getResponseHeader()'s old NamedList return type.
@dsmiley
dsmiley merged commit 2da4736 into apache:mainSep 1, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@serhiy-bzhezytskyy@epugh@dsmiley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap - #4809

Merged
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types
Sep 1, 2026
Merged

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap#4809
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types

Conversation

@serhiy-bzhezytskyy

Copy link
Copy Markdown
Contributor

Follow-up to @dsmiley's suggestion on #4761 (review thread on QueryComponent.java): rather than keep the remove()+add() workaround needed there because getResponseHeader()'s declared return type (NamedList<Object>) doesn't have a put(), this tightens the declared type to what it always actually is at runtime -- SimpleOrderedMap<Object> -- removing the internal unchecked cast and letting the 4 call sites in QueryComponent/CombinedQueryComponent use put() directly.

This also closes the actual hole that caused #4761's ClassCastException: MockResponseBuilder's mock was stubbing getResponseHeader() to return a bare NamedList, which the contract allowed but reality never produced. With the tightened return type, that mismatch is now a compile error instead of a runtime ClassCastException.

Compatibility note: this is binary-incompatible for any external caller compiled against the old NamedList signature -- verified locally (compiled a caller against the old class files, ran it against the new ones without recompiling): NoSuchMethodError on both getResponseHeader() and addResponseHeader(NamedList). SolrQueryResponse is @since solr 0.9 public API with no experimental/internal marker, so flagging this explicitly rather than treating it as a purely internal cleanup -- your call whether that's acceptable for 11.0.

AI-assisted (Claude Sonnet 5)

…leOrderedMap
getResponseHeader() always returned an actual SimpleOrderedMap internally,
masked by an unchecked cast; declaring the real type removes the cast and
lets 4 call sites in QueryComponent/CombinedQueryComponent use put() instead
of asShallowMap().put()/remove()+add(). It also turns the exact class of bug
hit in SOLR-18373 (a test mock returning a plain NamedList, causing a
runtime ClassCastException) into a compile error instead.
Binary-incompatible for external callers compiled against the old NamedList
signature (verified: NoSuchMethodError). Flagging for review since this is
long-standing public API, not something marked experimental/internal.

@dsmileydsmiley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For Solr 11. The binary incompatibility break for a prolific API like this wouldn't be nice for Solr plugin writers.

@dsmileydsmiley added this to the 11.x milestone Aug 25, 2026
@epugh

Copy link
Copy Markdown
Contributor

@serhiy-bzhezytskyy can you add a changelog since this is a binary incompatbility?

@serhiy-bzhezytskyy

Copy link
Copy Markdown
ContributorAuthor

Added — see changelog/unreleased/SOLR-solrqueryresponse-return-types.yml.

Resolved in QueryComponent and CombinedQueryComponent: kept the direct
SimpleOrderedMap.put() calls and dropped updateResponseHeader, whose only
purpose was to cast around getResponseHeader()'s old NamedList return type.
@dsmiley
dsmiley merged commit 2da4736 into apache:mainSep 1, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@serhiy-bzhezytskyy@epugh@dsmiley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap - #4809

Merged
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types
Sep 1, 2026
Merged

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap#4809
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types

Conversation

@serhiy-bzhezytskyy

Copy link
Copy Markdown
Contributor

Follow-up to @dsmiley's suggestion on #4761 (review thread on QueryComponent.java): rather than keep the remove()+add() workaround needed there because getResponseHeader()'s declared return type (NamedList<Object>) doesn't have a put(), this tightens the declared type to what it always actually is at runtime -- SimpleOrderedMap<Object> -- removing the internal unchecked cast and letting the 4 call sites in QueryComponent/CombinedQueryComponent use put() directly.

This also closes the actual hole that caused #4761's ClassCastException: MockResponseBuilder's mock was stubbing getResponseHeader() to return a bare NamedList, which the contract allowed but reality never produced. With the tightened return type, that mismatch is now a compile error instead of a runtime ClassCastException.

Compatibility note: this is binary-incompatible for any external caller compiled against the old NamedList signature -- verified locally (compiled a caller against the old class files, ran it against the new ones without recompiling): NoSuchMethodError on both getResponseHeader() and addResponseHeader(NamedList). SolrQueryResponse is @since solr 0.9 public API with no experimental/internal marker, so flagging this explicitly rather than treating it as a purely internal cleanup -- your call whether that's acceptable for 11.0.

AI-assisted (Claude Sonnet 5)

…leOrderedMap
getResponseHeader() always returned an actual SimpleOrderedMap internally,
masked by an unchecked cast; declaring the real type removes the cast and
lets 4 call sites in QueryComponent/CombinedQueryComponent use put() instead
of asShallowMap().put()/remove()+add(). It also turns the exact class of bug
hit in SOLR-18373 (a test mock returning a plain NamedList, causing a
runtime ClassCastException) into a compile error instead.
Binary-incompatible for external callers compiled against the old NamedList
signature (verified: NoSuchMethodError). Flagging for review since this is
long-standing public API, not something marked experimental/internal.

@dsmileydsmiley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For Solr 11. The binary incompatibility break for a prolific API like this wouldn't be nice for Solr plugin writers.

@dsmileydsmiley added this to the 11.x milestone Aug 25, 2026
@epugh

Copy link
Copy Markdown
Contributor

@serhiy-bzhezytskyy can you add a changelog since this is a binary incompatbility?

@serhiy-bzhezytskyy

Copy link
Copy Markdown
ContributorAuthor

Added — see changelog/unreleased/SOLR-solrqueryresponse-return-types.yml.

Resolved in QueryComponent and CombinedQueryComponent: kept the direct
SimpleOrderedMap.put() calls and dropped updateResponseHeader, whose only
purpose was to cast around getResponseHeader()'s old NamedList return type.
@dsmiley
dsmiley merged commit 2da4736 into apache:mainSep 1, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@serhiy-bzhezytskyy@epugh@dsmiley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap - #4809

Merged
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types
Sep 1, 2026
Merged

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap#4809
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types

Conversation

@serhiy-bzhezytskyy

Copy link
Copy Markdown
Contributor

Follow-up to @dsmiley's suggestion on #4761 (review thread on QueryComponent.java): rather than keep the remove()+add() workaround needed there because getResponseHeader()'s declared return type (NamedList<Object>) doesn't have a put(), this tightens the declared type to what it always actually is at runtime -- SimpleOrderedMap<Object> -- removing the internal unchecked cast and letting the 4 call sites in QueryComponent/CombinedQueryComponent use put() directly.

This also closes the actual hole that caused #4761's ClassCastException: MockResponseBuilder's mock was stubbing getResponseHeader() to return a bare NamedList, which the contract allowed but reality never produced. With the tightened return type, that mismatch is now a compile error instead of a runtime ClassCastException.

Compatibility note: this is binary-incompatible for any external caller compiled against the old NamedList signature -- verified locally (compiled a caller against the old class files, ran it against the new ones without recompiling): NoSuchMethodError on both getResponseHeader() and addResponseHeader(NamedList). SolrQueryResponse is @since solr 0.9 public API with no experimental/internal marker, so flagging this explicitly rather than treating it as a purely internal cleanup -- your call whether that's acceptable for 11.0.

AI-assisted (Claude Sonnet 5)

…leOrderedMap
getResponseHeader() always returned an actual SimpleOrderedMap internally,
masked by an unchecked cast; declaring the real type removes the cast and
lets 4 call sites in QueryComponent/CombinedQueryComponent use put() instead
of asShallowMap().put()/remove()+add(). It also turns the exact class of bug
hit in SOLR-18373 (a test mock returning a plain NamedList, causing a
runtime ClassCastException) into a compile error instead.
Binary-incompatible for external callers compiled against the old NamedList
signature (verified: NoSuchMethodError). Flagging for review since this is
long-standing public API, not something marked experimental/internal.

@dsmileydsmiley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For Solr 11. The binary incompatibility break for a prolific API like this wouldn't be nice for Solr plugin writers.

@dsmileydsmiley added this to the 11.x milestone Aug 25, 2026
@epugh

Copy link
Copy Markdown
Contributor

@serhiy-bzhezytskyy can you add a changelog since this is a binary incompatbility?

@serhiy-bzhezytskyy

Copy link
Copy Markdown
ContributorAuthor

Added — see changelog/unreleased/SOLR-solrqueryresponse-return-types.yml.

Resolved in QueryComponent and CombinedQueryComponent: kept the direct
SimpleOrderedMap.put() calls and dropped updateResponseHeader, whose only
purpose was to cast around getResponseHeader()'s old NamedList return type.
@dsmiley
dsmiley merged commit 2da4736 into apache:mainSep 1, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@serhiy-bzhezytskyy@epugh@dsmiley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap - #4809

Merged
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types
Sep 1, 2026
Merged

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap#4809
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types

Conversation

@serhiy-bzhezytskyy

Copy link
Copy Markdown
Contributor

Follow-up to @dsmiley's suggestion on #4761 (review thread on QueryComponent.java): rather than keep the remove()+add() workaround needed there because getResponseHeader()'s declared return type (NamedList<Object>) doesn't have a put(), this tightens the declared type to what it always actually is at runtime -- SimpleOrderedMap<Object> -- removing the internal unchecked cast and letting the 4 call sites in QueryComponent/CombinedQueryComponent use put() directly.

This also closes the actual hole that caused #4761's ClassCastException: MockResponseBuilder's mock was stubbing getResponseHeader() to return a bare NamedList, which the contract allowed but reality never produced. With the tightened return type, that mismatch is now a compile error instead of a runtime ClassCastException.

Compatibility note: this is binary-incompatible for any external caller compiled against the old NamedList signature -- verified locally (compiled a caller against the old class files, ran it against the new ones without recompiling): NoSuchMethodError on both getResponseHeader() and addResponseHeader(NamedList). SolrQueryResponse is @since solr 0.9 public API with no experimental/internal marker, so flagging this explicitly rather than treating it as a purely internal cleanup -- your call whether that's acceptable for 11.0.

AI-assisted (Claude Sonnet 5)

…leOrderedMap
getResponseHeader() always returned an actual SimpleOrderedMap internally,
masked by an unchecked cast; declaring the real type removes the cast and
lets 4 call sites in QueryComponent/CombinedQueryComponent use put() instead
of asShallowMap().put()/remove()+add(). It also turns the exact class of bug
hit in SOLR-18373 (a test mock returning a plain NamedList, causing a
runtime ClassCastException) into a compile error instead.
Binary-incompatible for external callers compiled against the old NamedList
signature (verified: NoSuchMethodError). Flagging for review since this is
long-standing public API, not something marked experimental/internal.

@dsmileydsmiley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For Solr 11. The binary incompatibility break for a prolific API like this wouldn't be nice for Solr plugin writers.

@dsmileydsmiley added this to the 11.x milestone Aug 25, 2026
@epugh

Copy link
Copy Markdown
Contributor

@serhiy-bzhezytskyy can you add a changelog since this is a binary incompatbility?

@serhiy-bzhezytskyy

Copy link
Copy Markdown
ContributorAuthor

Added — see changelog/unreleased/SOLR-solrqueryresponse-return-types.yml.

Resolved in QueryComponent and CombinedQueryComponent: kept the direct
SimpleOrderedMap.put() calls and dropped updateResponseHeader, whose only
purpose was to cast around getResponseHeader()'s old NamedList return type.
@dsmiley
dsmiley merged commit 2da4736 into apache:mainSep 1, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@serhiy-bzhezytskyy@epugh@dsmiley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap - #4809

Merged
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types
Sep 1, 2026
Merged

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap#4809
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types

Conversation

@serhiy-bzhezytskyy

Copy link
Copy Markdown
Contributor

Follow-up to @dsmiley's suggestion on #4761 (review thread on QueryComponent.java): rather than keep the remove()+add() workaround needed there because getResponseHeader()'s declared return type (NamedList<Object>) doesn't have a put(), this tightens the declared type to what it always actually is at runtime -- SimpleOrderedMap<Object> -- removing the internal unchecked cast and letting the 4 call sites in QueryComponent/CombinedQueryComponent use put() directly.

This also closes the actual hole that caused #4761's ClassCastException: MockResponseBuilder's mock was stubbing getResponseHeader() to return a bare NamedList, which the contract allowed but reality never produced. With the tightened return type, that mismatch is now a compile error instead of a runtime ClassCastException.

Compatibility note: this is binary-incompatible for any external caller compiled against the old NamedList signature -- verified locally (compiled a caller against the old class files, ran it against the new ones without recompiling): NoSuchMethodError on both getResponseHeader() and addResponseHeader(NamedList). SolrQueryResponse is @since solr 0.9 public API with no experimental/internal marker, so flagging this explicitly rather than treating it as a purely internal cleanup -- your call whether that's acceptable for 11.0.

AI-assisted (Claude Sonnet 5)

…leOrderedMap
getResponseHeader() always returned an actual SimpleOrderedMap internally,
masked by an unchecked cast; declaring the real type removes the cast and
lets 4 call sites in QueryComponent/CombinedQueryComponent use put() instead
of asShallowMap().put()/remove()+add(). It also turns the exact class of bug
hit in SOLR-18373 (a test mock returning a plain NamedList, causing a
runtime ClassCastException) into a compile error instead.
Binary-incompatible for external callers compiled against the old NamedList
signature (verified: NoSuchMethodError). Flagging for review since this is
long-standing public API, not something marked experimental/internal.

@dsmileydsmiley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For Solr 11. The binary incompatibility break for a prolific API like this wouldn't be nice for Solr plugin writers.

@dsmileydsmiley added this to the 11.x milestone Aug 25, 2026
@epugh

Copy link
Copy Markdown
Contributor

@serhiy-bzhezytskyy can you add a changelog since this is a binary incompatbility?

@serhiy-bzhezytskyy

Copy link
Copy Markdown
ContributorAuthor

Added — see changelog/unreleased/SOLR-solrqueryresponse-return-types.yml.

Resolved in QueryComponent and CombinedQueryComponent: kept the direct
SimpleOrderedMap.put() calls and dropped updateResponseHeader, whose only
purpose was to cast around getResponseHeader()'s old NamedList return type.
@dsmiley
dsmiley merged commit 2da4736 into apache:mainSep 1, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@serhiy-bzhezytskyy@epugh@dsmiley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap - #4809

Merged
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types
Sep 1, 2026
Merged

Tighten SolrQueryResponse.getResponseHeader/addResponseHeader to SimpleOrderedMap#4809
dsmiley merged 3 commits into
apache:mainfrom
serhiy-bzhezytskyy:SOLR-solrqueryresponse-return-types

Conversation

@serhiy-bzhezytskyy

Copy link
Copy Markdown
Contributor

Follow-up to @dsmiley's suggestion on #4761 (review thread on QueryComponent.java): rather than keep the remove()+add() workaround needed there because getResponseHeader()'s declared return type (NamedList<Object>) doesn't have a put(), this tightens the declared type to what it always actually is at runtime -- SimpleOrderedMap<Object> -- removing the internal unchecked cast and letting the 4 call sites in QueryComponent/CombinedQueryComponent use put() directly.

This also closes the actual hole that caused #4761's ClassCastException: MockResponseBuilder's mock was stubbing getResponseHeader() to return a bare NamedList, which the contract allowed but reality never produced. With the tightened return type, that mismatch is now a compile error instead of a runtime ClassCastException.

Compatibility note: this is binary-incompatible for any external caller compiled against the old NamedList signature -- verified locally (compiled a caller against the old class files, ran it against the new ones without recompiling): NoSuchMethodError on both getResponseHeader() and addResponseHeader(NamedList). SolrQueryResponse is @since solr 0.9 public API with no experimental/internal marker, so flagging this explicitly rather than treating it as a purely internal cleanup -- your call whether that's acceptable for 11.0.

AI-assisted (Claude Sonnet 5)

…leOrderedMap
getResponseHeader() always returned an actual SimpleOrderedMap internally,
masked by an unchecked cast; declaring the real type removes the cast and
lets 4 call sites in QueryComponent/CombinedQueryComponent use put() instead
of asShallowMap().put()/remove()+add(). It also turns the exact class of bug
hit in SOLR-18373 (a test mock returning a plain NamedList, causing a
runtime ClassCastException) into a compile error instead.
Binary-incompatible for external callers compiled against the old NamedList
signature (verified: NoSuchMethodError). Flagging for review since this is
long-standing public API, not something marked experimental/internal.

@dsmileydsmiley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For Solr 11. The binary incompatibility break for a prolific API like this wouldn't be nice for Solr plugin writers.

@dsmileydsmiley added this to the 11.x milestone Aug 25, 2026
@epugh

Copy link
Copy Markdown
Contributor

@serhiy-bzhezytskyy can you add a changelog since this is a binary incompatbility?

@serhiy-bzhezytskyy

Copy link
Copy Markdown
ContributorAuthor

Added — see changelog/unreleased/SOLR-solrqueryresponse-return-types.yml.

Resolved in QueryComponent and CombinedQueryComponent: kept the direct
SimpleOrderedMap.put() calls and dropped updateResponseHeader, whose only
purpose was to cast around getResponseHeader()'s old NamedList return type.
@dsmiley
dsmiley merged commit 2da4736 into apache:mainSep 1, 2026
5 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@serhiy-bzhezytskyy@epugh@dsmiley