From 39739492bba77d4693d6c35adbbdfd53f97a7604 Mon Sep 17 00:00:00 2001 From: Jeff Burke Date: Thu, 17 Sep 2026 13:36:50 -0700 Subject: [PATCH 1/6] restore json only logging --- doi/helm/config/catalina.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/doi/helm/config/catalina.properties b/doi/helm/config/catalina.properties index f064f17..c96c92f 100644 --- a/doi/helm/config/catalina.properties +++ b/doi/helm/config/catalina.properties @@ -5,6 +5,7 @@ tomcat.connector.scheme=https tomcat.connector.proxyName={{ include "doi.hostname" . }} tomcat.connector.proxyPort=443 ca.nrc.cadc.auth.PrincipalExtractor.enableClientCertHeader=true +ca.nrc.cadc.util.Log4jInit.messageOnly=true # (default: ca.nrc.cadc.auth.NoOpIdentityManager) ca.nrc.cadc.auth.IdentityManager={{ .Values.application.identityManagerClass }} From 0c82072f26dcf761f57e5e6b7d21248a37a0af44 Mon Sep 17 00:00:00 2001 From: Jeff Burke Date: Thu, 17 Sep 2026 13:38:21 -0700 Subject: [PATCH 2/6] catch runtime when unable to get the recursive lock nodes job phase --- .../main/java/ca/nrc/cadc/doi/DoiAction.java | 86 +++++++++++-------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/doi/src/main/java/ca/nrc/cadc/doi/DoiAction.java b/doi/src/main/java/ca/nrc/cadc/doi/DoiAction.java index 04b14b3..e119560 100644 --- a/doi/src/main/java/ca/nrc/cadc/doi/DoiAction.java +++ b/doi/src/main/java/ca/nrc/cadc/doi/DoiAction.java @@ -418,44 +418,54 @@ protected String updateMintingStatus(final ContainerNode doiContainerNode, final VOSURI vosuri = new VOSURI(vaultResourceID, String.format("%s/%s", parentPath, doiContainerNode.getName())); RecursiveSetNode recursiveSetNode = new RecursiveSetNode(jobURL, doiContainerNode); recursiveSetNode.setSchemaValidation(false); - ExecutionPhase phase = recursiveSetNode.getPhase(20); // seconds - switch (phase) { - case COMPLETED: - case ARCHIVED: - // job finished, set corresponding status - if (status.equals(Status.LOCKING_DATA.getValue())) { - localStatus = Status.LOCKED_DATA.getValue(); - } else if (status.equals(Status.REGISTERING.getValue())) { - localStatus = Status.MINTED.getValue(); - } - // delete jobURL property - doiContainerNode.getProperties().remove(new NodeProperty(DOI.VOSPACE_DOI_JOB_URL_PROPERTY)); - doiContainerNode.getProperty(DOI.VOSPACE_DOI_STATUS_PROPERTY).setValue(localStatus); - vospaceDoiClient.getVOSpaceClient().setNode(vosuri, doiContainerNode); - break; - case ERROR: - case ABORTED: - case UNKNOWN: - case SUSPENDED: - case HELD: - // assume job resulted in error, set corresponding status - if (status.equals(Status.LOCKING_DATA.getValue())) { - localStatus = Status.ERROR_LOCKING_DATA.getValue(); - } else if (status.equals(Status.REGISTERING.getValue())) { - localStatus = Status.ERROR_REGISTERING.getValue(); - } - // delete jobURL property - doiContainerNode.getProperties().remove(new NodeProperty(DOI.VOSPACE_DOI_JOB_URL_PROPERTY)); - doiContainerNode.getProperty(DOI.VOSPACE_DOI_STATUS_PROPERTY).setValue(localStatus); - vospaceDoiClient.getVOSpaceClient().setNode(vosuri, doiContainerNode); - break; - case PENDING: - case QUEUED: - case EXECUTING: - // job is in progress, do nothing - break; - default: - // do nothing + + ExecutionPhase phase; + try { + phase = recursiveSetNode.getPhase(20); // seconds + } catch (RuntimeException ex) { + log.error("error getting recursive lock nodes job status for " + doiContainerNode.getName(), ex); + phase = ExecutionPhase.ERROR; + } + + if (phase != null) { + switch (phase) { + case COMPLETED: + case ARCHIVED: + // job finished, set corresponding status + if (status.equals(Status.LOCKING_DATA.getValue())) { + localStatus = Status.LOCKED_DATA.getValue(); + } else if (status.equals(Status.REGISTERING.getValue())) { + localStatus = Status.MINTED.getValue(); + } + // delete jobURL property + doiContainerNode.getProperties().remove(new NodeProperty(DOI.VOSPACE_DOI_JOB_URL_PROPERTY)); + doiContainerNode.getProperty(DOI.VOSPACE_DOI_STATUS_PROPERTY).setValue(localStatus); + vospaceDoiClient.getVOSpaceClient().setNode(vosuri, doiContainerNode); + break; + case ERROR: + case ABORTED: + case UNKNOWN: + case SUSPENDED: + case HELD: + // assume job resulted in error, set corresponding status + if (status.equals(Status.LOCKING_DATA.getValue())) { + localStatus = Status.ERROR_LOCKING_DATA.getValue(); + } else if (status.equals(Status.REGISTERING.getValue())) { + localStatus = Status.ERROR_REGISTERING.getValue(); + } + // delete jobURL property + doiContainerNode.getProperties().remove(new NodeProperty(DOI.VOSPACE_DOI_JOB_URL_PROPERTY)); + doiContainerNode.getProperty(DOI.VOSPACE_DOI_STATUS_PROPERTY).setValue(localStatus); + vospaceDoiClient.getVOSpaceClient().setNode(vosuri, doiContainerNode); + break; + case PENDING: + case QUEUED: + case EXECUTING: + // job is in progress, do nothing + break; + default: + // do nothing + } } } return localStatus; From cb4749264f125b07d33ce292bdc3660ccb2438fd Mon Sep 17 00:00:00 2001 From: Jeff Burke Date: Thu, 17 Sep 2026 13:39:36 -0700 Subject: [PATCH 3/6] clean up info logging --- .../nrc/cadc/doi/DoiInlineContentHandler.java | 18 +++++++++--------- .../java/ca/nrc/cadc/doi/SearchAction.java | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/doi/src/main/java/ca/nrc/cadc/doi/DoiInlineContentHandler.java b/doi/src/main/java/ca/nrc/cadc/doi/DoiInlineContentHandler.java index e29476b..59e327e 100644 --- a/doi/src/main/java/ca/nrc/cadc/doi/DoiInlineContentHandler.java +++ b/doi/src/main/java/ca/nrc/cadc/doi/DoiInlineContentHandler.java @@ -102,27 +102,27 @@ public Content accept(String name, String contentType, InputStream inputStream) InlineContentHandler.Content content = new InlineContentHandler.Content(); content.name = name; - log.info("content name: " + name); - log.info("content type: " + contentType); + log.debug("content name: " + name); + log.debug("content type: " + contentType); if (META_DATA_KEY.equals(name)) { if (contentType.equalsIgnoreCase(XML_CONTENT_TYPE)) { - log.info("content type: " + XML_CONTENT_TYPE); + log.debug("content type: " + XML_CONTENT_TYPE); try { // read xml file DoiXmlReader reader = new DoiXmlReader(false); content.value = reader.read(inputStream); - log.info("content value: " + content.value); + log.debug("content value: " + content.value); } catch (DoiParsingException dpe) { log.debug(dpe); throw new InlineContentException(dpe.getMessage()); } } else if (contentType.equalsIgnoreCase(JSON_CONTENT_TYPE)) { - log.info("content type: " + JSON_CONTENT_TYPE); + log.debug("content type: " + JSON_CONTENT_TYPE); try { // read json file DoiJsonReader reader = new DoiJsonReader(); content.value = reader.read(inputStream); - log.info("content value: " + content.value); + log.debug("content value: " + content.value); } catch (DoiParsingException dpe) { log.debug(dpe); throw new InlineContentException(dpe.getMessage()); @@ -131,14 +131,14 @@ public Content accept(String name, String contentType, InputStream inputStream) } else if (NODE_DATA_KEY.equals(name)) { if (contentType.equalsIgnoreCase(XML_CONTENT_TYPE)) { - log.info("content type: " + XML_CONTENT_TYPE); + log.debug("content type: " + XML_CONTENT_TYPE); // xml not supported for node property updates throw new IllegalArgumentException("XML node updates are not supported"); } else if (contentType.equalsIgnoreCase(JSON_CONTENT_TYPE)) { - log.info("content type: " + JSON_CONTENT_TYPE); + log.debug("content type: " + JSON_CONTENT_TYPE); // read json file content.value = new JSONObject(new JSONTokener(inputStream)); - log.info("content value: " + content.value); + log.debug("content value: " + content.value); } } else { throw new IllegalArgumentException("Unrecognized content type: " + name); diff --git a/doi/src/main/java/ca/nrc/cadc/doi/SearchAction.java b/doi/src/main/java/ca/nrc/cadc/doi/SearchAction.java index 816c74c..ae02331 100644 --- a/doi/src/main/java/ca/nrc/cadc/doi/SearchAction.java +++ b/doi/src/main/java/ca/nrc/cadc/doi/SearchAction.java @@ -119,7 +119,7 @@ public void doAction() throws Exception { JSONObject jsonObject = (JSONObject) syncInput.getContent(SearchInlineContentHandler.CONTENT_KEY); Set keys = jsonObject.keySet(); - log.info("jsonObject: " + jsonObject.toString(2)); + log.debug("jsonObject: " + jsonObject.toString(2)); validateKeys(keys); DoiSearchFilter searchFilter = new DoiSearchFilter(); @@ -137,7 +137,7 @@ public void doAction() throws Exception { List statusList = jsonArray.toList().stream() .map(Object::toString) .collect(Collectors.toList()); - log.info("statusList: " + statusList); + log.debug("statusList: " + statusList); searchFilter.prepareStatusList(statusList); } From 47340d350bb7d8ecc0a10b674df3bb44dad7d1f4 Mon Sep 17 00:00:00 2001 From: Jeff Burke Date: Thu, 17 Sep 2026 14:00:34 -0700 Subject: [PATCH 4/6] replace deprecated AccessControlException with PermissionDeniedException --- .../java/ca/nrc/cadc/doi/IntTestBase.java | 8 ++++---- .../java/ca/nrc/cadc/doi/LifecycleTest.java | 5 ++--- .../main/java/ca/nrc/cadc/doi/DeleteAction.java | 6 +++--- doi/src/main/java/ca/nrc/cadc/doi/DoiAction.java | 8 ++++---- .../main/java/ca/nrc/cadc/doi/PostAction.java | 8 ++++---- .../main/java/ca/nrc/cadc/doi/SearchAction.java | 2 +- .../java/ca/nrc/cadc/doi/VospaceDoiClient.java | 16 ++++++++-------- 7 files changed, 26 insertions(+), 27 deletions(-) diff --git a/doi/src/intTest/java/ca/nrc/cadc/doi/IntTestBase.java b/doi/src/intTest/java/ca/nrc/cadc/doi/IntTestBase.java index 2d7417d..feaf96e 100644 --- a/doi/src/intTest/java/ca/nrc/cadc/doi/IntTestBase.java +++ b/doi/src/intTest/java/ca/nrc/cadc/doi/IntTestBase.java @@ -76,6 +76,7 @@ import ca.nrc.cadc.doi.status.Status; import ca.nrc.cadc.net.FileContent; import ca.nrc.cadc.net.HttpPost; +import ca.nrc.cadc.net.PermissionDeniedException; import ca.nrc.cadc.reg.Standards; import ca.nrc.cadc.reg.client.RegistryClient; import ca.nrc.cadc.util.FileUtil; @@ -84,7 +85,6 @@ import java.io.IOException; import java.net.URL; import java.nio.charset.StandardCharsets; -import java.security.AccessControlException; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.HashMap; @@ -304,9 +304,9 @@ protected void cleanup(String doiSuffix, DOISettingsType doiSettingsType) { log.debug(String.format("RecursiveDeleteNode done, phase: %s exception: %s", recursiveDeleteNode.getPhase(), recursiveDeleteNode.getException())); log.debug("deleted node: " + nodeUri.getPath()); - } catch (AccessControlException e) { - log.error("unexpected AccessControlException: ", e); - Assert.fail("unexpected AccessControlException: " + e); + } catch (PermissionDeniedException e) { + log.error("unexpected PermissionDeniedException: ", e); + Assert.fail("unexpected PermissionDeniedException: " + e); } catch (Exception e) { log.error("unexpected exception", e); Assert.fail("unexpected exception: " + e); diff --git a/doi/src/intTest/java/ca/nrc/cadc/doi/LifecycleTest.java b/doi/src/intTest/java/ca/nrc/cadc/doi/LifecycleTest.java index c8b0d42..ef5ffca 100644 --- a/doi/src/intTest/java/ca/nrc/cadc/doi/LifecycleTest.java +++ b/doi/src/intTest/java/ca/nrc/cadc/doi/LifecycleTest.java @@ -83,13 +83,13 @@ import ca.nrc.cadc.net.FileContent; import ca.nrc.cadc.net.HttpGet; import ca.nrc.cadc.net.HttpPost; +import ca.nrc.cadc.net.PermissionDeniedException; import ca.nrc.cadc.util.Log4jInit; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.StringReader; import java.net.URL; import java.nio.charset.StandardCharsets; -import java.security.AccessControlException; import java.security.PrivilegedExceptionAction; import java.time.LocalDate; import java.time.ZoneId; @@ -257,8 +257,7 @@ Resource create(Resource expected, DOISettingsType doiSettingsType) throws Exce VOSURI target1 = getVOSURI(writeFile, doiSettingsType); DataNode dataNode1 = new DataNode(writeName); vosClient.createNode(target1, dataNode1); - } catch ( - AccessControlException e) { + } catch (PermissionDeniedException e) { log.debug("expected exception: " + e.getMessage()); } catch (Exception e) { Assert.fail("exception writing file: " + e.getMessage()); diff --git a/doi/src/main/java/ca/nrc/cadc/doi/DeleteAction.java b/doi/src/main/java/ca/nrc/cadc/doi/DeleteAction.java index c8b0d99..1497139 100644 --- a/doi/src/main/java/ca/nrc/cadc/doi/DeleteAction.java +++ b/doi/src/main/java/ca/nrc/cadc/doi/DeleteAction.java @@ -68,7 +68,7 @@ package ca.nrc.cadc.doi; import ca.nrc.cadc.doi.status.Status; -import java.security.AccessControlException; +import ca.nrc.cadc.net.PermissionDeniedException; import java.security.PrivilegedExceptionAction; import javax.security.auth.Subject; import org.apache.log4j.Logger; @@ -108,7 +108,7 @@ private void authorizeResourceAccess() throws NodeNotFoundException { return; } - throw new AccessControlException("Not authorized to Delete this resource."); + throw new PermissionDeniedException("Not authorized to Delete this resource."); } private void doActionImpl() throws Exception { @@ -125,7 +125,7 @@ private void doActionImpl() throws Exception { // check the state of the doi String doiStatus = doiContainer.getPropertyValue(DOI.VOSPACE_DOI_STATUS_PROPERTY); if (doiStatus != null && doiStatus.equals(Status.MINTED.getValue())) { - throw new AccessControlException("Unable to delete " + doiSuffix + "DOI already minted.\n"); + throw new PermissionDeniedException("Unable to delete " + doiSuffix + "DOI already minted.\n"); } // Delete the DOI group. Will be format DOI- diff --git a/doi/src/main/java/ca/nrc/cadc/doi/DoiAction.java b/doi/src/main/java/ca/nrc/cadc/doi/DoiAction.java index e119560..d3a0e9f 100644 --- a/doi/src/main/java/ca/nrc/cadc/doi/DoiAction.java +++ b/doi/src/main/java/ca/nrc/cadc/doi/DoiAction.java @@ -81,6 +81,7 @@ import ca.nrc.cadc.doi.status.DoiStatusListXmlWriter; import ca.nrc.cadc.doi.status.Status; import ca.nrc.cadc.net.OutputStreamWrapper; +import ca.nrc.cadc.net.PermissionDeniedException; import ca.nrc.cadc.net.ResourceNotFoundException; import ca.nrc.cadc.reg.Standards; import ca.nrc.cadc.reg.client.LocalAuthority; @@ -97,7 +98,6 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.UnknownHostException; -import java.security.AccessControlException; import java.security.Principal; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; @@ -218,7 +218,7 @@ protected void authorize() { } // authorization, for now, is defined as having a set of principals if (callingSubject == null || callingSubject.getPrincipals().isEmpty()) { - throw new AccessControlException("Unauthorized"); + throw new PermissionDeniedException("Unauthorized"); } } @@ -402,7 +402,7 @@ protected DoiStatus getDoiStatus(String doiSuffixString, ContainerNode doiContai doiStatus.reviewer = doiContainerNode.getPropertyValue(DOI.VOSPACE_DOI_REVIEWER_PROPERTY); } else { String msg = "Access Denied to " + doiSuffixString + "."; - throw new AccessControlException(msg); + throw new PermissionDeniedException(msg); } return doiStatus; } @@ -499,7 +499,7 @@ protected void uploadDOIDocument(Resource resource, VOSURI docVOSUIRI) throws Re throw new ResourceNotFoundException(message); } if (message.contains("PermissionDenied")) { - throw new java.security.AccessControlException(message); + throw new PermissionDeniedException(message); } } throw new RuntimeException((clientTransfer.getThrowable().getMessage())); diff --git a/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java b/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java index 20ffc7d..9392e98 100644 --- a/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java +++ b/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java @@ -84,6 +84,7 @@ import ca.nrc.cadc.net.HttpPost; import ca.nrc.cadc.net.HttpTransfer; import ca.nrc.cadc.net.HttpUpload; +import ca.nrc.cadc.net.PermissionDeniedException; import ca.nrc.cadc.net.ResourceNotFoundException; import ca.nrc.cadc.util.Base64; import ca.nrc.cadc.util.StringUtil; @@ -94,7 +95,6 @@ import java.net.URI; import java.net.URL; import java.nio.charset.StandardCharsets; -import java.security.AccessControlException; import java.security.PrivilegedExceptionAction; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -168,7 +168,7 @@ private void authorizeResourceAccess() throws NodeNotFoundException { if (isPublisher && !isRequester) { return; } else { - throw new AccessControlException("Not authorized to Mint this resource: " + doiSuffix); + throw new PermissionDeniedException("Not authorized to Mint this resource: " + doiSuffix); } } @@ -177,7 +177,7 @@ private void authorizeResourceAccess() throws NodeNotFoundException { return; } - throw new AccessControlException("Not authorized to update this resource: " + doiSuffix); + throw new PermissionDeniedException("Not authorized to update this resource: " + doiSuffix); } private String getDataciteCredentials() { @@ -983,7 +983,7 @@ private void processResponse(Throwable throwable, int responseCode, InputStream // check if an exception was thrown if (throwable != null) { if ((responseCode == 401) || (responseCode == 403)) { - throw new AccessControlException(throwable.getMessage()); + throw new PermissionDeniedException(throwable.getMessage()); } else { throw new RuntimeException(body + ", " + throwable); } diff --git a/doi/src/main/java/ca/nrc/cadc/doi/SearchAction.java b/doi/src/main/java/ca/nrc/cadc/doi/SearchAction.java index ae02331..186d13d 100644 --- a/doi/src/main/java/ca/nrc/cadc/doi/SearchAction.java +++ b/doi/src/main/java/ca/nrc/cadc/doi/SearchAction.java @@ -101,7 +101,7 @@ public SearchAction() { * java.lang.IllegalArgumentException : 400 * ca.nrc.cadc.auth.NotAuthenticatedException : 401 * java.security.cert.CertificateException : 403 -- should be 401 with a suitable challenge - * java.security.AccessControlException : 403 + * java.security.PermissionDeniedException : 403 * ca.nrc.cadc.net.ResourceNotFoundException : 404 * ca.nrc.cadc.net.ResourceAlreadyExistsException : 409 * ca.nrc.cadc.net.PreconditionFailedException (and subclasses) : 412 diff --git a/doi/src/main/java/ca/nrc/cadc/doi/VospaceDoiClient.java b/doi/src/main/java/ca/nrc/cadc/doi/VospaceDoiClient.java index 8697276..bdc63f8 100644 --- a/doi/src/main/java/ca/nrc/cadc/doi/VospaceDoiClient.java +++ b/doi/src/main/java/ca/nrc/cadc/doi/VospaceDoiClient.java @@ -74,12 +74,12 @@ import ca.nrc.cadc.doi.io.DoiParsingException; import ca.nrc.cadc.doi.io.DoiXmlReader; import ca.nrc.cadc.net.InputStreamWrapper; +import ca.nrc.cadc.net.PermissionDeniedException; import ca.nrc.cadc.net.ResourceNotFoundException; import ca.nrc.cadc.util.StringUtil; import java.io.IOException; import java.io.InputStream; import java.net.URI; -import java.security.AccessControlException; import java.util.Set; import javax.security.auth.Subject; import javax.security.auth.x500.X500Principal; @@ -133,7 +133,7 @@ public VOSURI getDoiBaseVOSURI() { } public ContainerNode getContainerNode(String path) - throws NodeNotFoundException, AccessControlException { + throws NodeNotFoundException, PermissionDeniedException { String nodePath = baseDataURI.getPath(); if (StringUtil.hasText(path)) { nodePath = nodePath + "/" + path; @@ -142,7 +142,7 @@ public ContainerNode getContainerNode(String path) try { requestedNode = (ContainerNode) vosClient.getNode(nodePath); - } catch (AccessControlException ef) { + } catch (PermissionDeniedException ef) { throw ef; } catch (ResourceNotFoundException e) { throw new NodeNotFoundException(e.getMessage()); @@ -154,7 +154,7 @@ public ContainerNode getContainerNode(String path) } public DataNode getDataNode(String path) - throws NodeNotFoundException, AccessControlException { + throws NodeNotFoundException, PermissionDeniedException { String nodePath = baseDataURI.getPath(); if (StringUtil.hasText(path)) { nodePath = nodePath + "/" + path; @@ -163,7 +163,7 @@ public DataNode getDataNode(String path) try { requestedNode = (DataNode) vosClient.getNode(nodePath); - } catch (AccessControlException ef) { + } catch (PermissionDeniedException ef) { throw ef; } catch (ResourceNotFoundException e) { throw new NodeNotFoundException(e.getMessage()); @@ -233,7 +233,7 @@ private Resource getDoiDocFromVOSpace(VOSURI dataNode) throws Exception { throw new ResourceNotFoundException(message, clientTransfer.getThrowable()); } if (message.contains("PermissionDenied")) { - throw new AccessControlException(message); + throw new PermissionDeniedException(message); } throw new RuntimeException(clientTransfer.getThrowable()); } @@ -269,8 +269,8 @@ public void deleteNode(String doiSuffix) { RecursiveDeleteNode recursiveDeleteNode = getVOSpaceClient().createRecursiveDelete(nodeUri); recursiveDeleteNode.setMonitor(true); recursiveDeleteNode.run(); - } catch (AccessControlException e) { - log.error("unexpected AccessControlException: ", e); + } catch (PermissionDeniedException e) { + log.error("unexpected PermissionDeniedException: ", e); } catch (Exception e) { log.error("unexpected exception", e); } From fd4a1dc2e77b672a0355b3324ed81fbc0925cb1d Mon Sep 17 00:00:00 2001 From: Jeff Burke Date: Thu, 17 Sep 2026 14:01:18 -0700 Subject: [PATCH 5/6] add null check for contentType --- .../main/java/ca/nrc/cadc/doi/SearchInlineContentHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doi/src/main/java/ca/nrc/cadc/doi/SearchInlineContentHandler.java b/doi/src/main/java/ca/nrc/cadc/doi/SearchInlineContentHandler.java index 7cce6a9..1fa8f2f 100644 --- a/doi/src/main/java/ca/nrc/cadc/doi/SearchInlineContentHandler.java +++ b/doi/src/main/java/ca/nrc/cadc/doi/SearchInlineContentHandler.java @@ -116,7 +116,7 @@ public Content accept(String name, String contentType, InputStream inputStream) if (inputStream == null) { throw new IOException("The InputStream is closed"); } - if (!contentType.toLowerCase().contains("application/json")) { + if (contentType == null || !contentType.toLowerCase().contains("application/json")) { throw new InlineContentException("Content-Type must be application/json"); } From ec31954d2250d10d7ab13393cd512c5b61a9c56b Mon Sep 17 00:00:00 2001 From: Jeff Burke Date: Wed, 23 Sep 2026 13:10:30 -0700 Subject: [PATCH 6/6] remove redundant test at end of identifier --- doi/src/main/java/ca/nrc/cadc/doi/PostAction.java | 1 - 1 file changed, 1 deletion(-) diff --git a/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java b/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java index 9392e98..66e0e03 100644 --- a/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java +++ b/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java @@ -268,7 +268,6 @@ private String getRandomDOISuffix() { sb.append(allowed.charAt(index)); } } - sb.append(".test"); return sb.toString(); }