Skip to content

Migrate Schema Designer to JAX-RS Apis. Fix some bugs.#4203

Open
epugh wants to merge 46 commits intoapache:mainfrom
epugh:copilot/migrate-schemadesignerapi-to-v2-annotations
Open

Migrate Schema Designer to JAX-RS Apis. Fix some bugs.#4203
epugh wants to merge 46 commits intoapache:mainfrom
epugh:copilot/migrate-schemadesignerapi-to-v2-annotations

Conversation

@epugh
Copy link
Copy Markdown
Contributor

@epugh epugh commented Mar 10, 2026

Summary

Migrate the SchemaDesigner to JAX-RS. Fixed a bug in the analyze feature that wasn't working in main.

Changes

JAX-RS adoption, RESTful style routing, and code review. Had to change up the routes in the JavaScript to match.

The runtime behaviour is unchanged.

Copilot AI and others added 8 commits February 22, 2026 14:50
Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
…mments

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
…y docs guard)

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
…ader, sanitize filename

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
…/docs map for JS rendering

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
@epugh epugh requested a review from Copilot March 10, 2026 09:50
@epugh epugh changed the title Fix unchecked cast warning in DefaultSampleDocumentsLoader Migrate Schema Designer to Ja Mar 10, 2026
@epugh epugh changed the title Migrate Schema Designer to Ja Migrate Schema Designer to JAX-RS Apis. Fix some bugs. Mar 10, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR refactors the Schema Designer v2 API implementation to a Jersey-based resource + OpenAPI-defined interface, updates the admin UI download URL accordingly, and includes a small improvement to JSON-lines parsing to avoid unchecked-cast warnings.

Changes:

  • Migrate SchemaDesignerAPI from the legacy @EndPoint style to a JerseyResource implementing a new SchemaDesignerApi interface, and update tests to call the new method signatures.
  • Adjust the Schema Designer UI download endpoint URL to the new /api/schema-designer/download?configSet=... form.
  • Narrow unchecked-cast suppression in DefaultSampleDocumentsLoader via a helper method using instanceof Map<?, ?>.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
solr/webapp/web/js/angular/controllers/schema-designer.js Updates Schema Designer download URL to new endpoint shape.
solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerAPI.java Reworks tests to call new Jersey-style API methods and response handling.
solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerSettings.java Changes settings class visibility to public.
solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConstants.java Removes unused constants related to old request-param handling.
solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java Minor cleanup/modernization and removal of unused helper logic.
solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java Major migration to JerseyResource + SchemaDesignerApi, plus download/query response changes.
solr/core/src/java/org/apache/solr/handler/designer/SampleDocuments.java Uses Stream.toList() instead of Collectors.toList().
solr/core/src/java/org/apache/solr/handler/designer/DefaultSchemaSuggester.java Adjusts field-prop guessing API/signature usage.
solr/core/src/java/org/apache/solr/handler/designer/DefaultSampleDocumentsLoader.java Introduces parseStringToJson() helper and narrows unchecked-cast suppression.
solr/core/src/java/org/apache/solr/core/CoreContainer.java Registers Schema Designer as a Jersey resource class.
solr/api/src/java/org/apache/solr/client/api/endpoint/SchemaDesignerApi.java Adds new OpenAPI/JAX-RS interface defining Schema Designer endpoints.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment thread solr/webapp/web/js/angular/controllers/schema-designer.js
Comment on lines 822 to 826
if (errorsDuringIndexing != null) {
Map<String, Object> response = new HashMap<>();
rsp.setException(
new SolrException(
SolrException.ErrorCode.BAD_REQUEST,
"Failed to re-index sample documents after schema updated."));
response.put(ERROR_DETAILS, errorsDuringIndexing);
rsp.getValues().addAll(response);
return;
throw new SolrException(
SolrException.ErrorCode.BAD_REQUEST,
"Failed to re-index sample documents after schema updated.");
}
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

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

query() used to return an error response containing errorDetails when re-indexing failed, which the Schema Designer UI surfaces (see its errorHandler). This new implementation throws a SolrException without attaching errorDetails, so clients will lose the per-doc failure details. Consider instantiating a FlexibleSolrJerseyResponse early and setting an errorDetails top-level property before throwing, or otherwise preserve the prior error payload structure.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Thanks, I dug in and found some bugs and fixed them in how we surface errors.
image

Comment on lines +1349 to 1354
protected void requireSchemaVersion(Integer schemaVersion) {
if (schemaVersion == null) {
throw new SolrException(
SolrException.ErrorCode.BAD_REQUEST,
SCHEMA_VERSION_PARAM + " is a required parameter for the " + req.getPath() + " endpoint");
SolrException.ErrorCode.BAD_REQUEST, SCHEMA_VERSION_PARAM + " is a required parameter!");
}
return schemaVersion;
}
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

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

requireSchemaVersion() now only rejects null, but previously the API treated -1 as “missing” (since getInt(..., -1) was used) and rejected it. As written, a client can pass schemaVersion=-1 and bypass this validation; it would be safer to also reject negative values to keep the same contract.

Copilot uses AI. Check for mistakes.
Comment thread solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerSettings.java Outdated
Comment thread solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java Outdated
@epugh epugh requested review from dsmiley and janhoy March 10, 2026 10:43
Copilot AI and others added 3 commits March 19, 2026 11:57
…sentinel contract)

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
… github.com:epugh/solr into copilot/migrate-schemadesignerapi-to-v2-annotations
@epugh
Copy link
Copy Markdown
Contributor Author

epugh commented Mar 21, 2026

Discussing with @gerlowskija this ticket, and he brings up the "Shouldn't this be more restFul"? Looking at it, configSet is a query param in ALL of these, and really should be part of the path param.

@epugh
Copy link
Copy Markdown
Contributor Author

epugh commented Mar 30, 2026

image image

@epugh epugh requested a review from gerlowskija March 30, 2026 10:10
Copilot AI and others added 25 commits April 2, 2026 14:47
…playName query param

Agent-Logs-Url: https://github.com/epugh/solr/sessions/eff3e08e-97a3-4e83-832c-74cc41e9058d

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
Replace all FlexibleSolrJerseyResponse usages with the specific typed
response POJOs (SchemaDesignerResponse, SchemaDesignerInfoResponse,
SchemaDesignerCollectionsResponse, SchemaDesignerSchemaDiffResponse)
returned by the SchemaDesigner API methods.

Also fix SchemaDesigner.setSchemaObjectField() to handle the add-field
and add-field-type action names used by the Schema API request JSON, so
that response.field is populated for add-field requests and
response.fieldType for add-field-type requests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
…i-to-v2-annotations' into copilot/migrate-schemadesignerapi-to-v2-annotations

# Conflicts:
#	solr/core/src/java/org/apache/solr/handler/configsets/DownloadConfigSet.java

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
…s $resource in JS

Agent-Logs-Url: https://github.com/epugh/solr/sessions/adec0806-852d-4a34-a0fb-aef713d8bf76

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
…adesignerapi-to-v2-annotations

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
…ddenInConfigSets on ConfigSetService)

Agent-Logs-Url: https://github.com/epugh/solr/sessions/8fcb8001-f311-4bcb-bf46-522ebd7a9d05

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
…e download+getFile to SchemaDesignerApi

Agent-Logs-Url: https://github.com/epugh/solr/sessions/07fed0d8-5175-46b5-bff4-7111da9bb8c3

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
… DownloadConfigSet.zipConfigSet()

Agent-Logs-Url: https://github.com/epugh/solr/sessions/fd2b245f-2e34-45e1-96fe-a5047e48206b

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
…ownload endpoint directly

Agent-Logs-Url: https://github.com/epugh/solr/sessions/4f648089-c8e3-4fcd-9ac5-c55c3e9307df

Co-authored-by: epugh <22395+epugh@users.noreply.github.com>
@epugh
Copy link
Copy Markdown
Contributor Author

epugh commented Apr 24, 2026

We took a diversion to update ConfigsetsAPI with an idea that we would reuse those APIs in the schema designer. Unfortunantly the only reusable API was teh "download a zipped configset". It turns out the other SchemaDesignerAPI endpoints that look like they could be replace with a ConfigsetsAPI call can't be because of Schema Designer specific business logic.

I'll paste below two examples:

listConfigs vs listConfigSets — cannot replace

listConfigSets returns ListConfigsetsResponse { List configSets } — a flat list of all raw configset names, including ._designer_films.

listConfigs does designer-specific logic the JS UI depends on:

Filters out system/excluded configsets and raw .designer* entries from the top-level list
Maps ._designer_X → X (strips the prefix) and marks it as status=0 (draft in progress)
Returns Map<String, Integer> where 0=draft, 1=designer-disabled, 2=enabled — these status integers drive the color coding and filtering in schema-designer.js
listConfigs must stay.

updateFileContents vs uploadConfigSetFile — cannot replace

uploadConfigSetFile (PUT /configsets/{configSetName}/{filePath}) is a general-purpose file upload — it writes bytes to a configset and returns a plain SolrJerseyResponse.

updateFileContents does three critical designer-specific things that uploadConfigSetFile cannot do:

solrconfig.xml pre-validation: Before saving, it loads and parses the XML using InMemoryResourceLoader / SolrConfig.readFromResourceLoader to catch errors before corrupting the configset. The error is returned in the response body (updateFileError + fileContent fields) without touching ZK.
Temp collection reload: After saving, calls configSetHelper.reloadTempCollection(mutableId, false).
Full schema response: Re-indexes sample docs and returns a complete SchemaDesignerResponse (schema fields, settings, doc count, analysis errors).
Name blocker: uploadConfigSetFile calls SolrIdentifierValidator.validateConfigSetName() which rejects names starting with . like ._designer_films, so it literally cannot be used for designer draft configsets.
updateFileContents must stay.

@epugh
Copy link
Copy Markdown
Contributor Author

epugh commented Apr 24, 2026

I just discovered you can edit a file in a configset via the schemadesigner!
image
I look forward to having a better edit via Solr UI.

Sign up for free to 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.

4 participants