001package ca.uhn.fhir.jpa.delete;
002
003/*-
004 * #%L
005 * HAPI FHIR Storage api
006 * %%
007 * Copyright (C) 2014 - 2022 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.context.FhirContext;
024import ca.uhn.fhir.jpa.api.model.DeleteConflict;
025import ca.uhn.fhir.jpa.api.model.DeleteConflictList;
026import ca.uhn.fhir.jpa.dao.BaseStorageDao;
027import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException;
028import ca.uhn.fhir.util.OperationOutcomeUtil;
029import org.hl7.fhir.instance.model.api.IBaseOperationOutcome;
030
031public final class DeleteConflictUtil {
032        private DeleteConflictUtil() {
033        }
034
035        public static void validateDeleteConflictsEmptyOrThrowException(FhirContext theFhirContext, DeleteConflictList theDeleteConflicts) {
036                IBaseOperationOutcome oo = null;
037                String firstMsg = null;
038
039                for (DeleteConflict next : theDeleteConflicts) {
040
041                        if (theDeleteConflicts.isResourceIdToIgnoreConflict(next.getTargetId())) {
042                                continue;
043                        }
044
045                        String msg = "Unable to delete " +
046                                next.getTargetId().toUnqualifiedVersionless().getValue() +
047                                " because at least one resource has a reference to this resource. First reference found was resource " +
048                                next.getSourceId().toUnqualifiedVersionless().getValue() +
049                                " in path " +
050                                next.getSourcePath();
051
052                        if (firstMsg == null) {
053                                firstMsg = msg;
054                                oo = OperationOutcomeUtil.newInstance(theFhirContext);
055                        }
056                        OperationOutcomeUtil.addIssue(theFhirContext, oo, BaseStorageDao.OO_SEVERITY_ERROR, msg, null, "processing");
057                }
058
059                if (firstMsg == null) {
060                        return;
061                }
062
063                throw new ResourceVersionConflictException(firstMsg, oo);
064        }
065}