-
Notifications
You must be signed in to change notification settings - Fork 20
Update JDK and libraries #109
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,2 +1,6 @@ | ||
| plugins { | ||
| id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' | ||
| } | ||
|
Comment on lines
+1
to
+3
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🌐 Web query:
💡 Result: The latest version of the Usage: plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}Upgrade Foojay resolver plugin to version 1.0.0. Good addition—the Foojay toolchain resolver enables automatic JDK provisioning. However, version 0.8.0 is outdated; the latest stable version is 1.0.0 (released May 2025). Update to: plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'
}🤖 Prompt for AI Agents |
||
|
|
||
| rootProject.name = 'lookup-service' | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -2,104 +2,105 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import com.ctc.wstx.stax.WstxInputFactory; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import com.scienceminer.glutton.exception.ServiceException; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import com.scienceminer.glutton.utils.xml.StaxUtils; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import com.scienceminer.glutton.utils.grobid.GrobidResponseStaxHandler.GrobidResponse; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.client.ClientProtocolException; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.Consts; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.HttpResponse; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.client.ResponseHandler; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.NameValuePair; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.client.HttpClient; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.client.entity.UrlEncodedFormEntity; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.client.methods.HttpGet; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.client.methods.HttpPost; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.concurrent.FutureCallback; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.impl.client.HttpClientBuilder; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.impl.client.CloseableHttpClient; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.impl.client.HttpClients; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.http.message.BasicNameValuePair; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import com.scienceminer.glutton.utils.xml.StaxUtils; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.codehaus.stax2.XMLStreamReader2; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.commons.io.IOUtils; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.slf4j.Logger; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.slf4j.LoggerFactory; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javax.xml.stream.XMLStreamException; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.io.IOException; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.io.InputStream; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.net.HttpURLConnection; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.ArrayList; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.List; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.concurrent.ExecutionException; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.concurrent.Future; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.function.Consumer; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.net.URI; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.net.URLEncoder; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.net.http.HttpClient; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.net.http.HttpRequest; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.net.http.HttpResponse; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.nio.charset.StandardCharsets; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.time.Duration; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Synchronous grobid client | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Synchronous Grobid client built on the JDK 11+ {@link HttpClient}. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * <p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Calls only two Grobid REST endpoints: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * <ul> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * <li>{@code GET /isalive} — health check (see {@link #ping()})</li> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * <li>{@code POST /processCitation} — parse a raw citation string (see {@link #processCitation(String, String)})</li> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * </ul> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Both endpoints have been stable across Grobid 0.7.x and 0.8.x. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| */ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public class GrobidClient { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| private static final Logger LOGGER = LoggerFactory.getLogger(GrobidClient.class); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| //private ClosableHttpClient httpClient; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| private String grobidPath; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| private WstxInputFactory inputFactory = new WstxInputFactory(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| //private GrobidResponseStaxHandler grobidResponseStaxHandler = new GrobidResponseStaxHandler(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| private static final Duration CONNECT_TIMEOUT = Duration.ofSeconds(10); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| private static final Duration REQUEST_TIMEOUT = Duration.ofSeconds(30); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| private final String grobidPath; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| private final HttpClient httpClient; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| private final WstxInputFactory inputFactory = new WstxInputFactory(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public GrobidClient(String grobidPath) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| this.grobidPath = grobidPath; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| //this.httpClient = HttpClients.createDefault(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| this.httpClient = HttpClient.newBuilder() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .connectTimeout(CONNECT_TIMEOUT) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .version(HttpClient.Version.HTTP_1_1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .build(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public void ping() throws ServiceException { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| try (CloseableHttpClient httpClient = HttpClients.createDefault()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| final HttpGet httpGet = new HttpGet(grobidPath + "/isalive"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HttpResponse response = httpClient.execute(httpGet); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (response.getStatusLine().getStatusCode() != HttpURLConnection.HTTP_OK) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| throw new ServiceException(502, "Error while connecting to GROBID service. Error code: " + response.getStatusLine().getStatusCode()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HttpRequest request = HttpRequest.newBuilder(URI.create(grobidPath + "/isalive")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .timeout(REQUEST_TIMEOUT) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .GET() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .build(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HttpResponse<Void> response = httpClient.send(request, HttpResponse.BodyHandlers.discarding()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (response.statusCode() != HttpURLConnection.HTTP_OK) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| throw new ServiceException(502, "Error while connecting to GROBID service. Error code: " + response.statusCode()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } catch (Exception e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } catch (InterruptedException e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Thread.currentThread().interrupt(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| throw new ServiceException(502, "Interrupted while connecting to GROBID service", e); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } catch (IOException e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| throw new ServiceException(502, "Error while connecting to GROBID service", e); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public GrobidResponse processCitation(String rawCitation, String consolidation) throws ServiceException { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| GrobidResponse grobidResponse = null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| try (CloseableHttpClient httpClient = HttpClients.createDefault()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| final HttpPost request = new HttpPost(grobidPath + "/processCitation"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| List<NameValuePair> formparams = new ArrayList<>(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| formparams.add(new BasicNameValuePair("citations", rawCitation)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| formparams.add(new BasicNameValuePair("consolidateCitation", consolidation)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| request.setEntity(entity); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ResponseHandler<GrobidResponse> responseHandler = new ResponseHandler<GrobidResponse>() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @Override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public GrobidResponse handleResponse(HttpResponse response) throws ClientProtocolException, IOException { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (response.getStatusLine().getStatusCode() != HttpURLConnection.HTTP_OK) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| throw new ServiceException(502, "Error while connecting to GROBID service. Error code: " + response.getStatusLine().getStatusCode()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| XMLStreamReader2 reader = (XMLStreamReader2) inputFactory.createXMLStreamReader(response.getEntity().getContent()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| GrobidResponseStaxHandler grobidResponseStaxHandler = new GrobidResponseStaxHandler(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| StaxUtils.traverse(reader, grobidResponseStaxHandler); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return grobidResponseStaxHandler.getResponse(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } catch (IOException | XMLStreamException e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| throw new ServiceException(502, "Cannot parse the response from GROBID", e); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| grobidResponse = httpClient.execute(request, responseHandler); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } catch(IOException e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| String formBody = "citations=" + URLEncoder.encode(rawCitation, StandardCharsets.UTF_8) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| + "&consolidateCitation=" + URLEncoder.encode(consolidation, StandardCharsets.UTF_8); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HttpRequest request = HttpRequest.newBuilder(URI.create(grobidPath + "/processCitation")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .timeout(REQUEST_TIMEOUT) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .header("Content-Type", "application/x-www-form-urlencoded") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .POST(HttpRequest.BodyPublishers.ofString(formBody, StandardCharsets.UTF_8)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .build(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HttpResponse<InputStream> response = httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (response.statusCode() != HttpURLConnection.HTTP_OK) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| throw new ServiceException(502, "Error while connecting to GROBID service. Error code: " + response.statusCode()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| try (InputStream body = response.body()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return parseGrobidResponse(body); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } catch (InterruptedException e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Thread.currentThread().interrupt(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| throw new ServiceException(502, "Interrupted while calling GROBID", e); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } catch (IOException e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| throw new ServiceException(502, "Error calling GROBID", e); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return grobidResponse; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| private GrobidResponse parseGrobidResponse(InputStream body) throws ServiceException { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| XMLStreamReader2 reader = (XMLStreamReader2) inputFactory.createXMLStreamReader(body); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| GrobidResponseStaxHandler handler = new GrobidResponseStaxHandler(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| StaxUtils.traverse(reader, handler); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return handler.getResponse(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } catch (XMLStreamException e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| throw new ServiceException(502, "Cannot parse the response from GROBID", e); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+96
to
105
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. XMLStreamReader is not closed after parsing. The 🛡️ Proposed fix to close the reader private GrobidResponse parseGrobidResponse(InputStream body) throws ServiceException {
+ XMLStreamReader2 reader = null;
try {
- XMLStreamReader2 reader = (XMLStreamReader2) inputFactory.createXMLStreamReader(body);
+ reader = (XMLStreamReader2) inputFactory.createXMLStreamReader(body);
GrobidResponseStaxHandler handler = new GrobidResponseStaxHandler();
StaxUtils.traverse(reader, handler);
return handler.getResponse();
} catch (XMLStreamException e) {
throw new ServiceException(502, "Cannot parse the response from GROBID", e);
+ } finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (XMLStreamException ignored) {
+ // Best-effort cleanup
+ }
+ }
}
}📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo: "strating" should be "starting".
📝 Fix typo
📝 Committable suggestion
🧰 Tools
🪛 LanguageTool
[grammar] ~79-~79: Ensure spelling is correct
Context: ...n change the
portused by GROBID when strating the docker container, or by updating th...(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
🤖 Prompt for AI Agents