
001package ca.uhn.fhir.jpa.delete; 002 003/*- 004 * #%L 005 * HAPI FHIR Storage api 006 * %% 007 * Copyright (C) 2014 - 2023 Smile CDR, Inc. 008 * %% 009 * Licensed under the Apache License, Version 2.0 (the "License"); 010 * you may not use this file except in compliance with the License. 011 * You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, software 016 * distributed under the License is distributed on an "AS IS" BASIS, 017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 018 * See the License for the specific language governing permissions and 019 * limitations under the License. 020 * #L% 021 */ 022 023import ca.uhn.fhir.i18n.Msg; 024import ca.uhn.fhir.context.FhirContext; 025import ca.uhn.fhir.jpa.api.model.DeleteConflict; 026import ca.uhn.fhir.jpa.api.model.DeleteConflictList; 027import ca.uhn.fhir.jpa.dao.BaseStorageDao; 028import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException; 029import ca.uhn.fhir.util.OperationOutcomeUtil; 030import org.hl7.fhir.instance.model.api.IBaseOperationOutcome; 031 032public final class DeleteConflictUtil { 033 private DeleteConflictUtil() { 034 } 035 036 public static void validateDeleteConflictsEmptyOrThrowException(FhirContext theFhirContext, DeleteConflictList theDeleteConflicts) { 037 IBaseOperationOutcome oo = null; 038 String firstMsg = null; 039 040 for (DeleteConflict next : theDeleteConflicts) { 041 042 if (theDeleteConflicts.isResourceIdToIgnoreConflict(next.getTargetId())) { 043 continue; 044 } 045 046 String msg = "Unable to delete " + 047 next.getTargetId().toUnqualifiedVersionless().getValue() + 048 " because at least one resource has a reference to this resource. First reference found was resource " + 049 next.getSourceId().toUnqualifiedVersionless().getValue() + 050 " in path " + 051 next.getSourcePath(); 052 053 if (firstMsg == null) { 054 firstMsg = msg; 055 oo = OperationOutcomeUtil.newInstance(theFhirContext); 056 } 057 OperationOutcomeUtil.addIssue(theFhirContext, oo, BaseStorageDao.OO_SEVERITY_ERROR, msg, null, "processing"); 058 } 059 060 if (firstMsg == null) { 061 return; 062 } 063 064 throw new ResourceVersionConflictException(Msg.code(515) + firstMsg, oo); 065 } 066}