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}